@wordpress/edit-site 4.6.0 → 4.9.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 (205) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/components/add-new-template/add-custom-template-modal.js +185 -0
  3. package/build/components/add-new-template/add-custom-template-modal.js.map +1 -0
  4. package/build/components/add-new-template/new-template.js +92 -32
  5. package/build/components/add-new-template/new-template.js.map +1 -1
  6. package/build/components/add-new-template/utils.js +139 -0
  7. package/build/components/add-new-template/utils.js.map +1 -0
  8. package/build/components/block-editor/block-inspector-button.js.map +1 -1
  9. package/build/components/block-editor/index.js.map +1 -1
  10. package/build/components/code-editor/code-editor-text-area.js +11 -9
  11. package/build/components/code-editor/code-editor-text-area.js.map +1 -1
  12. package/build/components/edit-template-part-menu-button/index.js.map +1 -1
  13. package/build/components/editor/index.js.map +1 -1
  14. package/build/components/global-styles/context-menu.js +6 -3
  15. package/build/components/global-styles/context-menu.js.map +1 -1
  16. package/build/components/global-styles/global-styles-provider.js.map +1 -1
  17. package/build/components/global-styles/gradients-palette-panel.js +3 -7
  18. package/build/components/global-styles/gradients-palette-panel.js.map +1 -1
  19. package/build/components/global-styles/hooks.js +1 -1
  20. package/build/components/global-styles/hooks.js.map +1 -1
  21. package/build/components/global-styles/palette.js +2 -1
  22. package/build/components/global-styles/palette.js.map +1 -1
  23. package/build/components/global-styles/preview.js +13 -2
  24. package/build/components/global-styles/preview.js.map +1 -1
  25. package/build/components/global-styles/screen-block-list.js +4 -1
  26. package/build/components/global-styles/screen-block-list.js.map +1 -1
  27. package/build/components/global-styles/screen-button-color.js +80 -0
  28. package/build/components/global-styles/screen-button-color.js.map +1 -0
  29. package/build/components/global-styles/screen-colors.js +47 -7
  30. package/build/components/global-styles/screen-colors.js.map +1 -1
  31. package/build/components/global-styles/screen-root.js +4 -2
  32. package/build/components/global-styles/screen-root.js.map +1 -1
  33. package/build/components/global-styles/screen-style-variations.js +9 -1
  34. package/build/components/global-styles/screen-style-variations.js.map +1 -1
  35. package/build/components/global-styles/screen-typography-element.js +4 -0
  36. package/build/components/global-styles/screen-typography-element.js.map +1 -1
  37. package/build/components/global-styles/screen-typography.js +9 -1
  38. package/build/components/global-styles/screen-typography.js.map +1 -1
  39. package/build/components/global-styles/ui.js +11 -0
  40. package/build/components/global-styles/ui.js.map +1 -1
  41. package/build/components/global-styles/use-global-styles-output.js +40 -9
  42. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  43. package/build/components/global-styles/utils.js +3 -1
  44. package/build/components/global-styles/utils.js.map +1 -1
  45. package/build/components/header/index.js +28 -10
  46. package/build/components/header/index.js.map +1 -1
  47. package/build/components/header/mode-switcher/index.js.map +1 -1
  48. package/build/components/header/more-menu/copy-content-menu-item.js +1 -1
  49. package/build/components/header/more-menu/copy-content-menu-item.js.map +1 -1
  50. package/build/components/header/more-menu/site-export.js +4 -1
  51. package/build/components/header/more-menu/site-export.js.map +1 -1
  52. package/build/components/header/undo-redo/redo.js +13 -4
  53. package/build/components/header/undo-redo/redo.js.map +1 -1
  54. package/build/components/header/undo-redo/undo.js +13 -4
  55. package/build/components/header/undo-redo/undo.js.map +1 -1
  56. package/build/components/keyboard-shortcut-help-modal/config.js +17 -0
  57. package/build/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  58. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  59. package/build/components/list/actions/index.js.map +1 -1
  60. package/build/components/list/actions/rename-menu-item.js.map +1 -1
  61. package/build/components/list/added-by.js.map +1 -1
  62. package/build/components/navigation-sidebar/index.js.map +1 -1
  63. package/build/components/save-button/index.js.map +1 -1
  64. package/build/components/sidebar/index.js.map +1 -1
  65. package/build/components/sidebar/navigation-menu-sidebar/navigation-inspector.js.map +1 -1
  66. package/build/components/sidebar/template-card/index.js +19 -7
  67. package/build/components/sidebar/template-card/index.js.map +1 -1
  68. package/build/components/sidebar/template-card/template-actions.js +64 -0
  69. package/build/components/sidebar/template-card/template-actions.js.map +1 -0
  70. package/build/components/sidebar/template-card/template-areas.js.map +1 -1
  71. package/build/components/template-details/template-areas.js.map +1 -1
  72. package/build/components/template-part-converter/index.js.map +1 -1
  73. package/build/components/url-query-controller/index.js.map +1 -1
  74. package/build/store/actions.js.map +1 -1
  75. package/build/store/selectors.js.map +1 -1
  76. package/build-module/components/add-new-template/add-custom-template-modal.js +170 -0
  77. package/build-module/components/add-new-template/add-custom-template-modal.js.map +1 -0
  78. package/build-module/components/add-new-template/new-template.js +92 -35
  79. package/build-module/components/add-new-template/new-template.js.map +1 -1
  80. package/build-module/components/add-new-template/utils.js +119 -0
  81. package/build-module/components/add-new-template/utils.js.map +1 -0
  82. package/build-module/components/block-editor/block-inspector-button.js.map +1 -1
  83. package/build-module/components/block-editor/index.js.map +1 -1
  84. package/build-module/components/code-editor/code-editor-text-area.js +12 -10
  85. package/build-module/components/code-editor/code-editor-text-area.js.map +1 -1
  86. package/build-module/components/edit-template-part-menu-button/index.js.map +1 -1
  87. package/build-module/components/editor/index.js.map +1 -1
  88. package/build-module/components/global-styles/context-menu.js +6 -3
  89. package/build-module/components/global-styles/context-menu.js.map +1 -1
  90. package/build-module/components/global-styles/global-styles-provider.js.map +1 -1
  91. package/build-module/components/global-styles/gradients-palette-panel.js +3 -5
  92. package/build-module/components/global-styles/gradients-palette-panel.js.map +1 -1
  93. package/build-module/components/global-styles/hooks.js +1 -1
  94. package/build-module/components/global-styles/hooks.js.map +1 -1
  95. package/build-module/components/global-styles/palette.js +2 -1
  96. package/build-module/components/global-styles/palette.js.map +1 -1
  97. package/build-module/components/global-styles/preview.js +14 -3
  98. package/build-module/components/global-styles/preview.js.map +1 -1
  99. package/build-module/components/global-styles/screen-block-list.js +4 -1
  100. package/build-module/components/global-styles/screen-block-list.js.map +1 -1
  101. package/build-module/components/global-styles/screen-button-color.js +67 -0
  102. package/build-module/components/global-styles/screen-button-color.js.map +1 -0
  103. package/build-module/components/global-styles/screen-colors.js +48 -8
  104. package/build-module/components/global-styles/screen-colors.js.map +1 -1
  105. package/build-module/components/global-styles/screen-root.js +4 -2
  106. package/build-module/components/global-styles/screen-root.js.map +1 -1
  107. package/build-module/components/global-styles/screen-style-variations.js +9 -1
  108. package/build-module/components/global-styles/screen-style-variations.js.map +1 -1
  109. package/build-module/components/global-styles/screen-typography-element.js +4 -0
  110. package/build-module/components/global-styles/screen-typography-element.js.map +1 -1
  111. package/build-module/components/global-styles/screen-typography.js +10 -2
  112. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  113. package/build-module/components/global-styles/ui.js +10 -0
  114. package/build-module/components/global-styles/ui.js.map +1 -1
  115. package/build-module/components/global-styles/use-global-styles-output.js +39 -9
  116. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  117. package/build-module/components/global-styles/utils.js +3 -1
  118. package/build-module/components/global-styles/utils.js.map +1 -1
  119. package/build-module/components/header/index.js +29 -11
  120. package/build-module/components/header/index.js.map +1 -1
  121. package/build-module/components/header/mode-switcher/index.js.map +1 -1
  122. package/build-module/components/header/more-menu/copy-content-menu-item.js +1 -1
  123. package/build-module/components/header/more-menu/copy-content-menu-item.js.map +1 -1
  124. package/build-module/components/header/more-menu/site-export.js +4 -1
  125. package/build-module/components/header/more-menu/site-export.js.map +1 -1
  126. package/build-module/components/header/undo-redo/redo.js +9 -3
  127. package/build-module/components/header/undo-redo/redo.js.map +1 -1
  128. package/build-module/components/header/undo-redo/undo.js +9 -3
  129. package/build-module/components/header/undo-redo/undo.js.map +1 -1
  130. package/build-module/components/keyboard-shortcut-help-modal/config.js +17 -0
  131. package/build-module/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  132. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  133. package/build-module/components/list/actions/index.js.map +1 -1
  134. package/build-module/components/list/actions/rename-menu-item.js.map +1 -1
  135. package/build-module/components/list/added-by.js.map +1 -1
  136. package/build-module/components/navigation-sidebar/index.js.map +1 -1
  137. package/build-module/components/save-button/index.js.map +1 -1
  138. package/build-module/components/sidebar/index.js.map +1 -1
  139. package/build-module/components/sidebar/navigation-menu-sidebar/navigation-inspector.js.map +1 -1
  140. package/build-module/components/sidebar/template-card/index.js +18 -7
  141. package/build-module/components/sidebar/template-card/index.js.map +1 -1
  142. package/build-module/components/sidebar/template-card/template-actions.js +49 -0
  143. package/build-module/components/sidebar/template-card/template-actions.js.map +1 -0
  144. package/build-module/components/sidebar/template-card/template-areas.js.map +1 -1
  145. package/build-module/components/template-details/template-areas.js.map +1 -1
  146. package/build-module/components/template-part-converter/index.js.map +1 -1
  147. package/build-module/components/url-query-controller/index.js.map +1 -1
  148. package/build-module/store/actions.js.map +1 -1
  149. package/build-module/store/selectors.js.map +1 -1
  150. package/build-style/style-rtl.css +170 -23
  151. package/build-style/style.css +170 -23
  152. package/package.json +30 -30
  153. package/src/components/add-new-template/add-custom-template-modal.js +231 -0
  154. package/src/components/add-new-template/new-template.js +135 -59
  155. package/src/components/add-new-template/style.scss +116 -0
  156. package/src/components/add-new-template/utils.js +125 -0
  157. package/src/components/block-editor/block-inspector-button.js +2 -3
  158. package/src/components/block-editor/index.js +4 -9
  159. package/src/components/code-editor/code-editor-text-area.js +12 -7
  160. package/src/components/edit-template-part-menu-button/index.js +2 -3
  161. package/src/components/editor/index.js +4 -5
  162. package/src/components/global-styles/context-menu.js +3 -0
  163. package/src/components/global-styles/global-styles-provider.js +4 -8
  164. package/src/components/global-styles/gradients-palette-panel.js +2 -5
  165. package/src/components/global-styles/hooks.js +5 -3
  166. package/src/components/global-styles/palette.js +4 -1
  167. package/src/components/global-styles/preview.js +17 -2
  168. package/src/components/global-styles/screen-block-list.js +14 -5
  169. package/src/components/global-styles/screen-button-color.js +102 -0
  170. package/src/components/global-styles/screen-colors.js +49 -4
  171. package/src/components/global-styles/screen-root.js +12 -5
  172. package/src/components/global-styles/screen-style-variations.js +10 -4
  173. package/src/components/global-styles/screen-typography-element.js +4 -0
  174. package/src/components/global-styles/screen-typography.js +17 -2
  175. package/src/components/global-styles/style.scss +10 -0
  176. package/src/components/global-styles/test/use-global-styles-output.js +82 -16
  177. package/src/components/global-styles/ui.js +13 -0
  178. package/src/components/global-styles/use-global-styles-output.js +43 -4
  179. package/src/components/global-styles/utils.js +3 -0
  180. package/src/components/header/index.js +38 -13
  181. package/src/components/header/mode-switcher/index.js +4 -4
  182. package/src/components/header/more-menu/copy-content-menu-item.js +3 -4
  183. package/src/components/header/more-menu/site-export.js +5 -3
  184. package/src/components/header/style.scss +53 -5
  185. package/src/components/header/undo-redo/redo.js +6 -1
  186. package/src/components/header/undo-redo/undo.js +6 -1
  187. package/src/components/keyboard-shortcut-help-modal/config.js +12 -0
  188. package/src/components/keyboard-shortcuts/index.js +6 -10
  189. package/src/components/list/actions/index.js +2 -3
  190. package/src/components/list/actions/rename-menu-item.js +4 -6
  191. package/src/components/list/added-by.js +4 -3
  192. package/src/components/navigation-sidebar/index.js +2 -4
  193. package/src/components/save-button/index.js +2 -4
  194. package/src/components/sidebar/index.js +6 -6
  195. package/src/components/sidebar/navigation-menu-sidebar/navigation-inspector.js +6 -9
  196. package/src/components/sidebar/navigation-menu-sidebar/style.scss +0 -1
  197. package/src/components/sidebar/template-card/index.js +17 -9
  198. package/src/components/sidebar/template-card/style.scss +49 -35
  199. package/src/components/sidebar/template-card/template-actions.js +43 -0
  200. package/src/components/sidebar/template-card/template-areas.js +6 -6
  201. package/src/components/template-details/template-areas.js +6 -6
  202. package/src/components/template-part-converter/index.js +2 -3
  203. package/src/components/url-query-controller/index.js +2 -3
  204. package/src/store/actions.js +257 -233
  205. package/src/store/selectors.js +9 -10
