@wordpress/block-editor 12.9.0 → 12.10.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 (463) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +33 -3
  3. package/build/components/block-canvas/index.js +107 -0
  4. package/build/components/block-canvas/index.js.map +1 -0
  5. package/build/components/block-inspector/index.js +4 -1
  6. package/build/components/block-inspector/index.js.map +1 -1
  7. package/build/components/block-patterns-list/index.js +19 -4
  8. package/build/components/block-patterns-list/index.js.map +1 -1
  9. package/build/components/block-patterns-paging/index.js +66 -0
  10. package/build/components/block-patterns-paging/index.js.map +1 -0
  11. package/build/components/block-settings-menu/block-settings-dropdown.js +28 -0
  12. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  13. package/build/components/block-settings-menu-controls/index.js +4 -7
  14. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  15. package/build/components/block-styles/index.js +1 -0
  16. package/build/components/block-styles/index.js.map +1 -1
  17. package/build/components/block-toolbar/block-toolbar-menu.native.js +3 -7
  18. package/build/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  19. package/build/components/block-tools/block-contextual-toolbar.js +18 -7
  20. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  21. package/build/components/block-tools/block-selection-button.js +5 -1
  22. package/build/components/block-tools/block-selection-button.js.map +1 -1
  23. package/build/components/border-radius-control/input-controls.js +1 -1
  24. package/build/components/border-radius-control/input-controls.js.map +1 -1
  25. package/build/components/border-radius-control/linked-button.js +2 -4
  26. package/build/components/border-radius-control/linked-button.js.map +1 -1
  27. package/build/components/colors/with-colors.js.map +1 -1
  28. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -21
  29. package/build/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  30. package/build/components/default-block-appender/index.native.js +20 -1
  31. package/build/components/default-block-appender/index.native.js.map +1 -1
  32. package/build/components/duotone/utils.js +68 -0
  33. package/build/components/duotone/utils.js.map +1 -1
  34. package/build/components/editor-styles/index.js +28 -9
  35. package/build/components/editor-styles/index.js.map +1 -1
  36. package/build/components/global-styles/hooks.js +2 -101
  37. package/build/components/global-styles/hooks.js.map +1 -1
  38. package/build/components/global-styles/image-settings-panel.js +61 -0
  39. package/build/components/global-styles/image-settings-panel.js.map +1 -0
  40. package/build/components/global-styles/index.js +11 -17
  41. package/build/components/global-styles/index.js.map +1 -1
  42. package/build/components/global-styles/use-global-styles-output.js +19 -15
  43. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  44. package/build/components/global-styles/utils.js +1 -1
  45. package/build/components/global-styles/utils.js.map +1 -1
  46. package/build/components/iframe/index.js +67 -33
  47. package/build/components/iframe/index.js.map +1 -1
  48. package/build/components/image-editor/use-save-image.js +2 -5
  49. package/build/components/image-editor/use-save-image.js.map +1 -1
  50. package/build/components/image-editor/use-transform-image.js +9 -9
  51. package/build/components/image-editor/use-transform-image.js.map +1 -1
  52. package/build/components/index.js +8 -12
  53. package/build/components/index.js.map +1 -1
  54. package/build/components/index.native.js +6 -5
  55. package/build/components/index.native.js.map +1 -1
  56. package/build/components/inner-blocks/use-nested-settings-update.js +13 -7
  57. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  58. package/build/components/inserter/block-patterns-explorer/explorer.js +12 -6
  59. package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
  60. package/build/components/inserter/block-patterns-explorer/patterns-list.js +57 -23
  61. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  62. package/build/components/inserter/block-patterns-explorer/sidebar.js +24 -9
  63. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  64. package/build/components/inserter/block-patterns-source-filter.js +54 -0
  65. package/build/components/inserter/block-patterns-source-filter.js.map +1 -0
  66. package/build/components/inserter/block-patterns-sync-filter.js +46 -0
  67. package/build/components/inserter/block-patterns-sync-filter.js.map +1 -0
  68. package/build/components/inserter/block-patterns-tab.js +91 -45
  69. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  70. package/build/components/inserter/hooks/use-patterns-paging.js +57 -0
  71. package/build/components/inserter/hooks/use-patterns-paging.js.map +1 -0
  72. package/build/components/inserter/hooks/use-patterns-state.js +21 -10
  73. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  74. package/build/components/inserter/menu.js +13 -11
  75. package/build/components/inserter/menu.js.map +1 -1
  76. package/build/components/inserter/search-results.js +4 -3
  77. package/build/components/inserter/search-results.js.map +1 -1
  78. package/build/components/inserter/tabs.js +1 -12
  79. package/build/components/inserter/tabs.js.map +1 -1
  80. package/build/components/inspector-controls/block-support-slot-container.js +12 -1
  81. package/build/components/inspector-controls/block-support-slot-container.js.map +1 -1
  82. package/build/components/inspector-controls/fill.js +24 -13
  83. package/build/components/inspector-controls/fill.js.map +1 -1
  84. package/build/components/inspector-controls/groups.js +5 -3
  85. package/build/components/inspector-controls/groups.js.map +1 -1
  86. package/build/components/inspector-controls/slot.js +13 -0
  87. package/build/components/inspector-controls/slot.js.map +1 -1
  88. package/build/components/inspector-controls-tabs/styles-tab.js +3 -0
  89. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  90. package/build/components/link-control/index.js +13 -2
  91. package/build/components/link-control/index.js.map +1 -1
  92. package/build/components/link-control/settings.js +2 -1
  93. package/build/components/link-control/settings.js.map +1 -1
  94. package/build/components/list-view/block-select-button.js +1 -3
  95. package/build/components/list-view/block-select-button.js.map +1 -1
  96. package/build/components/list-view/block.js +13 -1
  97. package/build/components/list-view/block.js.map +1 -1
  98. package/build/components/list-view/use-block-selection.js +29 -24
  99. package/build/components/list-view/use-block-selection.js.map +1 -1
  100. package/build/components/media-placeholder/index.js +2 -2
  101. package/build/components/media-placeholder/index.js.map +1 -1
  102. package/build/components/media-placeholder/index.native.js +11 -11
  103. package/build/components/media-placeholder/index.native.js.map +1 -1
  104. package/build/components/media-replace-flow/index.js +2 -3
  105. package/build/components/media-replace-flow/index.js.map +1 -1
  106. package/build/components/media-upload/constants.js +30 -0
  107. package/build/components/media-upload/constants.js.map +1 -0
  108. package/build/components/media-upload/index.native.js +63 -53
  109. package/build/components/media-upload/index.native.js.map +1 -1
  110. package/build/components/preview-options/index.js +1 -1
  111. package/build/components/preview-options/index.js.map +1 -1
  112. package/build/components/rich-text/index.js +34 -35
  113. package/build/components/rich-text/index.js.map +1 -1
  114. package/build/components/rich-text/index.native.js +14 -32
  115. package/build/components/rich-text/index.native.js.map +1 -1
  116. package/build/components/rich-text/multiline.js +95 -0
  117. package/build/components/rich-text/multiline.js.map +1 -0
  118. package/build/components/rich-text/split-value.js +10 -16
  119. package/build/components/rich-text/split-value.js.map +1 -1
  120. package/build/components/rich-text/use-enter.js +31 -40
  121. package/build/components/rich-text/use-enter.js.map +1 -1
  122. package/build/components/rich-text/use-paste-handler.js +18 -33
  123. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  124. package/build/components/spacing-sizes-control/utils.js +1 -1
  125. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  126. package/build/components/use-block-commands/index.js +30 -18
  127. package/build/components/use-block-commands/index.js.map +1 -1
  128. package/build/components/use-block-display-information/index.js +5 -2
  129. package/build/components/use-block-display-information/index.js.map +1 -1
  130. package/build/hooks/background.js +258 -0
  131. package/build/hooks/background.js.map +1 -0
  132. package/build/hooks/block-hooks.js +188 -0
  133. package/build/hooks/block-hooks.js.map +1 -0
  134. package/build/hooks/block-rename-ui.js +160 -0
  135. package/build/hooks/block-rename-ui.js.map +1 -0
  136. package/build/hooks/duotone.js +29 -42
  137. package/build/hooks/duotone.js.map +1 -1
  138. package/build/hooks/index.js +2 -2
  139. package/build/hooks/index.js.map +1 -1
  140. package/build/hooks/layout.js +31 -14
  141. package/build/hooks/layout.js.map +1 -1
  142. package/build/hooks/position.js +4 -2
  143. package/build/hooks/position.js.map +1 -1
  144. package/build/hooks/style.js +74 -25
  145. package/build/hooks/style.js.map +1 -1
  146. package/build/hooks/utils.js +4 -0
  147. package/build/hooks/utils.js.map +1 -1
  148. package/build/private-apis.js +2 -0
  149. package/build/private-apis.js.map +1 -1
  150. package/build/store/actions.js +33 -10
  151. package/build/store/actions.js.map +1 -1
  152. package/build/store/private-actions.js +42 -8
  153. package/build/store/private-actions.js.map +1 -1
  154. package/build/store/private-selectors.js +23 -0
  155. package/build/store/private-selectors.js.map +1 -1
  156. package/build/store/reducer.js +43 -1
  157. package/build/store/reducer.js.map +1 -1
  158. package/build/store/selectors.js +84 -23
  159. package/build/store/selectors.js.map +1 -1
  160. package/build/store/utils.js +0 -4
  161. package/build/store/utils.js.map +1 -1
  162. package/build-module/components/block-canvas/index.js +97 -0
  163. package/build-module/components/block-canvas/index.js.map +1 -0
  164. package/build-module/components/block-inspector/index.js +4 -1
  165. package/build-module/components/block-inspector/index.js.map +1 -1
  166. package/build-module/components/block-patterns-list/index.js +20 -5
  167. package/build-module/components/block-patterns-list/index.js.map +1 -1
  168. package/build-module/components/block-patterns-paging/index.js +59 -0
  169. package/build-module/components/block-patterns-paging/index.js.map +1 -0
  170. package/build-module/components/block-settings-menu/block-settings-dropdown.js +28 -0
  171. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  172. package/build-module/components/block-settings-menu-controls/index.js +4 -7
  173. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  174. package/build-module/components/block-styles/index.js +1 -0
  175. package/build-module/components/block-styles/index.js.map +1 -1
  176. package/build-module/components/block-toolbar/block-toolbar-menu.native.js +3 -7
  177. package/build-module/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  178. package/build-module/components/block-tools/block-contextual-toolbar.js +18 -7
  179. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  180. package/build-module/components/block-tools/block-selection-button.js +5 -1
  181. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  182. package/build-module/components/border-radius-control/input-controls.js +1 -1
  183. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  184. package/build-module/components/border-radius-control/linked-button.js +2 -4
  185. package/build-module/components/border-radius-control/linked-button.js.map +1 -1
  186. package/build-module/components/colors/with-colors.js.map +1 -1
  187. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -21
  188. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  189. package/build-module/components/default-block-appender/index.native.js +20 -1
  190. package/build-module/components/default-block-appender/index.native.js.map +1 -1
  191. package/build-module/components/duotone/utils.js +65 -0
  192. package/build-module/components/duotone/utils.js.map +1 -1
  193. package/build-module/components/editor-styles/index.js +28 -9
  194. package/build-module/components/editor-styles/index.js.map +1 -1
  195. package/build-module/components/global-styles/hooks.js +3 -100
  196. package/build-module/components/global-styles/hooks.js.map +1 -1
  197. package/build-module/components/global-styles/image-settings-panel.js +53 -0
  198. package/build-module/components/global-styles/image-settings-panel.js.map +1 -0
  199. package/build-module/components/global-styles/index.js +2 -2
  200. package/build-module/components/global-styles/index.js.map +1 -1
  201. package/build-module/components/global-styles/use-global-styles-output.js +18 -16
  202. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  203. package/build-module/components/global-styles/utils.js +1 -1
  204. package/build-module/components/global-styles/utils.js.map +1 -1
  205. package/build-module/components/iframe/index.js +66 -33
  206. package/build-module/components/iframe/index.js.map +1 -1
  207. package/build-module/components/image-editor/use-save-image.js +2 -5
  208. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  209. package/build-module/components/image-editor/use-transform-image.js +9 -9
  210. package/build-module/components/image-editor/use-transform-image.js.map +1 -1
  211. package/build-module/components/index.js +1 -1
  212. package/build-module/components/index.js.map +1 -1
  213. package/build-module/components/index.native.js +2 -1
  214. package/build-module/components/index.native.js.map +1 -1
  215. package/build-module/components/inner-blocks/use-nested-settings-update.js +14 -8
  216. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  217. package/build-module/components/inserter/block-patterns-explorer/explorer.js +12 -6
  218. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
  219. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +59 -25
  220. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  221. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +23 -9
  222. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  223. package/build-module/components/inserter/block-patterns-source-filter.js +44 -0
  224. package/build-module/components/inserter/block-patterns-source-filter.js.map +1 -0
  225. package/build-module/components/inserter/block-patterns-sync-filter.js +38 -0
  226. package/build-module/components/inserter/block-patterns-sync-filter.js.map +1 -0
  227. package/build-module/components/inserter/block-patterns-tab.js +87 -46
  228. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  229. package/build-module/components/inserter/hooks/use-patterns-paging.js +50 -0
  230. package/build-module/components/inserter/hooks/use-patterns-paging.js.map +1 -0
  231. package/build-module/components/inserter/hooks/use-patterns-state.js +22 -10
  232. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  233. package/build-module/components/inserter/menu.js +13 -11
  234. package/build-module/components/inserter/menu.js.map +1 -1
  235. package/build-module/components/inserter/search-results.js +4 -3
  236. package/build-module/components/inserter/search-results.js.map +1 -1
  237. package/build-module/components/inserter/tabs.js +1 -12
  238. package/build-module/components/inserter/tabs.js.map +1 -1
  239. package/build-module/components/inspector-controls/block-support-slot-container.js +13 -2
  240. package/build-module/components/inspector-controls/block-support-slot-container.js.map +1 -1
  241. package/build-module/components/inspector-controls/fill.js +25 -14
  242. package/build-module/components/inspector-controls/fill.js.map +1 -1
  243. package/build-module/components/inspector-controls/groups.js +5 -3
  244. package/build-module/components/inspector-controls/groups.js.map +1 -1
  245. package/build-module/components/inspector-controls/slot.js +15 -1
  246. package/build-module/components/inspector-controls/slot.js.map +1 -1
  247. package/build-module/components/inspector-controls-tabs/styles-tab.js +3 -0
  248. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  249. package/build-module/components/link-control/index.js +13 -2
  250. package/build-module/components/link-control/index.js.map +1 -1
  251. package/build-module/components/link-control/settings.js +2 -1
  252. package/build-module/components/link-control/settings.js.map +1 -1
  253. package/build-module/components/list-view/block-select-button.js +1 -3
  254. package/build-module/components/list-view/block-select-button.js.map +1 -1
  255. package/build-module/components/list-view/block.js +13 -1
  256. package/build-module/components/list-view/block.js.map +1 -1
  257. package/build-module/components/list-view/use-block-selection.js +30 -25
  258. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  259. package/build-module/components/media-placeholder/index.js +2 -2
  260. package/build-module/components/media-placeholder/index.js.map +1 -1
  261. package/build-module/components/media-placeholder/index.native.js +7 -7
  262. package/build-module/components/media-placeholder/index.native.js.map +1 -1
  263. package/build-module/components/media-replace-flow/index.js +2 -3
  264. package/build-module/components/media-replace-flow/index.js.map +1 -1
  265. package/build-module/components/media-upload/constants.js +14 -0
  266. package/build-module/components/media-upload/constants.js.map +1 -0
  267. package/build-module/components/media-upload/index.native.js +53 -34
  268. package/build-module/components/media-upload/index.native.js.map +1 -1
  269. package/build-module/components/preview-options/index.js +1 -1
  270. package/build-module/components/preview-options/index.js.map +1 -1
  271. package/build-module/components/rich-text/index.js +35 -37
  272. package/build-module/components/rich-text/index.js.map +1 -1
  273. package/build-module/components/rich-text/index.native.js +15 -33
  274. package/build-module/components/rich-text/index.native.js.map +1 -1
  275. package/build-module/components/rich-text/multiline.js +87 -0
  276. package/build-module/components/rich-text/multiline.js.map +1 -0
  277. package/build-module/components/rich-text/split-value.js +10 -16
  278. package/build-module/components/rich-text/split-value.js.map +1 -1
  279. package/build-module/components/rich-text/use-enter.js +33 -42
  280. package/build-module/components/rich-text/use-enter.js.map +1 -1
  281. package/build-module/components/rich-text/use-paste-handler.js +19 -34
  282. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  283. package/build-module/components/spacing-sizes-control/utils.js +2 -2
  284. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  285. package/build-module/components/use-block-commands/index.js +28 -16
  286. package/build-module/components/use-block-commands/index.js.map +1 -1
  287. package/build-module/components/use-block-display-information/index.js +5 -2
  288. package/build-module/components/use-block-display-information/index.js.map +1 -1
  289. package/build-module/hooks/background.js +244 -0
  290. package/build-module/hooks/background.js.map +1 -0
  291. package/build-module/hooks/block-hooks.js +181 -0
  292. package/build-module/hooks/block-hooks.js.map +1 -0
  293. package/build-module/hooks/block-rename-ui.js +153 -0
  294. package/build-module/hooks/block-rename-ui.js.map +1 -0
  295. package/build-module/hooks/duotone.js +26 -39
  296. package/build-module/hooks/duotone.js.map +1 -1
  297. package/build-module/hooks/index.js +2 -2
  298. package/build-module/hooks/index.js.map +1 -1
  299. package/build-module/hooks/layout.js +33 -16
  300. package/build-module/hooks/layout.js.map +1 -1
  301. package/build-module/hooks/position.js +4 -2
  302. package/build-module/hooks/position.js.map +1 -1
  303. package/build-module/hooks/style.js +73 -24
  304. package/build-module/hooks/style.js.map +1 -1
  305. package/build-module/hooks/utils.js +4 -0
  306. package/build-module/hooks/utils.js.map +1 -1
  307. package/build-module/private-apis.js +2 -0
  308. package/build-module/private-apis.js.map +1 -1
  309. package/build-module/store/actions.js +33 -10
  310. package/build-module/store/actions.js.map +1 -1
  311. package/build-module/store/private-actions.js +39 -8
  312. package/build-module/store/private-actions.js.map +1 -1
  313. package/build-module/store/private-selectors.js +21 -0
  314. package/build-module/store/private-selectors.js.map +1 -1
  315. package/build-module/store/reducer.js +41 -1
  316. package/build-module/store/reducer.js.map +1 -1
  317. package/build-module/store/selectors.js +78 -22
  318. package/build-module/store/selectors.js.map +1 -1
  319. package/build-module/store/utils.js +0 -4
  320. package/build-module/store/utils.js.map +1 -1
  321. package/build-style/content-rtl.css +0 -1
  322. package/build-style/content.css +0 -1
  323. package/build-style/style-rtl.css +174 -131
  324. package/build-style/style.css +174 -131
  325. package/package.json +32 -32
  326. package/src/components/block-canvas/index.js +108 -0
  327. package/src/components/block-inspector/index.js +5 -1
  328. package/src/components/block-list/content.scss +0 -1
  329. package/src/components/block-patterns-list/index.js +32 -7
  330. package/src/components/block-patterns-list/style.scss +26 -9
  331. package/src/components/block-patterns-paging/index.js +92 -0
  332. package/src/components/block-patterns-paging/style.scss +42 -0
  333. package/src/components/block-settings-menu/block-settings-dropdown.js +44 -0
  334. package/src/components/block-settings-menu-controls/index.js +4 -9
  335. package/src/components/block-styles/index.js +1 -0
  336. package/src/components/block-styles/style.scss +3 -3
  337. package/src/components/block-toolbar/block-toolbar-menu.native.js +1 -6
  338. package/src/components/block-tools/block-contextual-toolbar.js +16 -5
  339. package/src/components/block-tools/block-selection-button.js +9 -1
  340. package/src/components/block-tools/style.scss +0 -98
  341. package/src/components/border-radius-control/input-controls.js +1 -1
  342. package/src/components/border-radius-control/linked-button.js +8 -11
  343. package/src/components/color-palette/test/__snapshots__/control.js.snap +34 -21
  344. package/src/components/colors/with-colors.js +3 -2
  345. package/src/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -35
  346. package/src/components/default-block-appender/index.native.js +26 -3
  347. package/src/components/duotone/utils.js +65 -0
  348. package/src/components/editor-styles/index.js +32 -23
  349. package/src/components/global-styles/hooks.js +4 -112
  350. package/src/components/global-styles/image-settings-panel.js +71 -0
  351. package/src/components/global-styles/index.js +4 -3
  352. package/src/components/global-styles/use-global-styles-output.js +25 -16
  353. package/src/components/global-styles/utils.js +1 -2
  354. package/src/components/iframe/index.js +72 -33
  355. package/src/components/image-editor/use-save-image.js +2 -9
  356. package/src/components/image-editor/use-transform-image.js +9 -9
  357. package/src/components/index.js +1 -1
  358. package/src/components/index.native.js +2 -2
  359. package/src/components/inner-blocks/use-nested-settings-update.js +15 -10
  360. package/src/components/inserter/block-patterns-explorer/explorer.js +17 -5
  361. package/src/components/inserter/block-patterns-explorer/patterns-list.js +109 -40
  362. package/src/components/inserter/block-patterns-explorer/sidebar.js +23 -8
  363. package/src/components/inserter/block-patterns-source-filter.js +40 -0
  364. package/src/components/inserter/block-patterns-sync-filter.js +35 -0
  365. package/src/components/inserter/block-patterns-tab.js +168 -57
  366. package/src/components/inserter/hooks/use-patterns-paging.js +65 -0
  367. package/src/components/inserter/hooks/use-patterns-state.js +27 -16
  368. package/src/components/inserter/menu.js +15 -17
  369. package/src/components/inserter/search-results.js +6 -4
  370. package/src/components/inserter/style.scss +23 -2
  371. package/src/components/inserter/tabs.js +2 -12
  372. package/src/components/inserter/test/index.native.js +8 -12
  373. package/src/components/inspector-controls/block-support-slot-container.js +19 -3
  374. package/src/components/inspector-controls/fill.js +28 -14
  375. package/src/components/inspector-controls/groups.js +6 -2
  376. package/src/components/inspector-controls/slot.js +28 -3
  377. package/src/components/inspector-controls-tabs/styles-tab.js +4 -0
  378. package/src/components/link-control/index.js +14 -0
  379. package/src/components/link-control/settings.js +1 -0
  380. package/src/components/link-control/style.scss +28 -7
  381. package/src/components/link-control/test/index.js +88 -6
  382. package/src/components/list-view/block-select-button.js +1 -3
  383. package/src/components/list-view/block.js +19 -1
  384. package/src/components/list-view/style.scss +1 -2
  385. package/src/components/list-view/use-block-selection.js +38 -32
  386. package/src/components/media-placeholder/README.md +2 -2
  387. package/src/components/media-placeholder/index.js +2 -2
  388. package/src/components/media-placeholder/index.native.js +11 -12
  389. package/src/components/media-replace-flow/index.js +2 -2
  390. package/src/components/media-replace-flow/test/index.js +5 -23
  391. package/src/components/media-upload/README.md +3 -2
  392. package/src/components/media-upload/constants.js +15 -0
  393. package/src/components/media-upload/index.native.js +66 -40
  394. package/src/components/media-upload/style.native.scss +4 -0
  395. package/src/components/media-upload/test/index.native.js +2 -2
  396. package/src/components/preview-options/README.md +7 -0
  397. package/src/components/preview-options/index.js +1 -1
  398. package/src/components/rich-text/index.js +48 -44
  399. package/src/components/rich-text/index.native.js +14 -42
  400. package/src/components/rich-text/multiline.js +121 -0
  401. package/src/components/rich-text/split-value.js +10 -35
  402. package/src/components/rich-text/use-enter.js +32 -42
  403. package/src/components/rich-text/use-paste-handler.js +16 -40
  404. package/src/components/spacing-sizes-control/style.scss +5 -7
  405. package/src/components/spacing-sizes-control/utils.js +1 -2
  406. package/src/components/use-block-commands/index.js +28 -20
  407. package/src/components/use-block-display-information/index.js +3 -0
  408. package/src/hooks/background.js +288 -0
  409. package/src/hooks/background.scss +57 -0
  410. package/src/hooks/block-hooks.js +257 -0
  411. package/src/hooks/block-hooks.scss +16 -0
  412. package/src/hooks/block-rename-ui.js +230 -0
  413. package/src/hooks/block-rename-ui.scss +3 -0
  414. package/src/hooks/duotone.js +42 -43
  415. package/src/hooks/index.js +2 -2
  416. package/src/hooks/layout.js +31 -33
  417. package/src/hooks/position.js +4 -3
  418. package/src/hooks/style.js +96 -37
  419. package/src/hooks/test/align.native.js +4 -3
  420. package/src/hooks/utils.js +4 -0
  421. package/src/private-apis.js +2 -0
  422. package/src/store/actions.js +52 -10
  423. package/src/store/private-actions.js +37 -6
  424. package/src/store/private-selectors.js +21 -0
  425. package/src/store/reducer.js +38 -0
  426. package/src/store/selectors.js +107 -26
  427. package/src/store/test/actions.js +19 -8
  428. package/src/store/test/private-actions.js +17 -0
  429. package/src/store/test/reducer.js +25 -0
  430. package/src/store/test/selectors.js +130 -123
  431. package/src/store/utils.js +3 -10
  432. package/src/style.scss +4 -0
  433. package/build/components/duotone/components.js +0 -135
  434. package/build/components/duotone/components.js.map +0 -1
  435. package/build/components/duotone/index.js +0 -38
  436. package/build/components/duotone/index.js.map +0 -1
  437. package/build/components/global-styles/behaviors-panel.js +0 -64
  438. package/build/components/global-styles/behaviors-panel.js.map +0 -1
  439. package/build/components/inserter/reusable-blocks-tab.js +0 -85
  440. package/build/components/inserter/reusable-blocks-tab.js.map +0 -1
  441. package/build/hooks/auto-inserting-blocks.js +0 -174
  442. package/build/hooks/auto-inserting-blocks.js.map +0 -1
  443. package/build/hooks/behaviors.js +0 -173
  444. package/build/hooks/behaviors.js.map +0 -1
  445. package/build-module/components/duotone/components.js +0 -126
  446. package/build-module/components/duotone/components.js.map +0 -1
  447. package/build-module/components/duotone/index.js +0 -3
  448. package/build-module/components/duotone/index.js.map +0 -1
  449. package/build-module/components/global-styles/behaviors-panel.js +0 -57
  450. package/build-module/components/global-styles/behaviors-panel.js.map +0 -1
  451. package/build-module/components/inserter/reusable-blocks-tab.js +0 -76
  452. package/build-module/components/inserter/reusable-blocks-tab.js.map +0 -1
  453. package/build-module/hooks/auto-inserting-blocks.js +0 -167
  454. package/build-module/hooks/auto-inserting-blocks.js.map +0 -1
  455. package/build-module/hooks/behaviors.js +0 -166
  456. package/build-module/hooks/behaviors.js.map +0 -1
  457. package/src/components/duotone/components.js +0 -133
  458. package/src/components/duotone/index.js +0 -7
  459. package/src/components/global-styles/behaviors-panel.js +0 -71
  460. package/src/components/inserter/reusable-blocks-tab.js +0 -84
  461. package/src/components/inserter/test/reusable-blocks-tab.js +0 -73
  462. package/src/hooks/auto-inserting-blocks.js +0 -232
  463. package/src/hooks/behaviors.js +0 -206
