@wordpress/block-editor 9.4.0 → 9.7.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 (483) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -8
  3. package/build/components/block-list/block-invalid-warning.native.js +54 -6
  4. package/build/components/block-list/block-invalid-warning.native.js.map +1 -1
  5. package/build/components/block-list/block.js +14 -4
  6. package/build/components/block-list/block.js.map +1 -1
  7. package/build/components/block-list/block.native.js +2 -1
  8. package/build/components/block-list/block.native.js.map +1 -1
  9. package/build/components/block-list/index.native.js +5 -4
  10. package/build/components/block-list/index.native.js.map +1 -1
  11. package/build/components/block-list/layout.js +20 -5
  12. package/build/components/block-list/layout.js.map +1 -1
  13. package/build/components/block-list/use-block-props/use-block-class-names.js +5 -2
  14. package/build/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  15. package/build/components/block-lock/modal.js +37 -7
  16. package/build/components/block-lock/modal.js.map +1 -1
  17. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +1 -1
  18. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  19. package/build/components/block-mover/mover-description.js +95 -32
  20. package/build/components/block-mover/mover-description.js.map +1 -1
  21. package/build/components/block-pattern-setup/index.js +5 -17
  22. package/build/components/block-pattern-setup/index.js.map +1 -1
  23. package/build/components/block-popover/inbetween.js +2 -2
  24. package/build/components/block-popover/inbetween.js.map +1 -1
  25. package/build/components/block-popover/index.js +1 -1
  26. package/build/components/block-popover/index.js.map +1 -1
  27. package/build/components/block-settings-menu/block-mode-toggle.js +1 -1
  28. package/build/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  29. package/build/components/block-settings-menu/block-settings-dropdown.js +4 -1
  30. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  31. package/build/components/block-settings-menu-controls/index.js +1 -1
  32. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  33. package/build/components/block-styles/index.js +3 -6
  34. package/build/components/block-styles/index.js.map +1 -1
  35. package/build/components/block-styles/preview.native.js.map +1 -1
  36. package/build/components/block-switcher/index.js +7 -1
  37. package/build/components/block-switcher/index.js.map +1 -1
  38. package/build/components/block-title/index.js +8 -2
  39. package/build/components/block-title/index.js.map +1 -1
  40. package/build/components/block-title/use-block-display-title.js +12 -5
  41. package/build/components/block-title/use-block-display-title.js.map +1 -1
  42. package/build/components/block-tools/block-contextual-toolbar.js +1 -1
  43. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  44. package/build/components/block-tools/block-selection-button.js +1 -7
  45. package/build/components/block-tools/block-selection-button.js.map +1 -1
  46. package/build/components/block-tools/index.js +4 -1
  47. package/build/components/block-tools/index.js.map +1 -1
  48. package/build/components/block-types-list/index.js +1 -1
  49. package/build/components/block-types-list/index.js.map +1 -1
  50. package/build/components/block-types-list/index.native.js +65 -23
  51. package/build/components/block-types-list/index.native.js.map +1 -1
  52. package/build/components/border-radius-control/index.js +5 -1
  53. package/build/components/border-radius-control/index.js.map +1 -1
  54. package/build/components/colors/utils.js +6 -2
  55. package/build/components/colors/utils.js.map +1 -1
  56. package/build/components/colors/with-colors.js +1 -1
  57. package/build/components/colors/with-colors.js.map +1 -1
  58. package/build/components/colors-gradients/control.js +49 -39
  59. package/build/components/colors-gradients/control.js.map +1 -1
  60. package/build/components/colors-gradients/dropdown.js +9 -3
  61. package/build/components/colors-gradients/dropdown.js.map +1 -1
  62. package/build/components/date-format-picker/index.js +1 -1
  63. package/build/components/date-format-picker/index.js.map +1 -1
  64. package/build/components/font-appearance-control/index.js +10 -4
  65. package/build/components/font-appearance-control/index.js.map +1 -1
  66. package/build/components/iframe/index.js +19 -6
  67. package/build/components/iframe/index.js.map +1 -1
  68. package/build/components/image-editor/cropper.js +4 -3
  69. package/build/components/image-editor/cropper.js.map +1 -1
  70. package/build/components/image-editor/index.js +3 -1
  71. package/build/components/image-editor/index.js.map +1 -1
  72. package/build/components/image-size-control/index.js +3 -1
  73. package/build/components/image-size-control/index.js.map +1 -1
  74. package/build/components/index.js +13 -6
  75. package/build/components/index.js.map +1 -1
  76. package/build/components/index.native.js +11 -4
  77. package/build/components/index.native.js.map +1 -1
  78. package/build/components/inserter/block-types-tab.native.js +30 -16
  79. package/build/components/inserter/block-types-tab.native.js.map +1 -1
  80. package/build/components/inserter/index.native.js +8 -3
  81. package/build/components/inserter/index.native.js.map +1 -1
  82. package/build/components/inserter/preview-panel.js +8 -8
  83. package/build/components/inserter/preview-panel.js.map +1 -1
  84. package/build/components/inserter/reusable-blocks-tab.native.js +5 -1
  85. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  86. package/build/components/inserter/search-results.native.js +5 -2
  87. package/build/components/inserter/search-results.native.js.map +1 -1
  88. package/build/components/inserter/utils.native.js +21 -0
  89. package/build/components/inserter/utils.native.js.map +1 -1
  90. package/build/components/inserter-list-item/index.js +7 -20
  91. package/build/components/inserter-list-item/index.js.map +1 -1
  92. package/build/components/letter-spacing-control/index.js +6 -3
  93. package/build/components/letter-spacing-control/index.js.map +1 -1
  94. package/build/components/line-height-control/index.js +6 -3
  95. package/build/components/line-height-control/index.js.map +1 -1
  96. package/build/components/link-control/index.js +1 -1
  97. package/build/components/link-control/index.js.map +1 -1
  98. package/build/components/link-control/is-url-like.js +1 -7
  99. package/build/components/link-control/is-url-like.js.map +1 -1
  100. package/build/components/link-control/use-search-handler.js +1 -7
  101. package/build/components/link-control/use-search-handler.js.map +1 -1
  102. package/build/components/list-view/block-select-button.js +15 -7
  103. package/build/components/list-view/block-select-button.js.map +1 -1
  104. package/build/components/list-view/branch.js +1 -7
  105. package/build/components/list-view/branch.js.map +1 -1
  106. package/build/components/list-view/drop-indicator.js +1 -1
  107. package/build/components/list-view/drop-indicator.js.map +1 -1
  108. package/build/components/list-view/expander.js +3 -1
  109. package/build/components/list-view/expander.js.map +1 -1
  110. package/build/components/media-placeholder/index.js +13 -2
  111. package/build/components/media-placeholder/index.js.map +1 -1
  112. package/build/components/media-replace-flow/index.js +3 -6
  113. package/build/components/media-replace-flow/index.js.map +1 -1
  114. package/build/components/media-upload/index.native.js +8 -3
  115. package/build/components/media-upload/index.native.js.map +1 -1
  116. package/build/components/observe-typing/index.js +22 -8
  117. package/build/components/observe-typing/index.js.map +1 -1
  118. package/build/components/preview-options/index.js +2 -2
  119. package/build/components/preview-options/index.js.map +1 -1
  120. package/build/components/{use-no-recursive-renders → recursion-provider}/index.js +40 -18
  121. package/build/components/recursion-provider/index.js.map +1 -0
  122. package/build/components/rich-text/format-toolbar-container.js +61 -12
  123. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  124. package/build/components/rich-text/index.js +8 -2
  125. package/build/components/rich-text/index.js.map +1 -1
  126. package/build/components/rich-text/index.native.js +3 -1
  127. package/build/components/rich-text/index.native.js.map +1 -1
  128. package/build/components/rich-text/use-before-input-rules.js +110 -0
  129. package/build/components/rich-text/use-before-input-rules.js.map +1 -0
  130. package/build/components/rich-text/use-format-types.js +36 -16
  131. package/build/components/rich-text/use-format-types.js.map +1 -1
  132. package/build/components/text-decoration-control/index.js +3 -1
  133. package/build/components/text-decoration-control/index.js.map +1 -1
  134. package/build/components/text-transform-control/index.js +3 -1
  135. package/build/components/text-transform-control/index.js.map +1 -1
  136. package/build/components/url-popover/image-url-input-ui.js +4 -1
  137. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  138. package/build/components/url-popover/index.js +2 -1
  139. package/build/components/url-popover/index.js.map +1 -1
  140. package/build/components/writing-flow/use-arrow-nav.js +38 -27
  141. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  142. package/build/components/writing-flow/use-drag-selection.js +9 -2
  143. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  144. package/build/components/writing-flow/use-multi-selection.js +3 -47
  145. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  146. package/build/components/writing-flow/use-select-all.js +3 -1
  147. package/build/components/writing-flow/use-select-all.js.map +1 -1
  148. package/build/components/writing-flow/use-selection-observer.js +1 -3
  149. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  150. package/build/components/writing-flow/use-tab-nav.js +1 -1
  151. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  152. package/build/hooks/color.js +2 -4
  153. package/build/hooks/color.js.map +1 -1
  154. package/build/hooks/index.js +8 -0
  155. package/build/hooks/index.js.map +1 -1
  156. package/build/hooks/layout.js +61 -15
  157. package/build/hooks/layout.js.map +1 -1
  158. package/build/hooks/style.js +41 -31
  159. package/build/hooks/style.js.map +1 -1
  160. package/build/hooks/utils.js +5 -3
  161. package/build/hooks/utils.js.map +1 -1
  162. package/build/index.js +7 -0
  163. package/build/index.js.map +1 -1
  164. package/build/layouts/flex.js +40 -36
  165. package/build/layouts/flex.js.map +1 -1
  166. package/build/layouts/flow.js +35 -37
  167. package/build/layouts/flow.js.map +1 -1
  168. package/build/layouts/utils.js +35 -3
  169. package/build/layouts/utils.js.map +1 -1
  170. package/build/store/actions.js +15 -18
  171. package/build/store/actions.js.map +1 -1
  172. package/build/store/index.js +0 -4
  173. package/build/store/index.js.map +1 -1
  174. package/build/store/reducer.js +5 -3
  175. package/build/store/reducer.js.map +1 -1
  176. package/build/store/selectors.js +3 -3
  177. package/build/store/selectors.js.map +1 -1
  178. package/build/utils/block-variation-transforms.js +15 -9
  179. package/build/utils/block-variation-transforms.js.map +1 -1
  180. package/build/utils/pasting.js +9 -1
  181. package/build/utils/pasting.js.map +1 -1
  182. package/build-module/components/block-list/block-invalid-warning.native.js +50 -6
  183. package/build-module/components/block-list/block-invalid-warning.native.js.map +1 -1
  184. package/build-module/components/block-list/block.js +15 -5
  185. package/build-module/components/block-list/block.js.map +1 -1
  186. package/build-module/components/block-list/block.native.js +2 -1
  187. package/build-module/components/block-list/block.native.js.map +1 -1
  188. package/build-module/components/block-list/index.native.js +4 -2
  189. package/build-module/components/block-list/index.native.js.map +1 -1
  190. package/build-module/components/block-list/layout.js +19 -4
  191. package/build-module/components/block-list/layout.js.map +1 -1
  192. package/build-module/components/block-list/use-block-props/use-block-class-names.js +5 -2
  193. package/build-module/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  194. package/build-module/components/block-lock/modal.js +39 -8
  195. package/build-module/components/block-lock/modal.js.map +1 -1
  196. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +2 -2
  197. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  198. package/build-module/components/block-mover/mover-description.js +97 -33
  199. package/build-module/components/block-mover/mover-description.js.map +1 -1
  200. package/build-module/components/block-pattern-setup/index.js +6 -18
  201. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  202. package/build-module/components/block-popover/inbetween.js +2 -2
  203. package/build-module/components/block-popover/inbetween.js.map +1 -1
  204. package/build-module/components/block-popover/index.js +1 -1
  205. package/build-module/components/block-popover/index.js.map +1 -1
  206. package/build-module/components/block-settings-menu/block-mode-toggle.js +1 -1
  207. package/build-module/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  208. package/build-module/components/block-settings-menu/block-settings-dropdown.js +4 -1
  209. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  210. package/build-module/components/block-settings-menu-controls/index.js +2 -2
  211. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  212. package/build-module/components/block-styles/index.js +4 -7
  213. package/build-module/components/block-styles/index.js.map +1 -1
  214. package/build-module/components/block-styles/preview.native.js.map +1 -1
  215. package/build-module/components/block-switcher/index.js +7 -1
  216. package/build-module/components/block-switcher/index.js.map +1 -1
  217. package/build-module/components/block-title/index.js +8 -2
  218. package/build-module/components/block-title/index.js.map +1 -1
  219. package/build-module/components/block-title/use-block-display-title.js +12 -5
  220. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  221. package/build-module/components/block-tools/block-contextual-toolbar.js +1 -1
  222. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  223. package/build-module/components/block-tools/block-selection-button.js +1 -7
  224. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  225. package/build-module/components/block-tools/index.js +4 -1
  226. package/build-module/components/block-tools/index.js.map +1 -1
  227. package/build-module/components/block-types-list/index.js +1 -1
  228. package/build-module/components/block-types-list/index.js.map +1 -1
  229. package/build-module/components/block-types-list/index.native.js +67 -25
  230. package/build-module/components/block-types-list/index.native.js.map +1 -1
  231. package/build-module/components/border-radius-control/index.js +6 -2
  232. package/build-module/components/border-radius-control/index.js.map +1 -1
  233. package/build-module/components/colors/utils.js +7 -3
  234. package/build-module/components/colors/utils.js.map +1 -1
  235. package/build-module/components/colors/with-colors.js +2 -2
  236. package/build-module/components/colors/with-colors.js.map +1 -1
  237. package/build-module/components/colors-gradients/control.js +50 -40
  238. package/build-module/components/colors-gradients/control.js.map +1 -1
  239. package/build-module/components/colors-gradients/dropdown.js +10 -4
  240. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  241. package/build-module/components/date-format-picker/index.js +1 -1
  242. package/build-module/components/date-format-picker/index.js.map +1 -1
  243. package/build-module/components/font-appearance-control/index.js +7 -4
  244. package/build-module/components/font-appearance-control/index.js.map +1 -1
  245. package/build-module/components/iframe/index.js +19 -6
  246. package/build-module/components/iframe/index.js.map +1 -1
  247. package/build-module/components/image-editor/cropper.js +4 -3
  248. package/build-module/components/image-editor/cropper.js.map +1 -1
  249. package/build-module/components/image-editor/index.js +3 -1
  250. package/build-module/components/image-editor/index.js.map +1 -1
  251. package/build-module/components/image-size-control/index.js +3 -1
  252. package/build-module/components/image-size-control/index.js.map +1 -1
  253. package/build-module/components/index.js +1 -1
  254. package/build-module/components/index.js.map +1 -1
  255. package/build-module/components/index.native.js +1 -1
  256. package/build-module/components/index.native.js.map +1 -1
  257. package/build-module/components/inserter/block-types-tab.native.js +31 -15
  258. package/build-module/components/inserter/block-types-tab.native.js.map +1 -1
  259. package/build-module/components/inserter/index.native.js +9 -2
  260. package/build-module/components/inserter/index.native.js.map +1 -1
  261. package/build-module/components/inserter/preview-panel.js +9 -9
  262. package/build-module/components/inserter/preview-panel.js.map +1 -1
  263. package/build-module/components/inserter/reusable-blocks-tab.native.js +6 -2
  264. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  265. package/build-module/components/inserter/search-results.native.js +6 -3
  266. package/build-module/components/inserter/search-results.native.js.map +1 -1
  267. package/build-module/components/inserter/utils.native.js +19 -0
  268. package/build-module/components/inserter/utils.native.js.map +1 -1
  269. package/build-module/components/inserter-list-item/index.js +5 -18
  270. package/build-module/components/inserter-list-item/index.js.map +1 -1
  271. package/build-module/components/letter-spacing-control/index.js +5 -3
  272. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  273. package/build-module/components/line-height-control/index.js +5 -3
  274. package/build-module/components/line-height-control/index.js.map +1 -1
  275. package/build-module/components/link-control/index.js +1 -1
  276. package/build-module/components/link-control/index.js.map +1 -1
  277. package/build-module/components/link-control/is-url-like.js +1 -6
  278. package/build-module/components/link-control/is-url-like.js.map +1 -1
  279. package/build-module/components/link-control/use-search-handler.js +1 -6
  280. package/build-module/components/link-control/use-search-handler.js.map +1 -1
  281. package/build-module/components/list-view/block-select-button.js +16 -8
  282. package/build-module/components/list-view/block-select-button.js.map +1 -1
  283. package/build-module/components/list-view/branch.js +1 -6
  284. package/build-module/components/list-view/branch.js.map +1 -1
  285. package/build-module/components/list-view/drop-indicator.js +1 -1
  286. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  287. package/build-module/components/list-view/expander.js +3 -2
  288. package/build-module/components/list-view/expander.js.map +1 -1
  289. package/build-module/components/media-placeholder/index.js +13 -2
  290. package/build-module/components/media-placeholder/index.js.map +1 -1
  291. package/build-module/components/media-replace-flow/index.js +4 -7
  292. package/build-module/components/media-replace-flow/index.js.map +1 -1
  293. package/build-module/components/media-upload/index.native.js +9 -2
  294. package/build-module/components/media-upload/index.native.js.map +1 -1
  295. package/build-module/components/observe-typing/index.js +22 -8
  296. package/build-module/components/observe-typing/index.js.map +1 -1
  297. package/build-module/components/preview-options/index.js +2 -2
  298. package/build-module/components/preview-options/index.js.map +1 -1
  299. package/build-module/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -19
  300. package/build-module/components/recursion-provider/index.js.map +1 -0
  301. package/build-module/components/rich-text/format-toolbar-container.js +58 -12
  302. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  303. package/build-module/components/rich-text/index.js +7 -2
  304. package/build-module/components/rich-text/index.js.map +1 -1
  305. package/build-module/components/rich-text/index.native.js +3 -1
  306. package/build-module/components/rich-text/index.native.js.map +1 -1
  307. package/build-module/components/rich-text/use-before-input-rules.js +96 -0
  308. package/build-module/components/rich-text/use-before-input-rules.js.map +1 -0
  309. package/build-module/components/rich-text/use-format-types.js +37 -18
  310. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  311. package/build-module/components/text-decoration-control/index.js +4 -2
  312. package/build-module/components/text-decoration-control/index.js.map +1 -1
  313. package/build-module/components/text-transform-control/index.js +4 -2
  314. package/build-module/components/text-transform-control/index.js.map +1 -1
  315. package/build-module/components/url-popover/image-url-input-ui.js +4 -1
  316. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  317. package/build-module/components/url-popover/index.js +2 -1
  318. package/build-module/components/url-popover/index.js.map +1 -1
  319. package/build-module/components/writing-flow/use-arrow-nav.js +40 -29
  320. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  321. package/build-module/components/writing-flow/use-drag-selection.js +9 -2
  322. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  323. package/build-module/components/writing-flow/use-multi-selection.js +3 -45
  324. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  325. package/build-module/components/writing-flow/use-select-all.js +3 -1
  326. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  327. package/build-module/components/writing-flow/use-selection-observer.js +1 -3
  328. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  329. package/build-module/components/writing-flow/use-tab-nav.js +1 -1
  330. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  331. package/build-module/hooks/color.js +2 -3
  332. package/build-module/hooks/color.js.map +1 -1
  333. package/build-module/hooks/index.js +1 -0
  334. package/build-module/hooks/index.js.map +1 -1
  335. package/build-module/hooks/layout.js +62 -16
  336. package/build-module/hooks/layout.js.map +1 -1
  337. package/build-module/hooks/style.js +44 -35
  338. package/build-module/hooks/style.js.map +1 -1
  339. package/build-module/hooks/utils.js +5 -2
  340. package/build-module/hooks/utils.js.map +1 -1
  341. package/build-module/index.js +1 -1
  342. package/build-module/index.js.map +1 -1
  343. package/build-module/layouts/flex.js +41 -33
  344. package/build-module/layouts/flex.js.map +1 -1
  345. package/build-module/layouts/flow.js +35 -38
  346. package/build-module/layouts/flow.js.map +1 -1
  347. package/build-module/layouts/utils.js +33 -3
  348. package/build-module/layouts/utils.js.map +1 -1
  349. package/build-module/store/actions.js +9 -10
  350. package/build-module/store/actions.js.map +1 -1
  351. package/build-module/store/index.js +0 -4
  352. package/build-module/store/index.js.map +1 -1
  353. package/build-module/store/reducer.js +5 -2
  354. package/build-module/store/reducer.js.map +1 -1
  355. package/build-module/store/selectors.js +4 -4
  356. package/build-module/store/selectors.js.map +1 -1
  357. package/build-module/utils/block-variation-transforms.js +14 -7
  358. package/build-module/utils/block-variation-transforms.js.map +1 -1
  359. package/build-module/utils/pasting.js +9 -1
  360. package/build-module/utils/pasting.js.map +1 -1
  361. package/build-style/style-rtl.css +72 -14
  362. package/build-style/style.css +72 -14
  363. package/package.json +28 -28
  364. package/src/components/block-list/block-invalid-warning.native.js +42 -7
  365. package/src/components/block-list/block.js +15 -4
  366. package/src/components/block-list/block.native.js +1 -0
  367. package/src/components/block-list/index.native.js +2 -2
  368. package/src/components/block-list/layout.js +15 -3
  369. package/src/components/block-list/style.scss +1 -1
  370. package/src/components/block-list/use-block-props/use-block-class-names.js +5 -1
  371. package/src/components/block-lock/modal.js +47 -9
  372. package/src/components/block-lock/style.scss +10 -0
  373. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  374. package/src/components/block-mover/mover-description.js +131 -48
  375. package/src/components/block-mover/test/mover-description.js +55 -3
  376. package/src/components/block-pattern-setup/index.js +3 -15
  377. package/src/components/block-pattern-setup/style.scss +4 -2
  378. package/src/components/block-popover/inbetween.js +2 -1
  379. package/src/components/block-popover/index.js +1 -1
  380. package/src/components/block-popover/style.scss +25 -2
  381. package/src/components/block-settings-menu/block-mode-toggle.js +1 -0
  382. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -1
  383. package/src/components/block-settings-menu-controls/index.js +2 -2
  384. package/src/components/block-styles/index.js +4 -7
  385. package/src/components/block-styles/preview.native.js +1 -0
  386. package/src/components/block-styles/style.scss +10 -0
  387. package/src/components/block-switcher/index.js +7 -1
  388. package/src/components/block-title/index.js +3 -2
  389. package/src/components/block-title/use-block-display-title.js +11 -5
  390. package/src/components/block-tools/block-contextual-toolbar.js +3 -1
  391. package/src/components/block-tools/block-selection-button.js +0 -5
  392. package/src/components/block-tools/index.js +4 -1
  393. package/src/components/block-types-list/index.js +1 -1
  394. package/src/components/block-types-list/index.native.js +76 -24
  395. package/src/components/block-types-list/style.native.scss +18 -0
  396. package/src/components/border-radius-control/index.js +6 -1
  397. package/src/components/color-palette/test/__snapshots__/control.js.snap +91 -79
  398. package/src/components/colors/test/__snapshots__/with-colors.js.snap +1 -1
  399. package/src/components/colors/test/with-colors.js +1 -1
  400. package/src/components/colors/utils.js +5 -2
  401. package/src/components/colors/with-colors.js +2 -2
  402. package/src/components/colors-gradients/control.js +82 -65
  403. package/src/components/colors-gradients/dropdown.js +14 -3
  404. package/src/components/colors-gradients/style.scss +34 -9
  405. package/src/components/colors-gradients/test/control.js +16 -23
  406. package/src/components/date-format-picker/index.js +1 -0
  407. package/src/components/font-appearance-control/index.js +3 -0
  408. package/src/components/iframe/index.js +25 -6
  409. package/src/components/image-editor/cropper.js +9 -3
  410. package/src/components/image-editor/index.js +2 -0
  411. package/src/components/image-size-control/README.md +7 -0
  412. package/src/components/image-size-control/index.js +2 -0
  413. package/src/components/index.js +4 -1
  414. package/src/components/index.native.js +4 -1
  415. package/src/components/inserter/block-types-tab.native.js +42 -21
  416. package/src/components/inserter/index.native.js +7 -2
  417. package/src/components/inserter/preview-panel.js +6 -14
  418. package/src/components/inserter/reusable-blocks-tab.native.js +4 -2
  419. package/src/components/inserter/search-results.native.js +4 -2
  420. package/src/components/inserter/style.scss +1 -1
  421. package/src/components/inserter/test/block-types-tab.native.js +2 -0
  422. package/src/components/inserter/test/utils.native.js +37 -0
  423. package/src/components/inserter/utils.native.js +11 -0
  424. package/src/components/inserter-list-item/index.js +5 -18
  425. package/src/components/letter-spacing-control/index.js +2 -0
  426. package/src/components/line-height-control/index.js +2 -0
  427. package/src/components/link-control/index.js +1 -0
  428. package/src/components/link-control/is-url-like.js +1 -6
  429. package/src/components/link-control/test/index.js +6 -4
  430. package/src/components/link-control/use-search-handler.js +1 -6
  431. package/src/components/list-view/block-select-button.js +29 -14
  432. package/src/components/list-view/branch.js +1 -6
  433. package/src/components/list-view/drop-indicator.js +1 -1
  434. package/src/components/list-view/expander.js +4 -2
  435. package/src/components/list-view/style.scss +18 -4
  436. package/src/components/media-placeholder/index.js +19 -0
  437. package/src/components/media-replace-flow/index.js +3 -6
  438. package/src/components/media-replace-flow/test/index.js +14 -4
  439. package/src/components/media-upload/index.native.js +7 -3
  440. package/src/components/observe-typing/index.js +17 -14
  441. package/src/components/preview-options/index.js +2 -2
  442. package/src/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -28
  443. package/src/components/{use-no-recursive-renders/test/use-no-recursive-renders.js → recursion-provider/test/index.js} +5 -6
  444. package/src/components/rich-text/README.md +13 -1
  445. package/src/components/rich-text/format-toolbar-container.js +63 -14
  446. package/src/components/rich-text/index.js +3 -0
  447. package/src/components/rich-text/index.native.js +2 -0
  448. package/src/components/rich-text/use-before-input-rules.js +91 -0
  449. package/src/components/rich-text/use-format-types.js +38 -17
  450. package/src/components/text-decoration-control/index.js +4 -2
  451. package/src/components/text-transform-control/index.js +4 -2
  452. package/src/components/url-popover/image-url-input-ui.js +3 -0
  453. package/src/components/url-popover/index.js +1 -0
  454. package/src/components/url-popover/test/__snapshots__/index.js.snap +3 -0
  455. package/src/components/writing-flow/use-arrow-nav.js +36 -34
  456. package/src/components/writing-flow/use-drag-selection.js +7 -1
  457. package/src/components/writing-flow/use-multi-selection.js +1 -48
  458. package/src/components/writing-flow/use-select-all.js +2 -1
  459. package/src/components/writing-flow/use-selection-observer.js +2 -3
  460. package/src/components/writing-flow/use-tab-nav.js +1 -1
  461. package/src/hooks/color.js +10 -3
  462. package/src/hooks/index.js +1 -0
  463. package/src/hooks/layout.js +66 -23
  464. package/src/hooks/style.js +46 -39
  465. package/src/hooks/utils.js +7 -3
  466. package/src/index.js +1 -0
  467. package/src/layouts/flex.js +47 -41
  468. package/src/layouts/flow.js +35 -34
  469. package/src/layouts/test/flex.js +21 -0
  470. package/src/layouts/test/flow.js +21 -0
  471. package/src/layouts/test/utils.js +138 -0
  472. package/src/layouts/utils.js +44 -3
  473. package/src/store/actions.js +10 -11
  474. package/src/store/index.js +0 -4
  475. package/src/store/reducer.js +3 -2
  476. package/src/store/selectors.js +3 -4
  477. package/src/utils/block-variation-transforms.js +13 -6
  478. package/src/utils/pasting.js +10 -1
  479. package/src/utils/test/block-variation-transforms.js +24 -0
  480. package/src/utils/test/pasting.js +10 -0
  481. package/tsconfig.json +2 -1
  482. package/build/components/use-no-recursive-renders/index.js.map +0 -1
  483. package/build-module/components/use-no-recursive-renders/index.js.map +0 -1
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { chevronRightSmall, Icon } from '@wordpress/icons';
4
+ import { chevronRightSmall, chevronLeftSmall, Icon } from '@wordpress/icons';
5
+ import { isRTL } from '@wordpress/i18n';
6
+
5
7
  export default function ListViewExpander( { onClick } ) {
6
8
  return (
7
9
  // Keyboard events are handled by TreeGrid see: components/src/tree-grid/index.js
@@ -18,7 +20,7 @@ export default function ListViewExpander( { onClick } ) {
18
20
  onClick={ ( event ) => onClick( event, { forceToggle: true } ) }
19
21
  aria-hidden="true"
20
22
  >
21
- <Icon icon={ chevronRightSmall } />
23
+ <Icon icon={ isRTL() ? chevronLeftSmall : chevronRightSmall } />
22
24
  </span>
23
25
  );
24
26
  }
@@ -97,7 +97,7 @@
97
97
  align-items: center;
98
98
  width: 100%;
99
99
  height: auto;
100
- padding: ($grid-unit-15 * 0.5) $grid-unit-15 ($grid-unit-15 * 0.5) 0;
100
+ padding: ($grid-unit-15 * 0.5) $grid-unit-05 ($grid-unit-15 * 0.5) 0;
101
101
  text-align: left;
102
102
  color: $gray-900;
103
103
  border-radius: $radius-block-ui;
@@ -207,7 +207,7 @@
207
207
  }
