@wordpress/block-editor 10.4.0 → 11.0.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 (638) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +0 -1
  3. package/build/autocompleters/block.js +2 -6
  4. package/build/autocompleters/block.js.map +1 -1
  5. package/build/autocompleters/link.js +2 -0
  6. package/build/autocompleters/link.js.map +1 -1
  7. package/build/components/block-card/index.js +51 -3
  8. package/build/components/block-card/index.js.map +1 -1
  9. package/build/components/block-draggable/index.native.js +46 -39
  10. package/build/components/block-draggable/index.native.js.map +1 -1
  11. package/build/components/block-edit/edit.js +4 -3
  12. package/build/components/block-edit/edit.js.map +1 -1
  13. package/build/components/block-edit/edit.native.js +4 -7
  14. package/build/components/block-edit/edit.native.js.map +1 -1
  15. package/build/components/block-inspector/index.js +35 -33
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/block-list-context.native.js +5 -8
  18. package/build/components/block-list/block-list-context.native.js.map +1 -1
  19. package/build/components/block-list/block.js +55 -24
  20. package/build/components/block-list/block.js.map +1 -1
  21. package/build/components/block-list/block.native.js +61 -28
  22. package/build/components/block-list/block.native.js.map +1 -1
  23. package/build/components/block-lock/menu-item.js +1 -1
  24. package/build/components/block-lock/menu-item.js.map +1 -1
  25. package/build/components/block-lock/modal.js +16 -9
  26. package/build/components/block-lock/modal.js.map +1 -1
  27. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +12 -4
  28. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  29. package/build/components/block-pattern-setup/index.js +3 -2
  30. package/build/components/block-pattern-setup/index.js.map +1 -1
  31. package/build/components/block-patterns-list/index.js +33 -11
  32. package/build/components/block-patterns-list/index.js.map +1 -1
  33. package/build/components/block-preview/auto.js +9 -3
  34. package/build/components/block-preview/auto.js.map +1 -1
  35. package/build/components/block-preview/index.js +5 -9
  36. package/build/components/block-preview/index.js.map +1 -1
  37. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -2
  38. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  39. package/build/components/block-styles/utils.js +3 -3
  40. package/build/components/block-styles/utils.js.map +1 -1
  41. package/build/components/block-switcher/index.js +19 -4
  42. package/build/components/block-switcher/index.js.map +1 -1
  43. package/build/components/block-toolbar/index.js +5 -1
  44. package/build/components/block-toolbar/index.js.map +1 -1
  45. package/build/components/block-tools/insertion-point.js +8 -49
  46. package/build/components/block-tools/insertion-point.js.map +1 -1
  47. package/build/components/block-tools/selected-block-popover.js +27 -4
  48. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  49. package/build/components/block-variation-picker/index.js +1 -2
  50. package/build/components/block-variation-picker/index.js.map +1 -1
  51. package/build/components/colors/with-colors.js +4 -3
  52. package/build/components/colors/with-colors.js.map +1 -1
  53. package/build/components/font-sizes/fluid-utils.js +24 -40
  54. package/build/components/font-sizes/fluid-utils.js.map +1 -1
  55. package/build/components/font-sizes/with-font-sizes.js +7 -5
  56. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  57. package/build/components/height-control/index.js +115 -0
  58. package/build/components/height-control/index.js.map +1 -0
  59. package/build/components/iframe/index.js +11 -8
  60. package/build/components/iframe/index.js.map +1 -1
  61. package/build/components/image-editor/use-save-image.js +2 -0
  62. package/build/components/image-editor/use-save-image.js.map +1 -1
  63. package/build/components/image-editor/zoom-dropdown.js +1 -0
  64. package/build/components/image-editor/zoom-dropdown.js.map +1 -1
  65. package/build/components/index.js +18 -0
  66. package/build/components/index.js.map +1 -1
  67. package/build/components/inner-blocks/index.js +25 -9
  68. package/build/components/inner-blocks/index.js.map +1 -1
  69. package/build/components/inner-blocks/use-inner-block-template-sync.js +25 -10
  70. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  71. package/build/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  72. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  73. package/build/components/inserter/block-patterns-tab.js +25 -46
  74. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  75. package/build/components/inserter/block-types-tab.js +3 -1
  76. package/build/components/inserter/block-types-tab.js.map +1 -1
  77. package/build/components/inserter/hooks/use-debounced-input.js +27 -0
  78. package/build/components/inserter/hooks/use-debounced-input.js.map +1 -0
  79. package/build/components/inserter/index.js +8 -3
  80. package/build/components/inserter/index.js.map +1 -1
  81. package/build/components/inserter/index.native.js +3 -4
  82. package/build/components/inserter/index.native.js.map +1 -1
  83. package/build/components/inserter/media-tab/hooks.js +103 -0
  84. package/build/components/inserter/media-tab/hooks.js.map +1 -0
  85. package/build/components/inserter/media-tab/index.js +32 -0
  86. package/build/components/inserter/media-tab/index.js.map +1 -0
  87. package/build/components/inserter/media-tab/media-list.js +100 -0
  88. package/build/components/inserter/media-tab/media-list.js.map +1 -0
  89. package/build/components/inserter/media-tab/media-panel.js +96 -0
  90. package/build/components/inserter/media-tab/media-panel.js.map +1 -0
  91. package/build/components/inserter/media-tab/media-tab.js +120 -0
  92. package/build/components/inserter/media-tab/media-tab.js.map +1 -0
  93. package/build/components/inserter/media-tab/utils.js +54 -0
  94. package/build/components/inserter/media-tab/utils.js.map +1 -0
  95. package/build/components/inserter/menu.js +35 -12
  96. package/build/components/inserter/menu.js.map +1 -1
  97. package/build/components/inserter/mobile-tab-navigation.js +70 -0
  98. package/build/components/inserter/mobile-tab-navigation.js.map +1 -0
  99. package/build/components/inserter/quick-inserter.js +1 -0
  100. package/build/components/inserter/quick-inserter.js.map +1 -1
  101. package/build/components/inserter/reusable-blocks-tab.js +4 -1
  102. package/build/components/inserter/reusable-blocks-tab.js.map +1 -1
  103. package/build/components/inserter/search-results.js +3 -1
  104. package/build/components/inserter/search-results.js.map +1 -1
  105. package/build/components/inserter/tabs.js +16 -2
  106. package/build/components/inserter/tabs.js.map +1 -1
  107. package/build/components/inserter-list-item/index.js +4 -1
  108. package/build/components/inserter-list-item/index.js.map +1 -1
  109. package/build/components/inspector-controls/groups.js +2 -0
  110. package/build/components/inspector-controls/groups.js.map +1 -1
  111. package/build/components/inspector-controls-tabs/advanced-controls-panel.js +46 -0
  112. package/build/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  113. package/build/components/inspector-controls-tabs/index.js +71 -0
  114. package/build/components/inspector-controls-tabs/index.js.map +1 -0
  115. package/build/components/inspector-controls-tabs/settings-tab.js +28 -0
  116. package/build/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  117. package/build/components/inspector-controls-tabs/styles-tab.js +61 -0
  118. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  119. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +97 -0
  120. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  121. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +18 -0
  122. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  123. package/build/components/inspector-controls-tabs/utils.js +37 -0
  124. package/build/components/inspector-controls-tabs/utils.js.map +1 -0
  125. package/build/components/link-control/index.js +19 -34
  126. package/build/components/link-control/index.js.map +1 -1
  127. package/build/components/link-control/search-input.js +1 -2
  128. package/build/components/link-control/search-input.js.map +1 -1
  129. package/build/components/link-control/use-internal-input-value.js +26 -0
  130. package/build/components/link-control/use-internal-input-value.js.map +1 -0
  131. package/build/components/list-view/block.js +10 -5
  132. package/build/components/list-view/block.js.map +1 -1
  133. package/build/components/list-view/branch.js +22 -15
  134. package/build/components/list-view/branch.js.map +1 -1
  135. package/build/components/media-upload/index.native.js +2 -3
  136. package/build/components/media-upload/index.native.js.map +1 -1
  137. package/build/components/off-canvas-editor/appender.js +104 -0
  138. package/build/components/off-canvas-editor/appender.js.map +1 -0
  139. package/build/components/off-canvas-editor/block-contents.js +100 -0
  140. package/build/components/off-canvas-editor/block-contents.js.map +1 -0
  141. package/build/components/off-canvas-editor/block-edit-button.js +50 -0
  142. package/build/components/off-canvas-editor/block-edit-button.js.map +1 -0
  143. package/build/components/off-canvas-editor/block-select-button.js +119 -0
  144. package/build/components/off-canvas-editor/block-select-button.js.map +1 -0
  145. package/build/components/off-canvas-editor/block.js +324 -0
  146. package/build/components/off-canvas-editor/block.js.map +1 -0
  147. package/build/components/off-canvas-editor/branch.js +179 -0
  148. package/build/components/off-canvas-editor/branch.js.map +1 -0
  149. package/build/components/off-canvas-editor/context.js +19 -0
  150. package/build/components/off-canvas-editor/context.js.map +1 -0
  151. package/build/components/off-canvas-editor/drop-indicator.js +118 -0
  152. package/build/components/off-canvas-editor/drop-indicator.js.map +1 -0
  153. package/build/components/off-canvas-editor/expander.js +41 -0
  154. package/build/components/off-canvas-editor/expander.js.map +1 -0
  155. package/build/components/off-canvas-editor/index.js +213 -0
  156. package/build/components/off-canvas-editor/index.js.map +1 -0
  157. package/build/components/off-canvas-editor/leaf.js +60 -0
  158. package/build/components/off-canvas-editor/leaf.js.map +1 -0
  159. package/build/components/off-canvas-editor/link-ui.js +185 -0
  160. package/build/components/off-canvas-editor/link-ui.js.map +1 -0
  161. package/build/components/off-canvas-editor/update-attributes.js +108 -0
  162. package/build/components/off-canvas-editor/update-attributes.js.map +1 -0
  163. package/build/components/off-canvas-editor/use-block-selection.js +139 -0
  164. package/build/components/off-canvas-editor/use-block-selection.js.map +1 -0
  165. package/build/components/off-canvas-editor/use-list-view-client-ids.js +33 -0
  166. package/build/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  167. package/build/components/off-canvas-editor/use-list-view-drop-zone.js +235 -0
  168. package/build/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  169. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js +60 -0
  170. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  171. package/build/components/off-canvas-editor/utils.js +60 -0
  172. package/build/components/off-canvas-editor/utils.js.map +1 -0
  173. package/build/components/rich-text/format-toolbar/index.js +8 -4
  174. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  175. package/build/components/rich-text/index.js +3 -3
  176. package/build/components/rich-text/index.js.map +1 -1
  177. package/build/components/rich-text/index.native.js +0 -2
  178. package/build/components/rich-text/index.native.js.map +1 -1
  179. package/build/components/rich-text/use-insert-replacement-text.js +43 -0
  180. package/build/components/rich-text/use-insert-replacement-text.js.map +1 -0
  181. package/build/components/rich-text/use-undo-automatic-change.js +9 -1
  182. package/build/components/rich-text/use-undo-automatic-change.js.map +1 -1
  183. package/build/components/rich-text/utils.js +1 -19
  184. package/build/components/rich-text/utils.js.map +1 -1
  185. package/build/components/spacing-sizes-control/spacing-input-control.js +12 -3
  186. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  187. package/build/components/ungroup-button/index.native.js +4 -2
  188. package/build/components/ungroup-button/index.native.js.map +1 -1
  189. package/build/components/url-input/index.js +46 -43
  190. package/build/components/url-input/index.js.map +1 -1
  191. package/build/components/url-popover/index.js +31 -2
  192. package/build/components/url-popover/index.js.map +1 -1
  193. package/build/components/use-block-display-information/index.js +8 -4
  194. package/build/components/use-block-display-information/index.js.map +1 -1
  195. package/build/components/use-setting/index.js +10 -2
  196. package/build/components/use-setting/index.js.map +1 -1
  197. package/build/hooks/child-layout.js +209 -0
  198. package/build/hooks/child-layout.js.map +1 -0
  199. package/build/hooks/color-panel.js +17 -1
  200. package/build/hooks/color-panel.js.map +1 -1
  201. package/build/hooks/color.js +1 -1
  202. package/build/hooks/color.js.map +1 -1
  203. package/build/hooks/content-lock-ui.js +14 -7
  204. package/build/hooks/content-lock-ui.js.map +1 -1
  205. package/build/hooks/dimensions.js +65 -16
  206. package/build/hooks/dimensions.js.map +1 -1
  207. package/build/hooks/layout.js +59 -3
  208. package/build/hooks/layout.js.map +1 -1
  209. package/build/hooks/margin.js +4 -2
  210. package/build/hooks/margin.js.map +1 -1
  211. package/build/hooks/min-height.js +139 -0
  212. package/build/hooks/min-height.js.map +1 -0
  213. package/build/hooks/padding.js +4 -2
  214. package/build/hooks/padding.js.map +1 -1
  215. package/build/hooks/style.js +3 -2
  216. package/build/hooks/style.js.map +1 -1
  217. package/build/layouts/flex.js +22 -21
  218. package/build/layouts/flex.js.map +1 -1
  219. package/build/store/actions.js +26 -0
  220. package/build/store/actions.js.map +1 -1
  221. package/build/store/reducer.js +420 -265
  222. package/build/store/reducer.js.map +1 -1
  223. package/build/store/selectors.js +73 -49
  224. package/build/store/selectors.js.map +1 -1
  225. package/build/utils/sorting.js +63 -0
  226. package/build/utils/sorting.js.map +1 -0
  227. package/build-module/autocompleters/block.js +2 -6
  228. package/build-module/autocompleters/block.js.map +1 -1
  229. package/build-module/autocompleters/link.js +2 -0
  230. package/build-module/autocompleters/link.js.map +1 -1
  231. package/build-module/components/block-card/index.js +45 -3
  232. package/build-module/components/block-card/index.js.map +1 -1
  233. package/build-module/components/block-draggable/index.native.js +40 -31
  234. package/build-module/components/block-draggable/index.native.js.map +1 -1
  235. package/build-module/components/block-edit/edit.js +4 -2
  236. package/build-module/components/block-edit/edit.js.map +1 -1
  237. package/build-module/components/block-edit/edit.native.js +4 -6
  238. package/build-module/components/block-edit/edit.native.js.map +1 -1
  239. package/build-module/components/block-inspector/index.js +32 -30
  240. package/build-module/components/block-inspector/index.js.map +1 -1
  241. package/build-module/components/block-list/block-list-context.native.js +5 -8
  242. package/build-module/components/block-list/block-list-context.native.js.map +1 -1
  243. package/build-module/components/block-list/block.js +55 -25
  244. package/build-module/components/block-list/block.js.map +1 -1
  245. package/build-module/components/block-list/block.native.js +61 -28
  246. package/build-module/components/block-list/block.native.js.map +1 -1
  247. package/build-module/components/block-lock/menu-item.js +2 -2
  248. package/build-module/components/block-lock/menu-item.js.map +1 -1
  249. package/build-module/components/block-lock/modal.js +17 -10
  250. package/build-module/components/block-lock/modal.js.map +1 -1
  251. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +13 -6
  252. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  253. package/build-module/components/block-pattern-setup/index.js +3 -2
  254. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  255. package/build-module/components/block-patterns-list/index.js +35 -13
  256. package/build-module/components/block-patterns-list/index.js.map +1 -1
  257. package/build-module/components/block-preview/auto.js +9 -3
  258. package/build-module/components/block-preview/auto.js.map +1 -1
  259. package/build-module/components/block-preview/index.js +5 -8
  260. package/build-module/components/block-preview/index.js.map +1 -1
  261. package/build-module/components/block-settings-menu/block-settings-dropdown.js +5 -2
  262. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  263. package/build-module/components/block-styles/utils.js +3 -3
  264. package/build-module/components/block-styles/utils.js.map +1 -1
  265. package/build-module/components/block-switcher/index.js +19 -4
  266. package/build-module/components/block-switcher/index.js.map +1 -1
  267. package/build-module/components/block-toolbar/index.js +6 -2
  268. package/build-module/components/block-toolbar/index.js.map +1 -1
  269. package/build-module/components/block-tools/insertion-point.js +8 -49
  270. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  271. package/build-module/components/block-tools/selected-block-popover.js +27 -5
  272. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  273. package/build-module/components/block-variation-picker/index.js +1 -2
  274. package/build-module/components/block-variation-picker/index.js.map +1 -1
  275. package/build-module/components/colors/with-colors.js +5 -4
  276. package/build-module/components/colors/with-colors.js.map +1 -1
  277. package/build-module/components/font-sizes/fluid-utils.js +24 -40
  278. package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
  279. package/build-module/components/font-sizes/with-font-sizes.js +8 -6
  280. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  281. package/build-module/components/height-control/index.js +103 -0
  282. package/build-module/components/height-control/index.js.map +1 -0
  283. package/build-module/components/iframe/index.js +11 -8
  284. package/build-module/components/iframe/index.js.map +1 -1
  285. package/build-module/components/image-editor/use-save-image.js +2 -0
  286. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  287. package/build-module/components/image-editor/zoom-dropdown.js +1 -0
  288. package/build-module/components/image-editor/zoom-dropdown.js.map +1 -1
  289. package/build-module/components/index.js +2 -0
  290. package/build-module/components/index.js.map +1 -1
  291. package/build-module/components/inner-blocks/index.js +27 -11
  292. package/build-module/components/inner-blocks/index.js.map +1 -1
  293. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +23 -10
  294. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  295. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  296. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  297. package/build-module/components/inserter/block-patterns-tab.js +27 -49
  298. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  299. package/build-module/components/inserter/block-types-tab.js +3 -2
  300. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  301. package/build-module/components/inserter/hooks/use-debounced-input.js +18 -0
  302. package/build-module/components/inserter/hooks/use-debounced-input.js.map +1 -0
  303. package/build-module/components/inserter/index.js +8 -3
  304. package/build-module/components/inserter/index.js.map +1 -1
  305. package/build-module/components/inserter/index.native.js +3 -5
  306. package/build-module/components/inserter/index.native.js.map +1 -1
  307. package/build-module/components/inserter/media-tab/hooks.js +89 -0
  308. package/build-module/components/inserter/media-tab/hooks.js.map +1 -0
  309. package/build-module/components/inserter/media-tab/index.js +4 -0
  310. package/build-module/components/inserter/media-tab/index.js.map +1 -0
  311. package/build-module/components/inserter/media-tab/media-list.js +86 -0
  312. package/build-module/components/inserter/media-tab/media-list.js.map +1 -0
  313. package/build-module/components/inserter/media-tab/media-panel.js +77 -0
  314. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -0
  315. package/build-module/components/inserter/media-tab/media-tab.js +100 -0
  316. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -0
  317. package/build-module/components/inserter/media-tab/utils.js +45 -0
  318. package/build-module/components/inserter/media-tab/utils.js.map +1 -0
  319. package/build-module/components/inserter/menu.js +33 -12
  320. package/build-module/components/inserter/menu.js.map +1 -1
  321. package/build-module/components/inserter/mobile-tab-navigation.js +61 -0
  322. package/build-module/components/inserter/mobile-tab-navigation.js.map +1 -0
  323. package/build-module/components/inserter/quick-inserter.js +1 -0
  324. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  325. package/build-module/components/inserter/reusable-blocks-tab.js +3 -1
  326. package/build-module/components/inserter/reusable-blocks-tab.js.map +1 -1
  327. package/build-module/components/inserter/search-results.js +3 -2
  328. package/build-module/components/inserter/search-results.js.map +1 -1
  329. package/build-module/components/inserter/tabs.js +15 -2
  330. package/build-module/components/inserter/tabs.js.map +1 -1
  331. package/build-module/components/inserter-list-item/index.js +5 -2
  332. package/build-module/components/inserter-list-item/index.js.map +1 -1
  333. package/build-module/components/inspector-controls/groups.js +2 -0
  334. package/build-module/components/inspector-controls/groups.js.map +1 -1
  335. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js +32 -0
  336. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  337. package/build-module/components/inspector-controls-tabs/index.js +56 -0
  338. package/build-module/components/inspector-controls-tabs/index.js.map +1 -0
  339. package/build-module/components/inspector-controls-tabs/settings-tab.js +17 -0
  340. package/build-module/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  341. package/build-module/components/inspector-controls-tabs/styles-tab.js +46 -0
  342. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  343. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +81 -0
  344. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  345. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +8 -0
  346. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  347. package/build-module/components/inspector-controls-tabs/utils.js +26 -0
  348. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -0
  349. package/build-module/components/link-control/index.js +18 -34
  350. package/build-module/components/link-control/index.js.map +1 -1
  351. package/build-module/components/link-control/search-input.js +1 -2
  352. package/build-module/components/link-control/search-input.js.map +1 -1
  353. package/build-module/components/link-control/use-internal-input-value.js +18 -0
  354. package/build-module/components/link-control/use-internal-input-value.js.map +1 -0
  355. package/build-module/components/list-view/block.js +10 -5
  356. package/build-module/components/list-view/block.js.map +1 -1
  357. package/build-module/components/list-view/branch.js +21 -14
  358. package/build-module/components/list-view/branch.js.map +1 -1
  359. package/build-module/components/media-upload/index.native.js +2 -4
  360. package/build-module/components/media-upload/index.native.js.map +1 -1
  361. package/build-module/components/off-canvas-editor/appender.js +89 -0
  362. package/build-module/components/off-canvas-editor/appender.js.map +1 -0
  363. package/build-module/components/off-canvas-editor/block-contents.js +85 -0
  364. package/build-module/components/off-canvas-editor/block-contents.js.map +1 -0
  365. package/build-module/components/off-canvas-editor/block-edit-button.js +35 -0
  366. package/build-module/components/off-canvas-editor/block-edit-button.js.map +1 -0
  367. package/build-module/components/off-canvas-editor/block-select-button.js +101 -0
  368. package/build-module/components/off-canvas-editor/block-select-button.js.map +1 -0
  369. package/build-module/components/off-canvas-editor/block.js +298 -0
  370. package/build-module/components/off-canvas-editor/block.js.map +1 -0
  371. package/build-module/components/off-canvas-editor/branch.js +164 -0
  372. package/build-module/components/off-canvas-editor/branch.js.map +1 -0
  373. package/build-module/components/off-canvas-editor/context.js +7 -0
  374. package/build-module/components/off-canvas-editor/context.js.map +1 -0
  375. package/build-module/components/off-canvas-editor/drop-indicator.js +111 -0
  376. package/build-module/components/off-canvas-editor/drop-indicator.js.map +1 -0
  377. package/build-module/components/off-canvas-editor/expander.js +32 -0
  378. package/build-module/components/off-canvas-editor/expander.js.map +1 -0
  379. package/build-module/components/off-canvas-editor/index.js +189 -0
  380. package/build-module/components/off-canvas-editor/index.js.map +1 -0
  381. package/build-module/components/off-canvas-editor/leaf.js +45 -0
  382. package/build-module/components/off-canvas-editor/leaf.js.map +1 -0
  383. package/build-module/components/off-canvas-editor/link-ui.js +165 -0
  384. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -0
  385. package/build-module/components/off-canvas-editor/update-attributes.js +97 -0
  386. package/build-module/components/off-canvas-editor/update-attributes.js.map +1 -0
  387. package/build-module/components/off-canvas-editor/use-block-selection.js +124 -0
  388. package/build-module/components/off-canvas-editor/use-block-selection.js.map +1 -0
  389. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js +24 -0
  390. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  391. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js +220 -0
  392. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  393. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js +50 -0
  394. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  395. package/build-module/components/off-canvas-editor/utils.js +44 -0
  396. package/build-module/components/off-canvas-editor/utils.js.map +1 -0
  397. package/build-module/components/rich-text/format-toolbar/index.js +6 -2
  398. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  399. package/build-module/components/rich-text/index.js +2 -3
  400. package/build-module/components/rich-text/index.js.map +1 -1
  401. package/build-module/components/rich-text/index.native.js +0 -2
  402. package/build-module/components/rich-text/index.native.js.map +1 -1
  403. package/build-module/components/rich-text/use-insert-replacement-text.js +33 -0
  404. package/build-module/components/rich-text/use-insert-replacement-text.js.map +1 -0
  405. package/build-module/components/rich-text/use-undo-automatic-change.js +9 -1
  406. package/build-module/components/rich-text/use-undo-automatic-change.js.map +1 -1
  407. package/build-module/components/rich-text/utils.js +1 -16
  408. package/build-module/components/rich-text/utils.js.map +1 -1
  409. package/build-module/components/spacing-sizes-control/spacing-input-control.js +12 -3
  410. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  411. package/build-module/components/ungroup-button/index.native.js +3 -2
  412. package/build-module/components/ungroup-button/index.native.js.map +1 -1
  413. package/build-module/components/url-input/index.js +46 -43
  414. package/build-module/components/url-input/index.js.map +1 -1
  415. package/build-module/components/url-popover/index.js +30 -3
  416. package/build-module/components/url-popover/index.js.map +1 -1
  417. package/build-module/components/use-block-display-information/index.js +9 -5
  418. package/build-module/components/use-block-display-information/index.js.map +1 -1
  419. package/build-module/components/use-setting/index.js +9 -2
  420. package/build-module/components/use-setting/index.js.map +1 -1
  421. package/build-module/hooks/child-layout.js +189 -0
  422. package/build-module/hooks/child-layout.js.map +1 -0
  423. package/build-module/hooks/color-panel.js +17 -1
  424. package/build-module/hooks/color-panel.js.map +1 -1
  425. package/build-module/hooks/color.js +1 -1
  426. package/build-module/hooks/color.js.map +1 -1
  427. package/build-module/hooks/content-lock-ui.js +16 -9
  428. package/build-module/hooks/content-lock-ui.js.map +1 -1
  429. package/build-module/hooks/dimensions.js +60 -16
  430. package/build-module/hooks/dimensions.js.map +1 -1
  431. package/build-module/hooks/layout.js +57 -2
  432. package/build-module/hooks/layout.js.map +1 -1
  433. package/build-module/hooks/margin.js +4 -2
  434. package/build-module/hooks/margin.js.map +1 -1
  435. package/build-module/hooks/min-height.js +116 -0
  436. package/build-module/hooks/min-height.js.map +1 -0
  437. package/build-module/hooks/padding.js +4 -2
  438. package/build-module/hooks/padding.js.map +1 -1
  439. package/build-module/hooks/style.js +4 -3
  440. package/build-module/hooks/style.js.map +1 -1
  441. package/build-module/layouts/flex.js +23 -22
  442. package/build-module/layouts/flex.js.map +1 -1
  443. package/build-module/store/actions.js +22 -0
  444. package/build-module/store/actions.js.map +1 -1
  445. package/build-module/store/reducer.js +415 -265
  446. package/build-module/store/reducer.js.map +1 -1
  447. package/build-module/store/selectors.js +66 -48
  448. package/build-module/store/selectors.js.map +1 -1
  449. package/build-module/utils/sorting.js +56 -0
  450. package/build-module/utils/sorting.js.map +1 -0
  451. package/build-style/content-rtl.css +701 -0
  452. package/build-style/content.css +701 -0
  453. package/build-style/default-editor-styles-rtl.css +14 -0
  454. package/build-style/default-editor-styles.css +14 -0
  455. package/build-style/style-rtl.css +305 -668
  456. package/build-style/style.css +305 -668
  457. package/package.json +32 -30
  458. package/src/autocompleters/block.js +2 -6
  459. package/src/autocompleters/link.js +2 -0
  460. package/src/components/alignment-control/README.md +1 -1
  461. package/src/components/alignment-control/test/index.js +4 -1
  462. package/src/components/block-alignment-control/test/index.js +4 -1
  463. package/src/components/block-alignment-control/test/index.native.js +4 -4
  464. package/src/components/block-card/index.js +46 -2
  465. package/src/components/block-card/style.scss +4 -0
  466. package/src/components/block-content-overlay/{style.scss → content.scss} +7 -1
  467. package/src/components/block-draggable/content.scss +20 -0
  468. package/src/components/block-draggable/index.native.js +54 -40
  469. package/src/components/block-draggable/style.scss +0 -21
  470. package/src/components/block-draggable/test/helpers.native.js +7 -9
  471. package/src/components/block-draggable/test/index.native.js +35 -45
  472. package/src/components/block-edit/edit.js +5 -2
  473. package/src/components/block-edit/edit.native.js +5 -6
  474. package/src/components/block-inspector/index.js +96 -81
  475. package/src/components/block-inspector/style.scss +9 -1
  476. package/src/components/block-list/block-list-context.native.js +5 -8
  477. package/src/components/block-list/block.js +74 -23
  478. package/src/components/block-list/block.native.js +78 -23
  479. package/src/components/block-list/{style.scss → content.scss} +11 -20
  480. package/src/components/block-list-appender/{style.scss → content.scss} +0 -0
  481. package/src/components/block-lock/menu-item.js +5 -2
  482. package/src/components/block-lock/modal.js +19 -36
  483. package/src/components/block-lock/style.scss +8 -17
  484. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +24 -6
  485. package/src/components/block-mover/style.scss +0 -1
  486. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +0 -2
  487. package/src/components/block-pattern-setup/index.js +2 -1
  488. package/src/components/block-patterns-list/index.js +47 -24
  489. package/src/components/block-popover/style.scss +1 -1
  490. package/src/components/block-preview/README.md +15 -10
  491. package/src/components/block-preview/auto.js +7 -1
  492. package/src/components/block-preview/content.scss +4 -0
  493. package/src/components/block-preview/index.js +7 -12
  494. package/src/components/block-preview/style.scss +0 -7
  495. package/src/components/block-preview/test/index.js +18 -35
  496. package/src/components/block-selection-clearer/test/index.js +12 -12
  497. package/src/components/block-settings-menu/block-settings-dropdown.js +32 -20
  498. package/src/components/block-styles/utils.js +3 -3
  499. package/src/components/block-switcher/index.js +19 -4
  500. package/src/components/block-switcher/test/index.js +4 -0
  501. package/src/components/block-toolbar/index.js +12 -5
  502. package/src/components/block-toolbar/style.scss +10 -0
  503. package/src/components/block-tools/insertion-point.js +3 -47
  504. package/src/components/block-tools/selected-block-popover.js +80 -34
  505. package/src/components/block-tools/style.scss +27 -5
  506. package/src/components/block-variation-picker/index.js +1 -4
  507. package/src/components/block-vertical-alignment-control/test/index.js +4 -1
  508. package/src/components/colors/with-colors.js +13 -23
  509. package/src/components/default-block-appender/{style.scss → content.scss} +1 -0
  510. package/src/components/font-sizes/fluid-utils.js +37 -64
  511. package/src/components/font-sizes/test/fluid-utils.js +5 -5
  512. package/src/components/font-sizes/with-font-sizes.js +14 -11
  513. package/src/components/height-control/index.js +123 -0
  514. package/src/components/height-control/stories/index.js +21 -0
  515. package/src/components/height-control/style.scss +5 -0
  516. package/src/components/iframe/index.js +25 -18
  517. package/src/components/image-editor/use-save-image.js +2 -0
  518. package/src/components/image-editor/zoom-dropdown.js +1 -0
  519. package/src/components/index.js +2 -0
  520. package/src/components/inner-blocks/{style.scss → content.scss} +0 -0
  521. package/src/components/inner-blocks/index.js +30 -10
  522. package/src/components/inner-blocks/use-inner-block-template-sync.js +28 -10
  523. package/src/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  524. package/src/components/inserter/block-patterns-tab.js +28 -71
  525. package/src/components/inserter/block-types-tab.js +3 -2
  526. package/src/components/inserter/hooks/use-debounced-input.js +17 -0
  527. package/src/components/inserter/index.js +10 -2
  528. package/src/components/inserter/index.native.js +1 -1
  529. package/src/components/inserter/media-tab/hooks.js +88 -0
  530. package/src/components/inserter/media-tab/index.js +3 -0
  531. package/src/components/inserter/media-tab/media-list.js +93 -0
  532. package/src/components/inserter/media-tab/media-panel.js +83 -0
  533. package/src/components/inserter/media-tab/media-tab.js +135 -0
  534. package/src/components/inserter/media-tab/utils.js +37 -0
  535. package/src/components/inserter/menu.js +55 -13
  536. package/src/components/inserter/mobile-tab-navigation.js +85 -0
  537. package/src/components/inserter/quick-inserter.js +1 -0
  538. package/src/components/inserter/reusable-blocks-tab.js +4 -2
  539. package/src/components/inserter/search-results.js +3 -2
  540. package/src/components/inserter/stories/index.js +1 -1
  541. package/src/components/inserter/stories/{fixtures.js → utils/fixtures.js} +0 -0
  542. package/src/components/inserter/style.scss +184 -18
  543. package/src/components/inserter/tabs.js +12 -1
  544. package/src/components/inserter/test/reusable-blocks-tab.js +14 -57
  545. package/src/components/inserter-list-item/index.js +11 -1
  546. package/src/components/inserter-list-item/style.scss +26 -0
  547. package/src/components/inspector-controls/groups.js +2 -0
  548. package/src/components/inspector-controls-tabs/advanced-controls-panel.js +37 -0
  549. package/src/components/inspector-controls-tabs/index.js +62 -0
  550. package/src/components/inspector-controls-tabs/settings-tab.js +18 -0
  551. package/src/components/inspector-controls-tabs/styles-tab.js +51 -0
  552. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +89 -0
  553. package/src/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +9 -0
  554. package/src/components/inspector-controls-tabs/utils.js +28 -0
  555. package/src/components/line-height-control/test/index.js +5 -5
  556. package/src/components/link-control/README.md +1 -1
  557. package/src/components/link-control/index.js +24 -39
  558. package/src/components/link-control/search-input.js +1 -2
  559. package/src/components/link-control/test/index.js +400 -582
  560. package/src/components/link-control/use-internal-input-value.js +22 -0
  561. package/src/components/list-view/block.js +7 -3
  562. package/src/components/list-view/branch.js +21 -14
  563. package/src/components/list-view/style.scss +20 -9
  564. package/src/components/media-placeholder/{style.scss → content.scss} +0 -0
  565. package/src/components/media-replace-flow/test/index.js +37 -9
  566. package/src/components/media-upload/test/index.native.js +2 -0
  567. package/src/components/off-canvas-editor/README.md +5 -0
  568. package/src/components/off-canvas-editor/appender.js +93 -0
  569. package/src/components/off-canvas-editor/block-contents.js +89 -0
  570. package/src/components/off-canvas-editor/block-edit-button.js +27 -0
  571. package/src/components/off-canvas-editor/block-select-button.js +113 -0
  572. package/src/components/off-canvas-editor/block.js +401 -0
  573. package/src/components/off-canvas-editor/branch.js +208 -0
  574. package/src/components/off-canvas-editor/context.js +8 -0
  575. package/src/components/off-canvas-editor/drop-indicator.js +126 -0
  576. package/src/components/off-canvas-editor/expander.js +26 -0
  577. package/src/components/off-canvas-editor/index.js +242 -0
  578. package/src/components/off-canvas-editor/leaf.js +52 -0
  579. package/src/components/off-canvas-editor/link-ui.js +166 -0
  580. package/src/components/off-canvas-editor/style.scss +26 -0
  581. package/src/components/off-canvas-editor/test/utils.js +50 -0
  582. package/src/components/off-canvas-editor/update-attributes.js +99 -0
  583. package/src/components/off-canvas-editor/use-block-selection.js +169 -0
  584. package/src/components/off-canvas-editor/use-list-view-client-ids.js +29 -0
  585. package/src/components/off-canvas-editor/use-list-view-drop-zone.js +260 -0
  586. package/src/components/off-canvas-editor/use-list-view-expand-selected-item.js +58 -0
  587. package/src/components/off-canvas-editor/utils.js +58 -0
  588. package/src/components/plain-text/{style.scss → content.scss} +0 -0
  589. package/src/components/recursion-provider/test/index.js +27 -29
  590. package/src/components/responsive-block-control/test/index.js +69 -92
  591. package/src/components/rich-text/content.scss +42 -0
  592. package/src/components/rich-text/format-toolbar/index.js +6 -4
  593. package/src/components/rich-text/index.js +2 -2
  594. package/src/components/rich-text/index.native.js +0 -2
  595. package/src/components/rich-text/style.scss +0 -43
  596. package/src/components/rich-text/use-insert-replacement-text.js +31 -0
  597. package/src/components/rich-text/use-undo-automatic-change.js +7 -1
  598. package/src/components/rich-text/utils.js +2 -21
  599. package/src/components/spacing-sizes-control/spacing-input-control.js +9 -0
  600. package/src/components/ungroup-button/index.native.js +6 -2
  601. package/src/components/url-input/index.js +57 -73
  602. package/src/components/url-popover/README.md +12 -3
  603. package/src/components/url-popover/index.js +33 -3
  604. package/src/components/url-popover/test/__snapshots__/index.js.snap +8 -6
  605. package/src/components/url-popover/test/index.js +21 -9
  606. package/src/components/use-block-display-information/index.js +14 -5
  607. package/src/components/use-setting/index.js +20 -2
  608. package/src/components/use-setting/test/index.js +99 -0
  609. package/src/content.scss +10 -0
  610. package/src/hooks/child-layout.js +190 -0
  611. package/src/hooks/color-panel.js +13 -1
  612. package/src/hooks/color.js +2 -0
  613. package/src/hooks/content-lock-ui.js +47 -35
  614. package/src/hooks/dimensions.js +119 -21
  615. package/src/hooks/layout.js +62 -3
  616. package/src/hooks/margin.js +4 -3
  617. package/src/hooks/min-height.js +104 -0
  618. package/src/hooks/padding.js +4 -3
  619. package/src/hooks/style.js +10 -2
  620. package/src/hooks/test/style.js +4 -0
  621. package/src/hooks/test/use-typography-props.js +1 -1
  622. package/src/layouts/flex.js +43 -38
  623. package/src/store/actions.js +22 -0
  624. package/src/store/reducer.js +480 -434
  625. package/src/store/selectors.js +70 -64
  626. package/src/store/test/actions.js +18 -0
  627. package/src/store/test/performance.js +71 -0
  628. package/src/store/test/reducer.js +662 -490
  629. package/src/store/test/selectors.js +1839 -1306
  630. package/src/style.scss +4 -7
  631. package/src/utils/sorting.js +54 -0
  632. package/src/utils/test/sorting.js +49 -0
  633. package/tsconfig.tsbuildinfo +1 -1
  634. package/build/components/block-preview/live.js +0 -30
  635. package/build/components/block-preview/live.js.map +0 -1
  636. package/build-module/components/block-preview/live.js +0 -20
  637. package/build-module/components/block-preview/live.js.map +0 -1
  638. package/src/components/block-preview/live.js +0 -19
