@wordpress/editor 14.11.0 → 14.12.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 (165) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +0 -8
  3. package/build/components/collab-sidebar/add-comment.js +5 -6
  4. package/build/components/collab-sidebar/add-comment.js.map +1 -1
  5. package/build/components/collab-sidebar/index.js +75 -73
  6. package/build/components/collab-sidebar/index.js.map +1 -1
  7. package/build/components/commands/index.js +142 -34
  8. package/build/components/commands/index.js.map +1 -1
  9. package/build/components/create-template-part-modal/index.js +1 -0
  10. package/build/components/create-template-part-modal/index.js.map +1 -1
  11. package/build/components/document-bar/index.js +9 -3
  12. package/build/components/document-bar/index.js.map +1 -1
  13. package/build/components/document-tools/index.js +8 -4
  14. package/build/components/document-tools/index.js.map +1 -1
  15. package/build/components/editor-interface/index.js +1 -2
  16. package/build/components/editor-interface/index.js.map +1 -1
  17. package/build/components/global-styles-provider/index.js +20 -8
  18. package/build/components/global-styles-provider/index.js.map +1 -1
  19. package/build/components/header/index.js +10 -12
  20. package/build/components/header/index.js.map +1 -1
  21. package/build/components/more-menu/index.js +9 -7
  22. package/build/components/more-menu/index.js.map +1 -1
  23. package/build/components/post-taxonomies/flat-term-selector.js +10 -8
  24. package/build/components/post-taxonomies/flat-term-selector.js.map +1 -1
  25. package/build/components/post-template/swap-template-button.js +0 -3
  26. package/build/components/post-template/swap-template-button.js.map +1 -1
  27. package/build/components/post-transform-panel/index.js +0 -3
  28. package/build/components/post-transform-panel/index.js.map +1 -1
  29. package/build/components/preferences-modal/index.js +26 -22
  30. package/build/components/preferences-modal/index.js.map +1 -1
  31. package/build/components/preview-dropdown/index.js +23 -4
  32. package/build/components/preview-dropdown/index.js.map +1 -1
  33. package/build/components/provider/use-block-editor-settings.js +10 -9
  34. package/build/components/provider/use-block-editor-settings.js.map +1 -1
  35. package/build/components/sidebar/post-summary.js +2 -2
  36. package/build/components/sidebar/post-summary.js.map +1 -1
  37. package/build/components/start-page-options/index.js +0 -3
  38. package/build/components/start-page-options/index.js.map +1 -1
  39. package/build/components/start-template-options/index.js +0 -3
  40. package/build/components/start-template-options/index.js.map +1 -1
  41. package/build/components/visual-editor/index.js +5 -2
  42. package/build/components/visual-editor/index.js.map +1 -1
  43. package/build/store/actions.js +65 -16
  44. package/build/store/actions.js.map +1 -1
  45. package/build/store/constants.js +0 -2
  46. package/build/store/constants.js.map +1 -1
  47. package/build/store/index.js +0 -4
  48. package/build/store/index.js.map +1 -1
  49. package/build/store/selectors.js +2 -2
  50. package/build/store/selectors.js.map +1 -1
  51. package/build-module/components/collab-sidebar/add-comment.js +5 -6
  52. package/build-module/components/collab-sidebar/add-comment.js.map +1 -1
  53. package/build-module/components/collab-sidebar/index.js +76 -74
  54. package/build-module/components/collab-sidebar/index.js.map +1 -1
  55. package/build-module/components/commands/index.js +145 -38
  56. package/build-module/components/commands/index.js.map +1 -1
  57. package/build-module/components/create-template-part-modal/index.js +1 -0
  58. package/build-module/components/create-template-part-modal/index.js.map +1 -1
  59. package/build-module/components/document-bar/index.js +10 -4
  60. package/build-module/components/document-bar/index.js.map +1 -1
  61. package/build-module/components/document-tools/index.js +8 -4
  62. package/build-module/components/document-tools/index.js.map +1 -1
  63. package/build-module/components/editor-interface/index.js +1 -2
  64. package/build-module/components/editor-interface/index.js.map +1 -1
  65. package/build-module/components/global-styles-provider/index.js +20 -8
  66. package/build-module/components/global-styles-provider/index.js.map +1 -1
  67. package/build-module/components/header/index.js +10 -12
  68. package/build-module/components/header/index.js.map +1 -1
  69. package/build-module/components/more-menu/index.js +9 -7
  70. package/build-module/components/more-menu/index.js.map +1 -1
  71. package/build-module/components/post-taxonomies/flat-term-selector.js +10 -8
  72. package/build-module/components/post-taxonomies/flat-term-selector.js.map +1 -1
  73. package/build-module/components/post-template/swap-template-button.js +0 -3
  74. package/build-module/components/post-template/swap-template-button.js.map +1 -1
  75. package/build-module/components/post-transform-panel/index.js +0 -3
  76. package/build-module/components/post-transform-panel/index.js.map +1 -1
  77. package/build-module/components/preferences-modal/index.js +26 -22
  78. package/build-module/components/preferences-modal/index.js.map +1 -1
  79. package/build-module/components/preview-dropdown/index.js +24 -5
  80. package/build-module/components/preview-dropdown/index.js.map +1 -1
  81. package/build-module/components/provider/use-block-editor-settings.js +11 -10
  82. package/build-module/components/provider/use-block-editor-settings.js.map +1 -1
  83. package/build-module/components/sidebar/post-summary.js +2 -2
  84. package/build-module/components/sidebar/post-summary.js.map +1 -1
  85. package/build-module/components/start-page-options/index.js +0 -3
  86. package/build-module/components/start-page-options/index.js.map +1 -1
  87. package/build-module/components/start-template-options/index.js +0 -3
  88. package/build-module/components/start-template-options/index.js.map +1 -1
  89. package/build-module/components/visual-editor/index.js +5 -2
  90. package/build-module/components/visual-editor/index.js.map +1 -1
  91. package/build-module/store/actions.js +61 -14
  92. package/build-module/store/actions.js.map +1 -1
  93. package/build-module/store/constants.js +0 -2
  94. package/build-module/store/constants.js.map +1 -1
  95. package/build-module/store/index.js +0 -4
  96. package/build-module/store/index.js.map +1 -1
  97. package/build-module/store/selectors.js +2 -2
  98. package/build-module/store/selectors.js.map +1 -1
  99. package/build-style/style-rtl.css +22 -6
  100. package/build-style/style.css +22 -6
  101. package/build-types/components/collab-sidebar/add-comment.d.ts.map +1 -1
  102. package/build-types/components/collab-sidebar/index.d.ts.map +1 -1
  103. package/build-types/components/commands/index.d.ts.map +1 -1
  104. package/build-types/components/create-template-part-modal/index.d.ts.map +1 -1
  105. package/build-types/components/document-bar/index.d.ts.map +1 -1
  106. package/build-types/components/document-tools/index.d.ts.map +1 -1
  107. package/build-types/components/editor-interface/index.d.ts.map +1 -1
  108. package/build-types/components/global-styles-provider/index.d.ts.map +1 -1
  109. package/build-types/components/header/index.d.ts +1 -2
  110. package/build-types/components/header/index.d.ts.map +1 -1
  111. package/build-types/components/more-menu/index.d.ts.map +1 -1
  112. package/build-types/components/post-taxonomies/flat-term-selector.d.ts.map +1 -1
  113. package/build-types/components/post-template/hooks.d.ts +2 -2
  114. package/build-types/components/post-template/swap-template-button.d.ts.map +1 -1
  115. package/build-types/components/post-transform-panel/index.d.ts.map +1 -1
  116. package/build-types/components/preferences-modal/index.d.ts.map +1 -1
  117. package/build-types/components/preview-dropdown/index.d.ts.map +1 -1
  118. package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
  119. package/build-types/components/start-page-options/index.d.ts.map +1 -1
  120. package/build-types/components/start-template-options/index.d.ts.map +1 -1
  121. package/build-types/components/visual-editor/index.d.ts.map +1 -1
  122. package/build-types/dataviews/store/reducer.d.ts +5 -2
  123. package/build-types/dataviews/store/reducer.d.ts.map +1 -1
  124. package/build-types/lock-unlock.d.ts +2 -2
  125. package/build-types/store/actions.d.ts +9 -1
  126. package/build-types/store/actions.d.ts.map +1 -1
  127. package/build-types/store/constants.d.ts +0 -2
  128. package/build-types/store/constants.d.ts.map +1 -1
  129. package/build-types/store/index.d.ts +9 -11
  130. package/build-types/store/index.d.ts.map +1 -1
  131. package/build-types/store/reducer.d.ts +24 -4
  132. package/build-types/store/reducer.d.ts.map +1 -1
  133. package/build-types/store/selectors.d.ts +3 -3
  134. package/build-types/store/selectors.d.ts.map +1 -1
  135. package/package.json +4 -3
  136. package/src/components/collab-sidebar/add-comment.js +17 -20
  137. package/src/components/collab-sidebar/index.js +79 -88
  138. package/src/components/commands/index.js +390 -270
  139. package/src/components/create-template-part-modal/index.js +1 -0
  140. package/src/components/document-bar/index.js +10 -1
  141. package/src/components/document-bar/style.scss +13 -0
  142. package/src/components/document-tools/index.js +7 -1
  143. package/src/components/editor-interface/index.js +0 -1
  144. package/src/components/global-styles-provider/index.js +20 -8
  145. package/src/components/header/index.js +18 -10
  146. package/src/components/more-menu/index.js +12 -7
  147. package/src/components/plugin-post-publish-panel/test/__snapshots__/index.js.snap +1 -1
  148. package/src/components/post-taxonomies/flat-term-selector.js +8 -8
  149. package/src/components/post-template/swap-template-button.js +0 -3
  150. package/src/components/post-transform-panel/index.js +0 -3
  151. package/src/components/preferences-modal/index.js +26 -19
  152. package/src/components/preferences-modal/test/index.js +1 -1
  153. package/src/components/preview-dropdown/index.js +45 -16
  154. package/src/components/provider/use-block-editor-settings.js +10 -9
  155. package/src/components/sidebar/post-summary.js +1 -1
  156. package/src/components/sidebar/style.scss +1 -3
  157. package/src/components/start-page-options/index.js +0 -3
  158. package/src/components/start-template-options/index.js +0 -3
  159. package/src/components/visual-editor/index.js +7 -1
  160. package/src/components/visual-editor/style.scss +11 -0
  161. package/src/store/actions.js +110 -33
  162. package/src/store/constants.ts +0 -2
  163. package/src/store/index.js +0 -4
  164. package/src/store/selectors.js +2 -2
  165. package/tsconfig.tsbuildinfo +1 -1
