@wordpress/block-editor 9.5.0 → 9.7.1-next.d6164808d3.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 (548) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/components/block-alignment-control/use-available-alignments.js +1 -1
  3. package/build/components/block-alignment-control/use-available-alignments.js.map +1 -1
  4. package/build/components/block-edit-visually-button/index.js +46 -0
  5. package/build/components/block-edit-visually-button/index.js.map +1 -0
  6. package/build/components/block-list/block.js +12 -2
  7. package/build/components/block-list/block.js.map +1 -1
  8. package/build/components/block-list/index.native.js +1 -1
  9. package/build/components/block-list/index.native.js.map +1 -1
  10. package/build/components/block-lock/modal.js +2 -2
  11. package/build/components/block-lock/modal.js.map +1 -1
  12. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +1 -1
  13. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  14. package/build/components/block-mover/mover-description.js +95 -32
  15. package/build/components/block-mover/mover-description.js.map +1 -1
  16. package/build/components/block-popover/inbetween.js +5 -3
  17. package/build/components/block-popover/inbetween.js.map +1 -1
  18. package/build/components/block-settings-menu/index.js +2 -6
  19. package/build/components/block-settings-menu/index.js.map +1 -1
  20. package/build/components/block-settings-menu-controls/index.js +1 -1
  21. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  22. package/build/components/block-styles/index.js +3 -6
  23. package/build/components/block-styles/index.js.map +1 -1
  24. package/build/components/block-styles/preview.native.js +1 -3
  25. package/build/components/block-styles/preview.native.js.map +1 -1
  26. package/build/components/block-switcher/index.js +10 -16
  27. package/build/components/block-switcher/index.js.map +1 -1
  28. package/build/components/block-toolbar/index.js +5 -1
  29. package/build/components/block-toolbar/index.js.map +1 -1
  30. package/build/components/block-tools/block-selection-button.js +1 -7
  31. package/build/components/block-tools/block-selection-button.js.map +1 -1
  32. package/build/components/block-tools/index.js +4 -1
  33. package/build/components/block-tools/index.js.map +1 -1
  34. package/build/components/block-types-list/index.js +1 -1
  35. package/build/components/block-types-list/index.js.map +1 -1
  36. package/build/components/block-types-list/index.native.js +65 -23
  37. package/build/components/block-types-list/index.native.js.map +1 -1
  38. package/build/components/border-radius-control/all-input-control.js +31 -3
  39. package/build/components/border-radius-control/all-input-control.js.map +1 -1
  40. package/build/components/border-radius-control/index.js +23 -7
  41. package/build/components/border-radius-control/index.js.map +1 -1
  42. package/build/components/border-radius-control/input-controls.js +21 -6
  43. package/build/components/border-radius-control/input-controls.js.map +1 -1
  44. package/build/components/border-radius-control/utils.js +13 -16
  45. package/build/components/border-radius-control/utils.js.map +1 -1
  46. package/build/components/colors/utils.js +6 -2
  47. package/build/components/colors/utils.js.map +1 -1
  48. package/build/components/colors/with-colors.js +17 -4
  49. package/build/components/colors/with-colors.js.map +1 -1
  50. package/build/components/colors-gradients/control.js +8 -4
  51. package/build/components/colors-gradients/control.js.map +1 -1
  52. package/build/components/colors-gradients/dropdown.js +9 -3
  53. package/build/components/colors-gradients/dropdown.js.map +1 -1
  54. package/build/components/copy-handler/index.js +6 -0
  55. package/build/components/copy-handler/index.js.map +1 -1
  56. package/build/components/date-format-picker/index.js +2 -7
  57. package/build/components/date-format-picker/index.js.map +1 -1
  58. package/build/components/duotone/components.js +5 -5
  59. package/build/components/duotone/components.js.map +1 -1
  60. package/build/components/font-appearance-control/index.js +10 -4
  61. package/build/components/font-appearance-control/index.js.map +1 -1
  62. package/build/components/font-family/index.js +1 -1
  63. package/build/components/font-family/index.js.map +1 -1
  64. package/build/components/font-sizes/with-font-sizes.js +17 -4
  65. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  66. package/build/components/image-editor/cropper.js +4 -3
  67. package/build/components/image-editor/cropper.js.map +1 -1
  68. package/build/components/image-editor/index.js +3 -1
  69. package/build/components/image-editor/index.js.map +1 -1
  70. package/build/components/image-size-control/index.js +3 -1
  71. package/build/components/image-size-control/index.js.map +1 -1
  72. package/build/components/index.js +22 -6
  73. package/build/components/index.js.map +1 -1
  74. package/build/components/index.native.js +11 -4
  75. package/build/components/index.native.js.map +1 -1
  76. package/build/components/inserter/block-types-tab.native.js +30 -16
  77. package/build/components/inserter/block-types-tab.native.js.map +1 -1
  78. package/build/components/inserter/index.native.js +8 -3
  79. package/build/components/inserter/index.native.js.map +1 -1
  80. package/build/components/inserter/preview-panel.js +8 -8
  81. package/build/components/inserter/preview-panel.js.map +1 -1
  82. package/build/components/inserter/reusable-blocks-tab.native.js +5 -1
  83. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  84. package/build/components/inserter/search-items.js +22 -4
  85. package/build/components/inserter/search-items.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/is-url-like.js +1 -7
  97. package/build/components/link-control/is-url-like.js.map +1 -1
  98. package/build/components/link-control/link-preview.js +0 -1
  99. package/build/components/link-control/link-preview.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 +5 -2
  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/expander.js +3 -1
  107. package/build/components/list-view/expander.js.map +1 -1
  108. package/build/components/list-view/use-block-selection.js +1 -7
  109. package/build/components/list-view/use-block-selection.js.map +1 -1
  110. package/build/components/media-upload/index.native.js +8 -3
  111. package/build/components/media-upload/index.native.js.map +1 -1
  112. package/build/components/observe-typing/index.js +22 -8
  113. package/build/components/observe-typing/index.js.map +1 -1
  114. package/build/components/preview-options/index.js +2 -2
  115. package/build/components/preview-options/index.js.map +1 -1
  116. package/build/components/{use-no-recursive-renders → recursion-provider}/index.js +40 -18
  117. package/build/components/recursion-provider/index.js.map +1 -0
  118. package/build/components/rich-text/format-toolbar-container.js +61 -12
  119. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  120. package/build/components/rich-text/index.js +8 -2
  121. package/build/components/rich-text/index.js.map +1 -1
  122. package/build/components/rich-text/index.native.js +3 -1
  123. package/build/components/rich-text/index.native.js.map +1 -1
  124. package/build/components/rich-text/use-before-input-rules.js +110 -0
  125. package/build/components/rich-text/use-before-input-rules.js.map +1 -0
  126. package/build/components/rich-text/use-enter.js +0 -4
  127. package/build/components/rich-text/use-enter.js.map +1 -1
  128. package/build/components/rich-text/use-format-types.js +39 -22
  129. package/build/components/rich-text/use-format-types.js.map +1 -1
  130. package/build/components/spacing-sizes-control/all-input-control.js +53 -0
  131. package/build/components/spacing-sizes-control/all-input-control.js.map +1 -0
  132. package/build/components/spacing-sizes-control/axial-input-controls.js +69 -0
  133. package/build/components/spacing-sizes-control/axial-input-controls.js.map +1 -0
  134. package/build/components/spacing-sizes-control/index.js +100 -0
  135. package/build/components/spacing-sizes-control/index.js.map +1 -0
  136. package/build/components/spacing-sizes-control/input-controls.js +52 -0
  137. package/build/components/spacing-sizes-control/input-controls.js.map +1 -0
  138. package/build/components/spacing-sizes-control/linked-button.js +38 -0
  139. package/build/components/spacing-sizes-control/linked-button.js.map +1 -0
  140. package/build/components/spacing-sizes-control/spacing-input-control.js +208 -0
  141. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -0
  142. package/build/components/spacing-sizes-control/utils.js +202 -0
  143. package/build/components/spacing-sizes-control/utils.js.map +1 -0
  144. package/build/components/text-decoration-control/index.js +3 -1
  145. package/build/components/text-decoration-control/index.js.map +1 -1
  146. package/build/components/text-transform-control/index.js +3 -1
  147. package/build/components/text-transform-control/index.js.map +1 -1
  148. package/build/components/url-input/index.js +1 -1
  149. package/build/components/url-input/index.js.map +1 -1
  150. package/build/components/url-popover/image-url-input-ui.js +4 -1
  151. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  152. package/build/components/writing-flow/use-arrow-nav.js +4 -25
  153. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  154. package/build/components/writing-flow/use-drag-selection.js +9 -2
  155. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  156. package/build/components/writing-flow/use-multi-selection.js +4 -2
  157. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  158. package/build/components/writing-flow/use-select-all.js +3 -1
  159. package/build/components/writing-flow/use-select-all.js.map +1 -1
  160. package/build/components/writing-flow/use-selection-observer.js +10 -2
  161. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  162. package/build/components/writing-flow/use-tab-nav.js +1 -1
  163. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  164. package/build/hooks/border-radius.js +2 -7
  165. package/build/hooks/border-radius.js.map +1 -1
  166. package/build/hooks/border.js +2 -2
  167. package/build/hooks/border.js.map +1 -1
  168. package/build/hooks/color.js +4 -1
  169. package/build/hooks/color.js.map +1 -1
  170. package/build/hooks/dimensions.js +15 -0
  171. package/build/hooks/dimensions.js.map +1 -1
  172. package/build/hooks/duotone.js +4 -4
  173. package/build/hooks/duotone.js.map +1 -1
  174. package/build/hooks/gap.js +6 -4
  175. package/build/hooks/gap.js.map +1 -1
  176. package/build/hooks/generated-class-name.js +1 -7
  177. package/build/hooks/generated-class-name.js.map +1 -1
  178. package/build/hooks/layout.js +42 -15
  179. package/build/hooks/layout.js.map +1 -1
  180. package/build/hooks/margin.js +28 -12
  181. package/build/hooks/margin.js.map +1 -1
  182. package/build/hooks/padding.js +19 -8
  183. package/build/hooks/padding.js.map +1 -1
  184. package/build/hooks/style.js +40 -76
  185. package/build/hooks/style.js.map +1 -1
  186. package/build/layouts/constrained.js +215 -0
  187. package/build/layouts/constrained.js.map +1 -0
  188. package/build/layouts/flex.js +1 -1
  189. package/build/layouts/flex.js.map +1 -1
  190. package/build/layouts/flow.js +6 -145
  191. package/build/layouts/flow.js.map +1 -1
  192. package/build/layouts/index.js +3 -1
  193. package/build/layouts/index.js.map +1 -1
  194. package/build/layouts/utils.js +43 -0
  195. package/build/layouts/utils.js.map +1 -1
  196. package/build/store/actions.js +25 -3
  197. package/build/store/actions.js.map +1 -1
  198. package/build/store/selectors.js +4 -6
  199. package/build/store/selectors.js.map +1 -1
  200. package/build/utils/block-variation-transforms.js +15 -9
  201. package/build/utils/block-variation-transforms.js.map +1 -1
  202. package/build/utils/pasting.js +9 -1
  203. package/build/utils/pasting.js.map +1 -1
  204. package/build-module/components/block-alignment-control/use-available-alignments.js +1 -1
  205. package/build-module/components/block-alignment-control/use-available-alignments.js.map +1 -1
  206. package/build-module/components/block-edit-visually-button/index.js +35 -0
  207. package/build-module/components/block-edit-visually-button/index.js.map +1 -0
  208. package/build-module/components/block-list/block.js +13 -3
  209. package/build-module/components/block-list/block.js.map +1 -1
  210. package/build-module/components/block-list/index.native.js +1 -1
  211. package/build-module/components/block-list/index.native.js.map +1 -1
  212. package/build-module/components/block-lock/modal.js +2 -2
  213. package/build-module/components/block-lock/modal.js.map +1 -1
  214. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +2 -2
  215. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  216. package/build-module/components/block-mover/mover-description.js +97 -33
  217. package/build-module/components/block-mover/mover-description.js.map +1 -1
  218. package/build-module/components/block-popover/inbetween.js +5 -3
  219. package/build-module/components/block-popover/inbetween.js.map +1 -1
  220. package/build-module/components/block-settings-menu/index.js +3 -6
  221. package/build-module/components/block-settings-menu/index.js.map +1 -1
  222. package/build-module/components/block-settings-menu-controls/index.js +2 -2
  223. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  224. package/build-module/components/block-styles/index.js +4 -7
  225. package/build-module/components/block-styles/index.js.map +1 -1
  226. package/build-module/components/block-styles/preview.native.js +2 -3
  227. package/build-module/components/block-styles/preview.native.js.map +1 -1
  228. package/build-module/components/block-switcher/index.js +10 -16
  229. package/build-module/components/block-switcher/index.js.map +1 -1
  230. package/build-module/components/block-toolbar/index.js +4 -1
  231. package/build-module/components/block-toolbar/index.js.map +1 -1
  232. package/build-module/components/block-tools/block-selection-button.js +1 -7
  233. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  234. package/build-module/components/block-tools/index.js +4 -1
  235. package/build-module/components/block-tools/index.js.map +1 -1
  236. package/build-module/components/block-types-list/index.js +1 -1
  237. package/build-module/components/block-types-list/index.js.map +1 -1
  238. package/build-module/components/block-types-list/index.native.js +67 -25
  239. package/build-module/components/block-types-list/index.native.js.map +1 -1
  240. package/build-module/components/border-radius-control/all-input-control.js +32 -4
  241. package/build-module/components/border-radius-control/all-input-control.js.map +1 -1
  242. package/build-module/components/border-radius-control/index.js +24 -8
  243. package/build-module/components/border-radius-control/index.js.map +1 -1
  244. package/build-module/components/border-radius-control/input-controls.js +22 -7
  245. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  246. package/build-module/components/border-radius-control/utils.js +13 -16
  247. package/build-module/components/border-radius-control/utils.js.map +1 -1
  248. package/build-module/components/colors/utils.js +7 -3
  249. package/build-module/components/colors/utils.js.map +1 -1
  250. package/build-module/components/colors/with-colors.js +16 -3
  251. package/build-module/components/colors/with-colors.js.map +1 -1
  252. package/build-module/components/colors-gradients/control.js +8 -4
  253. package/build-module/components/colors-gradients/control.js.map +1 -1
  254. package/build-module/components/colors-gradients/dropdown.js +10 -4
  255. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  256. package/build-module/components/copy-handler/index.js +7 -1
  257. package/build-module/components/copy-handler/index.js.map +1 -1
  258. package/build-module/components/date-format-picker/index.js +2 -6
  259. package/build-module/components/date-format-picker/index.js.map +1 -1
  260. package/build-module/components/duotone/components.js +5 -5
  261. package/build-module/components/duotone/components.js.map +1 -1
  262. package/build-module/components/font-appearance-control/index.js +7 -4
  263. package/build-module/components/font-appearance-control/index.js.map +1 -1
  264. package/build-module/components/font-family/index.js +1 -1
  265. package/build-module/components/font-family/index.js.map +1 -1
  266. package/build-module/components/font-sizes/with-font-sizes.js +16 -3
  267. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  268. package/build-module/components/image-editor/cropper.js +4 -3
  269. package/build-module/components/image-editor/cropper.js.map +1 -1
  270. package/build-module/components/image-editor/index.js +3 -1
  271. package/build-module/components/image-editor/index.js.map +1 -1
  272. package/build-module/components/image-size-control/index.js +3 -1
  273. package/build-module/components/image-size-control/index.js.map +1 -1
  274. package/build-module/components/index.js +2 -1
  275. package/build-module/components/index.js.map +1 -1
  276. package/build-module/components/index.native.js +1 -1
  277. package/build-module/components/index.native.js.map +1 -1
  278. package/build-module/components/inserter/block-types-tab.native.js +31 -15
  279. package/build-module/components/inserter/block-types-tab.native.js.map +1 -1
  280. package/build-module/components/inserter/index.native.js +9 -2
  281. package/build-module/components/inserter/index.native.js.map +1 -1
  282. package/build-module/components/inserter/preview-panel.js +9 -9
  283. package/build-module/components/inserter/preview-panel.js.map +1 -1
  284. package/build-module/components/inserter/reusable-blocks-tab.native.js +6 -2
  285. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  286. package/build-module/components/inserter/search-items.js +19 -5
  287. package/build-module/components/inserter/search-items.js.map +1 -1
  288. package/build-module/components/inserter/search-results.native.js +6 -3
  289. package/build-module/components/inserter/search-results.native.js.map +1 -1
  290. package/build-module/components/inserter/utils.native.js +19 -0
  291. package/build-module/components/inserter/utils.native.js.map +1 -1
  292. package/build-module/components/inserter-list-item/index.js +5 -18
  293. package/build-module/components/inserter-list-item/index.js.map +1 -1
  294. package/build-module/components/letter-spacing-control/index.js +5 -3
  295. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  296. package/build-module/components/line-height-control/index.js +5 -3
  297. package/build-module/components/line-height-control/index.js.map +1 -1
  298. package/build-module/components/link-control/is-url-like.js +1 -6
  299. package/build-module/components/link-control/is-url-like.js.map +1 -1
  300. package/build-module/components/link-control/link-preview.js +0 -1
  301. package/build-module/components/link-control/link-preview.js.map +1 -1
  302. package/build-module/components/link-control/use-search-handler.js +1 -6
  303. package/build-module/components/link-control/use-search-handler.js.map +1 -1
  304. package/build-module/components/list-view/block-select-button.js +5 -2
  305. package/build-module/components/list-view/block-select-button.js.map +1 -1
  306. package/build-module/components/list-view/branch.js +1 -6
  307. package/build-module/components/list-view/branch.js.map +1 -1
  308. package/build-module/components/list-view/expander.js +3 -2
  309. package/build-module/components/list-view/expander.js.map +1 -1
  310. package/build-module/components/list-view/use-block-selection.js +1 -6
  311. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  312. package/build-module/components/media-upload/index.native.js +9 -2
  313. package/build-module/components/media-upload/index.native.js.map +1 -1
  314. package/build-module/components/observe-typing/index.js +22 -8
  315. package/build-module/components/observe-typing/index.js.map +1 -1
  316. package/build-module/components/preview-options/index.js +2 -2
  317. package/build-module/components/preview-options/index.js.map +1 -1
  318. package/build-module/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -19
  319. package/build-module/components/recursion-provider/index.js.map +1 -0
  320. package/build-module/components/rich-text/format-toolbar-container.js +58 -12
  321. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  322. package/build-module/components/rich-text/index.js +7 -2
  323. package/build-module/components/rich-text/index.js.map +1 -1
  324. package/build-module/components/rich-text/index.native.js +3 -1
  325. package/build-module/components/rich-text/index.native.js.map +1 -1
  326. package/build-module/components/rich-text/use-before-input-rules.js +96 -0
  327. package/build-module/components/rich-text/use-before-input-rules.js.map +1 -0
  328. package/build-module/components/rich-text/use-enter.js +0 -4
  329. package/build-module/components/rich-text/use-enter.js.map +1 -1
  330. package/build-module/components/rich-text/use-format-types.js +39 -22
  331. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  332. package/build-module/components/spacing-sizes-control/all-input-control.js +41 -0
  333. package/build-module/components/spacing-sizes-control/all-input-control.js.map +1 -0
  334. package/build-module/components/spacing-sizes-control/axial-input-controls.js +57 -0
  335. package/build-module/components/spacing-sizes-control/axial-input-controls.js.map +1 -0
  336. package/build-module/components/spacing-sizes-control/index.js +83 -0
  337. package/build-module/components/spacing-sizes-control/index.js.map +1 -0
  338. package/build-module/components/spacing-sizes-control/input-controls.js +41 -0
  339. package/build-module/components/spacing-sizes-control/input-controls.js.map +1 -0
  340. package/build-module/components/spacing-sizes-control/linked-button.js +28 -0
  341. package/build-module/components/spacing-sizes-control/linked-button.js.map +1 -0
  342. package/build-module/components/spacing-sizes-control/spacing-input-control.js +192 -0
  343. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -0
  344. package/build-module/components/spacing-sizes-control/utils.js +174 -0
  345. package/build-module/components/spacing-sizes-control/utils.js.map +1 -0
  346. package/build-module/components/text-decoration-control/index.js +4 -2
  347. package/build-module/components/text-decoration-control/index.js.map +1 -1
  348. package/build-module/components/text-transform-control/index.js +4 -2
  349. package/build-module/components/text-transform-control/index.js.map +1 -1
  350. package/build-module/components/url-input/index.js +1 -1
  351. package/build-module/components/url-input/index.js.map +1 -1
  352. package/build-module/components/url-popover/image-url-input-ui.js +4 -1
  353. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  354. package/build-module/components/writing-flow/use-arrow-nav.js +5 -26
  355. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  356. package/build-module/components/writing-flow/use-drag-selection.js +9 -2
  357. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  358. package/build-module/components/writing-flow/use-multi-selection.js +4 -2
  359. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  360. package/build-module/components/writing-flow/use-select-all.js +3 -1
  361. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  362. package/build-module/components/writing-flow/use-selection-observer.js +10 -2
  363. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  364. package/build-module/components/writing-flow/use-tab-nav.js +1 -1
  365. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  366. package/build-module/hooks/border-radius.js +2 -7
  367. package/build-module/hooks/border-radius.js.map +1 -1
  368. package/build-module/hooks/border.js +2 -2
  369. package/build-module/hooks/border.js.map +1 -1
  370. package/build-module/hooks/color.js +4 -1
  371. package/build-module/hooks/color.js.map +1 -1
  372. package/build-module/hooks/dimensions.js +13 -0
  373. package/build-module/hooks/dimensions.js.map +1 -1
  374. package/build-module/hooks/duotone.js +4 -4
  375. package/build-module/hooks/duotone.js.map +1 -1
  376. package/build-module/hooks/gap.js +3 -2
  377. package/build-module/hooks/gap.js.map +1 -1
  378. package/build-module/hooks/generated-class-name.js +1 -6
  379. package/build-module/hooks/generated-class-name.js.map +1 -1
  380. package/build-module/hooks/layout.js +42 -15
  381. package/build-module/hooks/layout.js.map +1 -1
  382. package/build-module/hooks/margin.js +26 -12
  383. package/build-module/hooks/margin.js.map +1 -1
  384. package/build-module/hooks/padding.js +17 -8
  385. package/build-module/hooks/padding.js.map +1 -1
  386. package/build-module/hooks/style.js +44 -81
  387. package/build-module/hooks/style.js.map +1 -1
  388. package/build-module/layouts/constrained.js +197 -0
  389. package/build-module/layouts/constrained.js.map +1 -0
  390. package/build-module/layouts/flex.js +1 -1
  391. package/build-module/layouts/flex.js.map +1 -1
  392. package/build-module/layouts/flow.js +7 -140
  393. package/build-module/layouts/flow.js.map +1 -1
  394. package/build-module/layouts/index.js +2 -1
  395. package/build-module/layouts/index.js.map +1 -1
  396. package/build-module/layouts/utils.js +40 -0
  397. package/build-module/layouts/utils.js.map +1 -1
  398. package/build-module/store/actions.js +25 -3
  399. package/build-module/store/actions.js.map +1 -1
  400. package/build-module/store/selectors.js +5 -7
  401. package/build-module/store/selectors.js.map +1 -1
  402. package/build-module/utils/block-variation-transforms.js +14 -7
  403. package/build-module/utils/block-variation-transforms.js.map +1 -1
  404. package/build-module/utils/pasting.js +9 -1
  405. package/build-module/utils/pasting.js.map +1 -1
  406. package/build-style/style-rtl.css +154 -27
  407. package/build-style/style.css +154 -27
  408. package/package.json +30 -28
  409. package/src/components/block-alignment-control/use-available-alignments.js +1 -1
  410. package/src/components/block-edit-visually-button/index.js +39 -0
  411. package/src/components/block-list/block.js +13 -2
  412. package/src/components/block-list/index.native.js +1 -1
  413. package/src/components/block-lock/modal.js +5 -5
  414. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  415. package/src/components/block-mover/mover-description.js +131 -48
  416. package/src/components/block-mover/test/mover-description.js +55 -3
  417. package/src/components/block-popover/inbetween.js +5 -1
  418. package/src/components/block-popover/style.scss +25 -2
  419. package/src/components/block-settings-menu/index.js +11 -15
  420. package/src/components/block-settings-menu-controls/index.js +2 -2
  421. package/src/components/block-styles/index.js +4 -7
  422. package/src/components/block-styles/preview.native.js +2 -2
  423. package/src/components/block-styles/style.scss +10 -0
  424. package/src/components/block-switcher/index.js +9 -13
  425. package/src/components/block-switcher/test/index.js +1 -0
  426. package/src/components/block-toolbar/index.js +2 -0
  427. package/src/components/block-tools/block-selection-button.js +0 -5
  428. package/src/components/block-tools/index.js +4 -1
  429. package/src/components/block-types-list/index.js +1 -1
  430. package/src/components/block-types-list/index.native.js +76 -24
  431. package/src/components/block-types-list/style.native.scss +18 -0
  432. package/src/components/border-radius-control/all-input-control.js +41 -4
  433. package/src/components/border-radius-control/index.js +29 -6
  434. package/src/components/border-radius-control/input-controls.js +40 -13
  435. package/src/components/border-radius-control/test/utils.js +22 -60
  436. package/src/components/border-radius-control/utils.js +12 -16
  437. package/src/components/color-palette/test/__snapshots__/control.js.snap +91 -79
  438. package/src/components/colors/test/__snapshots__/with-colors.js.snap +1 -1
  439. package/src/components/colors/test/with-colors.js +1 -1
  440. package/src/components/colors/utils.js +5 -2
  441. package/src/components/colors/with-colors.js +11 -1
  442. package/src/components/colors-gradients/control.js +13 -8
  443. package/src/components/colors-gradients/dropdown.js +14 -3
  444. package/src/components/colors-gradients/style.scss +33 -12
  445. package/src/components/colors-gradients/test/control.js +3 -3
  446. package/src/components/copy-handler/index.js +18 -0
  447. package/src/components/date-format-picker/index.js +12 -14
  448. package/src/components/date-format-picker/style.scss +0 -4
  449. package/src/components/duotone/components.js +5 -5
  450. package/src/components/duotone-control/style.scss +0 -4
  451. package/src/components/font-appearance-control/index.js +3 -0
  452. package/src/components/font-appearance-control/style.scss +0 -2
  453. package/src/components/font-family/index.js +1 -1
  454. package/src/components/font-sizes/with-font-sizes.js +11 -1
  455. package/src/components/image-editor/cropper.js +9 -3
  456. package/src/components/image-editor/index.js +2 -0
  457. package/src/components/image-size-control/README.md +7 -0
  458. package/src/components/image-size-control/index.js +2 -0
  459. package/src/components/index.js +5 -1
  460. package/src/components/index.native.js +4 -1
  461. package/src/components/inserter/block-types-tab.native.js +42 -21
  462. package/src/components/inserter/index.native.js +7 -2
  463. package/src/components/inserter/preview-panel.js +6 -14
  464. package/src/components/inserter/reusable-blocks-tab.native.js +4 -2
  465. package/src/components/inserter/search-items.js +17 -5
  466. package/src/components/inserter/search-results.native.js +4 -2
  467. package/src/components/inserter/test/block-types-tab.native.js +2 -0
  468. package/src/components/inserter/test/utils.native.js +37 -0
  469. package/src/components/inserter/utils.native.js +11 -0
  470. package/src/components/inserter-list-item/index.js +5 -18
  471. package/src/components/letter-spacing-control/index.js +2 -0
  472. package/src/components/line-height-control/index.js +2 -0
  473. package/src/components/link-control/is-url-like.js +1 -6
  474. package/src/components/link-control/link-preview.js +0 -1
  475. package/src/components/link-control/test/index.js +540 -893
  476. package/src/components/link-control/use-search-handler.js +1 -6
  477. package/src/components/list-view/block-select-button.js +7 -2
  478. package/src/components/list-view/branch.js +1 -6
  479. package/src/components/list-view/expander.js +4 -2
  480. package/src/components/list-view/style.scss +11 -4
  481. package/src/components/list-view/use-block-selection.js +2 -8
  482. package/src/components/media-replace-flow/style.scss +1 -0
  483. package/src/components/media-upload/index.native.js +7 -3
  484. package/src/components/observe-typing/index.js +17 -14
  485. package/src/components/preview-options/index.js +2 -2
  486. package/src/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -28
  487. package/src/components/{use-no-recursive-renders/test/use-no-recursive-renders.js → recursion-provider/test/index.js} +5 -6
  488. package/src/components/rich-text/README.md +13 -1
  489. package/src/components/rich-text/format-toolbar-container.js +63 -14
  490. package/src/components/rich-text/index.js +3 -0
  491. package/src/components/rich-text/index.native.js +2 -0
  492. package/src/components/rich-text/use-before-input-rules.js +91 -0
  493. package/src/components/rich-text/use-enter.js +0 -3
  494. package/src/components/rich-text/use-format-types.js +38 -17
  495. package/src/components/spacing-sizes-control/all-input-control.js +40 -0
  496. package/src/components/spacing-sizes-control/axial-input-controls.js +62 -0
  497. package/src/components/spacing-sizes-control/index.js +91 -0
  498. package/src/components/spacing-sizes-control/input-controls.js +46 -0
  499. package/src/components/spacing-sizes-control/linked-button.js +25 -0
  500. package/src/components/spacing-sizes-control/spacing-input-control.js +280 -0
  501. package/src/components/spacing-sizes-control/style.scss +122 -0
  502. package/src/components/spacing-sizes-control/test/utils.js +156 -0
  503. package/src/components/spacing-sizes-control/utils.js +195 -0
  504. package/src/components/text-decoration-control/index.js +4 -2
  505. package/src/components/text-transform-control/index.js +4 -2
  506. package/src/components/url-input/index.js +1 -1
  507. package/src/components/url-input/style.scss +2 -2
  508. package/src/components/url-popover/image-url-input-ui.js +3 -0
  509. package/src/components/url-popover/style.scss +0 -3
  510. package/src/components/writing-flow/use-arrow-nav.js +4 -33
  511. package/src/components/writing-flow/use-drag-selection.js +7 -1
  512. package/src/components/writing-flow/use-multi-selection.js +4 -1
  513. package/src/components/writing-flow/use-select-all.js +2 -1
  514. package/src/components/writing-flow/use-selection-observer.js +10 -2
  515. package/src/components/writing-flow/use-tab-nav.js +1 -1
  516. package/src/hooks/border-radius.js +2 -6
  517. package/src/hooks/border.js +2 -2
  518. package/src/hooks/color.js +13 -3
  519. package/src/hooks/dimensions.js +15 -0
  520. package/src/hooks/duotone.js +4 -4
  521. package/src/hooks/gap.js +7 -2
  522. package/src/hooks/generated-class-name.js +6 -9
  523. package/src/hooks/layout.js +66 -18
  524. package/src/hooks/margin.js +49 -17
  525. package/src/hooks/padding.js +41 -14
  526. package/src/hooks/style.js +42 -86
  527. package/src/hooks/test/gap.js +22 -0
  528. package/src/hooks/typography.scss +0 -1
  529. package/src/layouts/constrained.js +217 -0
  530. package/src/layouts/flex.js +1 -1
  531. package/src/layouts/flow.js +6 -151
  532. package/src/layouts/index.js +2 -1
  533. package/src/layouts/test/constrained.js +21 -0
  534. package/src/layouts/utils.js +34 -0
  535. package/src/store/actions.js +32 -4
  536. package/src/store/selectors.js +5 -4
  537. package/src/style.scss +1 -0
  538. package/src/utils/block-variation-transforms.js +13 -6
  539. package/src/utils/pasting.js +10 -1
  540. package/src/utils/test/block-variation-transforms.js +24 -0
  541. package/src/utils/test/pasting.js +10 -0
  542. package/build/components/block-settings-menu/block-edit-visually-button.js +0 -70
  543. package/build/components/block-settings-menu/block-edit-visually-button.js.map +0 -1
  544. package/build/components/use-no-recursive-renders/index.js.map +0 -1
  545. package/build-module/components/block-settings-menu/block-edit-visually-button.js +0 -56
  546. package/build-module/components/block-settings-menu/block-edit-visually-button.js.map +0 -1
  547. package/build-module/components/use-no-recursive-renders/index.js.map +0 -1
  548. package/src/components/block-settings-menu/block-edit-visually-button.js +0 -52
