@wordpress/edit-site 6.11.0 → 6.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 (190) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/app/index.js +0 -2
  3. package/build/components/app/index.js.map +1 -1
  4. package/build/components/block-editor/use-editor-iframe-props.js +6 -8
  5. package/build/components/block-editor/use-editor-iframe-props.js.map +1 -1
  6. package/build/components/editor/index.js +9 -4
  7. package/build/components/editor/index.js.map +1 -1
  8. package/build/components/editor/use-editor-title.js +29 -12
  9. package/build/components/editor/use-editor-title.js.map +1 -1
  10. package/build/components/global-styles/screen-revisions/revisions-buttons.js +24 -22
  11. package/build/components/global-styles/screen-revisions/revisions-buttons.js.map +1 -1
  12. package/build/components/global-styles/shadows-edit-panel.js +2 -3
  13. package/build/components/global-styles/shadows-edit-panel.js.map +1 -1
  14. package/build/components/global-styles/ui.js +42 -2
  15. package/build/components/global-styles/ui.js.map +1 -1
  16. package/build/components/global-styles-renderer/index.js +6 -8
  17. package/build/components/global-styles-renderer/index.js.map +1 -1
  18. package/build/components/layout/hooks.js +1 -10
  19. package/build/components/layout/hooks.js.map +1 -1
  20. package/build/components/layout/index.js +1 -0
  21. package/build/components/layout/index.js.map +1 -1
  22. package/build/components/page-patterns/fields.js +3 -7
  23. package/build/components/page-patterns/fields.js.map +1 -1
  24. package/build/components/page-templates/fields.js +1 -2
  25. package/build/components/page-templates/fields.js.map +1 -1
  26. package/build/components/post-edit/index.js +14 -8
  27. package/build/components/post-edit/index.js.map +1 -1
  28. package/build/components/post-fields/index.js +3 -197
  29. package/build/components/post-fields/index.js.map +1 -1
  30. package/build/components/post-list/index.js +11 -1
  31. package/build/components/post-list/index.js.map +1 -1
  32. package/build/components/sidebar/index.js +11 -3
  33. package/build/components/sidebar/index.js.map +1 -1
  34. package/build/components/sidebar-global-styles-wrapper/index.js +129 -0
  35. package/build/components/sidebar-global-styles-wrapper/index.js.map +1 -0
  36. package/build/components/sidebar-navigation-screen-global-styles/index.js +14 -72
  37. package/build/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  38. package/build/components/sidebar-navigation-screen-main/index.js +43 -42
  39. package/build/components/sidebar-navigation-screen-main/index.js.map +1 -1
  40. package/build/components/site-editor-routes/styles-edit.js +6 -1
  41. package/build/components/site-editor-routes/styles-edit.js.map +1 -1
  42. package/build/components/site-editor-routes/styles-view.js +8 -2
  43. package/build/components/site-editor-routes/styles-view.js.map +1 -1
  44. package/build/components/site-hub/index.js +19 -6
  45. package/build/components/site-hub/index.js.map +1 -1
  46. package/build/components/style-book/constants.js +10 -3
  47. package/build/components/style-book/constants.js.map +1 -1
  48. package/build/components/style-book/examples.js +71 -1
  49. package/build/components/style-book/examples.js.map +1 -1
  50. package/build/components/style-book/index.js +70 -11
  51. package/build/components/style-book/index.js.map +1 -1
  52. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js +32 -32
  53. package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  54. package/build/components/welcome-guide/index.js +4 -2
  55. package/build/components/welcome-guide/index.js.map +1 -1
  56. package/build/components/welcome-guide/page.js +1 -9
  57. package/build/components/welcome-guide/page.js.map +1 -1
  58. package/build/components/welcome-guide/template.js +1 -12
  59. package/build/components/welcome-guide/template.js.map +1 -1
  60. package/build/hooks/commands/use-common-commands.js +15 -15
  61. package/build/hooks/commands/use-common-commands.js.map +1 -1
  62. package/build/index.js +1 -0
  63. package/build/index.js.map +1 -1
  64. package/build/posts.js +1 -0
  65. package/build/posts.js.map +1 -1
  66. package/build-module/components/app/index.js +0 -2
  67. package/build-module/components/app/index.js.map +1 -1
  68. package/build-module/components/block-editor/use-editor-iframe-props.js +6 -8
  69. package/build-module/components/block-editor/use-editor-iframe-props.js.map +1 -1
  70. package/build-module/components/editor/index.js +9 -4
  71. package/build-module/components/editor/index.js.map +1 -1
  72. package/build-module/components/editor/use-editor-title.js +29 -12
  73. package/build-module/components/editor/use-editor-title.js.map +1 -1
  74. package/build-module/components/global-styles/screen-revisions/revisions-buttons.js +25 -23
  75. package/build-module/components/global-styles/screen-revisions/revisions-buttons.js.map +1 -1
  76. package/build-module/components/global-styles/shadows-edit-panel.js +2 -3
  77. package/build-module/components/global-styles/shadows-edit-panel.js.map +1 -1
  78. package/build-module/components/global-styles/ui.js +43 -3
  79. package/build-module/components/global-styles/ui.js.map +1 -1
  80. package/build-module/components/global-styles-renderer/index.js +6 -8
  81. package/build-module/components/global-styles-renderer/index.js.map +1 -1
  82. package/build-module/components/layout/hooks.js +1 -9
  83. package/build-module/components/layout/hooks.js.map +1 -1
  84. package/build-module/components/layout/index.js +1 -0
  85. package/build-module/components/layout/index.js.map +1 -1
  86. package/build-module/components/page-patterns/fields.js +4 -8
  87. package/build-module/components/page-patterns/fields.js.map +1 -1
  88. package/build-module/components/page-templates/fields.js +1 -2
  89. package/build-module/components/page-templates/fields.js.map +1 -1
  90. package/build-module/components/post-edit/index.js +14 -8
  91. package/build-module/components/post-edit/index.js.map +1 -1
  92. package/build-module/components/post-fields/index.js +7 -202
  93. package/build-module/components/post-fields/index.js.map +1 -1
  94. package/build-module/components/post-list/index.js +11 -1
  95. package/build-module/components/post-list/index.js.map +1 -1
  96. package/build-module/components/sidebar/index.js +11 -3
  97. package/build-module/components/sidebar/index.js.map +1 -1
  98. package/build-module/components/sidebar-global-styles-wrapper/index.js +121 -0
  99. package/build-module/components/sidebar-global-styles-wrapper/index.js.map +1 -0
  100. package/build-module/components/sidebar-navigation-screen-global-styles/index.js +15 -73
  101. package/build-module/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  102. package/build-module/components/sidebar-navigation-screen-main/index.js +43 -43
  103. package/build-module/components/sidebar-navigation-screen-main/index.js.map +1 -1
  104. package/build-module/components/site-editor-routes/styles-edit.js +6 -1
  105. package/build-module/components/site-editor-routes/styles-edit.js.map +1 -1
  106. package/build-module/components/site-editor-routes/styles-view.js +8 -2
  107. package/build-module/components/site-editor-routes/styles-view.js.map +1 -1
  108. package/build-module/components/site-hub/index.js +19 -6
  109. package/build-module/components/site-hub/index.js.map +1 -1
  110. package/build-module/components/style-book/constants.js +10 -3
  111. package/build-module/components/style-book/constants.js.map +1 -1
  112. package/build-module/components/style-book/examples.js +71 -1
  113. package/build-module/components/style-book/examples.js.map +1 -1
  114. package/build-module/components/style-book/index.js +71 -12
  115. package/build-module/components/style-book/index.js.map +1 -1
  116. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js +32 -32
  117. package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
  118. package/build-module/components/welcome-guide/index.js +4 -2
  119. package/build-module/components/welcome-guide/index.js.map +1 -1
  120. package/build-module/components/welcome-guide/page.js +1 -9
  121. package/build-module/components/welcome-guide/page.js.map +1 -1
  122. package/build-module/components/welcome-guide/template.js +1 -11
  123. package/build-module/components/welcome-guide/template.js.map +1 -1
  124. package/build-module/hooks/commands/use-common-commands.js +15 -15
  125. package/build-module/hooks/commands/use-common-commands.js.map +1 -1
  126. package/build-module/index.js +1 -0
  127. package/build-module/index.js.map +1 -1
  128. package/build-module/posts.js +1 -0
  129. package/build-module/posts.js.map +1 -1
  130. package/build-style/posts-rtl.css +54 -5
  131. package/build-style/posts.css +54 -5
  132. package/build-style/style-rtl.css +109 -28
  133. package/build-style/style.css +109 -28
  134. package/package.json +3 -4
  135. package/src/components/app/index.js +0 -2
  136. package/src/components/block-editor/use-editor-iframe-props.js +2 -3
  137. package/src/components/editor/index.js +16 -4
  138. package/src/components/editor/use-editor-title.js +37 -13
  139. package/src/components/editor-canvas-container/style.scss +0 -1
  140. package/src/components/global-styles/screen-revisions/revisions-buttons.js +28 -31
  141. package/src/components/global-styles/screen-revisions/style.scss +11 -17
  142. package/src/components/global-styles/shadows-edit-panel.js +4 -2
  143. package/src/components/global-styles/ui.js +42 -2
  144. package/src/components/global-styles-renderer/index.js +4 -10
  145. package/src/components/layout/hooks.js +1 -7
  146. package/src/components/layout/index.js +6 -1
  147. package/src/components/page-patterns/fields.js +6 -12
  148. package/src/components/page-patterns/style.scss +0 -5
  149. package/src/components/page-templates/fields.js +2 -3
  150. package/src/components/post-edit/index.js +38 -30
  151. package/src/components/post-edit/style.scss +7 -0
  152. package/src/components/post-fields/index.js +19 -273
  153. package/src/components/post-list/index.js +9 -3
  154. package/src/components/post-list/style.scss +29 -3
  155. package/src/components/sidebar/index.js +23 -7
  156. package/src/components/sidebar-global-styles-wrapper/index.js +150 -0
  157. package/src/components/sidebar-global-styles-wrapper/style.scss +35 -0
  158. package/src/components/sidebar-navigation-item/style.scss +2 -2
  159. package/src/components/sidebar-navigation-screen-global-styles/index.js +13 -88
  160. package/src/components/sidebar-navigation-screen-main/index.js +46 -45
  161. package/src/components/site-editor-routes/styles-edit.js +10 -1
  162. package/src/components/site-editor-routes/styles-view.js +11 -1
  163. package/src/components/site-hub/index.js +33 -16
  164. package/src/components/site-icon/style.scss +16 -0
  165. package/src/components/style-book/constants.ts +11 -3
  166. package/src/components/style-book/examples.tsx +105 -1
  167. package/src/components/style-book/index.js +86 -8
  168. package/src/components/sync-state-with-url/use-init-edited-entity-from-url.js +54 -64
  169. package/src/components/welcome-guide/index.js +3 -3
  170. package/src/components/welcome-guide/page.js +1 -7
  171. package/src/components/welcome-guide/template.js +1 -8
  172. package/src/hooks/commands/use-common-commands.js +253 -246
  173. package/src/index.js +1 -0
  174. package/src/posts.js +1 -0
  175. package/src/style.scss +2 -3
  176. package/build/components/async/index.js +0 -51
  177. package/build/components/async/index.js.map +0 -1
  178. package/build/components/use-edited-entity-record/index.js +0 -60
  179. package/build/components/use-edited-entity-record/index.js.map +0 -1
  180. package/build/hooks/commands/use-edit-mode-commands.js +0 -179
  181. package/build/hooks/commands/use-edit-mode-commands.js.map +0 -1
  182. package/build-module/components/async/index.js +0 -44
  183. package/build-module/components/async/index.js.map +0 -1
  184. package/build-module/components/use-edited-entity-record/index.js +0 -53
  185. package/build-module/components/use-edited-entity-record/index.js.map +0 -1
  186. package/build-module/hooks/commands/use-edit-mode-commands.js +0 -171
  187. package/build-module/hooks/commands/use-edit-mode-commands.js.map +0 -1
  188. package/src/components/async/index.js +0 -43
  189. package/src/components/use-edited-entity-record/index.js +0 -58
  190. package/src/hooks/commands/use-edit-mode-commands.js +0 -168