@@ -3,11 +3,12 @@ import { createElement, Fragment } from "@wordpress/element";
3
3
  * WordPress dependencies
4
4
  */
5
5
  import { useMemo, useState, useCallback, useRef, useEffect } from '@wordpress/element';
6
- import { _x, __, isRTL } from '@wordpress/i18n';
7
- import { useAsyncList, useViewportMatch } from '@wordpress/compose';
6
+ import { _x, __, _n, isRTL, sprintf } from '@wordpress/i18n';
7
+ import { useViewportMatch } from '@wordpress/compose';
8
8
  import { __experimentalItemGroup as ItemGroup, __experimentalItem as Item, __experimentalHStack as HStack, FlexBlock, Button } from '@wordpress/components';
9
9
  import { Icon, chevronRight, chevronLeft } from '@wordpress/icons';
10
10
  import { focus } from '@wordpress/dom';
11
+ import { speak } from '@wordpress/a11y';
11
12
 
12
13
  /**
13
14
  * Internal dependencies
@@ -16,13 +17,33 @@ import usePatternsState from './hooks/use-patterns-state';
16
17
  import BlockPatternList from '../block-patterns-list';
17
18
  import PatternsExplorerModal from './block-patterns-explorer/explorer';
18
19
  import MobileTabNavigation from './mobile-tab-navigation';
20
+ import BlockPatternsPaging from '../block-patterns-paging';
21
+ import usePatternsPaging from './hooks/use-patterns-paging';
22
+ import { PATTERN_TYPES, default as BlockPatternsSourceFilter } from './block-patterns-source-filter';
23
+ import { BlockPatternsSyncFilter, SYNC_TYPES } from './block-patterns-sync-filter';
19
24
  const noop = () => {};
20
-
21
- // Preferred order of pattern categories. Any other categories should
22
- // be at the bottom without any re-ordering.
23
- const patternCategoriesOrder = ['custom', 'featured', 'posts', 'text', 'gallery', 'call-to-action', 'banner', 'header', 'footer'];
24
- function usePatternsCategories(rootClientId) {
25
- const [allPatterns, allCategories] = usePatternsState(undefined, rootClientId);
25
+ export const allPatternsCategory = {
26
+ name: 'allPatterns',
27
+ label: __('All categories')
28
+ };
29
+ export function isPatternFiltered(pattern, sourceFilter, syncFilter) {
30
+ if (sourceFilter === PATTERN_TYPES.theme && pattern.name.startsWith('core/block')) {
31
+ return true;
32
+ }
33
+ if (sourceFilter === PATTERN_TYPES.user && !pattern.id) {
34
+ return true;
35
+ }
36
+ if (sourceFilter === PATTERN_TYPES.user && syncFilter === SYNC_TYPES.full && pattern.syncStatus !== '') {
37
+ return true;
38
+ }
39
+ if (sourceFilter === PATTERN_TYPES.user && syncFilter === SYNC_TYPES.unsynced && pattern.syncStatus !== 'unsynced') {
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ export function usePatternsCategories(rootClientId, sourceFilter = 'all') {
45
+ const [patterns, allCategories] = usePatternsState(undefined, rootClientId);
46
+ const filteredPatterns = useMemo(() => sourceFilter === 'all' ? patterns : patterns.filter(pattern => !isPatternFiltered(pattern, sourceFilter)), [sourceFilter, patterns]);
26
47
  const hasRegisteredCategory = useCallback(pattern => {
27
48
  if (!pattern.categories || !pattern.categories.length) {
28
49
  return false;
@@ -32,27 +53,23 @@ function usePatternsCategories(rootClientId) {
32
53
 
33
54
  // Remove any empty categories.
34
55
  const populatedCategories = useMemo(() => {
35
- const categories = allCategories.filter(category => allPatterns.some(pattern => pattern.categories?.includes(category.name))).sort(({
36
- name: aName
37
- }, {
38
- name: bName
39
- }) => {
40
- // Sort categories according to `patternCategoriesOrder`.
41
- let aIndex = patternCategoriesOrder.indexOf(aName);
42
- let bIndex = patternCategoriesOrder.indexOf(bName);
43
- // All other categories should come after that.
44
- if (aIndex < 0) aIndex = patternCategoriesOrder.length;
45
- if (bIndex < 0) bIndex = patternCategoriesOrder.length;
46
- return aIndex - bIndex;
47
- });
48
- if (allPatterns.some(pattern => !hasRegisteredCategory(pattern)) && !categories.find(category => category.name === 'uncategorized')) {
56
+ const categories = allCategories.filter(category => filteredPatterns.some(pattern => pattern.categories?.includes(category.name))).sort((a, b) => a.label.localeCompare(b.label));
57
+ if (filteredPatterns.some(pattern => !hasRegisteredCategory(pattern)) && !categories.find(category => category.name === 'uncategorized')) {
49
58
  categories.push({
50
59
  name: 'uncategorized',
51
60
  label: _x('Uncategorized')
52
61
  });
53
62
  }
63
+ if (filteredPatterns.length > 0) {
64
+ categories.unshift({
65
+ name: allPatternsCategory.name,
66
+ label: allPatternsCategory.label
67
+ });
68
+ }
69
+ speak(sprintf( /* translators: %d: number of categories . */
70
+ _n('%d category button displayed.', '%d category buttons displayed.', categories.length), categories.length));
54
71
  return categories;
