@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
@@ -1,59 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import {
5
- __experimentalVStack as VStack,
6
- __experimentalText as Text,
7
- __experimentalSpacer as Spacer,
8
- } from '@wordpress/components';
9
- import { useState, useEffect } from '@wordpress/element';
10
-
11
- function FontsGrid( { title, children, pageSize = 32 } ) {
12
- const [ lastItem, setLastItem ] = useState( null );
13
- const [ page, setPage ] = useState( 1 );
14
- const itemsLimit = page * pageSize;
15
- const items = children.slice( 0, itemsLimit );
16
-
17
- useEffect( () => {
18
- if ( lastItem ) {
19
- const observer = new window.IntersectionObserver( ( [ entry ] ) => {
20
- if ( entry.isIntersecting ) {
21
- setPage( ( prevPage ) => prevPage + 1 );
22
- }
23
- } );
24
-
25
- observer.observe( lastItem );
26
-
27
- return () => observer.disconnect();
28
- }
29
- }, [ lastItem ] );
30
-
31
- return (
32
- <div className="font-library-modal__fonts-grid">
33
- <VStack spacing={ 0 }>
34
- { title && (
35
- <>
36
- <Text className="font-library-modal__subtitle">
37
- { title }
38
- </Text>
39
- <Spacer margin={ 2 } />
40
- </>
41
- ) }
42
- <div className="font-library-modal__fonts-grid__main">
43
- { items.map( ( child, i ) => {
44
- if ( i === itemsLimit - 1 ) {
45
- return (
46
- <div key={ child.key } ref={ setLastItem }>
47
- { child }
48
- </div>
49
- );
50
- }
51
- return <div key={ child.key }>{ child }</div>;
52
- } ) }
53
- </div>
54
- </VStack>
55
- </div>
56
- );
57
- }
58
-
59
- export default FontsGrid;
@@ -1,60 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { MenuItemsChoice, MenuGroup } from '@wordpress/components';
6
- import { useSelect, useDispatch } from '@wordpress/data';
7
- import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import { store as editSiteStore } from '../../../store';
13
-
14
- /**
15
- * Set of available mode options.
16
- *
17
- * @type {Array}
18
- */
19
- const MODES = [
20
- {
21
- value: 'visual',
22
- label: __( 'Visual editor' ),
23
- },
24
- {
25
- value: 'text',
26
- label: __( 'Code editor' ),
27
- },
28
- ];
29
-
30
- function ModeSwitcher() {
31
- const { shortcut, mode } = useSelect(
32
- ( select ) => ( {
33
- shortcut: select(
34
- keyboardShortcutsStore
35
- ).getShortcutRepresentation( 'core/edit-site/toggle-mode' ),
36
- mode: select( editSiteStore ).getEditorMode(),
37
- } ),
38
- []
39
- );
40
- const { switchEditorMode } = useDispatch( editSiteStore );
41
-
42
- const choices = MODES.map( ( choice ) => {
43
- if ( choice.value !== mode ) {
44
- return { ...choice, shortcut };
45
- }
46
- return choice;
47
- } );
48
-
49
- return (
50
- <MenuGroup label={ __( 'Editor' ) }>
51
- <MenuItemsChoice
52
- choices={ choices }
53
- value={ mode }
54
- onSelect={ switchEditorMode }
55
- />
56
- </MenuGroup>
57
- );
58
- }
59
-
60
- export default ModeSwitcher;
@@ -1,105 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { MenuItem } from '@wordpress/components';
5
- import { useDispatch } from '@wordpress/data';
6
- import { useState } from '@wordpress/element';
7
- import { __, sprintf } from '@wordpress/i18n';
8
- import { store as noticesStore } from '@wordpress/notices';
9
- import { privateApis as patternsPrivateApis } from '@wordpress/patterns';
10
- import { privateApis as routerPrivateApis } from '@wordpress/router';
11
-
12
- /**
13
- * Internal dependencies
14
- */
15
- import { TEMPLATE_PART_POST_TYPE, PATTERN_TYPES } from '../../utils/constants';
16
- import { unlock } from '../../lock-unlock';
17
- import CreateTemplatePartModal from '../create-template-part-modal';
18
-
19
- const { DuplicatePatternModal } = unlock( patternsPrivateApis );
20
- const { useHistory } = unlock( routerPrivateApis );
21
-
22
- export default function DuplicateMenuItem( {
23
- categoryId,
24
- item,
25
- label = __( 'Duplicate' ),
26
- onClose,
27
- } ) {
28
- const { createSuccessNotice } = useDispatch( noticesStore );
29
- const [ isModalOpen, setIsModalOpen ] = useState( false );
30
- const history = useHistory();
31
-
32
- const closeModal = () => setIsModalOpen( false );
33
-
34
- const isTemplatePart = item.type === TEMPLATE_PART_POST_TYPE;
35
- const isThemePattern = item.type === PATTERN_TYPES.theme;
36
-
37
- async function onTemplatePartSuccess( templatePart ) {
38
- createSuccessNotice(
39
- sprintf(
40
- // translators: %s: The new template part's title e.g. 'Call to action (copy)'.
41
- __( '"%s" duplicated.' ),
42
- item.title
43
- ),
44
- {
45
- type: 'snackbar',
46
- id: 'edit-site-patterns-success',
47
- }
48
- );
49
-
50
- history.push( {
51
- postType: TEMPLATE_PART_POST_TYPE,
52
- postId: templatePart?.id,
53
- categoryType: TEMPLATE_PART_POST_TYPE,
54
- categoryId,
55
- } );
56
-
57
- onClose();
58
- }
59
-
60
- function onPatternSuccess( { pattern } ) {
61
- history.push( {
62
- categoryType: PATTERN_TYPES.theme,
63
- categoryId,
64
- postType: PATTERN_TYPES.user,
65
- postId: pattern.id,
66
- } );
67
-
68
- onClose();
69
- }
70
-
71
- return (
72
- <>
73
- <MenuItem
74
- onClick={ () => setIsModalOpen( true ) }
75
- aria-expanded={ isModalOpen }
76
- aria-haspopup="dialog"
77
- >
78
- { label }
79
- </MenuItem>
80
- { isModalOpen && ! isTemplatePart && (
81
- <DuplicatePatternModal
82
- onClose={ closeModal }
83
- onSuccess={ onPatternSuccess }
84
- pattern={ isThemePattern ? item : item.patternPost }
85
- />
86
- ) }
87
- { isModalOpen && isTemplatePart && (
88
- <CreateTemplatePartModal
89
- blocks={ item.blocks }
90
- closeModal={ closeModal }
91
- confirmLabel={ __( 'Duplicate' ) }
92
- defaultArea={ item.templatePart.area }
93
- defaultTitle={ sprintf(
94
- /* translators: %s: Existing template part title */
95
- __( '%s (Copy)' ),
96
- item.title
97
- ) }
98
- modalTitle={ __( 'Duplicate template part' ) }
99
- onCreate={ onTemplatePartSuccess }
100
- onError={ closeModal }
101
- />
102
- ) }
103
- </>
104
- );
105
- }
@@ -1,331 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classnames from 'classnames';
5
- import { paramCase as kebabCase } from 'change-case';
6
-
7
- /**
8
- * WordPress dependencies
9
- */
10
- import {
11
- BlockPreview,
12
- privateApis as blockEditorPrivateApis,
13
- } from '@wordpress/block-editor';
14
- import {
15
- Button,
16
- __experimentalConfirmDialog as ConfirmDialog,
17
- DropdownMenu,
18
- MenuGroup,
19
- MenuItem,
20
- __experimentalHeading as Heading,
21
- __experimentalHStack as HStack,
22
- Tooltip,
23
- Flex,
24
- } from '@wordpress/components';
25
- import { useDispatch } from '@wordpress/data';
26
- import { useState, useId, memo } from '@wordpress/element';
27
- import { __, sprintf } from '@wordpress/i18n';
28
- import {
29
- Icon,
30
- header,
31
- footer,
32
- symbolFilled as uncategorized,
33
- symbol,
34
- moreVertical,
35
- lockSmall,
36
- } from '@wordpress/icons';
37
- import { store as noticesStore } from '@wordpress/notices';
38
- import { store as reusableBlocksStore } from '@wordpress/reusable-blocks';
39
- import { downloadBlob } from '@wordpress/blob';
40
-
41
- /**
42
- * Internal dependencies
43
- */
44
- import RenameMenuItem from './rename-menu-item';
45
- import DuplicateMenuItem from './duplicate-menu-item';
46
- import {
47
- PATTERN_TYPES,
48
- TEMPLATE_PART_POST_TYPE,
49
- PATTERN_SYNC_TYPES,
50
- } from '../../utils/constants';
51
- import { store as editSiteStore } from '../../store';
52
- import { useLink } from '../routes/link';
53
- import { unlock } from '../../lock-unlock';
54
-
55
- const { useGlobalStyle } = unlock( blockEditorPrivateApis );
56
-
57
- const templatePartIcons = { header, footer, uncategorized };
58
-
59
- function GridItem( { categoryId, item, ...props } ) {
60
- const descriptionId = useId();
61
- const [ isDeleteDialogOpen, setIsDeleteDialogOpen ] = useState( false );
62
- const [ backgroundColor ] = useGlobalStyle( 'color.background' );
63
-
64
- const { removeTemplate } = useDispatch( editSiteStore );
65
- const { __experimentalDeleteReusableBlock } =
66
- useDispatch( reusableBlocksStore );
67
- const { createErrorNotice, createSuccessNotice } =
68
- useDispatch( noticesStore );
69
-
70
- const isUserPattern = item.type === PATTERN_TYPES.user;
71
- const isNonUserPattern = item.type === PATTERN_TYPES.theme;
72
- const isTemplatePart = item.type === TEMPLATE_PART_POST_TYPE;
73
-
74
- const { onClick } = useLink( {
75
- postType: item.type,
76
- postId: isUserPattern ? item.id : item.name,
77
- categoryId,
78
- categoryType: isTemplatePart ? item.type : PATTERN_TYPES.theme,
79
- } );
80
-
81
- const isEmpty = ! item.blocks?.length;
82
- const patternClassNames = classnames( 'edit-site-patterns__pattern', {
83
- 'is-placeholder': isEmpty,
84
- } );
85
- const previewClassNames = classnames( 'edit-site-patterns__preview', {
86
- 'is-inactive': isNonUserPattern,
87
- } );
88
-
89
- const deletePattern = async () => {
90
- try {
91
- await __experimentalDeleteReusableBlock( item.id );
92
- createSuccessNotice(
93
- sprintf(
94
- // translators: %s: The pattern's title e.g. 'Call to action'.
95
- __( '"%s" deleted.' ),
96
- item.title
97
- ),
98
- { type: 'snackbar', id: 'edit-site-patterns-success' }
99
- );
100
- } catch ( error ) {
101
- const errorMessage =
102
- error.message && error.code !== 'unknown_error'
103
- ? error.message
104
- : __( 'An error occurred while deleting the pattern.' );
105
- createErrorNotice( errorMessage, {
106
- type: 'snackbar',
107
- id: 'edit-site-patterns-error',
108
- } );
109
- }
110
- };
111
- const deleteItem = () =>
112
- isTemplatePart ? removeTemplate( item ) : deletePattern();
113
- const exportAsJSON = () => {
114
- const json = {
115
- __file: item.type,
116
- title: item.title || item.name,
117
- content: item.patternPost.content.raw,
118
- syncStatus: item.patternPost.wp_pattern_sync_status,
119
- };
120
-
121
- return downloadBlob(
122
- `${ kebabCase( item.title || item.name ) }.json`,
123
- JSON.stringify( json, null, 2 ),
124
- 'application/json'
125
- );
126
- };
127
-
128
- // Only custom patterns or custom template parts can be renamed or deleted.
129
- const isCustomPattern =
130
- isUserPattern || ( isTemplatePart && item.isCustom );
131
- const hasThemeFile = isTemplatePart && item.templatePart.has_theme_file;
132
- const ariaDescriptions = [];
133
-
134
- if ( isCustomPattern ) {
135
- // User patterns don't have descriptions, but can be edited and deleted, so include some help text.
136
- ariaDescriptions.push(
137
- __( 'Press Enter to edit, or Delete to delete the pattern.' )
138
- );
139
- } else if ( item.description ) {
140
- ariaDescriptions.push( item.description );
141
- }
142
-
143
- if ( isNonUserPattern ) {
144
- ariaDescriptions.push(
145
- __( 'Theme & plugin patterns cannot be edited.' )
146
- );
147
- }
148
-
149
- let itemIcon;
150
- if ( ! isUserPattern && templatePartIcons[ categoryId ] ) {
151
- itemIcon = templatePartIcons[ categoryId ];
152
- } else {
153
- itemIcon =
154
- item.syncStatus === PATTERN_SYNC_TYPES.full ? symbol : undefined;
155
- }
156
-
157
- const confirmButtonText = hasThemeFile ? __( 'Clear' ) : __( 'Delete' );
158
- const confirmPrompt = hasThemeFile
159
- ? __( 'Are you sure you want to clear these customizations?' )
160
- : sprintf(
161
- // translators: %s: The pattern or template part's title e.g. 'Call to action'.
162
- __( 'Are you sure you want to delete "%s"?' ),
163
- item.title || item.name
164
- );
165
-
166
- const additionalStyles = ! backgroundColor
167
- ? [ { css: 'body { background: #fff; }' } ]
168
- : undefined;
169
-
170
- return (
171
- <li className={ patternClassNames }>
172
- <button
173
- className={ previewClassNames }
174
- id={ `edit-site-patterns-${ item.name }` }
175
- type="button"
176
- { ...props }
177
- onClick={
178
- item.type !== PATTERN_TYPES.theme ? onClick : undefined
179
- }
180
- aria-disabled={
181
- item.type !== PATTERN_TYPES.theme ? 'false' : 'true'
182
- }
183
- aria-label={ item.title }
184
- aria-describedby={
185
- ariaDescriptions.length
186
- ? ariaDescriptions
187
- .map(
188
- ( _, index ) =>
189
- `${ descriptionId }-${ index }`
190
- )
191
- .join( ' ' )
192
- : undefined
193
- }
194
- >
195
- { isEmpty && isTemplatePart && __( 'Empty template part' ) }
196
- { isEmpty && ! isTemplatePart && __( 'Empty pattern' ) }
197
- { ! isEmpty && (
198
- <BlockPreview
199
- blocks={ item.blocks }
200
- additionalStyles={ additionalStyles }
201
- viewportWidth={ item.viewportWidth }
202
- />
203
- ) }
204
- </button>
205
- { ariaDescriptions.map( ( ariaDescription, index ) => (
206
- <div
207
- key={ index }
208
- hidden
209
- id={ `${ descriptionId }-${ index }` }
210
- >
211
- { ariaDescription }
212
- </div>
213
- ) ) }
214
- <HStack
215
- className="edit-site-patterns__footer"
216
- justify="space-between"
217
- >
218
- <HStack
219
- alignment="center"
220
- justify="left"
221
- spacing={ 3 }
222
- className="edit-site-patterns__pattern-title"
223
- >
224
- { itemIcon && ! isNonUserPattern && (
225
- <Tooltip
226
- placement="top"
227
- text={ __(
228
- 'Editing this pattern will also update anywhere it is used'
229
- ) }
230
- >
231
- <Icon
232
- className="edit-site-patterns__pattern-icon"
233
- icon={ itemIcon }
234
- />
235
- </Tooltip>
236
- ) }
237
- <Flex as="span" gap={ 0 } justify="left">
238
- { item.type === PATTERN_TYPES.theme ? (
239
- item.title
240
- ) : (
241
- <Heading level={ 5 }>
242
- <Button
243
- variant="link"
244
- onClick={ onClick }
245
- // Required for the grid's roving tab index system.
246
- // See https://github.com/WordPress/gutenberg/pull/51898#discussion_r1243399243.
247
- tabIndex="-1"
248
- >
249
- { item.title || item.name }
250
- </Button>
251
- </Heading>
252
- ) }
253
- { item.type === PATTERN_TYPES.theme && (
254
- <Tooltip
255
- placement="top"
256
- text={ __( 'This pattern cannot be edited.' ) }
257
- >
258
- <Icon
259
- className="edit-site-patterns__pattern-lock-icon"
260
- icon={ lockSmall }
261
- size={ 24 }
262
- />
263
- </Tooltip>
264
- ) }
265
- </Flex>
266
- </HStack>
267
- <DropdownMenu
268
- icon={ moreVertical }
269
- label={ __( 'Actions' ) }
270
- className="edit-site-patterns__dropdown"
271
- popoverProps={ { placement: 'bottom-end' } }
272
- toggleProps={ {
273
- className: 'edit-site-patterns__button',
274
- describedBy: sprintf(
275
- /* translators: %s: pattern name */
276
- __( 'Action menu for %s pattern' ),
277
- item.title
278
- ),
279
- } }
280
- >
281
- { ( { onClose } ) => (
282
- <MenuGroup>
283
- { isCustomPattern && ! hasThemeFile && (
284
- <RenameMenuItem
285
- item={ item }
286
- onClose={ onClose }
287
- />
288
- ) }
289
- <DuplicateMenuItem
290
- categoryId={ categoryId }
291
- item={ item }
292
- onClose={ onClose }
293
- label={ __( 'Duplicate' ) }
294
- />
295
- { item.type === PATTERN_TYPES.user && (
296
- <MenuItem onClick={ () => exportAsJSON() }>
297
- { __( 'Export as JSON' ) }
298
- </MenuItem>
299
- ) }
300
-
301
- { isCustomPattern && (
302
- <MenuItem
303
- isDestructive={ ! hasThemeFile }
304
- onClick={ () =>
305
- setIsDeleteDialogOpen( true )
306
- }
307
- >
308
- { hasThemeFile
309
- ? __( 'Clear customizations' )
310
- : __( 'Delete' ) }
311
- </MenuItem>
312
- ) }
313
- </MenuGroup>
314
- ) }
315
- </DropdownMenu>
316
- </HStack>
317
-
318
- { isDeleteDialogOpen && (
319
- <ConfirmDialog
320
- confirmButtonText={ confirmButtonText }
321
- onConfirm={ deleteItem }
322
- onCancel={ () => setIsDeleteDialogOpen( false ) }
323
- >
324
- { confirmPrompt }
325
- </ConfirmDialog>
326
- ) }
327
- </li>
328
- );
329
- }
330
-
331
- export default memo( GridItem );
@@ -1,22 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import GridItem from './grid-item';
5
-
6
- export default function Grid( { categoryId, items, ...props } ) {
7
- if ( ! items?.length ) {
8
- return null;
9
- }
10
-
11
- return (
12
- <ul className="edit-site-patterns__grid" { ...props }>
13
- { items.map( ( item ) => (
14
- <GridItem
15
- key={ item.name }
16
- item={ item }
17
- categoryId={ categoryId }
18
- />
19
- ) ) }
20
- </ul>
21
- );
22
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
-
6
- export default function NoPatterns() {
7
- return (
8
- <div className="edit-site-patterns__no-results">
9
- { __( 'No patterns found.' ) }
10
- </div>
11
- );
12
- }