@@ -283,7 +283,14 @@ export const getNodesWithStyles = ( tree, blockSelectors ) => {
283
283
  styles: value,
284
284
  selector: blockSelectors[ blockName ].selector
285
285
  .split( ',' )
286
- .map( ( sel ) => sel + ' ' + ELEMENTS[ elementName ] )
286
+ .map( ( sel ) => {
287
+ const elementSelectors =
288
+ ELEMENTS[ elementName ].split( ',' );
289
+ return elementSelectors.map(
290
+ ( elementSelector ) =>
291
+ sel + ' ' + elementSelector
292
+ );
293
+ } )
287
294
  .join( ',' ),
288
295
  } );
289
296
  }
@@ -390,10 +397,42 @@ export const toStyles = ( tree, blockSelectors, hasBlockGapSupport ) => {
390
397
 
391
398
  // Process the remaning block styles (they use either normal block class or __experimentalSelector).
392
399
  const declarations = getStylesDeclarations( styles );
393
- if ( declarations.length === 0 ) {
394
- return;
400
+ if ( declarations?.length ) {
401
+ ruleset = ruleset + `${ selector }{${ declarations.join( ';' ) };}`;
402
+ }
403
+
404
+ // Check for pseudo selector in `styles` and handle separately.
405
+ const psuedoSelectorStyles = Object.entries( styles ).filter(
406
+ ( [ key ] ) => key.startsWith( ':' )
407
+ );
408
+
409
+ if ( psuedoSelectorStyles?.length ) {
410
+ psuedoSelectorStyles.forEach( ( [ pseudoKey, pseudoRule ] ) => {
411
+ const pseudoDeclarations = getStylesDeclarations( pseudoRule );
412
+
413
+ if ( ! pseudoDeclarations?.length ) {
414
+ return;
415
+ }
416
+
417
+ // `selector` maybe provided in a form
418
+ // where block level selectors have sub element
419
+ // selectors appended to them as a comma seperated
420
+ // string.
421
+ // e.g. `h1 a,h2 a,h3 a,h4 a,h5 a,h6 a`;
422
+ // Split and append pseudo selector to create
423
+ // the proper rules to target the elements.
424
+ const _selector = selector
425
+ .split( ',' )
426
+ .map( ( sel ) => sel + pseudoKey )
427
+ .join( ',' );
428
+
429
+ const psuedoRule = `${ _selector }{${ pseudoDeclarations.join(
430
+ ';'
431
+ ) };}`;
432
+
433
+ ruleset = ruleset + psuedoRule;
434
+ } );
395
435
  }
396
- ruleset = ruleset + `${ selector }{${ declarations.join( ';' ) };}`;
397
436
  } );
