@wordpress/block-editor 10.5.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 (488) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/build/autocompleters/block.js +2 -6
  3. package/build/autocompleters/block.js.map +1 -1
  4. package/build/autocompleters/link.js +2 -0
  5. package/build/autocompleters/link.js.map +1 -1
  6. package/build/components/block-card/index.js +51 -3
  7. package/build/components/block-card/index.js.map +1 -1
  8. package/build/components/block-draggable/index.native.js +46 -39
  9. package/build/components/block-draggable/index.native.js.map +1 -1
  10. package/build/components/block-edit/edit.js +4 -3
  11. package/build/components/block-edit/edit.js.map +1 -1
  12. package/build/components/block-edit/edit.native.js +4 -7
  13. package/build/components/block-edit/edit.native.js.map +1 -1
  14. package/build/components/block-inspector/index.js +35 -33
  15. package/build/components/block-inspector/index.js.map +1 -1
  16. package/build/components/block-list/block-list-context.native.js +5 -8
  17. package/build/components/block-list/block-list-context.native.js.map +1 -1
  18. package/build/components/block-list/block.js +55 -24
  19. package/build/components/block-list/block.js.map +1 -1
  20. package/build/components/block-list/block.native.js +61 -28
  21. package/build/components/block-list/block.native.js.map +1 -1
  22. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +12 -4
  23. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  24. package/build/components/block-pattern-setup/index.js +3 -2
  25. package/build/components/block-pattern-setup/index.js.map +1 -1
  26. package/build/components/block-patterns-list/index.js +33 -11
  27. package/build/components/block-patterns-list/index.js.map +1 -1
  28. package/build/components/block-preview/auto.js +9 -3
  29. package/build/components/block-preview/auto.js.map +1 -1
  30. package/build/components/block-preview/index.js +5 -9
  31. package/build/components/block-preview/index.js.map +1 -1
  32. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -2
  33. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  34. package/build/components/block-toolbar/index.js +5 -1
  35. package/build/components/block-toolbar/index.js.map +1 -1
  36. package/build/components/block-tools/insertion-point.js +8 -49
  37. package/build/components/block-tools/insertion-point.js.map +1 -1
  38. package/build/components/block-variation-picker/index.js +1 -2
  39. package/build/components/block-variation-picker/index.js.map +1 -1
  40. package/build/components/height-control/index.js +115 -0
  41. package/build/components/height-control/index.js.map +1 -0
  42. package/build/components/iframe/index.js +11 -8
  43. package/build/components/iframe/index.js.map +1 -1
  44. package/build/components/image-editor/use-save-image.js +2 -0
  45. package/build/components/image-editor/use-save-image.js.map +1 -1
  46. package/build/components/image-editor/zoom-dropdown.js +1 -0
  47. package/build/components/image-editor/zoom-dropdown.js.map +1 -1
  48. package/build/components/index.js +9 -0
  49. package/build/components/index.js.map +1 -1
  50. package/build/components/inner-blocks/index.js +20 -6
  51. package/build/components/inner-blocks/index.js.map +1 -1
  52. package/build/components/inner-blocks/use-inner-block-template-sync.js +25 -10
  53. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  54. package/build/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  55. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  56. package/build/components/inserter/block-patterns-tab.js +25 -46
  57. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  58. package/build/components/inserter/block-types-tab.js +3 -1
  59. package/build/components/inserter/block-types-tab.js.map +1 -1
  60. package/build/components/inserter/hooks/use-debounced-input.js +27 -0
  61. package/build/components/inserter/hooks/use-debounced-input.js.map +1 -0
  62. package/build/components/inserter/index.js +8 -3
  63. package/build/components/inserter/index.js.map +1 -1
  64. package/build/components/inserter/index.native.js +3 -4
  65. package/build/components/inserter/index.native.js.map +1 -1
  66. package/build/components/inserter/media-tab/hooks.js +103 -0
  67. package/build/components/inserter/media-tab/hooks.js.map +1 -0
  68. package/build/components/inserter/media-tab/index.js +32 -0
  69. package/build/components/inserter/media-tab/index.js.map +1 -0
  70. package/build/components/inserter/media-tab/media-list.js +100 -0
  71. package/build/components/inserter/media-tab/media-list.js.map +1 -0
  72. package/build/components/inserter/media-tab/media-panel.js +96 -0
  73. package/build/components/inserter/media-tab/media-panel.js.map +1 -0
  74. package/build/components/inserter/media-tab/media-tab.js +120 -0
  75. package/build/components/inserter/media-tab/media-tab.js.map +1 -0
  76. package/build/components/inserter/media-tab/utils.js +54 -0
  77. package/build/components/inserter/media-tab/utils.js.map +1 -0
  78. package/build/components/inserter/menu.js +35 -12
  79. package/build/components/inserter/menu.js.map +1 -1
  80. package/build/components/inserter/mobile-tab-navigation.js +70 -0
  81. package/build/components/inserter/mobile-tab-navigation.js.map +1 -0
  82. package/build/components/inserter/quick-inserter.js +1 -0
  83. package/build/components/inserter/quick-inserter.js.map +1 -1
  84. package/build/components/inserter/search-results.js +3 -1
  85. package/build/components/inserter/search-results.js.map +1 -1
  86. package/build/components/inserter/tabs.js +16 -2
  87. package/build/components/inserter/tabs.js.map +1 -1
  88. package/build/components/inserter-list-item/index.js +4 -1
  89. package/build/components/inserter-list-item/index.js.map +1 -1
  90. package/build/components/inspector-controls/groups.js +2 -0
  91. package/build/components/inspector-controls/groups.js.map +1 -1
  92. package/build/components/inspector-controls-tabs/advanced-controls-panel.js +46 -0
  93. package/build/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  94. package/build/components/inspector-controls-tabs/index.js +71 -0
  95. package/build/components/inspector-controls-tabs/index.js.map +1 -0
  96. package/build/components/inspector-controls-tabs/settings-tab.js +28 -0
  97. package/build/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  98. package/build/components/inspector-controls-tabs/styles-tab.js +61 -0
  99. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  100. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +97 -0
  101. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  102. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +18 -0
  103. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  104. package/build/components/inspector-controls-tabs/utils.js +37 -0
  105. package/build/components/inspector-controls-tabs/utils.js.map +1 -0
  106. package/build/components/link-control/index.js +1 -0
  107. package/build/components/link-control/index.js.map +1 -1
  108. package/build/components/link-control/search-input.js +0 -1
  109. package/build/components/link-control/search-input.js.map +1 -1
  110. package/build/components/link-control/use-internal-input-value.js +3 -3
  111. package/build/components/link-control/use-internal-input-value.js.map +1 -1
  112. package/build/components/list-view/block.js +5 -2
  113. package/build/components/list-view/block.js.map +1 -1
  114. package/build/components/list-view/branch.js +13 -12
  115. package/build/components/list-view/branch.js.map +1 -1
  116. package/build/components/media-upload/index.native.js +2 -3
  117. package/build/components/media-upload/index.native.js.map +1 -1
  118. package/build/components/off-canvas-editor/appender.js +104 -0
  119. package/build/components/off-canvas-editor/appender.js.map +1 -0
  120. package/build/components/off-canvas-editor/block-edit-button.js +50 -0
  121. package/build/components/off-canvas-editor/block-edit-button.js.map +1 -0
  122. package/build/components/off-canvas-editor/block.js +36 -4
  123. package/build/components/off-canvas-editor/block.js.map +1 -1
  124. package/build/components/off-canvas-editor/branch.js +3 -5
  125. package/build/components/off-canvas-editor/branch.js.map +1 -1
  126. package/build/components/off-canvas-editor/index.js +20 -11
  127. package/build/components/off-canvas-editor/index.js.map +1 -1
  128. package/build/components/off-canvas-editor/leaf.js +1 -1
  129. package/build/components/off-canvas-editor/leaf.js.map +1 -1
  130. package/build/components/off-canvas-editor/link-ui.js +185 -0
  131. package/build/components/off-canvas-editor/link-ui.js.map +1 -0
  132. package/build/components/off-canvas-editor/update-attributes.js +108 -0
  133. package/build/components/off-canvas-editor/update-attributes.js.map +1 -0
  134. package/build/components/rich-text/format-toolbar/index.js +8 -4
  135. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  136. package/build/components/rich-text/index.js +3 -3
  137. package/build/components/rich-text/index.js.map +1 -1
  138. package/build/components/rich-text/index.native.js +0 -2
  139. package/build/components/rich-text/index.native.js.map +1 -1
  140. package/build/components/rich-text/use-insert-replacement-text.js +43 -0
  141. package/build/components/rich-text/use-insert-replacement-text.js.map +1 -0
  142. package/build/components/rich-text/use-undo-automatic-change.js +9 -1
  143. package/build/components/rich-text/use-undo-automatic-change.js.map +1 -1
  144. package/build/components/rich-text/utils.js +1 -19
  145. package/build/components/rich-text/utils.js.map +1 -1
  146. package/build/components/spacing-sizes-control/spacing-input-control.js +12 -3
  147. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  148. package/build/components/ungroup-button/index.native.js +4 -2
  149. package/build/components/ungroup-button/index.native.js.map +1 -1
  150. package/build/components/url-input/index.js +46 -43
  151. package/build/components/url-input/index.js.map +1 -1
  152. package/build/components/use-block-display-information/index.js +8 -4
  153. package/build/components/use-block-display-information/index.js.map +1 -1
  154. package/build/components/use-setting/index.js +9 -1
  155. package/build/components/use-setting/index.js.map +1 -1
  156. package/build/hooks/child-layout.js +209 -0
  157. package/build/hooks/child-layout.js.map +1 -0
  158. package/build/hooks/content-lock-ui.js +1 -1
  159. package/build/hooks/content-lock-ui.js.map +1 -1
  160. package/build/hooks/dimensions.js +25 -7
  161. package/build/hooks/dimensions.js.map +1 -1
  162. package/build/hooks/layout.js +57 -1
  163. package/build/hooks/layout.js.map +1 -1
  164. package/build/hooks/min-height.js +4 -10
  165. package/build/hooks/min-height.js.map +1 -1
  166. package/build/store/reducer.js +393 -270
  167. package/build/store/reducer.js.map +1 -1
  168. package/build/store/selectors.js +57 -47
  169. package/build/store/selectors.js.map +1 -1
  170. package/build/utils/sorting.js +63 -0
  171. package/build/utils/sorting.js.map +1 -0
  172. package/build-module/autocompleters/block.js +2 -6
  173. package/build-module/autocompleters/block.js.map +1 -1
  174. package/build-module/autocompleters/link.js +2 -0
  175. package/build-module/autocompleters/link.js.map +1 -1
  176. package/build-module/components/block-card/index.js +45 -3
  177. package/build-module/components/block-card/index.js.map +1 -1
  178. package/build-module/components/block-draggable/index.native.js +40 -31
  179. package/build-module/components/block-draggable/index.native.js.map +1 -1
  180. package/build-module/components/block-edit/edit.js +4 -2
  181. package/build-module/components/block-edit/edit.js.map +1 -1
  182. package/build-module/components/block-edit/edit.native.js +4 -6
  183. package/build-module/components/block-edit/edit.native.js.map +1 -1
  184. package/build-module/components/block-inspector/index.js +32 -30
  185. package/build-module/components/block-inspector/index.js.map +1 -1
  186. package/build-module/components/block-list/block-list-context.native.js +5 -8
  187. package/build-module/components/block-list/block-list-context.native.js.map +1 -1
  188. package/build-module/components/block-list/block.js +55 -25
  189. package/build-module/components/block-list/block.js.map +1 -1
  190. package/build-module/components/block-list/block.native.js +61 -28
  191. package/build-module/components/block-list/block.native.js.map +1 -1
  192. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +13 -6
  193. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  194. package/build-module/components/block-pattern-setup/index.js +3 -2
  195. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  196. package/build-module/components/block-patterns-list/index.js +35 -13
  197. package/build-module/components/block-patterns-list/index.js.map +1 -1
  198. package/build-module/components/block-preview/auto.js +9 -3
  199. package/build-module/components/block-preview/auto.js.map +1 -1
  200. package/build-module/components/block-preview/index.js +5 -8
  201. package/build-module/components/block-preview/index.js.map +1 -1
  202. package/build-module/components/block-settings-menu/block-settings-dropdown.js +5 -2
  203. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  204. package/build-module/components/block-toolbar/index.js +6 -2
  205. package/build-module/components/block-toolbar/index.js.map +1 -1
  206. package/build-module/components/block-tools/insertion-point.js +8 -49
  207. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  208. package/build-module/components/block-variation-picker/index.js +1 -2
  209. package/build-module/components/block-variation-picker/index.js.map +1 -1
  210. package/build-module/components/height-control/index.js +103 -0
  211. package/build-module/components/height-control/index.js.map +1 -0
  212. package/build-module/components/iframe/index.js +11 -8
  213. package/build-module/components/iframe/index.js.map +1 -1
  214. package/build-module/components/image-editor/use-save-image.js +2 -0
  215. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  216. package/build-module/components/image-editor/zoom-dropdown.js +1 -0
  217. package/build-module/components/image-editor/zoom-dropdown.js.map +1 -1
  218. package/build-module/components/index.js +1 -0
  219. package/build-module/components/index.js.map +1 -1
  220. package/build-module/components/inner-blocks/index.js +22 -8
  221. package/build-module/components/inner-blocks/index.js.map +1 -1
  222. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +23 -10
  223. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  224. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  225. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  226. package/build-module/components/inserter/block-patterns-tab.js +27 -49
  227. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  228. package/build-module/components/inserter/block-types-tab.js +3 -2
  229. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  230. package/build-module/components/inserter/hooks/use-debounced-input.js +18 -0
  231. package/build-module/components/inserter/hooks/use-debounced-input.js.map +1 -0
  232. package/build-module/components/inserter/index.js +8 -3
  233. package/build-module/components/inserter/index.js.map +1 -1
  234. package/build-module/components/inserter/index.native.js +3 -5
  235. package/build-module/components/inserter/index.native.js.map +1 -1
  236. package/build-module/components/inserter/media-tab/hooks.js +89 -0
  237. package/build-module/components/inserter/media-tab/hooks.js.map +1 -0
  238. package/build-module/components/inserter/media-tab/index.js +4 -0
  239. package/build-module/components/inserter/media-tab/index.js.map +1 -0
  240. package/build-module/components/inserter/media-tab/media-list.js +86 -0
  241. package/build-module/components/inserter/media-tab/media-list.js.map +1 -0
  242. package/build-module/components/inserter/media-tab/media-panel.js +77 -0
  243. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -0
  244. package/build-module/components/inserter/media-tab/media-tab.js +100 -0
  245. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -0
  246. package/build-module/components/inserter/media-tab/utils.js +45 -0
  247. package/build-module/components/inserter/media-tab/utils.js.map +1 -0
  248. package/build-module/components/inserter/menu.js +33 -12
  249. package/build-module/components/inserter/menu.js.map +1 -1
  250. package/build-module/components/inserter/mobile-tab-navigation.js +61 -0
  251. package/build-module/components/inserter/mobile-tab-navigation.js.map +1 -0
  252. package/build-module/components/inserter/quick-inserter.js +1 -0
  253. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  254. package/build-module/components/inserter/search-results.js +3 -2
  255. package/build-module/components/inserter/search-results.js.map +1 -1
  256. package/build-module/components/inserter/tabs.js +15 -2
  257. package/build-module/components/inserter/tabs.js.map +1 -1
  258. package/build-module/components/inserter-list-item/index.js +5 -2
  259. package/build-module/components/inserter-list-item/index.js.map +1 -1
  260. package/build-module/components/inspector-controls/groups.js +2 -0
  261. package/build-module/components/inspector-controls/groups.js.map +1 -1
  262. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js +32 -0
  263. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  264. package/build-module/components/inspector-controls-tabs/index.js +56 -0
  265. package/build-module/components/inspector-controls-tabs/index.js.map +1 -0
  266. package/build-module/components/inspector-controls-tabs/settings-tab.js +17 -0
  267. package/build-module/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  268. package/build-module/components/inspector-controls-tabs/styles-tab.js +46 -0
  269. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  270. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +81 -0
  271. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  272. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +8 -0
  273. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  274. package/build-module/components/inspector-controls-tabs/utils.js +26 -0
  275. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -0
  276. package/build-module/components/link-control/index.js +1 -0
  277. package/build-module/components/link-control/index.js.map +1 -1
  278. package/build-module/components/link-control/search-input.js +0 -1
  279. package/build-module/components/link-control/search-input.js.map +1 -1
  280. package/build-module/components/link-control/use-internal-input-value.js +3 -3
  281. package/build-module/components/link-control/use-internal-input-value.js.map +1 -1
  282. package/build-module/components/list-view/block.js +5 -2
  283. package/build-module/components/list-view/block.js.map +1 -1
  284. package/build-module/components/list-view/branch.js +12 -11
  285. package/build-module/components/list-view/branch.js.map +1 -1
  286. package/build-module/components/media-upload/index.native.js +2 -4
  287. package/build-module/components/media-upload/index.native.js.map +1 -1
  288. package/build-module/components/off-canvas-editor/appender.js +89 -0
  289. package/build-module/components/off-canvas-editor/appender.js.map +1 -0
  290. package/build-module/components/off-canvas-editor/block-edit-button.js +35 -0
  291. package/build-module/components/off-canvas-editor/block-edit-button.js.map +1 -0
  292. package/build-module/components/off-canvas-editor/block.js +36 -6
  293. package/build-module/components/off-canvas-editor/block.js.map +1 -1
  294. package/build-module/components/off-canvas-editor/branch.js +3 -4
  295. package/build-module/components/off-canvas-editor/branch.js.map +1 -1
  296. package/build-module/components/off-canvas-editor/index.js +20 -12
  297. package/build-module/components/off-canvas-editor/index.js.map +1 -1
  298. package/build-module/components/off-canvas-editor/leaf.js +1 -1
  299. package/build-module/components/off-canvas-editor/leaf.js.map +1 -1
  300. package/build-module/components/off-canvas-editor/link-ui.js +165 -0
  301. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -0
  302. package/build-module/components/off-canvas-editor/update-attributes.js +97 -0
  303. package/build-module/components/off-canvas-editor/update-attributes.js.map +1 -0
  304. package/build-module/components/rich-text/format-toolbar/index.js +6 -2
  305. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  306. package/build-module/components/rich-text/index.js +2 -3
  307. package/build-module/components/rich-text/index.js.map +1 -1
  308. package/build-module/components/rich-text/index.native.js +0 -2
  309. package/build-module/components/rich-text/index.native.js.map +1 -1
  310. package/build-module/components/rich-text/use-insert-replacement-text.js +33 -0
  311. package/build-module/components/rich-text/use-insert-replacement-text.js.map +1 -0
  312. package/build-module/components/rich-text/use-undo-automatic-change.js +9 -1
  313. package/build-module/components/rich-text/use-undo-automatic-change.js.map +1 -1
  314. package/build-module/components/rich-text/utils.js +1 -16
  315. package/build-module/components/rich-text/utils.js.map +1 -1
  316. package/build-module/components/spacing-sizes-control/spacing-input-control.js +12 -3
  317. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  318. package/build-module/components/ungroup-button/index.native.js +3 -2
  319. package/build-module/components/ungroup-button/index.native.js.map +1 -1
  320. package/build-module/components/url-input/index.js +46 -43
  321. package/build-module/components/url-input/index.js.map +1 -1
  322. package/build-module/components/use-block-display-information/index.js +9 -5
  323. package/build-module/components/use-block-display-information/index.js.map +1 -1
  324. package/build-module/components/use-setting/index.js +8 -1
  325. package/build-module/components/use-setting/index.js.map +1 -1
  326. package/build-module/hooks/child-layout.js +189 -0
  327. package/build-module/hooks/child-layout.js.map +1 -0
  328. package/build-module/hooks/content-lock-ui.js +1 -1
  329. package/build-module/hooks/content-lock-ui.js.map +1 -1
  330. package/build-module/hooks/dimensions.js +25 -8
  331. package/build-module/hooks/dimensions.js.map +1 -1
  332. package/build-module/hooks/layout.js +55 -0
  333. package/build-module/hooks/layout.js.map +1 -1
  334. package/build-module/hooks/min-height.js +3 -9
  335. package/build-module/hooks/min-height.js.map +1 -1
  336. package/build-module/store/reducer.js +391 -271
  337. package/build-module/store/reducer.js.map +1 -1
  338. package/build-module/store/selectors.js +54 -47
  339. package/build-module/store/selectors.js.map +1 -1
  340. package/build-module/utils/sorting.js +56 -0
  341. package/build-module/utils/sorting.js.map +1 -0
  342. package/build-style/content-rtl.css +701 -0
  343. package/build-style/content.css +701 -0
  344. package/build-style/default-editor-styles-rtl.css +14 -0
  345. package/build-style/default-editor-styles.css +14 -0
  346. package/build-style/style-rtl.css +286 -662
  347. package/build-style/style.css +286 -662
  348. package/package.json +32 -30
  349. package/src/autocompleters/block.js +2 -6
  350. package/src/autocompleters/link.js +2 -0
  351. package/src/components/alignment-control/test/index.js +4 -1
  352. package/src/components/block-alignment-control/test/index.js +4 -1
  353. package/src/components/block-card/index.js +46 -2
  354. package/src/components/block-card/style.scss +4 -0
  355. package/src/components/block-content-overlay/{style.scss → content.scss} +7 -1
  356. package/src/components/block-draggable/content.scss +20 -0
  357. package/src/components/block-draggable/index.native.js +54 -40
  358. package/src/components/block-draggable/style.scss +0 -21
  359. package/src/components/block-draggable/test/helpers.native.js +7 -9
  360. package/src/components/block-draggable/test/index.native.js +35 -45
  361. package/src/components/block-edit/edit.js +5 -2
  362. package/src/components/block-edit/edit.native.js +5 -6
  363. package/src/components/block-inspector/index.js +96 -81
  364. package/src/components/block-inspector/style.scss +9 -1
  365. package/src/components/block-list/block-list-context.native.js +5 -8
  366. package/src/components/block-list/block.js +74 -23
  367. package/src/components/block-list/block.native.js +78 -23
  368. package/src/components/block-list/{style.scss → content.scss} +1 -15
  369. package/src/components/block-list-appender/{style.scss → content.scss} +0 -0
  370. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +24 -6
  371. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +0 -2
  372. package/src/components/block-pattern-setup/index.js +2 -1
  373. package/src/components/block-patterns-list/index.js +47 -24
  374. package/src/components/block-preview/README.md +15 -10
  375. package/src/components/block-preview/auto.js +7 -1
  376. package/src/components/block-preview/content.scss +4 -0
  377. package/src/components/block-preview/index.js +7 -12
  378. package/src/components/block-preview/style.scss +0 -7
  379. package/src/components/block-preview/test/index.js +18 -35
  380. package/src/components/block-selection-clearer/test/index.js +12 -12
  381. package/src/components/block-settings-menu/block-settings-dropdown.js +32 -20
  382. package/src/components/block-switcher/test/index.js +4 -0
  383. package/src/components/block-toolbar/index.js +12 -5
  384. package/src/components/block-toolbar/style.scss +10 -0
  385. package/src/components/block-tools/insertion-point.js +3 -47
  386. package/src/components/block-tools/style.scss +12 -5
  387. package/src/components/block-variation-picker/index.js +1 -4
  388. package/src/components/block-vertical-alignment-control/test/index.js +4 -1
  389. package/src/components/default-block-appender/{style.scss → content.scss} +0 -0
  390. package/src/components/height-control/index.js +123 -0
  391. package/src/components/height-control/stories/index.js +21 -0
  392. package/src/components/height-control/style.scss +5 -0
  393. package/src/components/iframe/index.js +25 -18
  394. package/src/components/image-editor/use-save-image.js +2 -0
  395. package/src/components/image-editor/zoom-dropdown.js +1 -0
  396. package/src/components/index.js +1 -0
  397. package/src/components/inner-blocks/{style.scss → content.scss} +0 -0
  398. package/src/components/inner-blocks/index.js +23 -6
  399. package/src/components/inner-blocks/use-inner-block-template-sync.js +28 -10
  400. package/src/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  401. package/src/components/inserter/block-patterns-tab.js +28 -71
  402. package/src/components/inserter/block-types-tab.js +3 -2
  403. package/src/components/inserter/hooks/use-debounced-input.js +17 -0
  404. package/src/components/inserter/index.js +10 -2
  405. package/src/components/inserter/index.native.js +1 -1
  406. package/src/components/inserter/media-tab/hooks.js +88 -0
  407. package/src/components/inserter/media-tab/index.js +3 -0
  408. package/src/components/inserter/media-tab/media-list.js +93 -0
  409. package/src/components/inserter/media-tab/media-panel.js +83 -0
  410. package/src/components/inserter/media-tab/media-tab.js +135 -0
  411. package/src/components/inserter/media-tab/utils.js +37 -0
  412. package/src/components/inserter/menu.js +55 -13
  413. package/src/components/inserter/mobile-tab-navigation.js +85 -0
  414. package/src/components/inserter/quick-inserter.js +1 -0
  415. package/src/components/inserter/search-results.js +3 -2
  416. package/src/components/inserter/stories/index.js +1 -1
  417. package/src/components/inserter/stories/{fixtures.js → utils/fixtures.js} +0 -0
  418. package/src/components/inserter/style.scss +176 -11
  419. package/src/components/inserter/tabs.js +12 -1
  420. package/src/components/inserter-list-item/index.js +11 -1
  421. package/src/components/inserter-list-item/style.scss +26 -0
  422. package/src/components/inspector-controls/groups.js +2 -0
  423. package/src/components/inspector-controls-tabs/advanced-controls-panel.js +37 -0
  424. package/src/components/inspector-controls-tabs/index.js +62 -0
  425. package/src/components/inspector-controls-tabs/settings-tab.js +18 -0
  426. package/src/components/inspector-controls-tabs/styles-tab.js +51 -0
  427. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +89 -0
  428. package/src/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +9 -0
  429. package/src/components/inspector-controls-tabs/utils.js +28 -0
  430. package/src/components/line-height-control/test/index.js +5 -5
  431. package/src/components/link-control/README.md +1 -1
  432. package/src/components/link-control/index.js +1 -0
  433. package/src/components/link-control/search-input.js +0 -1
  434. package/src/components/link-control/test/index.js +188 -401
  435. package/src/components/link-control/use-internal-input-value.js +3 -3
  436. package/src/components/list-view/block.js +3 -0
  437. package/src/components/list-view/branch.js +10 -8
  438. package/src/components/list-view/style.scss +20 -9
  439. package/src/components/media-placeholder/{style.scss → content.scss} +0 -0
  440. package/src/components/media-replace-flow/test/index.js +37 -9
  441. package/src/components/media-upload/test/index.native.js +2 -0
  442. package/src/components/off-canvas-editor/appender.js +93 -0
  443. package/src/components/off-canvas-editor/block-edit-button.js +27 -0
  444. package/src/components/off-canvas-editor/block.js +88 -22
  445. package/src/components/off-canvas-editor/branch.js +3 -5
  446. package/src/components/off-canvas-editor/index.js +59 -33
  447. package/src/components/off-canvas-editor/leaf.js +5 -1
  448. package/src/components/off-canvas-editor/link-ui.js +166 -0
  449. package/src/components/off-canvas-editor/style.scss +17 -388
  450. package/src/components/off-canvas-editor/update-attributes.js +99 -0
  451. package/src/components/plain-text/{style.scss → content.scss} +0 -0
  452. package/src/components/recursion-provider/test/index.js +27 -29
  453. package/src/components/rich-text/content.scss +42 -0
  454. package/src/components/rich-text/format-toolbar/index.js +6 -4
  455. package/src/components/rich-text/index.js +2 -2
  456. package/src/components/rich-text/index.native.js +0 -2
  457. package/src/components/rich-text/style.scss +0 -43
  458. package/src/components/rich-text/use-insert-replacement-text.js +31 -0
  459. package/src/components/rich-text/use-undo-automatic-change.js +7 -1
  460. package/src/components/rich-text/utils.js +2 -21
  461. package/src/components/spacing-sizes-control/spacing-input-control.js +9 -0
  462. package/src/components/ungroup-button/index.native.js +6 -2
  463. package/src/components/url-input/index.js +57 -73
  464. package/src/components/url-popover/test/__snapshots__/index.js.snap +8 -6
  465. package/src/components/url-popover/test/index.js +21 -9
  466. package/src/components/use-block-display-information/index.js +14 -5
  467. package/src/components/use-setting/index.js +13 -1
  468. package/src/components/use-setting/test/index.js +99 -0
  469. package/src/content.scss +10 -0
  470. package/src/hooks/child-layout.js +190 -0
  471. package/src/hooks/content-lock-ui.js +1 -1
  472. package/src/hooks/dimensions.js +45 -7
  473. package/src/hooks/layout.js +60 -0
  474. package/src/hooks/min-height.js +2 -19
  475. package/src/store/reducer.js +459 -423
  476. package/src/store/selectors.js +56 -57
  477. package/src/store/test/performance.js +71 -0
  478. package/src/store/test/reducer.js +623 -491
  479. package/src/store/test/selectors.js +1820 -1306
  480. package/src/style.scss +4 -7
  481. package/src/utils/sorting.js +54 -0
  482. package/src/utils/test/sorting.js +49 -0
  483. package/tsconfig.tsbuildinfo +1 -1
  484. package/build/components/block-preview/live.js +0 -30
  485. package/build/components/block-preview/live.js.map +0 -1
  486. package/build-module/components/block-preview/live.js +0 -20
  487. package/build-module/components/block-preview/live.js.map +0 -1
  488. package/src/components/block-preview/live.js +0 -19
