@wordpress/block-editor 10.2.0 → 10.4.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 (482) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +41 -0
  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/block-alignment-control/constants.js +1 -1
  6. package/build/components/block-alignment-control/constants.js.map +1 -1
  7. package/build/components/block-alignment-matrix-control/index.js +1 -1
  8. package/build/components/block-alignment-matrix-control/index.js.map +1 -1
  9. package/build/components/block-compare/index.js +1 -3
  10. package/build/components/block-compare/index.js.map +1 -1
  11. package/build/components/block-draggable/draggable-chip.js +4 -2
  12. package/build/components/block-draggable/draggable-chip.js.map +1 -1
  13. package/build/components/block-edit/index.js +4 -2
  14. package/build/components/block-edit/index.js.map +1 -1
  15. package/build/components/block-inspector/index.js +4 -4
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/block-list-compact.native.js +1 -0
  18. package/build/components/block-list/block-list-compact.native.js.map +1 -1
  19. package/build/components/block-list/block.js +75 -15
  20. package/build/components/block-list/block.js.map +1 -1
  21. package/build/components/block-list/block.native.js +79 -12
  22. package/build/components/block-list/block.native.js.map +1 -1
  23. package/build/components/block-list/use-in-between-inserter.js +7 -23
  24. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  25. package/build/components/block-lock/modal.js +9 -6
  26. package/build/components/block-lock/modal.js.map +1 -1
  27. package/build/components/block-parent-selector/index.js +3 -3
  28. package/build/components/block-parent-selector/index.js.map +1 -1
  29. package/build/components/block-patterns-list/index.js +5 -4
  30. package/build/components/block-patterns-list/index.js.map +1 -1
  31. package/build/components/block-popover/drop-zone.js +85 -0
  32. package/build/components/block-popover/drop-zone.js.map +1 -0
  33. package/build/components/block-popover/inbetween.js +2 -1
  34. package/build/components/block-popover/inbetween.js.map +1 -1
  35. package/build/components/block-popover/index.js +4 -2
  36. package/build/components/block-popover/index.js.map +1 -1
  37. package/build/components/block-preview/auto.js +2 -2
  38. package/build/components/block-preview/auto.js.map +1 -1
  39. package/build/components/block-preview/index.js +8 -13
  40. package/build/components/block-preview/index.js.map +1 -1
  41. package/build/components/block-preview/live.js +3 -7
  42. package/build/components/block-preview/live.js.map +1 -1
  43. package/build/components/block-selection-clearer/index.js +9 -1
  44. package/build/components/block-selection-clearer/index.js.map +1 -1
  45. package/build/components/block-settings-menu/block-settings-dropdown.js +19 -19
  46. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  47. package/build/components/block-styles/index.js +18 -42
  48. package/build/components/block-styles/index.js.map +1 -1
  49. package/build/components/block-switcher/index.js +2 -8
  50. package/build/components/block-switcher/index.js.map +1 -1
  51. package/build/components/block-switcher/preview-block-popover.js +1 -1
  52. package/build/components/block-switcher/preview-block-popover.js.map +1 -1
  53. package/build/components/block-toolbar/index.js +4 -4
  54. package/build/components/block-toolbar/index.js.map +1 -1
  55. package/build/components/block-tools/back-compat.js +2 -1
  56. package/build/components/block-tools/back-compat.js.map +1 -1
  57. package/build/components/block-tools/insertion-point.js +56 -16
  58. package/build/components/block-tools/insertion-point.js.map +1 -1
  59. package/build/components/block-tools/selected-block-popover.js +15 -3
  60. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  61. package/build/components/block-vertical-alignment-control/ui.js +1 -1
  62. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  63. package/build/components/border-radius-control/all-input-control.js +2 -1
  64. package/build/components/border-radius-control/all-input-control.js.map +1 -1
  65. package/build/components/border-radius-control/index.js +2 -1
  66. package/build/components/border-radius-control/index.js.map +1 -1
  67. package/build/components/border-radius-control/input-controls.js +2 -1
  68. package/build/components/border-radius-control/input-controls.js.map +1 -1
  69. package/build/components/colors-gradients/control.js +1 -1
  70. package/build/components/colors-gradients/control.js.map +1 -1
  71. package/build/components/colors-gradients/panel-color-gradient-settings.js +2 -2
  72. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  73. package/build/components/duotone-control/index.js +1 -1
  74. package/build/components/duotone-control/index.js.map +1 -1
  75. package/build/components/font-sizes/fluid-utils.js +256 -0
  76. package/build/components/font-sizes/fluid-utils.js.map +1 -0
  77. package/build/components/font-sizes/index.js +8 -0
  78. package/build/components/font-sizes/index.js.map +1 -1
  79. package/build/components/font-sizes/with-font-sizes.js +1 -1
  80. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  81. package/build/components/iframe/index.js +1 -1
  82. package/build/components/iframe/index.js.map +1 -1
  83. package/build/components/image-editor/constants.js +1 -1
  84. package/build/components/image-editor/constants.js.map +1 -1
  85. package/build/components/index.js +0 -9
  86. package/build/components/index.js.map +1 -1
  87. package/build/components/inner-blocks/index.js +6 -2
  88. package/build/components/inner-blocks/index.js.map +1 -1
  89. package/build/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  90. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  91. package/build/components/inserter/block-patterns-tab.js +151 -78
  92. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  93. package/build/components/inserter/hooks/use-insertion-point.js +2 -7
  94. package/build/components/inserter/hooks/use-insertion-point.js.map +1 -1
  95. package/build/components/inserter/menu.js +14 -3
  96. package/build/components/inserter/menu.js.map +1 -1
  97. package/build/components/inserter/search-items.js +23 -2
  98. package/build/components/inserter/search-items.js.map +1 -1
  99. package/build/components/inserter-draggable-blocks/index.js +4 -2
  100. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  101. package/build/components/line-height-control/index.js +2 -1
  102. package/build/components/line-height-control/index.js.map +1 -1
  103. package/build/components/list-view/drop-indicator.js +2 -1
  104. package/build/components/list-view/drop-indicator.js.map +1 -1
  105. package/build/components/list-view/use-list-view-drop-zone.js +1 -14
  106. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  107. package/build/components/media-replace-flow/index.js +1 -1
  108. package/build/components/media-replace-flow/index.js.map +1 -1
  109. package/build/components/preview-options/index.js +2 -3
  110. package/build/components/preview-options/index.js.map +1 -1
  111. package/build/components/rich-text/format-toolbar/index.js +1 -1
  112. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  113. package/build/components/rich-text/format-toolbar-container.js +1 -1
  114. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  115. package/build/components/rich-text/use-paste-handler.js +1 -1
  116. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  117. package/build/components/spacing-sizes-control/all-input-control.js +6 -2
  118. package/build/components/spacing-sizes-control/all-input-control.js.map +1 -1
  119. package/build/components/spacing-sizes-control/axial-input-controls.js +6 -2
  120. package/build/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  121. package/build/components/spacing-sizes-control/index.js +6 -2
  122. package/build/components/spacing-sizes-control/index.js.map +1 -1
  123. package/build/components/spacing-sizes-control/input-controls.js +6 -2
  124. package/build/components/spacing-sizes-control/input-controls.js.map +1 -1
  125. package/build/components/spacing-sizes-control/spacing-input-control.js +45 -8
  126. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  127. package/build/components/url-input/index.js +1 -1
  128. package/build/components/url-input/index.js.map +1 -1
  129. package/build/components/use-block-drop-zone/index.js +98 -57
  130. package/build/components/use-block-drop-zone/index.js.map +1 -1
  131. package/build/components/use-on-block-drop/index.js +12 -12
  132. package/build/components/use-on-block-drop/index.js.map +1 -1
  133. package/build/components/use-on-block-drop/types.js +6 -0
  134. package/build/components/use-on-block-drop/types.js.map +1 -0
  135. package/build/hooks/align.js +1 -3
  136. package/build/hooks/align.js.map +1 -1
  137. package/build/hooks/align.native.js +1 -7
  138. package/build/hooks/align.native.js.map +1 -1
  139. package/build/hooks/border.js +1 -0
  140. package/build/hooks/border.js.map +1 -1
  141. package/build/hooks/dimensions.js +32 -4
  142. package/build/hooks/dimensions.js.map +1 -1
  143. package/build/hooks/font-size.js +61 -0
  144. package/build/hooks/font-size.js.map +1 -1
  145. package/build/hooks/layout.js +4 -3
  146. package/build/hooks/layout.js.map +1 -1
  147. package/build/hooks/margin.js +24 -17
  148. package/build/hooks/margin.js.map +1 -1
  149. package/build/hooks/padding.js +20 -12
  150. package/build/hooks/padding.js.map +1 -1
  151. package/build/hooks/style.js +126 -4
  152. package/build/hooks/style.js.map +1 -1
  153. package/build/hooks/use-typography-props.js +17 -3
  154. package/build/hooks/use-typography-props.js.map +1 -1
  155. package/build/hooks/utils.js +8 -7
  156. package/build/hooks/utils.js.map +1 -1
  157. package/build/layouts/constrained.js +0 -1
  158. package/build/layouts/constrained.js.map +1 -1
  159. package/build/layouts/flex.js +1 -1
  160. package/build/layouts/flex.js.map +1 -1
  161. package/build/store/actions.js +63 -45
  162. package/build/store/actions.js.map +1 -1
  163. package/build/store/array.js +1 -7
  164. package/build/store/array.js.map +1 -1
  165. package/build/store/defaults.js +3 -0
  166. package/build/store/defaults.js.map +1 -1
  167. package/build/store/reducer.js +31 -15
  168. package/build/store/reducer.js.map +1 -1
  169. package/build/store/selectors.js +46 -29
  170. package/build/store/selectors.js.map +1 -1
  171. package/build/utils/math.js +14 -0
  172. package/build/utils/math.js.map +1 -1
  173. package/build/utils/pre-parse-patterns.js +19 -2
  174. package/build/utils/pre-parse-patterns.js.map +1 -1
  175. package/build-module/components/alignment-control/ui.js +1 -1
  176. package/build-module/components/alignment-control/ui.js.map +1 -1
  177. package/build-module/components/block-alignment-control/constants.js +1 -1
  178. package/build-module/components/block-alignment-control/constants.js.map +1 -1
  179. package/build-module/components/block-alignment-matrix-control/index.js +1 -1
  180. package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
  181. package/build-module/components/block-compare/index.js +2 -3
  182. package/build-module/components/block-compare/index.js.map +1 -1
  183. package/build-module/components/block-draggable/draggable-chip.js +7 -3
  184. package/build-module/components/block-draggable/draggable-chip.js.map +1 -1
  185. package/build-module/components/block-edit/index.js +4 -2
  186. package/build-module/components/block-edit/index.js.map +1 -1
  187. package/build-module/components/block-inspector/index.js +4 -4
  188. package/build-module/components/block-inspector/index.js.map +1 -1
  189. package/build-module/components/block-list/block-list-compact.native.js +1 -0
  190. package/build-module/components/block-list/block-list-compact.native.js.map +1 -1
  191. package/build-module/components/block-list/block.js +75 -15
  192. package/build-module/components/block-list/block.js.map +1 -1
  193. package/build-module/components/block-list/block.native.js +80 -13
  194. package/build-module/components/block-list/block.native.js.map +1 -1
  195. package/build-module/components/block-list/use-in-between-inserter.js +8 -24
  196. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  197. package/build-module/components/block-lock/modal.js +10 -8
  198. package/build-module/components/block-lock/modal.js.map +1 -1
  199. package/build-module/components/block-parent-selector/index.js +3 -3
  200. package/build-module/components/block-parent-selector/index.js.map +1 -1
  201. package/build-module/components/block-patterns-list/index.js +5 -4
  202. package/build-module/components/block-patterns-list/index.js.map +1 -1
  203. package/build-module/components/block-popover/drop-zone.js +70 -0
  204. package/build-module/components/block-popover/drop-zone.js.map +1 -0
  205. package/build-module/components/block-popover/inbetween.js +2 -1
  206. package/build-module/components/block-popover/inbetween.js.map +1 -1
  207. package/build-module/components/block-popover/index.js +4 -2
  208. package/build-module/components/block-popover/index.js.map +1 -1
  209. package/build-module/components/block-preview/auto.js +1 -1
  210. package/build-module/components/block-preview/auto.js.map +1 -1
  211. package/build-module/components/block-preview/index.js +8 -12
  212. package/build-module/components/block-preview/index.js.map +1 -1
  213. package/build-module/components/block-preview/live.js +3 -6
  214. package/build-module/components/block-preview/live.js.map +1 -1
  215. package/build-module/components/block-selection-clearer/index.js +9 -1
  216. package/build-module/components/block-selection-clearer/index.js.map +1 -1
  217. package/build-module/components/block-settings-menu/block-settings-dropdown.js +20 -19
  218. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  219. package/build-module/components/block-styles/index.js +19 -44
  220. package/build-module/components/block-styles/index.js.map +1 -1
  221. package/build-module/components/block-switcher/index.js +2 -7
  222. package/build-module/components/block-switcher/index.js.map +1 -1
  223. package/build-module/components/block-switcher/preview-block-popover.js +1 -1
  224. package/build-module/components/block-switcher/preview-block-popover.js.map +1 -1
  225. package/build-module/components/block-toolbar/index.js +4 -4
  226. package/build-module/components/block-toolbar/index.js.map +1 -1
  227. package/build-module/components/block-tools/back-compat.js +2 -1
  228. package/build-module/components/block-tools/back-compat.js.map +1 -1
  229. package/build-module/components/block-tools/insertion-point.js +54 -16
  230. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  231. package/build-module/components/block-tools/selected-block-popover.js +15 -3
  232. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  233. package/build-module/components/block-vertical-alignment-control/ui.js +1 -1
  234. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  235. package/build-module/components/border-radius-control/all-input-control.js +2 -1
  236. package/build-module/components/border-radius-control/all-input-control.js.map +1 -1
  237. package/build-module/components/border-radius-control/index.js +2 -1
  238. package/build-module/components/border-radius-control/index.js.map +1 -1
  239. package/build-module/components/border-radius-control/input-controls.js +2 -1
  240. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  241. package/build-module/components/colors-gradients/control.js +2 -2
  242. package/build-module/components/colors-gradients/control.js.map +1 -1
  243. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +3 -3
  244. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  245. package/build-module/components/duotone-control/index.js +1 -1
  246. package/build-module/components/duotone-control/index.js.map +1 -1
  247. package/build-module/components/font-sizes/fluid-utils.js +245 -0
  248. package/build-module/components/font-sizes/fluid-utils.js.map +1 -0
  249. package/build-module/components/font-sizes/index.js +1 -0
  250. package/build-module/components/font-sizes/index.js.map +1 -1
  251. package/build-module/components/font-sizes/with-font-sizes.js +2 -2
  252. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  253. package/build-module/components/iframe/index.js +1 -1
  254. package/build-module/components/iframe/index.js.map +1 -1
  255. package/build-module/components/image-editor/constants.js +1 -1
  256. package/build-module/components/image-editor/constants.js.map +1 -1
  257. package/build-module/components/index.js +0 -1
  258. package/build-module/components/index.js.map +1 -1
  259. package/build-module/components/inner-blocks/index.js +6 -2
  260. package/build-module/components/inner-blocks/index.js.map +1 -1
  261. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  262. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  263. package/build-module/components/inserter/block-patterns-tab.js +148 -81
  264. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  265. package/build-module/components/inserter/hooks/use-insertion-point.js +2 -6
  266. package/build-module/components/inserter/hooks/use-insertion-point.js.map +1 -1
  267. package/build-module/components/inserter/menu.js +10 -3
  268. package/build-module/components/inserter/menu.js.map +1 -1
  269. package/build-module/components/inserter/search-items.js +23 -3
  270. package/build-module/components/inserter/search-items.js.map +1 -1
  271. package/build-module/components/inserter-draggable-blocks/index.js +4 -2
  272. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  273. package/build-module/components/line-height-control/index.js +2 -1
  274. package/build-module/components/line-height-control/index.js.map +1 -1
  275. package/build-module/components/list-view/drop-indicator.js +2 -1
  276. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  277. package/build-module/components/list-view/use-list-view-drop-zone.js +1 -14
  278. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  279. package/build-module/components/media-replace-flow/index.js +1 -1
  280. package/build-module/components/media-replace-flow/index.js.map +1 -1
  281. package/build-module/components/preview-options/index.js +2 -3
  282. package/build-module/components/preview-options/index.js.map +1 -1
  283. package/build-module/components/rich-text/format-toolbar/index.js +1 -1
  284. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  285. package/build-module/components/rich-text/format-toolbar-container.js +1 -1
  286. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  287. package/build-module/components/rich-text/use-paste-handler.js +1 -1
  288. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  289. package/build-module/components/spacing-sizes-control/all-input-control.js +6 -2
  290. package/build-module/components/spacing-sizes-control/all-input-control.js.map +1 -1
  291. package/build-module/components/spacing-sizes-control/axial-input-controls.js +6 -2
  292. package/build-module/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  293. package/build-module/components/spacing-sizes-control/index.js +6 -2
  294. package/build-module/components/spacing-sizes-control/index.js.map +1 -1
  295. package/build-module/components/spacing-sizes-control/input-controls.js +6 -2
  296. package/build-module/components/spacing-sizes-control/input-controls.js.map +1 -1
  297. package/build-module/components/spacing-sizes-control/spacing-input-control.js +44 -8
  298. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  299. package/build-module/components/url-input/index.js +1 -1
  300. package/build-module/components/url-input/index.js.map +1 -1
  301. package/build-module/components/use-block-drop-zone/index.js +98 -58
  302. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  303. package/build-module/components/use-on-block-drop/index.js +12 -12
  304. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  305. package/build-module/components/use-on-block-drop/types.js +2 -0
  306. package/build-module/components/use-on-block-drop/types.js.map +1 -0
  307. package/build-module/hooks/align.js +1 -2
  308. package/build-module/hooks/align.js.map +1 -1
  309. package/build-module/hooks/align.native.js +1 -6
  310. package/build-module/hooks/align.native.js.map +1 -1
  311. package/build-module/hooks/border.js +1 -0
  312. package/build-module/hooks/border.js.map +1 -1
  313. package/build-module/hooks/dimensions.js +32 -4
  314. package/build-module/hooks/dimensions.js.map +1 -1
  315. package/build-module/hooks/font-size.js +60 -1
  316. package/build-module/hooks/font-size.js.map +1 -1
  317. package/build-module/hooks/layout.js +5 -4
  318. package/build-module/hooks/layout.js.map +1 -1
  319. package/build-module/hooks/margin.js +25 -18
  320. package/build-module/hooks/margin.js.map +1 -1
  321. package/build-module/hooks/padding.js +21 -13
  322. package/build-module/hooks/padding.js.map +1 -1
  323. package/build-module/hooks/style.js +124 -3
  324. package/build-module/hooks/style.js.map +1 -1
  325. package/build-module/hooks/use-typography-props.js +17 -4
  326. package/build-module/hooks/use-typography-props.js.map +1 -1
  327. package/build-module/hooks/utils.js +8 -8
  328. package/build-module/hooks/utils.js.map +1 -1
  329. package/build-module/layouts/constrained.js +0 -1
  330. package/build-module/layouts/constrained.js.map +1 -1
  331. package/build-module/layouts/flex.js +1 -1
  332. package/build-module/layouts/flex.js.map +1 -1
  333. package/build-module/store/actions.js +59 -42
  334. package/build-module/store/actions.js.map +1 -1
  335. package/build-module/store/array.js +1 -6
  336. package/build-module/store/array.js.map +1 -1
  337. package/build-module/store/defaults.js +3 -0
  338. package/build-module/store/defaults.js.map +1 -1
  339. package/build-module/store/reducer.js +32 -16
  340. package/build-module/store/reducer.js.map +1 -1
  341. package/build-module/store/selectors.js +47 -30
  342. package/build-module/store/selectors.js.map +1 -1
  343. package/build-module/utils/math.js +12 -0
  344. package/build-module/utils/math.js.map +1 -1
  345. package/build-module/utils/pre-parse-patterns.js +19 -2
  346. package/build-module/utils/pre-parse-patterns.js.map +1 -1
  347. package/build-style/style-rtl.css +292 -206
  348. package/build-style/style.css +288 -202
  349. package/package.json +29 -28
  350. package/src/components/alignment-control/ui.js +1 -1
  351. package/src/components/block-alignment-control/constants.js +1 -1
  352. package/src/components/block-alignment-matrix-control/index.js +1 -1
  353. package/src/components/block-breadcrumb/test/__snapshots__/index.js.snap +13 -11
  354. package/src/components/block-breadcrumb/test/index.js +2 -2
  355. package/src/components/block-compare/index.js +3 -2
  356. package/src/components/block-draggable/draggable-chip.js +4 -2
  357. package/src/components/block-edit/index.js +2 -1
  358. package/src/components/block-inspector/index.js +8 -7
  359. package/src/components/block-list/block-list-compact.native.js +1 -0
  360. package/src/components/block-list/block.js +113 -7
  361. package/src/components/block-list/block.native.js +123 -9
  362. package/src/components/block-list/style.scss +93 -126
  363. package/src/components/block-list/use-in-between-inserter.js +8 -19
  364. package/src/components/block-lock/modal.js +12 -7
  365. package/src/components/block-mover/stories/index.js +1 -1
  366. package/src/components/block-mover/style.scss +35 -1
  367. package/src/components/block-parent-selector/index.js +3 -3
  368. package/src/components/block-patterns-list/index.js +9 -5
  369. package/src/components/block-patterns-list/style.scss +7 -3
  370. package/src/components/block-popover/README.md +8 -0
  371. package/src/components/block-popover/drop-zone.js +63 -0
  372. package/src/components/block-popover/inbetween.js +1 -0
  373. package/src/components/block-popover/index.js +3 -1
  374. package/src/components/block-popover/style.scss +17 -5
  375. package/src/components/block-preview/auto.js +1 -1
  376. package/src/components/block-preview/index.js +15 -11
  377. package/src/components/block-preview/live.js +2 -7
  378. package/src/components/block-preview/test/index.js +1 -7
  379. package/src/components/block-selection-clearer/index.js +7 -2
  380. package/src/components/block-selection-clearer/test/index.js +118 -0
  381. package/src/components/block-settings-menu/block-settings-dropdown.js +29 -18
  382. package/src/components/block-settings-menu/test/block-mode-toggle.js +17 -17
  383. package/src/components/block-styles/index.js +26 -49
  384. package/src/components/block-switcher/index.js +2 -7
  385. package/src/components/block-switcher/preview-block-popover.js +1 -1
  386. package/src/components/block-switcher/test/index.js +2 -2
  387. package/src/components/block-toolbar/index.js +4 -6
  388. package/src/components/block-toolbar/style.scss +38 -14
  389. package/src/components/block-tools/back-compat.js +1 -0
  390. package/src/components/block-tools/insertion-point.js +49 -15
  391. package/src/components/block-tools/selected-block-popover.js +14 -1
  392. package/src/components/block-variation-picker/README.md +1 -1
  393. package/src/components/block-vertical-alignment-control/ui.js +1 -1
  394. package/src/components/border-radius-control/all-input-control.js +1 -0
  395. package/src/components/border-radius-control/index.js +1 -0
  396. package/src/components/border-radius-control/input-controls.js +1 -0
  397. package/src/components/border-radius-control/style.scss +15 -24
  398. package/src/components/button-block-appender/style.scss +4 -2
  399. package/src/components/color-palette/test/__snapshots__/control.js.snap +86 -104
  400. package/src/components/color-palette/test/control.js +11 -15
  401. package/src/components/colors-gradients/control.js +2 -2
  402. package/src/components/colors-gradients/panel-color-gradient-settings.js +3 -4
  403. package/src/components/colors-gradients/test/control.js +49 -77
  404. package/src/components/duotone-control/index.js +1 -1
  405. package/src/components/font-sizes/fluid-utils.js +296 -0
  406. package/src/components/font-sizes/index.js +1 -0
  407. package/src/components/font-sizes/test/fluid-utils.js +168 -0
  408. package/src/components/font-sizes/with-font-sizes.js +2 -3
  409. package/src/components/iframe/index.js +1 -1
  410. package/src/components/image-editor/constants.js +1 -1
  411. package/src/components/image-size-control/test/index.js +47 -60
  412. package/src/components/index.js +0 -1
  413. package/src/components/inner-blocks/index.js +5 -1
  414. package/src/components/inner-blocks/test/index.js +4 -0
  415. package/src/components/inner-blocks/use-inner-block-template-sync.js +3 -2
  416. package/src/components/inserter/block-patterns-tab.js +232 -98
  417. package/src/components/inserter/hooks/use-insertion-point.js +3 -11
  418. package/src/components/inserter/menu.js +15 -2
  419. package/src/components/inserter/search-items.js +23 -3
  420. package/src/components/inserter/style.scss +94 -9
  421. package/src/components/inserter/test/reusable-blocks-tab.js +6 -6
  422. package/src/components/inserter/test/search-items.js +6 -0
  423. package/src/components/inserter-draggable-blocks/index.js +12 -2
  424. package/src/components/inserter-list-item/style.scss +22 -1
  425. package/src/components/letter-spacing-control/README.md +55 -0
  426. package/src/components/line-height-control/index.js +1 -0
  427. package/src/components/link-control/README.md +3 -3
  428. package/src/components/link-control/test/index.js +1 -1
  429. package/src/components/list-view/drop-indicator.js +1 -0
  430. package/src/components/list-view/style.scss +1 -36
  431. package/src/components/list-view/use-list-view-drop-zone.js +4 -18
  432. package/src/components/media-replace-flow/index.js +1 -1
  433. package/src/components/media-replace-flow/test/index.js +69 -51
  434. package/src/components/panel-color-settings/test/index.js +4 -4
  435. package/src/components/preview-options/index.js +2 -2
  436. package/src/components/preview-options/style.scss +1 -1
  437. package/src/components/provider/test/use-block-sync.js +131 -165
  438. package/src/components/responsive-block-control/test/index.js +4 -4
  439. package/src/components/rich-text/format-toolbar/index.js +1 -1
  440. package/src/components/rich-text/format-toolbar-container.js +1 -1
  441. package/src/components/rich-text/use-paste-handler.js +1 -1
  442. package/src/components/spacing-sizes-control/all-input-control.js +4 -0
  443. package/src/components/spacing-sizes-control/axial-input-controls.js +4 -0
  444. package/src/components/spacing-sizes-control/index.js +4 -0
  445. package/src/components/spacing-sizes-control/input-controls.js +4 -0
  446. package/src/components/spacing-sizes-control/spacing-input-control.js +26 -3
  447. package/src/components/spacing-sizes-control/style.scss +27 -19
  448. package/src/components/url-input/index.js +1 -1
  449. package/src/components/use-block-drop-zone/index.js +136 -79
  450. package/src/components/use-block-drop-zone/test/index.js +333 -81
  451. package/src/components/use-on-block-drop/index.js +11 -12
  452. package/src/components/use-on-block-drop/types.ts +1 -0
  453. package/src/hooks/align.js +3 -2
  454. package/src/hooks/align.native.js +5 -8
  455. package/src/hooks/border.js +1 -0
  456. package/src/hooks/dimensions.js +32 -5
  457. package/src/hooks/font-size.js +76 -0
  458. package/src/hooks/layout.js +7 -9
  459. package/src/hooks/margin.js +20 -14
  460. package/src/hooks/padding.js +20 -16
  461. package/src/hooks/style.js +122 -3
  462. package/src/hooks/test/align.js +96 -72
  463. package/src/hooks/test/style.js +206 -1
  464. package/src/hooks/test/use-typography-props.js +22 -0
  465. package/src/hooks/use-typography-props.js +18 -3
  466. package/src/hooks/utils.js +10 -7
  467. package/src/layouts/constrained.js +0 -1
  468. package/src/layouts/flex.js +1 -1
  469. package/src/store/actions.js +24 -12
  470. package/src/store/array.js +1 -6
  471. package/src/store/defaults.js +3 -0
  472. package/src/store/reducer.js +31 -24
  473. package/src/store/selectors.js +28 -21
  474. package/src/store/test/actions.js +0 -9
  475. package/src/store/test/selectors.js +1 -1
  476. package/src/utils/math.js +17 -0
  477. package/src/utils/pre-parse-patterns.js +12 -7
  478. package/build/components/inserter/pattern-panel.js +0 -87
  479. package/build/components/inserter/pattern-panel.js.map +0 -1
  480. package/build-module/components/inserter/pattern-panel.js +0 -74
  481. package/build-module/components/inserter/pattern-panel.js.map +0 -1
  482. package/src/components/inserter/pattern-panel.js +0 -93
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { render, screen, fireEvent, waitFor } from '@testing-library/react';
4
+ import { render, screen, fireEvent } from '@testing-library/react';
5
5
 
