@wordpress/edit-site 5.28.2 → 5.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/add-new-pattern/index.js +18 -8
  3. package/build/components/add-new-pattern/index.js.map +1 -1
  4. package/build/components/block-editor/use-site-editor-settings.js +2 -1
  5. package/build/components/block-editor/use-site-editor-settings.js.map +1 -1
  6. package/build/components/code-editor/index.js +3 -2
  7. package/build/components/code-editor/index.js.map +1 -1
  8. package/build/components/editor/index.js +4 -4
  9. package/build/components/editor/index.js.map +1 -1
  10. package/build/components/editor-canvas-container/index.js +1 -1
  11. package/build/components/editor-canvas-container/index.js.map +1 -1
  12. package/build/components/global-styles/block-preview-panel.js +2 -2
  13. package/build/components/global-styles/block-preview-panel.js.map +1 -1
  14. package/build/components/global-styles/font-library-modal/collection-font-details.js +1 -1
  15. package/build/components/global-styles/font-library-modal/collection-font-details.js.map +1 -1
  16. package/build/components/global-styles/font-library-modal/font-collection.js +84 -7
  17. package/build/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  18. package/build/components/global-styles/font-library-modal/google-fonts-confirm-dialog.js +1 -1
  19. package/build/components/global-styles/font-library-modal/google-fonts-confirm-dialog.js.map +1 -1
  20. package/build/components/global-styles/font-library-modal/installed-fonts.js +10 -7
  21. package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  22. package/build/components/header-edit-mode/document-tools/index.js +1 -2
  23. package/build/components/header-edit-mode/document-tools/index.js.map +1 -1
  24. package/build/components/header-edit-mode/index.js +3 -1
  25. package/build/components/header-edit-mode/index.js.map +1 -1
  26. package/build/components/header-edit-mode/more-menu/index.js +7 -4
  27. package/build/components/header-edit-mode/more-menu/index.js.map +1 -1
  28. package/build/components/keyboard-shortcuts/edit-mode.js +0 -13
  29. package/build/components/keyboard-shortcuts/edit-mode.js.map +1 -1
  30. package/build/components/keyboard-shortcuts/register.js +0 -18
  31. package/build/components/keyboard-shortcuts/register.js.map +1 -1
  32. package/build/components/layout/index.js +8 -4
  33. package/build/components/layout/index.js.map +1 -1
  34. package/build/components/layout/router.js +26 -5
  35. package/build/components/layout/router.js.map +1 -1
  36. package/build/components/page-patterns/dataviews-pattern-actions.js +25 -8
  37. package/build/components/page-patterns/dataviews-pattern-actions.js.map +1 -1
  38. package/build/components/page-patterns/header.js +2 -1
  39. package/build/components/page-patterns/header.js.map +1 -1
  40. package/build/components/page-patterns/index.js +0 -1
  41. package/build/components/page-patterns/index.js.map +1 -1
  42. package/build/components/page-patterns/use-patterns.js +10 -5
  43. package/build/components/page-patterns/use-patterns.js.map +1 -1
  44. package/build/components/page-templates-template-parts/index.js +1 -0
  45. package/build/components/page-templates-template-parts/index.js.map +1 -1
  46. package/build/components/save-button/index.js +2 -1
  47. package/build/components/save-button/index.js.map +1 -1
  48. package/build/components/sidebar/index.js +5 -2
  49. package/build/components/sidebar/index.js.map +1 -1
  50. package/build/components/sidebar-edit-mode/global-styles-sidebar.js +5 -5
  51. package/build/components/sidebar-edit-mode/global-styles-sidebar.js.map +1 -1
  52. package/build/components/sidebar-edit-mode/template-panel/hooks.js +20 -5
  53. package/build/components/sidebar-edit-mode/template-panel/hooks.js.map +1 -1
  54. package/build/components/sidebar-edit-mode/template-panel/index.js +48 -5
  55. package/build/components/sidebar-edit-mode/template-panel/index.js.map +1 -1
  56. package/build/components/sidebar-edit-mode/template-panel/template-actions.js +2 -9
  57. package/build/components/sidebar-edit-mode/template-panel/template-actions.js.map +1 -1
  58. package/build/components/sidebar-navigation-screen-global-styles/index.js +6 -2
  59. package/build/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  60. package/build/components/sidebar-navigation-screen-pages/index.js +3 -1
  61. package/build/components/sidebar-navigation-screen-pages/index.js.map +1 -1
  62. package/build/components/style-book/index.js +2 -0
  63. package/build/components/style-book/index.js.map +1 -1
  64. package/build/hooks/commands/use-edit-mode-commands.js +3 -171
  65. package/build/hooks/commands/use-edit-mode-commands.js.map +1 -1
  66. package/build/hooks/index.js +0 -1
  67. package/build/hooks/index.js.map +1 -1
  68. package/build/hooks/push-changes-to-global-styles/index.js +4 -5
  69. package/build/hooks/push-changes-to-global-styles/index.js.map +1 -1
  70. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +91 -0
  71. package/build/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -0
  72. package/build/store/actions.js +19 -50
  73. package/build/store/actions.js.map +1 -1
  74. package/build/store/private-actions.js +3 -1
  75. package/build/store/private-actions.js.map +1 -1
  76. package/build/utils/clone-deep.js +15 -0
  77. package/build/utils/clone-deep.js.map +1 -0
  78. package/build-module/components/add-new-pattern/index.js +18 -8
  79. package/build-module/components/add-new-pattern/index.js.map +1 -1
  80. package/build-module/components/block-editor/use-site-editor-settings.js +2 -1
  81. package/build-module/components/block-editor/use-site-editor-settings.js.map +1 -1
  82. package/build-module/components/code-editor/index.js +3 -2
  83. package/build-module/components/code-editor/index.js.map +1 -1
  84. package/build-module/components/editor/index.js +4 -4
  85. package/build-module/components/editor/index.js.map +1 -1
  86. package/build-module/components/editor-canvas-container/index.js +2 -2
  87. package/build-module/components/editor-canvas-container/index.js.map +1 -1
  88. package/build-module/components/global-styles/block-preview-panel.js +2 -2
  89. package/build-module/components/global-styles/block-preview-panel.js.map +1 -1
  90. package/build-module/components/global-styles/font-library-modal/collection-font-details.js +1 -1
  91. package/build-module/components/global-styles/font-library-modal/collection-font-details.js.map +1 -1
  92. package/build-module/components/global-styles/font-library-modal/font-collection.js +87 -10
  93. package/build-module/components/global-styles/font-library-modal/font-collection.js.map +1 -1
  94. package/build-module/components/global-styles/font-library-modal/google-fonts-confirm-dialog.js +1 -1
  95. package/build-module/components/global-styles/font-library-modal/google-fonts-confirm-dialog.js.map +1 -1
  96. package/build-module/components/global-styles/font-library-modal/installed-fonts.js +11 -8
  97. package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -1
  98. package/build-module/components/header-edit-mode/document-tools/index.js +1 -2
  99. package/build-module/components/header-edit-mode/document-tools/index.js.map +1 -1
  100. package/build-module/components/header-edit-mode/index.js +3 -1
  101. package/build-module/components/header-edit-mode/index.js.map +1 -1
  102. package/build-module/components/header-edit-mode/more-menu/index.js +6 -3
  103. package/build-module/components/header-edit-mode/more-menu/index.js.map +1 -1
  104. package/build-module/components/keyboard-shortcuts/edit-mode.js +0 -13
  105. package/build-module/components/keyboard-shortcuts/edit-mode.js.map +1 -1
  106. package/build-module/components/keyboard-shortcuts/register.js +0 -18
  107. package/build-module/components/keyboard-shortcuts/register.js.map +1 -1
  108. package/build-module/components/layout/index.js +9 -5
  109. package/build-module/components/layout/index.js.map +1 -1
  110. package/build-module/components/layout/router.js +26 -5
  111. package/build-module/components/layout/router.js.map +1 -1
  112. package/build-module/components/page-patterns/dataviews-pattern-actions.js +25 -8
  113. package/build-module/components/page-patterns/dataviews-pattern-actions.js.map +1 -1
  114. package/build-module/components/page-patterns/header.js +2 -1
  115. package/build-module/components/page-patterns/header.js.map +1 -1
  116. package/build-module/components/page-patterns/index.js +0 -1
  117. package/build-module/components/page-patterns/index.js.map +1 -1
  118. package/build-module/components/page-patterns/use-patterns.js +10 -5
  119. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  120. package/build-module/components/page-templates-template-parts/index.js +1 -0
  121. package/build-module/components/page-templates-template-parts/index.js.map +1 -1
  122. package/build-module/components/save-button/index.js +2 -1
  123. package/build-module/components/save-button/index.js.map +1 -1
  124. package/build-module/components/sidebar/index.js +5 -2
  125. package/build-module/components/sidebar/index.js.map +1 -1
  126. package/build-module/components/sidebar-edit-mode/global-styles-sidebar.js +5 -5
  127. package/build-module/components/sidebar-edit-mode/global-styles-sidebar.js.map +1 -1
  128. package/build-module/components/sidebar-edit-mode/template-panel/hooks.js +20 -5
  129. package/build-module/components/sidebar-edit-mode/template-panel/hooks.js.map +1 -1
  130. package/build-module/components/sidebar-edit-mode/template-panel/index.js +50 -7
  131. package/build-module/components/sidebar-edit-mode/template-panel/index.js.map +1 -1
  132. package/build-module/components/sidebar-edit-mode/template-panel/template-actions.js +2 -9
  133. package/build-module/components/sidebar-edit-mode/template-panel/template-actions.js.map +1 -1
  134. package/build-module/components/sidebar-navigation-screen-global-styles/index.js +6 -2
  135. package/build-module/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  136. package/build-module/components/sidebar-navigation-screen-pages/index.js +3 -1
  137. package/build-module/components/sidebar-navigation-screen-pages/index.js.map +1 -1
  138. package/build-module/components/style-book/index.js +2 -0
  139. package/build-module/components/style-book/index.js.map +1 -1
  140. package/build-module/hooks/commands/use-edit-mode-commands.js +4 -172
  141. package/build-module/hooks/commands/use-edit-mode-commands.js.map +1 -1
  142. package/build-module/hooks/index.js +0 -1
  143. package/build-module/hooks/index.js.map +1 -1
  144. package/build-module/hooks/push-changes-to-global-styles/index.js +1 -3
  145. package/build-module/hooks/push-changes-to-global-styles/index.js.map +1 -1
  146. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +82 -0
  147. package/build-module/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js.map +1 -0
  148. package/build-module/store/actions.js +19 -50
  149. package/build-module/store/actions.js.map +1 -1
  150. package/build-module/store/private-actions.js +3 -1
  151. package/build-module/store/private-actions.js.map +1 -1
  152. package/build-module/utils/clone-deep.js +9 -0
  153. package/build-module/utils/clone-deep.js.map +1 -0
  154. package/build-style/style-rtl.css +46 -209
  155. package/build-style/style.css +46 -209
  156. package/package.json +43 -42
  157. package/src/components/add-new-pattern/index.js +27 -11
  158. package/src/components/block-editor/use-site-editor-settings.js +1 -0
  159. package/src/components/code-editor/index.js +3 -2
  160. package/src/components/editor/index.js +11 -7
  161. package/src/components/editor-canvas-container/index.js +2 -5
  162. package/src/components/{test → error-boundary/test}/error-boundary.js +7 -5
  163. package/src/components/global-styles/block-preview-panel.js +2 -2
  164. package/src/components/global-styles/font-library-modal/collection-font-details.js +1 -1
  165. package/src/components/global-styles/font-library-modal/font-collection.js +118 -13
  166. package/src/components/global-styles/font-library-modal/google-fonts-confirm-dialog.js +1 -1
  167. package/src/components/global-styles/font-library-modal/installed-fonts.js +25 -23
  168. package/src/components/global-styles/font-library-modal/style.scss +2 -5
  169. package/src/components/global-styles/screen-revisions/style.scss +2 -2
  170. package/src/components/global-styles/style.scss +1 -1
  171. package/src/components/header-edit-mode/document-tools/index.js +1 -2
  172. package/src/components/header-edit-mode/index.js +1 -1
  173. package/src/components/header-edit-mode/more-menu/index.js +8 -3
  174. package/src/components/keyboard-shortcuts/edit-mode.js +0 -11
  175. package/src/components/keyboard-shortcuts/register.js +0 -19
  176. package/src/components/layout/index.js +47 -32
  177. package/src/components/layout/router.js +31 -2
  178. package/src/components/layout/style.scss +7 -0
  179. package/src/components/page-patterns/dataviews-pattern-actions.js +41 -10
  180. package/src/components/page-patterns/header.js +1 -0
  181. package/src/components/page-patterns/index.js +0 -1
  182. package/src/components/page-patterns/style.scss +8 -180
  183. package/src/components/page-patterns/use-patterns.js +13 -5
  184. package/src/components/page-templates-template-parts/index.js +1 -0
  185. package/src/components/page-templates-template-parts/style.scss +6 -0
  186. package/src/components/save-button/index.js +2 -1
  187. package/src/components/save-hub/style.scss +1 -1
  188. package/src/components/sidebar/index.js +8 -3
  189. package/src/components/sidebar-button/style.scss +1 -1
  190. package/src/components/sidebar-edit-mode/global-styles-sidebar.js +5 -7
  191. package/src/components/sidebar-edit-mode/style.scss +4 -0
  192. package/src/components/sidebar-edit-mode/template-panel/hooks.js +37 -24
  193. package/src/components/sidebar-edit-mode/template-panel/index.js +76 -18
  194. package/src/components/sidebar-edit-mode/template-panel/style.scss +5 -14
  195. package/src/components/sidebar-edit-mode/template-panel/template-actions.js +1 -12
  196. package/src/components/sidebar-navigation-screen-global-styles/index.js +4 -1
  197. package/src/components/sidebar-navigation-screen-pages/index.js +10 -6
  198. package/src/components/style-book/index.js +5 -1
  199. package/src/hooks/commands/use-edit-mode-commands.js +3 -184
  200. package/src/hooks/index.js +0 -1
  201. package/src/hooks/push-changes-to-global-styles/index.js +1 -4
  202. package/src/hooks/use-theme-style-variations/test/use-theme-style-variations-by-property.js +964 -0
  203. package/src/hooks/use-theme-style-variations/use-theme-style-variations-by-property.js +92 -0
  204. package/src/store/actions.js +21 -85
  205. package/src/store/private-actions.js +4 -0
  206. package/src/store/test/actions.js +0 -75
  207. package/src/style.scss +1 -6
  208. package/src/utils/clone-deep.js +8 -0
  209. package/build/components/global-styles/font-library-modal/fonts-grid.js +0 -57
  210. package/build/components/global-styles/font-library-modal/fonts-grid.js.map +0 -1
  211. package/build/components/header-edit-mode/mode-switcher/index.js +0 -62
  212. package/build/components/header-edit-mode/mode-switcher/index.js.map +0 -1
  213. package/build/components/page-patterns/duplicate-menu-item.js +0 -93
  214. package/build/components/page-patterns/duplicate-menu-item.js.map +0 -1
  215. package/build/components/page-patterns/grid-item.js +0 -223
  216. package/build/components/page-patterns/grid-item.js.map +0 -1
  217. package/build/components/page-patterns/grid.js +0 -31
  218. package/build/components/page-patterns/grid.js.map +0 -1
  219. package/build/components/page-patterns/no-patterns.js +0 -18
  220. package/build/components/page-patterns/no-patterns.js.map +0 -1
  221. package/build/components/page-patterns/patterns-list.js +0 -168
  222. package/build/components/page-patterns/patterns-list.js.map +0 -1
  223. package/build/components/page-patterns/rename-menu-item.js +0 -105
  224. package/build/components/page-patterns/rename-menu-item.js.map +0 -1
  225. package/build/components/sidebar-edit-mode/template-panel/replace-template-button.js +0 -83
  226. package/build/components/sidebar-edit-mode/template-panel/replace-template-button.js.map +0 -1
  227. package/build/hooks/navigation-menu-edit.js +0 -82
  228. package/build/hooks/navigation-menu-edit.js.map +0 -1
  229. package/build-module/components/global-styles/font-library-modal/fonts-grid.js +0 -50
  230. package/build-module/components/global-styles/font-library-modal/fonts-grid.js.map +0 -1
  231. package/build-module/components/header-edit-mode/mode-switcher/index.js +0 -56
  232. package/build-module/components/header-edit-mode/mode-switcher/index.js.map +0 -1
  233. package/build-module/components/page-patterns/duplicate-menu-item.js +0 -85
  234. package/build-module/components/page-patterns/duplicate-menu-item.js.map +0 -1
  235. package/build-module/components/page-patterns/grid-item.js +0 -215
  236. package/build-module/components/page-patterns/grid-item.js.map +0 -1
  237. package/build-module/components/page-patterns/grid.js +0 -23
  238. package/build-module/components/page-patterns/grid.js.map +0 -1
  239. package/build-module/components/page-patterns/no-patterns.js +0 -11
  240. package/build-module/components/page-patterns/no-patterns.js.map +0 -1
  241. package/build-module/components/page-patterns/patterns-list.js +0 -160
  242. package/build-module/components/page-patterns/patterns-list.js.map +0 -1
  243. package/build-module/components/page-patterns/rename-menu-item.js +0 -98
  244. package/build-module/components/page-patterns/rename-menu-item.js.map +0 -1
  245. package/build-module/components/sidebar-edit-mode/template-panel/replace-template-button.js +0 -76
  246. package/build-module/components/sidebar-edit-mode/template-panel/replace-template-button.js.map +0 -1
  247. package/build-module/hooks/navigation-menu-edit.js +0 -75
  248. package/build-module/hooks/navigation-menu-edit.js.map +0 -1
  249. package/src/components/global-styles/font-library-modal/fonts-grid.js +0 -59
  250. package/src/components/header-edit-mode/mode-switcher/index.js +0 -60
  251. package/src/components/page-patterns/duplicate-menu-item.js +0 -105
  252. package/src/components/page-patterns/grid-item.js +0 -331
  253. package/src/components/page-patterns/grid.js +0 -22
  254. package/src/components/page-patterns/no-patterns.js +0 -12
  255. package/src/components/page-patterns/patterns-list.js +0 -229
  256. package/src/components/page-patterns/rename-menu-item.js +0 -132
  257. package/src/components/sidebar-edit-mode/template-panel/replace-template-button.js +0 -89
  258. package/src/hooks/navigation-menu-edit.js +0 -92
