@wordpress/edit-site 4.7.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/components/add-new-template/add-custom-generic-template-modal.js +84 -0
  3. package/build/components/add-new-template/add-custom-generic-template-modal.js.map +1 -0
  4. package/build/components/add-new-template/add-custom-template-modal.js +224 -0
  5. package/build/components/add-new-template/add-custom-template-modal.js.map +1 -0
  6. package/build/components/add-new-template/new-template.js +94 -33
  7. package/build/components/add-new-template/new-template.js.map +1 -1
  8. package/build/components/add-new-template/utils.js +405 -0
  9. package/build/components/add-new-template/utils.js.map +1 -0
  10. package/build/components/block-editor/block-inspector-button.js.map +1 -1
  11. package/build/components/block-editor/index.js.map +1 -1
  12. package/build/components/code-editor/index.js +17 -4
  13. package/build/components/code-editor/index.js.map +1 -1
  14. package/build/components/edit-template-part-menu-button/index.js.map +1 -1
  15. package/build/components/editor/index.js +16 -0
  16. package/build/components/editor/index.js.map +1 -1
  17. package/build/components/error-boundary/index.js +6 -0
  18. package/build/components/error-boundary/index.js.map +1 -1
  19. package/build/components/global-styles/context-menu.js +6 -3
  20. package/build/components/global-styles/context-menu.js.map +1 -1
  21. package/build/components/global-styles/dimensions-panel.js +2 -6
  22. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  23. package/build/components/global-styles/global-styles-provider.js +4 -2
  24. package/build/components/global-styles/global-styles-provider.js.map +1 -1
  25. package/build/components/global-styles/gradients-palette-panel.js +3 -7
  26. package/build/components/global-styles/gradients-palette-panel.js.map +1 -1
  27. package/build/components/global-styles/hooks.js +11 -2
  28. package/build/components/global-styles/hooks.js.map +1 -1
  29. package/build/components/global-styles/palette.js +2 -1
  30. package/build/components/global-styles/palette.js.map +1 -1
  31. package/build/components/global-styles/screen-block-list.js +4 -1
  32. package/build/components/global-styles/screen-block-list.js.map +1 -1
  33. package/build/components/global-styles/screen-button-color.js +80 -0
  34. package/build/components/global-styles/screen-button-color.js.map +1 -0
  35. package/build/components/global-styles/screen-color-palette.js +13 -17
  36. package/build/components/global-styles/screen-color-palette.js.map +1 -1
  37. package/build/components/global-styles/screen-colors.js +56 -8
  38. package/build/components/global-styles/screen-colors.js.map +1 -1
  39. package/build/components/global-styles/screen-link-color.js +48 -14
  40. package/build/components/global-styles/screen-link-color.js.map +1 -1
  41. package/build/components/global-styles/screen-root.js +4 -2
  42. package/build/components/global-styles/screen-root.js.map +1 -1
  43. package/build/components/global-styles/screen-style-variations.js +9 -1
  44. package/build/components/global-styles/screen-style-variations.js.map +1 -1
  45. package/build/components/global-styles/screen-typography-element.js +4 -0
  46. package/build/components/global-styles/screen-typography-element.js.map +1 -1
  47. package/build/components/global-styles/screen-typography.js +9 -1
  48. package/build/components/global-styles/screen-typography.js.map +1 -1
  49. package/build/components/global-styles/ui.js +11 -0
  50. package/build/components/global-styles/ui.js.map +1 -1
  51. package/build/components/global-styles/use-global-styles-output.js +199 -30
  52. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  53. package/build/components/global-styles/utils.js +4 -2
  54. package/build/components/global-styles/utils.js.map +1 -1
  55. package/build/components/header/index.js +28 -10
  56. package/build/components/header/index.js.map +1 -1
  57. package/build/components/header/mode-switcher/index.js.map +1 -1
  58. package/build/components/header/more-menu/copy-content-menu-item.js +1 -1
  59. package/build/components/header/more-menu/copy-content-menu-item.js.map +1 -1
  60. package/build/components/header/more-menu/site-export.js +4 -1
  61. package/build/components/header/more-menu/site-export.js.map +1 -1
  62. package/build/components/header/undo-redo/redo.js +13 -4
  63. package/build/components/header/undo-redo/redo.js.map +1 -1
  64. package/build/components/header/undo-redo/undo.js +13 -4
  65. package/build/components/header/undo-redo/undo.js.map +1 -1
  66. package/build/components/keyboard-shortcut-help-modal/config.js +17 -0
  67. package/build/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  68. package/build/components/keyboard-shortcut-help-modal/index.js +1 -3
  69. package/build/components/keyboard-shortcut-help-modal/index.js.map +1 -1
  70. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  71. package/build/components/list/actions/index.js.map +1 -1
  72. package/build/components/list/actions/rename-menu-item.js.map +1 -1
  73. package/build/components/list/added-by.js.map +1 -1
  74. package/build/components/navigation-sidebar/index.js.map +1 -1
  75. package/build/components/save-button/index.js.map +1 -1
  76. package/build/components/sidebar/index.js.map +1 -1
  77. package/build/components/sidebar/navigation-menu-sidebar/navigation-inspector.js.map +1 -1
  78. package/build/components/sidebar/template-card/index.js +19 -7
  79. package/build/components/sidebar/template-card/index.js.map +1 -1
  80. package/build/components/sidebar/template-card/template-actions.js +64 -0
  81. package/build/components/sidebar/template-card/template-actions.js.map +1 -0
  82. package/build/components/sidebar/template-card/template-areas.js.map +1 -1
  83. package/build/components/template-details/edit-template-title.js +11 -3
  84. package/build/components/template-details/edit-template-title.js.map +1 -1
  85. package/build/components/template-details/index.js +1 -20
  86. package/build/components/template-details/index.js.map +1 -1
  87. package/build/components/template-details/template-areas.js.map +1 -1
  88. package/build/components/template-part-converter/index.js.map +1 -1
  89. package/build/components/url-query-controller/index.js.map +1 -1
  90. package/build/store/actions.js.map +1 -1
  91. package/build/store/selectors.js +4 -1
  92. package/build/store/selectors.js.map +1 -1
  93. package/build-module/components/add-new-template/add-custom-generic-template-modal.js +77 -0
  94. package/build-module/components/add-new-template/add-custom-generic-template-modal.js.map +1 -0
  95. package/build-module/components/add-new-template/add-custom-template-modal.js +209 -0
  96. package/build-module/components/add-new-template/add-custom-template-modal.js.map +1 -0
  97. package/build-module/components/add-new-template/new-template.js +93 -34
  98. package/build-module/components/add-new-template/new-template.js.map +1 -1
  99. package/build-module/components/add-new-template/utils.js +365 -0
  100. package/build-module/components/add-new-template/utils.js.map +1 -0
  101. package/build-module/components/block-editor/block-inspector-button.js.map +1 -1
  102. package/build-module/components/block-editor/index.js.map +1 -1
  103. package/build-module/components/code-editor/index.js +18 -5
  104. package/build-module/components/code-editor/index.js.map +1 -1
  105. package/build-module/components/edit-template-part-menu-button/index.js.map +1 -1
  106. package/build-module/components/editor/index.js +16 -0
  107. package/build-module/components/editor/index.js.map +1 -1
  108. package/build-module/components/error-boundary/index.js +5 -0
  109. package/build-module/components/error-boundary/index.js.map +1 -1
  110. package/build-module/components/global-styles/context-menu.js +6 -3
  111. package/build-module/components/global-styles/context-menu.js.map +1 -1
  112. package/build-module/components/global-styles/dimensions-panel.js +2 -6
  113. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  114. package/build-module/components/global-styles/global-styles-provider.js +4 -2
  115. package/build-module/components/global-styles/global-styles-provider.js.map +1 -1
  116. package/build-module/components/global-styles/gradients-palette-panel.js +3 -5
  117. package/build-module/components/global-styles/gradients-palette-panel.js.map +1 -1
  118. package/build-module/components/global-styles/hooks.js +11 -2
  119. package/build-module/components/global-styles/hooks.js.map +1 -1
  120. package/build-module/components/global-styles/palette.js +2 -1
  121. package/build-module/components/global-styles/palette.js.map +1 -1
  122. package/build-module/components/global-styles/screen-block-list.js +4 -1
  123. package/build-module/components/global-styles/screen-block-list.js.map +1 -1
  124. package/build-module/components/global-styles/screen-button-color.js +67 -0
  125. package/build-module/components/global-styles/screen-button-color.js.map +1 -0
  126. package/build-module/components/global-styles/screen-color-palette.js +14 -19
  127. package/build-module/components/global-styles/screen-color-palette.js.map +1 -1
  128. package/build-module/components/global-styles/screen-colors.js +57 -9
  129. package/build-module/components/global-styles/screen-colors.js.map +1 -1
  130. package/build-module/components/global-styles/screen-link-color.js +47 -14
  131. package/build-module/components/global-styles/screen-link-color.js.map +1 -1
  132. package/build-module/components/global-styles/screen-root.js +4 -2
  133. package/build-module/components/global-styles/screen-root.js.map +1 -1
  134. package/build-module/components/global-styles/screen-style-variations.js +9 -1
  135. package/build-module/components/global-styles/screen-style-variations.js.map +1 -1
  136. package/build-module/components/global-styles/screen-typography-element.js +4 -0
  137. package/build-module/components/global-styles/screen-typography-element.js.map +1 -1
  138. package/build-module/components/global-styles/screen-typography.js +10 -2
  139. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  140. package/build-module/components/global-styles/ui.js +10 -0
  141. package/build-module/components/global-styles/ui.js.map +1 -1
  142. package/build-module/components/global-styles/use-global-styles-output.js +198 -32
  143. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  144. package/build-module/components/global-styles/utils.js +5 -3
  145. package/build-module/components/global-styles/utils.js.map +1 -1
  146. package/build-module/components/header/index.js +29 -11
  147. package/build-module/components/header/index.js.map +1 -1
  148. package/build-module/components/header/mode-switcher/index.js.map +1 -1
  149. package/build-module/components/header/more-menu/copy-content-menu-item.js +1 -1
  150. package/build-module/components/header/more-menu/copy-content-menu-item.js.map +1 -1
  151. package/build-module/components/header/more-menu/site-export.js +4 -1
  152. package/build-module/components/header/more-menu/site-export.js.map +1 -1
  153. package/build-module/components/header/undo-redo/redo.js +9 -3
  154. package/build-module/components/header/undo-redo/redo.js.map +1 -1
  155. package/build-module/components/header/undo-redo/undo.js +9 -3
  156. package/build-module/components/header/undo-redo/undo.js.map +1 -1
  157. package/build-module/components/keyboard-shortcut-help-modal/config.js +17 -0
  158. package/build-module/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  159. package/build-module/components/keyboard-shortcut-help-modal/index.js +1 -2
  160. package/build-module/components/keyboard-shortcut-help-modal/index.js.map +1 -1
  161. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  162. package/build-module/components/list/actions/index.js.map +1 -1
  163. package/build-module/components/list/actions/rename-menu-item.js.map +1 -1
  164. package/build-module/components/list/added-by.js.map +1 -1
  165. package/build-module/components/navigation-sidebar/index.js.map +1 -1
  166. package/build-module/components/save-button/index.js.map +1 -1
  167. package/build-module/components/sidebar/index.js.map +1 -1
  168. package/build-module/components/sidebar/navigation-menu-sidebar/navigation-inspector.js.map +1 -1
  169. package/build-module/components/sidebar/template-card/index.js +18 -7
  170. package/build-module/components/sidebar/template-card/index.js.map +1 -1
  171. package/build-module/components/sidebar/template-card/template-actions.js +49 -0
  172. package/build-module/components/sidebar/template-card/template-actions.js.map +1 -0
  173. package/build-module/components/sidebar/template-card/template-areas.js.map +1 -1
  174. package/build-module/components/template-details/edit-template-title.js +12 -3
  175. package/build-module/components/template-details/edit-template-title.js.map +1 -1
  176. package/build-module/components/template-details/index.js +2 -21
  177. package/build-module/components/template-details/index.js.map +1 -1
  178. package/build-module/components/template-details/template-areas.js.map +1 -1
  179. package/build-module/components/template-part-converter/index.js.map +1 -1
  180. package/build-module/components/url-query-controller/index.js.map +1 -1
  181. package/build-module/store/actions.js.map +1 -1
  182. package/build-module/store/selectors.js +5 -2
  183. package/build-module/store/selectors.js.map +1 -1
  184. package/build-style/style-rtl.css +188 -42
  185. package/build-style/style.css +188 -42
  186. package/package.json +29 -29
  187. package/src/components/add-new-template/add-custom-generic-template-modal.js +97 -0
  188. package/src/components/add-new-template/add-custom-template-modal.js +265 -0
  189. package/src/components/add-new-template/new-template.js +194 -70
  190. package/src/components/add-new-template/style.scss +137 -0
  191. package/src/components/add-new-template/utils.js +369 -0
  192. package/src/components/block-editor/block-inspector-button.js +2 -3
  193. package/src/components/block-editor/index.js +4 -9
  194. package/src/components/code-editor/index.js +15 -5
  195. package/src/components/edit-template-part-menu-button/index.js +2 -3
  196. package/src/components/editor/index.js +15 -5
  197. package/src/components/error-boundary/index.js +5 -0
  198. package/src/components/global-styles/context-menu.js +3 -0
  199. package/src/components/global-styles/dimensions-panel.js +2 -7
  200. package/src/components/global-styles/global-styles-provider.js +12 -17
  201. package/src/components/global-styles/gradients-palette-panel.js +2 -5
  202. package/src/components/global-styles/hooks.js +20 -3
  203. package/src/components/global-styles/palette.js +4 -1
  204. package/src/components/global-styles/screen-block-list.js +14 -5
  205. package/src/components/global-styles/screen-button-color.js +102 -0
  206. package/src/components/global-styles/screen-color-palette.js +25 -27
  207. package/src/components/global-styles/screen-colors.js +58 -7
  208. package/src/components/global-styles/screen-link-color.js +65 -23
  209. package/src/components/global-styles/screen-root.js +12 -5
  210. package/src/components/global-styles/screen-style-variations.js +10 -4
  211. package/src/components/global-styles/screen-typography-element.js +4 -0
  212. package/src/components/global-styles/screen-typography.js +17 -2
  213. package/src/components/global-styles/style.scss +14 -8
  214. package/src/components/global-styles/test/use-global-styles-output.js +250 -16
  215. package/src/components/global-styles/ui.js +13 -0
  216. package/src/components/global-styles/use-global-styles-output.js +246 -32
  217. package/src/components/global-styles/utils.js +5 -2
  218. package/src/components/header/index.js +38 -13
  219. package/src/components/header/mode-switcher/index.js +4 -4
  220. package/src/components/header/more-menu/copy-content-menu-item.js +3 -4
  221. package/src/components/header/more-menu/site-export.js +5 -3
  222. package/src/components/header/style.scss +53 -5
  223. package/src/components/header/undo-redo/redo.js +6 -1
  224. package/src/components/header/undo-redo/undo.js +6 -1
  225. package/src/components/keyboard-shortcut-help-modal/config.js +12 -0
  226. package/src/components/keyboard-shortcut-help-modal/index.js +1 -2
  227. package/src/components/keyboard-shortcut-help-modal/style.scss +0 -5
  228. package/src/components/keyboard-shortcuts/index.js +6 -10
  229. package/src/components/list/actions/index.js +2 -3
  230. package/src/components/list/actions/rename-menu-item.js +4 -6
  231. package/src/components/list/added-by.js +4 -3
  232. package/src/components/list/style.scss +0 -8
  233. package/src/components/navigation-sidebar/index.js +2 -4
  234. package/src/components/save-button/index.js +2 -4
  235. package/src/components/sidebar/index.js +6 -6
  236. package/src/components/sidebar/navigation-menu-sidebar/navigation-inspector.js +6 -9
  237. package/src/components/sidebar/template-card/index.js +17 -9
  238. package/src/components/sidebar/template-card/style.scss +49 -35
  239. package/src/components/sidebar/template-card/template-actions.js +43 -0
  240. package/src/components/sidebar/template-card/template-areas.js +6 -6
  241. package/src/components/template-details/edit-template-title.js +10 -2
  242. package/src/components/template-details/index.js +4 -21
  243. package/src/components/template-details/template-areas.js +6 -6
  244. package/src/components/template-part-converter/index.js +2 -3
  245. package/src/components/test/error-boundary.js +38 -0
  246. package/src/components/url-query-controller/index.js +2 -3
  247. package/src/store/actions.js +257 -233
  248. package/src/store/selectors.js +19 -14