@@ -121,17 +121,27 @@ export const SiteHubMobile = memo(
121
121
  const history = useHistory();
122
122
  const { navigate } = useContext( SidebarNavigationContext );
123
123
 
124
- const { homeUrl, siteTitle } = useSelect( ( select ) => {
125
- const { getEntityRecord } = select( coreStore );
126
- const _site = getEntityRecord( 'root', 'site' );
127
- return {
128
- homeUrl: getEntityRecord( 'root', '__unstableBase' )?.home,
129
- siteTitle:
130
- ! _site?.title && !! _site?.url
131
- ? filterURLForDisplay( _site?.url )
132
- : _site?.title,
133
- };
134
- }, [] );
124
+ const { dashboardLink, isBlockTheme, homeUrl, siteTitle } = useSelect(
125
+ ( select ) => {
126
+ const { getSettings } = unlock( select( editSiteStore ) );
127
+
128
+ const { getEntityRecord, getCurrentTheme } =
129
+ select( coreStore );
130
+ const _site = getEntityRecord( 'root', 'site' );
131
+ return {
132
+ dashboardLink:
133
+ getSettings().__experimentalDashboardLink ||
134
+ 'index.php',
135
+ isBlockTheme: getCurrentTheme()?.is_block_theme,
136
+ homeUrl: getEntityRecord( 'root', '__unstableBase' )?.home,
137
+ siteTitle:
138
+ ! _site?.title && !! _site?.url
139
+ ? filterURLForDisplay( _site?.url )
140
+ : _site?.title,
141
+ };
142
+ },
143
+ []
144
+ );
135
145
  const { open: openCommandCenter } = useDispatch( commandsStore );
136
146
 
137
147
  return (
@@ -148,16 +158,23 @@ export const SiteHubMobile = memo(
148
158
  <Button
149
159
  __next40pxDefaultSize
150
160
  ref={ ref }
151
- label={ __( 'Go to Site Editor' ) }
152
161
  className="edit-site-layout__view-mode-toggle"
153
162
  style={ {
154
163
  transform: 'scale(0.5)',
155
164
  borderRadius: 4,
156
165
  } }
157
- onClick={ () => {
158
- history.push( {} );
159
- navigate( 'back' );
160
- } }
166
+ { ...( ! isBlockTheme
167
+ ? {
168
+ href: dashboardLink,
169
+ label: __( 'Go to the Dashboard' ),
170
+ }
171
+ : {
172
+ onClick: () => {
173
+ history.push( {} );
174
+ navigate( 'back' );
175
+ },
176
+ label: __( 'Go to Site Editor' ),
177
+ } ) }
161
178
  >
162
179
  <SiteIcon className="edit-site-layout__view-mode-toggle-icon" />
163
180
  </Button>
@@ -20,3 +20,19 @@
20
20
  border-radius: 0;
21
21
  }
22
22
  }
23
+
24
+ .edit-site-editor__view-mode-toggle button:focus {
25
+ position: relative;
26
+
27
+ &::before {
28
+ content: "";
29
+ display: block;
30
+ position: absolute;
31
+ z-index: 1;
32
+ top: 0;
33
+ right: 0;
34
+ bottom: 0;
35
+ left: 0;
36
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color), inset 0 0 0 calc(#{ $border-width } + var(--wp-admin-border-width-focus)) $white;
37
+ }
38
+ }
@@ -107,6 +107,11 @@ export const STYLE_BOOK_THEME_SUBCATEGORIES: Omit<
107
107
  ];