@@ -23,13 +23,21 @@ const { useLocation } = unlock( routerPrivateApis );
23
23
  export default function useLayoutAreas() {
24
24
  const isSiteEditorLoading = useIsSiteEditorLoading();
25
25
  const { params } = useLocation();
26
- const { postType, postId, path, layout, isCustom } = params ?? {};
26
+ const { postType, postId, path, layout, isCustom, canvas } = params ?? {};
27
+
28
+ // Note: Since "sidebar" is not yet supported here,
29
+ // returning undefined from "mobile" means show the sidebar.
30
+
27
31
  // Regular page
28
32
  if ( path === '/page' ) {
29
33
  return {
30
34
  areas: {
31
35
  content: undefined,
32
36
  preview: <Editor isLoading={ isSiteEditorLoading } />,
37
+ mobile:
38
+ canvas === 'edit' ? (
39
+ <Editor isLoading={ isSiteEditorLoading } />
40
+ ) : undefined,
33
41
  },
34
42
  widths: {
35
43
  content: undefined,
@@ -63,6 +71,10 @@ export default function useLayoutAreas() {
63
71
  return {
64
72
  areas: {
65
73
  preview: <Editor isLoading={ isSiteEditorLoading } />,
74
+ mobile:
75
+ canvas === 'edit' ? (
76
+ <Editor isLoading={ isSiteEditorLoading } />
77
+ ) : undefined,
66
78
  },
67
79
  };
68
80
  }
@@ -79,6 +91,11 @@ export default function useLayoutAreas() {
79
91
  preview: isListLayout && (
80
92
  <Editor isLoading={ isSiteEditorLoading } />
81
93
  ),
94
+ mobile: (
95
+ <PageTemplatesTemplateParts
96
+ postType={ TEMPLATE_POST_TYPE }
97
+ />
98
+ ),
82
99
  },
83
100
  widths: {
84
101
  content: isListLayout ? 380 : undefined,
@@ -98,6 +115,11 @@ export default function useLayoutAreas() {
98
115
  preview: isListLayout && (
99
116
  <Editor isLoading={ isSiteEditorLoading } />
100
117
  ),
118
+ mobile: (
119
+ <PageTemplatesTemplateParts
120
+ postType={ TEMPLATE_PART_POST_TYPE }
121
+ />
122
+ ),
101
123
  },
102
124
  widths: {
103
125
  content: isListLayout ? 380 : undefined,
@@ -110,12 +132,19 @@ export default function useLayoutAreas() {
110
132
  return {
111
133
  areas: {
112
134
  content: <PagePatterns />,
135
+ mobile: <PagePatterns />,
113
136
  },
114
137
  };
115
138
  }
116
139
 
117
140
  // Fallback shows the home page preview
118
141
  return {
119
- areas: { preview: <Editor isLoading={ isSiteEditorLoading } /> },
142
+ areas: {
143
+ preview: <Editor isLoading={ isSiteEditorLoading } />,
144
+ mobile:
145
+ canvas === 'edit' ? (
146
+ <Editor isLoading={ isSiteEditorLoading } />
147
+ ) : undefined,
148
+ },
120
149
  };
121
150
  }
@@ -83,6 +83,12 @@
83
83
  flex-direction: column;
84
84
  }
85
85
 
86
+ .edit-site-layout__mobile {
87
+ position: relative;
88
+ width: 100%;
89
+ z-index: z-index(".edit-site-layout__canvas-container");
90
+ }
91
+
86
92
  .edit-site-layout__canvas-container {
87
93
  position: relative;
88
94
  flex-grow: 1;
@@ -147,6 +153,7 @@
147
153
  }
148
154
 
149
155
  // This shouldn't be necessary (we should have a way to say that a skeletton is relative
156
+ .edit-site-layout__mobile .interface-interface-skeleton,
150
157
  .edit-site-layout__canvas .interface-interface-skeleton,
151
158
  .edit-site-template-pages-preview .interface-interface-skeleton {
152
159
  position: relative !important;
@@ -2,6 +2,7 @@
2
2
  * External dependencies
3
3
  */
4
4
  import { paramCase as kebabCase } from 'change-case';
5
+ import { downloadZip } from 'client-zip';
5
6
 
6
7
  /**
7
8
  * WordPress dependencies
@@ -41,21 +42,51 @@ const { useHistory } = unlock( routerPrivateApis );
41
42
  const { CreatePatternModalContents, useDuplicatePatternProps } =
42
43
  unlock( patternsPrivateApis );
43
44
 
44
- export const exportJSONaction = {
45
- id: 'export-pattern',
46
- label: __( 'Export as JSON' ),
47
- isEligible: ( item ) => item.type === PATTERN_TYPES.user,
48
- callback: ( [ item ] ) => {
49
- const json = {
45
+ function getJsonFromItem( item ) {
46
+ return JSON.stringify(
47
+ {
50
48
  __file: item.type,
51
49
  title: item.title || item.name,
52
50
  content: item.patternPost.content.raw,
53
51
  syncStatus: item.patternPost.wp_pattern_sync_status,
54
- };
52
+ },
53
+ null,
54
+ 2
55
+ );
56
+ }
57
+
58
+ export const exportJSONaction = {
59
+ id: 'export-pattern',
60
+ label: __( 'Export as JSON' ),
61
+ supportsBulk: true,
62
+ isEligible: ( item ) => item.type === PATTERN_TYPES.user,
63
+ callback: async ( items ) => {
64
+ if ( items.length === 1 ) {
65
+ return downloadBlob(
66
+ `${ kebabCase( items[ 0 ].title || items[ 0 ].name ) }.json`,
67
+ getJsonFromItem( items[ 0 ] ),
68
+ 'application/json'
69
+ );
70
+ }
71
+ const nameCount = {};
72
+ const filesToZip = items.map( ( item ) => {
73
+ const name = kebabCase( item.title || item.name );
74
+ nameCount[ name ] = ( nameCount[ name ] || 0 ) + 1;
75
+ return {
76
+ name: `${
77
+ name +
78
+ ( nameCount[ name ] > 1
79
+ ? '-' + ( nameCount[ name ] - 1 )
80
+ : '' )
81
+ }.json`,
82
+ lastModified: new Date(),
83
+ input: getJsonFromItem( item ),
84
+ };
85
+ } );
55
86
  return downloadBlob(
56
- `${ kebabCase( item.title || item.name ) }.json`,
57
- JSON.stringify( json, null, 2 ),
58
- 'application/json'
87
+ __( 'patterns-export' ) + '.zip',
88
+ await downloadZip( filesToZip ).blob(),
89
+ 'application/zip'
59
90
  );
60
91
  },
61
92
  };
@@ -69,6 +69,7 @@ export default function PatternsHeader( {
69
69
  __( 'Action menu for %s pattern category' ),
70
70
  title
71
71
  ),
72
+ size: 'compact',
72
73
  } }
73
74
  >
74
75
  { ( { onClose } ) => (
@@ -391,7 +391,6 @@ export default function DataviewsPatterns() {
391
391
  // Wrap everything in a block editor provider.
392
392
  // This ensures 'styles' that are needed for the previews are synced
393
393
  // from the site editor store to the block editor store.
394
- // TODO: check if I add the provider in every preview like in templates...
395
394
  return (
396
395
  <ExperimentalBlockEditorProvider settings={ settings }>
397
396
  <Page
@@ -1,70 +1,3 @@
1
- .edit-site-patterns {
2
- background: #1e1e1e;
3
- border-left: 1px solid $gray-800;
4
- margin: $header-height 0 0;
5
- border-radius: 0;
6
- padding: 0;
7
- overflow-x: auto;
8
- min-height: 100%;
9
-
10
- .components-base-control {
11
- width: 100%;
12
- @include break-medium {
13
- width: auto;
14
- }
15
- }
16
-
17
- .components-text {
18
- color: $gray-600;
19
- }
20
-
21
- .components-heading {
22
- color: $gray-200;
23
- }
24
-
25
- @include break-medium {
26
- margin: 0;
27
- }
28
-
29
- .edit-site-patterns__search-block {
30
- min-width: fit-content;
31
- flex-grow: 1;
32
- }
33
-
34
- // TODO: Consider using the Theme component to automatically adapt to a dark background.
35
- .edit-site-patterns__search {
36
- --wp-components-color-foreground: #{$gray-200};
37
-
38
- .components-input-control__container {
39
- background: $gray-800;
40
- }
41
-
42
- svg {
43
- fill: $gray-600;
44
- }
45
- }
46
-
47
- .edit-site-patterns__sync-status-filter {
48
- background: $gray-800;
49
- border: none;
50
- height: $button-size-next-default-40px;
51
- min-width: max-content;
52
- width: 100%;
53
- max-width: 100%;
54
-
55
- @include break-medium {
56
- width: 300px;
57
- }
58
- }
59
- .edit-site-patterns__sync-status-filter-option:not([aria-checked="true"]) {
60
- color: $gray-600;
61
- }
62
- .edit-site-patterns__sync-status-filter-option:active {
63
- background: $gray-700;
64
- color: $gray-100;
65
- }
66
- }
67
-
68
1
  .edit-site-patterns__header {
69
2
  position: sticky;
70
3
  top: 0;
@@ -77,97 +10,13 @@
77
10
  }
78
11
  }
79
12
 
80
- .edit-site-patterns__section {
81
- padding: $grid-unit-30 $grid-unit-40;
82
- flex: 1;
83
- }
84
-
85
13
  .edit-site-patterns__section-header {
86
14
  .screen-reader-shortcut:focus {
87
15
  top: 0;
88
16
  }
89
17
  }
90
18
 
91
- .edit-site-patterns__grid {
92
- display: grid;
93
- grid-template-columns: 1fr;
94
- gap: $grid-unit-40;
95
- margin-top: 0;
96
- margin-bottom: 0;
97
- @include break-large {
98
- grid-template-columns: 1fr 1fr;
99
- }
100
- @include break-huge {
101
- grid-template-columns: 1fr 1fr 1fr;
102
- }
103
- @include break-xhuge {
104
- grid-template-columns: 1fr 1fr 1fr 1fr;
105
- }
106
- .edit-site-patterns__pattern {
107
- break-inside: avoid-column;
108
- display: flex;
109
- flex-direction: column;
110
- .edit-site-patterns__preview {
111
- box-shadow: none;
112
- border: none;
113
- padding: 0;
114
- background-color: unset;
115
- box-sizing: border-box;
116
- border-radius: 4px;
117
- cursor: pointer;
118
- overflow: hidden;
119
-
120
- &:focus {
121
- box-shadow: inset 0 0 0 0 $white, 0 0 0 2px var(--wp-admin-theme-color);
122
- // Windows High Contrast mode will show this outline, but not the box-shadow.
123
- outline: 2px solid transparent;
124
- }
125
-
126
- &.is-inactive {
127
- cursor: default;
128
- }
129
- &.is-inactive:focus {
130
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) $gray-800;
131
- opacity: 0.8;
132
- }
133
- }
134
-
135
- .edit-site-patterns__footer,
136
- .edit-site-patterns__button {
137
- color: $gray-600;
138
- }
139
-
140
- .edit-site-patterns__dropdown {
141
- flex-shrink: 0;
142
- }
143
-
144
- &.is-placeholder .edit-site-patterns__preview {
145
- min-height: $grid-unit-80;
146
- color: $gray-600;
147
- border: 1px dashed $gray-800;
148
- display: flex;
149
- align-items: center;
150
- justify-content: center;
151
-
152
- &:focus {
153
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
154
- }
155
- }
156
- }
157
-
158
- .edit-site-patterns__preview {
159
- flex: 0 1 auto;
160
- margin-bottom: $grid-unit-15;
161
- }
162
- }
163
-
164
- .edit-site-patterns__load-more {
165
- align-self: center;
166
- }
167
-
168
19
  .edit-site-patterns__pattern-title {
169
- color: $gray-200;
170
-
171
20
  .is-link {
172
21
  text-decoration: none;
173
22
  color: $gray-200;
@@ -189,42 +38,17 @@
189
38
  }
190
39
  }
191
40
 
192
- .edit-site-patterns__no-results {
193
- color: $gray-600;
194
- }
195
-
196
41
  .edit-site-patterns__delete-modal {
197
42
  width: $modal-width-small;
198
43
  }
199
44
 
200
- .edit-site-patterns__pagination {
201
- padding: $grid-unit-30 $grid-unit-40;
202
- border-top: 1px solid $gray-800;
203
- background: $gray-900;
204
- position: sticky;
205
- bottom: 0;
206
- color: $gray-100;
207
- z-index: z-index(".edit-site-patterns__grid-pagination");
208
- .components-button.is-tertiary {
209
- background-color: $gray-800;
210
- color: $gray-100;
211
-
212
- &:disabled {
213
- color: $gray-600;
214
- background: none;
215
- }
45
+ .edit-site-page-patterns-dataviews {
46
+ margin-top: 60px;
216
47
 
217
- &:hover:not(:disabled) {
218
- background-color: $gray-700;
219
- }
48
+ @include break-medium {
49
+ margin-top: 0;
220
50
  }
221
- }
222
51
 
223
- /**
224
- * DataViews patterns styles.
225
- * TODO: when this becomes stable, consolidate styles with the above.
226
- */
227
- .edit-site-page-patterns-dataviews {
228
52
  .page-patterns-preview-field {
229
53
  display: flex;
230
54
  flex-direction: column;
@@ -283,6 +107,10 @@
283
107
  text-overflow: ellipsis;
284
108
  color: inherit;
285
109
  }
110
+
111
+ .dataviews-pagination {
112
+ z-index: z-index(".edit-site-patterns__dataviews-list-pagination");
113
+ }
286
114
  }
287
115
 
288
116
  .dataviews-action-modal__duplicate-pattern {
@@ -111,6 +111,7 @@ const selectTemplatePartsAsPatterns = createSelector(
111
111
  const selectThemePatterns = createSelector(
112
112
  ( select ) => {
113
113
  const { getSettings } = unlock( select( editSiteStore ) );
114
+ const { getIsResolving } = select( coreStore );
114
115
  const settings = getSettings();
115
116
  const blockPatterns =
116
117
  settings.__experimentalAdditionalBlockPatterns ??
@@ -136,19 +137,23 @@ const selectThemePatterns = createSelector(
136
137
  __unstableSkipMigrationLogs: true,
137
138
  } ),
138
139
  } ) );
139
-
140
- return { patterns, isResolving: false };
140
+ return { patterns, isResolving: getIsResolving( 'getBlockPatterns' ) };
141
141
  },
142
142
  ( select ) => [
143
143
  select( coreStore ).getBlockPatterns(),
144
+ select( coreStore ).getIsResolving( 'getBlockPatterns' ),
144
145
  unlock( select( editSiteStore ) ).getSettings(),
145
146
  ]
146
147
  );
147
148
 
148
149
  const selectPatterns = createSelector(
149
150
  ( select, categoryId, syncStatus, search = '' ) => {
150
- const { patterns: themePatterns } = selectThemePatterns( select );
151
- const { patterns: userPatterns } = selectUserPatterns( select );
151
+ const {
152
+ patterns: themePatterns,
153
+ isResolving: isResolvingThemePatterns,
154
+ } = selectThemePatterns( select );
155
+ const { patterns: userPatterns, isResolving: isResolvingUserPatterns } =
156
+ selectUserPatterns( select );
152
157
 
153
158
  let patterns = [
154
159
  ...( themePatterns || [] ),
@@ -176,7 +181,10 @@ const selectPatterns = createSelector(
176
181
  hasCategory: ( item ) => ! item.hasOwnProperty( 'categories' ),
177
182
  } );
178
183
  }
179
- return { patterns, isResolving: false };
184
+ return {
185
+ patterns,
186
+ isResolving: isResolvingThemePatterns || isResolvingUserPatterns,
187
+ };
180
188
  },
181
189
  ( select ) => [
182
190
  selectThemePatterns( select ),
@@ -429,6 +429,7 @@ export default function PageTemplatesTemplateParts( { postType } ) {
429
429
 
430
430
  return (
431
431
  <Page
432
+ className="edit-site-page-template-template-parts-dataviews"
432
433
  title={
433
434
  postType === TEMPLATE_POST_TYPE
434
435
  ? __( 'Templates' )
@@ -58,3 +58,9 @@
58
58
  .page-templates-description {
59
59
  white-space: normal;
60
60
  }
61
+
62
+ .edit-site-page-template-template-parts-dataviews {
63
+ .dataviews-pagination {
64
+ z-index: z-index(".edit-site-templates__dataviews-list-pagination");
65
+ }
66
+ }
@@ -22,6 +22,7 @@ export default function SaveButton( {
22
22
  showTooltip = true,
23
23
  defaultLabel,
24
24
  icon,
25
+ size,
25
26
  __next40pxDefaultSize = false,
26
27
  } ) {
27
28
  const { isDirty, isSaving, isSaveViewOpen, previewingThemeName } =
@@ -119,7 +120,7 @@ export default function SaveButton( {
119
120
  showTooltip={ showTooltip }
120
121
  icon={ icon }
121
122
  __next40pxDefaultSize={ __next40pxDefaultSize }
122
- size="compact"
123
+ size={ size }
123
124
  >
124
125
  { label }
125
126
  </Button>
@@ -3,7 +3,7 @@
3
3
  border-top: 1px solid $gray-800;
4
4
  flex-shrink: 0;
5
5
  margin: 0;
6
- padding: $grid-unit-20 + $grid-unit-05 $canvas-padding;
6
+ padding: $grid-unit-20 $canvas-padding;
7
7
  }
8
8
 
9
9
  .edit-site-save-hub__button {
@@ -12,6 +12,7 @@ import {
12
12
  __experimentalNavigatorScreen as NavigatorScreen,
13
13
  } from '@wordpress/components';
14
14
  import { privateApis as routerPrivateApis } from '@wordpress/router';
15
+ import { useViewportMatch } from '@wordpress/compose';
15
16
  import { __ } from '@wordpress/i18n';
16
17
 
17
18
  /**
@@ -52,6 +53,7 @@ function SidebarScreenWrapper( { className, ...props } ) {
52
53
 
53
54
  function SidebarScreens() {
54
55
  useSyncPathWithURL();
56
+ const isMobileViewport = useViewportMatch( 'medium', '<' );
55
57
 
56
58
  return (
57
59
  <>
@@ -74,6 +76,7 @@ function SidebarScreens() {
74
76
  <SidebarNavigationScreen
75
77
  title={ __( 'Pages' ) }
76
78
  content={ <DataViewsSidebarContent /> }
79
+ backPath="/page"
77
80
  />
78
81
  </SidebarScreenWrapper>
79
82
  <SidebarScreenWrapper path="/page/:postId">
@@ -82,9 +85,11 @@ function SidebarScreens() {
82
85
  <SidebarScreenWrapper path="/:postType(wp_template)">
83
86
  <SidebarNavigationScreenTemplates />
84
87
  </SidebarScreenWrapper>
85
- <SidebarScreenWrapper path="/patterns">
86
- <SidebarNavigationScreenPatterns />
87
- </SidebarScreenWrapper>
88
+ { ! isMobileViewport && (
89
+ <SidebarScreenWrapper path="/patterns">
90
+ <SidebarNavigationScreenPatterns />
91
+ </SidebarScreenWrapper>
92
+ ) }
88
93
  <SidebarScreenWrapper path="/:postType(wp_template|wp_template_part)/all">
89
94
  <SidebarNavigationScreenTemplatesBrowse />
90
95
  </SidebarScreenWrapper>
@@ -10,7 +10,7 @@
10
10
  &:focus-visible:not(:disabled) {
11
11
  box-shadow:
12
12
  0 0 0 var(--wp-admin-border-width-focus)
13
- var(--wp-components-color-accent, var(--wp-admin-theme-color, #007cba));
13
+ var(--wp-admin-theme-color);
14
14
  outline: 3px solid transparent;
15
15
  }
16
16
 
@@ -41,7 +41,7 @@ export default function GlobalStylesSidebar() {
41
41
  );
42
42
  const canvasContainerView = getEditorCanvasContainerView();
43
43
  const _isVisualEditorMode =
44
- 'visual' === select( editSiteStore ).getEditorMode();
44
+ 'visual' === select( editorStore ).getEditorMode();
45
45
  const _isEditCanvasMode = 'edit' === getCanvasMode();
46
46
  const _showListViewByDefault = select( preferencesStore ).get(
47
47
  'core',
@@ -132,13 +132,11 @@ export default function GlobalStylesSidebar() {
132
132
  closeLabel={ __( 'Close Styles' ) }
133
133
  panelClassName="edit-site-global-styles-sidebar__panel"
134
134
  header={
135
- <Flex
136
- className="edit-site-global-styles-sidebar__header"
137
- role="menubar"
138
- aria-label={ __( 'Styles actions' ) }
139
- >
135
+ <Flex className="edit-site-global-styles-sidebar__header">
140
136
  <FlexBlock style={ { minWidth: 'min-content' } }>
141
- <strong>{ __( 'Styles' ) }</strong>
137
+ <h2 className="edit-site-global-styles-sidebar__header-title">
138
+ { __( 'Styles' ) }
139
+ </h2>
142
140
  </FlexBlock>
143
141
  <FlexItem>
144
142
  <Button
@@ -34,6 +34,10 @@
34
34
  }
35
35
  }
36
36
 
37
+ .edit-site-global-styles-sidebar .edit-site-global-styles-sidebar__header-title {
38
+ margin: 0;
39
+ }
40
+
37
41
  .edit-site-global-styles-sidebar .interface-complementary-area-header .components-button.has-icon {
38
42
  margin-left: 0;
39
43
  }
@@ -36,7 +36,14 @@ function injectThemeAttributeInBlockTemplateContent(
36
36
  return block;
37
37
  }
38
38
 
39
- function preparePatterns( patterns, template, currentThemeStylesheet ) {
39
+ /**
40
+ * Filter all patterns and return only the ones that are compatible with the current template.
41
+ *
42
+ * @param {Array} patterns An array of patterns.
43
+ * @param {Object} template The current template.
44
+ * @return {Array} Array of patterns that are compatible with the current template.
45
+ */
46
+ function filterPatterns( patterns, template ) {
40
47
  // Filter out duplicates.
41
48
  const filterOutDuplicatesByName = ( currentItem, index, items ) =>
42
49
  index === items.findIndex( ( item ) => currentItem.name === item.name );
@@ -45,30 +52,35 @@ function preparePatterns( patterns, template, currentThemeStylesheet ) {
45
52
  const filterOutExcludedPatternSources = ( pattern ) =>
46
53
  ! EXCLUDED_PATTERN_SOURCES.includes( pattern.source );
47
54
 
48
- // Filter only the patterns that are compatible with the current template.
55
+ // Looks for patterns that have the same template type as the current template,
56
+ // or have a block type that matches the current template area.
49
57
  const filterCompatiblePatterns = ( pattern ) =>
50
- pattern.templateTypes?.includes( template.slug );
58
+ pattern.templateTypes?.includes( template.slug ) ||
59
+ pattern.blockTypes?.includes( 'core/template-part/' + template.area );
60
+
61
+ return patterns.filter( ( pattern, index, items ) => {
62
+ return (
63
+ filterOutDuplicatesByName( pattern, index, items ) &&
64
+ filterOutExcludedPatternSources( pattern ) &&
65
+ filterCompatiblePatterns( pattern )
66
+ );
67
+ } );
68
+ }
51
69
 
52
- return patterns
53
- .filter(
54
- ( pattern, index, items ) =>
55
- filterOutExcludedPatternSources( pattern ) &&
56
- filterOutDuplicatesByName( pattern, index, items ) &&
57
- filterCompatiblePatterns( pattern )
58
- )
59
- .map( ( pattern ) => ( {
60
- ...pattern,
61
- keywords: pattern.keywords || [],
62
- type: PATTERN_TYPES.theme,
63
- blocks: parse( pattern.content, {
64
- __unstableSkipMigrationLogs: true,
65
- } ).map( ( block ) =>
66
- injectThemeAttributeInBlockTemplateContent(
67
- block,
68
- currentThemeStylesheet
69
- )
70
- ),
71
- } ) );
70
+ function preparePatterns( patterns, template, currentThemeStylesheet ) {
71
+ return patterns.map( ( pattern ) => ( {
72
+ ...pattern,
73
+ keywords: pattern.keywords || [],
74
+ type: PATTERN_TYPES.theme,
75
+ blocks: parse( pattern.content, {
76
+ __unstableSkipMigrationLogs: true,
77
+ } ).map( ( block ) =>
78
+ injectThemeAttributeInBlockTemplateContent(
79
+ block,
80
+ currentThemeStylesheet
81
+ )
82
+ ),
83
+ } ) );
72
84
  }
73
85
 
74
86
  export function useAvailablePatterns( template ) {
@@ -92,8 +104,9 @@ export function useAvailablePatterns( template ) {
92
104
  ...( blockPatterns || [] ),
93
105
  ...( restBlockPatterns || [] ),
94
106
  ];
107
+ const filteredPatterns = filterPatterns( mergedPatterns, template );
95
108
  return preparePatterns(
96
- mergedPatterns,
109
+ filteredPatterns,
97
110
  template,
98
111
  currentThemeStylesheet
99
112
  );