From a9188e6f6a4d009701c8b529489468f4db8f36f2 Mon Sep 17 00:00:00 2001
From: Shaun Andrews
Date: Tue, 16 Jun 2026 15:48:36 -0400
Subject: [PATCH 1/2] Agentic UI: combine new-site entry points
---
.../components/blueprint-selector/index.tsx | 87 +++++++++++--------
.../blueprint-selector/style.module.css | 20 +++++
.../route-onboarding-blueprint/index.tsx | 7 +-
.../router/route-onboarding-create/index.tsx | 2 +-
.../router/route-onboarding-home/index.tsx | 12 +--
apps/ui/src/ui-desks/onboarding/index.tsx | 1 +
6 files changed, 76 insertions(+), 53 deletions(-)
diff --git a/apps/ui/src/components/blueprint-selector/index.tsx b/apps/ui/src/components/blueprint-selector/index.tsx
index c6d6f3a93f..807c96805e 100644
--- a/apps/ui/src/components/blueprint-selector/index.tsx
+++ b/apps/ui/src/components/blueprint-selector/index.tsx
@@ -26,6 +26,7 @@ interface BlueprintSelectorProps {
featured: FeaturedBlueprint[] | undefined;
isFeaturedLoading: boolean;
onPick: ( blueprint: PickedBlueprint ) => void;
+ onPickEmpty: () => void;
}
const FILE_ACCEPT = 'application/json,.json,application/zip,.zip';
@@ -34,6 +35,7 @@ export function BlueprintSelector( {
featured,
isFeaturedLoading,
onPick,
+ onPickEmpty,
}: BlueprintSelectorProps ) {
const connector = useConnector();
const [ uploadError, setUploadError ] = useState< string | null >( null );
@@ -183,7 +185,7 @@ export function BlueprintSelector( {
- { __( 'Featured blueprints' ) }
+ { __( 'Choose a starting point' ) }
{ isFeaturedLoading && (
{ __( 'Loading featured blueprints…' ) }
) }
@@ -192,45 +194,54 @@ export function BlueprintSelector( {
{ __( 'No featured blueprints available right now.' ) }
) }
- { featured && featured.length > 0 && (
-
- { featured.map( ( item ) => (
-
-
+
+
+
+
+
{ __( 'Empty site' ) }
+
+ { __( 'Start with a clean WordPress install and build from scratch.' ) }
+
+
+
+
+ { featured?.map( ( item ) => (
+
+ handleFeaturedClick( item ) }
+ >
+ { item.image && (
+
+ ) }
+
+
{ item.title }
+
{ item.excerpt }
+
+
+ { item.playgroundUrl && (
+ handleFeaturedClick( item ) }
- >
- { item.image && (
-
+ variant="minimal"
+ tone="neutral"
+ size="small"
+ className={ styles.previewButton }
+ onClick={ ( event ) => handlePreviewClick( event, item ) }
+ aria-label={ sprintf(
+ // translators: %s is the blueprint title.
+ __( 'Preview %s in Playground' ),
+ item.title
) }
-
-
{ item.title }
-
{ item.excerpt }
-
-
- { item.playgroundUrl && (
- handlePreviewClick( event, item ) }
- aria-label={ sprintf(
- // translators: %s is the blueprint title.
- __( 'Preview %s in Playground' ),
- item.title
- ) }
- >
-
- { __( 'Preview' ) }
-
- ) }
-
- ) ) }
-
- ) }
+ >
+
+ { __( 'Preview' ) }
+
+ ) }
+
+ ) ) }
+
);
diff --git a/apps/ui/src/components/blueprint-selector/style.module.css b/apps/ui/src/components/blueprint-selector/style.module.css
index 6ee1545b9d..2e30ac7e8f 100644
--- a/apps/ui/src/components/blueprint-selector/style.module.css
+++ b/apps/ui/src/components/blueprint-selector/style.module.css
@@ -78,6 +78,26 @@
background: #f0f0f0;
}
+.emptySiteMedia {
+ display: block;
+ width: 100%;
+ aspect-ratio: 16 / 9;
+ background:
+ linear-gradient(
+ 90deg,
+ color-mix(in srgb, var(--wpds-color-stroke-interactive-brand, #3858e9) 18%, transparent)
+ 1px,
+ transparent 1px
+ ),
+ linear-gradient(
+ color-mix(in srgb, var(--wpds-color-stroke-interactive-brand, #3858e9) 18%, transparent)
+ 1px,
+ transparent 1px
+ ),
+ var(--wpds-color-bg-surface-neutral, #f6f7f7);
+ background-size: 24px 24px;
+}
+
.cardBody {
display: flex;
flex-direction: column;
diff --git a/apps/ui/src/ui-classic/router/route-onboarding-blueprint/index.tsx b/apps/ui/src/ui-classic/router/route-onboarding-blueprint/index.tsx
index 099c5b8c0c..40990922d5 100644
--- a/apps/ui/src/ui-classic/router/route-onboarding-blueprint/index.tsx
+++ b/apps/ui/src/ui-classic/router/route-onboarding-blueprint/index.tsx
@@ -122,16 +122,15 @@ function OnboardingBlueprintPage() {
if ( activeStep === 'select' ) {
return (
-
{ __( 'Start from a Blueprint' ) }
+
{ __( 'Build a new site' ) }
- { __(
- 'Pick a featured Blueprint or drop in your own to provision plugins, content, and settings.'
- ) }
+ { __( 'Start from scratch or choose a Blueprint to provision plugins and settings.' ) }
void navigate( { to: '/onboarding/create' } ) }
/>
);
diff --git a/apps/ui/src/ui-classic/router/route-onboarding-create/index.tsx b/apps/ui/src/ui-classic/router/route-onboarding-create/index.tsx
index bbb98abf50..206fae4cc5 100644
--- a/apps/ui/src/ui-classic/router/route-onboarding-create/index.tsx
+++ b/apps/ui/src/ui-classic/router/route-onboarding-create/index.tsx
@@ -51,7 +51,7 @@ function CreateSitePage() {
initialValues={ proposedName ? { name: proposedName } : undefined }
existingDomainNames={ existingDomainNames ?? [] }
onSubmit={ handleSubmit }
- onCancel={ () => void navigate( { to: '/onboarding' } ) }
+ onCancel={ () => void navigate( { to: '/onboarding/blueprint' } ) }
isSubmitting={ createSite.isPending }
submitError={ submitError }
/>
diff --git a/apps/ui/src/ui-classic/router/route-onboarding-home/index.tsx b/apps/ui/src/ui-classic/router/route-onboarding-home/index.tsx
index be5ebbe680..5f1b3cb7a9 100644
--- a/apps/ui/src/ui-classic/router/route-onboarding-home/index.tsx
+++ b/apps/ui/src/ui-classic/router/route-onboarding-home/index.tsx
@@ -11,18 +11,10 @@ function OnboardingHomePage() {
{ __( 'WordPress can power anything. What are you building?' ) }
-
-
{ __( 'Create new' ) }
-
- { __( 'Start fresh with a blank site and build it with AI' ) }
-
-
-
{ __( 'Start from a blueprint' ) }
+
{ __( 'Build a new site' ) }
- { __(
- 'Pick a featured blueprint or drop in your own to provision plugins, content, and settings.'
- ) }
+ { __( 'Start from scratch or choose a Blueprint to provision plugins and settings.' ) }
diff --git a/apps/ui/src/ui-desks/onboarding/index.tsx b/apps/ui/src/ui-desks/onboarding/index.tsx
index 21bb55e602..7b4f10f537 100644
--- a/apps/ui/src/ui-desks/onboarding/index.tsx
+++ b/apps/ui/src/ui-desks/onboarding/index.tsx
@@ -226,6 +226,7 @@ export function DeskOnboardingBlueprint() {
featured={ featured.data }
isFeaturedLoading={ featured.isLoading }
onPick={ handlePick }
+ onPickEmpty={ () => void navigate( { to: '/onboarding/create' } ) }
/>
From 386b857ac52a3f959ced9b48133d5746be33c0b5 Mon Sep 17 00:00:00 2001
From: Shaun Andrews
Date: Wed, 17 Jun 2026 14:38:45 -0400
Subject: [PATCH 2/2] Fixing the alignment/scrolling for the blueprint gallery
---
.../ui/src/components/onboarding-layout/style.module.css | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/apps/ui/src/components/onboarding-layout/style.module.css b/apps/ui/src/components/onboarding-layout/style.module.css
index 62a6679ca6..b0fad6bf53 100644
--- a/apps/ui/src/components/onboarding-layout/style.module.css
+++ b/apps/ui/src/components/onboarding-layout/style.module.css
@@ -1,12 +1,15 @@
.root {
- height: 100vh;
+ box-sizing: border-box;
+ min-height: 100vh;
+ padding-block: var(--wpds-dimension-padding-3xl);
position: relative;
}
.content {
+ box-sizing: border-box;
max-width: 640px;
width: 100%;
- padding: var(--wpds-dimension-padding-3xl);
+ padding-inline: var(--wpds-dimension-padding-3xl);
}
/* `wide` variant — used by content-heavy onboarding pages like the blueprint
@@ -16,7 +19,7 @@
}
.close {
- position: absolute;
+ position: fixed;
top: 16px;
right: 16px;
}