6
6
  /**
7
7
  * Internal dependencies
@@ -85,7 +85,7 @@ describe( 'ImageSizeControl', () => {
85
85
  } );
86
86
 
87
87
  describe( 'updating dimension inputs', () => {
88
- it( 'updates height and calls onChange', async () => {
88
+ it( 'updates height and calls onChange', () => {
89
89
  render( <ImageSizeControl onChange={ mockOnChange } /> );
90
90
 
91
91
  const heightInput = getHeightInput();
@@ -96,16 +96,14 @@ describe( 'ImageSizeControl', () => {
96
96
 
97
97
  fireEvent.change( heightInput, { target: { value: '500' } } );
98
98
 
99
- await waitFor( () => {
100
- expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
101
- expect( mockOnChange ).toHaveBeenCalledWith( { height: 500 } );
102
- } );
99
+ expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
100
+ expect( mockOnChange ).toHaveBeenCalledWith( { height: 500 } );
103
101
 
104
102
  expect( heightInput.value ).toBe( '500' );
105
103
  expect( widthInput.value ).toBe( '' );
106
104
  } );
107
105
 
108
- it( 'updates width and calls onChange', async () => {
106
+ it( 'updates width and calls onChange', () => {
109
107
  render( <ImageSizeControl onChange={ mockOnChange } /> );
110
108
 
111
109
  const heightInput = getHeightInput();
@@ -115,16 +113,15 @@ describe( 'ImageSizeControl', () => {
115
113
  expect( widthInput.value ).toBe( '' );
116
114
 
117
115
  fireEvent.change( widthInput, { target: { value: '500' } } );
118
- await waitFor( () => {
119
- expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
120
- expect( mockOnChange ).toHaveBeenCalledWith( { width: 500 } );
121
- } );
116
+
117
+ expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
118
+ expect( mockOnChange ).toHaveBeenCalledWith( { width: 500 } );
122
119
 
123
120
  expect( heightInput.value ).toBe( '' );
124
121
  expect( widthInput.value ).toBe( '500' );
125
122
  } );
126
123
 
127
- it( 'updates height and calls onChange for empty value', async () => {
124
+ it( 'updates height and calls onChange for empty value', () => {
128
125
  render(
129
126
  <ImageSizeControl
130
127
  imageHeight="100"
@@ -141,20 +138,19 @@ describe( 'ImageSizeControl', () => {
141
138
 
142
139
  fireEvent.change( heightInput, { target: { value: '' } } );
143
140
 
144
- await waitFor( () => {
145
- // onChange is called and sets the dimension to undefined rather than
146
- // the empty string.
147
- expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
148
- expect( mockOnChange ).toHaveBeenCalledWith( {
149
- height: undefined,
150
- } );
141
+ // onChange is called and sets the dimension to undefined rather than
142
+ // the empty string.
143
+ expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
144
+ expect( mockOnChange ).toHaveBeenCalledWith( {
145
+ height: undefined,
151
146
  } );
147
+
152
148
  // Height is updated to empty value and does not reset to default.
153
149
  expect( heightInput.value ).toBe( '' );
154
150
  expect( widthInput.value ).toBe( '100' );
155
151
  } );
156
152
 
157
- it( 'updates width and calls onChange for empty value', async () => {
153
+ it( 'updates width and calls onChange for empty value', () => {
158
154
  render(
159
155
  <ImageSizeControl
160
156
  imageHeight="100"
@@ -171,14 +167,13 @@ describe( 'ImageSizeControl', () => {
171
167
 
172
168
  fireEvent.change( widthInput, { target: { value: '' } } );
173
169
 
174
- await waitFor( () => {
175
- // onChange is called and sets the dimension to undefined rather than
176
- // the empty string.
177
- expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
178
- expect( mockOnChange ).toHaveBeenCalledWith( {
179
- width: undefined,
180
- } );
170
+ // onChange is called and sets the dimension to undefined rather than
171
+ // the empty string.
172
+ expect( mockOnChange ).toHaveBeenCalledTimes( 1 );
173
+ expect( mockOnChange ).toHaveBeenCalledWith( {
174
+ width: undefined,
181
175
  } );
176
+
182
177
  // Width is updated to empty value and does not reset to default.
183
178
  expect( heightInput.value ).toBe( '100' );
184
179
  expect( widthInput.value ).toBe( '' );
@@ -186,7 +181,7 @@ describe( 'ImageSizeControl', () => {
186
181
  } );
187
182
 
188
183
  describe( 'reset button', () => {
189
- it( 'resets both height and width to default values', async () => {
184
+ it( 'resets both height and width to default values', () => {
190
185
  render(
191
186
  <ImageSizeControl
192
187
  imageHeight="100"
@@ -206,22 +201,20 @@ describe( 'ImageSizeControl', () => {
206
201
 
207
202
  fireEvent.click( screen.getByText( 'Reset' ) );
208
203
 
209
- await waitFor( () => {
210
- // Both attributes are set to undefined to clear custom values.
211
- expect( mockOnChange ).toHaveBeenCalledWith( {
212
- height: undefined,
213
- width: undefined,
214
- } );
215
-
216
- // The inputs display the default values once more.
217
- expect( heightInput.value ).toBe( '100' );
218
- expect( widthInput.value ).toBe( '200' );
204
+ // Both attributes are set to undefined to clear custom values.
205
+ expect( mockOnChange ).toHaveBeenCalledWith( {
206
+ height: undefined,
207
+ width: undefined,
219
208
  } );
209
+
210
+ // The inputs display the default values once more.
211
+ expect( heightInput.value ).toBe( '100' );
212
+ expect( widthInput.value ).toBe( '200' );
220
213
  } );
221
214
  } );
222
215
 
223
216
  describe( 'image size percentage presets', () => {
224
- it( 'updates height and width attributes on selection', async () => {
217
+ it( 'updates height and width attributes on selection', () => {
225
218
  render(
226
219
  <ImageSizeControl
227
220
  imageHeight="100"
@@ -232,18 +225,16 @@ describe( 'ImageSizeControl', () => {
232
225
 
233
226
  fireEvent.click( screen.getByText( '50%' ) );
234
227
 
235
- await waitFor( () => {
236
- expect( screen.getByText( '50%' ) ).toHaveClass( 'is-pressed' );
228
+ expect( screen.getByText( '50%' ) ).toHaveClass( 'is-pressed' );
237
229
 
238
- // Both attributes are set to the rounded scaled value.
239
- expect( mockOnChange ).toHaveBeenCalledWith( {
240
- height: 50,
241
- width: 101,
242
- } );
230
+ // Both attributes are set to the rounded scaled value.
231
+ expect( mockOnChange ).toHaveBeenCalledWith( {
232
+ height: 50,
233
+ width: 101,
243
234
  } );
244
235
  } );
245
236
 
246
- it( 'updates height and width inputs on selection', async () => {
237
+ it( 'updates height and width inputs on selection', () => {
247
238
  render(
248
239
  <ImageSizeControl
249
240
  imageHeight="100"
@@ -254,11 +245,9 @@ describe( 'ImageSizeControl', () => {
254
245
 
255
246
  fireEvent.click( screen.getByText( '50%' ) );
256
247
 
257
- await waitFor( () => {
258
- // Both attributes are set to the rounded scaled value.
259
- expect( getHeightInput().value ).toBe( '50' );
260
- expect( getWidthInput().value ).toBe( '101' );
261
- } );
248
+ // Both attributes are set to the rounded scaled value.
249
+ expect( getHeightInput().value ).toBe( '50' );
250
+ expect( getWidthInput().value ).toBe( '101' );
262
251
  } );
263
252
  } );
264
253
 
@@ -284,7 +273,7 @@ describe( 'ImageSizeControl', () => {
284
273
  );
285
274
  } );
286
275
 
287
- it( 'calls onChangeImage with selected slug on selection', async () => {
276
+ it( 'calls onChangeImage with selected slug on selection', () => {
288
277
  render(
289
278
  <ImageSizeControl
290
279
  imageSizeOptions={ IMAGE_SIZE_OPTIONS }
@@ -298,13 +287,11 @@ describe( 'ImageSizeControl', () => {
298
287
  target: { value: 'thumbnail' },
299
288
  } );
300
289
 
301
- await waitFor( () => {
302
- // onChangeImage is called with the slug and the event.
303
- expect( mockOnChangeImage ).toHaveBeenCalledWith(
304
- 'thumbnail',
305
- expect.any( Object )
306
- );
307
- } );
290
+ // onChangeImage is called with the slug and the event.
291
+ expect( mockOnChangeImage ).toHaveBeenCalledWith(
292
+ 'thumbnail',
293
+ expect.any( Object )
294
+ );
308
295
  } );
309
296
  } );
310
297
  } );
@@ -155,7 +155,6 @@ export {
155
155
  export { default as __experimentalBlockPatternsList } from './block-patterns-list';
156
156
  export { default as __experimentalPublishDateTimePicker } from './publish-date-time-picker';
157
157
  export { default as __experimentalInspectorPopoverHeader } from './inspector-popover-header';
158
- export { default as __experimentalUseOnBlockDrop } from './use-on-block-drop';
159
158
 
160
159
  /*
161
160
  * State Related Components
@@ -150,7 +150,9 @@ const ForwardedInnerBlocks = forwardRef( ( props, ref ) => {
150
150
  * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/inner-blocks/README.md
151
151
  */