55
- }, [allCategories, allPatterns, hasRegisteredCategory]);
72
+ }, [allCategories, filteredPatterns, hasRegisteredCategory]);
56
73
  return populatedCategories;
57
74
  }
58
75
  export function BlockPatternsCategoryDialog({
@@ -60,7 +77,8 @@ export function BlockPatternsCategoryDialog({
60
77
  onInsert,
61
78
  onHover,
62
79
  category,
63
- showTitlesAsTooltip
80
+ showTitlesAsTooltip,
81
+ patternFilter
64
82
  }) {
65
83
  const container = useRef();
66
84
  useEffect(() => {
@@ -78,7 +96,8 @@ export function BlockPatternsCategoryDialog({
78
96
  onInsert: onInsert,
79
97
  onHover: onHover,
80
98
  category: category,
81
- showTitlesAsTooltip: showTitlesAsTooltip
99
+ showTitlesAsTooltip: showTitlesAsTooltip,
100
+ patternFilter: patternFilter
82
101
  }));
83
102
  }
84
103
  export function BlockPatternsCategoryPanel({
@@ -86,12 +105,21 @@ export function BlockPatternsCategoryPanel({
86
105
  onInsert,
87
106
  onHover = noop,
88
107
  category,
89
- showTitlesAsTooltip
108
+ showTitlesAsTooltip,
109
+ patternFilter
90
110
  }) {
91
- const [allPatterns,, onClick] = usePatternsState(onInsert, rootClientId);
92
- const availableCategories = usePatternsCategories(rootClientId);
111
+ const [allPatterns,, onClickPattern] = usePatternsState(onInsert, rootClientId);
112
+ const [patternSyncFilter, setPatternSyncFilter] = useState('all');
113
+ const availableCategories = usePatternsCategories(rootClientId, patternFilter);
114
+ const container = useRef();
93
115
  const currentCategoryPatterns = useMemo(() => allPatterns.filter(pattern => {
94
116
  var _pattern$categories$f;
117
+ if (isPatternFiltered(pattern, patternFilter, patternSyncFilter)) {
118
+ return false;
119
+ }
120
+ if (category.name === allPatternsCategory.name) {
121
+ return true;
122
+ }
95
123
  if (category.name !== 'uncategorized') {
96
124
  return pattern.categories?.includes(category.name);
97
125
  }
@@ -100,28 +128,33 @@ export function BlockPatternsCategoryPanel({
100
128
  // or with no available category.
101
129
  const availablePatternCategories = (_pattern$categories$f = pattern.categories?.filter(cat => availableCategories.find(availableCategory => availableCategory.name === cat))) !== null && _pattern$categories$f !== void 0 ? _pattern$categories$f : [];
102
130
  return availablePatternCategories.length === 0;
103
- }), [allPatterns, availableCategories, category.name]);
104
- const categoryPatternsList = useAsyncList(currentCategoryPatterns);
131
+ }), [allPatterns, availableCategories, category.name, patternFilter, patternSyncFilter]);
132
+ const pagingProps = usePatternsPaging(currentCategoryPatterns, category, container);
105
133
 
106
134
  // Hide block pattern preview on unmount.
135
+ // eslint-disable-next-line react-hooks/exhaustive-deps
107
136
  useEffect(() => () => onHover(null), []);
108
- if (!currentCategoryPatterns.length) {
109
- return null;
110
- }
111
137
  return createElement("div", {
112
- className: "block-editor-inserter__patterns-category-panel"
138
+ className: "block-editor-inserter__patterns-category-panel",
139
+ ref: container
113
140
  }, createElement("div", {
114
141
  className: "block-editor-inserter__patterns-category-panel-title"
115
- }, category.label), createElement("p", null, category.description), createElement(BlockPatternList, {
116
- shownPatterns: categoryPatternsList,
117
- blockPatterns: currentCategoryPatterns,
118
- onClickPattern: onClick,
142
+ }, category.label), createElement("p", null, category.description), patternFilter === PATTERN_TYPES.user && createElement(BlockPatternsSyncFilter, {
143
+ patternSyncFilter: patternSyncFilter,
144
+ setPatternSyncFilter: setPatternSyncFilter
145
+ }), !currentCategoryPatterns.length && createElement("div", null, __('No results found')), currentCategoryPatterns.length > 0 && createElement(BlockPatternList, {
146
+ shownPatterns: pagingProps.categoryPatternsAsyncList,
147
+ blockPatterns: pagingProps.categoryPatterns,
148
+ onClickPattern: onClickPattern,
119
149
  onHover: onHover,
120
150
  label: category.label,
121
151
  orientation: "vertical",
122
- category: category.label,
152
+ category: category.name,
123
153
  isDraggable: true,
124
- showTitlesAsTooltip: showTitlesAsTooltip
154
+ showTitlesAsTooltip: showTitlesAsTooltip,
155
+ patternFilter: patternFilter
156
+ }), pagingProps.numPages > 1 && createElement(BlockPatternsPaging, {
157
+ ...pagingProps
125
158
  }));
126
159
  }
127
160
  function BlockPatternsTabs({
@@ -131,20 +164,27 @@ function BlockPatternsTabs({
131
164
  rootClientId
132
165
  }) {
133
166
  const [showPatternsExplorer, setShowPatternsExplorer] = useState(false);
134
- const categories = usePatternsCategories(rootClientId);
167
+ const [patternSourceFilter, setPatternSourceFilter] = useState('all');
168
+ const categories = usePatternsCategories(rootClientId, patternSourceFilter);
135
169
  const initialCategory = selectedCategory || categories[0];
136
170
  const isMobile = useViewportMatch('medium', '<');
137
171
  return createElement(Fragment, null, !isMobile && createElement("div", {
138
172
  className: "block-editor-inserter__block-patterns-tabs-container"
139
173
  }, createElement("nav", {
140
- "aria-label": __('Block pattern categories')
141
- }, createElement(ItemGroup, {
142
- role: "list",
174
+ "aria-label": __('Block pattern categories'),
143
175
  className: "block-editor-inserter__block-patterns-tabs"
176
+ }, createElement(BlockPatternsSourceFilter, {
177
+ value: patternSourceFilter,
178
+ onChange: value => {
179
+ setPatternSourceFilter(value);
180
+ onSelectCategory(allPatternsCategory, value);
181
+ }
182
+ }), createElement(ItemGroup, {
183
+ role: "list"
144
184
  }, categories.map(category => createElement(Item, {
145
185
  role: "listitem",
146
186
  key: category.name,
147
- onClick: () => onSelectCategory(category),
187
+ onClick: () => onSelectCategory(category, patternSourceFilter),
148
188
  className: category === selectedCategory ? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category' : 'block-editor-inserter__patterns-category',
149
189
  "aria-label": category.label,
150
190
  "aria-current": category === selectedCategory ? 'true' : undefined
@@ -166,7 +206,8 @@ function BlockPatternsTabs({
166
206
  })), showPatternsExplorer && createElement(PatternsExplorerModal, {
167
207
  initialCategory: initialCategory,
168
208
  patternCategories: categories,
169
- onModalClose: () => setShowPatternsExplorer(false)
209
+ onModalClose: () => setShowPatternsExplorer(false),
210
+ rootClientId: rootClientId
170
211
  }));
171
212
  }
172
213
  export default BlockPatternsTabs;
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","useState","useCallback","useRef","useEffect","_x","__","isRTL","useAsyncList","useViewportMatch","__experimentalItemGroup","ItemGroup","__experimentalItem","Item","__experimentalHStack","HStack","FlexBlock","Button","Icon","chevronRight","chevronLeft","focus","usePatternsState","BlockPatternList","PatternsExplorerModal","MobileTabNavigation","noop","patternCategoriesOrder","usePatternsCategories","rootClientId","allPatterns","allCategories","undefined","hasRegisteredCategory","pattern","categories","length","some","cat","category","name","populatedCategories","filter","includes","sort","aName","bName","aIndex","indexOf","bIndex","find","push","label","BlockPatternsCategoryDialog","onInsert","onHover","showTitlesAsTooltip","container","timeout","setTimeout","firstTabbable","tabbable","current","clearTimeout","createElement","ref","className","BlockPatternsCategoryPanel","onClick","availableCategories","currentCategoryPatterns","_pattern$categories$f","availablePatternCategories","availableCategory","categoryPatternsList","description","shownPatterns","blockPatterns","onClickPattern","orientation","isDraggable","BlockPatternsTabs","onSelectCategory","selectedCategory","showPatternsExplorer","setShowPatternsExplorer","initialCategory","isMobile","Fragment","role","map","key","icon","variant","patternCategories","onModalClose"],"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-tab.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tuseMemo,\n\tuseState,\n\tuseCallback,\n\tuseRef,\n\tuseEffect,\n} from '@wordpress/element';\nimport { _x, __, isRTL } from '@wordpress/i18n';\nimport { useAsyncList, useViewportMatch } from '@wordpress/compose';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalHStack as HStack,\n\tFlexBlock,\n\tButton,\n} from '@wordpress/components';\nimport { Icon, chevronRight, chevronLeft } from '@wordpress/icons';\nimport { focus } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport usePatternsState from './hooks/use-patterns-state';\nimport BlockPatternList from '../block-patterns-list';\nimport PatternsExplorerModal from './block-patterns-explorer/explorer';\nimport MobileTabNavigation from './mobile-tab-navigation';\n\nconst noop = () => {};\n\n// Preferred order of pattern categories. Any other categories should\n// be at the bottom without any re-ordering.\nconst patternCategoriesOrder = [\n\t'custom',\n\t'featured',\n\t'posts',\n\t'text',\n\t'gallery',\n\t'call-to-action',\n\t'banner',\n\t'header',\n\t'footer',\n];\n\nfunction usePatternsCategories( rootClientId ) {\n\tconst [ allPatterns, allCategories ] = usePatternsState(\n\t\tundefined,\n\t\trootClientId\n\t);\n\n\tconst hasRegisteredCategory = useCallback(\n\t\t( pattern ) => {\n\t\t\tif ( ! pattern.categories || ! pattern.categories.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn pattern.categories.some( ( cat ) =>\n\t\t\t\tallCategories.some( ( category ) => category.name === cat )\n\t\t\t);\n\t\t},\n\t\t[ allCategories ]\n\t);\n\n\t// Remove any empty categories.\n\tconst populatedCategories = useMemo( () => {\n\t\tconst categories = allCategories\n\t\t\t.filter( ( category ) =>\n\t\t\t\tallPatterns.some( ( pattern ) =>\n\t\t\t\t\tpattern.categories?.includes( category.name )\n\t\t\t\t)\n\t\t\t)\n\t\t\t.sort( ( { name: aName }, { name: bName } ) => {\n\t\t\t\t// Sort categories according to `patternCategoriesOrder`.\n\t\t\t\tlet aIndex = patternCategoriesOrder.indexOf( aName );\n\t\t\t\tlet bIndex = patternCategoriesOrder.indexOf( bName );\n\t\t\t\t// All other categories should come after that.\n\t\t\t\tif ( aIndex < 0 ) aIndex = patternCategoriesOrder.length;\n\t\t\t\tif ( bIndex < 0 ) bIndex = patternCategoriesOrder.length;\n\t\t\t\treturn aIndex - bIndex;\n\t\t\t} );\n\n\t\tif (\n\t\t\tallPatterns.some(\n\t\t\t\t( pattern ) => ! hasRegisteredCategory( pattern )\n\t\t\t) &&\n\t\t\t! categories.find(\n\t\t\t\t( category ) => category.name === 'uncategorized'\n\t\t\t)\n\t\t) {\n\t\t\tcategories.push( {\n\t\t\t\tname: 'uncategorized',\n\t\t\t\tlabel: _x( 'Uncategorized' ),\n\t\t\t} );\n\t\t}\n\n\t\treturn categories;\n\t}, [ allCategories, allPatterns, hasRegisteredCategory ] );\n\n\treturn populatedCategories;\n}\n\nexport function BlockPatternsCategoryDialog( {\n\trootClientId,\n\tonInsert,\n\tonHover,\n\tcategory,\n\tshowTitlesAsTooltip,\n} ) {\n\tconst container = useRef();\n\n\tuseEffect( () => {\n\t\tconst timeout = setTimeout( () => {\n\t\t\tconst [ firstTabbable ] = focus.tabbable.find( container.current );\n\t\t\tfirstTabbable?.focus();\n\t\t} );\n\t\treturn () => clearTimeout( timeout );\n\t}, [ category ] );\n\n\treturn (\n\t\t<div\n\t\t\tref={ container }\n\t\t\tclassName=\"block-editor-inserter__patterns-category-dialog\"\n\t\t>\n\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t\tonInsert={ onInsert }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tcategory={ category }\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport function BlockPatternsCategoryPanel( {\n\trootClientId,\n\tonInsert,\n\tonHover = noop,\n\tcategory,\n\tshowTitlesAsTooltip,\n} ) {\n\tconst [ allPatterns, , onClick ] = usePatternsState(\n\t\tonInsert,\n\t\trootClientId\n\t);\n\n\tconst availableCategories = usePatternsCategories( rootClientId );\n\tconst currentCategoryPatterns = useMemo(\n\t\t() =>\n\t\t\tallPatterns.filter( ( pattern ) => {\n\t\t\t\tif ( category.name !== 'uncategorized' ) {\n\t\t\t\t\treturn pattern.categories?.includes( category.name );\n\t\t\t\t}\n\n\t\t\t\t// The uncategorized category should show all the patterns without any category\n\t\t\t\t// or with no available category.\n\t\t\t\tconst availablePatternCategories =\n\t\t\t\t\tpattern.categories?.filter( ( cat ) =>\n\t\t\t\t\t\tavailableCategories.find(\n\t\t\t\t\t\t\t( availableCategory ) =>\n\t\t\t\t\t\t\t\tavailableCategory.name === cat\n\t\t\t\t\t\t)\n\t\t\t\t\t) ?? [];\n\n\t\t\t\treturn availablePatternCategories.length === 0;\n\t\t\t} ),\n\t\t[ allPatterns, availableCategories, category.name ]\n\t);\n\n\tconst categoryPatternsList = useAsyncList( currentCategoryPatterns );\n\n\t// Hide block pattern preview on unmount.\n\tuseEffect( () => () => onHover( null ), [] );\n\n\tif ( ! currentCategoryPatterns.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"block-editor-inserter__patterns-category-panel\">\n\t\t\t<div className=\"block-editor-inserter__patterns-category-panel-title\">\n\t\t\t\t{ category.label }\n\t\t\t</div>\n\t\t\t<p>{ category.description }</p>\n\t\t\t<BlockPatternList\n\t\t\t\tshownPatterns={ categoryPatternsList }\n\t\t\t\tblockPatterns={ currentCategoryPatterns }\n\t\t\t\tonClickPattern={ onClick }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tlabel={ category.label }\n\t\t\t\torientation=\"vertical\"\n\t\t\t\tcategory={ category.label }\n\t\t\t\tisDraggable\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction BlockPatternsTabs( {\n\tonSelectCategory,\n\tselectedCategory,\n\tonInsert,\n\trootClientId,\n} ) {\n\tconst [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );\n\tconst categories = usePatternsCategories( rootClientId );\n\tconst initialCategory = selectedCategory || categories[ 0 ];\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn (\n\t\t<>\n\t\t\t{ ! isMobile && (\n\t\t\t\t<div className=\"block-editor-inserter__block-patterns-tabs-container\">\n\t\t\t\t\t<nav aria-label={ __( 'Block pattern categories' ) }>\n\t\t\t\t\t\t<ItemGroup\n\t\t\t\t\t\t\trole=\"list\"\n\t\t\t\t\t\t\tclassName=\"block-editor-inserter__block-patterns-tabs\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ categories.map( ( category ) => (\n\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\t\t\t\tkey={ category.name }\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tonSelectCategory( category )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category'\n\t\t\t\t\t\t\t\t\t\t\t: 'block-editor-inserter__patterns-category'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taria-label={ category.label }\n\t\t\t\t\t\t\t\t\taria-current={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<HStack>\n\t\t\t\t\t\t\t\t\t\t<FlexBlock>\n\t\t\t\t\t\t\t\t\t\t\t{ category.label }\n\t\t\t\t\t\t\t\t\t\t</FlexBlock>\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\tisRTL()\n\t\t\t\t\t\t\t\t\t\t\t\t\t? chevronLeft\n\t\t\t\t\t\t\t\t\t\t\t\t\t: chevronRight\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t\t<div role=\"listitem\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"block-editor-inserter__patterns-explore-button\"\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tsetShowPatternsExplorer( true )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Explore all patterns' ) }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</nav>\n\t\t\t\t</div>\n\t\t\t) }\n\t\t\t{ isMobile && (\n\t\t\t\t<MobileTabNavigation categories={ categories }>\n\t\t\t\t\t{ ( category ) => (\n\t\t\t\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\t\t\t\tonInsert={ onInsert }\n\t\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\t\tshowTitlesAsTooltip={ false }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</MobileTabNavigation>\n\t\t\t) }\n\t\t\t{ showPatternsExplorer && (\n\t\t\t\t<PatternsExplorerModal\n\t\t\t\t\tinitialCategory={ initialCategory }\n\t\t\t\t\tpatternCategories={ categories }\n\t\t\t\t\tonModalClose={ () => setShowPatternsExplorer( false ) }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport default BlockPatternsTabs;\n"],"mappings":"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"}
1
+ {"version":3,"names":["useMemo","useState","useCallback","useRef","useEffect","_x","__","_n","isRTL","sprintf","useViewportMatch","__experimentalItemGroup","ItemGroup","__experimentalItem","Item","__experimentalHStack","HStack","FlexBlock","Button","Icon","chevronRight","chevronLeft","focus","speak","usePatternsState","BlockPatternList","PatternsExplorerModal","MobileTabNavigation","BlockPatternsPaging","usePatternsPaging","PATTERN_TYPES","default","BlockPatternsSourceFilter","BlockPatternsSyncFilter","SYNC_TYPES","noop","allPatternsCategory","name","label","isPatternFiltered","pattern","sourceFilter","syncFilter","theme","startsWith","user","id","full","syncStatus","unsynced","usePatternsCategories","rootClientId","patterns","allCategories","undefined","filteredPatterns","filter","hasRegisteredCategory","categories","length","some","cat","category","populatedCategories","includes","sort","a","b","localeCompare","find","push","unshift","BlockPatternsCategoryDialog","onInsert","onHover","showTitlesAsTooltip","patternFilter","container","timeout","setTimeout","firstTabbable","tabbable","current","clearTimeout","createElement","ref","className","BlockPatternsCategoryPanel","allPatterns","onClickPattern","patternSyncFilter","setPatternSyncFilter","availableCategories","currentCategoryPatterns","_pattern$categories$f","availablePatternCategories","availableCategory","pagingProps","description","shownPatterns","categoryPatternsAsyncList","blockPatterns","categoryPatterns","orientation","isDraggable","numPages","BlockPatternsTabs","onSelectCategory","selectedCategory","showPatternsExplorer","setShowPatternsExplorer","patternSourceFilter","setPatternSourceFilter","initialCategory","isMobile","Fragment","value","onChange","role","map","key","onClick","icon","variant","patternCategories","onModalClose"],"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-tab.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tuseMemo,\n\tuseState,\n\tuseCallback,\n\tuseRef,\n\tuseEffect,\n} from '@wordpress/element';\nimport { _x, __, _n, isRTL, sprintf } from '@wordpress/i18n';\nimport { useViewportMatch } from '@wordpress/compose';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalHStack as HStack,\n\tFlexBlock,\n\tButton,\n} from '@wordpress/components';\nimport { Icon, chevronRight, chevronLeft } from '@wordpress/icons';\nimport { focus } from '@wordpress/dom';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport usePatternsState from './hooks/use-patterns-state';\nimport BlockPatternList from '../block-patterns-list';\nimport PatternsExplorerModal from './block-patterns-explorer/explorer';\nimport MobileTabNavigation from './mobile-tab-navigation';\nimport BlockPatternsPaging from '../block-patterns-paging';\nimport usePatternsPaging from './hooks/use-patterns-paging';\nimport {\n\tPATTERN_TYPES,\n\tdefault as BlockPatternsSourceFilter,\n} from './block-patterns-source-filter';\nimport {\n\tBlockPatternsSyncFilter,\n\tSYNC_TYPES,\n} from './block-patterns-sync-filter';\n\nconst noop = () => {};\n\nexport const allPatternsCategory = {\n\tname: 'allPatterns',\n\tlabel: __( 'All categories' ),\n};\n\nexport function isPatternFiltered( pattern, sourceFilter, syncFilter ) {\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.theme &&\n\t\tpattern.name.startsWith( 'core/block' )\n\t) {\n\t\treturn true;\n\t}\n\tif ( sourceFilter === PATTERN_TYPES.user && ! pattern.id ) {\n\t\treturn true;\n\t}\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.user &&\n\t\tsyncFilter === SYNC_TYPES.full &&\n\t\tpattern.syncStatus !== ''\n\t) {\n\t\treturn true;\n\t}\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.user &&\n\t\tsyncFilter === SYNC_TYPES.unsynced &&\n\t\tpattern.syncStatus !== 'unsynced'\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport function usePatternsCategories( rootClientId, sourceFilter = 'all' ) {\n\tconst [ patterns, allCategories ] = usePatternsState(\n\t\tundefined,\n\t\trootClientId\n\t);\n\n\tconst filteredPatterns = useMemo(\n\t\t() =>\n\t\t\tsourceFilter === 'all'\n\t\t\t\t? patterns\n\t\t\t\t: patterns.filter(\n\t\t\t\t\t\t( pattern ) =>\n\t\t\t\t\t\t\t! isPatternFiltered( pattern, sourceFilter )\n\t\t\t\t ),\n\t\t[ sourceFilter, patterns ]\n\t);\n\n\tconst hasRegisteredCategory = useCallback(\n\t\t( pattern ) => {\n\t\t\tif ( ! pattern.categories || ! pattern.categories.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn pattern.categories.some( ( cat ) =>\n\t\t\t\tallCategories.some( ( category ) => category.name === cat )\n\t\t\t);\n\t\t},\n\t\t[ allCategories ]\n\t);\n\n\t// Remove any empty categories.\n\tconst populatedCategories = useMemo( () => {\n\t\tconst categories = allCategories\n\t\t\t.filter( ( category ) =>\n\t\t\t\tfilteredPatterns.some( ( pattern ) =>\n\t\t\t\t\tpattern.categories?.includes( category.name )\n\t\t\t\t)\n\t\t\t)\n\t\t\t.sort( ( a, b ) => a.label.localeCompare( b.label ) );\n\n\t\tif (\n\t\t\tfilteredPatterns.some(\n\t\t\t\t( pattern ) => ! hasRegisteredCategory( pattern )\n\t\t\t) &&\n\t\t\t! categories.find(\n\t\t\t\t( category ) => category.name === 'uncategorized'\n\t\t\t)\n\t\t) {\n\t\t\tcategories.push( {\n\t\t\t\tname: 'uncategorized',\n\t\t\t\tlabel: _x( 'Uncategorized' ),\n\t\t\t} );\n\t\t}\n\t\tif ( filteredPatterns.length > 0 ) {\n\t\t\tcategories.unshift( {\n\t\t\t\tname: allPatternsCategory.name,\n\t\t\t\tlabel: allPatternsCategory.label,\n\t\t\t} );\n\t\t}\n\t\tspeak(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %d: number of categories . */\n\t\t\t\t_n(\n\t\t\t\t\t'%d category button displayed.',\n\t\t\t\t\t'%d category buttons displayed.',\n\t\t\t\t\tcategories.length\n\t\t\t\t),\n\t\t\t\tcategories.length\n\t\t\t)\n\t\t);\n\t\treturn categories;\n\t}, [ allCategories, filteredPatterns, hasRegisteredCategory ] );\n\n\treturn populatedCategories;\n}\n\nexport function BlockPatternsCategoryDialog( {\n\trootClientId,\n\tonInsert,\n\tonHover,\n\tcategory,\n\tshowTitlesAsTooltip,\n\tpatternFilter,\n} ) {\n\tconst container = useRef();\n\n\tuseEffect( () => {\n\t\tconst timeout = setTimeout( () => {\n\t\t\tconst [ firstTabbable ] = focus.tabbable.find( container.current );\n\t\t\tfirstTabbable?.focus();\n\t\t} );\n\t\treturn () => clearTimeout( timeout );\n\t}, [ category ] );\n\n\treturn (\n\t\t<div\n\t\t\tref={ container }\n\t\t\tclassName=\"block-editor-inserter__patterns-category-dialog\"\n\t\t>\n\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t\tonInsert={ onInsert }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tcategory={ category }\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t\tpatternFilter={ patternFilter }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport function BlockPatternsCategoryPanel( {\n\trootClientId,\n\tonInsert,\n\tonHover = noop,\n\tcategory,\n\tshowTitlesAsTooltip,\n\tpatternFilter,\n} ) {\n\tconst [ allPatterns, , onClickPattern ] = usePatternsState(\n\t\tonInsert,\n\t\trootClientId\n\t);\n\tconst [ patternSyncFilter, setPatternSyncFilter ] = useState( 'all' );\n\n\tconst availableCategories = usePatternsCategories(\n\t\trootClientId,\n\t\tpatternFilter\n\t);\n\tconst container = useRef();\n\tconst currentCategoryPatterns = useMemo(\n\t\t() =>\n\t\t\tallPatterns.filter( ( pattern ) => {\n\t\t\t\tif (\n\t\t\t\t\tisPatternFiltered(\n\t\t\t\t\t\tpattern,\n\t\t\t\t\t\tpatternFilter,\n\t\t\t\t\t\tpatternSyncFilter\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( category.name === allPatternsCategory.name ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif ( category.name !== 'uncategorized' ) {\n\t\t\t\t\treturn pattern.categories?.includes( category.name );\n\t\t\t\t}\n\n\t\t\t\t// The uncategorized category should show all the patterns without any category\n\t\t\t\t// or with no available category.\n\t\t\t\tconst availablePatternCategories =\n\t\t\t\t\tpattern.categories?.filter( ( cat ) =>\n\t\t\t\t\t\tavailableCategories.find(\n\t\t\t\t\t\t\t( availableCategory ) =>\n\t\t\t\t\t\t\t\tavailableCategory.name === cat\n\t\t\t\t\t\t)\n\t\t\t\t\t) ?? [];\n\n\t\t\t\treturn availablePatternCategories.length === 0;\n\t\t\t} ),\n\t\t[\n\t\t\tallPatterns,\n\t\t\tavailableCategories,\n\t\t\tcategory.name,\n\t\t\tpatternFilter,\n\t\t\tpatternSyncFilter,\n\t\t]\n\t);\n\n\tconst pagingProps = usePatternsPaging(\n\t\tcurrentCategoryPatterns,\n\t\tcategory,\n\t\tcontainer\n\t);\n\n\t// Hide block pattern preview on unmount.\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\tuseEffect( () => () => onHover( null ), [] );\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"block-editor-inserter__patterns-category-panel\"\n\t\t\tref={ container }\n\t\t>\n\t\t\t<div className=\"block-editor-inserter__patterns-category-panel-title\">\n\t\t\t\t{ category.label }\n\t\t\t</div>\n\t\t\t<p>{ category.description }</p>\n\t\t\t{ patternFilter === PATTERN_TYPES.user && (\n\t\t\t\t<BlockPatternsSyncFilter\n\t\t\t\t\tpatternSyncFilter={ patternSyncFilter }\n\t\t\t\t\tsetPatternSyncFilter={ setPatternSyncFilter }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! currentCategoryPatterns.length && (\n\t\t\t\t<div>{ __( 'No results found' ) }</div>\n\t\t\t) }\n\t\t\t{ currentCategoryPatterns.length > 0 && (\n\t\t\t\t<BlockPatternList\n\t\t\t\t\tshownPatterns={ pagingProps.categoryPatternsAsyncList }\n\t\t\t\t\tblockPatterns={ pagingProps.categoryPatterns }\n\t\t\t\t\tonClickPattern={ onClickPattern }\n\t\t\t\t\tonHover={ onHover }\n\t\t\t\t\tlabel={ category.label }\n\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\tcategory={ category.name }\n\t\t\t\t\tisDraggable\n\t\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t\t\tpatternFilter={ patternFilter }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ pagingProps.numPages > 1 && (\n\t\t\t\t<BlockPatternsPaging { ...pagingProps } />\n\t\t\t) }\n\t\t</div>\n\t);\n}\n\nfunction BlockPatternsTabs( {\n\tonSelectCategory,\n\tselectedCategory,\n\tonInsert,\n\trootClientId,\n} ) {\n\tconst [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );\n\tconst [ patternSourceFilter, setPatternSourceFilter ] = useState( 'all' );\n\n\tconst categories = usePatternsCategories(\n\t\trootClientId,\n\t\tpatternSourceFilter\n\t);\n\n\tconst initialCategory = selectedCategory || categories[ 0 ];\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn (\n\t\t<>\n\t\t\t{ ! isMobile && (\n\t\t\t\t<div className=\"block-editor-inserter__block-patterns-tabs-container\">\n\t\t\t\t\t<nav\n\t\t\t\t\t\taria-label={ __( 'Block pattern categories' ) }\n\t\t\t\t\t\tclassName=\"block-editor-inserter__block-patterns-tabs\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<BlockPatternsSourceFilter\n\t\t\t\t\t\t\tvalue={ patternSourceFilter }\n\t\t\t\t\t\t\tonChange={ ( value ) => {\n\t\t\t\t\t\t\t\tsetPatternSourceFilter( value );\n\t\t\t\t\t\t\t\tonSelectCategory( allPatternsCategory, value );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<ItemGroup role=\"list\">\n\t\t\t\t\t\t\t{ categories.map( ( category ) => (\n\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\t\t\t\tkey={ category.name }\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tonSelectCategory(\n\t\t\t\t\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\t\t\t\t\tpatternSourceFilter\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category'\n\t\t\t\t\t\t\t\t\t\t\t: 'block-editor-inserter__patterns-category'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taria-label={ category.label }\n\t\t\t\t\t\t\t\t\taria-current={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<HStack>\n\t\t\t\t\t\t\t\t\t\t<FlexBlock>\n\t\t\t\t\t\t\t\t\t\t\t{ category.label }\n\t\t\t\t\t\t\t\t\t\t</FlexBlock>\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\tisRTL()\n\t\t\t\t\t\t\t\t\t\t\t\t\t? chevronLeft\n\t\t\t\t\t\t\t\t\t\t\t\t\t: chevronRight\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t\t<div role=\"listitem\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"block-editor-inserter__patterns-explore-button\"\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tsetShowPatternsExplorer( true )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Explore all patterns' ) }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</nav>\n\t\t\t\t</div>\n\t\t\t) }\n\t\t\t{ isMobile && (\n\t\t\t\t<MobileTabNavigation categories={ categories }>\n\t\t\t\t\t{ ( category ) => (\n\t\t\t\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\t\t\t\tonInsert={ onInsert }\n\t\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\t\tshowTitlesAsTooltip={ false }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</MobileTabNavigation>\n\t\t\t) }\n\t\t\t{ showPatternsExplorer && (\n\t\t\t\t<PatternsExplorerModal\n\t\t\t\t\tinitialCategory={ initialCategory }\n\t\t\t\t\tpatternCategories={ categories }\n\t\t\t\t\tonModalClose={ () => setShowPatternsExplorer( false ) }\n\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport default BlockPatternsTabs;\n"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useMemo, useState } from '@wordpress/element';
5
+ import { useAsyncList, usePrevious } from '@wordpress/compose';
6
+ import { getScrollContainer } from '@wordpress/dom';
7
+ const PAGE_SIZE = 20;
8
+ const INITIAL_INSERTER_RESULTS = 5;
9
+
10
+ /**
11
+ * Supplies values needed to page the patterns list client side.
12
+ *
13
+ * @param {Array} currentCategoryPatterns An array of the current patterns to display.
14
+ * @param {string} currentCategory The currently selected category.
15
+ * @param {Object} scrollContainerRef Ref of container to to find scroll container for when moving between pages.
16
+ * @param {string} currentFilter The currently search filter.
17
+ *
18
+ * @return {Object} Returns the relevant paging values. (totalItems, categoryPatternsList, numPages, changePage, currentPage)
19
+ */
20
+ export default function usePatternsPaging(currentCategoryPatterns, currentCategory, scrollContainerRef, currentFilter = '') {
21
+ const [currentPage, setCurrentPage] = useState(1);
22
+ const previousCategory = usePrevious(currentCategory);
23
+ const previousFilter = usePrevious(currentFilter);
24
+ if ((previousCategory !== currentCategory || previousFilter !== currentFilter) && currentPage !== 1) {
25
+ setCurrentPage(1);
26
+ }
27
+ const totalItems = currentCategoryPatterns.length;
28
+ const pageIndex = currentPage - 1;
29
+ const categoryPatterns = useMemo(() => {
30
+ return currentCategoryPatterns.slice(pageIndex * PAGE_SIZE, pageIndex * PAGE_SIZE + PAGE_SIZE);
31
+ }, [pageIndex, currentCategoryPatterns]);
32
+ const categoryPatternsAsyncList = useAsyncList(categoryPatterns, {
33
+ step: INITIAL_INSERTER_RESULTS
34
+ });
35
+ const numPages = Math.ceil(currentCategoryPatterns.length / PAGE_SIZE);
36
+ const changePage = page => {
37
+ const scrollContainer = getScrollContainer(scrollContainerRef?.current);
38
+ scrollContainer?.scrollTo(0, 0);
39
+ setCurrentPage(page);
40
+ };
41
+ return {
42
+ totalItems,
43
+ categoryPatterns,
44
+ categoryPatternsAsyncList,
45
+ numPages,
46
+ changePage,
47
+ currentPage
48
+ };
49
+ }
50
+ //# sourceMappingURL=use-patterns-paging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useState","useAsyncList","usePrevious","getScrollContainer","PAGE_SIZE","INITIAL_INSERTER_RESULTS","usePatternsPaging","currentCategoryPatterns","currentCategory","scrollContainerRef","currentFilter","currentPage","setCurrentPage","previousCategory","previousFilter","totalItems","length","pageIndex","categoryPatterns","slice","categoryPatternsAsyncList","step","numPages","Math","ceil","changePage","page","scrollContainer","current","scrollTo"],"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-patterns-paging.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useMemo, useState } from '@wordpress/element';\nimport { useAsyncList, usePrevious } from '@wordpress/compose';\nimport { getScrollContainer } from '@wordpress/dom';\n\nconst PAGE_SIZE = 20;\nconst INITIAL_INSERTER_RESULTS = 5;\n\n/**\n * Supplies values needed to page the patterns list client side.\n *\n * @param {Array} currentCategoryPatterns An array of the current patterns to display.\n * @param {string} currentCategory The currently selected category.\n * @param {Object} scrollContainerRef Ref of container to to find scroll container for when moving between pages.\n * @param {string} currentFilter The currently search filter.\n *\n * @return {Object} Returns the relevant paging values. (totalItems, categoryPatternsList, numPages, changePage, currentPage)\n */\nexport default function usePatternsPaging(\n\tcurrentCategoryPatterns,\n\tcurrentCategory,\n\tscrollContainerRef,\n\tcurrentFilter = ''\n) {\n\tconst [ currentPage, setCurrentPage ] = useState( 1 );\n\tconst previousCategory = usePrevious( currentCategory );\n\tconst previousFilter = usePrevious( currentFilter );\n\tif (\n\t\t( previousCategory !== currentCategory ||\n\t\t\tpreviousFilter !== currentFilter ) &&\n\t\tcurrentPage !== 1\n\t) {\n\t\tsetCurrentPage( 1 );\n\t}\n\tconst totalItems = currentCategoryPatterns.length;\n\tconst pageIndex = currentPage - 1;\n\tconst categoryPatterns = useMemo( () => {\n\t\treturn currentCategoryPatterns.slice(\n\t\t\tpageIndex * PAGE_SIZE,\n\t\t\tpageIndex * PAGE_SIZE + PAGE_SIZE\n\t\t);\n\t}, [ pageIndex, currentCategoryPatterns ] );\n\tconst categoryPatternsAsyncList = useAsyncList( categoryPatterns, {\n\t\tstep: INITIAL_INSERTER_RESULTS,\n\t} );\n\tconst numPages = Math.ceil( currentCategoryPatterns.length / PAGE_SIZE );\n\tconst changePage = ( page ) => {\n\t\tconst scrollContainer = getScrollContainer(\n\t\t\tscrollContainerRef?.current\n\t\t);\n\t\tscrollContainer?.scrollTo( 0, 0 );\n\n\t\tsetCurrentPage( page );\n\t};\n\treturn {\n\t\ttotalItems,\n\t\tcategoryPatterns,\n\t\tcategoryPatternsAsyncList,\n\t\tnumPages,\n\t\tchangePage,\n\t\tcurrentPage,\n\t};\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,oBAAoB;AACtD,SAASC,YAAY,EAAEC,WAAW,QAAQ,oBAAoB;AAC9D,SAASC,kBAAkB,QAAQ,gBAAgB;AAEnD,MAAMC,SAAS,GAAG,EAAE;AACpB,MAAMC,wBAAwB,GAAG,CAAC;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,iBAAiBA,CACxCC,uBAAuB,EACvBC,eAAe,EACfC,kBAAkB,EAClBC,aAAa,GAAG,EAAE,EACjB;EACD,MAAM,CAAEC,WAAW,EAAEC,cAAc,CAAE,GAAGZ,QAAQ,CAAE,CAAE,CAAC;EACrD,MAAMa,gBAAgB,GAAGX,WAAW,CAAEM,eAAgB,CAAC;EACvD,MAAMM,cAAc,GAAGZ,WAAW,CAAEQ,aAAc,CAAC;EACnD,IACC,CAAEG,gBAAgB,KAAKL,eAAe,IACrCM,cAAc,KAAKJ,aAAa,KACjCC,WAAW,KAAK,CAAC,EAChB;IACDC,cAAc,CAAE,CAAE,CAAC;EACpB;EACA,MAAMG,UAAU,GAAGR,uBAAuB,CAACS,MAAM;EACjD,MAAMC,SAAS,GAAGN,WAAW,GAAG,CAAC;EACjC,MAAMO,gBAAgB,GAAGnB,OAAO,CAAE,MAAM;IACvC,OAAOQ,uBAAuB,CAACY,KAAK,CACnCF,SAAS,GAAGb,SAAS,EACrBa,SAAS,GAAGb,SAAS,GAAGA,SACzB,CAAC;EACF,CAAC,EAAE,CAAEa,SAAS,EAAEV,uBAAuB,CAAG,CAAC;EAC3C,MAAMa,yBAAyB,GAAGnB,YAAY,CAAEiB,gBAAgB,EAAE;IACjEG,IAAI,EAAEhB;EACP,CAAE,CAAC;EACH,MAAMiB,QAAQ,GAAGC,IAAI,CAACC,IAAI,CAAEjB,uBAAuB,CAACS,MAAM,GAAGZ,SAAU,CAAC;EACxE,MAAMqB,UAAU,GAAKC,IAAI,IAAM;IAC9B,MAAMC,eAAe,GAAGxB,kBAAkB,CACzCM,kBAAkB,EAAEmB,OACrB,CAAC;IACDD,eAAe,EAAEE,QAAQ,CAAE,CAAC,EAAE,CAAE,CAAC;IAEjCjB,cAAc,CAAEc,IAAK,CAAC;EACvB,CAAC;EACD,OAAO;IACNX,UAAU;IACVG,gBAAgB;IAChBE,yBAAyB;IACzBE,QAAQ;IACRG,UAAU;IACVd;EACD,CAAC;AACF"}
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useCallback, useMemo } from '@wordpress/element';
5
- import { cloneBlock } from '@wordpress/blocks';
5
+ import { cloneBlock, createBlock } from '@wordpress/blocks';
6
6
  import { useDispatch, useSelect } from '@wordpress/data';
7
7
  import { __, sprintf } from '@wordpress/i18n';
8
8
  import { store as noticesStore } from '@wordpress/notices';
@@ -11,11 +11,6 @@ import { store as noticesStore } from '@wordpress/notices';
11
11
  * Internal dependencies
12
12
  */
13
13
  import { store as blockEditorStore } from '../../../store';
14
- const CUSTOM_CATEGORY = {
15
- name: 'custom',
16
- label: __('My patterns'),
17
- description: __('Custom patterns added by site users.')
18
- };
19
14
 
20
15
  /**
21
16
  * Retrieves the block patterns inserter state.
@@ -28,23 +23,40 @@ const CUSTOM_CATEGORY = {
28
23
  const usePatternsState = (onInsert, rootClientId) => {
29
24
  const {
30
25
  patternCategories,
31
- patterns
26
+ patterns,
27
+ userPatternCategories
32
28
  } = useSelect(select => {
33
29
  const {
34
30
  __experimentalGetAllowedPatterns,
35
31
  getSettings
36
32
  } = select(blockEditorStore);
33
+ const {
34
+ __experimentalUserPatternCategories,
35
+ __experimentalBlockPatternCategories
36
+ } = getSettings();
37
37
  return {
38
38
  patterns: __experimentalGetAllowedPatterns(rootClientId),
39
- patternCategories: getSettings().__experimentalBlockPatternCategories
39
+ userPatternCategories: __experimentalUserPatternCategories,
40
+ patternCategories: __experimentalBlockPatternCategories
40
41
  };
41
42
  }, [rootClientId]);
42
- const allCategories = useMemo(() => [...patternCategories, CUSTOM_CATEGORY], [patternCategories]);
43
+ const allCategories = useMemo(() => {
44
+ const categories = [...patternCategories];
45
+ userPatternCategories?.forEach(userCategory => {
46
+ if (!categories.find(existingCategory => existingCategory.name === userCategory.name)) {
47
+ categories.push(userCategory);
48
+ }
49
+ });
50
+ return categories;
51
+ }, [patternCategories, userPatternCategories]);
43
52
  const {
44
53
  createSuccessNotice
45
54
  } = useDispatch(noticesStore);
46
55
  const onClickPattern = useCallback((pattern, blocks) => {
47
- onInsert((blocks !== null && blocks !== void 0 ? blocks : []).map(block => cloneBlock(block)), pattern.name);
56
+ const patternBlocks = pattern.id && pattern.syncStatus !== 'unsynced' ? [createBlock('core/block', {
57
+ ref: pattern.id
58
+ })] : blocks;
59
+ onInsert((patternBlocks !== null && patternBlocks !== void 0 ? patternBlocks : []).map(block => cloneBlock(block)), pattern.name);
48
60
  createSuccessNotice(sprintf( /* translators: %s: block pattern title. */
49
61
  __('Block pattern "%s" inserted.'), pattern.title), {
50
62
  type: 'snackbar',
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useMemo","cloneBlock","useDispatch","useSelect","__","sprintf","store","noticesStore","blockEditorStore","CUSTOM_CATEGORY","name","label","description","usePatternsState","onInsert","rootClientId","patternCategories","patterns","select","__experimentalGetAllowedPatterns","getSettings","__experimentalBlockPatternCategories","allCategories","createSuccessNotice","onClickPattern","pattern","blocks","map","block","title","type","id"],"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-patterns-state.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useCallback, useMemo } from '@wordpress/element';\nimport { cloneBlock } from '@wordpress/blocks';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\nconst CUSTOM_CATEGORY = {\n\tname: 'custom',\n\tlabel: __( 'My patterns' ),\n\tdescription: __( 'Custom patterns added by site users.' ),\n};\n\n/**\n * Retrieves the block patterns inserter state.\n *\n * @param {Function} onInsert function called when inserter a list of blocks.\n * @param {string=} rootClientId Insertion's root client ID.\n *\n * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler)\n */\nconst usePatternsState = ( onInsert, rootClientId ) => {\n\tconst { patternCategories, patterns } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalGetAllowedPatterns, getSettings } =\n\t\t\t\tselect( blockEditorStore );\n\n\t\t\treturn {\n\t\t\t\tpatterns: __experimentalGetAllowedPatterns( rootClientId ),\n\t\t\t\tpatternCategories:\n\t\t\t\t\tgetSettings().__experimentalBlockPatternCategories,\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\n\tconst allCategories = useMemo(\n\t\t() => [ ...patternCategories, CUSTOM_CATEGORY ],\n\t\t[ patternCategories ]\n\t);\n\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst onClickPattern = useCallback(\n\t\t( pattern, blocks ) => {\n\t\t\tonInsert(\n\t\t\t\t( blocks ?? [] ).map( ( block ) => cloneBlock( block ) ),\n\t\t\t\tpattern.name\n\t\t\t);\n\t\t\tcreateSuccessNotice(\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: block pattern title. */\n\t\t\t\t\t__( 'Block pattern \"%s\" inserted.' ),\n\t\t\t\t\tpattern.title\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\tid: 'block-pattern-inserted-notice',\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\t[ createSuccessNotice, onInsert ]\n\t);\n\n\treturn [ patterns, allCategories, onClickPattern ];\n};\n\nexport default usePatternsState;\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAW,EAAEC,OAAO,QAAQ,oBAAoB;AACzD,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,WAAW,EAAEC,SAAS,QAAQ,iBAAiB;AACxD,SAASC,EAAE,EAAEC,OAAO,QAAQ,iBAAiB;AAC7C,SAASC,KAAK,IAAIC,YAAY,QAAQ,oBAAoB;;AAE1D;AACA;AACA;AACA,SAASD,KAAK,IAAIE,gBAAgB,QAAQ,gBAAgB;AAE1D,MAAMC,eAAe,GAAG;EACvBC,IAAI,EAAE,QAAQ;EACdC,KAAK,EAAEP,EAAE,CAAE,aAAc,CAAC;EAC1BQ,WAAW,EAAER,EAAE,CAAE,sCAAuC;AACzD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMS,gBAAgB,GAAGA,CAAEC,QAAQ,EAAEC,YAAY,KAAM;EACtD,MAAM;IAAEC,iBAAiB;IAAEC;EAAS,CAAC,GAAGd,SAAS,CAC9Ce,MAAM,IAAM;IACb,MAAM;MAAEC,gCAAgC;MAAEC;IAAY,CAAC,GACtDF,MAAM,CAAEV,gBAAiB,CAAC;IAE3B,OAAO;MACNS,QAAQ,EAAEE,gCAAgC,CAAEJ,YAAa,CAAC;MAC1DC,iBAAiB,EAChBI,WAAW,CAAC,CAAC,CAACC;IAChB,CAAC;EACF,CAAC,EACD,CAAEN,YAAY,CACf,CAAC;EAED,MAAMO,aAAa,GAAGtB,OAAO,CAC5B,MAAM,CAAE,GAAGgB,iBAAiB,EAAEP,eAAe,CAAE,EAC/C,CAAEO,iBAAiB,CACpB,CAAC;EAED,MAAM;IAAEO;EAAoB,CAAC,GAAGrB,WAAW,CAAEK,YAAa,CAAC;EAC3D,MAAMiB,cAAc,GAAGzB,WAAW,CACjC,CAAE0B,OAAO,EAAEC,MAAM,KAAM;IACtBZ,QAAQ,CACP,CAAEY,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,EAAE,EAAGC,GAAG,CAAIC,KAAK,IAAM3B,UAAU,CAAE2B,KAAM,CAAE,CAAC,EACxDH,OAAO,CAACf,IACT,CAAC;IACDa,mBAAmB,CAClBlB,OAAO,EACN;IACAD,EAAE,CAAE,8BAA+B,CAAC,EACpCqB,OAAO,CAACI,KACT,CAAC,EACD;MACCC,IAAI,EAAE,UAAU;MAChBC,EAAE,EAAE;IACL,CACD,CAAC;EACF,CAAC,EACD,CAAER,mBAAmB,EAAET,QAAQ,CAChC,CAAC;EAED,OAAO,CAAEG,QAAQ,EAAEK,aAAa,EAAEE,cAAc,CAAE;AACnD,CAAC;AAED,eAAeX,gBAAgB"}
1
+ {"version":3,"names":["useCallback","useMemo","cloneBlock","createBlock","useDispatch","useSelect","__","sprintf","store","noticesStore","blockEditorStore","usePatternsState","onInsert","rootClientId","patternCategories","patterns","userPatternCategories","select","__experimentalGetAllowedPatterns","getSettings","__experimentalUserPatternCategories","__experimentalBlockPatternCategories","allCategories","categories","forEach","userCategory","find","existingCategory","name","push","createSuccessNotice","onClickPattern","pattern","blocks","patternBlocks","id","syncStatus","ref","map","block","title","type"],"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-patterns-state.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useCallback, useMemo } from '@wordpress/element';\nimport { cloneBlock, createBlock } from '@wordpress/blocks';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../../store';\n\n/**\n * Retrieves the block patterns inserter state.\n *\n * @param {Function} onInsert function called when inserter a list of blocks.\n * @param {string=} rootClientId Insertion's root client ID.\n *\n * @return {Array} Returns the patterns state. (patterns, categories, onSelect handler)\n */\nconst usePatternsState = ( onInsert, rootClientId ) => {\n\tconst { patternCategories, patterns, userPatternCategories } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { __experimentalGetAllowedPatterns, getSettings } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\tconst {\n\t\t\t\t__experimentalUserPatternCategories,\n\t\t\t\t__experimentalBlockPatternCategories,\n\t\t\t} = getSettings();\n\t\t\treturn {\n\t\t\t\tpatterns: __experimentalGetAllowedPatterns( rootClientId ),\n\t\t\t\tuserPatternCategories: __experimentalUserPatternCategories,\n\t\t\t\tpatternCategories: __experimentalBlockPatternCategories,\n\t\t\t};\n\t\t},\n\t\t[ rootClientId ]\n\t);\n\n\tconst allCategories = useMemo( () => {\n\t\tconst categories = [ ...patternCategories ];\n\t\tuserPatternCategories?.forEach( ( userCategory ) => {\n\t\t\tif (\n\t\t\t\t! categories.find(\n\t\t\t\t\t( existingCategory ) =>\n\t\t\t\t\t\texistingCategory.name === userCategory.name\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcategories.push( userCategory );\n\t\t\t}\n\t\t} );\n\t\treturn categories;\n\t}, [ patternCategories, userPatternCategories ] );\n\n\tconst { createSuccessNotice } = useDispatch( noticesStore );\n\tconst onClickPattern = useCallback(\n\t\t( pattern, blocks ) => {\n\t\t\tconst patternBlocks =\n\t\t\t\tpattern.id && pattern.syncStatus !== 'unsynced'\n\t\t\t\t\t? [ createBlock( 'core/block', { ref: pattern.id } ) ]\n\t\t\t\t\t: blocks;\n\t\t\tonInsert(\n\t\t\t\t( patternBlocks ?? [] ).map( ( block ) => cloneBlock( block ) ),\n\t\t\t\tpattern.name\n\t\t\t);\n\t\t\tcreateSuccessNotice(\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: block pattern title. */\n\t\t\t\t\t__( 'Block pattern \"%s\" inserted.' ),\n\t\t\t\t\tpattern.title\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\ttype: 'snackbar',\n\t\t\t\t\tid: 'block-pattern-inserted-notice',\n\t\t\t\t}\n\t\t\t);\n\t\t},\n\t\t[ createSuccessNotice, onInsert ]\n\t);\n\n\treturn [ patterns, allCategories, onClickPattern ];\n};\n\nexport default usePatternsState;\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,WAAW,EAAEC,OAAO,QAAQ,oBAAoB;AACzD,SAASC,UAAU,EAAEC,WAAW,QAAQ,mBAAmB;AAC3D,SAASC,WAAW,EAAEC,SAAS,QAAQ,iBAAiB;AACxD,SAASC,EAAE,EAAEC,OAAO,QAAQ,iBAAiB;AAC7C,SAASC,KAAK,IAAIC,YAAY,QAAQ,oBAAoB;;AAE1D;AACA;AACA;AACA,SAASD,KAAK,IAAIE,gBAAgB,QAAQ,gBAAgB;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,gBAAgB,GAAGA,CAAEC,QAAQ,EAAEC,YAAY,KAAM;EACtD,MAAM;IAAEC,iBAAiB;IAAEC,QAAQ;IAAEC;EAAsB,CAAC,GAAGX,SAAS,CACrEY,MAAM,IAAM;IACb,MAAM;MAAEC,gCAAgC;MAAEC;IAAY,CAAC,GACtDF,MAAM,CAAEP,gBAAiB,CAAC;IAC3B,MAAM;MACLU,mCAAmC;MACnCC;IACD,CAAC,GAAGF,WAAW,CAAC,CAAC;IACjB,OAAO;MACNJ,QAAQ,EAAEG,gCAAgC,CAAEL,YAAa,CAAC;MAC1DG,qBAAqB,EAAEI,mCAAmC;MAC1DN,iBAAiB,EAAEO;IACpB,CAAC;EACF,CAAC,EACD,CAAER,YAAY,CACf,CAAC;EAED,MAAMS,aAAa,GAAGrB,OAAO,CAAE,MAAM;IACpC,MAAMsB,UAAU,GAAG,CAAE,GAAGT,iBAAiB,CAAE;IAC3CE,qBAAqB,EAAEQ,OAAO,CAAIC,YAAY,IAAM;MACnD,IACC,CAAEF,UAAU,CAACG,IAAI,CACdC,gBAAgB,IACjBA,gBAAgB,CAACC,IAAI,KAAKH,YAAY,CAACG,IACzC,CAAC,EACA;QACDL,UAAU,CAACM,IAAI,CAAEJ,YAAa,CAAC;MAChC;IACD,CAAE,CAAC;IACH,OAAOF,UAAU;EAClB,CAAC,EAAE,CAAET,iBAAiB,EAAEE,qBAAqB,CAAG,CAAC;EAEjD,MAAM;IAAEc;EAAoB,CAAC,GAAG1B,WAAW,CAAEK,YAAa,CAAC;EAC3D,MAAMsB,cAAc,GAAG/B,WAAW,CACjC,CAAEgC,OAAO,EAAEC,MAAM,KAAM;IACtB,MAAMC,aAAa,GAClBF,OAAO,CAACG,EAAE,IAAIH,OAAO,CAACI,UAAU,KAAK,UAAU,GAC5C,CAAEjC,WAAW,CAAE,YAAY,EAAE;MAAEkC,GAAG,EAAEL,OAAO,CAACG;IAAG,CAAE,CAAC,CAAE,GACpDF,MAAM;IACVrB,QAAQ,CACP,CAAEsB,aAAa,aAAbA,aAAa,cAAbA,aAAa,GAAI,EAAE,EAAGI,GAAG,CAAIC,KAAK,IAAMrC,UAAU,CAAEqC,KAAM,CAAE,CAAC,EAC/DP,OAAO,CAACJ,IACT,CAAC;IACDE,mBAAmB,CAClBvB,OAAO,EACN;IACAD,EAAE,CAAE,8BAA+B,CAAC,EACpC0B,OAAO,CAACQ,KACT,CAAC,EACD;MACCC,IAAI,EAAE,UAAU;MAChBN,EAAE,EAAE;IACL,CACD,CAAC;EACF,CAAC,EACD,CAAEL,mBAAmB,EAAElB,QAAQ,CAChC,CAAC;EAED,OAAO,CAAEG,QAAQ,EAAEO,aAAa,EAAES,cAAc,CAAE;AACnD,CAAC;AAED,eAAepB,gBAAgB"}
@@ -19,7 +19,6 @@ import Tips from './tips';
19
19
  import InserterPreviewPanel from './preview-panel';
20
20
  import BlockTypesTab from './block-types-tab';
21
21
  import BlockPatternsTabs, { BlockPatternsCategoryDialog } from './block-patterns-tab';
22
- import ReusableBlocksTab from './reusable-blocks-tab';
23
22
  import { MediaTab, MediaCategoryDialog, useMediaCategories } from './media-tab';
24
23
  import InserterSearchResults from './search-results';
25
24
  import useDebouncedInput from './hooks/use-debounced-input';
@@ -41,6 +40,7 @@ function InserterMenu({
41
40
  const [filterValue, setFilterValue, delayedFilterValue] = useDebouncedInput(__experimentalFilterValue);
42
41
  const [hoveredItem, setHoveredItem] = useState(null);
43
42
  const [selectedPatternCategory, setSelectedPatternCategory] = useState(null);
43
+ const [patternFilter, setPatternFilter] = useState('all');
44
44
  const [selectedMediaCategory, setSelectedMediaCategory] = useState(null);
45
45
  const [selectedTab, setSelectedTab] = useState(null);
46
46
  const [destinationRootClientId, onInsertBlocks, onToggleInsertionPoint] = useInsertionPoint({
@@ -87,8 +87,9 @@ function InserterMenu({
87
87
  const onHoverPattern = useCallback(item => {
88
88
  onToggleInsertionPoint(!!item);
89
89
  }, [onToggleInsertionPoint]);
90
- const onClickPatternCategory = useCallback(patternCategory => {
90
+ const onClickPatternCategory = useCallback((patternCategory, filter) => {
91
91
  setSelectedPatternCategory(patternCategory);
92
+ setPatternFilter(filter);
92
93
  }, [setSelectedPatternCategory]);
93
94
  const blocksTab = useMemo(() => createElement(Fragment, null, createElement("div", {
94
95
  className: "block-editor-inserter__block-list"
@@ -108,11 +109,6 @@ function InserterMenu({
108
109
  onSelectCategory: onClickPatternCategory,
109
110
  selectedCategory: selectedPatternCategory
110
111
  }), [destinationRootClientId, onInsertPattern, onClickPatternCategory, selectedPatternCategory]);
111
- const reusableBlocksTab = useMemo(() => createElement(ReusableBlocksTab, {
112
- rootClientId: destinationRootClientId,
113
- onInsert: onInsert,
114
- onHover: onHover
115
- }), [destinationRootClientId, onInsert, onHover]);
116
112
  const mediaTab = useMemo(() => createElement(MediaTab, {
117
113
  rootClientId: destinationRootClientId,
118
114
  selectedCategory: selectedMediaCategory,
@@ -124,12 +120,10 @@ function InserterMenu({
124
120
  return blocksTab;
125
121
  } else if (tab.name === 'patterns') {
126
122
  return patternsTab;
127
- } else if (tab.name === 'reusable') {
128
- return reusableBlocksTab;
129
123
  } else if (tab.name === 'media') {
130
124
  return mediaTab;
131
125
  }
132
- }, [blocksTab, patternsTab, reusableBlocksTab, mediaTab]);
126
+ }, [blocksTab, patternsTab, mediaTab]);
133
127
  const searchRef = useRef();
134
128
  useImperativeHandle(ref, () => ({
135
129
  focusSearch: () => {
@@ -139,6 +133,13 @@ function InserterMenu({
139
133
  const showPatternPanel = selectedTab === 'patterns' && !delayedFilterValue && selectedPatternCategory;
140
134
  const showAsTabs = !delayedFilterValue && (showPatterns || hasReusableBlocks || showMedia);
141
135
  const showMediaPanel = selectedTab === 'media' && !delayedFilterValue && selectedMediaCategory;
136
+ const handleSetSelectedTab = value => {
137
+ // If no longer on patterns tab remove the category setting.
138
+ if (value !== 'patterns') {
139
+ setSelectedPatternCategory(null);
140
+ }
141
+ setSelectedTab(value);
142
+ };
142
143
  return createElement("div", {
143
144
  className: "block-editor-inserter__menu"
144
145
  }, createElement("div", {
@@ -174,7 +175,7 @@ function InserterMenu({
174
175
  showReusableBlocks: hasReusableBlocks,
175
176
  showMedia: showMedia,
176
177
  prioritizePatterns: prioritizePatterns,
177
- onSelect: setSelectedTab
178
+ onSelect: handleSetSelectedTab
178
179
  }, getCurrentTab), !delayedFilterValue && !showAsTabs && createElement("div", {
179
180
  className: "block-editor-inserter__no-tab-container"
180
181
  }, blocksTab)), showMediaPanel && createElement(MediaCategoryDialog, {
@@ -188,6 +189,7 @@ function InserterMenu({
188
189
  onInsert: onInsertPattern,
189
190
  onHover: onHoverPattern,
190
191
  category: selectedPatternCategory,
192
+ patternFilter: patternFilter,
191
193
  showTitlesAsTooltip: true
192
194
  }));
193
195
  }