@wordpress/block-editor 12.10.0 → 12.10.2

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 (76) hide show
  1. package/build/components/block-patterns-list/index.js +10 -5
  2. package/build/components/block-patterns-list/index.js.map +1 -1
  3. package/build/components/block-patterns-paging/index.js +4 -2
  4. package/build/components/block-patterns-paging/index.js.map +1 -1
  5. package/build/components/inserter/block-patterns-explorer/patterns-list.js +21 -32
  6. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  7. package/build/components/inserter/block-patterns-explorer/sidebar.js +0 -15
  8. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  9. package/build/components/inserter/block-patterns-filter.js +137 -0
  10. package/build/components/inserter/block-patterns-filter.js.map +1 -0
  11. package/build/components/inserter/block-patterns-tab.js +77 -37
  12. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  13. package/build/components/inserter/hooks/use-patterns-paging.js +4 -0
  14. package/build/components/inserter/hooks/use-patterns-paging.js.map +1 -1
  15. package/build/components/inserter/search-results.js +1 -1
  16. package/build/components/inserter/search-results.js.map +1 -1
  17. package/build/components/inspector-controls-tabs/styles-tab.js +1 -1
  18. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  19. package/build/hooks/background.js +28 -23
  20. package/build/hooks/background.js.map +1 -1
  21. package/build/hooks/block-rename-ui.js +2 -1
  22. package/build/hooks/block-rename-ui.js.map +1 -1
  23. package/build/store/private-selectors.js +2 -3
  24. package/build/store/private-selectors.js.map +1 -1
  25. package/build-module/components/block-patterns-list/index.js +11 -6
  26. package/build-module/components/block-patterns-list/index.js.map +1 -1
  27. package/build-module/components/block-patterns-paging/index.js +4 -2
  28. package/build-module/components/block-patterns-paging/index.js.map +1 -1
  29. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +23 -34
  30. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -1
  31. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +0 -14
  32. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  33. package/build-module/components/inserter/block-patterns-filter.js +128 -0
  34. package/build-module/components/inserter/block-patterns-filter.js.map +1 -0
  35. package/build-module/components/inserter/block-patterns-tab.js +75 -35
  36. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  37. package/build-module/components/inserter/hooks/use-patterns-paging.js +5 -1
  38. package/build-module/components/inserter/hooks/use-patterns-paging.js.map +1 -1
  39. package/build-module/components/inserter/search-results.js +1 -1
  40. package/build-module/components/inserter/search-results.js.map +1 -1
  41. package/build-module/components/inspector-controls-tabs/styles-tab.js +1 -1
  42. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  43. package/build-module/hooks/background.js +30 -25
  44. package/build-module/hooks/background.js.map +1 -1
  45. package/build-module/hooks/block-rename-ui.js +2 -1
  46. package/build-module/hooks/block-rename-ui.js.map +1 -1
  47. package/build-module/store/private-selectors.js +2 -3
  48. package/build-module/store/private-selectors.js.map +1 -1
  49. package/build-style/style-rtl.css +54 -26
  50. package/build-style/style.css +54 -26
  51. package/package.json +32 -32
  52. package/src/components/block-patterns-list/index.js +19 -12
  53. package/src/components/block-patterns-paging/index.js +58 -55
  54. package/src/components/block-patterns-paging/style.scss +16 -13
  55. package/src/components/inserter/block-patterns-explorer/patterns-list.js +34 -76
  56. package/src/components/inserter/block-patterns-explorer/sidebar.js +0 -15
  57. package/src/components/inserter/block-patterns-filter.js +183 -0
  58. package/src/components/inserter/block-patterns-tab.js +106 -58
  59. package/src/components/inserter/hooks/use-patterns-paging.js +12 -1
  60. package/src/components/inserter/search-results.js +1 -1
  61. package/src/components/inserter/style.scss +14 -5
  62. package/src/components/inspector-controls-tabs/styles-tab.js +1 -1
  63. package/src/hooks/background.js +57 -46
  64. package/src/hooks/background.scss +36 -18
  65. package/src/hooks/block-rename-ui.js +1 -0
  66. package/src/store/private-selectors.js +7 -3
  67. package/build/components/inserter/block-patterns-source-filter.js +0 -54
  68. package/build/components/inserter/block-patterns-source-filter.js.map +0 -1
  69. package/build/components/inserter/block-patterns-sync-filter.js +0 -46
  70. package/build/components/inserter/block-patterns-sync-filter.js.map +0 -1
  71. package/build-module/components/inserter/block-patterns-source-filter.js +0 -44
  72. package/build-module/components/inserter/block-patterns-source-filter.js.map +0 -1
  73. package/build-module/components/inserter/block-patterns-sync-filter.js +0 -38
  74. package/build-module/components/inserter/block-patterns-sync-filter.js.map +0 -1
  75. package/src/components/inserter/block-patterns-source-filter.js +0 -40
  76. package/src/components/inserter/block-patterns-sync-filter.js +0 -35