152
152
  export function useInnerBlocksProps( props = {}, options = {} ) {
153
- const { clientId } = useBlockEditContext();
153
+ const { __unstableDisableLayoutClassNames } = options;
154
+ const { clientId, __unstableLayoutClassNames: layoutClassNames = '' } =
155
+ useBlockEditContext();
154
156
  const isSmallScreen = useViewportMatch( 'medium', '<' );
155
157
  const { __experimentalCaptureToolbars, hasOverlay } = useSelect(
156
158
  ( select ) => {
@@ -200,12 +202,14 @@ export function useInnerBlocksProps( props = {}, options = {} ) {
200
202
  innerBlocksProps.value && innerBlocksProps.onChange
201
203
  ? ControlledInnerBlocks
202
204
  : UncontrolledInnerBlocks;
205
+
203
206
  return {
204
207
  ...props,
205
208
  ref,
206
209
  className: classnames(
207
210
  props.className,
208
211
  'block-editor-block-list__layout',
212
+ __unstableDisableLayoutClassNames ? '' : layoutClassNames,
209
213
  {
210
214
  'has-overlay': hasOverlay,
211
215
  }
@@ -1,3 +1,5 @@
1
+ /* eslint-disable testing-library/render-result-naming-convention */
2
+
1
3
  /**
2
4
  * WordPress dependencies
3
5
  */
@@ -102,3 +104,5 @@ describe( 'InnerBlocks', () => {
102
104
  expect( serialize( block ) ).toMatchSnapshot();
103
105
  } );
104
106
  } );
107
+
108
+ /* eslint-enable testing-library/render-result-naming-convention */
@@ -40,7 +40,7 @@ export default function useInnerBlockTemplateSync(
40
40
  templateLock,
41
41
  templateInsertUpdatesSelection
42
42
  ) {
43
- const { getSelectedBlocksInitialCaretPosition } =
43
+ const { getSelectedBlocksInitialCaretPosition, isBlockSelected } =
44
44
  useSelect( blockEditorStore );
45
45
  const { replaceInnerBlocks } = useDispatch( blockEditorStore );
46
46
  const innerBlocks = useSelect(
@@ -86,7 +86,8 @@ export default function useInnerBlockTemplateSync(
86
86
  nextBlocks,
87
87
  currentInnerBlocks.length === 0 &&
88
88
  templateInsertUpdatesSelection &&
89
- nextBlocks.length !== 0,
89
+ nextBlocks.length !== 0 &&
90
+ isBlockSelected( clientId ),
90
91
  // This ensures the "initialPosition" doesn't change when applying the template
91
92
  // If we're supposed to focus the block, we'll focus the first inner block
92
93
  // otherwise, we won't apply any auto-focus.
@@ -1,96 +1,37 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useMemo, useState, useCallback } from '@wordpress/element';
5
- import { _x } from '@wordpress/i18n';
6
- import { useAsyncList } from '@wordpress/compose';
4
+ import {
5
+ useMemo,
6
+ useState,
7
+ useCallback,
8
+ useRef,
9
+ useEffect,
10
+ } from '@wordpress/element';
11
+ import { _x, __, isRTL } from '@wordpress/i18n';
12
+ import { useAsyncList, useViewportMatch } from '@wordpress/compose';
13
+ import {
14
+ __experimentalItemGroup as ItemGroup,
15
+ __experimentalItem as Item,
16
+ __experimentalHStack as HStack,
17
+ __experimentalNavigatorProvider as NavigatorProvider,
18
+ __experimentalNavigatorScreen as NavigatorScreen,
19
+ __experimentalNavigatorButton as NavigatorButton,
20
+ __experimentalNavigatorBackButton as NavigatorBackButton,
21
+ FlexBlock,
22
+ Button,
23
+ } from '@wordpress/components';
24
+ import { Icon, chevronRight, chevronLeft } from '@wordpress/icons';
25
+ import { focus } from '@wordpress/dom';
7
26
 
8
27
  /**
9
28
  * Internal dependencies
10
29
  */
11
- import PatternInserterPanel from './pattern-panel';
12
30
  import usePatternsState from './hooks/use-patterns-state';
13
31
  import BlockPatternList from '../block-patterns-list';
14
32
  import PatternsExplorerModal from './block-patterns-explorer/explorer';
15
33
 
16
- function BlockPatternsCategory( {
17
- rootClientId,
18
- onInsert,
19
- selectedCategory,
20
- populatedCategories,
21
- } ) {
22
- const [ allPatterns, , onClick ] = usePatternsState(
23
- onInsert,
24
- rootClientId
25
- );
26
-
27
- const getPatternIndex = useCallback(
28
- ( pattern ) => {
29
- if ( ! pattern.categories?.length ) {
30
- return Infinity;
31
- }
32
- const indexedCategories = populatedCategories.reduce(
33
- ( accumulator, { name }, index ) => {
34
- accumulator[ name ] = index;
35
- return accumulator;
36
- },
37
- {}
38
- );
39
- return Math.min(
40
- ...pattern.categories.map( ( cat ) =>
41
- indexedCategories[ cat ] !== undefined
42
- ? indexedCategories[ cat ]
43
- : Infinity
44
- )
45
- );
46
- },
47
- [ populatedCategories ]
48
- );
49
-
50
- const currentCategoryPatterns = useMemo(
51
- () =>
52
- allPatterns.filter( ( pattern ) =>
53
- selectedCategory.name === 'uncategorized'
54
- ? getPatternIndex( pattern ) === Infinity
55
- : pattern.categories?.includes( selectedCategory.name )
56
- ),
57
- [ allPatterns, selectedCategory ]
58
- );
59
-
60
- // Ordering the patterns is important for the async rendering.
61
- const orderedPatterns = useMemo( () => {
62
- return currentCategoryPatterns.sort( ( a, b ) => {
63
- return getPatternIndex( a ) - getPatternIndex( b );
64
- } );
65
- }, [ currentCategoryPatterns, getPatternIndex ] );
66
-
67
- const currentShownPatterns = useAsyncList( orderedPatterns );
68
-
69
- if ( ! currentCategoryPatterns.length ) {
70
- return null;
71
- }
72
-
73
- return (
74
- <div className="block-editor-inserter__panel-content">
75
- <BlockPatternList
76
- shownPatterns={ currentShownPatterns }
77
- blockPatterns={ currentCategoryPatterns }
78
- onClickPattern={ onClick }
79
- label={ selectedCategory.label }
80
- orientation="vertical"
81
- isDraggable
82
- />
83
- </div>
84
- );
85
- }
86
-
87
- function BlockPatternsTabs( {
88
- rootClientId,
89
- onInsert,
90
- onClickCategory,
91
- selectedCategory,
92
- } ) {
93
- const [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );
34
+ function usePatternsCategories() {
94
35
  const [ allPatterns, allCategories ] = usePatternsState();
95
36
 
96
37
  const hasRegisteredCategory = useCallback(
@@ -138,30 +79,173 @@ function BlockPatternsTabs( {
138
79
  return categories;
139
80
  }, [ allPatterns, allCategories ] );
140
81
 
141
- const patternCategory = selectedCategory
142
- ? selectedCategory
143
- : populatedCategories[ 0 ];
82
+ return populatedCategories;
83
+ }
84
+
85
+ export function BlockPatternsCategoryDialog( {
86
+ rootClientId,
87
+ onInsert,
88
+ category,
89
+ } ) {
90
+ const container = useRef();
91
+
92
+ useEffect( () => {
93
+ const timeout = setTimeout( () => {
94
+ const [ firstTabbable ] = focus.tabbable.find( container.current );
95
+ firstTabbable?.focus();
96
+ } );
97
+ return () => clearTimeout( timeout );
98
+ }, [ category ] );
144
99
 
145
100
  return (
146
- <>
147
- <PatternInserterPanel
148
- selectedCategory={ patternCategory }
149
- patternCategories={ populatedCategories }
150
- onClickCategory={ onClickCategory }
151
- openPatternExplorer={ () => setShowPatternsExplorer( true ) }
101
+ <div
102
+ ref={ container }
103
+ className="block-editor-inserter__patterns-category-panel"
104
+ >
105
+ <BlockPatternsCategoryPanel
106
+ rootClientId={ rootClientId }
107
+ onInsert={ onInsert }
108
+ category={ category }
152
109
  />
153
- { ! showPatternsExplorer && (
154
- <BlockPatternsCategory
155
- rootClientId={ rootClientId }
110
+ </div>
111
+ );
112
+ }
113
+
114
+ export function BlockPatternsCategoryPanel( {
115
+ rootClientId,
116
+ onInsert,
117
+ category,
118
+ } ) {
119
+ const [ allPatterns, , onClick ] = usePatternsState(
120
+ onInsert,
121
+ rootClientId
122
+ );
123
+
124
+ const availableCategories = usePatternsCategories();
125
+ const currentCategoryPatterns = useMemo(
126
+ () =>
127
+ allPatterns.filter( ( pattern ) => {
128
+ if ( category.name !== 'uncategorized' ) {
129
+ return pattern.categories?.includes( category.name );
130
+ }
131
+
132
+ // The uncategorized category should show all the patterns without any category
133
+ // or with no available category.
134
+ const availablePatternCategories =
135
+ pattern.categories?.filter( ( cat ) =>
136
+ availableCategories.find(
137
+ ( availableCategory ) =>
138
+ availableCategory.name === cat
139
+ )
140
+ ) ?? [];
141
+
142
+ return availablePatternCategories.length === 0;
143
+ } ),
144
+ [ allPatterns, category ]
145
+ );
146
+
147
+ const currentShownPatterns = useAsyncList( currentCategoryPatterns );
148
+
149
+ if ( ! currentCategoryPatterns.length ) {
150
+ return null;
151
+ }
152
+
153
+ return (
154
+ <div>
155
+ <div className="block-editor-inserter__patterns-category-panel-title">
156
+ { category.label }
157
+ </div>
158
+ <p>{ category.description }</p>
159
+ <BlockPatternList
160
+ shownPatterns={ currentShownPatterns }
161
+ blockPatterns={ currentCategoryPatterns }
162
+ onClickPattern={ onClick }
163
+ label={ category.label }
164
+ orientation="vertical"
165
+ category={ category.label }
166
+ isDraggable
167
+ />
168
+ </div>
169
+ );
170
+ }
171
+
172
+ function BlockPatternsTabs( {
173
+ onSelectCategory,
174
+ selectedCategory,
175
+ onInsert,
176
+ rootClientId,
177
+ } ) {
178
+ const [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );
179
+ const categories = usePatternsCategories();
180
+ const isMobile = useViewportMatch( 'medium', '<' );
181
+
182
+ return (
183
+ <>
184
+ { ! isMobile && (
185
+ <div className="block-editor-inserter__block-patterns-tabs-container">
186
+ <nav aria-label={ __( 'Block pattern categories' ) }>
187
+ <ItemGroup
188
+ role="list"
189
+ className="block-editor-inserter__block-patterns-tabs"
190
+ >
191
+ { categories.map( ( category ) => (
192
+ <Item
193
+ role="listitem"
194
+ key={ category.name }
195
+ onClick={ () =>
196
+ onSelectCategory( category )
197
+ }
198
+ className={
199
+ category === selectedCategory
200
+ ? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category'
201
+ : 'block-editor-inserter__patterns-category'
202
+ }
203
+ aria-label={ category.label }
204
+ aria-current={
205
+ category === selectedCategory
206
+ ? 'true'
207
+ : undefined
208
+ }
209
+ >
210
+ <HStack>
211
+ <FlexBlock>
212
+ { category.label }
213
+ </FlexBlock>
214
+ <Icon icon={ chevronRight } />
215
+ </HStack>
216
+ </Item>
217
+ ) ) }
218
+
219
+ <div
220
+ role="presentation"
221
+ className="block-editor-inserter__patterns-fill-space"
222
+ />
223
+
224
+ <div role="listitem">
225
+ <Button
226
+ className="block-editor-inserter__patterns-explore-button"
227
+ onClick={ () =>
228
+ setShowPatternsExplorer( true )
229
+ }
230
+ variant="secondary"
231
+ >
232
+ { __( 'Explore all patterns' ) }
233
+ </Button>
234
+ </div>
235
+ </ItemGroup>
236
+ </nav>
237
+ </div>
238
+ ) }
239
+ { isMobile && (
240
+ <BlockPatternsTabNavigation
156
241
  onInsert={ onInsert }
157
- selectedCategory={ patternCategory }
158
- populatedCategories={ populatedCategories }
242
+ rootClientId={ rootClientId }
159
243
  />
160
244
  ) }
161
245
  { showPatternsExplorer && (
162
246
  <PatternsExplorerModal
163
- initialCategory={ patternCategory }
164
- patternCategories={ populatedCategories }
247
+ initialCategory={ selectedCategory }
248
+ patternCategories={ categories }
165
249
  onModalClose={ () => setShowPatternsExplorer( false ) }
166
250
  />
167
251
  ) }
@@ -169,4 +253,54 @@ function BlockPatternsTabs( {
169
253
  );
170
254
  }
171
255
 
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
+
172
306
  export default BlockPatternsTabs;
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { castArray } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -118,14 +113,11 @@ function useInsertionPoint( {
118
113
  meta
119
114
  );
120
115
  }
116
+ const blockLength = Array.isArray( blocks ) ? blocks.length : 1;
121
117
  const message = sprintf(
122
118
  // translators: %d: the name of the block that has been added
123
- _n(
124
- '%d block added.',
125
- '%d blocks added.',
126
- castArray( blocks ).length
127
- ),
128
- castArray( blocks ).length
119
+ _n( '%d block added.', '%d blocks added.', blockLength ),
120
+ blockLength
129
121
  );
130
122
  speak( message );
131
123