@wordpress/block-editor 9.3.0 → 9.6.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 (449) 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 +2 -2
  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 +4 -3
  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 +8 -26
  22. package/build/components/block-pattern-setup/index.js.map +1 -1
  23. package/build/components/block-pattern-setup/setup-toolbar.js +3 -8
  24. package/build/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  25. package/build/components/block-popover/inbetween.js +1 -1
  26. package/build/components/block-popover/inbetween.js.map +1 -1
  27. package/build/components/block-popover/index.js +1 -1
  28. package/build/components/block-popover/index.js.map +1 -1
  29. package/build/components/block-preview/auto.js +21 -5
  30. package/build/components/block-preview/auto.js.map +1 -1
  31. package/build/components/block-settings-menu/block-edit-visually-button.js +70 -0
  32. package/build/components/block-settings-menu/block-edit-visually-button.js.map +1 -0
  33. package/build/components/block-settings-menu/block-mode-toggle.js +1 -1
  34. package/build/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  35. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -2
  36. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  37. package/build/components/block-settings-menu/index.js +6 -2
  38. package/build/components/block-settings-menu/index.js.map +1 -1
  39. package/build/components/block-settings-menu-controls/index.js +5 -2
  40. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  41. package/build/components/block-styles/preview.native.js.map +1 -1
  42. package/build/components/block-switcher/index.js +7 -1
  43. package/build/components/block-switcher/index.js.map +1 -1
  44. package/build/components/block-title/index.js +8 -2
  45. package/build/components/block-title/index.js.map +1 -1
  46. package/build/components/block-title/use-block-display-title.js +15 -15
  47. package/build/components/block-title/use-block-display-title.js.map +1 -1
  48. package/build/components/block-tools/block-contextual-toolbar.js +1 -1
  49. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  50. package/build/components/block-tools/block-selection-button.js +1 -7
  51. package/build/components/block-tools/block-selection-button.js.map +1 -1
  52. package/build/components/block-tools/index.js +4 -1
  53. package/build/components/block-tools/index.js.map +1 -1
  54. package/build/components/block-types-list/index.native.js +65 -23
  55. package/build/components/block-types-list/index.native.js.map +1 -1
  56. package/build/components/border-radius-control/index.js +2 -0
  57. package/build/components/border-radius-control/index.js.map +1 -1
  58. package/build/components/colors/with-colors.js +1 -1
  59. package/build/components/colors/with-colors.js.map +1 -1
  60. package/build/components/colors-gradients/control.js +46 -39
  61. package/build/components/colors-gradients/control.js.map +1 -1
  62. package/build/components/colors-gradients/dropdown.js +7 -3
  63. package/build/components/colors-gradients/dropdown.js.map +1 -1
  64. package/build/components/date-format-picker/index.js +1 -1
  65. package/build/components/date-format-picker/index.js.map +1 -1
  66. package/build/components/duotone/components.js +145 -0
  67. package/build/components/duotone/components.js.map +1 -0
  68. package/build/components/duotone/index.js +40 -0
  69. package/build/components/duotone/index.js.map +1 -0
  70. package/build/components/duotone/utils.js +38 -0
  71. package/build/components/duotone/utils.js.map +1 -0
  72. package/build/components/duotone-control/index.js +17 -5
  73. package/build/components/duotone-control/index.js.map +1 -1
  74. package/build/components/iframe/index.js +19 -6
  75. package/build/components/iframe/index.js.map +1 -1
  76. package/build/components/image-editor/cropper.js +4 -3
  77. package/build/components/image-editor/cropper.js.map +1 -1
  78. package/build/components/image-editor/index.js +3 -1
  79. package/build/components/image-editor/index.js.map +1 -1
  80. package/build/components/index.js +14 -0
  81. package/build/components/index.js.map +1 -1
  82. package/build/components/inserter/block-types-tab.native.js +30 -16
  83. package/build/components/inserter/block-types-tab.native.js.map +1 -1
  84. package/build/components/inserter/index.js +3 -3
  85. package/build/components/inserter/index.js.map +1 -1
  86. package/build/components/inserter/preview-panel.js +8 -8
  87. package/build/components/inserter/preview-panel.js.map +1 -1
  88. package/build/components/inserter/reusable-blocks-tab.native.js +5 -1
  89. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  90. package/build/components/inserter/search-results.native.js +5 -2
  91. package/build/components/inserter/search-results.native.js.map +1 -1
  92. package/build/components/inserter/utils.native.js +21 -0
  93. package/build/components/inserter/utils.native.js.map +1 -1
  94. package/build/components/inserter-list-item/index.js +5 -1
  95. package/build/components/inserter-list-item/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/list-view/block-select-button.js +15 -7
  99. package/build/components/list-view/block-select-button.js.map +1 -1
  100. package/build/components/list-view/branch.js +1 -7
  101. package/build/components/list-view/branch.js.map +1 -1
  102. package/build/components/list-view/drop-indicator.js +1 -1
  103. package/build/components/list-view/drop-indicator.js.map +1 -1
  104. package/build/components/media-placeholder/index.js +14 -2
  105. package/build/components/media-placeholder/index.js.map +1 -1
  106. package/build/components/media-placeholder/index.native.js +4 -4
  107. package/build/components/media-placeholder/index.native.js.map +1 -1
  108. package/build/components/media-replace-flow/index.js +6 -13
  109. package/build/components/media-replace-flow/index.js.map +1 -1
  110. package/build/components/observe-typing/index.js +22 -8
  111. package/build/components/observe-typing/index.js.map +1 -1
  112. package/build/components/publish-date-time-picker/index.js +3 -0
  113. package/build/components/publish-date-time-picker/index.js.map +1 -1
  114. package/build/components/rich-text/format-toolbar-container.js +61 -12
  115. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  116. package/build/components/rich-text/index.js +2 -1
  117. package/build/components/rich-text/index.js.map +1 -1
  118. package/build/components/rich-text/use-format-types.js +36 -16
  119. package/build/components/rich-text/use-format-types.js.map +1 -1
  120. package/build/components/rich-text/use-input-rules.js +4 -13
  121. package/build/components/rich-text/use-input-rules.js.map +1 -1
  122. package/build/components/rich-text/use-paste-handler.js +20 -5
  123. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  124. package/build/components/url-popover/index.js +2 -1
  125. package/build/components/url-popover/index.js.map +1 -1
  126. package/build/components/writing-flow/use-arrow-nav.js +34 -2
  127. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  128. package/build/components/writing-flow/use-multi-selection.js +3 -47
  129. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  130. package/build/components/writing-flow/use-selection-observer.js +1 -3
  131. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  132. package/build/components/writing-flow/use-tab-nav.js +1 -1
  133. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  134. package/build/elements/index.js +11 -3
  135. package/build/elements/index.js.map +1 -1
  136. package/build/hooks/aria-label.js +71 -0
  137. package/build/hooks/aria-label.js.map +1 -0
  138. package/build/hooks/color.js +2 -4
  139. package/build/hooks/color.js.map +1 -1
  140. package/build/hooks/duotone.js +33 -160
  141. package/build/hooks/duotone.js.map +1 -1
  142. package/build/hooks/index.js +11 -7
  143. package/build/hooks/index.js.map +1 -1
  144. package/build/hooks/layout.js +59 -18
  145. package/build/hooks/layout.js.map +1 -1
  146. package/build/hooks/style.js +41 -31
  147. package/build/hooks/style.js.map +1 -1
  148. package/build/hooks/utils.js +5 -3
  149. package/build/hooks/utils.js.map +1 -1
  150. package/build/index.js +7 -7
  151. package/build/index.js.map +1 -1
  152. package/build/layouts/flex.js +42 -38
  153. package/build/layouts/flex.js.map +1 -1
  154. package/build/layouts/flow.js +35 -37
  155. package/build/layouts/flow.js.map +1 -1
  156. package/build/layouts/utils.js +35 -3
  157. package/build/layouts/utils.js.map +1 -1
  158. package/build/store/actions.js +24 -31
  159. package/build/store/actions.js.map +1 -1
  160. package/build/store/index.js +0 -4
  161. package/build/store/index.js.map +1 -1
  162. package/build/store/reducer.js +23 -12
  163. package/build/store/reducer.js.map +1 -1
  164. package/build/store/selectors.js +3 -3
  165. package/build/store/selectors.js.map +1 -1
  166. package/build/utils/selection.js +34 -0
  167. package/build/utils/selection.js.map +1 -0
  168. package/build-module/components/block-list/block-invalid-warning.native.js +50 -6
  169. package/build-module/components/block-list/block-invalid-warning.native.js.map +1 -1
  170. package/build-module/components/block-list/block.js +2 -2
  171. package/build-module/components/block-list/block.js.map +1 -1
  172. package/build-module/components/block-list/block.native.js +2 -1
  173. package/build-module/components/block-list/block.native.js.map +1 -1
  174. package/build-module/components/block-list/index.native.js +3 -1
  175. package/build-module/components/block-list/index.native.js.map +1 -1
  176. package/build-module/components/block-list/layout.js +19 -4
  177. package/build-module/components/block-list/layout.js.map +1 -1
  178. package/build-module/components/block-list/use-block-props/use-block-class-names.js +5 -2
  179. package/build-module/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  180. package/build-module/components/block-lock/modal.js +39 -8
  181. package/build-module/components/block-lock/modal.js.map +1 -1
  182. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +2 -2
  183. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  184. package/build-module/components/block-mover/mover-description.js +97 -33
  185. package/build-module/components/block-mover/mover-description.js.map +1 -1
  186. package/build-module/components/block-pattern-setup/index.js +9 -27
  187. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  188. package/build-module/components/block-pattern-setup/setup-toolbar.js +3 -8
  189. package/build-module/components/block-pattern-setup/setup-toolbar.js.map +1 -1
  190. package/build-module/components/block-popover/inbetween.js +1 -1
  191. package/build-module/components/block-popover/inbetween.js.map +1 -1
  192. package/build-module/components/block-popover/index.js +1 -1
  193. package/build-module/components/block-popover/index.js.map +1 -1
  194. package/build-module/components/block-preview/auto.js +20 -5
  195. package/build-module/components/block-preview/auto.js.map +1 -1
  196. package/build-module/components/block-settings-menu/block-edit-visually-button.js +56 -0
  197. package/build-module/components/block-settings-menu/block-edit-visually-button.js.map +1 -0
  198. package/build-module/components/block-settings-menu/block-mode-toggle.js +1 -1
  199. package/build-module/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  200. package/build-module/components/block-settings-menu/block-settings-dropdown.js +6 -5
  201. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  202. package/build-module/components/block-settings-menu/index.js +6 -3
  203. package/build-module/components/block-settings-menu/index.js.map +1 -1
  204. package/build-module/components/block-settings-menu-controls/index.js +7 -4
  205. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  206. package/build-module/components/block-styles/preview.native.js.map +1 -1
  207. package/build-module/components/block-switcher/index.js +7 -1
  208. package/build-module/components/block-switcher/index.js.map +1 -1
  209. package/build-module/components/block-title/index.js +8 -2
  210. package/build-module/components/block-title/index.js.map +1 -1
  211. package/build-module/components/block-title/use-block-display-title.js +15 -14
  212. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  213. package/build-module/components/block-tools/block-contextual-toolbar.js +1 -1
  214. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  215. package/build-module/components/block-tools/block-selection-button.js +1 -7
  216. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  217. package/build-module/components/block-tools/index.js +4 -1
  218. package/build-module/components/block-tools/index.js.map +1 -1
  219. package/build-module/components/block-types-list/index.native.js +67 -25
  220. package/build-module/components/block-types-list/index.native.js.map +1 -1
  221. package/build-module/components/border-radius-control/index.js +2 -0
  222. package/build-module/components/border-radius-control/index.js.map +1 -1
  223. package/build-module/components/colors/with-colors.js +2 -2
  224. package/build-module/components/colors/with-colors.js.map +1 -1
  225. package/build-module/components/colors-gradients/control.js +47 -40
  226. package/build-module/components/colors-gradients/control.js.map +1 -1
  227. package/build-module/components/colors-gradients/dropdown.js +8 -4
  228. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  229. package/build-module/components/date-format-picker/index.js +1 -1
  230. package/build-module/components/date-format-picker/index.js.map +1 -1
  231. package/build-module/components/duotone/components.js +130 -0
  232. package/build-module/components/duotone/components.js.map +1 -0
  233. package/build-module/components/duotone/index.js +3 -0
  234. package/build-module/components/duotone/index.js.map +1 -0
  235. package/build-module/components/duotone/utils.js +30 -0
  236. package/build-module/components/duotone/utils.js.map +1 -0
  237. package/build-module/components/duotone-control/index.js +18 -6
  238. package/build-module/components/duotone-control/index.js.map +1 -1
  239. package/build-module/components/iframe/index.js +19 -6
  240. package/build-module/components/iframe/index.js.map +1 -1
  241. package/build-module/components/image-editor/cropper.js +4 -3
  242. package/build-module/components/image-editor/cropper.js.map +1 -1
  243. package/build-module/components/image-editor/index.js +3 -1
  244. package/build-module/components/image-editor/index.js.map +1 -1
  245. package/build-module/components/index.js +1 -0
  246. package/build-module/components/index.js.map +1 -1
  247. package/build-module/components/inserter/block-types-tab.native.js +31 -15
  248. package/build-module/components/inserter/block-types-tab.native.js.map +1 -1
  249. package/build-module/components/inserter/index.js +3 -2
  250. package/build-module/components/inserter/index.js.map +1 -1
  251. package/build-module/components/inserter/preview-panel.js +9 -9
  252. package/build-module/components/inserter/preview-panel.js.map +1 -1
  253. package/build-module/components/inserter/reusable-blocks-tab.native.js +6 -2
  254. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  255. package/build-module/components/inserter/search-results.native.js +6 -3
  256. package/build-module/components/inserter/search-results.native.js.map +1 -1
  257. package/build-module/components/inserter/utils.native.js +19 -0
  258. package/build-module/components/inserter/utils.native.js.map +1 -1
  259. package/build-module/components/inserter-list-item/index.js +4 -1
  260. package/build-module/components/inserter-list-item/index.js.map +1 -1
  261. package/build-module/components/link-control/index.js +1 -1
  262. package/build-module/components/link-control/index.js.map +1 -1
  263. package/build-module/components/list-view/block-select-button.js +16 -8
  264. package/build-module/components/list-view/block-select-button.js.map +1 -1
  265. package/build-module/components/list-view/branch.js +1 -6
  266. package/build-module/components/list-view/branch.js.map +1 -1
  267. package/build-module/components/list-view/drop-indicator.js +1 -1
  268. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  269. package/build-module/components/media-placeholder/index.js +14 -2
  270. package/build-module/components/media-placeholder/index.js.map +1 -1
  271. package/build-module/components/media-placeholder/index.native.js +5 -3
  272. package/build-module/components/media-placeholder/index.native.js.map +1 -1
  273. package/build-module/components/media-replace-flow/index.js +7 -13
  274. package/build-module/components/media-replace-flow/index.js.map +1 -1
  275. package/build-module/components/observe-typing/index.js +22 -8
  276. package/build-module/components/observe-typing/index.js.map +1 -1
  277. package/build-module/components/publish-date-time-picker/index.js +2 -0
  278. package/build-module/components/publish-date-time-picker/index.js.map +1 -1
  279. package/build-module/components/rich-text/format-toolbar-container.js +58 -12
  280. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  281. package/build-module/components/rich-text/index.js +2 -1
  282. package/build-module/components/rich-text/index.js.map +1 -1
  283. package/build-module/components/rich-text/use-format-types.js +37 -18
  284. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  285. package/build-module/components/rich-text/use-input-rules.js +3 -11
  286. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  287. package/build-module/components/rich-text/use-paste-handler.js +20 -5
  288. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  289. package/build-module/components/url-popover/index.js +2 -1
  290. package/build-module/components/url-popover/index.js.map +1 -1
  291. package/build-module/components/writing-flow/use-arrow-nav.js +35 -3
  292. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  293. package/build-module/components/writing-flow/use-multi-selection.js +3 -45
  294. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  295. package/build-module/components/writing-flow/use-selection-observer.js +1 -3
  296. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  297. package/build-module/components/writing-flow/use-tab-nav.js +1 -1
  298. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  299. package/build-module/elements/index.js +7 -1
  300. package/build-module/elements/index.js.map +1 -1
  301. package/build-module/hooks/aria-label.js +59 -0
  302. package/build-module/hooks/aria-label.js.map +1 -0
  303. package/build-module/hooks/color.js +2 -3
  304. package/build-module/hooks/color.js.map +1 -1
  305. package/build-module/hooks/duotone.js +22 -140
  306. package/build-module/hooks/duotone.js.map +1 -1
  307. package/build-module/hooks/index.js +2 -1
  308. package/build-module/hooks/index.js.map +1 -1
  309. package/build-module/hooks/layout.js +60 -19
  310. package/build-module/hooks/layout.js.map +1 -1
  311. package/build-module/hooks/style.js +44 -35
  312. package/build-module/hooks/style.js.map +1 -1
  313. package/build-module/hooks/utils.js +5 -2
  314. package/build-module/hooks/utils.js.map +1 -1
  315. package/build-module/index.js +1 -1
  316. package/build-module/index.js.map +1 -1
  317. package/build-module/layouts/flex.js +43 -35
  318. package/build-module/layouts/flex.js.map +1 -1
  319. package/build-module/layouts/flow.js +35 -38
  320. package/build-module/layouts/flow.js.map +1 -1
  321. package/build-module/layouts/utils.js +33 -3
  322. package/build-module/layouts/utils.js.map +1 -1
  323. package/build-module/store/actions.js +14 -20
  324. package/build-module/store/actions.js.map +1 -1
  325. package/build-module/store/index.js +0 -4
  326. package/build-module/store/index.js.map +1 -1
  327. package/build-module/store/reducer.js +23 -11
  328. package/build-module/store/reducer.js.map +1 -1
  329. package/build-module/store/selectors.js +4 -4
  330. package/build-module/store/selectors.js.map +1 -1
  331. package/build-module/utils/selection.js +24 -0
  332. package/build-module/utils/selection.js.map +1 -0
  333. package/build-style/style-rtl.css +43 -13
  334. package/build-style/style.css +43 -13
  335. package/package.json +28 -28
  336. package/src/components/block-draggable/test/helpers.native.js +3 -3
  337. package/src/components/block-list/block-invalid-warning.native.js +42 -7
  338. package/src/components/block-list/block.js +2 -2
  339. package/src/components/block-list/block.native.js +1 -0
  340. package/src/components/block-list/index.native.js +1 -1
  341. package/src/components/block-list/layout.js +15 -3
  342. package/src/components/block-list/style.scss +2 -2
  343. package/src/components/block-list/use-block-props/use-block-class-names.js +5 -1
  344. package/src/components/block-lock/modal.js +47 -9
  345. package/src/components/block-lock/style.scss +10 -0
  346. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  347. package/src/components/block-mover/mover-description.js +131 -48
  348. package/src/components/block-mover/test/mover-description.js +55 -3
  349. package/src/components/block-pattern-setup/index.js +5 -25
  350. package/src/components/block-pattern-setup/setup-toolbar.js +2 -9
  351. package/src/components/block-pattern-setup/style.scss +4 -2
  352. package/src/components/block-popover/inbetween.js +1 -1
  353. package/src/components/block-popover/index.js +1 -1
  354. package/src/components/block-preview/auto.js +17 -3
  355. package/src/components/block-settings-menu/block-edit-visually-button.js +52 -0
  356. package/src/components/block-settings-menu/block-mode-toggle.js +1 -0
  357. package/src/components/block-settings-menu/block-settings-dropdown.js +7 -3
  358. package/src/components/block-settings-menu/index.js +15 -11
  359. package/src/components/block-settings-menu-controls/index.js +5 -4
  360. package/src/components/block-styles/preview.native.js +1 -0
  361. package/src/components/block-switcher/index.js +7 -1
  362. package/src/components/block-title/index.js +3 -2
  363. package/src/components/block-title/use-block-display-title.js +20 -12
  364. package/src/components/block-tools/block-contextual-toolbar.js +3 -1
  365. package/src/components/block-tools/block-selection-button.js +0 -5
  366. package/src/components/block-tools/index.js +4 -1
  367. package/src/components/block-types-list/index.native.js +76 -24
  368. package/src/components/block-types-list/style.native.scss +18 -0
  369. package/src/components/border-radius-control/index.js +2 -0
  370. package/src/components/color-palette/test/__snapshots__/control.js.snap +0 -4
  371. package/src/components/colors/test/__snapshots__/with-colors.js.snap +1 -1
  372. package/src/components/colors/test/with-colors.js +1 -1
  373. package/src/components/colors/with-colors.js +2 -2
  374. package/src/components/colors-gradients/control.js +78 -65
  375. package/src/components/colors-gradients/dropdown.js +9 -2
  376. package/src/components/colors-gradients/style.scss +11 -8
  377. package/src/components/colors-gradients/test/control.js +16 -23
  378. package/src/components/date-format-picker/index.js +1 -0
  379. package/src/components/duotone/components.js +133 -0
  380. package/src/components/duotone/index.js +7 -0
  381. package/src/components/duotone/utils.js +25 -0
  382. package/src/components/duotone-control/index.js +12 -7
  383. package/src/components/duotone-control/style.scss +5 -0
  384. package/src/components/iframe/index.js +25 -6
  385. package/src/components/image-editor/cropper.js +9 -3
  386. package/src/components/image-editor/index.js +2 -0
  387. package/src/components/index.js +1 -0
  388. package/src/components/inserter/block-types-tab.native.js +42 -21
  389. package/src/components/inserter/index.js +3 -5
  390. package/src/components/inserter/preview-panel.js +6 -14
  391. package/src/components/inserter/reusable-blocks-tab.native.js +4 -2
  392. package/src/components/inserter/search-results.native.js +4 -2
  393. package/src/components/inserter/style.scss +1 -1
  394. package/src/components/inserter/test/block-types-tab.native.js +2 -0
  395. package/src/components/inserter/test/utils.native.js +37 -0
  396. package/src/components/inserter/utils.native.js +11 -0
  397. package/src/components/inserter-list-item/index.js +4 -1
  398. package/src/components/link-control/index.js +1 -0
  399. package/src/components/link-control/test/fixtures/index.js +3 -4
  400. package/src/components/link-control/test/index.js +64 -73
  401. package/src/components/list-view/block-select-button.js +29 -14
  402. package/src/components/list-view/branch.js +1 -6
  403. package/src/components/list-view/drop-indicator.js +1 -1
  404. package/src/components/list-view/style.scss +18 -4
  405. package/src/components/media-placeholder/index.js +20 -0
  406. package/src/components/media-placeholder/index.native.js +9 -5
  407. package/src/components/media-replace-flow/index.js +5 -14
  408. package/src/components/media-replace-flow/test/index.js +14 -4
  409. package/src/components/media-upload/README.md +8 -0
  410. package/src/components/observe-typing/index.js +17 -14
  411. package/src/components/publish-date-time-picker/index.js +2 -0
  412. package/src/components/responsive-block-control/README.md +3 -1
  413. package/src/components/responsive-block-control/test/index.js +1 -2
  414. package/src/components/rich-text/format-toolbar-container.js +63 -14
  415. package/src/components/rich-text/index.js +1 -0
  416. package/src/components/rich-text/use-format-types.js +38 -17
  417. package/src/components/rich-text/use-input-rules.js +6 -15
  418. package/src/components/rich-text/use-paste-handler.js +17 -5
  419. package/src/components/url-popover/index.js +1 -0
  420. package/src/components/url-popover/test/__snapshots__/index.js.snap +3 -0
  421. package/src/components/writing-flow/use-arrow-nav.js +32 -1
  422. package/src/components/writing-flow/use-multi-selection.js +1 -48
  423. package/src/components/writing-flow/use-selection-observer.js +2 -3
  424. package/src/components/writing-flow/use-tab-nav.js +1 -1
  425. package/src/elements/index.js +8 -1
  426. package/src/elements/test/index.js +18 -0
  427. package/src/hooks/aria-label.js +67 -0
  428. package/src/hooks/color.js +10 -3
  429. package/src/hooks/duotone.js +18 -139
  430. package/src/hooks/index.js +2 -1
  431. package/src/hooks/layout.js +77 -29
  432. package/src/hooks/style.js +46 -39
  433. package/src/hooks/utils.js +7 -3
  434. package/src/index.js +1 -1
  435. package/src/layouts/flex.js +49 -43
  436. package/src/layouts/flow.js +35 -34
  437. package/src/layouts/test/flex.js +21 -0
  438. package/src/layouts/test/flow.js +21 -0
  439. package/src/layouts/test/utils.js +138 -0
  440. package/src/layouts/utils.js +44 -3
  441. package/src/store/actions.js +17 -31
  442. package/src/store/index.js +0 -4
  443. package/src/store/reducer.js +24 -11
  444. package/src/store/selectors.js +3 -4
  445. package/src/store/test/reducer.js +138 -10
  446. package/src/store/test/selectors.js +3 -6
  447. package/src/utils/selection.js +26 -0
  448. package/src/utils/test/selection.js +39 -0
  449. package/tsconfig.json +2 -1