@@ -1 +1 @@
1
- {"version":3,"names":["Button","SearchControl","__","default","BlockPatternsSourceFilter","allPatternsCategory","PatternCategoriesList","selectedCategory","patternCategories","onClickCategory","baseClassName","createElement","className","map","name","label","key","isPressed","onClick","PatternsExplorerSearch","searchValue","setSearchValue","__nextHasNoMarginBottom","onChange","value","placeholder","PatternExplorerSidebar","patternSourceFilter","setPatternSourceFilter"],"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-explorer/sidebar.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { Button, SearchControl } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport { default as BlockPatternsSourceFilter } from '../block-patterns-source-filter';\nimport { allPatternsCategory } from '../block-patterns-tab';\n\nfunction PatternCategoriesList( {\n\tselectedCategory,\n\tpatternCategories,\n\tonClickCategory,\n} ) {\n\tconst baseClassName = 'block-editor-block-patterns-explorer__sidebar';\n\treturn (\n\t\t<div className={ `${ baseClassName }__categories-list` }>\n\t\t\t{ patternCategories.map( ( { name, label } ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={ name }\n\t\t\t\t\t\tlabel={ label }\n\t\t\t\t\t\tclassName={ `${ baseClassName }__categories-list__item` }\n\t\t\t\t\t\tisPressed={ selectedCategory === name }\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tonClickCategory( name );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ label }\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</div>\n\t);\n}\n\nfunction PatternsExplorerSearch( { searchValue, setSearchValue } ) {\n\tconst baseClassName = 'block-editor-block-patterns-explorer__search';\n\treturn (\n\t\t<div className={ baseClassName }>\n\t\t\t<SearchControl\n\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\tonChange={ setSearchValue }\n\t\t\t\tvalue={ searchValue }\n\t\t\t\tlabel={ __( 'Search for patterns' ) }\n\t\t\t\tplaceholder={ __( 'Search' ) }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction PatternExplorerSidebar( {\n\tselectedCategory,\n\tpatternCategories,\n\tonClickCategory,\n\tpatternSourceFilter,\n\tsetPatternSourceFilter,\n\tsearchValue,\n\tsetSearchValue,\n} ) {\n\tconst baseClassName = 'block-editor-block-patterns-explorer__sidebar';\n\treturn (\n\t\t<div className={ baseClassName }>\n\t\t\t<PatternsExplorerSearch\n\t\t\t\tsearchValue={ searchValue }\n\t\t\t\tsetSearchValue={ setSearchValue }\n\t\t\t/>\n\t\t\t<BlockPatternsSourceFilter\n\t\t\t\tvalue={ patternSourceFilter }\n\t\t\t\tonChange={ ( value ) => {\n\t\t\t\t\tsetPatternSourceFilter( value );\n\t\t\t\t\tonClickCategory( allPatternsCategory.name );\n\t\t\t\t} }\n\t\t\t/>\n\t\t\t{ ! searchValue && (\n\t\t\t\t<PatternCategoriesList\n\t\t\t\t\tselectedCategory={ selectedCategory }\n\t\t\t\t\tpatternCategories={ patternCategories }\n\t\t\t\t\tonClickCategory={ onClickCategory }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</div>\n\t);\n}\n\nexport default PatternExplorerSidebar;\n"],"mappings":";AAAA;AACA;AACA;AACA,SAASA,MAAM,EAAEC,aAAa,QAAQ,uBAAuB;AAC7D,SAASC,EAAE,QAAQ,iBAAiB;;AAEpC;AACA;AACA;AACA,SAASC,OAAO,IAAIC,yBAAyB,QAAQ,iCAAiC;AACtF,SAASC,mBAAmB,QAAQ,uBAAuB;AAE3D,SAASC,qBAAqBA,CAAE;EAC/BC,gBAAgB;EAChBC,iBAAiB;EACjBC;AACD,CAAC,EAAG;EACH,MAAMC,aAAa,GAAG,+CAA+C;EACrE,OACCC,aAAA;IAAKC,SAAS,EAAI,GAAGF,aAAe;EAAoB,GACrDF,iBAAiB,CAACK,GAAG,CAAE,CAAE;IAAEC,IAAI;IAAEC;EAAM,CAAC,KAAM;IAC/C,OACCJ,aAAA,CAACX,MAAM;MACNgB,GAAG,EAAGF,IAAM;MACZC,KAAK,EAAGA,KAAO;MACfH,SAAS,EAAI,GAAGF,aAAe,yBAA0B;MACzDO,SAAS,EAAGV,gBAAgB,KAAKO,IAAM;MACvCI,OAAO,EAAGA,CAAA,KAAM;QACfT,eAAe,CAAEK,IAAK,CAAC;MACxB;IAAG,GAEDC,KACK,CAAC;EAEX,CAAE,CACE,CAAC;AAER;AAEA,SAASI,sBAAsBA,CAAE;EAAEC,WAAW;EAAEC;AAAe,CAAC,EAAG;EAClE,MAAMX,aAAa,GAAG,8CAA8C;EACpE,OACCC,aAAA;IAAKC,SAAS,EAAGF;EAAe,GAC/BC,aAAA,CAACV,aAAa;IACbqB,uBAAuB;IACvBC,QAAQ,EAAGF,cAAgB;IAC3BG,KAAK,EAAGJ,WAAa;IACrBL,KAAK,EAAGb,EAAE,CAAE,qBAAsB,CAAG;IACrCuB,WAAW,EAAGvB,EAAE,CAAE,QAAS;EAAG,CAC9B,CACG,CAAC;AAER;AAEA,SAASwB,sBAAsBA,CAAE;EAChCnB,gBAAgB;EAChBC,iBAAiB;EACjBC,eAAe;EACfkB,mBAAmB;EACnBC,sBAAsB;EACtBR,WAAW;EACXC;AACD,CAAC,EAAG;EACH,MAAMX,aAAa,GAAG,+CAA+C;EACrE,OACCC,aAAA;IAAKC,SAAS,EAAGF;EAAe,GAC/BC,aAAA,CAACQ,sBAAsB;IACtBC,WAAW,EAAGA,WAAa;IAC3BC,cAAc,EAAGA;EAAgB,CACjC,CAAC,EACFV,aAAA,CAACP,yBAAyB;IACzBoB,KAAK,EAAGG,mBAAqB;IAC7BJ,QAAQ,EAAKC,KAAK,IAAM;MACvBI,sBAAsB,CAAEJ,KAAM,CAAC;MAC/Bf,eAAe,CAAEJ,mBAAmB,CAACS,IAAK,CAAC;IAC5C;EAAG,CACH,CAAC,EACA,CAAEM,WAAW,IACdT,aAAA,CAACL,qBAAqB;IACrBC,gBAAgB,EAAGA,gBAAkB;IACrCC,iBAAiB,EAAGA,iBAAmB;IACvCC,eAAe,EAAGA;EAAiB,CACnC,CAEE,CAAC;AAER;AAEA,eAAeiB,sBAAsB"}
1
+ {"version":3,"names":["Button","SearchControl","__","PatternCategoriesList","selectedCategory","patternCategories","onClickCategory","baseClassName","createElement","className","map","name","label","key","isPressed","onClick","PatternsExplorerSearch","searchValue","setSearchValue","__nextHasNoMarginBottom","onChange","value","placeholder","PatternExplorerSidebar"],"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-explorer/sidebar.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { Button, SearchControl } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\n\nfunction PatternCategoriesList( {\n\tselectedCategory,\n\tpatternCategories,\n\tonClickCategory,\n} ) {\n\tconst baseClassName = 'block-editor-block-patterns-explorer__sidebar';\n\treturn (\n\t\t<div className={ `${ baseClassName }__categories-list` }>\n\t\t\t{ patternCategories.map( ( { name, label } ) => {\n\t\t\t\treturn (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tkey={ name }\n\t\t\t\t\t\tlabel={ label }\n\t\t\t\t\t\tclassName={ `${ baseClassName }__categories-list__item` }\n\t\t\t\t\t\tisPressed={ selectedCategory === name }\n\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\tonClickCategory( name );\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ label }\n\t\t\t\t\t</Button>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</div>\n\t);\n}\n\nfunction PatternsExplorerSearch( { searchValue, setSearchValue } ) {\n\tconst baseClassName = 'block-editor-block-patterns-explorer__search';\n\treturn (\n\t\t<div className={ baseClassName }>\n\t\t\t<SearchControl\n\t\t\t\t__nextHasNoMarginBottom\n\t\t\t\tonChange={ setSearchValue }\n\t\t\t\tvalue={ searchValue }\n\t\t\t\tlabel={ __( 'Search for patterns' ) }\n\t\t\t\tplaceholder={ __( 'Search' ) }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction PatternExplorerSidebar( {\n\tselectedCategory,\n\tpatternCategories,\n\tonClickCategory,\n\tsearchValue,\n\tsetSearchValue,\n} ) {\n\tconst baseClassName = 'block-editor-block-patterns-explorer__sidebar';\n\treturn (\n\t\t<div className={ baseClassName }>\n\t\t\t<PatternsExplorerSearch\n\t\t\t\tsearchValue={ searchValue }\n\t\t\t\tsetSearchValue={ setSearchValue }\n\t\t\t/>\n\t\t\t{ ! searchValue && (\n\t\t\t\t<PatternCategoriesList\n\t\t\t\t\tselectedCategory={ selectedCategory }\n\t\t\t\t\tpatternCategories={ patternCategories }\n\t\t\t\t\tonClickCategory={ onClickCategory }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</div>\n\t);\n}\n\nexport default PatternExplorerSidebar;\n"],"mappings":";AAAA;AACA;AACA;AACA,SAASA,MAAM,EAAEC,aAAa,QAAQ,uBAAuB;AAC7D,SAASC,EAAE,QAAQ,iBAAiB;AAEpC,SAASC,qBAAqBA,CAAE;EAC/BC,gBAAgB;EAChBC,iBAAiB;EACjBC;AACD,CAAC,EAAG;EACH,MAAMC,aAAa,GAAG,+CAA+C;EACrE,OACCC,aAAA;IAAKC,SAAS,EAAI,GAAGF,aAAe;EAAoB,GACrDF,iBAAiB,CAACK,GAAG,CAAE,CAAE;IAAEC,IAAI;IAAEC;EAAM,CAAC,KAAM;IAC/C,OACCJ,aAAA,CAACR,MAAM;MACNa,GAAG,EAAGF,IAAM;MACZC,KAAK,EAAGA,KAAO;MACfH,SAAS,EAAI,GAAGF,aAAe,yBAA0B;MACzDO,SAAS,EAAGV,gBAAgB,KAAKO,IAAM;MACvCI,OAAO,EAAGA,CAAA,KAAM;QACfT,eAAe,CAAEK,IAAK,CAAC;MACxB;IAAG,GAEDC,KACK,CAAC;EAEX,CAAE,CACE,CAAC;AAER;AAEA,SAASI,sBAAsBA,CAAE;EAAEC,WAAW;EAAEC;AAAe,CAAC,EAAG;EAClE,MAAMX,aAAa,GAAG,8CAA8C;EACpE,OACCC,aAAA;IAAKC,SAAS,EAAGF;EAAe,GAC/BC,aAAA,CAACP,aAAa;IACbkB,uBAAuB;IACvBC,QAAQ,EAAGF,cAAgB;IAC3BG,KAAK,EAAGJ,WAAa;IACrBL,KAAK,EAAGV,EAAE,CAAE,qBAAsB,CAAG;IACrCoB,WAAW,EAAGpB,EAAE,CAAE,QAAS;EAAG,CAC9B,CACG,CAAC;AAER;AAEA,SAASqB,sBAAsBA,CAAE;EAChCnB,gBAAgB;EAChBC,iBAAiB;EACjBC,eAAe;EACfW,WAAW;EACXC;AACD,CAAC,EAAG;EACH,MAAMX,aAAa,GAAG,+CAA+C;EACrE,OACCC,aAAA;IAAKC,SAAS,EAAGF;EAAe,GAC/BC,aAAA,CAACQ,sBAAsB;IACtBC,WAAW,EAAGA,WAAa;IAC3BC,cAAc,EAAGA;EAAgB,CACjC,CAAC,EACA,CAAED,WAAW,IACdT,aAAA,CAACL,qBAAqB;IACrBC,gBAAgB,EAAGA,gBAAkB;IACrCC,iBAAiB,EAAGA,iBAAmB;IACvCC,eAAe,EAAGA;EAAiB,CACnC,CAEE,CAAC;AAER;AAEA,eAAeiB,sBAAsB"}
@@ -0,0 +1,128 @@
1
+ import { createElement, Fragment } from "@wordpress/element";
2
+ /**
3
+ * WordPress dependencies
4
+ */
5
+ import { SVG, Path, DropdownMenu, MenuGroup, MenuItemsChoice } from '@wordpress/components';
6
+ import { __ } from '@wordpress/i18n';
7
+ import { Icon } from '@wordpress/icons';
8
+ import { useMemo } from '@wordpress/element';
9
+
10
+ /**
11
+ * Internal dependencies
12
+ */
13
+ import { myPatternsCategory } from './block-patterns-tab';
14
+ export const PATTERN_TYPES = {
15
+ all: 'all',
16
+ synced: 'synced',
17
+ unsynced: 'unsynced',
18
+ user: 'user',
19
+ theme: 'theme',
20
+ directory: 'directory'
21
+ };
22
+ export const SYNC_TYPES = {
23
+ all: 'all',
24
+ full: 'fully',
25
+ unsynced: 'unsynced'
26
+ };
27
+ const getShouldDisableSyncFilter = sourceFilter => sourceFilter !== PATTERN_TYPES.all && sourceFilter !== PATTERN_TYPES.user;
28
+ const getShouldDisableNonUserSources = category => {
29
+ return category.name === myPatternsCategory.name;
30
+ };
31
+ export function BlockPatternsSyncFilter({
32
+ setPatternSyncFilter,
33
+ setPatternSourceFilter,
34
+ patternSyncFilter,
35
+ patternSourceFilter,
36
+ scrollContainerRef,
37
+ category
38
+ }) {
39
+ // If the category is `myPatterns` then we need to set the source filter to `user`, but
40
+ // we do this by deriving from props rather than calling setPatternSourceFilter otherwise
41
+ // the user may be confused when switching to another category if the haven't explicity set
42
+ // this filter themselves.
43
+ const currentPatternSourceFilter = category.name === myPatternsCategory.name ? PATTERN_TYPES.user : patternSourceFilter;
44
+
45
+ // We need to disable the sync filter option if the source filter is not 'all' or 'user'
46
+ // otherwise applying them will just result in no patterns being shown.
47
+ const shouldDisableSyncFilter = getShouldDisableSyncFilter(currentPatternSourceFilter);
48
+
49
+ // We also need to disable the directory and theme source filter options if the category
50
+ // is `myPatterns` otherwise applying them will also just result in no patterns being shown.
51
+ const shouldDisableNonUserSources = getShouldDisableNonUserSources(category);
52
+ const patternSyncMenuOptions = useMemo(() => [{
53
+ value: SYNC_TYPES.all,
54
+ label: __('All')
55
+ }, {
56
+ value: SYNC_TYPES.full,
57
+ label: __('Synced'),
58
+ info: __('Updated everywhere'),
59
+ disabled: shouldDisableSyncFilter
60
+ }, {
61
+ value: SYNC_TYPES.unsynced,
62
+ label: __('Standard'),
63
+ info: __('Edit freely'),
64
+ disabled: shouldDisableSyncFilter
65
+ }], [shouldDisableSyncFilter]);
66
+ const patternSourceMenuOptions = useMemo(() => [{
67
+ value: PATTERN_TYPES.all,
68
+ label: __('All'),
69
+ disabled: shouldDisableNonUserSources
70
+ }, {
71
+ value: PATTERN_TYPES.directory,
72
+ label: __('Directory'),
73
+ info: __('Pattern directory & core'),
74
+ disabled: shouldDisableNonUserSources
75
+ }, {
76
+ value: PATTERN_TYPES.theme,
77
+ label: __('Theme'),
78
+ info: __('Bundled with the theme'),
79
+ disabled: shouldDisableNonUserSources
80
+ }, {
81
+ value: PATTERN_TYPES.user,
82
+ label: __('User'),
83
+ info: __('Custom created')
84
+ }], [shouldDisableNonUserSources]);
85
+ function handleSetSourceFilterChange(newSourceFilter) {
86
+ setPatternSourceFilter(newSourceFilter);
87
+ if (getShouldDisableSyncFilter(newSourceFilter)) {
88
+ setPatternSyncFilter(SYNC_TYPES.all);
89
+ }
90
+ }
91
+ return createElement(Fragment, null, createElement(DropdownMenu, {
92
+ popoverProps: {
93
+ placement: 'right-end'
94
+ },
95
+ label: "Filter patterns",
96
+ icon: createElement(Icon, {
97
+ icon: createElement(SVG, {
98
+ width: "24",
99
+ height: "24",
100
+ viewBox: "0 0 24 24",
101
+ fill: "none",
102
+ xmlns: "http://www.w3.org/2000/svg"
103
+ }, createElement(Path, {
104
+ d: "M10 17.5H14V16H10V17.5ZM6 6V7.5H18V6H6ZM8 12.5H16V11H8V12.5Z",
105
+ fill: "#1E1E1E"
106
+ }))
107
+ })
108
+ }, () => createElement(Fragment, null, createElement(MenuGroup, {
109
+ label: __('Author')
110
+ }, createElement(MenuItemsChoice, {
111
+ choices: patternSourceMenuOptions,
112
+ onSelect: value => {
113
+ handleSetSourceFilterChange(value);
114
+ scrollContainerRef.current?.scrollTo(0, 0);
115
+ },
116
+ value: currentPatternSourceFilter
117
+ })), createElement(MenuGroup, {
118
+ label: __('Type')
119
+ }, createElement(MenuItemsChoice, {
120
+ choices: patternSyncMenuOptions,
121
+ onSelect: value => {
122
+ setPatternSyncFilter(value);
123
+ scrollContainerRef.current?.scrollTo(0, 0);
124
+ },
125
+ value: patternSyncFilter
126
+ })))));
127
+ }
128
+ //# sourceMappingURL=block-patterns-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SVG","Path","DropdownMenu","MenuGroup","MenuItemsChoice","__","Icon","useMemo","myPatternsCategory","PATTERN_TYPES","all","synced","unsynced","user","theme","directory","SYNC_TYPES","full","getShouldDisableSyncFilter","sourceFilter","getShouldDisableNonUserSources","category","name","BlockPatternsSyncFilter","setPatternSyncFilter","setPatternSourceFilter","patternSyncFilter","patternSourceFilter","scrollContainerRef","currentPatternSourceFilter","shouldDisableSyncFilter","shouldDisableNonUserSources","patternSyncMenuOptions","value","label","info","disabled","patternSourceMenuOptions","handleSetSourceFilterChange","newSourceFilter","createElement","Fragment","popoverProps","placement","icon","width","height","viewBox","fill","xmlns","d","choices","onSelect","current","scrollTo"],"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-filter.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tSVG,\n\tPath,\n\tDropdownMenu,\n\tMenuGroup,\n\tMenuItemsChoice,\n} from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport { Icon } from '@wordpress/icons';\nimport { useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { myPatternsCategory } from './block-patterns-tab';\n\nexport const PATTERN_TYPES = {\n\tall: 'all',\n\tsynced: 'synced',\n\tunsynced: 'unsynced',\n\tuser: 'user',\n\ttheme: 'theme',\n\tdirectory: 'directory',\n};\n\nexport const SYNC_TYPES = {\n\tall: 'all',\n\tfull: 'fully',\n\tunsynced: 'unsynced',\n};\n\nconst getShouldDisableSyncFilter = ( sourceFilter ) =>\n\tsourceFilter !== PATTERN_TYPES.all && sourceFilter !== PATTERN_TYPES.user;\n\nconst getShouldDisableNonUserSources = ( category ) => {\n\treturn category.name === myPatternsCategory.name;\n};\n\nexport function BlockPatternsSyncFilter( {\n\tsetPatternSyncFilter,\n\tsetPatternSourceFilter,\n\tpatternSyncFilter,\n\tpatternSourceFilter,\n\tscrollContainerRef,\n\tcategory,\n} ) {\n\t// If the category is `myPatterns` then we need to set the source filter to `user`, but\n\t// we do this by deriving from props rather than calling setPatternSourceFilter otherwise\n\t// the user may be confused when switching to another category if the haven't explicity set\n\t// this filter themselves.\n\tconst currentPatternSourceFilter =\n\t\tcategory.name === myPatternsCategory.name\n\t\t\t? PATTERN_TYPES.user\n\t\t\t: patternSourceFilter;\n\n\t// We need to disable the sync filter option if the source filter is not 'all' or 'user'\n\t// otherwise applying them will just result in no patterns being shown.\n\tconst shouldDisableSyncFilter = getShouldDisableSyncFilter(\n\t\tcurrentPatternSourceFilter\n\t);\n\n\t// We also need to disable the directory and theme source filter options if the category\n\t// is `myPatterns` otherwise applying them will also just result in no patterns being shown.\n\tconst shouldDisableNonUserSources =\n\t\tgetShouldDisableNonUserSources( category );\n\n\tconst patternSyncMenuOptions = useMemo(\n\t\t() => [\n\t\t\t{ value: SYNC_TYPES.all, label: __( 'All' ) },\n\t\t\t{\n\t\t\t\tvalue: SYNC_TYPES.full,\n\t\t\t\tlabel: __( 'Synced' ),\n\t\t\t\tinfo: __( 'Updated everywhere' ),\n\t\t\t\tdisabled: shouldDisableSyncFilter,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: SYNC_TYPES.unsynced,\n\t\t\t\tlabel: __( 'Standard' ),\n\t\t\t\tinfo: __( 'Edit freely' ),\n\t\t\t\tdisabled: shouldDisableSyncFilter,\n\t\t\t},\n\t\t],\n\t\t[ shouldDisableSyncFilter ]\n\t);\n\n\tconst patternSourceMenuOptions = useMemo(\n\t\t() => [\n\t\t\t{\n\t\t\t\tvalue: PATTERN_TYPES.all,\n\t\t\t\tlabel: __( 'All' ),\n\t\t\t\tdisabled: shouldDisableNonUserSources,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: PATTERN_TYPES.directory,\n\t\t\t\tlabel: __( 'Directory' ),\n\t\t\t\tinfo: __( 'Pattern directory & core' ),\n\t\t\t\tdisabled: shouldDisableNonUserSources,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: PATTERN_TYPES.theme,\n\t\t\t\tlabel: __( 'Theme' ),\n\t\t\t\tinfo: __( 'Bundled with the theme' ),\n\t\t\t\tdisabled: shouldDisableNonUserSources,\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: PATTERN_TYPES.user,\n\t\t\t\tlabel: __( 'User' ),\n\t\t\t\tinfo: __( 'Custom created' ),\n\t\t\t},\n\t\t],\n\t\t[ shouldDisableNonUserSources ]\n\t);\n\n\tfunction handleSetSourceFilterChange( newSourceFilter ) {\n\t\tsetPatternSourceFilter( newSourceFilter );\n\t\tif ( getShouldDisableSyncFilter( newSourceFilter ) ) {\n\t\t\tsetPatternSyncFilter( SYNC_TYPES.all );\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenu\n\t\t\t\tpopoverProps={ {\n\t\t\t\t\tplacement: 'right-end',\n\t\t\t\t} }\n\t\t\t\tlabel=\"Filter patterns\"\n\t\t\t\ticon={\n\t\t\t\t\t<Icon\n\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t<SVG\n\t\t\t\t\t\t\t\twidth=\"24\"\n\t\t\t\t\t\t\t\theight=\"24\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Path\n\t\t\t\t\t\t\t\t\td=\"M10 17.5H14V16H10V17.5ZM6 6V7.5H18V6H6ZM8 12.5H16V11H8V12.5Z\"\n\t\t\t\t\t\t\t\t\tfill=\"#1E1E1E\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</SVG>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{ () => (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<MenuGroup label={ __( 'Author' ) }>\n\t\t\t\t\t\t\t<MenuItemsChoice\n\t\t\t\t\t\t\t\tchoices={ patternSourceMenuOptions }\n\t\t\t\t\t\t\t\tonSelect={ ( value ) => {\n\t\t\t\t\t\t\t\t\thandleSetSourceFilterChange( value );\n\t\t\t\t\t\t\t\t\tscrollContainerRef.current?.scrollTo(\n\t\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t\t0\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\tvalue={ currentPatternSourceFilter }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t\t<MenuGroup label={ __( 'Type' ) }>\n\t\t\t\t\t\t\t<MenuItemsChoice\n\t\t\t\t\t\t\t\tchoices={ patternSyncMenuOptions }\n\t\t\t\t\t\t\t\tonSelect={ ( value ) => {\n\t\t\t\t\t\t\t\t\tsetPatternSyncFilter( value );\n\t\t\t\t\t\t\t\t\tscrollContainerRef.current?.scrollTo(\n\t\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\t\t0\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\tvalue={ patternSyncFilter }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</MenuGroup>\n\t\t\t\t\t</>\n\t\t\t\t) }\n\t\t\t</DropdownMenu>\n\t\t</>\n\t);\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { createElement, Fragment } from "@wordpress/element";
5
5
  import { useMemo, useState, useCallback, useRef, useEffect } from '@wordpress/element';
