@wordpress/block-editor 12.9.1-next.5a1d1283.0 → 12.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) 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 +28 -8
  8. package/build/components/block-patterns-list/index.js.map +1 -1
  9. package/build/components/block-patterns-paging/index.js +68 -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 +45 -22
  61. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  62. package/build/components/inserter/block-patterns-explorer/sidebar.js +9 -9
  63. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  64. package/build/components/inserter/block-patterns-filter.js +137 -0
  65. package/build/components/inserter/block-patterns-filter.js.map +1 -0
  66. package/build/components/inserter/block-patterns-tab.js +128 -42
  67. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  68. package/build/components/inserter/hooks/use-patterns-paging.js +61 -0
  69. package/build/components/inserter/hooks/use-patterns-paging.js.map +1 -0
  70. package/build/components/inserter/hooks/use-patterns-state.js +21 -10
  71. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  72. package/build/components/inserter/menu.js +13 -11
  73. package/build/components/inserter/menu.js.map +1 -1
  74. package/build/components/inserter/search-results.js +4 -3
  75. package/build/components/inserter/search-results.js.map +1 -1
  76. package/build/components/inserter/tabs.js +1 -12
  77. package/build/components/inserter/tabs.js.map +1 -1
  78. package/build/components/inspector-controls/block-support-slot-container.js +12 -1
  79. package/build/components/inspector-controls/block-support-slot-container.js.map +1 -1
  80. package/build/components/inspector-controls/fill.js +24 -13
  81. package/build/components/inspector-controls/fill.js.map +1 -1
  82. package/build/components/inspector-controls/groups.js +5 -3
  83. package/build/components/inspector-controls/groups.js.map +1 -1
  84. package/build/components/inspector-controls/slot.js +13 -0
  85. package/build/components/inspector-controls/slot.js.map +1 -1
  86. package/build/components/inspector-controls-tabs/styles-tab.js +3 -0
  87. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  88. package/build/components/link-control/index.js +12 -2
  89. package/build/components/link-control/index.js.map +1 -1
  90. package/build/components/list-view/block-select-button.js +1 -3
  91. package/build/components/list-view/block-select-button.js.map +1 -1
  92. package/build/components/list-view/block.js +13 -1
  93. package/build/components/list-view/block.js.map +1 -1
  94. package/build/components/list-view/use-block-selection.js +29 -24
  95. package/build/components/list-view/use-block-selection.js.map +1 -1
  96. package/build/components/media-placeholder/index.js +2 -2
  97. package/build/components/media-placeholder/index.js.map +1 -1
  98. package/build/components/media-placeholder/index.native.js +11 -11
  99. package/build/components/media-placeholder/index.native.js.map +1 -1
  100. package/build/components/media-replace-flow/index.js +2 -3
  101. package/build/components/media-replace-flow/index.js.map +1 -1
  102. package/build/components/media-upload/constants.js +30 -0
  103. package/build/components/media-upload/constants.js.map +1 -0
  104. package/build/components/media-upload/index.native.js +63 -53
  105. package/build/components/media-upload/index.native.js.map +1 -1
  106. package/build/components/preview-options/index.js +1 -1
  107. package/build/components/preview-options/index.js.map +1 -1
  108. package/build/components/rich-text/index.js +34 -35
  109. package/build/components/rich-text/index.js.map +1 -1
  110. package/build/components/rich-text/index.native.js +14 -32
  111. package/build/components/rich-text/index.native.js.map +1 -1
  112. package/build/components/rich-text/multiline.js +95 -0
  113. package/build/components/rich-text/multiline.js.map +1 -0
  114. package/build/components/rich-text/split-value.js +10 -16
  115. package/build/components/rich-text/split-value.js.map +1 -1
  116. package/build/components/rich-text/use-enter.js +31 -40
  117. package/build/components/rich-text/use-enter.js.map +1 -1
  118. package/build/components/rich-text/use-paste-handler.js +18 -33
  119. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  120. package/build/components/spacing-sizes-control/utils.js +1 -1
  121. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  122. package/build/components/use-block-commands/index.js +30 -18
  123. package/build/components/use-block-commands/index.js.map +1 -1
  124. package/build/components/use-block-display-information/index.js +5 -2
  125. package/build/components/use-block-display-information/index.js.map +1 -1
  126. package/build/hooks/background.js +263 -0
  127. package/build/hooks/background.js.map +1 -0
  128. package/build/hooks/block-hooks.js +188 -0
  129. package/build/hooks/block-hooks.js.map +1 -0
  130. package/build/hooks/block-rename-ui.js +161 -0
  131. package/build/hooks/block-rename-ui.js.map +1 -0
  132. package/build/hooks/duotone.js +29 -42
  133. package/build/hooks/duotone.js.map +1 -1
  134. package/build/hooks/index.js +2 -2
  135. package/build/hooks/index.js.map +1 -1
  136. package/build/hooks/layout.js +31 -14
  137. package/build/hooks/layout.js.map +1 -1
  138. package/build/hooks/position.js +4 -2
  139. package/build/hooks/position.js.map +1 -1
  140. package/build/hooks/style.js +10 -3
  141. package/build/hooks/style.js.map +1 -1
  142. package/build/private-apis.js +2 -0
  143. package/build/private-apis.js.map +1 -1
  144. package/build/store/actions.js +33 -10
  145. package/build/store/actions.js.map +1 -1
  146. package/build/store/private-actions.js +42 -8
  147. package/build/store/private-actions.js.map +1 -1
  148. package/build/store/private-selectors.js +25 -3
  149. package/build/store/private-selectors.js.map +1 -1
  150. package/build/store/reducer.js +43 -1
  151. package/build/store/reducer.js.map +1 -1
  152. package/build/store/selectors.js +84 -23
  153. package/build/store/selectors.js.map +1 -1
  154. package/build/store/utils.js +0 -4
  155. package/build/store/utils.js.map +1 -1
  156. package/build-module/components/block-canvas/index.js +97 -0
  157. package/build-module/components/block-canvas/index.js.map +1 -0
  158. package/build-module/components/block-inspector/index.js +4 -1
  159. package/build-module/components/block-inspector/index.js.map +1 -1
  160. package/build-module/components/block-patterns-list/index.js +30 -10
  161. package/build-module/components/block-patterns-list/index.js.map +1 -1
  162. package/build-module/components/block-patterns-paging/index.js +61 -0
  163. package/build-module/components/block-patterns-paging/index.js.map +1 -0
  164. package/build-module/components/block-settings-menu/block-settings-dropdown.js +28 -0
  165. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  166. package/build-module/components/block-settings-menu-controls/index.js +4 -7
  167. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  168. package/build-module/components/block-styles/index.js +1 -0
  169. package/build-module/components/block-styles/index.js.map +1 -1
  170. package/build-module/components/block-toolbar/block-toolbar-menu.native.js +3 -7
  171. package/build-module/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  172. package/build-module/components/block-tools/block-contextual-toolbar.js +18 -7
  173. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  174. package/build-module/components/block-tools/block-selection-button.js +5 -1
  175. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  176. package/build-module/components/border-radius-control/input-controls.js +1 -1
  177. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  178. package/build-module/components/border-radius-control/linked-button.js +2 -4
  179. package/build-module/components/border-radius-control/linked-button.js.map +1 -1
  180. package/build-module/components/colors/with-colors.js.map +1 -1
  181. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -21
  182. package/build-module/components/convert-to-group-buttons/use-convert-to-group-button-props.js.map +1 -1
  183. package/build-module/components/default-block-appender/index.native.js +20 -1
  184. package/build-module/components/default-block-appender/index.native.js.map +1 -1
  185. package/build-module/components/duotone/utils.js +65 -0
  186. package/build-module/components/duotone/utils.js.map +1 -1
  187. package/build-module/components/editor-styles/index.js +28 -9
  188. package/build-module/components/editor-styles/index.js.map +1 -1
  189. package/build-module/components/global-styles/hooks.js +3 -100
  190. package/build-module/components/global-styles/hooks.js.map +1 -1
  191. package/build-module/components/global-styles/image-settings-panel.js +53 -0
  192. package/build-module/components/global-styles/image-settings-panel.js.map +1 -0
  193. package/build-module/components/global-styles/index.js +2 -2
  194. package/build-module/components/global-styles/index.js.map +1 -1
  195. package/build-module/components/global-styles/use-global-styles-output.js +18 -16
  196. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  197. package/build-module/components/global-styles/utils.js +1 -1
  198. package/build-module/components/global-styles/utils.js.map +1 -1
  199. package/build-module/components/iframe/index.js +66 -33
  200. package/build-module/components/iframe/index.js.map +1 -1
  201. package/build-module/components/image-editor/use-save-image.js +2 -5
  202. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  203. package/build-module/components/image-editor/use-transform-image.js +9 -9
  204. package/build-module/components/image-editor/use-transform-image.js.map +1 -1
  205. package/build-module/components/index.js +1 -1
  206. package/build-module/components/index.js.map +1 -1
  207. package/build-module/components/index.native.js +2 -1
  208. package/build-module/components/index.native.js.map +1 -1
  209. package/build-module/components/inner-blocks/use-nested-settings-update.js +14 -8
  210. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  211. package/build-module/components/inserter/block-patterns-explorer/explorer.js +12 -6
  212. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -1
  213. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +47 -24
  214. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  215. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +9 -9
  216. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  217. package/build-module/components/inserter/block-patterns-filter.js +128 -0
  218. package/build-module/components/inserter/block-patterns-filter.js.map +1 -0
  219. package/build-module/components/inserter/block-patterns-tab.js +125 -44
  220. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  221. package/build-module/components/inserter/hooks/use-patterns-paging.js +54 -0
  222. package/build-module/components/inserter/hooks/use-patterns-paging.js.map +1 -0
  223. package/build-module/components/inserter/hooks/use-patterns-state.js +22 -10
  224. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  225. package/build-module/components/inserter/menu.js +13 -11
  226. package/build-module/components/inserter/menu.js.map +1 -1
  227. package/build-module/components/inserter/search-results.js +4 -3
  228. package/build-module/components/inserter/search-results.js.map +1 -1
  229. package/build-module/components/inserter/tabs.js +1 -12
  230. package/build-module/components/inserter/tabs.js.map +1 -1
  231. package/build-module/components/inspector-controls/block-support-slot-container.js +13 -2
  232. package/build-module/components/inspector-controls/block-support-slot-container.js.map +1 -1
  233. package/build-module/components/inspector-controls/fill.js +25 -14
  234. package/build-module/components/inspector-controls/fill.js.map +1 -1
  235. package/build-module/components/inspector-controls/groups.js +5 -3
  236. package/build-module/components/inspector-controls/groups.js.map +1 -1
  237. package/build-module/components/inspector-controls/slot.js +15 -1
  238. package/build-module/components/inspector-controls/slot.js.map +1 -1
  239. package/build-module/components/inspector-controls-tabs/styles-tab.js +3 -0
  240. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  241. package/build-module/components/link-control/index.js +12 -2
  242. package/build-module/components/link-control/index.js.map +1 -1
  243. package/build-module/components/list-view/block-select-button.js +1 -3
  244. package/build-module/components/list-view/block-select-button.js.map +1 -1
  245. package/build-module/components/list-view/block.js +13 -1
  246. package/build-module/components/list-view/block.js.map +1 -1
  247. package/build-module/components/list-view/use-block-selection.js +30 -25
  248. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  249. package/build-module/components/media-placeholder/index.js +2 -2
  250. package/build-module/components/media-placeholder/index.js.map +1 -1
  251. package/build-module/components/media-placeholder/index.native.js +7 -7
  252. package/build-module/components/media-placeholder/index.native.js.map +1 -1
  253. package/build-module/components/media-replace-flow/index.js +2 -3
  254. package/build-module/components/media-replace-flow/index.js.map +1 -1
  255. package/build-module/components/media-upload/constants.js +14 -0
  256. package/build-module/components/media-upload/constants.js.map +1 -0
  257. package/build-module/components/media-upload/index.native.js +53 -34
  258. package/build-module/components/media-upload/index.native.js.map +1 -1
  259. package/build-module/components/preview-options/index.js +1 -1
  260. package/build-module/components/preview-options/index.js.map +1 -1
  261. package/build-module/components/rich-text/index.js +35 -37
  262. package/build-module/components/rich-text/index.js.map +1 -1
  263. package/build-module/components/rich-text/index.native.js +15 -33
  264. package/build-module/components/rich-text/index.native.js.map +1 -1
  265. package/build-module/components/rich-text/multiline.js +87 -0
  266. package/build-module/components/rich-text/multiline.js.map +1 -0
  267. package/build-module/components/rich-text/split-value.js +10 -16
  268. package/build-module/components/rich-text/split-value.js.map +1 -1
  269. package/build-module/components/rich-text/use-enter.js +33 -42
  270. package/build-module/components/rich-text/use-enter.js.map +1 -1
  271. package/build-module/components/rich-text/use-paste-handler.js +19 -34
  272. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  273. package/build-module/components/spacing-sizes-control/utils.js +2 -2
  274. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  275. package/build-module/components/use-block-commands/index.js +28 -16
  276. package/build-module/components/use-block-commands/index.js.map +1 -1
  277. package/build-module/components/use-block-display-information/index.js +5 -2
  278. package/build-module/components/use-block-display-information/index.js.map +1 -1
  279. package/build-module/hooks/background.js +249 -0
  280. package/build-module/hooks/background.js.map +1 -0
  281. package/build-module/hooks/block-hooks.js +181 -0
  282. package/build-module/hooks/block-hooks.js.map +1 -0
  283. package/build-module/hooks/block-rename-ui.js +154 -0
  284. package/build-module/hooks/block-rename-ui.js.map +1 -0
  285. package/build-module/hooks/duotone.js +26 -39
  286. package/build-module/hooks/duotone.js.map +1 -1
  287. package/build-module/hooks/index.js +2 -2
  288. package/build-module/hooks/index.js.map +1 -1
  289. package/build-module/hooks/layout.js +33 -16
  290. package/build-module/hooks/layout.js.map +1 -1
  291. package/build-module/hooks/position.js +4 -2
  292. package/build-module/hooks/position.js.map +1 -1
  293. package/build-module/hooks/style.js +10 -3
  294. package/build-module/hooks/style.js.map +1 -1
  295. package/build-module/private-apis.js +2 -0
  296. package/build-module/private-apis.js.map +1 -1
  297. package/build-module/store/actions.js +33 -10
  298. package/build-module/store/actions.js.map +1 -1
  299. package/build-module/store/private-actions.js +39 -8
  300. package/build-module/store/private-actions.js.map +1 -1
  301. package/build-module/store/private-selectors.js +23 -3
  302. package/build-module/store/private-selectors.js.map +1 -1
  303. package/build-module/store/reducer.js +41 -1
  304. package/build-module/store/reducer.js.map +1 -1
  305. package/build-module/store/selectors.js +78 -22
  306. package/build-module/store/selectors.js.map +1 -1
  307. package/build-module/store/utils.js +0 -4
  308. package/build-module/store/utils.js.map +1 -1
  309. package/build-style/content-rtl.css +0 -1
  310. package/build-style/content.css +0 -1
  311. package/build-style/style-rtl.css +201 -131
  312. package/build-style/style.css +201 -131
  313. package/package.json +32 -32
  314. package/src/components/block-canvas/index.js +108 -0
  315. package/src/components/block-inspector/index.js +5 -1
  316. package/src/components/block-list/content.scss +0 -1
  317. package/src/components/block-patterns-list/index.js +53 -19
  318. package/src/components/block-patterns-list/style.scss +26 -9
  319. package/src/components/block-patterns-paging/index.js +92 -0
  320. package/src/components/block-patterns-paging/style.scss +45 -0
  321. package/src/components/block-settings-menu/block-settings-dropdown.js +44 -0
  322. package/src/components/block-settings-menu-controls/index.js +4 -9
  323. package/src/components/block-styles/index.js +1 -0
  324. package/src/components/block-styles/style.scss +3 -3
  325. package/src/components/block-toolbar/block-toolbar-menu.native.js +1 -6
  326. package/src/components/block-tools/block-contextual-toolbar.js +16 -5
  327. package/src/components/block-tools/block-selection-button.js +9 -1
  328. package/src/components/block-tools/style.scss +0 -98
  329. package/src/components/border-radius-control/input-controls.js +1 -1
  330. package/src/components/border-radius-control/linked-button.js +8 -11
  331. package/src/components/color-palette/test/__snapshots__/control.js.snap +34 -21
  332. package/src/components/colors/with-colors.js +3 -2
  333. package/src/components/convert-to-group-buttons/use-convert-to-group-button-props.js +8 -35
  334. package/src/components/default-block-appender/index.native.js +26 -3
  335. package/src/components/duotone/utils.js +65 -0
  336. package/src/components/editor-styles/index.js +32 -23
  337. package/src/components/global-styles/hooks.js +4 -112
  338. package/src/components/global-styles/image-settings-panel.js +71 -0
  339. package/src/components/global-styles/index.js +4 -3
  340. package/src/components/global-styles/use-global-styles-output.js +25 -16
  341. package/src/components/global-styles/utils.js +1 -2
  342. package/src/components/iframe/index.js +72 -33
  343. package/src/components/image-editor/use-save-image.js +2 -9
  344. package/src/components/image-editor/use-transform-image.js +9 -9
  345. package/src/components/index.js +1 -1
  346. package/src/components/index.native.js +2 -2
  347. package/src/components/inner-blocks/use-nested-settings-update.js +15 -10
  348. package/src/components/inserter/block-patterns-explorer/explorer.js +17 -5
  349. package/src/components/inserter/block-patterns-explorer/patterns-list.js +68 -43
  350. package/src/components/inserter/block-patterns-explorer/sidebar.js +8 -8
  351. package/src/components/inserter/block-patterns-filter.js +183 -0
  352. package/src/components/inserter/block-patterns-tab.js +217 -58
  353. package/src/components/inserter/hooks/use-patterns-paging.js +76 -0
  354. package/src/components/inserter/hooks/use-patterns-state.js +27 -16
  355. package/src/components/inserter/menu.js +15 -17
  356. package/src/components/inserter/search-results.js +6 -4
  357. package/src/components/inserter/style.scss +36 -7
  358. package/src/components/inserter/tabs.js +2 -12
  359. package/src/components/inserter/test/index.native.js +8 -12
  360. package/src/components/inspector-controls/block-support-slot-container.js +19 -3
  361. package/src/components/inspector-controls/fill.js +28 -14
  362. package/src/components/inspector-controls/groups.js +6 -2
  363. package/src/components/inspector-controls/slot.js +28 -3
  364. package/src/components/inspector-controls-tabs/styles-tab.js +4 -0
  365. package/src/components/link-control/index.js +13 -0
  366. package/src/components/link-control/style.scss +23 -2
  367. package/src/components/link-control/test/index.js +88 -6
  368. package/src/components/list-view/block-select-button.js +1 -3
  369. package/src/components/list-view/block.js +19 -1
  370. package/src/components/list-view/style.scss +1 -2
  371. package/src/components/list-view/use-block-selection.js +38 -32
  372. package/src/components/media-placeholder/README.md +2 -2
  373. package/src/components/media-placeholder/index.js +2 -2
  374. package/src/components/media-placeholder/index.native.js +11 -12
  375. package/src/components/media-replace-flow/index.js +2 -2
  376. package/src/components/media-replace-flow/test/index.js +5 -23
  377. package/src/components/media-upload/README.md +3 -2
  378. package/src/components/media-upload/constants.js +15 -0
  379. package/src/components/media-upload/index.native.js +66 -40
  380. package/src/components/media-upload/style.native.scss +4 -0
  381. package/src/components/media-upload/test/index.native.js +2 -2
  382. package/src/components/preview-options/README.md +7 -0
  383. package/src/components/preview-options/index.js +1 -1
  384. package/src/components/rich-text/index.js +48 -44
  385. package/src/components/rich-text/index.native.js +14 -42
  386. package/src/components/rich-text/multiline.js +121 -0
  387. package/src/components/rich-text/split-value.js +10 -35
  388. package/src/components/rich-text/use-enter.js +32 -42
  389. package/src/components/rich-text/use-paste-handler.js +16 -40
  390. package/src/components/spacing-sizes-control/style.scss +5 -7
  391. package/src/components/spacing-sizes-control/utils.js +1 -2
  392. package/src/components/use-block-commands/index.js +28 -20
  393. package/src/components/use-block-display-information/index.js +3 -0
  394. package/src/hooks/background.js +299 -0
  395. package/src/hooks/background.scss +75 -0
  396. package/src/hooks/block-hooks.js +257 -0
  397. package/src/hooks/block-hooks.scss +16 -0
  398. package/src/hooks/block-rename-ui.js +231 -0
  399. package/src/hooks/block-rename-ui.scss +3 -0
  400. package/src/hooks/duotone.js +42 -43
  401. package/src/hooks/index.js +2 -2
  402. package/src/hooks/layout.js +31 -33
  403. package/src/hooks/position.js +4 -3
  404. package/src/hooks/style.js +11 -2
  405. package/src/hooks/test/align.native.js +4 -3
  406. package/src/private-apis.js +2 -0
  407. package/src/store/actions.js +52 -10
  408. package/src/store/private-actions.js +37 -6
  409. package/src/store/private-selectors.js +28 -3
  410. package/src/store/reducer.js +38 -0
  411. package/src/store/selectors.js +107 -26
  412. package/src/store/test/actions.js +19 -8
  413. package/src/store/test/private-actions.js +17 -0
  414. package/src/store/test/reducer.js +25 -0
  415. package/src/store/test/selectors.js +130 -123
  416. package/src/store/utils.js +3 -10
  417. package/src/style.scss +4 -0
  418. package/build/components/duotone/components.js +0 -135
  419. package/build/components/duotone/components.js.map +0 -1
  420. package/build/components/duotone/index.js +0 -38
  421. package/build/components/duotone/index.js.map +0 -1
  422. package/build/components/global-styles/behaviors-panel.js +0 -64
  423. package/build/components/global-styles/behaviors-panel.js.map +0 -1
  424. package/build/components/inserter/reusable-blocks-tab.js +0 -85
  425. package/build/components/inserter/reusable-blocks-tab.js.map +0 -1
  426. package/build/hooks/auto-inserting-blocks.js +0 -174
  427. package/build/hooks/auto-inserting-blocks.js.map +0 -1
  428. package/build/hooks/behaviors.js +0 -173
  429. package/build/hooks/behaviors.js.map +0 -1
  430. package/build-module/components/duotone/components.js +0 -126
  431. package/build-module/components/duotone/components.js.map +0 -1
  432. package/build-module/components/duotone/index.js +0 -3
  433. package/build-module/components/duotone/index.js.map +0 -1
  434. package/build-module/components/global-styles/behaviors-panel.js +0 -57
  435. package/build-module/components/global-styles/behaviors-panel.js.map +0 -1
  436. package/build-module/components/inserter/reusable-blocks-tab.js +0 -76
  437. package/build-module/components/inserter/reusable-blocks-tab.js.map +0 -1
  438. package/build-module/hooks/auto-inserting-blocks.js +0 -167
  439. package/build-module/hooks/auto-inserting-blocks.js.map +0 -1
  440. package/build-module/hooks/behaviors.js +0 -166
  441. package/build-module/hooks/behaviors.js.map +0 -1
  442. package/src/components/duotone/components.js +0 -133
  443. package/src/components/duotone/index.js +0 -7
  444. package/src/components/global-styles/behaviors-panel.js +0 -71
  445. package/src/components/inserter/reusable-blocks-tab.js +0 -84
  446. package/src/components/inserter/test/reusable-blocks-tab.js +0 -73
  447. package/src/hooks/auto-inserting-blocks.js +0 -232
  448. 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';
