@wordpress/block-editor 11.2.0 → 11.3.1

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 (675) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +28 -4
  3. package/build/components/alignment-control/ui.js +1 -1
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/autocomplete/index.js +2 -7
  6. package/build/components/autocomplete/index.js.map +1 -1
  7. package/build/components/block-actions/index.js +7 -2
  8. package/build/components/block-actions/index.js.map +1 -1
  9. package/build/components/block-alignment-matrix-control/index.js +2 -2
  10. package/build/components/block-alignment-matrix-control/index.js.map +1 -1
  11. package/build/components/block-card/index.js +2 -4
  12. package/build/components/block-card/index.js.map +1 -1
  13. package/build/components/block-edit/index.js +8 -0
  14. package/build/components/block-edit/index.js.map +1 -1
  15. package/build/components/block-inspector/index.js +15 -14
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/use-in-between-inserter.js +5 -0
  18. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  19. package/build/components/block-lock/modal.js +0 -1
  20. package/build/components/block-lock/modal.js.map +1 -1
  21. package/build/components/block-mover/mover-description.js +2 -2
  22. package/build/components/block-mover/mover-description.js.map +1 -1
  23. package/build/components/block-navigation/dropdown.js +3 -1
  24. package/build/components/block-navigation/dropdown.js.map +1 -1
  25. package/build/components/block-pattern-setup/index.js +1 -1
  26. package/build/components/block-pattern-setup/index.js.map +1 -1
  27. package/build/components/block-pattern-setup/use-patterns-setup.js +2 -2
  28. package/build/components/block-pattern-setup/use-patterns-setup.js.map +1 -1
  29. package/build/components/block-patterns-list/index.js +31 -3
  30. package/build/components/block-patterns-list/index.js.map +1 -1
  31. package/build/components/block-preview/auto.js +9 -11
  32. package/build/components/block-preview/auto.js.map +1 -1
  33. package/build/components/block-preview/index.js +32 -8
  34. package/build/components/block-preview/index.js.map +1 -1
  35. package/build/components/block-selection-clearer/index.js +1 -1
  36. package/build/components/block-selection-clearer/index.js.map +1 -1
  37. package/build/components/block-settings/container.native.js +7 -33
  38. package/build/components/block-settings/container.native.js.map +1 -1
  39. package/build/components/block-settings-menu/block-settings-dropdown.js +12 -6
  40. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  41. package/build/components/block-settings-menu-controls/index.js +2 -8
  42. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  43. package/build/components/block-switcher/utils.js +1 -1
  44. package/build/components/block-switcher/utils.js.map +1 -1
  45. package/build/components/block-tools/selected-block-popover.js +55 -47
  46. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  47. package/build/components/block-vertical-alignment-control/icons.js +15 -1
  48. package/build/components/block-vertical-alignment-control/icons.js.map +1 -1
  49. package/build/components/block-vertical-alignment-control/ui.js +9 -4
  50. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  51. package/build/components/color-style-selector/index.js +3 -1
  52. package/build/components/color-style-selector/index.js.map +1 -1
  53. package/build/components/date-format-picker/index.js +3 -4
  54. package/build/components/date-format-picker/index.js.map +1 -1
  55. package/build/components/font-family/index.js +1 -7
  56. package/build/components/font-family/index.js.map +1 -1
  57. package/build/components/font-sizes/fluid-utils.js +1 -1
  58. package/build/components/font-sizes/fluid-utils.js.map +1 -1
  59. package/build/components/font-sizes/utils.js +1 -1
  60. package/build/components/font-sizes/utils.js.map +1 -1
  61. package/build/components/global-styles/context.js +22 -0
  62. package/build/components/global-styles/context.js.map +1 -0
  63. package/build/components/global-styles/hooks.js +142 -0
  64. package/build/components/global-styles/hooks.js.map +1 -0
  65. package/build/components/global-styles/index.js +42 -0
  66. package/build/components/global-styles/index.js.map +1 -0
  67. package/build/components/global-styles/typography-utils.js +92 -0
  68. package/build/components/global-styles/typography-utils.js.map +1 -0
  69. package/build/components/global-styles/use-global-styles-output.js +974 -0
  70. package/build/components/global-styles/use-global-styles-output.js.map +1 -0
  71. package/build/components/global-styles/utils.js +340 -0
  72. package/build/components/global-styles/utils.js.map +1 -0
  73. package/build/components/height-control/index.js +13 -1
  74. package/build/components/height-control/index.js.map +1 -1
  75. package/build/components/iframe/index.js +5 -3
  76. package/build/components/iframe/index.js.map +1 -1
  77. package/build/components/image-editor/constants.js +1 -1
  78. package/build/components/image-editor/constants.js.map +1 -1
  79. package/build/components/image-editor/context.js +1 -2
  80. package/build/components/image-editor/context.js.map +1 -1
  81. package/build/components/image-editor/cropper.js +3 -1
  82. package/build/components/image-editor/cropper.js.map +1 -1
  83. package/build/components/image-editor/index.js +13 -9
  84. package/build/components/image-editor/index.js.map +1 -1
  85. package/build/components/image-editor/use-transform-image.js +11 -35
  86. package/build/components/image-editor/use-transform-image.js.map +1 -1
  87. package/build/components/image-size-control/index.js +1 -7
  88. package/build/components/image-size-control/index.js.map +1 -1
  89. package/build/components/index.js +8 -24
  90. package/build/components/index.js.map +1 -1
  91. package/build/components/inner-blocks/index.js +22 -32
  92. package/build/components/inner-blocks/index.js.map +1 -1
  93. package/build/components/inner-blocks/index.native.js +8 -23
  94. package/build/components/inner-blocks/index.native.js.map +1 -1
  95. package/build/components/inner-blocks/use-block-context.js +53 -0
  96. package/build/components/inner-blocks/use-block-context.js.map +1 -0
  97. package/build/components/inserter/block-patterns-explorer/explorer.js +0 -1
  98. package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
  99. package/build/components/inserter/block-patterns-tab.js +9 -2
  100. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  101. package/build/components/inserter/block-types-tab.js +2 -2
  102. package/build/components/inserter/block-types-tab.js.map +1 -1
  103. package/build/components/inserter/hooks/use-patterns-state.js +1 -7
  104. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  105. package/build/components/inserter/index.js +5 -4
  106. package/build/components/inserter/index.js.map +1 -1
  107. package/build/components/inserter/media-tab/hooks.js +142 -56
  108. package/build/components/inserter/media-tab/hooks.js.map +1 -1
  109. package/build/components/inserter/media-tab/media-list.js +74 -21
  110. package/build/components/inserter/media-tab/media-list.js.map +1 -1
  111. package/build/components/inserter/media-tab/media-panel.js +11 -13
  112. package/build/components/inserter/media-tab/media-panel.js.map +1 -1
  113. package/build/components/inserter/media-tab/media-tab.js +6 -3
  114. package/build/components/inserter/media-tab/media-tab.js.map +1 -1
  115. package/build/components/inserter/media-tab/utils.js +26 -15
  116. package/build/components/inserter/media-tab/utils.js.map +1 -1
  117. package/build/components/inserter/menu.js +4 -0
  118. package/build/components/inserter/menu.js.map +1 -1
  119. package/build/components/inserter/preview-panel.js +5 -3
  120. package/build/components/inserter/preview-panel.js.map +1 -1
  121. package/build/components/inserter/search-results.js +2 -7
  122. package/build/components/inserter/search-results.js.map +1 -1
  123. package/build/components/inserter-list-item/index.js +1 -9
  124. package/build/components/inserter-list-item/index.js.map +1 -1
  125. package/build/components/inspector-controls/fill.js +15 -2
  126. package/build/components/inspector-controls/fill.js.map +1 -1
  127. package/build/components/inspector-controls/fill.native.js +14 -1
  128. package/build/components/inspector-controls/fill.native.js.map +1 -1
  129. package/build/components/inspector-controls/groups.js +4 -0
  130. package/build/components/inspector-controls/groups.js.map +1 -1
  131. package/build/components/inspector-controls/index.js +2 -2
  132. package/build/components/inspector-controls/index.js.map +1 -1
  133. package/build/components/inspector-controls/slot.js +14 -1
  134. package/build/components/inspector-controls/slot.js.map +1 -1
  135. package/build/components/inspector-controls/slot.native.js +14 -1
  136. package/build/components/inspector-controls/slot.native.js.map +1 -1
  137. package/build/components/inspector-controls-tabs/advanced-controls-panel.js +1 -1
  138. package/build/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -1
  139. package/build/components/inspector-controls-tabs/index.js +2 -2
  140. package/build/components/inspector-controls-tabs/index.js.map +1 -1
  141. package/build/components/inspector-controls-tabs/position-controls-panel.js +1 -1
  142. package/build/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  143. package/build/components/inspector-controls-tabs/styles-tab.js +6 -4
  144. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  145. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +17 -12
  146. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -1
  147. package/build/components/justify-content-control/ui.js +8 -1
  148. package/build/components/justify-content-control/ui.js.map +1 -1
  149. package/build/components/link-control/index.js +45 -17
  150. package/build/components/link-control/index.js.map +1 -1
  151. package/build/components/list-view/block.js +1 -1
  152. package/build/components/list-view/block.js.map +1 -1
  153. package/build/components/list-view/use-list-view-drop-zone.js +1 -1
  154. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  155. package/build/components/media-upload/index.native.js +4 -1
  156. package/build/components/media-upload/index.native.js.map +1 -1
  157. package/build/components/off-canvas-editor/appender.js +50 -3
  158. package/build/components/off-canvas-editor/appender.js.map +1 -1
  159. package/build/components/off-canvas-editor/block-contents.js +3 -1
  160. package/build/components/off-canvas-editor/block-contents.js.map +1 -1
  161. package/build/components/off-canvas-editor/block-select-button.js +10 -4
  162. package/build/components/off-canvas-editor/block-select-button.js.map +1 -1
  163. package/build/components/off-canvas-editor/block.js +6 -27
  164. package/build/components/off-canvas-editor/block.js.map +1 -1
  165. package/build/components/off-canvas-editor/branch.js +25 -10
  166. package/build/components/off-canvas-editor/branch.js.map +1 -1
  167. package/build/components/off-canvas-editor/index.js +27 -20
  168. package/build/components/off-canvas-editor/index.js.map +1 -1
  169. package/build/components/off-canvas-editor/link-ui.js +2 -2
  170. package/build/components/off-canvas-editor/link-ui.js.map +1 -1
  171. package/build/components/off-canvas-editor/use-list-view-drop-zone.js +1 -1
  172. package/build/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -1
  173. package/build/components/provider/index.js +21 -9
  174. package/build/components/provider/index.js.map +1 -1
  175. package/build/components/provider/index.native.js +5 -6
  176. package/build/components/provider/index.native.js.map +1 -1
  177. package/build/components/rich-text/use-before-input-rules.js +11 -3
  178. package/build/components/rich-text/use-before-input-rules.js.map +1 -1
  179. package/build/components/rich-text/utils.js +1 -1
  180. package/build/components/rich-text/utils.js.map +1 -1
  181. package/build/components/spacing-sizes-control/utils.js +2 -8
  182. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  183. package/build/components/tool-selector/index.js +3 -1
  184. package/build/components/tool-selector/index.js.map +1 -1
  185. package/build/components/url-popover/image-url-input-ui.js +7 -8
  186. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  187. package/build/components/use-block-display-information/index.js +1 -1
  188. package/build/components/use-block-display-information/index.js.map +1 -1
  189. package/build/experiments.js +45 -0
  190. package/build/experiments.js.map +1 -0
  191. package/build/experiments.native.js +40 -0
  192. package/build/experiments.native.js.map +1 -0
  193. package/build/hooks/anchor.js +2 -1
  194. package/build/hooks/anchor.js.map +1 -1
  195. package/build/hooks/border.js +1 -1
  196. package/build/hooks/border.js.map +1 -1
  197. package/build/hooks/child-layout.js +5 -1
  198. package/build/hooks/child-layout.js.map +1 -1
  199. package/build/hooks/color-panel.js +1 -1
  200. package/build/hooks/color-panel.js.map +1 -1
  201. package/build/hooks/color.js +3 -3
  202. package/build/hooks/color.js.map +1 -1
  203. package/build/hooks/custom-class-name.js +2 -1
  204. package/build/hooks/custom-class-name.js.map +1 -1
  205. package/build/hooks/dimensions.js +7 -5
  206. package/build/hooks/dimensions.js.map +1 -1
  207. package/build/hooks/margin.js +1 -0
  208. package/build/hooks/margin.js.map +1 -1
  209. package/build/hooks/padding.js +1 -0
  210. package/build/hooks/padding.js.map +1 -1
  211. package/build/hooks/position.js +39 -17
  212. package/build/hooks/position.js.map +1 -1
  213. package/build/hooks/typography.js +1 -1
  214. package/build/hooks/typography.js.map +1 -1
  215. package/build/hooks/use-color-props.js +3 -3
  216. package/build/hooks/use-color-props.js.map +1 -1
  217. package/build/hooks/utils.js +69 -3
  218. package/build/hooks/utils.js.map +1 -1
  219. package/build/index.js +10 -1
  220. package/build/index.js.map +1 -1
  221. package/build/layouts/constrained.js +3 -0
  222. package/build/layouts/constrained.js.map +1 -1
  223. package/build/layouts/flex.js +59 -9
  224. package/build/layouts/flex.js.map +1 -1
  225. package/build/layouts/flow.js +0 -18
  226. package/build/layouts/flow.js.map +1 -1
  227. package/build/store/actions.js +3 -30
  228. package/build/store/actions.js.map +1 -1
  229. package/build/store/defaults.js +5 -2
  230. package/build/store/defaults.js.map +1 -1
  231. package/build/store/index.js +11 -2
  232. package/build/store/index.js.map +1 -1
  233. package/build/store/private-actions.js +78 -0
  234. package/build/store/private-actions.js.map +1 -0
  235. package/build/store/private-selectors.js +32 -0
  236. package/build/store/private-selectors.js.map +1 -0
  237. package/build/store/reducer.js +1 -1
  238. package/build/store/reducer.js.map +1 -1
  239. package/build/store/selectors.js +60 -48
  240. package/build/store/selectors.js.map +1 -1
  241. package/build/utils/block-variation-transforms.js +1 -1
  242. package/build/utils/block-variation-transforms.js.map +1 -1
  243. package/build/utils/parse-css-unit-to-px.js +1 -1
  244. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  245. package/build/utils/transform-styles/index.js +1 -7
  246. package/build/utils/transform-styles/index.js.map +1 -1
  247. package/build-module/components/alignment-control/ui.js +1 -1
  248. package/build-module/components/alignment-control/ui.js.map +1 -1
  249. package/build-module/components/autocomplete/index.js +2 -6
  250. package/build-module/components/autocomplete/index.js.map +1 -1
  251. package/build-module/components/block-actions/index.js +7 -2
  252. package/build-module/components/block-actions/index.js.map +1 -1
  253. package/build-module/components/block-alignment-matrix-control/index.js +2 -2
  254. package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
  255. package/build-module/components/block-card/index.js +2 -4
  256. package/build-module/components/block-card/index.js.map +1 -1
  257. package/build-module/components/block-edit/index.js +7 -0
  258. package/build-module/components/block-edit/index.js.map +1 -1
  259. package/build-module/components/block-inspector/index.js +15 -14
  260. package/build-module/components/block-inspector/index.js.map +1 -1
  261. package/build-module/components/block-list/use-in-between-inserter.js +5 -0
  262. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  263. package/build-module/components/block-lock/modal.js +0 -1
  264. package/build-module/components/block-lock/modal.js.map +1 -1
  265. package/build-module/components/block-mover/mover-description.js +2 -2
  266. package/build-module/components/block-mover/mover-description.js.map +1 -1
  267. package/build-module/components/block-navigation/dropdown.js +3 -1
  268. package/build-module/components/block-navigation/dropdown.js.map +1 -1
  269. package/build-module/components/block-pattern-setup/index.js +1 -1
  270. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  271. package/build-module/components/block-pattern-setup/use-patterns-setup.js +2 -2
  272. package/build-module/components/block-pattern-setup/use-patterns-setup.js.map +1 -1
  273. package/build-module/components/block-patterns-list/index.js +32 -3
  274. package/build-module/components/block-patterns-list/index.js.map +1 -1
  275. package/build-module/components/block-preview/auto.js +9 -11
  276. package/build-module/components/block-preview/auto.js.map +1 -1
  277. package/build-module/components/block-preview/index.js +31 -8
  278. package/build-module/components/block-preview/index.js.map +1 -1
  279. package/build-module/components/block-selection-clearer/index.js +1 -1
  280. package/build-module/components/block-selection-clearer/index.js.map +1 -1
  281. package/build-module/components/block-settings/container.native.js +6 -30
  282. package/build-module/components/block-settings/container.native.js.map +1 -1
  283. package/build-module/components/block-settings-menu/block-settings-dropdown.js +12 -6
  284. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  285. package/build-module/components/block-settings-menu-controls/index.js +2 -7
  286. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  287. package/build-module/components/block-switcher/utils.js +1 -1
  288. package/build-module/components/block-switcher/utils.js.map +1 -1
  289. package/build-module/components/block-tools/selected-block-popover.js +55 -48
  290. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  291. package/build-module/components/block-vertical-alignment-control/icons.js +12 -0
  292. package/build-module/components/block-vertical-alignment-control/icons.js.map +1 -1
  293. package/build-module/components/block-vertical-alignment-control/ui.js +10 -5
  294. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  295. package/build-module/components/color-style-selector/index.js +3 -1
  296. package/build-module/components/color-style-selector/index.js.map +1 -1
  297. package/build-module/components/date-format-picker/index.js +4 -5
  298. package/build-module/components/date-format-picker/index.js.map +1 -1
  299. package/build-module/components/font-family/index.js +1 -6
  300. package/build-module/components/font-family/index.js.map +1 -1
  301. package/build-module/components/font-sizes/fluid-utils.js +1 -1
  302. package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
  303. package/build-module/components/font-sizes/utils.js +1 -1
  304. package/build-module/components/font-sizes/utils.js.map +1 -1
  305. package/build-module/components/global-styles/context.js +12 -0
  306. package/build-module/components/global-styles/context.js.map +1 -0
  307. package/build-module/components/global-styles/hooks.js +121 -0
  308. package/build-module/components/global-styles/hooks.js.map +1 -0
  309. package/build-module/components/global-styles/index.js +4 -0
  310. package/build-module/components/global-styles/index.js.map +1 -0
  311. package/build-module/components/global-styles/typography-utils.js +84 -0
  312. package/build-module/components/global-styles/typography-utils.js.map +1 -0
  313. package/build-module/components/global-styles/use-global-styles-output.js +930 -0
  314. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -0
  315. package/build-module/components/global-styles/utils.js +321 -0
  316. package/build-module/components/global-styles/utils.js.map +1 -0
  317. package/build-module/components/height-control/index.js +14 -1
  318. package/build-module/components/height-control/index.js.map +1 -1
  319. package/build-module/components/iframe/index.js +6 -4
  320. package/build-module/components/iframe/index.js.map +1 -1
  321. package/build-module/components/image-editor/constants.js +1 -1
  322. package/build-module/components/image-editor/constants.js.map +1 -1
  323. package/build-module/components/image-editor/context.js +1 -2
  324. package/build-module/components/image-editor/context.js.map +1 -1
  325. package/build-module/components/image-editor/cropper.js +3 -1
  326. package/build-module/components/image-editor/cropper.js.map +1 -1
  327. package/build-module/components/image-editor/index.js +13 -3
  328. package/build-module/components/image-editor/index.js.map +1 -1
  329. package/build-module/components/image-editor/use-transform-image.js +12 -37
  330. package/build-module/components/image-editor/use-transform-image.js.map +1 -1
  331. package/build-module/components/image-size-control/index.js +1 -6
  332. package/build-module/components/image-size-control/index.js.map +1 -1
  333. package/build-module/components/index.js +2 -3
  334. package/build-module/components/index.js.map +1 -1
  335. package/build-module/components/inner-blocks/index.js +21 -32
  336. package/build-module/components/inner-blocks/index.js.map +1 -1
  337. package/build-module/components/inner-blocks/index.native.js +9 -22
  338. package/build-module/components/inner-blocks/index.native.js.map +1 -1
  339. package/build-module/components/inner-blocks/use-block-context.js +43 -0
  340. package/build-module/components/inner-blocks/use-block-context.js.map +1 -0
  341. package/build-module/components/inserter/block-patterns-explorer/explorer.js +0 -1
  342. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
  343. package/build-module/components/inserter/block-patterns-tab.js +9 -2
  344. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  345. package/build-module/components/inserter/block-types-tab.js +3 -3
  346. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  347. package/build-module/components/inserter/hooks/use-patterns-state.js +1 -6
  348. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  349. package/build-module/components/inserter/index.js +5 -4
  350. package/build-module/components/inserter/index.js.map +1 -1
  351. package/build-module/components/inserter/media-tab/hooks.js +145 -56
  352. package/build-module/components/inserter/media-tab/hooks.js.map +1 -1
  353. package/build-module/components/inserter/media-tab/media-list.js +74 -24
  354. package/build-module/components/inserter/media-tab/media-list.js.map +1 -1
  355. package/build-module/components/inserter/media-tab/media-panel.js +14 -14
  356. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -1
  357. package/build-module/components/inserter/media-tab/media-tab.js +7 -4
  358. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -1
  359. package/build-module/components/inserter/media-tab/utils.js +27 -15
  360. package/build-module/components/inserter/media-tab/utils.js.map +1 -1
  361. package/build-module/components/inserter/menu.js +4 -0
  362. package/build-module/components/inserter/menu.js.map +1 -1
  363. package/build-module/components/inserter/preview-panel.js +5 -3
  364. package/build-module/components/inserter/preview-panel.js.map +1 -1
  365. package/build-module/components/inserter/search-results.js +2 -6
  366. package/build-module/components/inserter/search-results.js.map +1 -1
  367. package/build-module/components/inserter-list-item/index.js +1 -9
  368. package/build-module/components/inserter-list-item/index.js.map +1 -1
  369. package/build-module/components/inspector-controls/fill.js +14 -2
  370. package/build-module/components/inspector-controls/fill.js.map +1 -1
  371. package/build-module/components/inspector-controls/fill.native.js +13 -1
  372. package/build-module/components/inspector-controls/fill.native.js.map +1 -1
  373. package/build-module/components/inspector-controls/groups.js +4 -0
  374. package/build-module/components/inspector-controls/groups.js.map +1 -1
  375. package/build-module/components/inspector-controls/index.js +2 -2
  376. package/build-module/components/inspector-controls/index.js.map +1 -1
  377. package/build-module/components/inspector-controls/slot.js +13 -1
  378. package/build-module/components/inspector-controls/slot.js.map +1 -1
  379. package/build-module/components/inspector-controls/slot.native.js +13 -1
  380. package/build-module/components/inspector-controls/slot.native.js.map +1 -1
  381. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js +1 -1
  382. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -1
  383. package/build-module/components/inspector-controls-tabs/index.js +2 -2
  384. package/build-module/components/inspector-controls-tabs/index.js.map +1 -1
  385. package/build-module/components/inspector-controls-tabs/position-controls-panel.js +1 -1
  386. package/build-module/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  387. package/build-module/components/inspector-controls-tabs/styles-tab.js +6 -4
  388. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  389. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +17 -12
  390. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -1
  391. package/build-module/components/justify-content-control/ui.js +9 -2
  392. package/build-module/components/justify-content-control/ui.js.map +1 -1
  393. package/build-module/components/link-control/index.js +45 -16
  394. package/build-module/components/link-control/index.js.map +1 -1
  395. package/build-module/components/list-view/block.js +1 -1
  396. package/build-module/components/list-view/block.js.map +1 -1
  397. package/build-module/components/list-view/use-list-view-drop-zone.js +1 -1
  398. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  399. package/build-module/components/media-upload/index.native.js +4 -1
  400. package/build-module/components/media-upload/index.native.js.map +1 -1
  401. package/build-module/components/off-canvas-editor/appender.js +47 -4
  402. package/build-module/components/off-canvas-editor/appender.js.map +1 -1
  403. package/build-module/components/off-canvas-editor/block-contents.js +2 -1
  404. package/build-module/components/off-canvas-editor/block-contents.js.map +1 -1
  405. package/build-module/components/off-canvas-editor/block-select-button.js +9 -4
  406. package/build-module/components/off-canvas-editor/block-select-button.js.map +1 -1
  407. package/build-module/components/off-canvas-editor/block.js +6 -25
  408. package/build-module/components/off-canvas-editor/block.js.map +1 -1
  409. package/build-module/components/off-canvas-editor/branch.js +23 -11
  410. package/build-module/components/off-canvas-editor/branch.js.map +1 -1
  411. package/build-module/components/off-canvas-editor/index.js +27 -19
  412. package/build-module/components/off-canvas-editor/index.js.map +1 -1
  413. package/build-module/components/off-canvas-editor/link-ui.js +2 -2
  414. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -1
  415. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js +1 -1
  416. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -1
  417. package/build-module/components/provider/index.js +16 -9
  418. package/build-module/components/provider/index.js.map +1 -1
  419. package/build-module/components/provider/index.native.js +4 -4
  420. package/build-module/components/provider/index.native.js.map +1 -1
  421. package/build-module/components/rich-text/use-before-input-rules.js +10 -2
  422. package/build-module/components/rich-text/use-before-input-rules.js.map +1 -1
  423. package/build-module/components/rich-text/utils.js +1 -1
  424. package/build-module/components/rich-text/utils.js.map +1 -1
  425. package/build-module/components/spacing-sizes-control/utils.js +2 -7
  426. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  427. package/build-module/components/tool-selector/index.js +3 -1
  428. package/build-module/components/tool-selector/index.js.map +1 -1
  429. package/build-module/components/url-popover/image-url-input-ui.js +8 -8
  430. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  431. package/build-module/components/use-block-display-information/index.js +1 -1
  432. package/build-module/components/use-block-display-information/index.js.map +1 -1
  433. package/build-module/experiments.js +25 -0
  434. package/build-module/experiments.js.map +1 -0
  435. package/build-module/experiments.native.js +23 -0
  436. package/build-module/experiments.native.js.map +1 -0
  437. package/build-module/hooks/anchor.js +2 -1
  438. package/build-module/hooks/anchor.js.map +1 -1
  439. package/build-module/hooks/border.js +1 -1
  440. package/build-module/hooks/border.js.map +1 -1
  441. package/build-module/hooks/child-layout.js +5 -1
  442. package/build-module/hooks/child-layout.js.map +1 -1
  443. package/build-module/hooks/color-panel.js +1 -1
  444. package/build-module/hooks/color-panel.js.map +1 -1
  445. package/build-module/hooks/color.js +3 -3
  446. package/build-module/hooks/color.js.map +1 -1
  447. package/build-module/hooks/custom-class-name.js +2 -1
  448. package/build-module/hooks/custom-class-name.js.map +1 -1
  449. package/build-module/hooks/dimensions.js +6 -5
  450. package/build-module/hooks/dimensions.js.map +1 -1
  451. package/build-module/hooks/margin.js +1 -0
  452. package/build-module/hooks/margin.js.map +1 -1
  453. package/build-module/hooks/padding.js +1 -0
  454. package/build-module/hooks/padding.js.map +1 -1
  455. package/build-module/hooks/position.js +36 -16
  456. package/build-module/hooks/position.js.map +1 -1
  457. package/build-module/hooks/typography.js +1 -1
  458. package/build-module/hooks/typography.js.map +1 -1
  459. package/build-module/hooks/use-color-props.js +3 -3
  460. package/build-module/hooks/use-color-props.js.map +1 -1
  461. package/build-module/hooks/utils.js +70 -4
  462. package/build-module/hooks/utils.js.map +1 -1
  463. package/build-module/index.js +1 -0
  464. package/build-module/index.js.map +1 -1
  465. package/build-module/layouts/constrained.js +3 -0
  466. package/build-module/layouts/constrained.js.map +1 -1
  467. package/build-module/layouts/flex.js +60 -10
  468. package/build-module/layouts/flex.js.map +1 -1
  469. package/build-module/layouts/flow.js +0 -18
  470. package/build-module/layouts/flow.js.map +1 -1
  471. package/build-module/store/actions.js +2 -26
  472. package/build-module/store/actions.js.map +1 -1
  473. package/build-module/store/defaults.js +5 -2
  474. package/build-module/store/defaults.js.map +1 -1
  475. package/build-module/store/index.js +8 -2
  476. package/build-module/store/index.js.map +1 -1
  477. package/build-module/store/private-actions.js +66 -0
  478. package/build-module/store/private-actions.js.map +1 -0
  479. package/build-module/store/private-selectors.js +23 -0
  480. package/build-module/store/private-selectors.js.map +1 -0
  481. package/build-module/store/reducer.js +1 -1
  482. package/build-module/store/reducer.js.map +1 -1
  483. package/build-module/store/selectors.js +48 -37
  484. package/build-module/store/selectors.js.map +1 -1
  485. package/build-module/utils/block-variation-transforms.js +1 -1
  486. package/build-module/utils/block-variation-transforms.js.map +1 -1
  487. package/build-module/utils/parse-css-unit-to-px.js +1 -1
  488. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  489. package/build-module/utils/transform-styles/index.js +1 -6
  490. package/build-module/utils/transform-styles/index.js.map +1 -1
  491. package/build-style/content-rtl.css +283 -3
  492. package/build-style/content.css +283 -3
  493. package/build-style/style-rtl.css +105 -221
  494. package/build-style/style.css +105 -221
  495. package/package.json +30 -29
  496. package/src/components/alignment-control/test/__snapshots__/index.js.snap +3 -3
  497. package/src/components/alignment-control/test/index.js +5 -15
  498. package/src/components/alignment-control/ui.js +1 -1
  499. package/src/components/autocomplete/index.js +3 -6
  500. package/src/components/block-actions/index.js +9 -0
  501. package/src/components/block-alignment-control/test/index.js +3 -11
  502. package/src/components/block-alignment-matrix-control/index.js +1 -2
  503. package/src/components/block-card/index.js +1 -4
  504. package/src/components/block-content-overlay/content.scss +4 -4
  505. package/src/components/block-edit/index.js +15 -1
  506. package/src/components/block-icon/content.scss +31 -0
  507. package/src/components/block-inspector/index.js +13 -17
  508. package/src/components/block-list/use-in-between-inserter.js +5 -0
  509. package/src/components/block-lock/modal.js +0 -1
  510. package/src/components/block-mover/mover-description.js +2 -2
  511. package/src/components/block-mover/stories/index.js +3 -3
  512. package/src/components/block-navigation/dropdown.js +1 -1
  513. package/src/components/block-pattern-setup/index.js +1 -4
  514. package/src/components/block-pattern-setup/use-patterns-setup.js +2 -5
  515. package/src/components/block-patterns-list/index.js +29 -3
  516. package/src/components/block-preview/README.md +9 -9
  517. package/src/components/block-preview/auto.js +9 -11
  518. package/src/components/block-preview/content.scss +23 -0
  519. package/src/components/block-preview/index.js +40 -10
  520. package/src/components/block-preview/style.scss +0 -23
  521. package/src/components/block-selection-clearer/index.js +1 -1
  522. package/src/components/block-selection-clearer/test/index.js +6 -6
  523. package/src/components/block-settings/container.native.js +7 -26
  524. package/src/components/block-settings-menu/block-settings-dropdown.js +13 -5
  525. package/src/components/block-settings-menu-controls/index.js +2 -10
  526. package/src/components/block-switcher/test/index.js +43 -44
  527. package/src/components/block-switcher/utils.js +1 -1
  528. package/src/components/block-tools/selected-block-popover.js +77 -80
  529. package/src/components/block-tools/style.scss +0 -1
  530. package/src/components/block-variation-picker/{style.scss → content.scss} +0 -0
  531. package/src/components/block-vertical-alignment-control/icons.js +12 -0
  532. package/src/components/block-vertical-alignment-control/test/index.js +3 -11
  533. package/src/components/block-vertical-alignment-control/ui.js +16 -6
  534. package/src/components/color-style-selector/index.js +1 -1
  535. package/src/components/colors/test/with-colors.js +2 -8
  536. package/src/components/date-format-picker/index.js +23 -24
  537. package/src/components/date-format-picker/style.scss +0 -6
  538. package/src/components/default-block-appender/content.scss +18 -0
  539. package/src/components/default-block-appender/test/index.js +2 -8
  540. package/src/components/font-family/index.js +1 -6
  541. package/src/components/font-sizes/fluid-utils.js +1 -1
  542. package/src/components/font-sizes/utils.js +1 -1
  543. package/src/components/global-styles/README.md +77 -0
  544. package/src/components/global-styles/context.js +15 -0
  545. package/src/components/global-styles/hooks.js +145 -0
  546. package/src/components/global-styles/index.js +7 -0
  547. package/src/components/global-styles/test/typography-utils.js +393 -0
  548. package/src/components/global-styles/test/use-global-styles-output.js +814 -0
  549. package/src/components/global-styles/test/utils.js +206 -0
  550. package/src/components/global-styles/typography-utils.js +87 -0
  551. package/src/components/global-styles/use-global-styles-output.js +1088 -0
  552. package/src/components/global-styles/utils.js +373 -0
  553. package/src/components/height-control/README.md +55 -0
  554. package/src/components/height-control/index.js +13 -1
  555. package/src/components/iframe/index.js +8 -2
  556. package/src/components/image-editor/constants.js +1 -1
  557. package/src/components/image-editor/context.js +5 -9
  558. package/src/components/image-editor/cropper.js +3 -1
  559. package/src/components/image-editor/index.js +13 -4
  560. package/src/components/image-editor/use-transform-image.js +14 -55
  561. package/src/components/image-size-control/index.js +1 -6
  562. package/src/components/index.js +2 -6
  563. package/src/components/inner-blocks/index.js +29 -33
  564. package/src/components/inner-blocks/index.native.js +27 -47
  565. package/src/components/inner-blocks/use-block-context.js +47 -0
  566. package/src/components/inserter/block-patterns-explorer/explorer.js +0 -1
  567. package/src/components/inserter/block-patterns-tab.js +9 -1
  568. package/src/components/inserter/block-types-tab.js +3 -4
  569. package/src/components/inserter/hooks/use-patterns-state.js +1 -6
  570. package/src/components/inserter/index.js +3 -4
  571. package/src/components/inserter/media-tab/hooks.js +167 -65
  572. package/src/components/inserter/media-tab/media-list.js +94 -26
  573. package/src/components/inserter/media-tab/media-panel.js +9 -20
  574. package/src/components/inserter/media-tab/media-tab.js +12 -4
  575. package/src/components/inserter/media-tab/utils.js +20 -10
  576. package/src/components/inserter/menu.js +8 -0
  577. package/src/components/inserter/preview-panel.js +4 -2
  578. package/src/components/inserter/search-results.js +2 -6
  579. package/src/components/inserter/stories/index.js +9 -9
  580. package/src/components/inserter/style.scss +58 -11
  581. package/src/components/inserter-list-item/index.js +0 -7
  582. package/src/components/inspector-controls/README.md +3 -7
  583. package/src/components/inspector-controls/fill.js +15 -1
  584. package/src/components/inspector-controls/fill.native.js +14 -1
  585. package/src/components/inspector-controls/groups.js +3 -0
  586. package/src/components/inspector-controls/index.js +2 -6
  587. package/src/components/inspector-controls/slot.js +14 -1
  588. package/src/components/inspector-controls/slot.native.js +14 -1
  589. package/src/components/inspector-controls-tabs/advanced-controls-panel.js +1 -1
  590. package/src/components/inspector-controls-tabs/index.js +2 -4
  591. package/src/components/inspector-controls-tabs/position-controls-panel.js +1 -1
  592. package/src/components/inspector-controls-tabs/styles-tab.js +5 -7
  593. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +21 -10
  594. package/src/components/justify-content-control/ui.js +9 -0
  595. package/src/components/link-control/index.js +59 -23
  596. package/src/components/link-control/style.scss +7 -24
  597. package/src/components/link-control/test/index.js +134 -5
  598. package/src/components/list-view/block.js +1 -1
  599. package/src/components/list-view/use-list-view-drop-zone.js +1 -1
  600. package/src/components/media-replace-flow/test/index.js +4 -12
  601. package/src/components/media-upload/index.native.js +2 -2
  602. package/src/components/off-canvas-editor/README.md +2 -2
  603. package/src/components/off-canvas-editor/appender.js +93 -37
  604. package/src/components/off-canvas-editor/block-contents.js +2 -1
  605. package/src/components/off-canvas-editor/block-select-button.js +12 -1
  606. package/src/components/off-canvas-editor/block.js +3 -42
  607. package/src/components/off-canvas-editor/branch.js +32 -5
  608. package/src/components/off-canvas-editor/index.js +20 -20
  609. package/src/components/off-canvas-editor/link-ui.js +2 -2
  610. package/src/components/off-canvas-editor/style.scss +5 -1
  611. package/src/components/off-canvas-editor/use-list-view-drop-zone.js +1 -1
  612. package/src/components/provider/index.js +33 -14
  613. package/src/components/provider/index.native.js +4 -3
  614. package/src/components/provider/test/experimental-provider.js +94 -0
  615. package/src/components/provider/test/use-block-sync.js +10 -0
  616. package/src/components/responsive-block-control/test/index.js +1 -5
  617. package/src/components/rich-text/use-before-input-rules.js +10 -2
  618. package/src/components/rich-text/utils.js +1 -1
  619. package/src/components/spacing-sizes-control/utils.js +2 -7
  620. package/src/components/tool-selector/index.js +1 -1
  621. package/src/components/url-input/test/button.js +24 -24
  622. package/src/components/url-popover/image-url-input-ui.js +7 -8
  623. package/src/components/url-popover/style.scss +0 -10
  624. package/src/components/use-block-display-information/index.js +1 -1
  625. package/src/components/warning/{style.scss → content.scss} +0 -0
  626. package/src/components/warning/test/index.js +1 -5
  627. package/src/content.scss +7 -0
  628. package/src/experiments.js +27 -0
  629. package/src/experiments.native.js +25 -0
  630. package/src/hooks/anchor.js +2 -1
  631. package/src/hooks/border.js +1 -1
  632. package/src/hooks/child-layout.js +6 -1
  633. package/src/hooks/color-panel.js +1 -1
  634. package/src/hooks/color.js +3 -3
  635. package/src/hooks/custom-class-name.js +2 -1
  636. package/src/hooks/dimensions.js +6 -6
  637. package/src/hooks/layout.scss +4 -0
  638. package/src/hooks/margin.js +1 -0
  639. package/src/hooks/padding.js +1 -0
  640. package/src/hooks/position.js +56 -36
  641. package/src/hooks/test/align.native.js +1 -1
  642. package/src/hooks/test/utils.js +104 -0
  643. package/src/hooks/typography.js +1 -1
  644. package/src/hooks/use-color-props.js +3 -3
  645. package/src/hooks/utils.js +68 -2
  646. package/src/index.js +1 -0
  647. package/src/layouts/constrained.js +3 -0
  648. package/src/layouts/flex.js +66 -14
  649. package/src/layouts/flow.js +0 -9
  650. package/src/store/actions.js +2 -26
  651. package/src/store/defaults.js +7 -2
  652. package/src/store/index.js +8 -2
  653. package/src/store/private-actions.js +65 -0
  654. package/src/store/private-selectors.js +20 -0
  655. package/src/store/reducer.js +1 -1
  656. package/src/store/selectors.js +103 -62
  657. package/src/store/test/actions.js +0 -18
  658. package/src/store/test/private-actions.js +22 -0
  659. package/src/store/test/private-selectors.js +52 -0
  660. package/src/store/test/selectors.js +52 -54
  661. package/src/style.scss +3 -5
  662. package/src/utils/block-variation-transforms.js +1 -1
  663. package/src/utils/parse-css-unit-to-px.js +3 -1
  664. package/src/utils/test/parse-css-unit-to-px.js +16 -24
  665. package/src/utils/transform-styles/index.js +1 -6
  666. package/build/components/inner-blocks/get-block-context.js +0 -45
  667. package/build/components/inner-blocks/get-block-context.js.map +0 -1
  668. package/build/components/off-canvas-editor/block-edit-button.js +0 -50
  669. package/build/components/off-canvas-editor/block-edit-button.js.map +0 -1
  670. package/build-module/components/inner-blocks/get-block-context.js +0 -37
  671. package/build-module/components/inner-blocks/get-block-context.js.map +0 -1
  672. package/build-module/components/off-canvas-editor/block-edit-button.js +0 -35
  673. package/build-module/components/off-canvas-editor/block-edit-button.js.map +0 -1
  674. package/src/components/inner-blocks/get-block-context.js +0 -39
  675. package/src/components/off-canvas-editor/block-edit-button.js +0 -27
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { __ } from '@wordpress/i18n';
5
- import { useEffect, useState } from '@wordpress/element';
4
+ import { useEffect, useState, useRef, useMemo } from '@wordpress/element';
6
5
  import { useSelect } from '@wordpress/data';