6
6
  import { _x, __, _n, isRTL, sprintf } from '@wordpress/i18n';
7
7
  import { useViewportMatch } from '@wordpress/compose';
8
- import { __experimentalItemGroup as ItemGroup, __experimentalItem as Item, __experimentalHStack as HStack, FlexBlock, Button } from '@wordpress/components';
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
11
  import { speak } from '@wordpress/a11y';
@@ -17,26 +17,44 @@ import usePatternsState from './hooks/use-patterns-state';
17
17
  import BlockPatternList from '../block-patterns-list';
18
18
  import PatternsExplorerModal from './block-patterns-explorer/explorer';
19
19
  import MobileTabNavigation from './mobile-tab-navigation';
20
- import BlockPatternsPaging from '../block-patterns-paging';
21
20
  import usePatternsPaging from './hooks/use-patterns-paging';
22
- import { PATTERN_TYPES, default as BlockPatternsSourceFilter } from './block-patterns-source-filter';
23
- import { BlockPatternsSyncFilter, SYNC_TYPES } from './block-patterns-sync-filter';
21
+ import { BlockPatternsSyncFilter, SYNC_TYPES, PATTERN_TYPES } from './block-patterns-filter';
24
22
  const noop = () => {};
25
23
  export const allPatternsCategory = {
26
24
  name: 'allPatterns',
27
- label: __('All categories')
25
+ label: __('All patterns')
26
+ };
27
+ export const myPatternsCategory = {
28
+ name: 'myPatterns',
29
+ label: __('My patterns')
28
30
  };