@@ -6,7 +6,11 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { Button } from '@wordpress/components';
9
+ import {
10
+ Button,
11
+ __experimentalHStack as HStack,
12
+ __experimentalTruncate as Truncate,
13
+ } from '@wordpress/components';
10
14
  import { forwardRef } from '@wordpress/element';
11
15
  import { Icon, lock } from '@wordpress/icons';
12
16
  import { SPACE, ENTER } from '@wordpress/keycodes';
@@ -16,7 +20,7 @@ import { SPACE, ENTER } from '@wordpress/keycodes';
16
20
  */
17
21
  import BlockIcon from '../block-icon';
18
22
  import useBlockDisplayInformation from '../use-block-display-information';
19
- import BlockTitle from '../block-title';
23
+ import useBlockDisplayTitle from '../block-title/use-block-display-title';
20
24
  import ListViewExpander from './expander';
21
25
  import { useBlockLock } from '../block-lock';
22
26
 
@@ -35,6 +39,10 @@ function ListViewBlockSelectButton(
35
39
  ref
36
40
  ) {
37
41
  const blockInformation = useBlockDisplayInformation( clientId );
42
+ const blockTitle = useBlockDisplayTitle( {
43
+ clientId,
44
+ context: 'list-view',
45
+ } );
38
46
  const { isLocked } = useBlockLock( clientId );
39
47
 
40
48
  // The `href` attribute triggers the browser's native HTML drag operations.
@@ -72,19 +80,26 @@ function ListViewBlockSelectButton(
72
80
  >
73
81
  <ListViewExpander onClick={ onToggleExpanded } />
74
82
  <BlockIcon icon={ blockInformation?.icon } showColors />
75
- <span className="block-editor-list-view-block-select-button__title">
76
- <BlockTitle clientId={ clientId } maximumLength={ 35 } />
77
- </span>
78
- { blockInformation?.anchor && (
79
- <span className="block-editor-list-view-block-select-button__anchor">
80
- { blockInformation.anchor }
83
+ <HStack
84
+ alignment="center"
85
+ className="block-editor-list-view-block-select-button__label-wrapper"
86
+ justify="flex-start"
87
+ spacing={ 1 }
88
+ >
89
+ <span className="block-editor-list-view-block-select-button__title">
90
+ <Truncate ellipsizeMode="auto">{ blockTitle }</Truncate>
81
91
  </span>
82
- ) }
83
- { isLocked && (
84
- <span className="block-editor-list-view-block-select-button__lock">
85
- <Icon icon={ lock } />
86
- </span>
87
- ) }
92
+ { blockInformation?.anchor && (
93
+ <span className="block-editor-list-view-block-select-button__anchor">
94
+ { blockInformation.anchor }
95
+ </span>
96
+ ) }
97
+ { isLocked && (
98
+ <span className="block-editor-list-view-block-select-button__lock">
99
+ <Icon icon={ lock } />
100
+ </span>
101
+ ) }
102
+ </HStack>
88
103
  </Button>
89
104
  </>
90
105
  );
@@ -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
 
@@ -81,7 +81,7 @@ export default function ListViewDropIndicator( {
81
81
  left: rect.left + indent,
82
82
  right: rect.right,
83
83
  width: 0,
84
- height: rect.height,
84
+ height: 0,
85
85
  ownerDocument,
86
86
  };
87
87
 
@@ -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 (
@@ -328,6 +345,7 @@ export function MediaPlaceholder( {
328
345
  multiple={ multiple }
329
346
  onSelect={ onSelect }
330
347
  allowedTypes={ allowedTypes }
348
+ mode={ 'browse' }
331
349
  value={
332
350
  Array.isArray( value )
333
351
  ? value.map( ( { id } ) => id )
@@ -360,6 +378,7 @@ export function MediaPlaceholder( {
360
378
  </Button>
361
379
  { uploadMediaLibraryButton }
362
380
  { renderUrlSelectionUI() }
381
+ { renderFeaturedImageToggle() }
363
382
  { renderCancelLink() }
364
383
  </>
365
384
  );
@@ -388,6 +407,7 @@ export function MediaPlaceholder( {
388
407
  </FormFileUpload>
389
408
  { uploadMediaLibraryButton }
390
409
  { renderUrlSelectionUI() }
410
+ { renderFeaturedImageToggle() }
391
411
  { renderCancelLink() }
392
412
  </>
393
413
  );
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import { View, Text, TouchableWithoutFeedback } from 'react-native';
5
- import { uniqWith } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -23,12 +22,17 @@ import { Icon, plusCircleFilled } from '@wordpress/icons';
23
22
  */
24
23
  import styles from './styles.scss';
25
24
 
25
+ const isMediaEqual = ( media1, media2 ) =>
26
+ media1.id === media2.id || media1.url === media2.url;
27
+
26
28
  // Remove duplicates after gallery append.
27
29
  const dedupMedia = ( media ) =>
28
- uniqWith(
29
- media,
30
- ( media1, media2 ) =>
31
- media1.id === media2.id || media1.url === media2.url
30
+ media.reduce(
31
+ ( dedupedMedia, mediaItem ) =>
32
+ dedupedMedia.some( ( item ) => isMediaEqual( item, mediaItem ) )
33
+ ? dedupedMedia
34
+ : [ ...dedupedMedia, mediaItem ],
35
+ []
32
36
  );
33
37
 
34
38
  function MediaPlaceholder( props ) {
@@ -1,12 +1,7 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { uniqueId } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
9
- import { useState, useRef } from '@wordpress/element';
4
+ import { useRef } from '@wordpress/element';
10
5
  import { __ } from '@wordpress/i18n';
11
6
  import { speak } from '@wordpress/a11y';
12
7
  import {
@@ -38,6 +33,7 @@ import LinkControl from '../link-control';
38
33
  import { store as blockEditorStore } from '../../store';
39
34
 
40
35
  const noop = () => {};
36
+ let uniqueId = 0;
41
37
 
42
38
  const MediaReplaceFlow = ( {
43
39
  mediaURL,
@@ -59,14 +55,11 @@ const MediaReplaceFlow = ( {
59
55
  addToGallery,
60
56
  handleUpload = true,
61
57
  } ) => {
62
- const [ mediaURLValue, setMediaURLValue ] = useState( mediaURL );
63
58
  const mediaUpload = useSelect( ( select ) => {
64
59
  return select( blockEditorStore ).getSettings().mediaUpload;
65
60
  }, [] );
66
61
  const editMediaButtonRef = useRef();
67
- const errorNoticeID = uniqueId(
68
- 'block-editor/media-replace-flow/error-notice/'
69
- );
62
+ const errorNoticeID = `block-editor/media-replace-flow/error-notice/${ ++uniqueId }`;
70
63
 
71
64
  const onUploadError = ( message ) => {
72
65
  const safeMessage = stripHTML( message );
@@ -94,7 +87,6 @@ const MediaReplaceFlow = ( {
94
87
  onToggleFeaturedImage();
95
88
  }
96
89
  closeMenu();
97
- setMediaURLValue( media?.url );
98
90
  // Calling `onSelect` after the state update since it might unmount the component.
99
91
  onSelect( media );
100
92
  speak( __( 'The media file has been replaced' ) );
@@ -219,14 +211,13 @@ const MediaReplaceFlow = ( {
219
211
  { __( 'Current media URL:' ) }
220
212
  </span>
221
213
 
222
- <Tooltip text={ mediaURLValue } position="bottom">
214
+ <Tooltip text={ mediaURL } position="bottom">
223
215
  <div>
224
216
  <LinkControl
225
- value={ { url: mediaURLValue } }
217
+ value={ { url: mediaURL } }
226
218
  settings={ [] }
227
219
  showSuggestions={ false }
228
220
  onChange={ ( { url } ) => {
229
- setMediaURLValue( url );
230
221
  onSelectURL( url );
231
222
  editMediaButtonRef.current.focus();
232
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
 
@@ -64,6 +64,14 @@ If allowedTypes is unset all mime types should be allowed.
64
64
  - Required: No
65
65
  - Platform: Web | Mobile
66
66
 
67
+ ### mode
68
+
69
+ Value of Frame content default mode like 'browse', 'upload' etc.
70
+
71
+ - Type: `String`
72
+ - Required: No
73
+ - Default: false
74
+ - Platform: Web
67
75
  ### multiple
68
76
 
69
77
  Whether to allow multiple selections or not.
@@ -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 ] );
@@ -4,6 +4,7 @@
4
4
  import { DateTimePicker } from '@wordpress/components';
5
5
  import { __ } from '@wordpress/i18n';
6
6
  import { forwardRef } from '@wordpress/element';
7
+ import { __experimentalGetSettings as getSettings } from '@wordpress/date';
7
8
 
8
9
  /**
9
10
  * Internal dependencies
@@ -27,6 +28,7 @@ function PublishDateTimePicker(
27
28
  onClose={ onClose }
28
29
  />
29
30
  <DateTimePicker
31
+ startOfWeek={ getSettings().l10n.startOfWeek }
30
32
  __nextRemoveHelpButton
31
33
  __nextRemoveResetButton
32
34
  onChange={ onChange }
@@ -171,8 +171,10 @@ const renderDefaultControl = ( labelComponent, viewport ) => {
171
171
  An optional render function (prop) used to render the controls for the _responsive_ settings. If not provided, by default, responsive controls will be _automatically_ rendered using the component returned by the `renderDefaultControl` prop. For _complete_ control over the output of the responsive controls, you may return a component here and it will be rendered when the control group is in "responsive" mode.
172
172
 
173
173
  ```jsx
174
+ let uniqueId = 0;
175
+
174
176
  const renderResponsiveControls = ( viewports ) => {
175
- const inputId = uniqueId(); // lodash
177
+ const inputId = ++uniqueId;
176
178
 
177
179
  return viewports.map( ( { id, label } ) => {
178
180
  return (
@@ -3,7 +3,6 @@
3
3
  */
4
4
  import { render, unmountComponentAtNode } from 'react-dom';
5
5
  import { act, Simulate } from 'react-dom/test-utils';
6
- import { uniqueId } from 'lodash';
7
6
 
8
7
  /**
9
8
  * WordPress dependencies
@@ -31,7 +30,7 @@ afterEach( () => {
31
30
  container = null;
32
31
  } );
33
32
 
34
- const inputId = uniqueId();
33
+ const inputId = 'input-12345678';
35
34
 
36
35
  const sizeOptions = [
37
36
  {
@@ -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">
@@ -344,6 +344,7 @@ function RichTextWrapper(
344
344
  <FormatToolbarContainer
345
345
  inline={ inlineToolbar }
346
346
  anchorRef={ anchorRef }
347
+ value={ value }
347
348
  />
348
349
  ) }
349
350
  <TagName
@@ -1,12 +1,13 @@
1
1
  /**
2
- * WordPress dependencies
2
+ * External dependencies
3
3
  */
4
- import { useMemo } from '@wordpress/element';
5
- import { useSelect, useDispatch } from '@wordpress/data';
4
+ import { mapKeys } from 'lodash';
6
5
 
7
6
  /**
8
- * Internal dependencies
7
+ * WordPress dependencies
9
8
  */
9
+ import { useMemo } from '@wordpress/element';
10
+ import { useSelect, useDispatch } from '@wordpress/data';
10
11
  import { store as richTextStore } from '@wordpress/rich-text';
11
12
 
12
13
  function formatTypesSelector( select ) {
@@ -32,6 +33,21 @@ const interactiveContentTags = new Set( [
32
33
  'video',
33
34
  ] );
34
35
 
36
+ function prefixSelectKeys( selected, prefix ) {
37
+ if ( typeof selected !== 'object' ) return { [ prefix ]: selected };
38
+ return mapKeys( selected, ( value, key ) => `${ prefix }.${ key }` );
39
+ }
40
+
41
+ function getPrefixedSelectKeys( selected, prefix ) {
42
+ if ( selected[ prefix ] ) return selected[ prefix ];
43
+ return Object.keys( selected )
44
+ .filter( ( key ) => key.startsWith( prefix + '.' ) )
45
+ .reduce( ( accumulator, key ) => {
46
+ accumulator[ key.slice( prefix.length + 1 ) ] = selected[ key ];
47
+ return accumulator;
48
+ }, {} );
49
+ }
50
+
35
51
  /**
36
52
  * This hook provides RichText with the `formatTypes` and its derived props from
37
53
  * experimental format type settings.
@@ -68,18 +84,23 @@ export function useFormatTypes( {
68
84
  const keyedSelected = useSelect(
69
85
  ( select ) =>
70
86
  formatTypes.reduce( ( accumulator, type ) => {
71
- if ( type.__experimentalGetPropsForEditableTreePreparation ) {
72
- accumulator[ type.name ] =
87
+ if ( ! type.__experimentalGetPropsForEditableTreePreparation ) {
88
+ return accumulator;
89
+ }
90
+
91
+ return {
92
+ ...accumulator,
93
+ ...prefixSelectKeys(
73
94
  type.__experimentalGetPropsForEditableTreePreparation(
74
95
  select,
75
96
  {
76
97
  richTextIdentifier: identifier,
77
98
  blockClientId: clientId,
78
99
  }
79
- );
80
- }
81
-
82
- return accumulator;
100
+ ),
101
+ type.name
102
+ ),
103
+ };
83
104
  }, {} ),
84
105
  [ formatTypes, clientId, identifier ]
85
106
  );
@@ -89,11 +110,14 @@ export function useFormatTypes( {
89
110
  const changeHandlers = [];
90
111
  const dependencies = [];
91
112
 
113
+ for ( const key in keyedSelected ) {
114
+ dependencies.push( keyedSelected[ key ] );
115
+ }
116
+
92
117
  formatTypes.forEach( ( type ) => {
93
118
  if ( type.__experimentalCreatePrepareEditableTree ) {
94
- const selected = keyedSelected[ type.name ];
95
119
  const handler = type.__experimentalCreatePrepareEditableTree(
96
- selected,
120
+ getPrefixedSelectKeys( keyedSelected, type.name ),
97
121
  {
98
122
  richTextIdentifier: identifier,
99
123
  blockClientId: clientId,
@@ -105,10 +129,6 @@ export function useFormatTypes( {
105
129
  } else {
106
130
  prepareHandlers.push( handler );
107
131
  }
108
-
109
- for ( const key in selected ) {
110
- dependencies.push( selected[ key ] );
111
- }
112
132
  }
113
133
 
114
134
  if ( type.__experimentalCreateOnChangeEditableValue ) {
@@ -125,10 +145,11 @@ export function useFormatTypes( {
125
145
  );
126
146
  }
127
147
 
148
+ const selected = getPrefixedSelectKeys( keyedSelected, type.name );
128
149
  changeHandlers.push(
129
150
  type.__experimentalCreateOnChangeEditableValue(
130
151
  {
131
- ...( keyedSelected[ type.name ] || {} ),
152
+ ...( typeof selected === 'object' ? selected : {} ),
132
153
  ...dispatchers,
133
154
  },
134
155
  {