@@ -260,6 +260,7 @@ export default compose( [
260
260
  allowedBlockType,
261
261
  directInsertBlock,
262
262
  onSelectOrClose,
263
+ selectBlockOnInsert,
263
264
  } = ownProps;
264
265
 
265
266
  if ( ! hasSingleBlockType && ! directInsertBlock ) {
@@ -370,10 +371,17 @@ export default compose( [
370
371
  blockToInsert = createBlock( allowedBlockType.name );
371
372
  }
372
373
 
373
- insertBlock( blockToInsert, getInsertionIndex(), rootClientId );
374
+ insertBlock(
375
+ blockToInsert,
376
+ getInsertionIndex(),
377
+ rootClientId,
378
+ selectBlockOnInsert
379
+ );
374
380
 
375
381
  if ( onSelectOrClose ) {
376
- onSelectOrClose();
382
+ onSelectOrClose( {
383
+ insertedBlockId: blockToInsert?.clientId,
384
+ } );
377
385
  }
378
386
 
379
387
  const message = sprintf(
@@ -216,7 +216,7 @@ export class Inserter extends Component {
216
216
  }
217
217
 
218
218
  onInserterToggledAnnouncement( isOpen ) {
219
- AccessibilityInfo.isScreenReaderEnabled().done( ( isEnabled ) => {
219
+ AccessibilityInfo.isScreenReaderEnabled().then( ( isEnabled ) => {
220
220
  if ( isEnabled ) {
221
221
  const isIOS = Platform.OS === 'ios';
222
222
  const announcement = isOpen
@@ -0,0 +1,88 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useEffect, useState } from '@wordpress/element';
6
+ import { useSelect } from '@wordpress/data';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import { store as blockEditorStore } from '../../../store';
12
+
13
+ export function useMediaResults( options = {} ) {
14
+ const [ results, setResults ] = useState();
15
+ const settings = useSelect(
16
+ ( select ) => select( blockEditorStore ).getSettings(),
17
+ []
18
+ );
19
+ useEffect( () => {
20
+ ( async () => {
21
+ setResults();
22
+ const _media = await settings?.__unstableFetchMedia( options );
23
+ if ( _media ) setResults( _media );
24
+ } )();
25
+ }, Object.values( options ) );
26
+ return results;
27
+ }
28
+
29
+ const MEDIA_CATEGORIES = [
30
+ { label: __( 'Images' ), name: 'images', mediaType: 'image' },
31
+ { label: __( 'Videos' ), name: 'videos', mediaType: 'video' },
32
+ { label: __( 'Audio' ), name: 'audio', mediaType: 'audio' },
33
+ ];
34
+ export function useMediaCategories( rootClientId ) {
35
+ const [ categories, setCategories ] = useState( [] );
36
+ const { canInsertImage, canInsertVideo, canInsertAudio, fetchMedia } =
37
+ useSelect(
38
+ ( select ) => {
39
+ const { canInsertBlockType, getSettings } =
40
+ select( blockEditorStore );
41
+ return {
42
+ fetchMedia: getSettings().__unstableFetchMedia,
43
+ canInsertImage: canInsertBlockType(
44
+ 'core/image',
45
+ rootClientId
46
+ ),
47
+ canInsertVideo: canInsertBlockType(
48
+ 'core/video',
49
+ rootClientId
50
+ ),
51
+ canInsertAudio: canInsertBlockType(
52
+ 'core/audio',
53
+ rootClientId
54
+ ),
55
+ };
56
+ },
57
+ [ rootClientId ]
58
+ );
59
+ useEffect( () => {
60
+ ( async () => {
61
+ // If `__unstableFetchMedia` is not defined in block
62
+ // editor settings, do not set any media categories.
63
+ if ( ! fetchMedia ) return;
64
+ const query = {
65
+ context: 'view',
66
+ per_page: 1,
67
+ _fields: [ 'id' ],
68
+ };
69
+ const [ image, video, audio ] = await Promise.all( [
70
+ fetchMedia( { ...query, media_type: 'image' } ),
71
+ fetchMedia( { ...query, media_type: 'video' } ),
72
+ fetchMedia( { ...query, media_type: 'audio' } ),
73
+ ] );
74
+ const showImage = canInsertImage && !! image.length;
75
+ const showVideo = canInsertVideo && !! video.length;
76
+ const showAudio = canInsertAudio && !! audio.length;
77
+ setCategories(
78
+ MEDIA_CATEGORIES.filter(
79
+ ( { mediaType } ) =>
80
+ ( mediaType === 'image' && showImage ) ||
81
+ ( mediaType === 'video' && showVideo ) ||
82
+ ( mediaType === 'audio' && showAudio )
83
+ )
84
+ );
85
+ } )();
86
+ }, [ canInsertImage, canInsertVideo, canInsertAudio, fetchMedia ] );
87
+ return categories;
88
+ }
@@ -0,0 +1,3 @@
1
+ export { default as MediaTab } from './media-tab';
2
+ export { MediaCategoryDialog } from './media-panel';
3
+ export { useMediaCategories } from './hooks';
@@ -0,0 +1,93 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __unstableComposite as Composite,
6
+ __unstableUseCompositeState as useCompositeState,
7
+ __unstableCompositeItem as CompositeItem,
8
+ Tooltip,
9
+ } from '@wordpress/components';
10
+ import { __ } from '@wordpress/i18n';
11
+ import { useMemo, useCallback } from '@wordpress/element';
12
+ import { cloneBlock } from '@wordpress/blocks';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import InserterDraggableBlocks from '../../inserter-draggable-blocks';
18
+ import { getBlockAndPreviewFromMedia } from './utils';
19
+
20
+ function MediaPreview( { media, onClick, composite, mediaType } ) {
21
+ const [ block, preview ] = useMemo(
22
+ () => getBlockAndPreviewFromMedia( media, mediaType ),
23
+ [ media, mediaType ]
24
+ );
25
+ const title = media.title?.rendered || media.title;
26
+ const baseCssClass = 'block-editor-inserter__media-list';
27
+ return (
28
+ <InserterDraggableBlocks isEnabled={ true } blocks={ [ block ] }>
29
+ { ( { draggable, onDragStart, onDragEnd } ) => (
30
+ <div
31
+ className={ `${ baseCssClass }__list-item` }
32
+ draggable={ draggable }
33
+ onDragStart={ onDragStart }
34
+ onDragEnd={ onDragEnd }
35
+ >
36
+ <Tooltip text={ title }>
37
+ <CompositeItem
38
+ role="option"
39
+ as="div"
40
+ { ...composite }
41
+ className={ `${ baseCssClass }__item` }
42
+ onClick={ () => {
43
+ onClick( block );
44
+ } }
45
+ aria-label={ title }
46
+ >
47
+ <div
48
+ className={ `${ baseCssClass }__item-preview` }
49
+ >
50
+ { preview }
51
+ </div>
52
+ </CompositeItem>
53
+ </Tooltip>
54
+ </div>
55
+ ) }
56
+ </InserterDraggableBlocks>
57
+ );
58
+ }
59
+
60
+ function MediaList( {
61
+ mediaList,
62
+ mediaType,
63
+ onClick,
64
+ label = __( 'Media List' ),
65
+ } ) {
66
+ const composite = useCompositeState();
67
+ const onPreviewClick = useCallback(
68
+ ( block ) => {
69
+ onClick( cloneBlock( block ) );
70
+ },
71
+ [ onClick ]
72
+ );
73
+ return (
74
+ <Composite
75
+ { ...composite }
76
+ role="listbox"
77
+ className="block-editor-inserter__media-list"
78
+ aria-label={ label }
79
+ >
80
+ { mediaList.map( ( media ) => (
81
+ <MediaPreview
82
+ key={ media.id }
83
+ media={ media }
84
+ mediaType={ mediaType }
85
+ onClick={ onPreviewClick }
86
+ composite={ composite }
87
+ />
88
+ ) ) }
89
+ </Composite>
90
+ );
91
+ }
92
+
93
+ export default MediaList;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useRef, useEffect } from '@wordpress/element';
5
+ import { Spinner, SearchControl } from '@wordpress/components';
6
+ import { focus } from '@wordpress/dom';
7
+ import { __, sprintf } from '@wordpress/i18n';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import MediaList from './media-list';
13
+ import useDebouncedInput from '../hooks/use-debounced-input';
14
+ import { useMediaResults } from './hooks';
15
+ import InserterNoResults from '../no-results';
16
+
17
+ const INITIAL_MEDIA_ITEMS_PER_PAGE = 10;
18
+
19
+ export function MediaCategoryDialog( { rootClientId, onInsert, category } ) {
20
+ const container = useRef();
21
+ useEffect( () => {
22
+ const timeout = setTimeout( () => {
23
+ const [ firstTabbable ] = focus.tabbable.find( container.current );
24
+ firstTabbable?.focus();
25
+ } );
26
+ return () => clearTimeout( timeout );
27
+ }, [ category ] );
28
+ return (
29
+ <div ref={ container } className="block-editor-inserter__media-dialog">
30
+ <MediaCategoryPanel
31
+ rootClientId={ rootClientId }
32
+ onInsert={ onInsert }
33
+ category={ category }
34
+ />
35
+ </div>
36
+ );
37
+ }
38
+
39
+ export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
40
+ const [ search, setSearch, debouncedSearch ] = useDebouncedInput();
41
+ const mediaList = useMediaResults( {
42
+ per_page: !! debouncedSearch ? 20 : INITIAL_MEDIA_ITEMS_PER_PAGE,
43
+ media_type: category.mediaType,
44
+ search: debouncedSearch,
45
+ orderBy: !! debouncedSearch ? 'relevance' : 'date',
46
+ } );
47
+ const baseCssClass = 'block-editor-inserter__media-panel';
48
+ return (
49
+ <div className={ baseCssClass }>
50
+ <SearchControl
51
+ className={ `${ baseCssClass }-search` }
52
+ onChange={ setSearch }
53
+ value={ search }
54
+ label={ sprintf(
55
+ /* translators: %s: Name of the media category(ex. 'images, videos'). */
56
+ __( 'Search %s' ),
57
+ category.label.toLocaleLowerCase()
58
+ ) }
59
+ placeholder={ sprintf(
60
+ /* translators: %s: Name of the media category(ex. 'images, videos'). */
61
+ __( 'Search %s' ),
62
+ category.label.toLocaleLowerCase()
63
+ ) }
64
+ />
65
+ { ! mediaList && (
66
+ <div className={ `${ baseCssClass }-spinner` }>
67
+ <Spinner />
68
+ </div>
69
+ ) }
70
+ { Array.isArray( mediaList ) && ! mediaList.length && (
71
+ <InserterNoResults />
72
+ ) }
73
+ { !! mediaList?.length && (
74
+ <MediaList
75
+ rootClientId={ rootClientId }
76
+ onClick={ onInsert }
77
+ mediaList={ mediaList }
78
+ mediaType={ category.mediaType }
79
+ />
80
+ ) }
81
+ </div>
82
+ );
83
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classNames from 'classnames';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { __ } from '@wordpress/i18n';
10
+ import { useViewportMatch } from '@wordpress/compose';
11
+ import {
12
+ __experimentalItemGroup as ItemGroup,
13
+ __experimentalItem as Item,
14
+ __experimentalHStack as HStack,
15
+ FlexBlock,
16
+ Button,
17
+ } from '@wordpress/components';
18
+ import { useCallback } from '@wordpress/element';
19
+ import { Icon, chevronRight } from '@wordpress/icons';
20
+
21
+ /**
22
+ * Internal dependencies
23
+ */
24
+ import { MediaCategoryPanel } from './media-panel';
25
+ import MediaUploadCheck from '../../media-upload/check';
26
+ import MediaUpload from '../../media-upload';
27
+ import { useMediaCategories } from './hooks';
28
+ import { getBlockAndPreviewFromMedia } from './utils';
29
+ import MobileTabNavigation from '../mobile-tab-navigation';
30
+
31
+ const ALLOWED_MEDIA_TYPES = [ 'image', 'video', 'audio' ];
32
+
33
+ function MediaTab( {
34
+ rootClientId,
35
+ selectedCategory,
36
+ onSelectCategory,
37
+ onInsert,
38
+ } ) {
39
+ const mediaCategories = useMediaCategories( rootClientId );
40
+ const isMobile = useViewportMatch( 'medium', '<' );
41
+ const baseCssClass = 'block-editor-inserter__media-tabs';
42
+ const onSelectMedia = useCallback(
43
+ ( media ) => {
44
+ if ( ! media?.url ) {
45
+ return;
46
+ }
47
+ const [ block ] = getBlockAndPreviewFromMedia( media, media.type );
48
+ onInsert( block );
49
+ },
50
+ [ onInsert ]
51
+ );
52
+ return (
53
+ <>
54
+ { ! isMobile && (
55
+ <div className={ `${ baseCssClass }-container` }>
56
+ <nav aria-label={ __( 'Media categories' ) }>
57
+ <ItemGroup role="list" className={ baseCssClass }>
58
+ { mediaCategories.map( ( mediaCategory ) => (
59
+ <Item
60
+ role="listitem"
61
+ key={ mediaCategory.name }
62
+ onClick={ () =>
63
+ onSelectCategory( mediaCategory )
64
+ }
65
+ className={ classNames(
66
+ `${ baseCssClass }__media-category`,
67
+ {
68
+ 'is-selected':
69
+ selectedCategory ===
70
+ mediaCategory,
71
+ }
72
+ ) }
73
+ aria-label={ mediaCategory.label }
74
+ aria-current={
75
+ mediaCategory === selectedCategory
76
+ ? 'true'
77
+ : undefined
78
+ }
79
+ >
80
+ <HStack>
81
+ <FlexBlock>
82
+ { mediaCategory.label }
83
+ </FlexBlock>
84
+ <Icon icon={ chevronRight } />
85
+ </HStack>
86
+ </Item>
87
+ ) ) }
88
+ <div role="listitem">
89
+ <MediaUploadCheck>
90
+ <MediaUpload
91
+ multiple={ false }
92
+ onSelect={ onSelectMedia }
93
+ allowedTypes={ ALLOWED_MEDIA_TYPES }
94
+ render={ ( { open } ) => (
95
+ <Button
96
+ onClick={ ( event ) => {
97
+ // Safari doesn't emit a focus event on button elements when
98
+ // clicked and we need to manually focus the button here.
99
+ // The reason is that core's Media Library modal explicitly triggers a
100
+ // focus event and therefore a `blur` event is triggered on a different
101
+ // element, which doesn't contain the `data-unstable-ignore-focus-outside-for-relatedtarget`
102
+ // attribute making the Inserter dialog to close.
103
+ event.target.focus();
104
+ open();
105
+ } }
106
+ className="block-editor-inserter__media-library-button"
107
+ variant="secondary"
108
+ data-unstable-ignore-focus-outside-for-relatedtarget=".media-modal"
109
+ >
110
+ { __( 'Open Media Library' ) }
111
+ </Button>
112
+ ) }
113
+ />
114
+ </MediaUploadCheck>
115
+ </div>
116
+ </ItemGroup>
117
+ </nav>
118
+ </div>
119
+ ) }
120
+ { isMobile && (
121
+ <MobileTabNavigation categories={ mediaCategories }>
122
+ { ( category ) => (
123
+ <MediaCategoryPanel
124
+ onInsert={ onInsert }
125
+ rootClientId={ rootClientId }
126
+ category={ category }
127
+ />
128
+ ) }
129
+ </MobileTabNavigation>
130
+ ) }
131
+ </>
132
+ );
133
+ }
134
+
135
+ export default MediaTab;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { createBlock } from '@wordpress/blocks';
5
+
6
+ const mediaTypeTag = { image: 'img', video: 'video', audio: 'audio' };
7
+
8
+ export function getBlockAndPreviewFromMedia( media, mediaType ) {
9
+ // Add the common attributes between the different media types.
10
+ const attributes = {
11
+ id: media.id,
12
+ };
13
+ // Some props are named differently between the Media REST API and Media Library API.
14
+ // For example `source_url` is used in the former and `url` is used in the latter.
15
+ const mediaSrc = media.source_url || media.url;
16
+ const alt = media.alt_text || media.alt || undefined;
17
+ const caption = media.caption?.raw || media.caption;
18
+ if ( caption && typeof caption === 'string' ) {
19
+ attributes.caption = caption;
20
+ }
21
+ if ( mediaType === 'image' ) {
22
+ attributes.url = mediaSrc;
23
+ attributes.alt = alt;
24
+ } else if ( [ 'video', 'audio' ].includes( mediaType ) ) {
25
+ attributes.src = mediaSrc;
26
+ }
27
+ const PreviewTag = mediaTypeTag[ mediaType ];
28
+ const preview = (
29
+ <PreviewTag
30
+ src={ mediaSrc }
31
+ alt={ alt }
32
+ controls={ mediaType === 'audio' ? true : undefined }
33
+ inert="true"
34
+ />
35
+ );
36
+ return [ createBlock( `core/${ mediaType }`, attributes ), preview ];
37
+ }
@@ -28,7 +28,9 @@ import BlockPatternsTabs, {
28
28
  BlockPatternsCategoryDialog,
29
29
  } from './block-patterns-tab';
30
30
  import ReusableBlocksTab from './reusable-blocks-tab';
31
+ import { MediaTab, MediaCategoryDialog, useMediaCategories } from './media-tab';
31
32
  import InserterSearchResults from './search-results';
33
+ import useDebouncedInput from './hooks/use-debounced-input';
32
34
  import useInsertionPoint from './hooks/use-insertion-point';
33
35
  import InserterTabs from './tabs';
34
36
  import { store as blockEditorStore } from '../../store';
@@ -48,12 +50,13 @@ function InserterMenu(
48
50
  },
49
51
  ref
50
52
  ) {
51
- const [ filterValue, setFilterValue ] = useState(
52
- __experimentalFilterValue
53
- );
53
+ const [ filterValue, setFilterValue, delayedFilterValue ] =
54
+ useDebouncedInput( __experimentalFilterValue );
54
55
  const [ hoveredItem, setHoveredItem ] = useState( null );
55
56
  const [ selectedPatternCategory, setSelectedPatternCategory ] =
56
57
  useState( null );
58
+ const [ selectedMediaCategory, setSelectedMediaCategory ] =
59
+ useState( null );
57
60
  const [ selectedTab, setSelectedTab ] = useState( null );
58
61
 
59
62
  const [ destinationRootClientId, onInsertBlocks, onToggleInsertionPoint ] =
@@ -68,7 +71,6 @@ function InserterMenu(
68
71
  ( select ) => {
69
72
  const { __experimentalGetAllowedPatterns, getSettings } =
70
73
  select( blockEditorStore );
71
-
72
74
  return {
73
75
  showPatterns: !! __experimentalGetAllowedPatterns(
74
76
  destinationRootClientId
@@ -80,6 +82,9 @@ function InserterMenu(
80
82
  [ destinationRootClientId ]
81
83
  );
82
84
 
85
+ const mediaCategories = useMediaCategories( destinationRootClientId );
86
+ const showMedia = !! mediaCategories.length;
87
+
83
88
  const onInsert = useCallback(
84
89
  ( blocks, meta, shouldForceFocusBlock ) => {
85
90
  onInsertBlocks( blocks, meta, shouldForceFocusBlock );
@@ -136,7 +141,7 @@ function InserterMenu(
136
141
  destinationRootClientId,
137
142
  onInsert,
138
143
  onHover,
139
- filterValue,
144
+ delayedFilterValue,
140
145
  showMostUsedBlocks,
141
146
  showInserterHelpPanel,
142
147
  ]
@@ -170,16 +175,36 @@ function InserterMenu(
170
175
  [ destinationRootClientId, onInsert, onHover ]
171
176
  );
172
177
 
178
+ const mediaTab = useMemo(
179
+ () => (
180
+ <MediaTab
181
+ rootClientId={ destinationRootClientId }
182
+ selectedCategory={ selectedMediaCategory }
183
+ onSelectCategory={ setSelectedMediaCategory }
184
+ onInsert={ onInsert }
185
+ />
186
+ ),
187
+ [
188
+ destinationRootClientId,
189
+ onInsert,
190
+ selectedMediaCategory,
191
+ setSelectedMediaCategory,
192
+ ]
193
+ );
194
+
173
195
  const getCurrentTab = useCallback(
174
196
  ( tab ) => {
175
197
  if ( tab.name === 'blocks' ) {
176
198
  return blocksTab;
177
199
  } else if ( tab.name === 'patterns' ) {
178
200
  return patternsTab;
201
+ } else if ( tab.name === 'reusable' ) {
202
+ return reusableBlocksTab;
203
+ } else if ( tab.name === 'media' ) {
204
+ return mediaTab;
179
205
  }
180
- return reusableBlocksTab;
181
206
  },
182
- [ blocksTab, patternsTab, reusableBlocksTab ]
207
+ [ blocksTab, patternsTab, reusableBlocksTab, mediaTab ]
183
208
  );
184
209
 
185
210
  const searchRef = useRef();
@@ -190,9 +215,16 @@ function InserterMenu(
190
215
  } ) );
191
216
 
192
217
  const showPatternPanel =
193
- selectedTab === 'patterns' && ! filterValue && selectedPatternCategory;
194
- const showAsTabs = ! filterValue && ( showPatterns || hasReusableBlocks );
195
-
218
+ selectedTab === 'patterns' &&
219
+ ! delayedFilterValue &&
220
+ selectedPatternCategory;
221
+ const showAsTabs =
222
+ ! delayedFilterValue &&
223
+ ( showPatterns || hasReusableBlocks || showMedia );
224
+ const showMediaPanel =
225
+ selectedTab === 'media' &&
226
+ ! delayedFilterValue &&
227
+ selectedMediaCategory;
196
228
  return (
197
229
  <div className="block-editor-inserter__menu">
198
230
  <div
@@ -201,6 +233,7 @@ function InserterMenu(
201
233
  } ) }
202
234
  >
203
235
  <SearchControl
236
+ __nextHasNoMarginBottom
204
237
  className="block-editor-inserter__search"
205
238
  onChange={ ( value ) => {
206
239
  if ( hoveredItem ) setHoveredItem( null );
@@ -211,10 +244,10 @@ function InserterMenu(
211
244
  placeholder={ __( 'Search' ) }
212
245
  ref={ searchRef }
213
246
  />
214
- { !! filterValue && (
247
+ { !! delayedFilterValue && (
215
248
  <div className="block-editor-inserter__no-tab-container">
216
249
  <InserterSearchResults
217
- filterValue={ filterValue }
250
+ filterValue={ delayedFilterValue }
218
251
  onSelect={ onSelect }
219
252
  onHover={ onHover }
220
253
  rootClientId={ rootClientId }
@@ -232,18 +265,26 @@ function InserterMenu(
232
265
  <InserterTabs
233
266
  showPatterns={ showPatterns }
234
267
  showReusableBlocks={ hasReusableBlocks }
268
+ showMedia={ showMedia }
235
269
  prioritizePatterns={ prioritizePatterns }
236
270
  onSelect={ setSelectedTab }
237
271
  >
238
272
  { getCurrentTab }
239
273
  </InserterTabs>
240
274
  ) }
241
- { ! filterValue && ! showAsTabs && (
275
+ { ! delayedFilterValue && ! showAsTabs && (
242
276
  <div className="block-editor-inserter__no-tab-container">
243
277
  { blocksTab }
244
278
  </div>
245
279
  ) }
246
280
  </div>
281
+ { showMediaPanel && (
282
+ <MediaCategoryDialog
283
+ rootClientId={ destinationRootClientId }
284
+ onInsert={ onInsert }
285
+ category={ selectedMediaCategory }
286
+ />
287
+ ) }
247
288
  { showInserterHelpPanel && hoveredItem && (
248
289
  <InserterPreviewPanel item={ hoveredItem } />
249
290
  ) }
@@ -252,6 +293,7 @@ function InserterMenu(
252
293
  rootClientId={ destinationRootClientId }
253
294
  onInsert={ onInsertPattern }
254
295
  category={ selectedPatternCategory }
296
+ showTitlesAsTooltip
255
297
  />
256
298
  ) }
257
299
  </div>