7
6
 
8
7
  /**
@@ -10,80 +9,183 @@ import { useSelect } from '@wordpress/data';
10
9
  */
11
10
  import { store as blockEditorStore } from '../../../store';
12
11
 
13
- export function useMediaResults( options = {} ) {
14
- const [ results, setResults ] = useState();
15
- const settings = useSelect(
16
- ( select ) => select( blockEditorStore ).getSettings(),
17
- []
18
- );
12
+ /**
13
+ * Interface for inserter media requests.
14
+ *
15
+ * @typedef {Object} InserterMediaRequest
16
+ * @property {number} per_page How many items to fetch per page.
17
+ * @property {string} search The search term to use for filtering the results.
18
+ */
19
+
20
+ /**
21
+ * Interface for inserter media responses. Any media resource should
22
+ * map their response to this interface, in order to create the core
23
+ * WordPress media blocks (image, video, audio).
24
+ *
25
+ * @typedef {Object} InserterMediaItem
26
+ * @property {string} title The title of the media item.
27
+ * @property {string} url The source url of the media item.
28
+ * @property {string} [previewUrl] The preview source url of the media item to display in the media list.
29
+ * @property {number} [id] The WordPress id of the media item.
30
+ * @property {number|string} [sourceId] The id of the media item from external source.
31
+ * @property {string} [alt] The alt text of the media item.
32
+ * @property {string} [caption] The caption of the media item.
33
+ */
34
+
35
+ /**
36
+ * Fetches media items based on the provided category.
37
+ * Each media category is responsible for providing a `fetch` function.
38
+ *
39
+ * @param {Object} category The media category to fetch results for.
40
+ * @param {InserterMediaRequest} query The query args to use for the request.
41
+ * @return {InserterMediaItem[]} The media results.
42
+ */
43
+ export function useMediaResults( category, query = {} ) {
44
+ const [ mediaList, setMediaList ] = useState();
45
+ const [ isLoading, setIsLoading ] = useState( false );
46
+ // We need to keep track of the last request made because
47
+ // multiple request can be fired without knowing the order
48
+ // of resolution, and we need to ensure we are showing
49
+ // the results of the last request.
50
+ // In the future we could use AbortController to cancel previous
51
+ // requests, but we don't for now as it involves adding support
52
+ // for this to `core-data` package.
53
+ const lastRequest = useRef();
19
54
  useEffect( () => {
20
55
  ( async () => {
21
- setResults();
22
- const _media = await settings?.__unstableFetchMedia( options );
23
- if ( _media ) setResults( _media );
56
+ const key = JSON.stringify( {
57
+ category: category.name,
58
+ ...query,
59
+ } );
60
+ lastRequest.current = key;
61
+ setIsLoading( true );
62
+ setMediaList( [] ); // Empty the previous results.
63
+ const _media = await category.fetch?.( query );
64
+ if ( key === lastRequest.current ) {
65
+ setMediaList( _media );
66
+ setIsLoading( false );
67
+ }
24
68
  } )();
25
- }, Object.values( options ) );
26
- return results;
69
+ }, [ category.name, ...Object.values( query ) ] );
70
+ return { mediaList, isLoading };
71
+ }
72
+
73
+ function useInserterMediaCategories() {
74
+ const {
75
+ inserterMediaCategories,
76
+ allowedMimeTypes,
77
+ enableOpenverseMediaCategory,
78
+ } = useSelect( ( select ) => {
79
+ const settings = select( blockEditorStore ).getSettings();
80
+ return {
81
+ inserterMediaCategories: settings.inserterMediaCategories,
82
+ allowedMimeTypes: settings.allowedMimeTypes,
83
+ enableOpenverseMediaCategory: settings.enableOpenverseMediaCategory,
84
+ };
85
+ }, [] );
86
+ // The allowed `mime_types` can be altered by `upload_mimes` filter and restrict
87
+ // some of them. In this case we shouldn't add the category to the available media
88
+ // categories list in the inserter.
89
+ const allowedCategories = useMemo( () => {
90
+ if ( ! inserterMediaCategories || ! allowedMimeTypes ) {
91
+ return;
92
+ }
93
+ return inserterMediaCategories.filter( ( category ) => {
94
+ // Check if Openverse category is enabled.
95
+ if (
96
+ ! enableOpenverseMediaCategory &&
97
+ category.name === 'openverse'
98
+ ) {
99
+ return false;
100
+ }
101
+ // When a category has set `isExternalResource` to `true`, we
102
+ // don't need to check for allowed mime types, as they are used
103
+ // for restricting uploads for this media type and not for
104
+ // inserting media from external sources.
105
+ if ( category.isExternalResource ) {
106
+ return true;
107
+ }
108
+ return Object.values( allowedMimeTypes ).some( ( mimeType ) =>
109
+ mimeType.startsWith( `${ category.mediaType }/` )
110
+ );
111
+ } );
112
+ }, [
113
+ inserterMediaCategories,
114
+ allowedMimeTypes,
115
+ enableOpenverseMediaCategory,
116
+ ] );
117
+ return allowedCategories;
27
118
  }
