@wordpress/edit-site 4.8.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 (119) hide show
  1. package/CHANGELOG.md +2 -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 +79 -14
  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/global-styles/context-menu.js +6 -3
  9. package/build/components/global-styles/context-menu.js.map +1 -1
  10. package/build/components/global-styles/hooks.js +1 -1
  11. package/build/components/global-styles/hooks.js.map +1 -1
  12. package/build/components/global-styles/palette.js +2 -1
  13. package/build/components/global-styles/palette.js.map +1 -1
  14. package/build/components/global-styles/screen-block-list.js +4 -1
  15. package/build/components/global-styles/screen-block-list.js.map +1 -1
  16. package/build/components/global-styles/screen-button-color.js +80 -0
  17. package/build/components/global-styles/screen-button-color.js.map +1 -0
  18. package/build/components/global-styles/screen-colors.js +47 -7
  19. package/build/components/global-styles/screen-colors.js.map +1 -1
  20. package/build/components/global-styles/screen-root.js +4 -2
  21. package/build/components/global-styles/screen-root.js.map +1 -1
  22. package/build/components/global-styles/screen-typography-element.js +4 -0
  23. package/build/components/global-styles/screen-typography-element.js.map +1 -1
  24. package/build/components/global-styles/screen-typography.js +9 -1
  25. package/build/components/global-styles/screen-typography.js.map +1 -1
  26. package/build/components/global-styles/ui.js +11 -0
  27. package/build/components/global-styles/ui.js.map +1 -1
  28. package/build/components/global-styles/use-global-styles-output.js +40 -9
  29. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  30. package/build/components/global-styles/utils.js +3 -1
  31. package/build/components/global-styles/utils.js.map +1 -1
  32. package/build/components/header/index.js +28 -10
  33. package/build/components/header/index.js.map +1 -1
  34. package/build/components/header/more-menu/site-export.js +4 -1
  35. package/build/components/header/more-menu/site-export.js.map +1 -1
  36. package/build/components/header/undo-redo/redo.js +13 -4
  37. package/build/components/header/undo-redo/redo.js.map +1 -1
  38. package/build/components/header/undo-redo/undo.js +13 -4
  39. package/build/components/header/undo-redo/undo.js.map +1 -1
  40. package/build/components/keyboard-shortcut-help-modal/config.js +17 -0
  41. package/build/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  42. package/build/components/sidebar/template-card/index.js +19 -7
  43. package/build/components/sidebar/template-card/index.js.map +1 -1
  44. package/build/components/sidebar/template-card/template-actions.js +64 -0
  45. package/build/components/sidebar/template-card/template-actions.js.map +1 -0
  46. package/build-module/components/add-new-template/add-custom-template-modal.js +170 -0
  47. package/build-module/components/add-new-template/add-custom-template-modal.js.map +1 -0
  48. package/build-module/components/add-new-template/new-template.js +79 -17
  49. package/build-module/components/add-new-template/new-template.js.map +1 -1
  50. package/build-module/components/add-new-template/utils.js +119 -0
  51. package/build-module/components/add-new-template/utils.js.map +1 -0
  52. package/build-module/components/global-styles/context-menu.js +6 -3
  53. package/build-module/components/global-styles/context-menu.js.map +1 -1
  54. package/build-module/components/global-styles/hooks.js +1 -1
  55. package/build-module/components/global-styles/hooks.js.map +1 -1
  56. package/build-module/components/global-styles/palette.js +2 -1
  57. package/build-module/components/global-styles/palette.js.map +1 -1
  58. package/build-module/components/global-styles/screen-block-list.js +4 -1
  59. package/build-module/components/global-styles/screen-block-list.js.map +1 -1
  60. package/build-module/components/global-styles/screen-button-color.js +67 -0
  61. package/build-module/components/global-styles/screen-button-color.js.map +1 -0
  62. package/build-module/components/global-styles/screen-colors.js +48 -8
  63. package/build-module/components/global-styles/screen-colors.js.map +1 -1
  64. package/build-module/components/global-styles/screen-root.js +4 -2
  65. package/build-module/components/global-styles/screen-root.js.map +1 -1
  66. package/build-module/components/global-styles/screen-typography-element.js +4 -0
  67. package/build-module/components/global-styles/screen-typography-element.js.map +1 -1
  68. package/build-module/components/global-styles/screen-typography.js +10 -2
  69. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  70. package/build-module/components/global-styles/ui.js +10 -0
  71. package/build-module/components/global-styles/ui.js.map +1 -1
  72. package/build-module/components/global-styles/use-global-styles-output.js +39 -9
  73. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  74. package/build-module/components/global-styles/utils.js +3 -1
  75. package/build-module/components/global-styles/utils.js.map +1 -1
  76. package/build-module/components/header/index.js +29 -11
  77. package/build-module/components/header/index.js.map +1 -1
  78. package/build-module/components/header/more-menu/site-export.js +4 -1
  79. package/build-module/components/header/more-menu/site-export.js.map +1 -1
  80. package/build-module/components/header/undo-redo/redo.js +9 -3
  81. package/build-module/components/header/undo-redo/redo.js.map +1 -1
  82. package/build-module/components/header/undo-redo/undo.js +9 -3
  83. package/build-module/components/header/undo-redo/undo.js.map +1 -1
  84. package/build-module/components/keyboard-shortcut-help-modal/config.js +17 -0
  85. package/build-module/components/keyboard-shortcut-help-modal/config.js.map +1 -1
  86. package/build-module/components/sidebar/template-card/index.js +18 -7
  87. package/build-module/components/sidebar/template-card/index.js.map +1 -1
  88. package/build-module/components/sidebar/template-card/template-actions.js +49 -0
  89. package/build-module/components/sidebar/template-card/template-actions.js.map +1 -0
  90. package/build-style/style-rtl.css +167 -16
  91. package/build-style/style.css +167 -16
  92. package/package.json +29 -29
  93. package/src/components/add-new-template/add-custom-template-modal.js +231 -0
  94. package/src/components/add-new-template/new-template.js +124 -47
  95. package/src/components/add-new-template/style.scss +116 -0
  96. package/src/components/add-new-template/utils.js +125 -0
  97. package/src/components/global-styles/context-menu.js +3 -0
  98. package/src/components/global-styles/hooks.js +1 -0
  99. package/src/components/global-styles/palette.js +4 -1
  100. package/src/components/global-styles/screen-block-list.js +10 -1
  101. package/src/components/global-styles/screen-button-color.js +102 -0
  102. package/src/components/global-styles/screen-colors.js +49 -4
  103. package/src/components/global-styles/screen-root.js +8 -2
  104. package/src/components/global-styles/screen-typography-element.js +4 -0
  105. package/src/components/global-styles/screen-typography.js +17 -2
  106. package/src/components/global-styles/style.scss +10 -0
  107. package/src/components/global-styles/test/use-global-styles-output.js +82 -16
  108. package/src/components/global-styles/ui.js +13 -0
  109. package/src/components/global-styles/use-global-styles-output.js +43 -4
  110. package/src/components/global-styles/utils.js +3 -0
  111. package/src/components/header/index.js +36 -10
  112. package/src/components/header/more-menu/site-export.js +3 -0
  113. package/src/components/header/style.scss +53 -5
  114. package/src/components/header/undo-redo/redo.js +6 -1
  115. package/src/components/header/undo-redo/undo.js +6 -1
  116. package/src/components/keyboard-shortcut-help-modal/config.js +12 -0
  117. package/src/components/sidebar/template-card/index.js +15 -6
  118. package/src/components/sidebar/template-card/style.scss +49 -35
  119. package/src/components/sidebar/template-card/template-actions.js +43 -0