29
31
  export function isPatternFiltered(pattern, sourceFilter, syncFilter) {
30
- if (sourceFilter === PATTERN_TYPES.theme && pattern.name.startsWith('core/block')) {
32
+ const isUserPattern = pattern.name.startsWith('core/block');
33
+ const isDirectoryPattern = pattern.source === 'core' || pattern.source?.startsWith('pattern-directory');
34
+
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)) {
31
44
  return true;
32
45
  }
46
+
47
+ // If user source selected, filter out theme patterns. Any pattern without
48
+ // an id wasn't created by a user.
33
49
  if (sourceFilter === PATTERN_TYPES.user && !pattern.id) {
34
50
  return true;
35
51
  }
36
- if (sourceFilter === PATTERN_TYPES.user && syncFilter === SYNC_TYPES.full && pattern.syncStatus !== '') {
52
+
53
+ // Filter by sync status.
54
+ if (syncFilter === SYNC_TYPES.full && pattern.syncStatus !== '') {
37
55
  return true;
38
56
  }
39
- if (sourceFilter === PATTERN_TYPES.user && syncFilter === SYNC_TYPES.unsynced && pattern.syncStatus !== 'unsynced') {
57
+ if (syncFilter === SYNC_TYPES.unsynced && pattern.syncStatus !== 'unsynced' && isUserPattern) {
40
58
  return true;
41
59
  }
42
60
  return false;
@@ -60,6 +78,9 @@ export function usePatternsCategories(rootClientId, sourceFilter = 'all') {
60
78
  label: _x('Uncategorized')
61
79
  });
62
80
  }