@@ -7,8 +7,9 @@ import { useSelect, useDispatch } from '@wordpress/data';
7
7
  import { undo as undoIcon, redo as redoIcon } from '@wordpress/icons';
8
8
  import { displayShortcut } from '@wordpress/keycodes';
9
9
  import { store as coreStore } from '@wordpress/core-data';
10
+ import { forwardRef } from '@wordpress/element';
10
11
 
11
- export default function UndoButton() {
12
+ function UndoButton( props, ref ) {
12
13
  const hasUndo = useSelect(
13
14
  ( select ) => select( coreStore ).hasUndo(),
14
15
  []
@@ -16,6 +17,8 @@ export default function UndoButton() {
16
17
  const { undo } = useDispatch( coreStore );
17
18
  return (
18
19
  <Button
20
+ { ...props }
21
+ ref={ ref }
19
22
  icon={ ! isRTL() ? undoIcon : redoIcon }
20
23
  label={ __( 'Undo' ) }
21
24
  shortcut={ displayShortcut.primary( 'z' ) }
@@ -27,3 +30,5 @@ export default function UndoButton() {
27
30
  />
28
31
  );
29
32
  }
33
+
34
+ export default forwardRef( UndoButton );
@@ -20,8 +20,20 @@ export const textFormattingShortcuts = [
20
20
  keyCombination: { modifier: 'primaryShift', character: 'k' },
21
21
  description: __( 'Remove a link.' ),
22
22
  },
23
+ {
24
+ keyCombination: { character: '[[' },
25
+ description: __( 'Insert a link to a post or page' ),
26
+ },
23
27
  {
24
28
  keyCombination: { modifier: 'primary', character: 'u' },
25
29
  description: __( 'Underline the selected text.' ),
26
30
  },
31
+ {
32
+ keyCombination: { modifier: 'access', character: 'd' },
33
+ description: __( 'Strikethrough the selected text.' ),
34
+ },
35
+ {
36
+ keyCombination: { modifier: 'access', character: 'x' },
37
+ description: __( 'Make the selected text inline code.' ),
38
+ },
27
39
  ];
@@ -2,7 +2,6 @@
2
2
  * External dependencies
3
3
  */
4
4
  import classnames from 'classnames';
5
- import { isString } from 'lodash';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
@@ -34,7 +33,7 @@ const ShortcutList = ( { shortcuts } ) => (
34
33
  className="edit-site-keyboard-shortcut-help-modal__shortcut"
35
34
  key={ index }
36
35
  >
37
- { isString( shortcut ) ? (
36
+ { typeof shortcut === 'string' ? (
38
37
  <DynamicShortcut name={ shortcut } />
39
38
  ) : (
40
39
  <Shortcut { ...shortcut } />
@@ -3,11 +3,6 @@
3
3
  margin: 0 0 2rem 0;
4
4
  }
5
5
 
6
- &__main-shortcuts .edit-site-keyboard-shortcut-help-modal__shortcut-list {
7
- // Push the shortcut to be flush with top modal header.
8
- margin-top: -$grid-unit-30 -$border-width;
9
- }
10
-
11
6
  &__section-title {
12
7
  font-size: 0.9rem;
13
8
  font-weight: 600;
@@ -19,10 +19,8 @@ import { SIDEBAR_BLOCK } from '../sidebar/constants';
19
19
  import { STORE_NAME } from '../../store/constants';
20
20
 
21
21
  function KeyboardShortcuts( { openEntitiesSavedStates } ) {
22
- const {
23
- __experimentalGetDirtyEntityRecords,
24
- isSavingEntityRecord,
25
- } = useSelect( coreStore );
22
+ const { __experimentalGetDirtyEntityRecords, isSavingEntityRecord } =
23
+ useSelect( coreStore );
26
24
  const { getEditorMode } = useSelect( editSiteStore );
27
25
  const isListViewOpen = useSelect(
28
26
  ( select ) => select( editSiteStore ).isListViewOpened(),
@@ -36,12 +34,10 @@ function KeyboardShortcuts( { openEntitiesSavedStates } ) {
36
34
  []
37
35
  );
38
36
  const { redo, undo } = useDispatch( coreStore );
39
- const { setIsListViewOpened, switchEditorMode } = useDispatch(
40
- editSiteStore
41
- );
42
- const { enableComplementaryArea, disableComplementaryArea } = useDispatch(
43
- interfaceStore
44
- );
37
+ const { setIsListViewOpened, switchEditorMode } =
38
+ useDispatch( editSiteStore );
39
+ const { enableComplementaryArea, disableComplementaryArea } =
40
+ useDispatch( interfaceStore );
45
41
 
46
42
  useShortcut( 'core/edit-site/save', ( event ) => {
47
43
  event.preventDefault();
@@ -19,9 +19,8 @@ import RenameMenuItem from './rename-menu-item';
19
19
  export default function Actions( { template } ) {
20
20
  const { removeTemplate, revertTemplate } = useDispatch( editSiteStore );
21
21
  const { saveEditedEntityRecord } = useDispatch( coreStore );
22
- const { createSuccessNotice, createErrorNotice } = useDispatch(
23
- noticesStore
24
- );
22
+ const { createSuccessNotice, createErrorNotice } =
23
+ useDispatch( noticesStore );
25
24
 
26
25
  const isRemovable = isTemplateRemovable( template );
27
26
  const isRevertable = isTemplateRevertable( template );
@@ -19,12 +19,10 @@ export default function RenameMenuItem( { template, onClose } ) {
19
19
  const [ title, setTitle ] = useState( () => template.title.rendered );
20
20
  const [ isModalOpen, setIsModalOpen ] = useState( false );
21
21
 
22
- const { editEntityRecord, saveEditedEntityRecord } = useDispatch(
23
- coreStore
24
- );
25
- const { createSuccessNotice, createErrorNotice } = useDispatch(
26
- noticesStore
27
- );
22
+ const { editEntityRecord, saveEditedEntityRecord } =
23
+ useDispatch( coreStore );
24
+ const { createSuccessNotice, createErrorNotice } =
25
+ useDispatch( noticesStore );
28
26
 
29
27
  if ( ! template.is_custom ) {
30
28
  return null;
@@ -106,9 +106,10 @@ function AddedByPlugin( { slug, isCustomized } ) {
106
106
  }
107
107
 
108
108
  function AddedByAuthor( { id } ) {
109
- const user = useSelect( ( select ) => select( coreStore ).getUser( id ), [
110
- id,
111
- ] );
109
+ const user = useSelect(
110
+ ( select ) => select( coreStore ).getUser( id ),
111
+ [ id ]
112
+ );
112
113
 
113
114
  return (
114
115
  <BaseAddedBy
@@ -131,14 +131,6 @@
131
131
  width: $grid-unit * 40;
132
132
  }
133
133
  }
134
-
135
- .components-modal__header {
136
- border-bottom: none;
137
- }
138
-
139
- .components-modal__content::before {
140
- margin-bottom: $grid-unit-05;
141
- }
142
134
  }
143
135
 
144
136
  .edit-site-list__rename-modal-actions {
@@ -18,10 +18,8 @@ export const {
18
18
  Slot: NavigationPanelPreviewSlot,
19
19
  } = createSlotFill( 'EditSiteNavigationPanelPreview' );
20
20
 
21
- const {
22
- Fill: NavigationSidebarFill,
23
- Slot: NavigationSidebarSlot,
24
- } = createSlotFill( 'EditSiteNavigationSidebar' );
21
+ const { Fill: NavigationSidebarFill, Slot: NavigationSidebarSlot } =
22
+ createSlotFill( 'EditSiteNavigationSidebar' );
25
23
 
26
24
  function NavigationSidebar( { isDefaultOpen = false, activeTemplateType } ) {
27
25
  const isDesktopViewport = useViewportMatch( 'medium' );
@@ -16,10 +16,8 @@ export default function SaveButton( {
16
16
  isEntitiesSavedStatesOpen,
17
17
  } ) {
18
18
  const { isDirty, isSaving } = useSelect( ( select ) => {
19
- const {
20
- __experimentalGetDirtyEntityRecords,
21
- isSavingEntityRecord,
22
- } = select( coreStore );
19
+ const { __experimentalGetDirtyEntityRecords, isSavingEntityRecord } =
20
+ select( coreStore );
23
21
  const dirtyEntityRecords = __experimentalGetDirtyEntityRecords();
24
22
  return {
25
23
  isDirty: dirtyEntityRecords.length > 0,
@@ -28,9 +28,10 @@ export const SidebarInspectorFill = InspectorFill;
28
28
  export function SidebarComplementaryAreaFills() {
29
29
  const { sidebar, isEditorSidebarOpened, hasBlockSelection } = useSelect(
30
30
  ( select ) => {
31
- const _sidebar = select(
32
- interfaceStore
33
- ).getActiveComplementaryArea( STORE_NAME );
31
+ const _sidebar =
32
+ select( interfaceStore ).getActiveComplementaryArea(
33
+ STORE_NAME
34
+ );
34
35
  const _isEditorSidebarOpened = [
35
36
  SIDEBAR_BLOCK,
36
37
  SIDEBAR_TEMPLATE,
@@ -38,9 +39,8 @@ export function SidebarComplementaryAreaFills() {
38
39
  return {
39
40
  sidebar: _sidebar,
40
41
  isEditorSidebarOpened: _isEditorSidebarOpened,
41
- hasBlockSelection: !! select(
42
- blockEditorStore
43
- ).getBlockSelectionStart(),
42
+ hasBlockSelection:
43
+ !! select( blockEditorStore ).getBlockSelectionStart(),
44
44
  };
45
45
  },
46
46
  []
@@ -35,9 +35,8 @@ export default function NavigationInspector() {
35
35
  getBlock,
36
36
  } = select( blockEditorStore );
37
37
 
38
- const { getEntityRecords, hasFinishedResolution, isResolving } = select(
39
- coreStore
40
- );
38
+ const { getEntityRecords, hasFinishedResolution, isResolving } =
39
+ select( coreStore );
41
40
 
42
41
  const navigationMenusQuery = [
43
42
  'postType',
@@ -46,14 +45,12 @@ export default function NavigationInspector() {
46
45
  ];
47
46
 
48
47
  // Get the active Navigation block (if present).
49
- const selectedNavId = __experimentalGetActiveBlockIdByBlockNames(
50
- 'core/navigation'
51
- );
48
+ const selectedNavId =
49
+ __experimentalGetActiveBlockIdByBlockNames( 'core/navigation' );
52
50
 
53
51
  // Get all Navigation blocks currently within the editor canvas.
54
- const navBlockIds = __experimentalGetGlobalBlocksByName(
55
- 'core/navigation'
56
- );
52
+ const navBlockIds =
53
+ __experimentalGetGlobalBlocksByName( 'core/navigation' );
57
54
  const idToRef = {};
58
55
  navBlockIds.forEach( ( id ) => {
59
56
  idToRef[ id ] = getBlock( id )?.attributes?.ref;
@@ -10,22 +10,26 @@ import { store as coreStore } from '@wordpress/core-data';
10
10
  * Internal dependencies
11
11
  */
12
12
  import { store as editSiteStore } from '../../../store';
13
+ import TemplateActions from './template-actions';
13
14
  import TemplateAreas from './template-areas';
14
15
 
15
16
  export default function TemplateCard() {
16
- const { title, description, icon } = useSelect( ( select ) => {
17
+ const {
18
+ info: { title, description, icon },
19
+ template,
20
+ } = useSelect( ( select ) => {
17
21
  const { getEditedPostType, getEditedPostId } = select( editSiteStore );
18
- const { getEntityRecord } = select( coreStore );
19
- const { __experimentalGetTemplateInfo: getTemplateInfo } = select(
20
- editorStore
21
- );
22
+ const { getEditedEntityRecord } = select( coreStore );
23
+ const { __experimentalGetTemplateInfo: getTemplateInfo } =
24
+ select( editorStore );
22
25
 
23
26
  const postType = getEditedPostType();
24
27
  const postId = getEditedPostId();
25
- const record = getEntityRecord( 'postType', postType, postId );
28
+ const record = getEditedEntityRecord( 'postType', postType, postId );
29
+
26
30
  const info = record ? getTemplateInfo( record ) : {};
27
31
 
28
- return info;
32
+ return { info, template: record };
29
33
  }, [] );
30
34
 
31
35
  if ( ! title && ! description ) {
@@ -36,11 +40,15 @@ export default function TemplateCard() {
36
40
  <div className="edit-site-template-card">
37
41
  <Icon className="edit-site-template-card__icon" icon={ icon } />
38
42
  <div className="edit-site-template-card__content">
39
- <h2 className="edit-site-template-card__title">{ title }</h2>
43
+ <div className="edit-site-template-card__header">
44
+ <h2 className="edit-site-template-card__title">
45
+ { title }
46
+ </h2>
47
+ <TemplateActions template={ template } />
48
+ </div>
40
49
  <div className="edit-site-template-card__description">
41
50
  { description }
42
51
  </div>
43
-
44
52
  <TemplateAreas />
45
53
  </div>
46
54
  </div>
@@ -1,51 +1,65 @@
1
1
  .edit-site-template-card {
2
2
  display: flex;
3
3
  align-items: flex-start;
4
- }
5
4
 
6
- .edit-site-template-card__content {
7
- flex-grow: 1;
8
- margin-bottom: $grid-unit-05;
9
- }
5
+ &__content {
6
+ flex-grow: 1;
7
+ margin-bottom: $grid-unit-05;
8
+ }
10
9
 
11
- .edit-site-template-card__title {
12
- font-weight: 500;
13
- line-height: $icon-size;
14
- &.edit-site-template-card__title {
15
- margin: 0 0 $grid-unit-05;
10
+ &__title {
11
+ font-weight: 500;
12
+ line-height: $icon-size;
13
+ &.edit-site-template-card__title {
14
+ margin: 0;
15
+ }
16
16
  }
17
- }
18
17
 
19
- .edit-site-template-card__description {
20
- font-size: $default-font-size;
21
- margin: 0 0 $grid-unit-20;
22
- }
18
+ &__description {
19
+ font-size: $default-font-size;
20
+ margin: 0 0 $grid-unit-20;
21
+ }
23
22
 
24
- .edit-site-template-card__icon {
25
- flex: 0 0 $icon-size;
26
- margin-right: $grid-unit-15;
27
- width: $icon-size;
28
- height: $icon-size;
29
- }
23
+ &__icon {
24
+ flex: 0 0 $icon-size;
25
+ margin-right: $grid-unit-15;
26
+ width: $icon-size;
27
+ height: $icon-size;
28
+ }
30
29
 
31
- h3.edit-site-template-card__template-areas-title {
32
- font-weight: 500;
33
- margin: 0 0 $grid-unit-10;
34
- }
30
+ &__template-areas-list {
31
+ margin: 0;
35
32
 
36
- .edit-site-template-card__template-areas-list {
37
- margin: 0;
33
+ > li {
34
+ margin: 0;
35
+ }
36
+ }
38
37
 
39
- > li {
40
- margin: 0;
38
+ &__template-areas-item {
39
+ width: 100%;
40
+
41
+ // Override the default padding.
42
+ &.components-button.has-icon {
43
+ padding: 0;
44
+ }
41
45
  }
42
- }
43
46
 
44
- .edit-site-template-card__template-areas-item {
45
- width: 100%;
47
+ &__header {
48
+ display: flex;
49
+ justify-content: space-between;
50
+ margin: 0 0 $grid-unit-05;
51
+ }
46
52
 
47
- // Override the default padding.
48
- &.components-button.has-icon {
49
- padding: 0;
53
+ &__actions {
54
+ line-height: 0;
55
+ > .components-button.is-small.has-icon {
56
+ padding: 0;
57
+ min-width: auto;
58
+ }
50
59
  }
51
60
  }
61
+
62
+ h3.edit-site-template-card__template-areas-title {
63
+ font-weight: 500;
64
+ margin: 0 0 $grid-unit-10;
65
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useDispatch } from '@wordpress/data';
5
+ import { __ } from '@wordpress/i18n';
6
+ import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components';
7
+ import { moreVertical } from '@wordpress/icons';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import { store as editSiteStore } from '../../../store';
13
+ import isTemplateRevertable from '../../../utils/is-template-revertable';
14
+
15
+ export default function Actions( { template } ) {
16
+ const { revertTemplate } = useDispatch( editSiteStore );
17
+ const isRevertable = isTemplateRevertable( template );
18
+ if ( ! isRevertable ) {
19
+ return null;
20
+ }
21
+ return (
22
+ <DropdownMenu
23
+ icon={ moreVertical }
24
+ label={ __( 'Actions' ) }
25
+ className="edit-site-template-card__actions"
26
+ toggleProps={ { isSmall: true } }
27
+ >
28
+ { ( { onClose } ) => (
29
+ <MenuGroup>
30
+ <MenuItem
31
+ info={ __( 'Restore to default state' ) }
32
+ onClick={ () => {
33
+ revertTemplate( template );
34
+ onClose();
35
+ } }
36
+ >
37
+ { __( 'Clear customizations' ) }
38
+ </MenuItem>
39
+ </MenuGroup>
40
+ ) }
41
+ </DropdownMenu>
42
+ );
43
+ }
@@ -16,14 +16,14 @@ import { __ } from '@wordpress/i18n';
16
16
  import { store as editSiteStore } from '../../../store';
17
17
 
18
18
  function TemplateAreaItem( { area, clientId } ) {
19
- const { selectBlock, toggleBlockHighlight } = useDispatch(
20
- blockEditorStore
21
- );
19
+ const { selectBlock, toggleBlockHighlight } =
20
+ useDispatch( blockEditorStore );
22
21
  const templatePartArea = useSelect(
23
22
  ( select ) => {
24
- const defaultAreas = select(
25
- editorStore
26
- ).__experimentalGetDefaultTemplatePartAreas();
23
+ const defaultAreas =
24
+ select(
25
+ editorStore
26
+ ).__experimentalGetDefaultTemplatePartAreas();
27
27
 
28
28
  return defaultAreas.find(
29
29
  ( defaultArea ) => defaultArea.area === area
@@ -4,8 +4,10 @@
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { TextControl } from '@wordpress/components';
6
6
  import { useEntityProp } from '@wordpress/core-data';
7
+ import { useState } from '@wordpress/element';
7
8
 
8
9
  export default function EditTemplateTitle( { template } ) {
10
+ const [ forceEmpty, setForceEmpty ] = useState( false );
9
11
  const [ title, setTitle ] = useEntityProp(
10
12
  'postType',
11
13
  template.type,
@@ -16,13 +18,19 @@ export default function EditTemplateTitle( { template } ) {
16
18
  return (
17
19
  <TextControl
18
20
  label={ __( 'Title' ) }
19
- value={ title }
21
+ value={ forceEmpty ? '' : title }
20
22
  help={ __(
21
23
  'Give the template a title that indicates its purpose, e.g. "Full Width".'
22
24
  ) }
23
25
  onChange={ ( newTitle ) => {
24
- setTitle( newTitle || template.slug );
26
+ if ( ! newTitle && ! forceEmpty ) {
27
+ setForceEmpty( true );
28
+ return;
29
+ }
30
+ setForceEmpty( false );
31
+ setTitle( newTitle );
25
32
  } }
33
+ onBlur={ () => setForceEmpty( false ) }
26
34
  />
27
35
  );
28
36
  }
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useMemo } from '@wordpress/element';
5
- import { sprintf, __ } from '@wordpress/i18n';
4
+ import { __ } from '@wordpress/i18n';
6
5
  import {
7
6
  Button,
8
7
  MenuGroup,
@@ -17,10 +16,6 @@ import { store as editorStore } from '@wordpress/editor';
17
16
  * Internal dependencies
18
17
  */
19
18
  import isTemplateRevertable from '../../utils/is-template-revertable';
20
- import {
21
- MENU_TEMPLATES,
22
- TEMPLATE_PARTS_SUB_MENUS,
23
- } from '../navigation-sidebar/navigation-panel/constants';
24
19
  import { store as editSiteStore } from '../../store';
25
20
  import TemplateAreas from './template-areas';
26
21
  import EditTemplateTitle from './edit-template-title';
@@ -34,16 +29,6 @@ export default function TemplateDetails( { template, onClose } ) {
34
29
  );
35
30
  const { revertTemplate } = useDispatch( editSiteStore );
36
31
 
37
- const templateSubMenu = useMemo( () => {
38
- if ( template?.type === 'wp_template' ) {
39
- return { title: __( 'templates' ), menu: MENU_TEMPLATES };
40
- }
41
-
42
- return TEMPLATE_PARTS_SUB_MENUS.find(
43
- ( { area } ) => area === template?.area
44
- );
45
- }, [ template ] );
46
-
47
32
  const browseAllLinkProps = useLink( {
48
33
  // TODO: We should update this to filter by template part's areas as well.
49
34
  postType: template.type,
@@ -106,11 +91,9 @@ export default function TemplateDetails( { template, onClose } ) {
106
91
  className="edit-site-template-details__show-all-button"
107
92
  { ...browseAllLinkProps }
108
93
  >
109
- { sprintf(
110
- /* translators: the template part's area name ("Headers", "Sidebars") or "templates". */
111
- __( 'Browse all %s' ),
112
- templateSubMenu.title
113
- ) }
94
+ { template?.type === 'wp_template'
95
+ ? __( 'Browse all templates' )
96
+ : __( 'Browse all template parts' ) }
114
97
  </Button>
115
98
  </div>
116
99
  );
@@ -75,14 +75,14 @@ function TemplatePartItem( {
75
75
  clientId,
76
76
  closeTemplateDetailsDropdown,
77
77
  } ) {
78
- const { selectBlock, toggleBlockHighlight } = useDispatch(
79
- blockEditorStore
80
- );
78
+ const { selectBlock, toggleBlockHighlight } =
79
+ useDispatch( blockEditorStore );
81
80
  const templatePartArea = useSelect(
82
81
  ( select ) => {
83
- const defaultAreas = select(
84
- editorStore
85
- ).__experimentalGetDefaultTemplatePartAreas();
82
+ const defaultAreas =
83
+ select(
84
+ editorStore
85
+ ).__experimentalGetDefaultTemplatePartAreas();
86
86
 
87
87
  return defaultAreas.find(
88
88
  ( defaultArea ) => defaultArea.area === templatePart.area
@@ -12,9 +12,8 @@ import ConvertToTemplatePart from './convert-to-template-part';
12
12
 
13
13
  export default function TemplatePartConverter() {
14
14
  const { clientIds, blocks } = useSelect( ( select ) => {
15
- const { getSelectedBlockClientIds, getBlocksByClientId } = select(
16
- blockEditorStore
17
- );
15
+ const { getSelectedBlockClientIds, getBlocksByClientId } =
16
+ select( blockEditorStore );
18
17
  const selectedBlockClientIds = getSelectedBlockClientIds();
19
18
  return {
20
19
  clientIds: selectedBlockClientIds,
@@ -0,0 +1,38 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import * as wpHooks from '@wordpress/hooks';
5
+ /**
6
+ * Internal dependencies
7
+ */
8
+ import ErrorBoundary from '../error-boundary';
9
+ /**
10
+ * External dependencies
11
+ */
12
+ import { render } from '@testing-library/react';
13
+
14
+ const theError = new Error( 'Kaboom' );
15
+
16
+ const ChildComponent = () => {
17
+ throw theError;
18
+ };
19
+
20
+ describe( 'Error Boundary', () => {
21
+ describe( 'when error is thrown from a Child component', () => {
22
+ it( 'calls the `editor.ErrorBoundary.errorLogged` hook action with the error object', () => {
23
+ const doAction = jest.spyOn( wpHooks, 'doAction' );
24
+
25
+ render(
26
+ <ErrorBoundary>
27
+ <ChildComponent />
28
+ </ErrorBoundary>
29
+ );
30
+
31
+ expect( doAction ).toHaveBeenCalledWith(
32
+ 'editor.ErrorBoundary.errorLogged',
33
+ theError
34
+ );
35
+ expect( console ).toHaveErrored();
36
+ } );
37
+ } );
38
+ } );
@@ -11,9 +11,8 @@ import { useLocation } from '../routes';
11
11
  import { store as editSiteStore } from '../../store';
12
12
 
13
13
  export default function URLQueryController() {
14
- const { setTemplate, setTemplatePart, setPage } = useDispatch(
15
- editSiteStore
16
- );
14
+ const { setTemplate, setTemplatePart, setPage } =
15
+ useDispatch( editSiteStore );
17
16
  const {
18
17
  params: { postId, postType },
19
18
  } = useLocation();