@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.
- package/CHANGELOG.md +2 -0
- package/build/components/app/index.js +0 -2
- package/build/components/app/index.js.map +1 -1
- package/build/components/block-editor/use-editor-iframe-props.js +6 -8
- package/build/components/block-editor/use-editor-iframe-props.js.map +1 -1
- package/build/components/editor/index.js +9 -4
- package/build/components/editor/index.js.map +1 -1
- package/build/components/editor/use-editor-title.js +29 -12
- package/build/components/editor/use-editor-title.js.map +1 -1
- package/build/components/global-styles/screen-revisions/revisions-buttons.js +24 -22
- package/build/components/global-styles/screen-revisions/revisions-buttons.js.map +1 -1
- package/build/components/global-styles/shadows-edit-panel.js +2 -3
- package/build/components/global-styles/shadows-edit-panel.js.map +1 -1
- package/build/components/global-styles/ui.js +42 -2
- package/build/components/global-styles/ui.js.map +1 -1
- package/build/components/global-styles-renderer/index.js +6 -8
- package/build/components/global-styles-renderer/index.js.map +1 -1
- package/build/components/layout/hooks.js +1 -10
- package/build/components/layout/hooks.js.map +1 -1
- package/build/components/layout/index.js +1 -0
- package/build/components/layout/index.js.map +1 -1
- package/build/components/page-patterns/fields.js +3 -7
- package/build/components/page-patterns/fields.js.map +1 -1
- package/build/components/page-templates/fields.js +1 -2
- package/build/components/page-templates/fields.js.map +1 -1
- package/build/components/post-edit/index.js +14 -8
- package/build/components/post-edit/index.js.map +1 -1
- package/build/components/post-fields/index.js +3 -197
- package/build/components/post-fields/index.js.map +1 -1
- package/build/components/post-list/index.js +11 -1
- package/build/components/post-list/index.js.map +1 -1
- package/build/components/sidebar/index.js +11 -3
- package/build/components/sidebar/index.js.map +1 -1
- package/build/components/sidebar-global-styles-wrapper/index.js +129 -0
- package/build/components/sidebar-global-styles-wrapper/index.js.map +1 -0
- package/build/components/sidebar-navigation-screen-global-styles/index.js +14 -72
- package/build/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
- package/build/components/sidebar-navigation-screen-main/index.js +43 -42
- package/build/components/sidebar-navigation-screen-main/index.js.map +1 -1
- package/build/components/site-editor-routes/styles-edit.js +6 -1
- package/build/components/site-editor-routes/styles-edit.js.map +1 -1
- package/build/components/site-editor-routes/styles-view.js +8 -2
- package/build/components/site-editor-routes/styles-view.js.map +1 -1
- package/build/components/site-hub/index.js +19 -6
- package/build/components/site-hub/index.js.map +1 -1
- package/build/components/style-book/constants.js +10 -3
- package/build/components/style-book/constants.js.map +1 -1
- package/build/components/style-book/examples.js +71 -1
- package/build/components/style-book/examples.js.map +1 -1
- package/build/components/style-book/index.js +70 -11
- package/build/components/style-book/index.js.map +1 -1
- package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js +32 -32
- package/build/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
- package/build/components/welcome-guide/index.js +4 -2
- package/build/components/welcome-guide/index.js.map +1 -1
- package/build/components/welcome-guide/page.js +1 -9
- package/build/components/welcome-guide/page.js.map +1 -1
- package/build/components/welcome-guide/template.js +1 -12
- package/build/components/welcome-guide/template.js.map +1 -1
- package/build/hooks/commands/use-common-commands.js +15 -15
- package/build/hooks/commands/use-common-commands.js.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/posts.js +1 -0
- package/build/posts.js.map +1 -1
- package/build-module/components/app/index.js +0 -2
- package/build-module/components/app/index.js.map +1 -1
- package/build-module/components/block-editor/use-editor-iframe-props.js +6 -8
- package/build-module/components/block-editor/use-editor-iframe-props.js.map +1 -1
- package/build-module/components/editor/index.js +9 -4
- package/build-module/components/editor/index.js.map +1 -1
- package/build-module/components/editor/use-editor-title.js +29 -12
- package/build-module/components/editor/use-editor-title.js.map +1 -1
- package/build-module/components/global-styles/screen-revisions/revisions-buttons.js +25 -23
- package/build-module/components/global-styles/screen-revisions/revisions-buttons.js.map +1 -1
- package/build-module/components/global-styles/shadows-edit-panel.js +2 -3
- package/build-module/components/global-styles/shadows-edit-panel.js.map +1 -1
- package/build-module/components/global-styles/ui.js +43 -3
- package/build-module/components/global-styles/ui.js.map +1 -1
- package/build-module/components/global-styles-renderer/index.js +6 -8
- package/build-module/components/global-styles-renderer/index.js.map +1 -1
- package/build-module/components/layout/hooks.js +1 -9
- package/build-module/components/layout/hooks.js.map +1 -1
- package/build-module/components/layout/index.js +1 -0
- package/build-module/components/layout/index.js.map +1 -1
- package/build-module/components/page-patterns/fields.js +4 -8
- package/build-module/components/page-patterns/fields.js.map +1 -1
- package/build-module/components/page-templates/fields.js +1 -2
- package/build-module/components/page-templates/fields.js.map +1 -1
- package/build-module/components/post-edit/index.js +14 -8
- package/build-module/components/post-edit/index.js.map +1 -1
- package/build-module/components/post-fields/index.js +7 -202
- package/build-module/components/post-fields/index.js.map +1 -1
- package/build-module/components/post-list/index.js +11 -1
- package/build-module/components/post-list/index.js.map +1 -1
- package/build-module/components/sidebar/index.js +11 -3
- package/build-module/components/sidebar/index.js.map +1 -1
- package/build-module/components/sidebar-global-styles-wrapper/index.js +121 -0
- package/build-module/components/sidebar-global-styles-wrapper/index.js.map +1 -0
- package/build-module/components/sidebar-navigation-screen-global-styles/index.js +15 -73
- package/build-module/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
- package/build-module/components/sidebar-navigation-screen-main/index.js +43 -43
- package/build-module/components/sidebar-navigation-screen-main/index.js.map +1 -1
- package/build-module/components/site-editor-routes/styles-edit.js +6 -1
- package/build-module/components/site-editor-routes/styles-edit.js.map +1 -1
- package/build-module/components/site-editor-routes/styles-view.js +8 -2
- package/build-module/components/site-editor-routes/styles-view.js.map +1 -1
- package/build-module/components/site-hub/index.js +19 -6
- package/build-module/components/site-hub/index.js.map +1 -1
- package/build-module/components/style-book/constants.js +10 -3
- package/build-module/components/style-book/constants.js.map +1 -1
- package/build-module/components/style-book/examples.js +71 -1
- package/build-module/components/style-book/examples.js.map +1 -1
- package/build-module/components/style-book/index.js +71 -12
- package/build-module/components/style-book/index.js.map +1 -1
- package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js +32 -32
- package/build-module/components/sync-state-with-url/use-init-edited-entity-from-url.js.map +1 -1
- package/build-module/components/welcome-guide/index.js +4 -2
- package/build-module/components/welcome-guide/index.js.map +1 -1
- package/build-module/components/welcome-guide/page.js +1 -9
- package/build-module/components/welcome-guide/page.js.map +1 -1
- package/build-module/components/welcome-guide/template.js +1 -11
- package/build-module/components/welcome-guide/template.js.map +1 -1
- package/build-module/hooks/commands/use-common-commands.js +15 -15
- package/build-module/hooks/commands/use-common-commands.js.map +1 -1
- package/build-module/index.js +1 -0
- package/build-module/index.js.map +1 -1
- package/build-module/posts.js +1 -0
- package/build-module/posts.js.map +1 -1
- package/build-style/posts-rtl.css +54 -5
- package/build-style/posts.css +54 -5
- package/build-style/style-rtl.css +109 -28
- package/build-style/style.css +109 -28
- package/package.json +3 -4
- package/src/components/app/index.js +0 -2
- package/src/components/block-editor/use-editor-iframe-props.js +2 -3
- package/src/components/editor/index.js +16 -4
- package/src/components/editor/use-editor-title.js +37 -13
- package/src/components/editor-canvas-container/style.scss +0 -1
- package/src/components/global-styles/screen-revisions/revisions-buttons.js +28 -31
- package/src/components/global-styles/screen-revisions/style.scss +11 -17
- package/src/components/global-styles/shadows-edit-panel.js +4 -2
- package/src/components/global-styles/ui.js +42 -2
- package/src/components/global-styles-renderer/index.js +4 -10
- package/src/components/layout/hooks.js +1 -7
- package/src/components/layout/index.js +6 -1
- package/src/components/page-patterns/fields.js +6 -12
- package/src/components/page-patterns/style.scss +0 -5
- package/src/components/page-templates/fields.js +2 -3
- package/src/components/post-edit/index.js +38 -30
- package/src/components/post-edit/style.scss +7 -0
- package/src/components/post-fields/index.js +19 -273
- package/src/components/post-list/index.js +9 -3
- package/src/components/post-list/style.scss +29 -3
- package/src/components/sidebar/index.js +23 -7
- package/src/components/sidebar-global-styles-wrapper/index.js +150 -0
- package/src/components/sidebar-global-styles-wrapper/style.scss +35 -0
- package/src/components/sidebar-navigation-item/style.scss +2 -2
- package/src/components/sidebar-navigation-screen-global-styles/index.js +13 -88
- package/src/components/sidebar-navigation-screen-main/index.js +46 -45
- package/src/components/site-editor-routes/styles-edit.js +10 -1
- package/src/components/site-editor-routes/styles-view.js +11 -1
- package/src/components/site-hub/index.js +33 -16
- package/src/components/site-icon/style.scss +16 -0
- package/src/components/style-book/constants.ts +11 -3
- package/src/components/style-book/examples.tsx +105 -1
- package/src/components/style-book/index.js +86 -8
- package/src/components/sync-state-with-url/use-init-edited-entity-from-url.js +54 -64
- package/src/components/welcome-guide/index.js +3 -3
- package/src/components/welcome-guide/page.js +1 -7
- package/src/components/welcome-guide/template.js +1 -8
- package/src/hooks/commands/use-common-commands.js +253 -246
- package/src/index.js +1 -0
- package/src/posts.js +1 -0
- package/src/style.scss +2 -3
- package/build/components/async/index.js +0 -51
- package/build/components/async/index.js.map +0 -1
- package/build/components/use-edited-entity-record/index.js +0 -60
- package/build/components/use-edited-entity-record/index.js.map +0 -1
- package/build/hooks/commands/use-edit-mode-commands.js +0 -179
- package/build/hooks/commands/use-edit-mode-commands.js.map +0 -1
- package/build-module/components/async/index.js +0 -44
- package/build-module/components/async/index.js.map +0 -1
- package/build-module/components/use-edited-entity-record/index.js +0 -53
- package/build-module/components/use-edited-entity-record/index.js.map +0 -1
- package/build-module/hooks/commands/use-edit-mode-commands.js +0 -171
- package/build-module/hooks/commands/use-edit-mode-commands.js.map +0 -1
- package/src/components/async/index.js +0 -43
- package/src/components/use-edited-entity-record/index.js +0 -58
- 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(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
.
|
|
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
|
-
|
|
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 {
|
|
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={
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
//
|
|
115
|
-
//
|
|
116
|
-
if
|
|
117
|
-
|
|
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
|
-
|
|
121
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 &&
|
|
22
|
+
const isVisible = isActive && hasPreviousEntity;
|
|
30
23
|
|
|
31
24
|
if ( ! isVisible ) {
|
|
32
25
|
return null;
|