208
208
 
209
209
  .block-editor-list-view-block__menu-cell {
210
- padding-right: 5px;
210
+ padding-right: $grid-unit-05;
211
211
 
212
212
  .components-button.has-icon {
213
213
  height: 24px;
@@ -297,13 +297,27 @@
297
297
  }
298
298
  }
299
299
 
300
+ .block-editor-list-view-block-select-button__label-wrapper {
301
+ min-width: 120px;
302
+ }
303
+
304
+ .block-editor-list-view-block-select-button__title {
305
+ flex: 1;
306
+ position: relative;
307
+
308
+ .components-truncate {
309
+ position: absolute;
310
+ width: 100%;
311
+ transform: translateY(-50%);
312
+ }
313
+ }
314
+
300
315
  .block-editor-list-view-block-select-button__anchor {
301
316
  background: rgba($black, 0.1);
302
317
  border-radius: $radius-block-ui;
303
318
  display: inline-block;
304
319
  padding: 2px 6px;
305
- margin: 0 $grid-unit-10;
306
- max-width: 120px;
320
+ max-width: min(100px, 40%);
307
321
  overflow: hidden;
308
322
  text-overflow: ellipsis;
309
323
  }
@@ -71,6 +71,7 @@ export function MediaPlaceholder( {
71
71
  onSelect,
72
72
  onCancel,
73
73
  onSelectURL,
74
+ onToggleFeaturedImage,
74
75
  onDoubleClick,
75
76
  onFilesPreUpload = noop,
76
77
  onHTMLDrop = noop,
@@ -307,6 +308,22 @@ export function MediaPlaceholder( {
307
308
  );
308
309
  };
309
310
 
311
+ const renderFeaturedImageToggle = () => {
312
+ return (
313
+ onToggleFeaturedImage && (
314
+ <div className="block-editor-media-placeholder__url-input-container">
315
+ <Button
316
+ className="block-editor-media-placeholder__button"
317
+ onClick={ onToggleFeaturedImage }
318
+ variant="tertiary"
319
+ >
320
+ { __( 'Use featured image' ) }
321
+ </Button>
322
+ </div>
323
+ )
324
+ );
325
+ };
326
+
310
327
  const renderMediaUploadChecked = () => {
311
328
  const defaultButton = ( { open } ) => {
312
329
  return (
@@ -361,6 +378,7 @@ export function MediaPlaceholder( {
361
378
  </Button>
362
379
  { uploadMediaLibraryButton }
363
380
  { renderUrlSelectionUI() }
381
+ { renderFeaturedImageToggle() }
364
382
  { renderCancelLink() }
365
383
  </>
366
384
  );
@@ -389,6 +407,7 @@ export function MediaPlaceholder( {
389
407
  </FormFileUpload>
390
408
  { uploadMediaLibraryButton }
391
409
  { renderUrlSelectionUI() }
410
+ { renderFeaturedImageToggle() }
392
411
  { renderCancelLink() }
393
412
  </>
394
413
  );
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useState, useRef } from '@wordpress/element';
4
+ import { useRef } from '@wordpress/element';
5
5
  import { __ } from '@wordpress/i18n';
6
6
  import { speak } from '@wordpress/a11y';
7
7
  import {
@@ -55,7 +55,6 @@ const MediaReplaceFlow = ( {
55
55
  addToGallery,
56
56
  handleUpload = true,
57
57
  } ) => {
58
- const [ mediaURLValue, setMediaURLValue ] = useState( mediaURL );
59
58
  const mediaUpload = useSelect( ( select ) => {
60
59
  return select( blockEditorStore ).getSettings().mediaUpload;
61
60
  }, [] );
@@ -88,7 +87,6 @@ const MediaReplaceFlow = ( {
88
87
  onToggleFeaturedImage();
89
88
  }
90
89
  closeMenu();
91
- setMediaURLValue( media?.url );
92
90
  // Calling `onSelect` after the state update since it might unmount the component.
93
91
  onSelect( media );
94
92
  speak( __( 'The media file has been replaced' ) );
@@ -213,14 +211,13 @@ const MediaReplaceFlow = ( {
213
211
  { __( 'Current media URL:' ) }
214
212
  </span>
215
213
 
216
- <Tooltip text={ mediaURLValue } position="bottom">
214
+ <Tooltip text={ mediaURL } position="bottom">
217
215
  <div>
218
216
  <LinkControl
219
- value={ { url: mediaURLValue } }
217
+ value={ { url: mediaURL } }
220
218
  settings={ [] }
221
219
  showSuggestions={ false }
222
220
  onChange={ ( { url } ) => {
223
- setMediaURLValue( url );
224
221
  onSelectURL( url );
225
222
  editMediaButtonRef.current.focus();
226
223
  } }
@@ -3,6 +3,11 @@
3
3
  */
4
4
  import { render, fireEvent } from '@testing-library/react';
5
5
 
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { useState } from '@wordpress/element';
10
+
6
11
  /**
7
12
  * Internal dependencies
8
13
  */
@@ -10,19 +15,24 @@ import MediaReplaceFlow from '../';
10
15
 
11
16
  const noop = () => {};
12
17
 
13
- function setUpMediaReplaceFlow() {
14
- const { container } = render(
18
+ function TestWrapper() {
19
+ const [ mediaURL, setMediaURL ] = useState( 'https://example.media' );
20
+ return (
15
21
  <MediaReplaceFlow
16
22
  mediaId={ 1 }
17
- mediaURL={ 'https://example.media' }
23
+ mediaURL={ mediaURL }
18
24
  allowedTypes={ [ 'png' ] }
19
25
  accept="image/*"
20
26
  onSelect={ noop }
21
- onSelectURL={ noop }
27
+ onSelectURL={ setMediaURL }
22
28
  onError={ noop }
23
29
  onCloseModal={ noop }
24
30
  />
25
31
  );
32
+ }
33
+
34
+ function setUpMediaReplaceFlow() {
35
+ const { container } = render( <TestWrapper /> );
26
36
  return container;
27
37
  }
28
38
 
@@ -3,8 +3,6 @@
3
3
  */
4
4
  import { Platform } from 'react-native';
5
5
 
6
- import { delay } from 'lodash';
7
-
8
6
  import prompt from 'react-native-prompt-android';
9
7
 
10
8
  /**
@@ -46,6 +44,8 @@ const URL_MEDIA_SOURCE = 'URL';
46
44
  const PICKER_OPENING_DELAY = 200;
47
45
 
48
46
  export class MediaUpload extends Component {
47
+ pickerTimeout;
48
+
49
49
  constructor( props ) {
50
50
  super( props );
51
51
  this.onPickerPresent = this.onPickerPresent.bind( this );
@@ -78,6 +78,10 @@ export class MediaUpload extends Component {
78
78
  }
79
79
  }
80
80
 
81
+ componentWillUnmount() {
82
+ clearTimeout( this.pickerTimeout );
83
+ }
84
+
81
85
  getAllSources() {
82
86
  const { onSelectURL } = this.props;
83
87
 
@@ -189,7 +193,7 @@ export class MediaUpload extends Component {
189
193
  // the delay below is required because on iOS this action sheet gets dismissed by the close event of the Inserter
190
194
  // so this delay allows the Inserter to be closed fully before presenting action sheet.
191
195
  if ( autoOpen && isIOS ) {
192
- delay(
196
+ this.pickerTimeout = setTimeout(
193
197
  () => this.picker.presentPicker(),
194
198
  PICKER_OPENING_DELAY
195
199
  );
@@ -115,9 +115,13 @@ export function useMouseMoveTypingReset() {
115
115
  * field, presses ESC or TAB, or moves the mouse in the document.
116
116
  */
117
117
  export function useTypingObserver() {
118
- const isTyping = useSelect( ( select ) =>
119
- select( blockEditorStore ).isTyping()
120
- );
118
+ const { isTyping, hasInlineToolbar } = useSelect( ( select ) => {
119
+ const { isTyping: _isTyping, getSettings } = select( blockEditorStore );
120
+ return {
121
+ isTyping: _isTyping(),
122
+ hasInlineToolbar: getSettings().hasInlineToolbar,
123
+ };
124
+ }, [] );
121
125
  const { startTyping, stopTyping } = useDispatch( blockEditorStore );
122
126
 
123
127
  const ref1 = useMouseMoveTypingReset();
@@ -125,6 +129,7 @@ export function useTypingObserver() {
125
129
  ( node ) => {
126
130
  const { ownerDocument } = node;
127
131
  const { defaultView } = ownerDocument;
132
+ const selection = defaultView.getSelection();
128
133
 
129
134
  // Listeners to stop typing should only be added when typing.
130
135
  // Listeners to start typing should only be added when not typing.
@@ -170,22 +175,20 @@ export function useTypingObserver() {
170
175
  * uncollapsed (shift) selection.
171
176
  */
172
177
  function stopTypingOnSelectionUncollapse() {
173
- const selection = defaultView.getSelection();
174
- const isCollapsed =
175
- selection.rangeCount > 0 &&
176
- selection.getRangeAt( 0 ).collapsed;
177
-
178
- if ( ! isCollapsed ) {
178
+ if ( ! selection.isCollapsed ) {
179
179
  stopTyping();
180
180
  }
181
181
  }
182
182
 
183
183
  node.addEventListener( 'focus', stopTypingOnNonTextField );
184
184
  node.addEventListener( 'keydown', stopTypingOnEscapeKey );
185
- ownerDocument.addEventListener(
186
- 'selectionchange',
187
- stopTypingOnSelectionUncollapse
188
- );
185
+
186
+ if ( ! hasInlineToolbar ) {
187
+ ownerDocument.addEventListener(
188
+ 'selectionchange',
189
+ stopTypingOnSelectionUncollapse
190
+ );
191
+ }
189
192
 
190
193
  return () => {
191
194
  defaultView.clearTimeout( timerId );
@@ -242,7 +245,7 @@ export function useTypingObserver() {
242
245
  node.removeEventListener( 'keydown', startTypingInTextField );
243
246
  };
244
247
  },
245
- [ isTyping, startTyping, stopTyping ]
248
+ [ isTyping, hasInlineToolbar, startTyping, stopTyping ]
246
249
  );
247
250
 
248
251
  return useMergeRefs( [ ref1, ref2 ] );
@@ -33,10 +33,10 @@ export default function PreviewOptions( {
33
33
  className: 'block-editor-post-preview__button-toggle',
34
34
  disabled: ! isEnabled,
35
35
  /* translators: button label text should, if possible, be under 16 characters. */
36
- children: __( 'Preview' ),
36
+ children: __( 'View' ),
37
37
  };
38
38
  const menuProps = {
39
- 'aria-label': __( 'Preview options' ),
39
+ 'aria-label': __( 'View options' ),
40
40
  };
41
41
  return (
42
42
  <DropdownMenu
@@ -1,12 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import {
5
- createContext,
6
- useCallback,
7
- useContext,
8
- useMemo,
9
- } from '@wordpress/element';
4
+ import { createContext, useContext, useMemo } from '@wordpress/element';
10
5
 
11
6
  /**
12
7
  * Internal dependencies
@@ -37,37 +32,53 @@ function addToBlockType( renderedBlocks, blockName, uniqueId ) {
37
32
  }
38
33
 
39
34
  /**
40
- * A React hook for keeping track of blocks previously rendered up in the block
41
- * tree. Blocks susceptible to recursion can use this hook in their `Edit`
42
- * function to prevent said recursion.
35
+ * A React context provider for use with the `useHasRecursion` hook to prevent recursive
36
+ * renders.
43
37
  *
44
- * @param {*} uniqueId Any value that acts as a unique identifier for a block instance.
45
- * @param {string} blockName Optional block name.
38
+ * Wrap block content with this provider and provide the same `uniqueId` prop as used
39
+ * with `useHasRecursion`.
40
+ *
41
+ * @param {Object} props
42
+ * @param {*} props.uniqueId Any value that acts as a unique identifier for a block instance.
43
+ * @param {string} props.blockName Optional block name.
44
+ * @param {JSX.Element} props.children React children.
46
45
  *
47
- * @return {[boolean, Function]} A tuple of:
48
- * - a boolean describing whether the provided id
49
- * has already been rendered;
50
- * - a React context provider to be used to wrap
51
- * other elements.
46
+ * @return {JSX.Element} A React element.
52
47
  */
53
- export default function useNoRecursiveRenders( uniqueId, blockName = '' ) {
48
+ export function RecursionProvider( { children, uniqueId, blockName = '' } ) {
54
49
  const previouslyRenderedBlocks = useContext( RenderedRefsContext );
55
50
  const { name } = useBlockEditContext();
51
+
56
52
  blockName = blockName || name;
57
- const hasAlreadyRendered = Boolean(
58
- previouslyRenderedBlocks[ blockName ]?.has( uniqueId )
59
- );
53
+
60
54
  const newRenderedBlocks = useMemo(
61
55
  () => addToBlockType( previouslyRenderedBlocks, blockName, uniqueId ),
62
56
  [ previouslyRenderedBlocks, blockName, uniqueId ]
63
57
  );
64
- const Provider = useCallback(
65
- ( { children } ) => (
66
- <RenderedRefsContext.Provider value={ newRenderedBlocks }>
67
- { children }
68
- </RenderedRefsContext.Provider>
69
- ),
70
- [ newRenderedBlocks ]
58
+
59
+ return (
60
+ <RenderedRefsContext.Provider value={ newRenderedBlocks }>
61
+ { children }
62
+ </RenderedRefsContext.Provider>
71
63
  );
72
- return [ hasAlreadyRendered, Provider ];
64
+ }
65
+
66
+ /**
67
+ * A React hook for keeping track of blocks previously rendered up in the block
68
+ * tree. Blocks susceptible to recursion can use this hook in their `Edit`
69
+ * function to prevent said recursion.
70
+ *
71
+ * Use this with the `RecursionProvider` component, using the same `uniqueId` value
72
+ * for both the hook and the provider.
73
+ *
74
+ * @param {*} uniqueId Any value that acts as a unique identifier for a block instance.
75
+ * @param {string} blockName Optional block name.
76
+ *
77
+ * @return {boolean} A boolean describing whether the provided id has already been rendered.
78
+ */
79
+ export function useHasRecursion( uniqueId, blockName = '' ) {
80
+ const previouslyRenderedBlocks = useContext( RenderedRefsContext );
81
+ const { name } = useBlockEditContext();
82
+ blockName = blockName || name;
83
+ return Boolean( previouslyRenderedBlocks[ blockName ]?.has( uniqueId ) );
73
84
  }
@@ -6,7 +6,7 @@ import { render } from '@testing-library/react';
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
- import useNoRecursiveRenders from '../';
9
+ import { useHasRecursion, RecursionProvider } from '..';
10
10
  import {
11
11
  BlockEditContextProvider,
12
12
  useBlockEditContext,
@@ -16,15 +16,14 @@ import {
16
16
  // of calling itself depending on its `uniqueId` attribute.
17
17
  function Edit( { attributes: { uniqueId } } ) {
18
18
  const { name } = useBlockEditContext();
19
- const [ hasAlreadyRendered, RecursionProvider ] =
20
- useNoRecursiveRenders( uniqueId );
19
+ const hasRecursion = useHasRecursion( uniqueId );
21
20
 
22
- if ( hasAlreadyRendered ) {
21
+ if ( hasRecursion ) {
23
22
  return <div className={ `wp-block__${ name }--halted` }>Halt</div>;
24
23
  }
25
24
 
26
25
  return (
27
- <RecursionProvider>
26
+ <RecursionProvider uniqueId={ uniqueId }>
28
27
  <div className={ `wp-block__${ name }` }>
29
28
  { uniqueId === 'SIMPLE' && <p>Done</p> }
30
29
  { uniqueId === 'SINGLY-RECURSIVE' && (
@@ -48,7 +47,7 @@ function Edit( { attributes: { uniqueId } } ) {
48
47
  );
49
48
  }
50
49
 
51
- describe( 'useNoRecursiveRenders', () => {
50
+ describe( 'useHasRecursion/RecursionProvider', () => {
52
51
  const context = { name: 'reusable-block' };
53
52
 
54
53
  it( 'allows a single block to render', () => {
@@ -43,7 +43,19 @@ _Optional._ Called when the block can be removed. `forward` is true when the sel
43
43
 
44
44
  ### `allowedFormats: Array`
45
45
 
46
- _Optional._ By default, all registered formats are allowed. This setting can be used to fine-tune the allowed formats. Example: `[ 'core/bold', 'core/link' ]`.
46
+ _Optional._ By default, all registered formats are allowed. This setting can be used to fine-tune the allowed formats. If you want to limit the formats allowed, you can specify using allowedFormats property in your code. If you want to allow only bold and italic settings, then you need to pass it in array. Example: `[ 'core/bold', 'core/link' ]`.
47
+
48
+ {% ESNext %}
49
+
50
+ ```js
51
+ <RichText
52
+ tagName="h2"
53
+ value={ attributes.content }
54
+ allowedFormats={ [ 'core/bold', 'core/italic' ] } // Allow the content to be made bold or italic, but do not allow othe formatting options
55
+ onChange={ ( content ) => setAttributes( { content } ) }
56
+ placeholder={ __( 'Heading...' ) }
57
+ />
58
+ ```
47
59
 
48
60
  ### `withoutInteractiveFormatting: Boolean`
49
61
 
@@ -2,32 +2,81 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { Popover, ToolbarGroup } from '@wordpress/components';
5
+ import { useSelect } from '@wordpress/data';
6
+ import {
7
+ isCollapsed,
8
+ getActiveFormats,
9
+ useAnchorRef,
10
+ store as richTextStore,
11
+ } from '@wordpress/rich-text';
5
12
 
6
13
  /**
7
14
  * Internal dependencies
8
15
  */
9
16
  import BlockControls from '../block-controls';
10
17
  import FormatToolbar from './format-toolbar';
18
+ import { store as blockEditorStore } from '../../store';
19
+
20
+ function InlineSelectionToolbar( { value, anchorRef, activeFormats } ) {
21
+ const lastFormat = activeFormats[ activeFormats.length - 1 ];
22
+ const lastFormatType = lastFormat?.type;
23
+ const settings = useSelect(
24
+ ( select ) => select( richTextStore ).getFormatType( lastFormatType ),
25
+ [ lastFormatType ]
26
+ );
27
+ const selectionRef = useAnchorRef( {
28
+ ref: anchorRef,
29
+ value,
30
+ settings,
31
+ } );
32
+
33
+ return <InlineToolbar anchorRef={ selectionRef } />;
34
+ }
35
+
36
+ function InlineToolbar( { anchorRef } ) {
37
+ return (
38
+ <Popover
39
+ position="top center"
40
+ focusOnMount={ false }
41
+ anchorRef={ anchorRef }
42
+ className="block-editor-rich-text__inline-format-toolbar"
43
+ __unstableSlotName="block-toolbar"
44
+ >
45
+ <div className="block-editor-rich-text__inline-format-toolbar-group">
46
+ <ToolbarGroup>
47
+ <FormatToolbar />
48
+ </ToolbarGroup>
49
+ </div>
50
+ </Popover>
51
+ );
52
+ }
53
+
54
+ const FormatToolbarContainer = ( { inline, anchorRef, value } ) => {
55
+ const hasInlineToolbar = useSelect(
56
+ ( select ) => select( blockEditorStore ).getSettings().hasInlineToolbar,
57
+ []
58
+ );
11
59
 
12
- const FormatToolbarContainer = ( { inline, anchorRef } ) => {
13
60
  if ( inline ) {
14
- // Render in popover.
61
+ return <InlineToolbar anchorRef={ anchorRef } />;
62
+ }
63
+
64
+ if ( hasInlineToolbar ) {
65
+ const activeFormats = getActiveFormats( value );
66
+
67
+ if ( isCollapsed( value ) && ! activeFormats.length ) {
68
+ return null;
69
+ }
70
+
15
71
  return (
16
- <Popover
17
- position="top center"
18
- focusOnMount={ false }
72
+ <InlineSelectionToolbar
19
73
  anchorRef={ anchorRef }
20
- className="block-editor-rich-text__inline-format-toolbar"
21
- __unstableSlotName="block-toolbar"
22
- >
23
- <div className="block-editor-rich-text__inline-format-toolbar-group">
24
- <ToolbarGroup>
25
- <FormatToolbar />
26
- </ToolbarGroup>
27
- </div>
28
- </Popover>
74
+ value={ value }
75
+ activeFormats={ activeFormats }
76
+ />
29
77
  );
30
78
  }
79
+
31
80
  // Render regular toolbar.
32
81
  return (
33
82
  <BlockControls group="inline">
@@ -38,6 +38,7 @@ import { store as blockEditorStore } from '../../store';
38
38
  import { useUndoAutomaticChange } from './use-undo-automatic-change';
39
39
  import { useMarkPersistent } from './use-mark-persistent';
40
40
  import { usePasteHandler } from './use-paste-handler';
41
+ import { useBeforeInputRules } from './use-before-input-rules';
41
42
  import { useInputRules } from './use-input-rules';
42
43
  import { useEnter } from './use-enter';
43
44
  import { useFormatTypes } from './use-format-types';
@@ -344,6 +345,7 @@ function RichTextWrapper(
344
345
  <FormatToolbarContainer
345
346
  inline={ inlineToolbar }
346
347
  anchorRef={ anchorRef }
348
+ value={ value }
347
349
  />
348
350
  ) }
349
351
  <TagName
@@ -358,6 +360,7 @@ function RichTextWrapper(
358
360
  autocompleteProps.ref,
359
361
  props.ref,
360
362
  richTextRef,
363
+ useBeforeInputRules( { value, onChange } ),
361
364
  useInputRules( {
362
365
  value,
363
366
  onChange,
@@ -113,6 +113,7 @@ function RichTextWrapper(
113
113
  setRef,
114
114
  disableSuggestions,
115
115
  disableAutocorrection,
116
+ containerWidth,
116
117
  ...props
117
118
  },
118
119
  forwardedRef
@@ -639,6 +640,7 @@ function RichTextWrapper(
639
640
  setRef={ setRef }
640
641
  disableSuggestions={ disableSuggestions }
641
642
  disableAutocorrection={ disableAutocorrection }
643
+ containerWidth={ containerWidth }
642
644
  // Props to be set on the editable container are destructured on the
643
645
  // element itself for web (see below), but passed through rich text
644
646
  // for native.