398
437
 
399
438
  /* Add alignment / layout styles */
@@ -11,6 +11,7 @@ export const ROOT_BLOCK_SUPPORTS = [
11
11
  'backgroundColor',
12
12
  'color',
13
13
  'linkColor',
14
+ 'buttonColor',
14
15
  'fontFamily',
15
16
  'fontSize',
16
17
  'fontStyle',
@@ -75,6 +76,8 @@ const STYLE_PATH_TO_CSS_VAR_INFIX = {
75
76
  'color.background': 'color',
76
77
  'color.text': 'color',
77
78
  'elements.link.color.text': 'color',
79
+ 'elements.button.color.text': 'color',
80
+ 'elements.button.backgroundColor': 'background-color',
78
81
  'color.gradient': 'gradient',
79
82
  'typography.fontSize': 'font-size',
80
83
  'typography.fontFamily': 'font-family',
@@ -6,6 +6,7 @@ import { useViewportMatch } from '@wordpress/compose';
6
6
  import {
7
7
  ToolSelector,
8
8
  __experimentalPreviewOptions as PreviewOptions,
9
+ NavigableToolbar,
9
10
  } from '@wordpress/block-editor';
10
11
  import { useSelect, useDispatch } from '@wordpress/data';
11
12
  import { PinnedItems } from '@wordpress/interface';
@@ -57,9 +58,8 @@ export default function Header( {
57
58
  getEditorMode,
58
59
  } = select( editSiteStore );
59
60
  const { getEditedEntityRecord } = select( coreStore );
60
- const { __experimentalGetTemplateInfo: getTemplateInfo } = select(
61
- editorStore
62
- );
61
+ const { __experimentalGetTemplateInfo: getTemplateInfo } =
62
+ select( editorStore );
63
63
  const { getShortcutRepresentation } = select( keyboardShortcutsStore );
64
64
 
65
65
  const postType = getEditedPostType();
@@ -108,47 +108,72 @@ export default function Header( {
108
108
 
109
109
  return (
110
110
  <div className="edit-site-header">
111
- <div className="edit-site-header_start">
111
+ <NavigableToolbar
112
+ className="edit-site-header_start"
113
+ aria-label={ __( 'Document tools' ) }
114
+ >
112
115
  <div className="edit-site-header__toolbar">
113
- <Button
116
+ <ToolbarItem
114
117
  ref={ inserterButton }
118
+ as={ Button }
119
+ className="edit-site-header-toolbar__inserter-toggle"
115
120
  variant="primary"
116
121
  isPressed={ isInserterOpen }
117
- className="edit-site-header-toolbar__inserter-toggle"
118
- disabled={ ! isVisualMode }
119
122
  onMouseDown={ preventDefault }
120
123
  onClick={ openInserter }
124
+ disabled={ ! isVisualMode }
121
125
  icon={ plus }
126
+ /* translators: button label text should, if possible, be under 16
127
+ characters. */
122
128
  label={ _x(
123
129
  'Toggle block inserter',
124
130
  'Generic label for block inserter button'
125
131
  ) }
132
+ showTooltip={ ! showIconLabels }
126
133
  >
127
134
  { showIconLabels &&
128
135
  ( ! isInserterOpen ? __( 'Add' ) : __( 'Close' ) ) }
129
- </Button>
136
+ </ToolbarItem>
130
137
  { isLargeViewport && (
131
138
  <>
132
139
  <ToolbarItem
133
140
  as={ ToolSelector }
141
+ showTooltip={ ! showIconLabels }
142
+ variant={
143
+ showIconLabels ? 'tertiary' : undefined
144
+ }
134
145
  disabled={ ! isVisualMode }
135
146
  />
136
- <UndoButton />
137
- <RedoButton />
138
- <Button
147
+ <ToolbarItem
148
+ as={ UndoButton }
149
+ showTooltip={ ! showIconLabels }
150
+ variant={
151
+ showIconLabels ? 'tertiary' : undefined
152
+ }
153
+ />
154
+ <ToolbarItem
155
+ as={ RedoButton }
156
+ showTooltip={ ! showIconLabels }
157
+ variant={
158
+ showIconLabels ? 'tertiary' : undefined
159
+ }
160
+ />
161
+ <ToolbarItem
162
+ as={ Button }
139
163
  className="edit-site-header-toolbar__list-view-toggle"
140
- disabled={ ! isVisualMode }
141
164
  icon={ listView }
165
+ disabled={ ! isVisualMode }
142
166
  isPressed={ isListViewOpen }
143
167
  /* translators: button label text should, if possible, be under 16 characters. */
144
168
  label={ __( 'List View' ) }
145
169
  onClick={ toggleListView }
146
170
  shortcut={ listViewShortcut }
171
+ showTooltip={ ! showIconLabels }
147
172
  />
148
173
  </>
149
174
  ) }
150
175
  </div>
151
- </div>
176
+ </NavigableToolbar>
152
177
 
153
178
  <div className="edit-site-header_center">
154
179
  <DocumentActions
@@ -36,10 +36,10 @@ function ModeSwitcher() {
36
36
  shortcut: select(
37
37
  keyboardShortcutsStore
38
38
  ).getShortcutRepresentation( 'core/edit-site/toggle-mode' ),
39
- isRichEditingEnabled: select( editSiteStore ).getSettings()
40
- .richEditingEnabled,
41
- isCodeEditingEnabled: select( editSiteStore ).getSettings()
42
- .codeEditingEnabled,
39
+ isRichEditingEnabled:
40
+ select( editSiteStore ).getSettings().richEditingEnabled,
41
+ isCodeEditingEnabled:
42
+ select( editSiteStore ).getSettings().codeEditingEnabled,
43
43
  mode: select( editSiteStore ).getEditorMode(),
44
44
  } ),
45
45
  []
@@ -18,9 +18,8 @@ export default function CopyContentMenuItem() {
18
18
  const { createNotice } = useDispatch( noticesStore );
19
19
  const getText = useSelect( ( select ) => {
20
20
  return () => {
21
- const { getEditedPostId, getEditedPostType } = select(
22
- editSiteStore
23
- );
21
+ const { getEditedPostId, getEditedPostType } =
22
+ select( editSiteStore );
24
23
  const { getEditedEntityRecord } = select( coreStore );
25
24
  const record = getEditedEntityRecord(
26
25
  'postType',
@@ -49,5 +48,5 @@ export default function CopyContentMenuItem() {
49
48
 
50
49
  const ref = useCopyToClipboard( getText, onSuccess );
51
50
 
52
- return <MenuItem ref={ ref }>{ __( 'Copy all content' ) }</MenuItem>;
51
+ return <MenuItem ref={ ref }>{ __( 'Copy all blocks' ) }</MenuItem>;
53
52
  }
@@ -21,14 +21,16 @@ export default function SiteExport() {
21
21
  const response = await apiFetch( {
22
22
  path: '/wp-block-editor/v1/export',
23
23
  parse: false,
24
+ headers: {
25
+ Accept: 'application/zip',
26
+ },
24
27
  } );
25
28
  const blob = await response.blob();
26
29
  const contentDisposition = response.headers.get(
27
30
  'content-disposition'
28
31
  );
29
- const contentDispositionMatches = contentDisposition.match(
30
- /=(.+)\.zip/
31
- );
32
+ const contentDispositionMatches =
33
+ contentDisposition.match( /=(.+)\.zip/ );
32
34
  const fileName = contentDispositionMatches[ 1 ]
33
35
  ? contentDispositionMatches[ 1 ]
34
36
  : 'edit-site-export';
@@ -16,9 +16,14 @@ $header-toolbar-min-width: 335px;
16
16
  @include reduce-motion("transition");
17
17
  }
18
18
 
19
- .edit-site-header_start,
19
+ .edit-site-header_start {
20
+ display: flex;
21
+ border: none;
22
+ }
23
+
20
24
  .edit-site-header_end {
21
25
  display: flex;
26
+ justify-content: flex-end;
22
27
  }
23
28
 
24
29
  .edit-site-header_center {
@@ -33,10 +38,6 @@ $header-toolbar-min-width: 335px;
33
38
  // See https://dev.w3.org/csswg/css-flexbox/#min-size-auto
34
39
  min-width: 0;
35
40
  }
36
-
37
- .edit-site-header_end {
38
- justify-content: flex-end;
39
- }
40
41
  }
41
42
 
42
43
  // Keeps the document title centered when the sidebar is open
@@ -152,6 +153,49 @@ body.is-navigation-sidebar-open {
152
153
  }
153
154
  }
154
155
 
156
+ .edit-site-header_start {
157
+ display: flex;
158
+ border: none;
159
+
160
+ // The Toolbar component adds different styles to buttons, so we reset them
161
+ // here to the original button styles
162
+ .edit-site-header__toolbar > .components-button.has-icon,
163
+ .edit-site-header__toolbar > .components-dropdown > .components-button.has-icon {
164
+ height: $button-size;
165
+ min-width: $button-size;
166
+ padding: 6px;
167
+
168
+ &.is-pressed {
169
+ background: $gray-900;
170
+ }
171
+
172
+ &:focus:not(:disabled) {
173
+ box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 $border-width $white;
174
+ outline: 1px solid transparent;
175
+ }
176
+
177
+ &::before {
178
+ display: none;
179
+ }
180
+ }
181
+
182
+ .edit-site-header__toolbar > .edit-site-header-toolbar__inserter-toggle.has-icon {
183
+ margin-right: $grid-unit-10;
184
+ // Special dimensions for this button.
185
+ min-width: 32px;
186
+ width: 32px;
187
+ height: 32px;
188
+ padding: 0;
189
+ }
190
+
191
+ .edit-site-header__toolbar > .edit-site-header-toolbar__inserter-toggle.has-text.has-icon {
192
+ width: auto;
193
+ padding: 0 $grid-unit-10;
194
+ }
195
+
196
+
197
+ }
198
+
155
199
  // Button text label styles
156
200
 
157
201
  .show-icon-labels .edit-site-header {
@@ -192,4 +236,8 @@ body.is-navigation-sidebar-open {
192
236
  height: 36px;
193
237
  padding: 0 6px;
194
238
  }
239
+
240
+ .edit-site-header_start .edit-site-header__toolbar > * + * {
241
+ margin-left: $grid-unit-10;
242
+ }
195
243
  }
@@ -7,8 +7,9 @@ import { useSelect, useDispatch } from '@wordpress/data';
7
7
  import { redo as redoIcon, undo as undoIcon } 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 RedoButton() {
12
+ function RedoButton( props, ref ) {
12
13
  const hasRedo = useSelect(
13
14
  ( select ) => select( coreStore ).hasRedo(),
14
15
  []
@@ -16,6 +17,8 @@ export default function RedoButton() {
16
17
  const { redo } = useDispatch( coreStore );
17
18
  return (
18
19
  <Button
20
+ { ...props }
21
+ ref={ ref }
19
22
  icon={ ! isRTL() ? redoIcon : undoIcon }
20
23
  label={ __( 'Redo' ) }
21
24
  shortcut={ displayShortcut.primaryShift( 'z' ) }
@@ -27,3 +30,5 @@ export default function RedoButton() {
27
30
  />
28
31
  );
29
32
  }
33
+
34
+ export default forwardRef( RedoButton );
@@ -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
  ];
@@ -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
@@ -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;
@@ -14,7 +14,6 @@
14
14
  padding: $grid-unit-20;
15
15
 
16
16
  .block-editor-list-view-leaf .block-editor-list-view-block-contents {
17
- align-items: flex-start;
18
17
  white-space: normal;
19
18
  }
20
19
 
@@ -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>