@@ -5,11 +5,6 @@ import { getProtocol, prependHTTP } from '@wordpress/url';
5
5
  import { useCallback } from '@wordpress/element';
6
6
  import { useSelect } from '@wordpress/data';
7
7
 
8
- /**
9
- * External dependencies
10
- */
11
- import { startsWith } from 'lodash';
12
-
13
8
  /**
14
9
  * Internal dependencies
15
10
  */
@@ -38,7 +33,7 @@ export const handleDirectEntry = ( val ) => {
38
33
  type = TEL_TYPE;
39
34
  }
40
35
 
41
- if ( startsWith( val, '#' ) ) {
36
+ if ( val?.startsWith( '#' ) ) {
42
37
  type = INTERNAL_TYPE;
43
38
  }
44
39
 
@@ -90,8 +90,13 @@ function ListViewBlockSelectButton(
90
90
  <Truncate ellipsizeMode="auto">{ blockTitle }</Truncate>
91
91
  </span>
92
92
  { blockInformation?.anchor && (
93
- <span className="block-editor-list-view-block-select-button__anchor">
94
- { blockInformation.anchor }
93
+ <span className="block-editor-list-view-block-select-button__anchor-wrapper">
94
+ <Truncate
95
+ className="block-editor-list-view-block-select-button__anchor"
96
+ ellipsizeMode="auto"
97
+ >
98
+ { blockInformation.anchor }
99
+ </Truncate>
95
100
  </span>
96
101
  ) }
97
102
  { isLocked && (
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { compact } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -95,7 +90,7 @@ function ListViewBranch( props ) {
95
90
 
96
91
  const { expandedState, draggedClientIds } = useListViewContext();
97
92
 
98
- const filteredBlocks = compact( blocks );
93
+ const filteredBlocks = blocks.filter( Boolean );
99
94
  const blockCount = filteredBlocks.length;
100
95
  let nextPosition = listPosition;
101
96
 
@@ -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
  }
@@ -312,14 +312,21 @@
312
312
  }
313
313
  }
314
314
 
315
+ .block-editor-list-view-block-select-button__anchor-wrapper {
316
+ position: relative;
317
+ max-width: min(110px, 40%);
318
+ width: 100%;
319
+ }
320
+
315
321
  .block-editor-list-view-block-select-button__anchor {
322
+ position: absolute;
323
+ right: 0;
324
+ transform: translateY(-50%);
316
325
  background: rgba($black, 0.1);
317
326
  border-radius: $radius-block-ui;
318
- display: inline-block;
319
327
  padding: 2px 6px;
320
- max-width: min(100px, 40%);
321
- overflow: hidden;
322
- text-overflow: ellipsis;
328
+ max-width: 100%;
329
+ box-sizing: border-box;
323
330
  }
324
331
 
325
332
  &.is-selected .block-editor-list-view-block-select-button__anchor {
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { difference } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -126,9 +121,8 @@ export default function useBlockSelection() {
126
121
  return;
127
122
  }
128
123
 
129
- const selectionDiff = difference(
130
- selectedBlocks,
131
- updatedSelectedBlocks
124
+ const selectionDiff = selectedBlocks.filter(
125
+ ( blockId ) => ! updatedSelectedBlocks.includes( blockId )
132
126
  );
133
127
 
134
128
  let label;
@@ -27,6 +27,7 @@
27
27
 
28
28
  .block-editor-url-input {
29
29
  padding: 0; // Cancel unnecessary default 1px padding in this case.
30
+ margin: 0; // Reset default LinkControl margins.
30
31
  }
31
32
 
32
33
  .components-base-control .components-base-control__field {
@@ -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.
@@ -0,0 +1,91 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useRef } from '@wordpress/element';
5
+ import { useRefEffect } from '@wordpress/compose';
6
+ import { insert, isCollapsed } from '@wordpress/rich-text';
7
+ import { useDispatch } from '@wordpress/data';
8
+ import { applyFilters } from '@wordpress/hooks';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { store as blockEditorStore } from '../../store';
14
+
15
+ /**
16
+ * When typing over a selection, the selection will we wrapped by a matching
17
+ * character pair. The second character is optional, it defaults to the first
18
+ * character.
19
+ *
20
+ * @type {string[]} Array of character pairs.
21
+ */
22
+ const wrapSelectionSettings = [ '`', '"', "'", '“”', '‘’' ];
23
+
24
+ export function useBeforeInputRules( props ) {
25
+ const {
26
+ __unstableMarkLastChangeAsPersistent,
27
+ __unstableMarkAutomaticChange,
28
+ } = useDispatch( blockEditorStore );
29
+ const propsRef = useRef( props );
30
+ propsRef.current = props;
31
+ return useRefEffect( ( element ) => {
32
+ function onInput( event ) {
33
+ const { inputType, data } = event;
34
+ const { value, onChange } = propsRef.current;
35
+
36
+ // Only run the rules when inserting text.
37
+ if ( inputType !== 'insertText' ) {
38
+ return;
39
+ }
40
+
41
+ if ( isCollapsed( value ) ) {
42
+ return;
43
+ }
44
+
45
+ const pair = applyFilters(
46
+ 'blockEditor.wrapSelectionSettings',
47
+ wrapSelectionSettings
48
+ ).find(
49
+ ( [ startChar, endChar ] ) =>
50
+ startChar === data || endChar === data
51
+ );
52
+
53
+ if ( ! pair ) {
54
+ return;
55
+ }
56
+
57
+ const [ startChar, endChar = startChar ] = pair;
58
+ const start = value.start;
59
+ const end = value.end + startChar.length;
60
+
61
+ let newValue = insert( value, startChar, start, start );
62
+ newValue = insert( newValue, endChar, end, end );
63
+
64
+ __unstableMarkLastChangeAsPersistent();
65
+ onChange( newValue );
66
+ __unstableMarkAutomaticChange();
67
+
68
+ const init = {};
69
+
70
+ for ( const key in event ) {
71
+ init[ key ] = event[ key ];
72
+ }
73
+
74
+ init.data = endChar;
75
+
76
+ const { ownerDocument } = element;
77
+ const { defaultView } = ownerDocument;
78
+ const newEvent = new defaultView.InputEvent( 'input', init );
79
+
80
+ // Dispatch an input event with the new data. This will trigger the
81
+ // input rules.
82
+ event.target.dispatchEvent( newEvent );
83
+ event.preventDefault();
84
+ }
85
+
86
+ element.addEventListener( 'beforeinput', onInput );
87
+ return () => {
88
+ element.removeEventListener( 'beforeinput', onInput );
89
+ };
90
+ }, [] );
91
+ }
@@ -1,6 +1,3 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
1
  /**
5
2
  * WordPress dependencies
6
3
  */