108
108
 
109
109
  export const STYLE_BOOK_CATEGORIES: StyleBookCategory[] = [
110
+ {
111
+ slug: 'overview',
112
+ title: __( 'Overview' ),
113
+ blocks: [],
114
+ },
110
115
  {
111
116
  slug: 'text',
112
117
  title: __( 'Text' ),
@@ -249,16 +254,19 @@ export const STYLE_BOOK_IFRAME_STYLES = `
249
254
  .edit-site-style-book__example-preview {
250
255
  width: 100%;
251
256
  }
257
+
258
+ .is-wide .edit-site-style-book__example-preview {
259
+ width: calc(100% - 120px);
260
+ }
252
261
 
253
262
  .edit-site-style-book__example-preview .block-editor-block-list__insertion-point,
254
263
  .edit-site-style-book__example-preview .block-list-appender {
255
264
  display: none;
256
265
  }
257
-
258
- .edit-site-style-book__example-preview .is-root-container > .wp-block:first-child {
266
+ :where(.is-root-container > .wp-block:first-child) {
259
267
  margin-top: 0;
260
268
  }
261
- .edit-site-style-book__example-preview .is-root-container > .wp-block:last-child {
269
+ :where(.is-root-container > .wp-block:last-child) {
262
270
  margin-bottom: 0;
263
271
  }
264
272
  `;
@@ -62,6 +62,103 @@ function getColorExamples( colors: MultiOriginPalettes ): BlockExample[] {
62
62
  return examples;
63
63
  }
64
64
 
65
+ /**
66
+ * Returns examples for the overview page.
67
+ *
68
+ * @param {MultiOriginPalettes} colors Global Styles color palettes per origin.
69
+ * @return {BlockExample[]} An array of block examples.
70
+ */
71
+ function getOverviewBlockExamples(
72
+ colors: MultiOriginPalettes
73
+ ): BlockExample[] {
74
+ const examples: BlockExample[] = [];
75
+
76
+ // Get theme palette from colors.
77
+ const themePalette = colors.colors.find(
78
+ ( origin: ColorOrigin ) => origin.slug === 'theme'
79
+ );
80
+
81
+ if ( themePalette ) {
82
+ const themeColorexample: BlockExample = {
83
+ name: 'theme-colors',
84
+ title: __( 'Colors' ),
85
+ category: 'overview',
86
+ content: (
87
+ <ColorExamples colors={ themePalette.colors } type={ colors } />
88
+ ),
89
+ };
90
+
91
+ examples.push( themeColorexample );
92
+ }
93
+
94
+ const headingBlock = createBlock( 'core/heading', {
95
+ content: __(
96
+ `AaBbCcDdEeFfGgHhiiJjKkLIMmNnOoPpQakRrssTtUuVVWwXxxYyZzOl23356789X{(…)},2!*&:/A@HELFO™`
97
+ ),
98
+ level: 1,
99
+ } );
100
+ const firstParagraphBlock = createBlock( 'core/paragraph', {
101
+ content: __(
102
+ `A paragraph in a website refers to a distinct block of text that is used to present and organize information. It is a fundamental unit of content in web design and is typically composed of a group of related sentences or thoughts focused on a particular topic or idea. Paragraphs play a crucial role in improving the readability and user experience of a website. They break down the text into smaller, manageable chunks, allowing readers to scan the content more easily.`
103
+ ),
104
+ } );
105
+ const secondParagraphBlock = createBlock( 'core/paragraph', {
106
+ content: __(
107
+ `Additionally, paragraphs help structure the flow of information and provide logical breaks between different concepts or pieces of information. In terms of formatting, paragraphs in websites are commonly denoted by a vertical gap or indentation between each block of text. This visual separation helps visually distinguish one paragraph from another, creating a clear and organized layout that guides the reader through the content smoothly.`
108
+ ),
109
+ } );
110
+
111
+ const textExample = {
112
+ name: 'typography',
113
+ title: __( 'Typography' ),
114
+ category: 'overview',
115
+ blocks: [
116
+ headingBlock,
117
+ createBlock(
118
+ 'core/group',
119
+ {
120
+ layout: {
121
+ type: 'grid',
122
+ columnCount: 2,
123
+ minimumColumnWidth: '12rem',
124
+ },
125
+ style: {
126
+ spacing: {
127
+ blockGap: '1.5rem',
128
+ },
129
+ },
130
+ },
131
+ [ firstParagraphBlock, secondParagraphBlock ]
132
+ ),
133
+ ],
134
+ };
135
+ examples.push( textExample );
136
+
137
+ const otherBlockExamples = [
138
+ 'core/image',
139
+ 'core/separator',
140
+ 'core/buttons',
141
+ 'core/pullquote',
142
+ 'core/search',
143
+ ];
144
+
145
+ // Get examples for other blocks and put them in order of above array.
146
+ otherBlockExamples.forEach( ( blockName ) => {
147
+ const blockType = getBlockType( blockName );
148
+ if ( blockType && blockType.example ) {
149
+ const blockExample: BlockExample = {
150
+ name: blockName,
151
+ title: blockType.title,
152
+ category: 'overview',
153
+ blocks: getBlockFromExample( blockName, blockType.example ),
154
+ };
155
+ examples.push( blockExample );
156
+ }
157
+ } );
158
+
159
+ return examples;
160
+ }
161
+
65
162
  /**
66
163
  * Returns a list of examples for registered block types.
67
164
  *
@@ -109,5 +206,12 @@ export function getExamples( colors: MultiOriginPalettes ): BlockExample[] {
109
206
  };
110
207
  const colorExamples = getColorExamples( colors );
111
208
 
112
- return [ headingsExample, ...colorExamples, ...nonHeadingBlockExamples ];
209
+ const overviewBlockExamples = getOverviewBlockExamples( colors );
210
+
211
+ return [
212
+ headingsExample,
213
+ ...colorExamples,
214
+ ...nonHeadingBlockExamples,
215
+ ...overviewBlockExamples,
216
+ ];
113
217
  }
@@ -24,7 +24,14 @@ import {
24
24
  import { privateApis as editorPrivateApis } from '@wordpress/editor';
25
25
  import { useSelect } from '@wordpress/data';
26
26
  import { useResizeObserver } from '@wordpress/compose';
27
- import { useMemo, useState, memo, useContext } from '@wordpress/element';
27
+ import {
28
+ useMemo,
29
+ useState,
30
+ memo,
31
+ useContext,
32
+ useRef,
33
+ useLayoutEffect,
34
+ } from '@wordpress/element';
28
35
  import { ENTER, SPACE } from '@wordpress/keycodes';
29
36
 
30
37
  /**
@@ -53,6 +60,48 @@ function isObjectEmpty( object ) {
53
60
  return ! object || Object.keys( object ).length === 0;
54
61
  }
55
62
 
63
+ /**
64
+ * Scrolls to a section within an iframe.
65
+ *
66
+ * @param {string} anchorId The id of the element to scroll to.
67
+ * @param {HTMLIFrameElement} iframe The target iframe.
68
+ */
69
+ const scrollToSection = ( anchorId, iframe ) => {
70
+ if ( ! iframe || ! iframe?.contentDocument ) {
71
+ return;
72
+ }
73
+
74
+ const element = iframe.contentDocument.getElementById( anchorId );
75
+ if ( element ) {
76
+ element.scrollIntoView( {
77
+ behavior: 'smooth',
78
+ } );
79
+ }
80
+ };
81
+
82
+ /**
83
+ * Parses a Block Editor navigation path to extract the block name and
84
+ * build a style book navigation path. The object can be extended to include a category,
85
+ * representing a style book tab/section.
86
+ *
87
+ * @param {string} path An internal Block Editor navigation path.
88
+ * @return {null|{block: string}} An object containing the example to navigate to.
89
+ */
90
+ const getStyleBookNavigationFromPath = ( path ) => {
91
+ if ( path && typeof path === 'string' ) {
92
+ let block = path.includes( '/blocks/' )
93
+ ? decodeURIComponent( path.split( '/blocks/' )[ 1 ] )
94
+ : null;
95
+ // Default to theme-colors if the path ends with /colors.
96
+ block = path.endsWith( '/colors' ) ? 'theme-colors' : block;
97
+
98
+ return {
99
+ block,
100
+ };
101
+ }
102
+ return null;
103
+ };
104
+
56
105
  /**
57
106
  * Retrieves colors, gradients, and duotone filters from Global Styles.
58
107
  * The inclusion of default (Core) palettes is controlled by the relevant
@@ -137,6 +186,7 @@ function StyleBook( {
137
186
  onClose,
138
187
  showTabs = true,
139
188
  userConfig = {},
189
+ path = '',
140
190
  } ) {
141
191
  const [ resizeObserver, sizes ] = useResizeObserver();
142
192
  const [ textColor ] = useGlobalStyle( 'color.text' );
@@ -153,7 +203,24 @@ function StyleBook( {
153
203
  [ examples ]
154
204
  );
155
205
 
206
+ const examplesForSinglePageUse = [];
207
+ const overviewCategoryExamples = getExamplesByCategory(
208
+ { slug: 'overview' },
209
+ examples
210
+ );
211
+ examplesForSinglePageUse.push( ...overviewCategoryExamples.examples );
212
+ const otherExamples = examples.filter( ( example ) => {
213
+ return (
214
+ example.category !== 'overview' &&
215
+ ! overviewCategoryExamples.examples.find(
216
+ ( overviewExample ) => overviewExample.name === example.name
217
+ )
218
+ );
219
+ } );
220
+ examplesForSinglePageUse.push( ...otherExamples );
221
+
156
222
  const { base: baseConfig } = useContext( GlobalStylesContext );
223
+ const goTo = getStyleBookNavigationFromPath( path );
157
224
 
158
225
  const mergedConfig = useMemo( () => {
159
226
  if ( ! isObjectEmpty( userConfig ) && ! isObjectEmpty( baseConfig ) ) {
@@ -228,18 +295,20 @@ function StyleBook( {
228
295
  settings={ settings }
229
296
  sizes={ sizes }
230
297
  title={ tab.title }
298
+ goTo={ goTo }
231
299
  />
232
300
  </Tabs.TabPanel>
233
301
  ) ) }
234
302
  </Tabs>
235
303
  ) : (
236
304
  <StyleBookBody
237
- examples={ examples }
305
+ examples={ examplesForSinglePageUse }
238
306
  isSelected={ isSelected }
239
307
  onClick={ onClick }
240
308
  onSelect={ onSelect }
241
309
  settings={ settings }
242
310
  sizes={ sizes }
311
+ goTo={ goTo }
243
312
  />
244
313
  ) }
245
314
  </div>
@@ -256,9 +325,11 @@ const StyleBookBody = ( {
256
325
  settings,
257
326
  sizes,
258
327
  title,
328
+ goTo,
259
329
  } ) => {
260
330
  const [ isFocused, setIsFocused ] = useState( false );
261
-
331
+ const [ hasIframeLoaded, setHasIframeLoaded ] = useState( false );
332
+ const iframeRef = useRef( null );
262
333
  // The presence of an `onClick` prop indicates that the Style Book is being used as a button.
263
334
  // In this case, add additional props to the iframe to make it behave like a button.
264
335
  const buttonModeProps = {
@@ -287,8 +358,17 @@ const StyleBookBody = ( {
287
358
  readonly: true,
288
359
  };
289
360
 
361
+ const handleLoad = () => setHasIframeLoaded( true );
362
+ useLayoutEffect( () => {
363
+ if ( goTo?.block && hasIframeLoaded && iframeRef?.current ) {
364
+ scrollToSection( `example-${ goTo?.block }`, iframeRef?.current );
365
+ }
366
+ }, [ iframeRef?.current, goTo?.block, scrollToSection, hasIframeLoaded ] );
367
+
290
368
  return (
291
369
  <Iframe
370
+ onLoad={ handleLoad }
371
+ ref={ iframeRef }
292
372
  className={ clsx( 'edit-site-style-book__iframe', {
293
373
  'is-focused': isFocused && !! onClick,
294
374
  'is-button': !! onClick,
@@ -353,10 +433,8 @@ const Examples = memo(
353
433
  title={ example.title }
354
434
  content={ example.content }
355
435
  blocks={ example.blocks }
356
- isSelected={ isSelected( example.name ) }
357
- onClick={ () => {
358
- onSelect?.( example.name );
359
- } }
436
+ isSelected={ isSelected?.( example.name ) }
437
+ onClick={ () => onSelect?.( example.name ) }
360
438
  />
361
439
  ) ) }
362
440
  { !! filteredExamples?.subcategories?.length &&
@@ -392,7 +470,7 @@ const Subcategory = ( { examples, isSelected, onSelect } ) => {
392
470
  title={ example.title }
393
471
  content={ example.content }
394
472
  blocks={ example.blocks }
395
- isSelected={ isSelected( example.name ) }
473
+ isSelected={ isSelected?.( example.name ) }
396
474
  onClick={ () => {
397
475
  onSelect?.( example.name );
398
476
  } }
@@ -31,47 +31,33 @@ const postTypesWithoutParentTemplate = [
31
31
  const authorizedPostTypes = [ 'page', 'post' ];
32
32
 
33
33
  function useResolveEditedEntityAndContext( { postId, postType } ) {
34
- const {
35
- hasLoadedAllDependencies,
36
- homepageId,
37
- postsPageId,
38
- url,
39
- frontPageTemplateId,
40
- } = useSelect( ( select ) => {
41
- const { getEntityRecord, getEntityRecords } = select( coreDataStore );
42
- const siteData = getEntityRecord( 'root', 'site' );
43
- const base = getEntityRecord( 'root', '__unstableBase' );
44
- const templates = getEntityRecords( 'postType', TEMPLATE_POST_TYPE, {
45
- per_page: -1,
46
- } );
47
- const _homepageId =
48
- siteData?.show_on_front === 'page' &&
49
- [ 'number', 'string' ].includes( typeof siteData.page_on_front ) &&
50
- !! +siteData.page_on_front // We also need to check if it's not zero(`0`).
51
- ? siteData.page_on_front.toString()
52
- : null;
53
- const _postsPageId =
54
- siteData?.show_on_front === 'page' &&
55
- [ 'number', 'string' ].includes( typeof siteData.page_for_posts )
56
- ? siteData.page_for_posts.toString()
57
- : null;
58
- let _frontPageTemplateId;
59
- if ( templates ) {
60
- const frontPageTemplate = templates.find(
61
- ( t ) => t.slug === 'front-page'
62
- );
63
- _frontPageTemplateId = frontPageTemplate
64
- ? frontPageTemplate.id
65
- : false;
66
- }
67
- return {
68
- hasLoadedAllDependencies: !! base && !! siteData,
69
- homepageId: _homepageId,
70
- postsPageId: _postsPageId,
71
- url: base?.home,
72
- frontPageTemplateId: _frontPageTemplateId,
73
- };
74
- }, [] );
34
+ const { hasLoadedAllDependencies, homepageId, postsPageId } = useSelect(
35
+ ( select ) => {
36
+ const { getEntityRecord } = select( coreDataStore );
37
+ const siteData = getEntityRecord( 'root', 'site' );
38
+ const _homepageId =
39
+ siteData?.show_on_front === 'page' &&
40
+ [ 'number', 'string' ].includes(
41
+ typeof siteData.page_on_front
42
+ ) &&
43
+ !! +siteData.page_on_front // We also need to check if it's not zero(`0`).
44
+ ? siteData.page_on_front.toString()
45
+ : null;
46
+ const _postsPageId =
47
+ siteData?.show_on_front === 'page' &&
48
+ [ 'number', 'string' ].includes(
49
+ typeof siteData.page_for_posts
50
+ )
51
+ ? siteData.page_for_posts.toString()
52
+ : null;
53
+ return {
54
+ hasLoadedAllDependencies: !! siteData,
55
+ homepageId: _homepageId,
56
+ postsPageId: _postsPageId,
57
+ };
58
+ },
59
+ []
60
+ );
75
61
 
76
62
  /**
77
63
  * This is a hook that recreates the logic to resolve a template for a given WordPress postID postTypeId
@@ -99,7 +85,6 @@ function useResolveEditedEntityAndContext( { postId, postType } ) {
99
85
  getEditedEntityRecord,
100
86
  getEntityRecords,
101
87
  getDefaultTemplateId,
102
- __experimentalGetTemplateForLink,
103
88
  } = select( coreDataStore );
104
89
 
105
90
  function resolveTemplateForPostTypeAndId(
@@ -111,14 +96,31 @@ function useResolveEditedEntityAndContext( { postId, postType } ) {
111
96
  postTypeToResolve === 'page' &&
112
97
  homepageId === postIdToResolve
113
98
  ) {
114
- // We're still checking whether the front page template exists.
115
- // Don't resolve the template yet.
116
- if ( frontPageTemplateId === undefined ) {
117
- return undefined;
118
- }
99
+ // The /lookup endpoint cannot currently handle a lookup
100
+ // when a page is set as the front page, so specifically in
101
+ // that case, we want to check if there is a front page
102
+ // template, and instead of falling back to the home
103
+ // template, we want to fall back to the page template.
104
+ const templates = getEntityRecords(
105
+ 'postType',
106
+ TEMPLATE_POST_TYPE,
107
+ {
108
+ per_page: -1,
109
+ }
110
+ );
111
+ if ( templates ) {
112
+ const id = templates?.find(
113
+ ( { slug } ) => slug === 'front-page'
114
+ )?.id;
115
+ if ( id ) {
116
+ return id;
117
+ }
119
118
 
120
- if ( !! frontPageTemplateId ) {
121
- return frontPageTemplateId;
119
+ // If no front page template is found, continue with the
120
+ // logic below (fetching the page template).
121
+ } else {
122
+ // Still resolving `templates`.
123
+ return undefined;
122
124
  }
123
125
  }
124
126
 
@@ -135,8 +137,7 @@ function useResolveEditedEntityAndContext( { postId, postType } ) {
135
137
  postTypeToResolve === 'page' &&
136
138
  postsPageId === postIdToResolve
137
139
  ) {
138
- return __experimentalGetTemplateForLink( editedEntity.link )
139
- ?.id;
140
+ return getDefaultTemplateId( { slug: 'home' } );
140
141
  }
141
142
  // First see if the post/page has an assigned template and fetch it.
142
143
  const currentTemplateSlug = editedEntity.template;
@@ -194,20 +195,9 @@ function useResolveEditedEntityAndContext( { postId, postType } ) {
194
195
  }
195
196
 
196
197
  // If we're not rendering a specific page, use the front page template.
197
- if ( url ) {
198
- const template = __experimentalGetTemplateForLink( url );
199
- return template?.id;
200
- }
198
+ return getDefaultTemplateId( { slug: 'front-page' } );
201
199
  },
202
- [
203
- homepageId,
204
- postsPageId,
205
- hasLoadedAllDependencies,
206
- url,
207
- postId,
208
- postType,
209
- frontPageTemplateId,
210
- ]
200
+ [ homepageId, postsPageId, hasLoadedAllDependencies, postId, postType ]
211
201
  );
212
202
 
213
203
  const context = useMemo( () => {
@@ -6,13 +6,13 @@ import WelcomeGuideStyles from './styles';
6
6
  import WelcomeGuidePage from './page';
7
7
  import WelcomeGuideTemplate from './template';
8
8
 
9
- export default function WelcomeGuide() {
9
+ export default function WelcomeGuide( { postType } ) {
10
10
  return (
11
11
  <>
12
12
  <WelcomeGuideEditor />
13
13
  <WelcomeGuideStyles />
14
- <WelcomeGuidePage />
15
- <WelcomeGuideTemplate />
14
+ { postType === 'page' && <WelcomeGuidePage /> }
15
+ { postType === 'wp_template' && <WelcomeGuideTemplate /> }
16
16
  </>
17
17
  );
18
18
  }
@@ -6,11 +6,6 @@ import { Guide } from '@wordpress/components';
6
6
  import { __ } from '@wordpress/i18n';
7
7
  import { store as preferencesStore } from '@wordpress/preferences';
8
8
 
9
- /**
10
- * Internal dependencies
11
- */
12
- import { store as editSiteStore } from '../../store';
13
-
14
9
  export default function WelcomeGuidePage() {
15
10
  const { toggle } = useDispatch( preferencesStore );
16
11
 
@@ -23,8 +18,7 @@ export default function WelcomeGuidePage() {
23
18
  'core/edit-site',
24
19
  'welcomeGuide'
25
20
  );
26
- const { isPage } = select( editSiteStore );
27
- return isPageActive && ! isEditorActive && isPage();
21
+ return isPageActive && ! isEditorActive;
28
22
  }, [] );
29
23
 
30
24
  if ( ! isVisible ) {
@@ -7,16 +7,9 @@ import { __ } from '@wordpress/i18n';
7
7
  import { store as preferencesStore } from '@wordpress/preferences';
8
8
  import { store as editorStore } from '@wordpress/editor';
9
9
 
10
- /**
11
- * Internal dependencies
12
- */
13
- import useEditedEntityRecord from '../use-edited-entity-record';
14
-
15
10
  export default function WelcomeGuideTemplate() {
16
11
  const { toggle } = useDispatch( preferencesStore );
17
12
 
18
- const { isLoaded, record } = useEditedEntityRecord();
19
- const isPostTypeTemplate = isLoaded && record.type === 'wp_template';
20
13
  const { isActive, hasPreviousEntity } = useSelect( ( select ) => {
21
14
  const { getEditorSettings } = select( editorStore );
22
15
  const { get } = select( preferencesStore );
@@ -26,7 +19,7 @@ export default function WelcomeGuideTemplate() {
26
19
  !! getEditorSettings().onNavigateToPreviousEntityRecord,
27
20
  };
28
21
  }, [] );
29
- const isVisible = isActive && isPostTypeTemplate && hasPreviousEntity;
22
+ const isVisible = isActive && hasPreviousEntity;
30
23
 
31
24
  if ( ! isVisible ) {
32
25
  return null;