28
119
 
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
120
  export function useMediaCategories( rootClientId ) {
35
121
  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
- );
122
+ const { canInsertImage, canInsertVideo, canInsertAudio } = useSelect(
123
+ ( select ) => {
124
+ const { canInsertBlockType } = select( blockEditorStore );
125
+ return {
126
+ canInsertImage: canInsertBlockType(
127
+ 'core/image',
128
+ rootClientId
129
+ ),
130
+ canInsertVideo: canInsertBlockType(
131
+ 'core/video',
132
+ rootClientId
133
+ ),
134
+ canInsertAudio: canInsertBlockType(
135
+ 'core/audio',
136
+ rootClientId
137
+ ),
138
+ };
139
+ },
140
+ [ rootClientId ]
141
+ );
142
+ const inserterMediaCategories = useInserterMediaCategories();
59
143
  useEffect( () => {
60
144
  ( 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.allSettled( [
70
- fetchMedia( { ...query, media_type: 'image' } ),
71
- fetchMedia( { ...query, media_type: 'video' } ),
72
- fetchMedia( { ...query, media_type: 'audio' } ),
73
- ] );
74
- // The `value` property is only present if the promise's status is "fulfilled".
75
- const showImage = canInsertImage && !! image.value?.length;
76
- const showVideo = canInsertVideo && !! video.value?.length;
77
- const showAudio = canInsertAudio && !! audio.value?.length;
78
- setCategories(
79
- MEDIA_CATEGORIES.filter(
80
- ( { mediaType } ) =>
81
- ( mediaType === 'image' && showImage ) ||
82
- ( mediaType === 'video' && showVideo ) ||
83
- ( mediaType === 'audio' && showAudio )
145
+ const _categories = [];
146
+ // If `inserterMediaCategories` is not defined in
147
+ // block editor settings, do not show any media categories.
148
+ if ( ! inserterMediaCategories ) {
149
+ return;
150
+ }
151
+ // Loop through categories to check if they have at least one media item.
152
+ const categoriesHaveMedia = new Map(
153
+ await Promise.all(
154
+ inserterMediaCategories.map( async ( category ) => {
155
+ // Some sources are external and we don't need to make a request.
156
+ if ( category.isExternalResource ) {
157
+ return [ category.name, true ];
158
+ }
159
+ const results = await category.fetch( { per_page: 1 } );
160
+ return [ category.name, !! results.length ];
161
+ } )
84
162
  )
85
163
  );
164
+ // We need to filter out categories that don't have any media items or
165
+ // whose corresponding block type is not allowed to be inserted, based
166
+ // on the category's `mediaType`.
167
+ const canInsertMediaType = {
168
+ image: canInsertImage,
169
+ video: canInsertVideo,
170
+ audio: canInsertAudio,
171
+ };
172
+ inserterMediaCategories.forEach( ( category ) => {
173
+ if (
174
+ canInsertMediaType[ category.mediaType ] &&
175
+ categoriesHaveMedia.get( category.name )
176
+ ) {
177
+ _categories.push( category );
178
+ }
179
+ } );
180
+ if ( !! _categories.length ) {
181
+ setCategories( _categories );
182
+ }
86
183
  } )();
87
- }, [ canInsertImage, canInsertVideo, canInsertAudio, fetchMedia ] );
184
+ }, [
185
+ canInsertImage,
186
+ canInsertVideo,
187
+ canInsertAudio,
188
+ inserterMediaCategories,
189
+ ] );
88
190
  return categories;