@@ -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';
@@ -107,47 +108,72 @@ export default function Header( {
107
108
 
108
109
  return (
109
110
  <div className="edit-site-header">
110
- <div className="edit-site-header_start">
111
+ <NavigableToolbar
112
+ className="edit-site-header_start"
113
+ aria-label={ __( 'Document tools' ) }
114
+ >
111
115
  <div className="edit-site-header__toolbar">
112
- <Button
116
+ <ToolbarItem
113
117
  ref={ inserterButton }
118
+ as={ Button }
119
+ className="edit-site-header-toolbar__inserter-toggle"
114
120
  variant="primary"
115
121
  isPressed={ isInserterOpen }
116
- className="edit-site-header-toolbar__inserter-toggle"
117
- disabled={ ! isVisualMode }
118
122
  onMouseDown={ preventDefault }
119
123
  onClick={ openInserter }
124
+ disabled={ ! isVisualMode }
120
125
  icon={ plus }
126
+ /* translators: button label text should, if possible, be under 16
127
+ characters. */
121
128
  label={ _x(
122
129
  'Toggle block inserter',
123
130
  'Generic label for block inserter button'
124
131
  ) }
132
+ showTooltip={ ! showIconLabels }
125
133
  >
126
134
  { showIconLabels &&
127
135
  ( ! isInserterOpen ? __( 'Add' ) : __( 'Close' ) ) }
128
- </Button>
136
+ </ToolbarItem>
129
137
  { isLargeViewport && (
130
138
  <>
131
139
  <ToolbarItem
132
140
  as={ ToolSelector }
141
+ showTooltip={ ! showIconLabels }
142
+ variant={
143
+ showIconLabels ? 'tertiary' : undefined
144
+ }
133
145
  disabled={ ! isVisualMode }
134
146
  />
135
- <UndoButton />
136
- <RedoButton />
137
- <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 }
138
163
  className="edit-site-header-toolbar__list-view-toggle"
139
- disabled={ ! isVisualMode }
140
164
  icon={ listView }
165
+ disabled={ ! isVisualMode }
141
166
  isPressed={ isListViewOpen }
142
167
  /* translators: button label text should, if possible, be under 16 characters. */
143
168
  label={ __( 'List View' ) }
144
169
  onClick={ toggleListView }
145
170
  shortcut={ listViewShortcut }
171
+ showTooltip={ ! showIconLabels }
146
172
  />
147
173
  </>
148
174
  ) }
149
175
  </div>
150
- </div>
176
+ </NavigableToolbar>
151
177
 
152
178
  <div className="edit-site-header_center">
153
179
  <DocumentActions
@@ -21,6 +21,9 @@ 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(
@@ -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
  ];
@@ -10,21 +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 );
22
+ const { getEditedEntityRecord } = select( coreStore );
19
23
  const { __experimentalGetTemplateInfo: getTemplateInfo } =
20
24
  select( editorStore );
21
25
 
22
26
  const postType = getEditedPostType();
23
27
  const postId = getEditedPostId();
24
- const record = getEntityRecord( 'postType', postType, postId );
28
+ const record = getEditedEntityRecord( 'postType', postType, postId );
29
+
25
30
  const info = record ? getTemplateInfo( record ) : {};
26
31
 
27
- return info;
32
+ return { info, template: record };
28
33
  }, [] );
29
34
 
30
35
  if ( ! title && ! description ) {
@@ -35,11 +40,15 @@ export default function TemplateCard() {
35
40
  <div className="edit-site-template-card">
36
41
  <Icon className="edit-site-template-card__icon" icon={ icon } />
37
42
  <div className="edit-site-template-card__content">
38
- <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>
39
49
  <div className="edit-site-template-card__description">
40
50
  { description }
41
51
  </div>
42
-
43
52
  <TemplateAreas />
44
53
  </div>
45
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
+ }