81
+ if (filteredPatterns.some(pattern => pattern.id)) {
82
+ categories.unshift(myPatternsCategory);
83
+ }
63
84
  if (filteredPatterns.length > 0) {
64
85
  categories.unshift({
65
86
  name: allPatternsCategory.name,
@@ -92,6 +113,7 @@ export function BlockPatternsCategoryDialog({
92
113
  ref: container,
93
114
  className: "block-editor-inserter__patterns-category-dialog"
94
115
  }, createElement(BlockPatternsCategoryPanel, {
116
+ key: category.name,
95
117
  rootClientId: rootClientId,
96
118
  onInsert: onInsert,
97
119
  onHover: onHover,
@@ -105,21 +127,24 @@ export function BlockPatternsCategoryPanel({
105
127
  onInsert,
106
128
  onHover = noop,
107
129
  category,
108
- showTitlesAsTooltip,
109
- patternFilter
130
+ showTitlesAsTooltip
110
131
  }) {
111
132
  const [allPatterns,, onClickPattern] = usePatternsState(onInsert, rootClientId);
112
133
  const [patternSyncFilter, setPatternSyncFilter] = useState('all');
113
- const availableCategories = usePatternsCategories(rootClientId, patternFilter);
114
- const container = useRef();
134
+ const [patternSourceFilter, setPatternSourceFilter] = useState('all');
135
+ const availableCategories = usePatternsCategories(rootClientId, patternSourceFilter);
136
+ const scrollContainerRef = useRef();
115
137
  const currentCategoryPatterns = useMemo(() => allPatterns.filter(pattern => {
116
138
  var _pattern$categories$f;
117
- if (isPatternFiltered(pattern, patternFilter, patternSyncFilter)) {
139
+ if (isPatternFiltered(pattern, patternSourceFilter, patternSyncFilter)) {
118
140
  return false;
119
141
  }
120
142
  if (category.name === allPatternsCategory.name) {
121
143
  return true;
122
144
  }
145
+ if (category.name === myPatternsCategory.name && pattern.id) {
146
+ return true;
147
+ }
123
148
  if (category.name !== 'uncategorized') {
124
149
  return pattern.categories?.includes(category.name);
125
150
  }
@@ -128,21 +153,43 @@ export function BlockPatternsCategoryPanel({
128
153
  // or with no available category.
129
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 : [];
130
155
  return availablePatternCategories.length === 0;
131
- }), [allPatterns, availableCategories, category.name, patternFilter, patternSyncFilter]);
132
- const pagingProps = usePatternsPaging(currentCategoryPatterns, category, container);
156
+ }), [allPatterns, availableCategories, category.name, patternSourceFilter, patternSyncFilter]);
157
+ const pagingProps = usePatternsPaging(currentCategoryPatterns, category, scrollContainerRef);
158
+ const {
159
+ changePage
160
+ } = pagingProps;
133
161
 
134
162
  // Hide block pattern preview on unmount.
135
163
  // eslint-disable-next-line react-hooks/exhaustive-deps
136
164
  useEffect(() => () => onHover(null), []);
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]);
137
173
  return createElement("div", {
138
- className: "block-editor-inserter__patterns-category-panel",
139
- ref: container
140
- }, createElement("div", {
141
- className: "block-editor-inserter__patterns-category-panel-title"
142
- }, category.label), createElement("p", null, category.description), patternFilter === PATTERN_TYPES.user && createElement(BlockPatternsSyncFilter, {
174
+ className: "block-editor-inserter__patterns-category-panel"
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, {
143
182
  patternSyncFilter: patternSyncFilter,
144
- setPatternSyncFilter: setPatternSyncFilter
145
- }), !currentCategoryPatterns.length && createElement("div", null, __('No results found')), currentCategoryPatterns.length > 0 && createElement(BlockPatternList, {
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,
146
193
  shownPatterns: pagingProps.categoryPatternsAsyncList,
147
194
  blockPatterns: pagingProps.categoryPatterns,
148
195
  onClickPattern: onClickPattern,
@@ -152,9 +199,8 @@ export function BlockPatternsCategoryPanel({
152
199
  category: category.name,
153
200
  isDraggable: true,
154
201
  showTitlesAsTooltip: showTitlesAsTooltip,
155
- patternFilter: patternFilter
156
- }), pagingProps.numPages > 1 && createElement(BlockPatternsPaging, {
157
- ...pagingProps
202
+ patternFilter: patternSourceFilter,
203
+ pagingProps: pagingProps
158
204
  }));
159
205
  }
160
206
  function BlockPatternsTabs({
@@ -164,8 +210,7 @@ function BlockPatternsTabs({
164
210
  rootClientId
165
211
  }) {
166
212
  const [showPatternsExplorer, setShowPatternsExplorer] = useState(false);
167
- const [patternSourceFilter, setPatternSourceFilter] = useState('all');
168
- const categories = usePatternsCategories(rootClientId, patternSourceFilter);
213
+ const categories = usePatternsCategories(rootClientId);
169
214
  const initialCategory = selectedCategory || categories[0];
170
215
  const isMobile = useViewportMatch('medium', '<');
171
216
  return createElement(Fragment, null, !isMobile && createElement("div", {
@@ -173,18 +218,12 @@ function BlockPatternsTabs({
173
218
  }, createElement("nav", {
174
219
  "aria-label": __('Block pattern categories'),
175
220
  className: "block-editor-inserter__block-patterns-tabs"
176
- }, createElement(BlockPatternsSourceFilter, {
177
- value: patternSourceFilter,
178
- onChange: value => {
179
- setPatternSourceFilter(value);
180
- onSelectCategory(allPatternsCategory, value);
181
- }
182
- }), createElement(ItemGroup, {
221
+ }, createElement(ItemGroup, {
183
222
  role: "list"
184
223
  }, categories.map(category => createElement(Item, {
185
224
  role: "listitem",
186
225
  key: category.name,
187
- onClick: () => onSelectCategory(category, patternSourceFilter),
226
+ onClick: () => onSelectCategory(category),
188
227
  className: category === selectedCategory ? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category' : 'block-editor-inserter__patterns-category',
189
228
  "aria-label": category.label,
190
229
  "aria-current": category === selectedCategory ? 'true' : undefined
@@ -199,6 +238,7 @@ function BlockPatternsTabs({
199
238
  }, __('Explore all patterns')))))), isMobile && createElement(MobileTabNavigation, {
200
239
  categories: categories
201
240
  }, category => createElement(BlockPatternsCategoryPanel, {
241
+ key: category.name,
202
242
  onInsert: onInsert,
203
243
  rootClientId: rootClientId,
204
244
  category: category,
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","useState","useCallback","useRef","useEffect","_x","__","_n","isRTL","sprintf","useViewportMatch","__experimentalItemGroup","ItemGroup","__experimentalItem","Item","__experimentalHStack","HStack","FlexBlock","Button","Icon","chevronRight","chevronLeft","focus","speak","usePatternsState","BlockPatternList","PatternsExplorerModal","MobileTabNavigation","BlockPatternsPaging","usePatternsPaging","PATTERN_TYPES","default","BlockPatternsSourceFilter","BlockPatternsSyncFilter","SYNC_TYPES","noop","allPatternsCategory","name","label","isPatternFiltered","pattern","sourceFilter","syncFilter","theme","startsWith","user","id","full","syncStatus","unsynced","usePatternsCategories","rootClientId","patterns","allCategories","undefined","filteredPatterns","filter","hasRegisteredCategory","categories","length","some","cat","category","populatedCategories","includes","sort","a","b","localeCompare","find","push","unshift","BlockPatternsCategoryDialog","onInsert","onHover","showTitlesAsTooltip","patternFilter","container","timeout","setTimeout","firstTabbable","tabbable","current","clearTimeout","createElement","ref","className","BlockPatternsCategoryPanel","allPatterns","onClickPattern","patternSyncFilter","setPatternSyncFilter","availableCategories","currentCategoryPatterns","_pattern$categories$f","availablePatternCategories","availableCategory","pagingProps","description","shownPatterns","categoryPatternsAsyncList","blockPatterns","categoryPatterns","orientation","isDraggable","numPages","BlockPatternsTabs","onSelectCategory","selectedCategory","showPatternsExplorer","setShowPatternsExplorer","patternSourceFilter","setPatternSourceFilter","initialCategory","isMobile","Fragment","value","onChange","role","map","key","onClick","icon","variant","patternCategories","onModalClose"],"sources":["@wordpress/block-editor/src/components/inserter/block-patterns-tab.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport {\n\tuseMemo,\n\tuseState,\n\tuseCallback,\n\tuseRef,\n\tuseEffect,\n} from '@wordpress/element';\nimport { _x, __, _n, isRTL, sprintf } from '@wordpress/i18n';\nimport { useViewportMatch } from '@wordpress/compose';\nimport {\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalItem as Item,\n\t__experimentalHStack as HStack,\n\tFlexBlock,\n\tButton,\n} from '@wordpress/components';\nimport { Icon, chevronRight, chevronLeft } from '@wordpress/icons';\nimport { focus } from '@wordpress/dom';\nimport { speak } from '@wordpress/a11y';\n\n/**\n * Internal dependencies\n */\nimport usePatternsState from './hooks/use-patterns-state';\nimport BlockPatternList from '../block-patterns-list';\nimport PatternsExplorerModal from './block-patterns-explorer/explorer';\nimport MobileTabNavigation from './mobile-tab-navigation';\nimport BlockPatternsPaging from '../block-patterns-paging';\nimport usePatternsPaging from './hooks/use-patterns-paging';\nimport {\n\tPATTERN_TYPES,\n\tdefault as BlockPatternsSourceFilter,\n} from './block-patterns-source-filter';\nimport {\n\tBlockPatternsSyncFilter,\n\tSYNC_TYPES,\n} from './block-patterns-sync-filter';\n\nconst noop = () => {};\n\nexport const allPatternsCategory = {\n\tname: 'allPatterns',\n\tlabel: __( 'All categories' ),\n};\n\nexport function isPatternFiltered( pattern, sourceFilter, syncFilter ) {\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.theme &&\n\t\tpattern.name.startsWith( 'core/block' )\n\t) {\n\t\treturn true;\n\t}\n\tif ( sourceFilter === PATTERN_TYPES.user && ! pattern.id ) {\n\t\treturn true;\n\t}\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.user &&\n\t\tsyncFilter === SYNC_TYPES.full &&\n\t\tpattern.syncStatus !== ''\n\t) {\n\t\treturn true;\n\t}\n\tif (\n\t\tsourceFilter === PATTERN_TYPES.user &&\n\t\tsyncFilter === SYNC_TYPES.unsynced &&\n\t\tpattern.syncStatus !== 'unsynced'\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport function usePatternsCategories( rootClientId, sourceFilter = 'all' ) {\n\tconst [ patterns, allCategories ] = usePatternsState(\n\t\tundefined,\n\t\trootClientId\n\t);\n\n\tconst filteredPatterns = useMemo(\n\t\t() =>\n\t\t\tsourceFilter === 'all'\n\t\t\t\t? patterns\n\t\t\t\t: patterns.filter(\n\t\t\t\t\t\t( pattern ) =>\n\t\t\t\t\t\t\t! isPatternFiltered( pattern, sourceFilter )\n\t\t\t\t ),\n\t\t[ sourceFilter, patterns ]\n\t);\n\n\tconst hasRegisteredCategory = useCallback(\n\t\t( pattern ) => {\n\t\t\tif ( ! pattern.categories || ! pattern.categories.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn pattern.categories.some( ( cat ) =>\n\t\t\t\tallCategories.some( ( category ) => category.name === cat )\n\t\t\t);\n\t\t},\n\t\t[ allCategories ]\n\t);\n\n\t// Remove any empty categories.\n\tconst populatedCategories = useMemo( () => {\n\t\tconst categories = allCategories\n\t\t\t.filter( ( category ) =>\n\t\t\t\tfilteredPatterns.some( ( pattern ) =>\n\t\t\t\t\tpattern.categories?.includes( category.name )\n\t\t\t\t)\n\t\t\t)\n\t\t\t.sort( ( a, b ) => a.label.localeCompare( b.label ) );\n\n\t\tif (\n\t\t\tfilteredPatterns.some(\n\t\t\t\t( pattern ) => ! hasRegisteredCategory( pattern )\n\t\t\t) &&\n\t\t\t! categories.find(\n\t\t\t\t( category ) => category.name === 'uncategorized'\n\t\t\t)\n\t\t) {\n\t\t\tcategories.push( {\n\t\t\t\tname: 'uncategorized',\n\t\t\t\tlabel: _x( 'Uncategorized' ),\n\t\t\t} );\n\t\t}\n\t\tif ( filteredPatterns.length > 0 ) {\n\t\t\tcategories.unshift( {\n\t\t\t\tname: allPatternsCategory.name,\n\t\t\t\tlabel: allPatternsCategory.label,\n\t\t\t} );\n\t\t}\n\t\tspeak(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %d: number of categories . */\n\t\t\t\t_n(\n\t\t\t\t\t'%d category button displayed.',\n\t\t\t\t\t'%d category buttons displayed.',\n\t\t\t\t\tcategories.length\n\t\t\t\t),\n\t\t\t\tcategories.length\n\t\t\t)\n\t\t);\n\t\treturn categories;\n\t}, [ allCategories, filteredPatterns, hasRegisteredCategory ] );\n\n\treturn populatedCategories;\n}\n\nexport function BlockPatternsCategoryDialog( {\n\trootClientId,\n\tonInsert,\n\tonHover,\n\tcategory,\n\tshowTitlesAsTooltip,\n\tpatternFilter,\n} ) {\n\tconst container = useRef();\n\n\tuseEffect( () => {\n\t\tconst timeout = setTimeout( () => {\n\t\t\tconst [ firstTabbable ] = focus.tabbable.find( container.current );\n\t\t\tfirstTabbable?.focus();\n\t\t} );\n\t\treturn () => clearTimeout( timeout );\n\t}, [ category ] );\n\n\treturn (\n\t\t<div\n\t\t\tref={ container }\n\t\t\tclassName=\"block-editor-inserter__patterns-category-dialog\"\n\t\t>\n\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\trootClientId={ rootClientId }\n\t\t\t\tonInsert={ onInsert }\n\t\t\t\tonHover={ onHover }\n\t\t\t\tcategory={ category }\n\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t\tpatternFilter={ patternFilter }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport function BlockPatternsCategoryPanel( {\n\trootClientId,\n\tonInsert,\n\tonHover = noop,\n\tcategory,\n\tshowTitlesAsTooltip,\n\tpatternFilter,\n} ) {\n\tconst [ allPatterns, , onClickPattern ] = usePatternsState(\n\t\tonInsert,\n\t\trootClientId\n\t);\n\tconst [ patternSyncFilter, setPatternSyncFilter ] = useState( 'all' );\n\n\tconst availableCategories = usePatternsCategories(\n\t\trootClientId,\n\t\tpatternFilter\n\t);\n\tconst container = useRef();\n\tconst currentCategoryPatterns = useMemo(\n\t\t() =>\n\t\t\tallPatterns.filter( ( pattern ) => {\n\t\t\t\tif (\n\t\t\t\t\tisPatternFiltered(\n\t\t\t\t\t\tpattern,\n\t\t\t\t\t\tpatternFilter,\n\t\t\t\t\t\tpatternSyncFilter\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( category.name === allPatternsCategory.name ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif ( category.name !== 'uncategorized' ) {\n\t\t\t\t\treturn pattern.categories?.includes( category.name );\n\t\t\t\t}\n\n\t\t\t\t// The uncategorized category should show all the patterns without any category\n\t\t\t\t// or with no available category.\n\t\t\t\tconst availablePatternCategories =\n\t\t\t\t\tpattern.categories?.filter( ( cat ) =>\n\t\t\t\t\t\tavailableCategories.find(\n\t\t\t\t\t\t\t( availableCategory ) =>\n\t\t\t\t\t\t\t\tavailableCategory.name === cat\n\t\t\t\t\t\t)\n\t\t\t\t\t) ?? [];\n\n\t\t\t\treturn availablePatternCategories.length === 0;\n\t\t\t} ),\n\t\t[\n\t\t\tallPatterns,\n\t\t\tavailableCategories,\n\t\t\tcategory.name,\n\t\t\tpatternFilter,\n\t\t\tpatternSyncFilter,\n\t\t]\n\t);\n\n\tconst pagingProps = usePatternsPaging(\n\t\tcurrentCategoryPatterns,\n\t\tcategory,\n\t\tcontainer\n\t);\n\n\t// Hide block pattern preview on unmount.\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\tuseEffect( () => () => onHover( null ), [] );\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"block-editor-inserter__patterns-category-panel\"\n\t\t\tref={ container }\n\t\t>\n\t\t\t<div className=\"block-editor-inserter__patterns-category-panel-title\">\n\t\t\t\t{ category.label }\n\t\t\t</div>\n\t\t\t<p>{ category.description }</p>\n\t\t\t{ patternFilter === PATTERN_TYPES.user && (\n\t\t\t\t<BlockPatternsSyncFilter\n\t\t\t\t\tpatternSyncFilter={ patternSyncFilter }\n\t\t\t\t\tsetPatternSyncFilter={ setPatternSyncFilter }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ ! currentCategoryPatterns.length && (\n\t\t\t\t<div>{ __( 'No results found' ) }</div>\n\t\t\t) }\n\t\t\t{ currentCategoryPatterns.length > 0 && (\n\t\t\t\t<BlockPatternList\n\t\t\t\t\tshownPatterns={ pagingProps.categoryPatternsAsyncList }\n\t\t\t\t\tblockPatterns={ pagingProps.categoryPatterns }\n\t\t\t\t\tonClickPattern={ onClickPattern }\n\t\t\t\t\tonHover={ onHover }\n\t\t\t\t\tlabel={ category.label }\n\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\tcategory={ category.name }\n\t\t\t\t\tisDraggable\n\t\t\t\t\tshowTitlesAsTooltip={ showTitlesAsTooltip }\n\t\t\t\t\tpatternFilter={ patternFilter }\n\t\t\t\t/>\n\t\t\t) }\n\t\t\t{ pagingProps.numPages > 1 && (\n\t\t\t\t<BlockPatternsPaging { ...pagingProps } />\n\t\t\t) }\n\t\t</div>\n\t);\n}\n\nfunction BlockPatternsTabs( {\n\tonSelectCategory,\n\tselectedCategory,\n\tonInsert,\n\trootClientId,\n} ) {\n\tconst [ showPatternsExplorer, setShowPatternsExplorer ] = useState( false );\n\tconst [ patternSourceFilter, setPatternSourceFilter ] = useState( 'all' );\n\n\tconst categories = usePatternsCategories(\n\t\trootClientId,\n\t\tpatternSourceFilter\n\t);\n\n\tconst initialCategory = selectedCategory || categories[ 0 ];\n\tconst isMobile = useViewportMatch( 'medium', '<' );\n\treturn (\n\t\t<>\n\t\t\t{ ! isMobile && (\n\t\t\t\t<div className=\"block-editor-inserter__block-patterns-tabs-container\">\n\t\t\t\t\t<nav\n\t\t\t\t\t\taria-label={ __( 'Block pattern categories' ) }\n\t\t\t\t\t\tclassName=\"block-editor-inserter__block-patterns-tabs\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<BlockPatternsSourceFilter\n\t\t\t\t\t\t\tvalue={ patternSourceFilter }\n\t\t\t\t\t\t\tonChange={ ( value ) => {\n\t\t\t\t\t\t\t\tsetPatternSourceFilter( value );\n\t\t\t\t\t\t\t\tonSelectCategory( allPatternsCategory, value );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<ItemGroup role=\"list\">\n\t\t\t\t\t\t\t{ categories.map( ( category ) => (\n\t\t\t\t\t\t\t\t<Item\n\t\t\t\t\t\t\t\t\trole=\"listitem\"\n\t\t\t\t\t\t\t\t\tkey={ category.name }\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tonSelectCategory(\n\t\t\t\t\t\t\t\t\t\t\tcategory,\n\t\t\t\t\t\t\t\t\t\t\tpatternSourceFilter\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'block-editor-inserter__patterns-category block-editor-inserter__patterns-selected-category'\n\t\t\t\t\t\t\t\t\t\t\t: 'block-editor-inserter__patterns-category'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taria-label={ category.label }\n\t\t\t\t\t\t\t\t\taria-current={\n\t\t\t\t\t\t\t\t\t\tcategory === selectedCategory\n\t\t\t\t\t\t\t\t\t\t\t? 'true'\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<HStack>\n\t\t\t\t\t\t\t\t\t\t<FlexBlock>\n\t\t\t\t\t\t\t\t\t\t\t{ category.label }\n\t\t\t\t\t\t\t\t\t\t</FlexBlock>\n\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t\t\tisRTL()\n\t\t\t\t\t\t\t\t\t\t\t\t\t? chevronLeft\n\t\t\t\t\t\t\t\t\t\t\t\t\t: chevronRight\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t\t\t</Item>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t\t<div role=\"listitem\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tclassName=\"block-editor-inserter__patterns-explore-button\"\n\t\t\t\t\t\t\t\t\tonClick={ () =>\n\t\t\t\t\t\t\t\t\t\tsetShowPatternsExplorer( true )\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Explore all patterns' ) }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ItemGroup>\n\t\t\t\t\t</nav>\n\t\t\t\t</div>\n\t\t\t) }\n\t\t\t{ isMobile && (\n\t\t\t\t<MobileTabNavigation categories={ categories }>\n\t\t\t\t\t{ ( category ) => (\n\t\t\t\t\t\t<BlockPatternsCategoryPanel\n\t\t\t\t\t\t\tonInsert={ onInsert }\n\t\t\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t\t\t\tcategory={ category }\n\t\t\t\t\t\t\tshowTitlesAsTooltip={ false }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</MobileTabNavigation>\n\t\t\t) }\n\t\t\t{ showPatternsExplorer && (\n\t\t\t\t<PatternsExplorerModal\n\t\t\t\t\tinitialCategory={ initialCategory }\n\t\t\t\t\tpatternCategories={ categories }\n\t\t\t\t\tonModalClose={ () => setShowPatternsExplorer( false ) }\n\t\t\t\t\trootClientId={ rootClientId }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nexport default BlockPatternsTabs;\n"],"mappings":"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"}
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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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useMemo, useState } from '@wordpress/element';
4
+ import { useMemo, useState, useEffect } from '@wordpress/element';
5
5
  import { useAsyncList, usePrevious } from '@wordpress/compose';
6
6
  import { getScrollContainer } from '@wordpress/dom';
7
7
  const PAGE_SIZE = 20;
@@ -38,6 +38,10 @@ export default function usePatternsPaging(currentCategoryPatterns, currentCatego
38
38
  scrollContainer?.scrollTo(0, 0);
39
39
  setCurrentPage(page);
40
40
  };
41
+ useEffect(function scrollToTopOnCategoryChange() {
42
+ const scrollContainer = getScrollContainer(scrollContainerRef?.current);
43
+ scrollContainer?.scrollTo(0, 0);
44
+ }, [currentCategory, scrollContainerRef]);
41
45
  return {
42
46
  totalItems,
43
47
  categoryPatterns,
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","useState","useAsyncList","usePrevious","getScrollContainer","PAGE_SIZE","INITIAL_INSERTER_RESULTS","usePatternsPaging","currentCategoryPatterns","currentCategory","scrollContainerRef","currentFilter","currentPage","setCurrentPage","previousCategory","previousFilter","totalItems","length","pageIndex","categoryPatterns","slice","categoryPatternsAsyncList","step","numPages","Math","ceil","changePage","page","scrollContainer","current","scrollTo"],"sources":["@wordpress/block-editor/src/components/inserter/hooks/use-patterns-paging.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useMemo, useState } from '@wordpress/element';\nimport { useAsyncList, usePrevious } from '@wordpress/compose';\nimport { getScrollContainer } from '@wordpress/dom';\n\nconst PAGE_SIZE = 20;\nconst INITIAL_INSERTER_RESULTS = 5;\n\n/**\n * Supplies values needed to page the patterns list client side.\n *\n * @param {Array} currentCategoryPatterns An array of the current patterns to display.\n * @param {string} currentCategory The currently selected category.\n * @param {Object} scrollContainerRef Ref of container to to find scroll container for when moving between pages.\n * @param {string} currentFilter The currently search filter.\n *\n * @return {Object} Returns the relevant paging values. (totalItems, categoryPatternsList, numPages, changePage, currentPage)\n */\nexport default function usePatternsPaging(\n\tcurrentCategoryPatterns,\n\tcurrentCategory,\n\tscrollContainerRef,\n\tcurrentFilter = ''\n) {\n\tconst [ currentPage, setCurrentPage ] = useState( 1 );\n\tconst previousCategory = usePrevious( currentCategory );\n\tconst previousFilter = usePrevious( currentFilter );\n\tif (\n\t\t( previousCategory !== currentCategory ||\n\t\t\tpreviousFilter !== currentFilter ) &&\n\t\tcurrentPage !== 1\n\t) {\n\t\tsetCurrentPage( 1 );\n\t}\n\tconst totalItems = currentCategoryPatterns.length;\n\tconst pageIndex = currentPage - 1;\n\tconst categoryPatterns = useMemo( () => {\n\t\treturn currentCategoryPatterns.slice(\n\t\t\tpageIndex * PAGE_SIZE,\n\t\t\tpageIndex * PAGE_SIZE + PAGE_SIZE\n\t\t);\n\t}, [ pageIndex, currentCategoryPatterns ] );\n\tconst categoryPatternsAsyncList = useAsyncList( categoryPatterns, {\n\t\tstep: INITIAL_INSERTER_RESULTS,\n\t} );\n\tconst numPages = Math.ceil( currentCategoryPatterns.length / PAGE_SIZE );\n\tconst changePage = ( page ) => {\n\t\tconst scrollContainer = getScrollContainer(\n\t\t\tscrollContainerRef?.current\n\t\t);\n\t\tscrollContainer?.scrollTo( 0, 0 );\n\n\t\tsetCurrentPage( page );\n\t};\n\treturn {\n\t\ttotalItems,\n\t\tcategoryPatterns,\n\t\tcategoryPatternsAsyncList,\n\t\tnumPages,\n\t\tchangePage,\n\t\tcurrentPage,\n\t};\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,oBAAoB;AACtD,SAASC,YAAY,EAAEC,WAAW,QAAQ,oBAAoB;AAC9D,SAASC,kBAAkB,QAAQ,gBAAgB;AAEnD,MAAMC,SAAS,GAAG,EAAE;AACpB,MAAMC,wBAAwB,GAAG,CAAC;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,iBAAiBA,CACxCC,uBAAuB,EACvBC,eAAe,EACfC,kBAAkB,EAClBC,aAAa,GAAG,EAAE,EACjB;EACD,MAAM,CAAEC,WAAW,EAAEC,cAAc,CAAE,GAAGZ,QAAQ,CAAE,CAAE,CAAC;EACrD,MAAMa,gBAAgB,GAAGX,WAAW,CAAEM,eAAgB,CAAC;EACvD,MAAMM,cAAc,GAAGZ,WAAW,CAAEQ,aAAc,CAAC;EACnD,IACC,CAAEG,gBAAgB,KAAKL,eAAe,IACrCM,cAAc,KAAKJ,aAAa,KACjCC,WAAW,KAAK,CAAC,EAChB;IACDC,cAAc,CAAE,CAAE,CAAC;EACpB;EACA,MAAMG,UAAU,GAAGR,uBAAuB,CAACS,MAAM;EACjD,MAAMC,SAAS,GAAGN,WAAW,GAAG,CAAC;EACjC,MAAMO,gBAAgB,GAAGnB,OAAO,CAAE,MAAM;IACvC,OAAOQ,uBAAuB,CAACY,KAAK,CACnCF,SAAS,GAAGb,SAAS,EACrBa,SAAS,GAAGb,SAAS,GAAGA,SACzB,CAAC;EACF,CAAC,EAAE,CAAEa,SAAS,EAAEV,uBAAuB,CAAG,CAAC;EAC3C,MAAMa,yBAAyB,GAAGnB,YAAY,CAAEiB,gBAAgB,EAAE;IACjEG,IAAI,EAAEhB;EACP,CAAE,CAAC;EACH,MAAMiB,QAAQ,GAAGC,IAAI,CAACC,IAAI,CAAEjB,uBAAuB,CAACS,MAAM,GAAGZ,SAAU,CAAC;EACxE,MAAMqB,UAAU,GAAKC,IAAI,IAAM;IAC9B,MAAMC,eAAe,GAAGxB,kBAAkB,CACzCM,kBAAkB,EAAEmB,OACrB,CAAC;IACDD,eAAe,EAAEE,QAAQ,CAAE,CAAC,EAAE,CAAE,CAAC;IAEjCjB,cAAc,CAAEc,IAAK,CAAC;EACvB,CAAC;EACD,OAAO;IACNX,UAAU;IACVG,gBAAgB;IAChBE,yBAAyB;IACzBE,QAAQ;IACRG,UAAU;IACVd;EACD,CAAC;AACF"}
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"}
@@ -119,7 +119,7 @@ function InserterSearchResults({
119
119
  isDraggable: isDraggable
120
120
  }));
121
121
  const patternsUI = !!filteredBlockPatterns.length && createElement(InserterPanel, {
122
- title: createElement(VisuallyHidden, null, __('Block Patterns'))
122
+ title: createElement(VisuallyHidden, null, __('Block patterns'))
123
123
  }, createElement("div", {
124
124
  className: "block-editor-inserter__quick-inserter-patterns"
125
125
  }, createElement(BlockPatternsList, {