89
191
  }
@@ -1,3 +1,8 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classnames from 'classnames';
5
+
1
6
  /**
2
7
  * WordPress dependencies
3
8
  */
@@ -6,10 +11,14 @@ import {
6
11
  __unstableUseCompositeState as useCompositeState,
7
12
  __unstableCompositeItem as CompositeItem,
8
13
  Tooltip,
14
+ DropdownMenu,
15
+ MenuGroup,
16
+ MenuItem,
9
17
  } from '@wordpress/components';
10
- import { __ } from '@wordpress/i18n';
11
- import { useMemo, useCallback } from '@wordpress/element';
18
+ import { __, sprintf } from '@wordpress/i18n';
19
+ import { useMemo, useCallback, useState } from '@wordpress/element';
12
20
  import { cloneBlock } from '@wordpress/blocks';
21
+ import { moreVertical, external } from '@wordpress/icons';
13
22
 
14
23
  /**
15
24
  * Internal dependencies
@@ -17,39 +26,98 @@ import { cloneBlock } from '@wordpress/blocks';
17
26
  import InserterDraggableBlocks from '../../inserter-draggable-blocks';
18
27
  import { getBlockAndPreviewFromMedia } from './utils';
19
28
 
20
- function MediaPreview( { media, onClick, composite, mediaType } ) {
29
+ const MAXIMUM_TITLE_LENGTH = 25;
30
+ const MEDIA_OPTIONS_POPOVER_PROPS = {
31
+ position: 'bottom left',
32
+ className:
33
+ 'block-editor-inserter__media-list__item-preview-options__popover',
34
+ };
35
+
36
+ function MediaPreviewOptions( { category, media } ) {
37
+ if ( ! category.getReportUrl ) {
38
+ return null;
39
+ }
40
+ const reportUrl = category.getReportUrl( media );
41
+ return (
42
+ <DropdownMenu
43
+ className="block-editor-inserter__media-list__item-preview-options"
44
+ label={ __( 'Options' ) }
45
+ popoverProps={ MEDIA_OPTIONS_POPOVER_PROPS }
46
+ icon={ moreVertical }
47
+ >
48
+ { () => (
49
+ <MenuGroup>
50
+ <MenuItem
51
+ onClick={ () =>
52
+ window.open( reportUrl, '_blank' ).focus()
53
+ }
54
+ icon={ external }
55
+ >
56
+ { sprintf(
57
+ /* translators: %s: The media type to report e.g: "image", "video", "audio" */
58
+ __( 'Report %s' ),
59
+ category.mediaType
60
+ ) }
61
+ </MenuItem>
62
+ </MenuGroup>
63
+ ) }
64
+ </DropdownMenu>
65
+ );
66
+ }
67
+
68
+ function MediaPreview( { media, onClick, composite, category } ) {
69
+ const [ isHovered, setIsHovered ] = useState( false );
21
70
  const [ block, preview ] = useMemo(
22
- () => getBlockAndPreviewFromMedia( media, mediaType ),
23
- [ media, mediaType ]
71
+ () => getBlockAndPreviewFromMedia( media, category.mediaType ),
72
+ [ media, category.mediaType ]
24
73
  );
25
74
  const title = media.title?.rendered || media.title;
26
- const baseCssClass = 'block-editor-inserter__media-list';
75
+ let truncatedTitle;
76
+ if ( title.length > MAXIMUM_TITLE_LENGTH ) {
77
+ const omission = '...';
78
+ truncatedTitle =
79
+ title.slice( 0, MAXIMUM_TITLE_LENGTH - omission.length ) + omission;
80
+ }
81
+ const onMouseEnter = useCallback( () => setIsHovered( true ), [] );
82
+ const onMouseLeave = useCallback( () => setIsHovered( false ), [] );
27
83
  return (
28
84
  <InserterDraggableBlocks isEnabled={ true } blocks={ [ block ] }>
29
85
  { ( { draggable, onDragStart, onDragEnd } ) => (
30
86
  <div
31
- className={ `${ baseCssClass }__list-item` }
87
+ className={ classnames(
88
+ 'block-editor-inserter__media-list__list-item',
89
+ {
90
+ 'is-hovered': isHovered,
91
+ }
92
+ ) }
32
93
  draggable={ draggable }
33
94
  onDragStart={ onDragStart }
34
95
  onDragEnd={ onDragEnd }
35
96
  >
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 }
97
+ <Tooltip text={ truncatedTitle || title }>
98
+ { /* Adding `is-hovered` class to the wrapper element is needed
99
+ because the options Popover is rendered outside of this node. */ }
100
+ <div
101
+ onMouseEnter={ onMouseEnter }
102
+ onMouseLeave={ onMouseLeave }
46
103
  >
47
- <div
48
- className={ `${ baseCssClass }__item-preview` }
104
+ <CompositeItem
105
+ role="option"
106
+ as="div"
107
+ { ...composite }
108
+ className="block-editor-inserter__media-list__item"
109
+ onClick={ () => onClick( block ) }
110
+ aria-label={ title }
49
111
  >
50
- { preview }
51
- </div>
52
- </CompositeItem>
112
+ <div className="block-editor-inserter__media-list__item-preview">
113
+ { preview }
114
+ </div>
115
+ </CompositeItem>
116
+ <MediaPreviewOptions
117
+ category={ category }
118
+ media={ media }
119
+ />
120
+ </div>
53
121
  </Tooltip>
54
122
  </div>
55
123
  ) }
@@ -59,7 +127,7 @@ function MediaPreview( { media, onClick, composite, mediaType } ) {
59
127
 
60
128
  function MediaList( {
61
129
  mediaList,
62
- mediaType,
130
+ category,
63
131
  onClick,
64
132
  label = __( 'Media List' ),
65
133
  } ) {
@@ -77,11 +145,11 @@ function MediaList( {
77
145
  className="block-editor-inserter__media-list"
78
146
  aria-label={ label }
79
147
  >
80
- { mediaList.map( ( media ) => (
148
+ { mediaList.map( ( media, index ) => (
81
149
  <MediaPreview
82
- key={ media.id }
150
+ key={ media.id || media.sourceId || index }
83
151
  media={ media }
84
- mediaType={ mediaType }
152
+ category={ category }
85
153
  onClick={ onPreviewClick }
86
154
  composite={ composite }
87
155
  />
@@ -4,7 +4,7 @@
4
4
  import { useRef, useEffect } from '@wordpress/element';
5
5
  import { Spinner, SearchControl } from '@wordpress/components';
6
6
  import { focus } from '@wordpress/dom';
7
- import { __, sprintf } from '@wordpress/i18n';
7
+ import { __ } from '@wordpress/i18n';
8
8
 
9
9
  /**
10
10
  * Internal dependencies
@@ -38,44 +38,33 @@ export function MediaCategoryDialog( { rootClientId, onInsert, category } ) {
38
38
 
39
39
  export function MediaCategoryPanel( { rootClientId, onInsert, category } ) {
40
40
  const [ search, setSearch, debouncedSearch ] = useDebouncedInput();
41
- const mediaList = useMediaResults( {
41
+ const { mediaList, isLoading } = useMediaResults( category, {
42
42
  per_page: !! debouncedSearch ? 20 : INITIAL_MEDIA_ITEMS_PER_PAGE,
43
- media_type: category.mediaType,
44
43
  search: debouncedSearch,
45
- orderBy: !! debouncedSearch ? 'relevance' : 'date',
46
44
  } );
47
45
  const baseCssClass = 'block-editor-inserter__media-panel';
46
+ const searchLabel = category.labels.search_items || __( 'Search' );
48
47
  return (
49
48
  <div className={ baseCssClass }>
50
49
  <SearchControl
51
50
  className={ `${ baseCssClass }-search` }
52
51
  onChange={ setSearch }
53
52
  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
- ) }
53
+ label={ searchLabel }
54
+ placeholder={ searchLabel }
64
55
  />
65
- { ! mediaList && (
56
+ { isLoading && (
66
57
  <div className={ `${ baseCssClass }-spinner` }>
67
58
  <Spinner />
68
59
  </div>
69
60
  ) }
70
- { Array.isArray( mediaList ) && ! mediaList.length && (
71
- <InserterNoResults />
72
- ) }
73
- { !! mediaList?.length && (
61
+ { ! isLoading && ! mediaList?.length && <InserterNoResults /> }
62
+ { ! isLoading && !! mediaList?.length && (
74
63
  <MediaList
75
64
  rootClientId={ rootClientId }
76
65
  onClick={ onInsert }
77
66
  mediaList={ mediaList }
78
- mediaType={ category.mediaType }
67
+ category={ category }
79
68
  />
80
69
  ) }
81
70
  </div>
@@ -15,7 +15,7 @@ import {
15
15
  FlexBlock,
16
16
  Button,
17
17
  } from '@wordpress/components';
18
- import { useCallback } from '@wordpress/element';
18
+ import { useCallback, useMemo } from '@wordpress/element';
19
19
  import { Icon, chevronRight } from '@wordpress/icons';
20
20
 
21
21
  /**
@@ -49,6 +49,14 @@ function MediaTab( {
49
49
  },
50
50
  [ onInsert ]
51
51
  );
52
+ const mobileMediaCategories = useMemo(
53
+ () =>
54
+ mediaCategories.map( ( mediaCategory ) => ( {
55
+ ...mediaCategory,
56
+ label: mediaCategory.labels.name,
57
+ } ) ),
58
+ [ mediaCategories ]
59
+ );
52
60
  return (
53
61
  <>
54
62
  { ! isMobile && (
@@ -70,7 +78,7 @@ function MediaTab( {
70
78
  mediaCategory,
71
79
  }
72
80
  ) }
73
- aria-label={ mediaCategory.label }
81
+ aria-label={ mediaCategory.labels.name }
74
82
  aria-current={
75
83
  mediaCategory === selectedCategory
76
84
  ? 'true'
@@ -79,7 +87,7 @@ function MediaTab( {
79
87
  >
80
88
  <HStack>
81
89
  <FlexBlock>
82
- { mediaCategory.label }
90
+ { mediaCategory.labels.name }
83
91
  </FlexBlock>
84
92
  <Icon icon={ chevronRight } />
85
93
  </HStack>
@@ -118,7 +126,7 @@ function MediaTab( {
118
126
  </div>
119
127
  ) }
120
128
  { isMobile && (
121
- <MobileTabNavigation categories={ mediaCategories }>
129
+ <MobileTabNavigation categories={ mobileMediaCategories }>
122
130
  { ( category ) => (
123
131
  <MediaCategoryPanel
124
132
  onInsert={ onInsert }
@@ -5,19 +5,23 @@ import { createBlock } from '@wordpress/blocks';
5
5
 
6
6
  const mediaTypeTag = { image: 'img', video: 'video', audio: 'audio' };
7
7
 
8
+ /** @typedef {import('./hooks').InserterMediaItem} InserterMediaItem */
9
+
10
+ /**
11
+ * Creates a block and a preview element from a media object.
12
+ *
13
+ * @param {InserterMediaItem} media The media object to create the block from.
14
+ * @param {('image'|'audio'|'video')} mediaType The media type to create the block for.
15
+ * @return {[WPBlock, JSX.Element]} An array containing the block and the preview element.
16
+ */
8
17
  export function getBlockAndPreviewFromMedia( media, mediaType ) {
9
18
  // Add the common attributes between the different media types.
10
19
  const attributes = {
11
- id: media.id,
20
+ id: media.id || undefined,
21
+ caption: media.caption || undefined,
12
22
  };
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
- }
23
+ const mediaSrc = media.url;
24
+ const alt = media.alt || undefined;
21
25
  if ( mediaType === 'image' ) {
22
26
  attributes.url = mediaSrc;
23
27
  attributes.alt = alt;
@@ -27,10 +31,16 @@ export function getBlockAndPreviewFromMedia( media, mediaType ) {
27
31
  const PreviewTag = mediaTypeTag[ mediaType ];
28
32
  const preview = (
29
33
  <PreviewTag
30
- src={ mediaSrc }
34
+ src={ media.previewUrl || mediaSrc }
31
35
  alt={ alt }
32
36
  controls={ mediaType === 'audio' ? true : undefined }
33
37
  inert="true"
38
+ onError={ ( { currentTarget } ) => {
39
+ // Fall back to the media source if the preview cannot be loaded.
40
+ if ( currentTarget.src === media.previewUrl ) {
41
+ currentTarget.src = mediaSrc;
42
+ }
43
+ } }
34
44
  />
35
45
  );
36
46
  return [ createBlock( `core/${ mediaType }`, attributes ), preview ];
@@ -113,6 +113,13 @@ function InserterMenu(
113
113
  [ onToggleInsertionPoint, setHoveredItem ]
114
114
  );
115
115
 
116
+ const onHoverPattern = useCallback(
117
+ ( item ) => {
118
+ onToggleInsertionPoint( !! item );
119
+ },
120
+ [ onToggleInsertionPoint ]
121
+ );
122
+
116
123
  const onClickPatternCategory = useCallback(
117
124
  ( patternCategory ) => {
118
125
  setSelectedPatternCategory( patternCategory );
@@ -296,6 +303,7 @@ function InserterMenu(
296
303
  <BlockPatternsCategoryDialog
297
304
  rootClientId={ destinationRootClientId }
298
305
  onInsert={ onInsertPattern }
306
+ onHover={ onHoverPattern }
299
307
  category={ selectedPatternCategory }
300
308
  showTitlesAsTooltip
301
309
  />
@@ -23,8 +23,6 @@ function InserterPreviewPanel( { item } ) {
23
23
  { isReusable || example ? (
24
24
  <div className="block-editor-inserter__preview-content">
25
25
  <BlockPreview
26
- __experimentalPadding={ 16 }
27
- viewportWidth={ example?.viewportWidth ?? 500 }
28
26
  blocks={
29
27
  example
30
28
  ? getBlockFromExample( name, {
@@ -36,6 +34,10 @@ function InserterPreviewPanel( { item } ) {
36
34
  } )
37
35
  : createBlock( name, initialAttributes )
38
36
  }
37
+ viewportWidth={ example?.viewportWidth ?? 500 }
38
+ additionalStyles={ [
39
+ { css: 'body { padding: 16px; }' },
40
+ ] }
39
41
  />
40
42
  </div>
41
43
  ) : (
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { isEmpty } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -135,7 +130,7 @@ function InserterSearchResults( {
135
130
  );
136
131
 
137
132
  const hasItems =
138
- ! isEmpty( filteredBlockTypes ) || ! isEmpty( filteredBlockPatterns );
133
+ filteredBlockTypes.length > 0 || filteredBlockPatterns.length > 0;
139
134
 
140
135
  const blocksUI = !! filteredBlockTypes.length && (
141
136
  <InserterPanel
@@ -162,6 +157,7 @@ function InserterSearchResults( {
162
157
  shownPatterns={ currentShownPatterns }
163
158
  blockPatterns={ filteredBlockPatterns }
164
159
  onClickPattern={ onSelectBlockPattern }
160
+ onHover={ onHover }
165
161
  isDraggable={ isDraggable }
166
162
  />
167
163
  </div>