@@ -158,6 +158,7 @@ export function CreateTemplatePartModalContents( {
158
158
  { templatePartAreas.map(
159
159
  ( { icon, label, area: value, description } ) => (
160
160
  <Radio
161
+ __next40pxDefaultSize
161
162
  key={ label }
162
163
  value={ value }
163
164
  className="editor-create-template-part-modal__area-radio"
@@ -15,7 +15,7 @@ import {
15
15
  __unstableAnimatePresence as AnimatePresence,
16
16
  } from '@wordpress/components';
17
17
  import { BlockIcon } from '@wordpress/block-editor';
18
- import { chevronLeftSmall, chevronRightSmall } from '@wordpress/icons';
18
+ import { chevronLeftSmall, chevronRightSmall, layout } from '@wordpress/icons';
19
19
  import { displayShortcut } from '@wordpress/keycodes';
20
20
  import { store as coreStore } from '@wordpress/core-data';
21
21
  import { store as commandsStore } from '@wordpress/commands';
@@ -59,12 +59,14 @@ export default function DocumentBar( props ) {
59
59
  isNotFound,
60
60
  templateTitle,
61
61
  onNavigateToPreviousEntityRecord,
62
+ isTemplatePreview,
62
63
  } = useSelect( ( select ) => {
63
64
  const {
64
65
  getCurrentPostType,
65
66
  getCurrentPostId,
66
67
  getEditorSettings,
67
68
  __experimentalGetTemplateInfo: getTemplateInfo,
69
+ getRenderingMode,
68
70
  } = select( editorStore );
69
71
  const {
70
72
  getEditedEntityRecord,
@@ -96,6 +98,7 @@ export default function DocumentBar( props ) {
96
98
  templateTitle: _templateInfo.title,
97
99
  onNavigateToPreviousEntityRecord:
98
100
  getEditorSettings().onNavigateToPreviousEntityRecord,
101
+ isTemplatePreview: getRenderingMode() === 'template-locked',
99
102
  };
100
103
  }, [] );
101
104
 
@@ -146,6 +149,12 @@ export default function DocumentBar( props ) {
146
149
  </MotionButton>
147
150
  ) }
148
151
  </AnimatePresence>
152
+ { ! isTemplate && isTemplatePreview && (
153
+ <BlockIcon
154
+ icon={ layout }
155
+ className="editor-document-bar__icon-layout"
156
+ />
157
+ ) }
149
158
  { isNotFound ? (
150
159
  <Text>{ __( 'Document not found' ) }</Text>
151
160
  ) : (
@@ -102,3 +102,16 @@
102
102
  background-color: transparent;
103
103
  }
104
104
  }
105
+
106
+ .editor-document-bar__icon-layout.editor-document-bar__icon-layout {
107
+ position: absolute;
108
+ margin-left: $grid-unit-15;
109
+ display: none;
110
+ pointer-events: none;
111
+ svg {
112
+ fill: $gray-600;
113
+ }
114
+ @include break-small {
115
+ display: flex;
116
+ }
117
+ }
@@ -35,6 +35,7 @@ function DocumentTools( { className, disableBlockTools = false } ) {
35
35
  inserterSidebarToggleRef,
36
36
  listViewToggleRef,
37
37
  showIconLabels,
38
+ showTools,
38
39
  } = useSelect( ( select ) => {
39
40
  const { get } = select( preferencesStore );
40
41
  const {
@@ -42,6 +43,8 @@ function DocumentTools( { className, disableBlockTools = false } ) {
42
43
  getEditorMode,
43
44
  getInserterSidebarToggleRef,
44
45
  getListViewToggleRef,
46
+ getRenderingMode,
47
+ getCurrentPostType,
45
48
  } = unlock( select( editorStore ) );
46
49
  const { getShortcutRepresentation } = select( keyboardShortcutsStore );
47
50
 
@@ -56,6 +59,9 @@ function DocumentTools( { className, disableBlockTools = false } ) {
56
59
  showIconLabels: get( 'core', 'showIconLabels' ),
57
60
  isDistractionFree: get( 'core', 'distractionFree' ),
58
61
  isVisualMode: getEditorMode() === 'visual',
62
+ showTools:
63
+ getRenderingMode() !== 'post-only' ||
64
+ getCurrentPostType() === 'wp_template',
59
65
  };
60
66
  }, [] );
61
67
 
@@ -128,7 +134,7 @@ function DocumentTools( { className, disableBlockTools = false } ) {
128
134
  ) }
129
135
  { ( isWideViewport || ! showIconLabels ) && (
130
136
  <>
131
- { isLargeViewport && (
137
+ { showTools && isLargeViewport && (
132
138
  <ToolbarItem
133
139
  as={ ToolSelector }
134
140
  showTooltip={ ! showIconLabels }
@@ -131,7 +131,6 @@ export default function EditorInterface( {
131
131
  customSaveButton={ customSaveButton }
132
132
  forceDisableBlockTools={ forceDisableBlockTools }
133
133
  title={ title }
134
- isEditorIframed={ ! disableIframe }
135
134
  />
136
135
  )
137
136
  }
@@ -57,11 +57,13 @@ function useGlobalStylesUserConfig() {
57
57
 
58
58
  let record;
59
59
 
60
- // We want the global styles ID request to finish before triggering
61
- // the OPTIONS request for user capabilities, otherwise it will
62
- // fetch `/wp/v2/global-styles` instead of
63
- // `/wp/v2/global-styles/{id}`!
64
- // Please adjust the preloaded requests if this changes!
60
+ /*
61
+ * Ensure that the global styles ID request is complete by testing `_globalStylesId`,
62
+ * before firing off the `canUser` OPTIONS request for user capabilities, otherwise it will
63
+ * fetch `/wp/v2/global-styles` instead of `/wp/v2/global-styles/{id}`.
64
+ * NOTE: Please keep in sync any preload paths sent to `block_editor_rest_api_preload()`,
65
+ * or set using the `block_editor_rest_api_preload_paths` filter, if this changes.
66
+ */
65
67
  const userCanEditGlobalStyles = _globalStylesId
66
68
  ? canUser( 'update', {
67
69
  kind: 'root',
@@ -72,11 +74,21 @@ function useGlobalStylesUserConfig() {
72
74
 
73
75
  if (
74
76
  _globalStylesId &&
75
- // We want the OPTIONS request for user capabilities to finish
76
- // before getting the records, otherwise we'll fetch both!
77
+ /*
78
+ * Test that the OPTIONS request for user capabilities is complete
79
+ * before fetching the global styles entity record.
80
+ * This is to avoid fetching the global styles entity unnecessarily.
81
+ */
77
82
  typeof userCanEditGlobalStyles === 'boolean'
78
83
  ) {
79
- // Please adjust the preloaded requests if this changes!
84
+ /*
85
+ * Fetch the global styles entity record based on the user's capabilities.
86
+ * The default context is `edit` for users who can edit global styles.
87
+ * Otherwise, the context is `view`.
88
+ * NOTE: There is an equivalent conditional check using `current_user_can()` in the backend
89
+ * to preload the global styles entity. Please keep in sync any preload paths sent to `block_editor_rest_api_preload()`,
90
+ * or set using `block_editor_rest_api_preload_paths` filter, if this changes.
91
+ */
80
92
  if ( userCanEditGlobalStyles ) {
81
93
  record = getEditedEntityRecord(
82
94
  'root',
@@ -25,6 +25,11 @@ import PostViewLink from '../post-view-link';
25
25
  import PreviewDropdown from '../preview-dropdown';
26
26
  import ZoomOutToggle from '../zoom-out-toggle';
27
27
  import { store as editorStore } from '../../store';
28
+ import {
29
+ TEMPLATE_PART_POST_TYPE,
30
+ PATTERN_POST_TYPE,
31
+ NAVIGATION_POST_TYPE,
32
+ } from '../../store/constants';
28
33
 
29
34
  const toolbarVariations = {
30
35
  distractionFreeDisabled: { y: '-50px' },
@@ -48,7 +53,6 @@ function Header( {
48
53
  forceDisableBlockTools,
49
54
  setEntitiesSavedStatesCallback,
50
55
  title,
51
- isEditorIframed,
52
56
  } ) {
53
57
  const isWideViewport = useViewportMatch( 'large' );
54
58
  const isLargeViewport = useViewportMatch( 'medium' );
@@ -60,12 +64,10 @@ function Header( {
60
64
  showIconLabels,
61
65
  hasFixedToolbar,
62
66
  hasBlockSelection,
63
- isNestedEntity,
64
67
  } = useSelect( ( select ) => {
65
68
  const { get: getPreference } = select( preferencesStore );
66
69
  const {
67
70
  getEditorMode,
68
- getEditorSettings,
69
71
  getCurrentPostType,
70
72
  isPublishSidebarOpened: _isPublishSidebarOpened,
71
73
  } = select( editorStore );
@@ -78,8 +80,6 @@ function Header( {
78
80
  hasFixedToolbar: getPreference( 'core', 'fixedToolbar' ),
79
81
  hasBlockSelection:
80
82
  !! select( blockEditorStore ).getBlockSelectionStart(),
81
- isNestedEntity:
82
- !! getEditorSettings().onNavigateToPreviousEntityRecord,
83
83
  };
84
84
  }, [] );
85
85
 
@@ -87,6 +87,12 @@ function Header( {
87
87
  postType
88
88
  );
89
89
 
90
+ const disablePreviewOption = [
91
+ NAVIGATION_POST_TYPE,
92
+ TEMPLATE_PART_POST_TYPE,
93
+ PATTERN_POST_TYPE,
94
+ ].includes( postType );
95
+
90
96
  const [ isBlockToolsCollapsed, setIsBlockToolsCollapsed ] =
91
97
  useState( true );
92
98
 
@@ -149,19 +155,21 @@ function Header( {
149
155
  <PostSavedState forceIsDirty={ forceIsDirty } />
150
156
  ) }
151
157
 
152
- { canBeZoomedOut && isEditorIframed && isWideViewport && (
153
- <ZoomOutToggle disabled={ forceDisableBlockTools } />
154
- ) }
158
+ <PostViewLink />
155
159
 
156
160
  <PreviewDropdown
157
161
  forceIsAutosaveable={ forceIsDirty }
158
- disabled={ isNestedEntity }
162
+ disabled={ disablePreviewOption }
159
163
  />
164
+
160
165
  <PostPreviewButton
161
166
  className="editor-header__post-preview-button"
162
167
  forceIsAutosaveable={ forceIsDirty }
163
168
  />
164
- <PostViewLink />
169
+
170
+ { canBeZoomedOut && isWideViewport && (
171
+ <ZoomOutToggle disabled={ forceDisableBlockTools } />
172
+ ) }
165
173
 
166
174
  { ( isWideViewport || ! showIconLabels ) && (
167
175
  <PinnedItems.Slot scope="core" />
@@ -35,6 +35,7 @@ export default function MoreMenu() {
35
35
  select( preferencesStore ).get( 'core', 'showIconLabels' ),
36
36
  []
37
37
  );
38
+
38
39
  const turnOffDistractionFree = () => {
39
40
  setPreference( 'core', 'distractionFree', false );
40
41
  };
@@ -67,10 +68,10 @@ export default function MoreMenu() {
67
68
  'Access all block and document tools in a single place'
68
69
  ) }
69
70
  messageActivated={ __(
70
- 'Top toolbar activated'
71
+ 'Top toolbar activated.'
71
72
  ) }
72
73
  messageDeactivated={ __(
73
- 'Top toolbar deactivated'
74
+ 'Top toolbar deactivated.'
74
75
  ) }
75
76
  />
76
77
  <PreferenceToggleMenuItem
@@ -79,12 +80,16 @@ export default function MoreMenu() {
79
80
  label={ __( 'Distraction free' ) }
80
81
  info={ __( 'Write with calmness' ) }
81
82
  handleToggling={ false }
82
- onToggle={ toggleDistractionFree }
83
+ onToggle={ () =>
84
+ toggleDistractionFree( {
85
+ createNotice: false,
86
+ } )
87
+ }
83
88
  messageActivated={ __(
84
- 'Distraction free mode activated'
89
+ 'Distraction free mode activated.'
85
90
  ) }
86
91
  messageDeactivated={ __(
87
- 'Distraction free mode deactivated'
92
+ 'Distraction free mode deactivated.'
88
93
  ) }
89
94
  shortcut={ displayShortcut.primaryShift(
90
95
  '\\'
@@ -96,10 +101,10 @@ export default function MoreMenu() {
96
101
  label={ __( 'Spotlight mode' ) }
97
102
  info={ __( 'Focus on one block at a time' ) }
98
103
  messageActivated={ __(
99
- 'Spotlight mode activated'
104
+ 'Spotlight mode activated.'
100
105
  ) }
101
106
  messageDeactivated={ __(
102
- 'Spotlight mode deactivated'
107
+ 'Spotlight mode deactivated.'
103
108
  ) }
104
109
  />
105
110
  <ViewMoreMenuGroup.Slot fillProps={ { onClose } } />
@@ -10,7 +10,7 @@ exports[`PluginPostPublishPanel renders fill properly 1`] = `
10
10
  >
11
11
  <button
12
12
  aria-expanded="true"
13
- class="components-button components-panel__body-toggle"
13
+ class="components-button components-panel__body-toggle is-next-40px-default-size"
14
14
  type="button"
15
15
  >
16
16
  <span
@@ -57,6 +57,13 @@ const termNamesToIds = ( names, terms ) => {
57
57
  .filter( ( id ) => id !== undefined );
58
58
  };
59
59
 
60
+ const Wrapper = ( { children, __nextHasNoMarginBottom } ) =>
61
+ __nextHasNoMarginBottom ? (
62
+ <VStack spacing={ 4 }>{ children }</VStack>
63
+ ) : (
64
+ <Fragment>{ children }</Fragment>
65
+ );
66
+
60
67
  /**
61
68
  * Renders a flat term selector component.
62
69
  *
@@ -292,15 +299,8 @@ export function FlatTermSelector( { slug, __nextHasNoMarginBottom } ) {
292
299
  singularName
293
300
  );
294
301
 
295
- const Wrapper = ( { children } ) =>
296
- __nextHasNoMarginBottom ? (
297
- <VStack spacing={ 4 }>{ children }</VStack>
298
- ) : (
299
- <Fragment>{ children }</Fragment>
300
- );
301
-
302
302
  return (
303
- <Wrapper>
303
+ <Wrapper __nextHasNoMarginBottom={ __nextHasNoMarginBottom }>
304
304
  <FormTokenField
305
305
  __next40pxDefaultSize
306
306
  value={ values }
@@ -9,7 +9,6 @@ import { __ } from '@wordpress/i18n';
9
9
  import { useDispatch } from '@wordpress/data';
10
10
  import { store as coreStore } from '@wordpress/core-data';
11
11
  import { parse } from '@wordpress/blocks';
12
- import { useAsyncList } from '@wordpress/compose';
13
12
 
14
13
  /**
15
14
  * Internal dependencies
@@ -71,12 +70,10 @@ function TemplatesList( { postType, onSelect } ) {
71
70
  } ) ),
72
71
  [ availableTemplates ]
73
72
  );
74
- const shownTemplates = useAsyncList( templatesAsPatterns );
75
73
  return (
76
74
  <BlockPatternsList
77
75
  label={ __( 'Templates' ) }
78
76
  blockPatterns={ templatesAsPatterns }
79
- shownPatterns={ shownTemplates }
80
77
  onClickPattern={ onSelect }
81
78
  />
82
79
  );
@@ -5,7 +5,6 @@ import { useSelect, useDispatch } from '@wordpress/data';
5
5
  import { store as coreStore } from '@wordpress/core-data';
6
6
  import { PanelBody } from '@wordpress/components';
7
7
  import { __ } from '@wordpress/i18n';
8
- import { useAsyncList } from '@wordpress/compose';
9
8
  import { __experimentalBlockPatternsList as BlockPatternsList } from '@wordpress/block-editor';
10
9
  import { serialize } from '@wordpress/blocks';
11
10
 
@@ -20,7 +19,6 @@ import {
20
19
  } from '../../store/constants';
21
20
 
22
21
  function TemplatesList( { availableTemplates, onSelect } ) {
23
- const shownTemplates = useAsyncList( availableTemplates );
24
22
  if ( ! availableTemplates || availableTemplates?.length === 0 ) {
25
23
  return null;
26
24
  }
@@ -29,7 +27,6 @@ function TemplatesList( { availableTemplates, onSelect } ) {
29
27
  <BlockPatternsList
30
28
  label={ __( 'Templates' ) }
31
29
  blockPatterns={ availableTemplates }
32
- shownPatterns={ shownTemplates }
33
30
  onClickPattern={ onSelect }
34
31
  showTitlesAsTooltip
35
32
  />
@@ -36,25 +36,40 @@ const {
36
36
  } = unlock( preferencesPrivateApis );
37
37
 
38
38
  export default function EditorPreferencesModal( { extraSections = {} } ) {
39
+ const isActive = useSelect( ( select ) => {
40
+ return select( interfaceStore ).isModalActive( 'editor/preferences' );
41
+ }, [] );
42
+ const { closeModal } = useDispatch( interfaceStore );
43
+
44
+ if ( ! isActive ) {
45
+ return null;
46
+ }
47
+
48
+ // Please wrap all contents inside PreferencesModalContents to prevent all
49
+ // hooks from executing when the modal is not open.
50
+ return (
51
+ <PreferencesModal closeModal={ closeModal }>
52
+ <PreferencesModalContents extraSections={ extraSections } />
53
+ </PreferencesModal>
54
+ );
55
+ }
56
+
57
+ function PreferencesModalContents( { extraSections = {} } ) {
39
58
  const isLargeViewport = useViewportMatch( 'medium' );
40
- const { isActive, showBlockBreadcrumbsOption } = useSelect(
59
+ const showBlockBreadcrumbsOption = useSelect(
41
60
  ( select ) => {
42
61
  const { getEditorSettings } = select( editorStore );
43
62
  const { get } = select( preferencesStore );
44
- const { isModalActive } = select( interfaceStore );
45
63
  const isRichEditingEnabled = getEditorSettings().richEditingEnabled;
46
64
  const isDistractionFreeEnabled = get( 'core', 'distractionFree' );
47
- return {
48
- showBlockBreadcrumbsOption:
49
- ! isDistractionFreeEnabled &&
50
- isLargeViewport &&
51
- isRichEditingEnabled,
52
- isActive: isModalActive( 'editor/preferences' ),
53
- };
65
+ return (
66
+ ! isDistractionFreeEnabled &&
67
+ isLargeViewport &&
68
+ isRichEditingEnabled
69
+ );
54
70
  },
55
71
  [ isLargeViewport ]
56
72
  );
57
- const { closeModal } = useDispatch( interfaceStore );
58
73
  const { setIsListViewOpened, setIsInserterOpened } =
59
74
  useDispatch( editorStore );
60
75
  const { set: setPreference } = useDispatch( preferencesStore );
@@ -330,13 +345,5 @@ export default function EditorPreferencesModal( { extraSections = {} } ) {
330
345
  ]
331
346
  );
332
347
 
333
- if ( ! isActive ) {
334
- return null;
335
- }
336
-
337
- return (
338
- <PreferencesModal closeModal={ closeModal }>
339
- <PreferencesModalTabs sections={ sections } />
340
- </PreferencesModal>
341
- );
348
+ return <PreferencesModalTabs sections={ sections } />;
342
349
  }
@@ -19,7 +19,7 @@ jest.mock( '@wordpress/compose/src/hooks/use-viewport-match', () => jest.fn() );
19
19
 
20
20
  describe( 'EditPostPreferencesModal', () => {
21
21
  it( 'should not render when the modal is not active', () => {
22
- useSelect.mockImplementation( () => [ false, false, false ] );
22
+ useSelect.mockImplementation( () => false );
23
23
  render( <EditPostPreferencesModal /> );
24
24
  expect(
25
25
  screen.queryByRole( 'dialog', { name: 'Preferences' } )
@@ -16,7 +16,7 @@ import {
16
16
  Icon,
17
17
  } from '@wordpress/components';
18
18
  import { __ } from '@wordpress/i18n';
19
- import { desktop, mobile, tablet, external } from '@wordpress/icons';
19
+ import { desktop, mobile, tablet, external, check } from '@wordpress/icons';
20
20
  import { useSelect, useDispatch } from '@wordpress/data';
21
21
  import { store as coreStore } from '@wordpress/core-data';
22
22
  import { store as preferencesStore } from '@wordpress/preferences';
@@ -31,21 +31,32 @@ import PostPreviewButton from '../post-preview-button';
31
31
  import { unlock } from '../../lock-unlock';
32
32
 
33
33
  export default function PreviewDropdown( { forceIsAutosaveable, disabled } ) {
34
- const { deviceType, homeUrl, isTemplate, isViewable, showIconLabels } =
35
- useSelect( ( select ) => {
36
- const { getDeviceType, getCurrentPostType } = select( editorStore );
37
- const { getEntityRecord, getPostType } = select( coreStore );
38
- const { get } = select( preferencesStore );
39
- const _currentPostType = getCurrentPostType();
40
- return {
41
- deviceType: getDeviceType(),
42
- homeUrl: getEntityRecord( 'root', '__unstableBase' )?.home,
43
- isTemplate: _currentPostType === 'wp_template',
44
- isViewable: getPostType( _currentPostType )?.viewable ?? false,
45
- showIconLabels: get( 'core', 'showIconLabels' ),
46
- };
47
- }, [] );
48
- const { setDeviceType } = useDispatch( editorStore );
34
+ const {
35
+ deviceType,
36
+ homeUrl,
37
+ isTemplate,
38
+ isViewable,
39
+ showIconLabels,
40
+ isTemplateHidden,
41
+ templateId,
42
+ } = useSelect( ( select ) => {
43
+ const { getDeviceType, getCurrentPostType, getCurrentTemplateId } =
44
+ select( editorStore );
45
+ const { getRenderingMode } = unlock( select( editorStore ) );
46
+ const { getEntityRecord, getPostType } = select( coreStore );
47
+ const { get } = select( preferencesStore );
48
+ const _currentPostType = getCurrentPostType();
49
+ return {
50
+ deviceType: getDeviceType(),
51
+ homeUrl: getEntityRecord( 'root', '__unstableBase' )?.home,
52
+ isTemplate: _currentPostType === 'wp_template',
53
+ isViewable: getPostType( _currentPostType )?.viewable ?? false,
54
+ showIconLabels: get( 'core', 'showIconLabels' ),
55
+ isTemplateHidden: getRenderingMode() === 'post-only',
56
+ templateId: getCurrentTemplateId(),
57
+ };
58
+ }, [] );
59
+ const { setDeviceType, setRenderingMode } = useDispatch( editorStore );
49
60
  const { resetZoomLevel } = unlock( useDispatch( blockEditorStore ) );
50
61
 
51
62
  const handleDevicePreviewChange = ( newDeviceType ) => {
@@ -142,6 +153,24 @@ export default function PreviewDropdown( { forceIsAutosaveable, disabled } ) {
142
153
  </MenuItem>
143
154
  </MenuGroup>
144
155
  ) }
156
+ { ! isTemplate && !! templateId && (
157
+ <MenuGroup>
158
+ <MenuItem
159
+ icon={ ! isTemplateHidden ? check : undefined }
160
+ isSelected={ ! isTemplateHidden }
161
+ role="menuitemcheckbox"
162
+ onClick={ () => {
163
+ setRenderingMode(
164
+ isTemplateHidden
165
+ ? 'template-locked'
166
+ : 'post-only'
167
+ );
168
+ } }
169
+ >
170
+ { __( 'Show template' ) }
171
+ </MenuItem>
172
+ </MenuGroup>
173
+ ) }
145
174
  { isViewable && (
146
175
  <MenuGroup>
147
176
  <PostPreviewButton
@@ -7,6 +7,7 @@ import {
7
7
  store as coreStore,
8
8
  __experimentalFetchLinkSuggestions as fetchLinkSuggestions,
9
9
  __experimentalFetchUrlData as fetchUrlData,
10
+ privateApis as coreDataPrivateApis,
10
11
  } from '@wordpress/core-data';
11
12
  import { __ } from '@wordpress/i18n';
12
13
  import { store as preferencesStore } from '@wordpress/preferences';
@@ -29,17 +30,12 @@ import { useGlobalStylesContext } from '../global-styles-provider';
29
30
  const EMPTY_OBJECT = {};
30
31
 
31
32
  function __experimentalReusableBlocksSelect( select ) {
32
- const { getEntityRecords, hasFinishedResolution } = select( coreStore );
33
- const reusableBlocks = getEntityRecords( 'postType', 'wp_block', {
33
+ const { RECEIVE_INTERMEDIATE_RESULTS } = unlock( coreDataPrivateApis );
34
+ const { getEntityRecords } = select( coreStore );
35
+ return getEntityRecords( 'postType', 'wp_block', {
34
36
  per_page: -1,
37
+ [ RECEIVE_INTERMEDIATE_RESULTS ]: true,
35
38
  } );
36
- return hasFinishedResolution( 'getEntityRecords', [
37
- 'postType',
38
- 'wp_block',
39
- { per_page: -1 },
40
- ] )
41
- ? reusableBlocks
42
- : undefined;
43
39
  }
44
40
 
45
41
  const BLOCK_EDITOR_SETTINGS = [
@@ -332,6 +328,10 @@ function useBlockEditorSettings( settings, postType, postId, renderingMode ) {
332
328
  : settings.template,
333
329
  __experimentalSetIsInserterOpened: setIsInserterOpened,
334
330
  [ sectionRootClientIdKey ]: sectionRootClientId,
331
+ editorTool:
332
+ renderingMode === 'post-only' && postType !== 'wp_template'
333
+ ? 'edit'
334
+ : undefined,
335
335
  };
336
336
 
337
337
  return blockEditorSettings;
@@ -359,6 +359,7 @@ function useBlockEditorSettings( settings, postType, postId, renderingMode ) {
359
359
  sectionRootClientId,
360
360
  globalStylesData,
361
361
  globalStylesLinksData,
362
+ renderingMode,
362
363
  ] );
363
364
  }
364
365
 
@@ -87,11 +87,11 @@ export default function PostSummary( { onActionPerformed } ) {
87
87
  <PostsPerPage />
88
88
  <SiteDiscussion />
89
89
  <PostFormatPanel />
90
+ { fills }
90
91
  </VStack>
91
92
  <PostTrash
92
93
  onActionPerformed={ onActionPerformed }
93
94
  />
94
- { fills }
95
95
  </VStack>
96
96
  ) }
97
97
  </VStack>
@@ -1,11 +1,9 @@
1
1
  .components-panel__header.editor-sidebar__panel-tabs {
2
2
  padding-left: 0;
3
- padding-right: $grid-unit-15;
3
+ padding-right: $grid-unit-10;
4
4
 
5
5
  .components-button.has-icon {
6
6
  padding: 0;
7
- min-width: $icon-size;
8
- height: $icon-size;
9
7
 
10
8
  @include break-medium() {
11
9
  display: flex;
@@ -9,7 +9,6 @@ import {
9
9
  __experimentalBlockPatternsList as BlockPatternsList,
10
10
  } from '@wordpress/block-editor';
11
11
  import { useSelect, useDispatch } from '@wordpress/data';
12
- import { useAsyncList } from '@wordpress/compose';
13
12
  import { store as coreStore } from '@wordpress/core-data';
14
13
  import { __unstableSerializeAndClean } from '@wordpress/blocks';
15
14
  import { store as preferencesStore } from '@wordpress/preferences';
@@ -66,7 +65,6 @@ export function useStartPatterns() {
66
65
  }
67
66
 
68
67
  function PatternSelection( { blockPatterns, onChoosePattern } ) {
69
- const shownBlockPatterns = useAsyncList( blockPatterns );
70
68
  const { editEntityRecord } = useDispatch( coreStore );
71
69
  const { postType, postId } = useSelect( ( select ) => {
72
70
  const { getCurrentPostType, getCurrentPostId } = select( editorStore );
@@ -79,7 +77,6 @@ function PatternSelection( { blockPatterns, onChoosePattern } ) {
79
77
  return (
80
78
  <BlockPatternsList
81
79
  blockPatterns={ blockPatterns }
82
- shownPatterns={ shownBlockPatterns }
83
80
  onClickPattern={ ( _pattern, blocks ) => {
84
81
  editEntityRecord( 'postType', postType, postId, {
85
82
  blocks,
@@ -6,7 +6,6 @@ import { __ } from '@wordpress/i18n';
6
6
  import { useState, useMemo, useEffect } from '@wordpress/element';
7
7
  import { __experimentalBlockPatternsList as BlockPatternsList } from '@wordpress/block-editor';
8
8
  import { useSelect } from '@wordpress/data';
9
- import { useAsyncList } from '@wordpress/compose';
10
9
  import { parse } from '@wordpress/blocks';
11
10
  import { store as coreStore, useEntityBlockEditor } from '@wordpress/core-data';
12
11
 
@@ -111,11 +110,9 @@ function useStartPatterns( fallbackContent ) {
111
110
  function PatternSelection( { fallbackContent, onChoosePattern, postType } ) {
112
111
  const [ , , onChange ] = useEntityBlockEditor( 'postType', postType );
113
112
  const blockPatterns = useStartPatterns( fallbackContent );
114
- const shownBlockPatterns = useAsyncList( blockPatterns );
115
113
  return (
116
114
  <BlockPatternsList
117
115
  blockPatterns={ blockPatterns }
118
- shownPatterns={ shownBlockPatterns }
119
116
  onClickPattern={ ( pattern, blocks ) => {
120
117
  onChange( blocks, { selection: undefined } );
121
118
  onChoosePattern();