8
- import { __experimentalItemGroup as ItemGroup, __experimentalItem as Item, __experimentalHStack as HStack, FlexBlock, Button } from '@wordpress/components';
6
+ import { _x, __, _n, isRTL, sprintf } from '@wordpress/i18n';
7
+ import { useViewportMatch } from '@wordpress/compose';
8
+ import { __experimentalItemGroup as ItemGroup, __experimentalItem as Item, __experimentalHStack as HStack, __experimentalVStack as VStack, __experimentalHeading as Heading, __experimentalText as Text, 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,51 @@ 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 usePatternsPaging from './hooks/use-patterns-paging';
21
+ import { BlockPatternsSyncFilter, SYNC_TYPES, PATTERN_TYPES } from './block-patterns-filter';
19
22
  const noop = () => {};
23
+ export const allPatternsCategory = {
24
+ name: 'allPatterns',
25
+ label: __('All Patterns')
26
+ };
27
+ export const myPatternsCategory = {
28
+ name: 'myPatterns',
29
+ label: __('My patterns')
30
+ };
31
+ export function isPatternFiltered(pattern, sourceFilter, syncFilter) {
32
+ const isUserPattern = pattern.name.startsWith('core/block');
33
+ const isDirectoryPattern = pattern.source === 'core' || pattern.source?.startsWith('pattern-directory');
20
34
 
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);
35
+ // If theme source selected, filter out user created patterns and those from
36
+ // the core patterns directory.
37
+ if (sourceFilter === PATTERN_TYPES.theme && (isUserPattern || isDirectoryPattern)) {
38
+ return true;
39
+ }
40
+
41
+ // If the directory source is selected, filter out user created patterns
42
+ // and those bundled with the theme.
43
+ if (sourceFilter === PATTERN_TYPES.directory && (isUserPattern || !isDirectoryPattern)) {
44
+ return true;
45
+ }
46
+
47
+ // If user source selected, filter out theme patterns. Any pattern without
48
+ // an id wasn't created by a user.
49
+ if (sourceFilter === PATTERN_TYPES.user && !pattern.id) {
50
+ return true;
51
+ }
52
+
53
+ // Filter by sync status.
54
+ if (syncFilter === SYNC_TYPES.full && pattern.syncStatus !== '') {
55
+ return true;
56
+ }
57
+ if (syncFilter === SYNC_TYPES.unsynced && pattern.syncStatus !== 'unsynced' && isUserPattern) {
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+ export function usePatternsCategories(rootClientId, sourceFilter = 'all') {
63
+ const [patterns, allCategories] = usePatternsState(undefined, rootClientId);
64
+ const filteredPatterns = useMemo(() => sourceFilter === 'all' ? patterns : patterns.filter(pattern => !isPatternFiltered(pattern, sourceFilter)), [sourceFilter, patterns]);
26
65
  const hasRegisteredCategory = useCallback(pattern => {
27
66
  if (!pattern.categories || !pattern.categories.length) {
28
67
  return false;
@@ -32,27 +71,26 @@ function usePatternsCategories(rootClientId) {
32
71
 
33
72
  // Remove any empty categories.
34
73
  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')) {
74
+ const categories = allCategories.filter(category => filteredPatterns.some(pattern => pattern.categories?.includes(category.name))).sort((a, b) => a.label.localeCompare(b.label));
75
+ if (filteredPatterns.some(pattern => !hasRegisteredCategory(pattern)) && !categories.find(category => category.name === 'uncategorized')) {
49
76
  categories.push({
50
77
  name: 'uncategorized',
51
78
  label: _x('Uncategorized')
52
79
  });
53
80
  }
81
+ if (filteredPatterns.some(pattern => pattern.id)) {
82
+ categories.unshift(myPatternsCategory);
83
+ }
84
+ if (filteredPatterns.length > 0) {
85
+ categories.unshift({
86
+ name: allPatternsCategory.name,
87
+ label: allPatternsCategory.label
88
+ });
89
+ }
90
+ speak(sprintf( /* translators: %d: number of categories . */
91
+ _n('%d category button displayed.', '%d category buttons displayed.', categories.length), categories.length));
54
92
  return categories;
55
- }, [allCategories, allPatterns, hasRegisteredCategory]);
93
+ }, [allCategories, filteredPatterns, hasRegisteredCategory]);
56
94
  return populatedCategories;
57
95
  }
58
96
  export function BlockPatternsCategoryDialog({
@@ -60,7 +98,8 @@ export function BlockPatternsCategoryDialog({
60
98
  onInsert,
61
99
  onHover,
62
100
  category,
63
- showTitlesAsTooltip
101
+ showTitlesAsTooltip,
102
+ patternFilter
64
103
  }) {
65
104
  const container = useRef();
66
105
  useEffect(() => {
@@ -74,11 +113,13 @@ export function BlockPatternsCategoryDialog({
74
113
  ref: container,
75
114
  className: "block-editor-inserter__patterns-category-dialog"
76
115
  }, createElement(BlockPatternsCategoryPanel, {
116
+ key: category.name,
77
117
  rootClientId: rootClientId,
78
118
  onInsert: onInsert,
79
119
  onHover: onHover,
80
120
  category: category,
81
- showTitlesAsTooltip: showTitlesAsTooltip
121
+ showTitlesAsTooltip: showTitlesAsTooltip,
122
+ patternFilter: patternFilter
82
123
  }));
83
124
  }
84
125
  export function BlockPatternsCategoryPanel({
@@ -88,10 +129,22 @@ export function BlockPatternsCategoryPanel({
88
129
  category,
89
130
  showTitlesAsTooltip
90
131
  }) {
91
- const [allPatterns,, onClick] = usePatternsState(onInsert, rootClientId);
92
- const availableCategories = usePatternsCategories(rootClientId);
132
+ const [allPatterns,, onClickPattern] = usePatternsState(onInsert, rootClientId);
133
+ const [patternSyncFilter, setPatternSyncFilter] = useState('all');
134
+ const [patternSourceFilter, setPatternSourceFilter] = useState('all');
135
+ const availableCategories = usePatternsCategories(rootClientId, patternSourceFilter);
136
+ const scrollContainerRef = useRef();
93
137
  const currentCategoryPatterns = useMemo(() => allPatterns.filter(pattern => {
94
138
  var _pattern$categories$f;
139
+ if (isPatternFiltered(pattern, patternSourceFilter, patternSyncFilter)) {
140
+ return false;
141
+ }
142
+ if (category.name === allPatternsCategory.name) {
143
+ return true;
144
+ }
145
+ if (category.name === myPatternsCategory.name && pattern.id) {
146
+ return true;
147
+ }
95
148
  if (category.name !== 'uncategorized') {
96
149
  return pattern.categories?.includes(category.name);
97
150
  }
@@ -100,28 +153,54 @@ export function BlockPatternsCategoryPanel({
100
153
  // or with no available category.
101
154
  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
155
  return availablePatternCategories.length === 0;
103
- }), [allPatterns, availableCategories, category.name]);
104
- const categoryPatternsList = useAsyncList(currentCategoryPatterns);
156
+ }), [allPatterns, availableCategories, category.name, patternSourceFilter, patternSyncFilter]);
157
+ const pagingProps = usePatternsPaging(currentCategoryPatterns, category, scrollContainerRef);
158
+ const {
159
+ changePage
160
+ } = pagingProps;
105
161
 
106
162
  // Hide block pattern preview on unmount.
163
+ // eslint-disable-next-line react-hooks/exhaustive-deps
107
164
  useEffect(() => () => onHover(null), []);
108
- if (!currentCategoryPatterns.length) {
109
- return null;
110
- }
165
+ const onSetPatternSyncFilter = useCallback(value => {
166
+ setPatternSyncFilter(value);
167
+ changePage(1);
168
+ }, [setPatternSyncFilter, changePage]);
169
+ const onSetPatternSourceFilter = useCallback(value => {
170
+ setPatternSourceFilter(value);
171
+ changePage(1);
172
+ }, [setPatternSourceFilter, changePage]);
111
173
  return createElement("div", {
112
174
  className: "block-editor-inserter__patterns-category-panel"
113
- }, createElement("div", {
114
- 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,
175
+ }, createElement(VStack, {
176
+ spacing: 2,
177
+ className: "block-editor-inserter__patterns-category-panel-header"
178
+ }, createElement(HStack, null, createElement(FlexBlock, null, createElement(Heading, {
179
+ level: 4,
180
+ as: "div"
181
+ }, category.label)), createElement(BlockPatternsSyncFilter, {
182
+ patternSyncFilter: patternSyncFilter,
183
+ patternSourceFilter: patternSourceFilter,
184
+ setPatternSyncFilter: onSetPatternSyncFilter,
185
+ setPatternSourceFilter: onSetPatternSourceFilter,
186
+ scrollContainerRef: scrollContainerRef,
187
+ category: category
188
+ })), category.description && createElement(Text, null, category.description), !currentCategoryPatterns.length && createElement(Text, {
189
+ variant: "muted",
190
+ className: "block-editor-inserter__patterns-category-no-results"
191
+ }, __('No results found'))), currentCategoryPatterns.length > 0 && createElement(BlockPatternList, {
192
+ ref: scrollContainerRef,
193
+ shownPatterns: pagingProps.categoryPatternsAsyncList,
194
+ blockPatterns: pagingProps.categoryPatterns,
195
+ onClickPattern: onClickPattern,
119
196
  onHover: onHover,
120
197
  label: category.label,
121
198
  orientation: "vertical",
122
- category: category.label,
199
+ category: category.name,
123
200
  isDraggable: true,
124
- showTitlesAsTooltip: showTitlesAsTooltip
201
+ showTitlesAsTooltip: showTitlesAsTooltip,
202
+ patternFilter: patternSourceFilter,
203
+ pagingProps: pagingProps
125
204
  }));
126
205
  }
127
206
  function BlockPatternsTabs({
@@ -137,10 +216,10 @@ function BlockPatternsTabs({
137
216
  return createElement(Fragment, null, !isMobile && createElement("div", {
138
217
  className: "block-editor-inserter__block-patterns-tabs-container"
139
218
  }, createElement("nav", {
140
- "aria-label": __('Block pattern categories')
141
- }, createElement(ItemGroup, {
142
- role: "list",
219
+ "aria-label": __('Block pattern categories'),
143
220
  className: "block-editor-inserter__block-patterns-tabs"
221
+ }, createElement(ItemGroup, {
222
+ role: "list"
144
223
  }, categories.map(category => createElement(Item, {
145
224
  role: "listitem",
146
225
  key: category.name,
@@ -159,6 +238,7 @@ function BlockPatternsTabs({
159
238
  }, __('Explore all patterns')))))), isMobile && createElement(MobileTabNavigation, {
160
239
  categories: categories
161
240
  }, category => createElement(BlockPatternsCategoryPanel, {
241
+ key: category.name,
162
242
  onInsert: onInsert,
163
243
  rootClientId: rootClientId,
164
244
  category: category,
@@ -166,7 +246,8 @@ function BlockPatternsTabs({
166
246
  })), showPatternsExplorer && createElement(PatternsExplorerModal, {
167
247
  initialCategory: initialCategory,
168
248
  patternCategories: categories,
169
- onModalClose: () => setShowPatternsExplorer(false)
249
+ onModalClose: () => setShowPatternsExplorer(false),
250
+ rootClientId: rootClientId
170
251
  }));
171
252
  }
172
253
  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","__experimentalVStack","VStack","__experimentalHeading","Heading","__experimentalText","Text","FlexBlock","Button","Icon","chevronRight","chevronLeft","focus","speak","usePatternsState","BlockPatternList","PatternsExplorerModal","MobileTabNavigation","usePatternsPaging","BlockPatternsSyncFilter","SYNC_TYPES","PATTERN_TYPES","noop","allPatternsCategory","name","label","myPatternsCategory","isPatternFiltered","pattern","sourceFilter","syncFilter","isUserPattern","startsWith","isDirectoryPattern","source","theme","directory","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","key","allPatterns","onClickPattern","patternSyncFilter","setPatternSyncFilter","patternSourceFilter","setPatternSourceFilter","availableCategories","scrollContainerRef","currentCategoryPatterns","_pattern$categories$f","availablePatternCategories","availableCategory","pagingProps","changePage","onSetPatternSyncFilter","value","onSetPatternSourceFilter","spacing","level","as","description","variant","shownPatterns","categoryPatternsAsyncList","blockPatterns","categoryPatterns","orientation","isDraggable","BlockPatternsTabs","onSelectCategory","selectedCategory","showPatternsExplorer","setShowPatternsExplorer","initialCategory","isMobile","Fragment","role","map","onClick","icon","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\t__experimentalVStack as VStack,\n\t__experimentalHeading as Heading,\n\t__experimentalText as Text,\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 usePatternsPaging from './hooks/use-patterns-paging';\nimport {\n\tBlockPatternsSyncFilter,\n\tSYNC_TYPES,\n\tPATTERN_TYPES,\n} from './block-patterns-filter';\n\nconst noop = () => {};\n\nexport const allPatternsCategory = {\n\tname: 'allPatterns',\n\tlabel: __( 'All Patterns' ),\n};\n\nexport const myPatternsCategory = {\n\tname: 'myPatterns',\n\tlabel: __( 'My patterns' ),\n};\n\nexport function isPatternFiltered( pattern, sourceFilter, syncFilter ) {\n\tconst isUserPattern = pattern.name.startsWith( 'core/block' );\n\tconst isDirectoryPattern =\n\t\tpattern.source === 'core' ||\n\t\tpattern.source?.startsWith( 'pattern-directory' );\n\n\t// If theme source selected, filter out user created patterns and those from\n\t// the core patterns directory.\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.theme &&\n\t\t( isUserPattern || isDirectoryPattern )\n\t) {\n\t\treturn true;\n\t}\n\n\t// If the directory source is selected, filter out user created patterns\n\t// and those bundled with the theme.\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.directory &&\n\t\t( isUserPattern || ! isDirectoryPattern )\n\t) {\n\t\treturn true;\n\t}\n\n\t// If user source selected, filter out theme patterns. Any pattern without\n\t// an id wasn't created by a user.\n\tif ( sourceFilter === PATTERN_TYPES.user && ! pattern.id ) {\n\t\treturn true;\n\t}\n\n\t// Filter by sync status.\n\tif ( syncFilter === SYNC_TYPES.full && pattern.syncStatus !== '' ) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\tsyncFilter === SYNC_TYPES.unsynced &&\n\t\tpattern.syncStatus !== 'unsynced' &&\n\t\tisUserPattern\n\t) {\n\t\treturn true;\n\t}\n\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.some( ( pattern ) => pattern.id ) ) {\n\t\t\tcategories.unshift( myPatternsCategory );\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\tkey={ category.name }\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} ) {\n\tconst [ allPatterns, , onClickPattern ] = usePatternsState(\n\t\tonInsert,\n\t\trootClientId\n\t);\n\tconst [ patternSyncFilter, setPatternSyncFilter ] = useState( 'all' );\n\tconst [ patternSourceFilter, setPatternSourceFilter ] = useState( 'all' );\n\n\tconst availableCategories = usePatternsCategories(\n\t\trootClientId,\n\t\tpatternSourceFilter\n\t);\n\tconst scrollContainerRef = 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\tpatternSourceFilter,\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 === myPatternsCategory.name && pattern.id ) {\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\tpatternSourceFilter,\n\t\t\tpatternSyncFilter,\n\t\t]\n\t);\n\n\tconst pagingProps = usePatternsPaging(\n\t\tcurrentCategoryPatterns,\n\t\tcategory,\n\t\tscrollContainerRef\n\t);\n\tconst { changePage } = pagingProps;\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\tconst onSetPatternSyncFilter = useCallback(\n\t\t( value ) => {\n\t\t\tsetPatternSyncFilter( value );\n\t\t\tchangePage( 1 );\n\t\t},\n\t\t[ setPatternSyncFilter, changePage ]\n\t);\n\tconst onSetPatternSourceFilter = useCallback(\n\t\t( value ) => {\n\t\t\tsetPatternSourceFilter( value );\n\t\t\tchangePage( 1 );\n\t\t},\n\t\t[ setPatternSourceFilter, changePage ]\n\t);\n\n\treturn (\n\t\t<div className=\"block-editor-inserter__patterns-category-panel\">\n\t\t\t<VStack\n\t\t\t\tspacing={ 2 }\n\t\t\t\tclassName=\"block-editor-inserter__patterns-category-panel-header\"\n\t\t\t>\n\t\t\t\t<HStack>\n\t\t\t\t\t<FlexBlock>\n\t\t\t\t\t\t<Heading level={ 4 } as=\"div\">\n\t\t\t\t\t\t\t{ category.label }\n\t\t\t\t\t\t</Heading>\n\t\t\t\t\t</FlexBlock>\n\t\t\t\t\t<BlockPatternsSyncFilter\n\t\t\t\t\t\tpatternSyncFilter={ patternSyncFilter }\n\t\t\t\t\t\tpatternSourceFilter={ patternSourceFilter }\n\t\t\t\t\t\tsetPatternSyncFilter={ onSetPatternSyncFilter }\n\t\t\t\t\t\tsetPatternSourceFilter={ onSetPatternSourceFilter }\n\t\t\t\t\t\tscrollContainerRef={ scrollContainerRef }\n\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t/>\n\t\t\t\t</HStack>\n\t\t\t\t{ category.description && (\n\t\t\t\t\t<Text>{ category.description }</Text>\n\t\t\t\t) }\n\t\t\t\t{ ! currentCategoryPatterns.length && (\n\t\t\t\t\t<Text\n\t\t\t\t\t\tvariant=\"muted\"\n\t\t\t\t\t\tclassName=\"block-editor-inserter__patterns-category-no-results\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ __( 'No results found' ) }\n\t\t\t\t\t</Text>\n\t\t\t\t) }\n\t\t\t</VStack>\n\n\t\t\t{ currentCategoryPatterns.length > 0 && (\n\t\t\t\t<BlockPatternList\n\t\t\t\t\tref={ scrollContainerRef }\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={ patternSourceFilter }\n\t\t\t\t\tpagingProps={ pagingProps }\n\t\t\t\t/>\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\n\tconst categories = usePatternsCategories( rootClientId );\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<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( 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\tkey={ category.name }\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,54 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useMemo, useState, useEffect } 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
+ useEffect(function scrollToTopOnCategoryChange() {
42
+ const scrollContainer = getScrollContainer(scrollContainerRef?.current);
43
+ scrollContainer?.scrollTo(0, 0);
44
+ }, [currentCategory, scrollContainerRef]);
45
+ return {
46
+ totalItems,
47
+ categoryPatterns,
48
+ categoryPatternsAsyncList,
49
+ numPages,
50
+ changePage,
51
+ currentPage
52
+ };
53
+ }
54
+ //# sourceMappingURL=use-patterns-paging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useState","useEffect","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","scrollToTopOnCategoryChange"],"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-patterns-paging.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useMemo, useState, useEffect } 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\n\tuseEffect(\n\t\tfunction scrollToTopOnCategoryChange() {\n\t\t\tconst scrollContainer = getScrollContainer(\n\t\t\t\tscrollContainerRef?.current\n\t\t\t);\n\t\t\tscrollContainer?.scrollTo( 0, 0 );\n\t\t},\n\t\t[ currentCategory, scrollContainerRef ]\n\t);\n\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,EAAEC,SAAS,QAAQ,oBAAoB;AACjE,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,GAAGb,QAAQ,CAAE,CAAE,CAAC;EACrD,MAAMc,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,GAAGpB,OAAO,CAAE,MAAM;IACvC,OAAOS,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;EAED1B,SAAS,CACR,SAAS8B,2BAA2BA,CAAA,EAAG;IACtC,MAAMH,eAAe,GAAGxB,kBAAkB,CACzCM,kBAAkB,EAAEmB,OACrB,CAAC;IACDD,eAAe,EAAEE,QAAQ,CAAE,CAAC,EAAE,CAAE,CAAC;EAClC,CAAC,EACD,CAAErB,eAAe,EAAEC,kBAAkB,CACtC,CAAC;EAED,OAAO;IACNM,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
  }