@@ -8,20 +8,16 @@ import {
8
8
  useRef,
9
9
  useEffect,
10
10
  } from '@wordpress/element';
11
- import { _x, __, isRTL } from '@wordpress/i18n';
11
+ import { _x, __ } from '@wordpress/i18n';
12
12
  import { useAsyncList, useViewportMatch } from '@wordpress/compose';
13
13
  import {
14
14
  __experimentalItemGroup as ItemGroup,
15
15
  __experimentalItem as Item,
16
16
  __experimentalHStack as HStack,
17
- __experimentalNavigatorProvider as NavigatorProvider,
18
- __experimentalNavigatorScreen as NavigatorScreen,
19
- __experimentalNavigatorButton as NavigatorButton,
20
- __experimentalNavigatorBackButton as NavigatorBackButton,
21
17
  FlexBlock,
22
18
  Button,
23
19
  } from '@wordpress/components';
24
- import { Icon, chevronRight, chevronLeft } from '@wordpress/icons';
20
+ import { Icon, chevronRight } from '@wordpress/icons';
25
21
  import { focus } from '@wordpress/dom';
26
22
 
27
23
  /**
@@ -30,6 +26,7 @@ import { focus } from '@wordpress/dom';
30
26
  import usePatternsState from './hooks/use-patterns-state';
31
27
  import BlockPatternList from '../block-patterns-list';
32
28
  import PatternsExplorerModal from './block-patterns-explorer/explorer';
29
+ import MobileTabNavigation from './mobile-tab-navigation';
33
30
 
34
31
  function usePatternsCategories() {
35
32
  const [ allPatterns, allCategories ] = usePatternsState();
@@ -56,10 +53,17 @@ function usePatternsCategories() {
56
53
  )
57
54
  )
58
55
  .sort( ( { name: currentName }, { name: nextName } ) => {
59
- if ( ! [ currentName, nextName ].includes( 'featured' ) ) {
56
+ if (
57
+ ! [ currentName, nextName ].some( ( categoryName ) =>
58
+ [ 'featured', 'text' ].includes( categoryName )
59
+ )
60
+ ) {
60
61
  return 0;
61
62
  }
62
- return currentName === 'featured' ? -1 : 1;
63
+ // Move `featured` category to the top and `text` to the bottom.
64
+ return currentName === 'featured' || nextName === 'text'
65
+ ? -1
66
+ : 1;
63
67
  } );
64
68
 
65
69
  if (
@@ -86,6 +90,7 @@ export function BlockPatternsCategoryDialog( {
86
90
  rootClientId,
87
91
  onInsert,
88
92
  category,
93
+ showTitlesAsTooltip,
89
94
  } ) {
90
95
  const container = useRef();
91
96
 
@@ -100,12 +105,13 @@ export function BlockPatternsCategoryDialog( {
100
105
  return (
101
106
  <div
102
107
  ref={ container }
103
- className="block-editor-inserter__patterns-category-panel"
108
+ className="block-editor-inserter__patterns-category-dialog"
104
109
  >
105
110
  <BlockPatternsCategoryPanel
106
111
  rootClientId={ rootClientId }
107
112
  onInsert={ onInsert }
108
113
  category={ category }
114
+ showTitlesAsTooltip={ showTitlesAsTooltip }
109
115
  />
110
116
  </div>
111
117
  );
@@ -115,6 +121,7 @@ export function BlockPatternsCategoryPanel( {
115
121
  rootClientId,
116
122
  onInsert,
117
123
  category,
124
+ showTitlesAsTooltip,
118
125
  } ) {
119
126
  const [ allPatterns, , onClick ] = usePatternsState(
120
127
  onInsert,
@@ -151,7 +158,7 @@ export function BlockPatternsCategoryPanel( {
151
158
  }
152
159
 
153
160
  return (
154
- <div>
161
+ <div className="block-editor-inserter__patterns-category-panel">
155
162
  <div className="block-editor-inserter__patterns-category-panel-title">
156
163
  { category.label }
157
164
  </div>
@@ -164,6 +171,7 @@ export function BlockPatternsCategoryPanel( {
164
171
  orientation="vertical"
165
172
  category={ category.label }
166
173
  isDraggable
174
+ showTitlesAsTooltip={ showTitlesAsTooltip }
167
175
  />
168
176
  </div>
169
177
  );
@@ -178,7 +186,6 @@ function BlockPatternsTabs( {
178
186
  const [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );
179
187
  const categories = usePatternsCategories();
180
188
  const isMobile = useViewportMatch( 'medium', '<' );
181
-
182
189
  return (
183
190
  <>
184
191
  { ! isMobile && (
@@ -215,12 +222,6 @@ function BlockPatternsTabs( {
215
222
  </HStack>
216
223
  </Item>
217
224
  ) ) }
218
-
219
- <div
220
- role="presentation"
221
- className="block-editor-inserter__patterns-fill-space"
222
- />
223
-
224
225
  <div role="listitem">
225
226
  <Button
226
227
  className="block-editor-inserter__patterns-explore-button"
@@ -237,10 +238,16 @@ function BlockPatternsTabs( {
237
238
  </div>
238
239
  ) }
239
240
  { isMobile && (
240
- <BlockPatternsTabNavigation
241
- onInsert={ onInsert }
242
- rootClientId={ rootClientId }
243
- />
241
+ <MobileTabNavigation categories={ categories }>
242
+ { ( category ) => (
243
+ <BlockPatternsCategoryPanel
244
+ onInsert={ onInsert }
245
+ rootClientId={ rootClientId }
246
+ category={ category }
247
+ showTitlesAsTooltip={ false }
248
+ />
249
+ ) }
250
+ </MobileTabNavigation>
244
251
  ) }
245
252
  { showPatternsExplorer && (
246
253
  <PatternsExplorerModal
@@ -253,54 +260,4 @@ function BlockPatternsTabs( {
253
260
  );
254
261
  }
255
262
 
256
- function BlockPatternsTabNavigation( { onInsert, rootClientId } ) {
257
- const categories = usePatternsCategories();
258
-
259
- return (
260
- <NavigatorProvider initialPath="/">
261
- <NavigatorScreen path="/">
262
- <ItemGroup>
263
- { categories.map( ( category ) => (
264
- <NavigatorButton
265
- key={ category.name }
266
- path={ `/category/${ category.name }` }
267
- as={ Item }
268
- isAction
269
- >
270
- <HStack>
271
- <FlexBlock>{ category.label }</FlexBlock>
272
- <Icon
273
- icon={
274
- isRTL() ? chevronLeft : chevronRight
275
- }
276
- />
277
- </HStack>
278
- </NavigatorButton>
279
- ) ) }
280
- </ItemGroup>
281
- </NavigatorScreen>
282
-
283
- { categories.map( ( category ) => (
284
- <NavigatorScreen
285
- key={ category.name }
286
- path={ `/category/${ category.name }` }
287
- >
288
- <NavigatorBackButton
289
- icon={ isRTL() ? chevronRight : chevronLeft }
290
- isSmall
291
- aria-label={ __( 'Navigate to the categories list' ) }
292
- >
293
- { __( 'Back' ) }
294
- </NavigatorBackButton>
295
- <BlockPatternsCategoryPanel
296
- category={ category }
297
- rootClientId={ rootClientId }
298
- onInsert={ onInsert }
299
- />
300
- </NavigatorScreen>
301
- ) ) }
302
- </NavigatorProvider>
303
- );
304
- }
305
-
306
263
  export default BlockPatternsTabs;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { map, groupBy, orderBy } from 'lodash';
4
+ import { map, groupBy } from 'lodash';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
@@ -17,6 +17,7 @@ import BlockTypesList from '../block-types-list';
17
17
  import InserterPanel from './panel';
18
18
  import useBlockTypesState from './hooks/use-block-types-state';
19
19
  import InserterListbox from '../inserter-listbox';
20
+ import { orderBy } from '../../utils/sorting';
20
21
 
21
22
  const getBlockNamespace = ( item ) => item.name.split( '/' )[ 0 ];
22
23
 
@@ -42,7 +43,7 @@ export function BlockTypesTab( {
42
43
  );
43
44
 
44
45
  const suggestedItems = useMemo( () => {
45
- return orderBy( items, [ 'frecency' ], [ 'desc' ] ).slice(
46
+ return orderBy( items, 'frecency', 'desc' ).slice(
46
47
  0,
47
48
  MAX_SUGGESTED_ITEMS
48
49
  );
@@ -0,0 +1,17 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useEffect, useState } from '@wordpress/element';
5
+ import { useDebounce } from '@wordpress/compose';
6
+
7
+ export default function useDebouncedInput( defaultValue = '' ) {
8
+ const [ input, setInput ] = useState( defaultValue );
9
+ const [ debounced, setter ] = useState( defaultValue );
10
+ const setDebounced = useDebounce( setter, 250 );
11
+ useEffect( () => {
12
+ if ( debounced !== input ) {
13
+ setDebounced( input );
14
+ }
15
+ }, [ debounced, input ] );
16
+ return [ input, setInput, debounced ];
17
+ }
@@ -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;