优化了创作界面结构

调整创作主页桌面端为左侧完整栏与右侧内容区的真实布局

恢复创作主页主内容滚动能力,避免隐藏下方功能

同步更新创作主页改版文档中的结构约束
This commit is contained in:
2026-06-21 18:00:12 +08:00
parent de9eaef28f
commit da34d19b46
3 changed files with 166 additions and 143 deletions
@@ -133,7 +133,7 @@ Tab
- 实现首屏主视觉、九大功能区、最近项目区和陶泥儿精选素材瀑布流。
- 桌面端复用现有平台壳层,保留上方栏和左侧导航栏。
- 主页整体采用浅色布局,避免外站品牌文案。
- 视觉排版参考陶土质感创作工具工作台:首屏标题居中、主按钮与社区按钮使用大号圆角胶囊尺寸,九大创作工具以 3 列大卡片展示,卡片左侧保留大号陶土感图标区域,右侧展示原有标题与描述;`/creation` 场景下的平台顶部栏和左侧导航压平成单层工作台 chrome,避免外框套内框;桌面端顶部栏按“左侧品牌区 / 中部搜索框 / 右侧钱包账号区”固定分区,左侧栏保持接近参考图的宽侧栏、横向图标按钮和单层导航胶囊,不回退为窄图标栏;只调整样式与布局,不改文案、搜索、登录、导航、项目创建、社区弹层、最近项目、精选素材 Tab 或数据读取逻辑。
- 视觉排版参考陶土质感创作工具工作台:首屏标题居中、主按钮与社区按钮使用大号圆角胶囊尺寸,九大创作工具以 3 列大卡片展示,卡片左侧保留大号陶土感图标区域,右侧展示原有标题与描述;`/creation` 场景下的平台顶部栏和左侧导航压平成单层工作台 chrome,避免外框套内框;桌面端页面结构必须先分为“左侧完整栏 / 右侧内容区”,左侧完整栏同时包含顶部品牌 Logo 和下方导航页签,右侧内容区再拆为顶部搜索、钱包账号栏与下方主屏,不能用顶部栏的第一列假装左侧品牌区;左侧栏保持接近参考图的宽侧栏、横向图标按钮和单层导航胶囊,不回退为窄图标栏;只调整样式与布局,不改文案、搜索、登录、导航、项目创建、社区弹层、最近项目、精选素材 Tab 或数据读取逻辑。
- 背景、顶部品牌小陶偶、左侧导航、按钮和九大创作工具图标使用 `gpt-image-2` / image2 生成资源,统一保存在 `public/creation-home/`;资源只作为装饰图标或背景纹理接入,不包含图内文字,不替换或隐藏现有 UI 文案和交互。
- 社群入口复用现有玩家社区弹层,点击后必须停留在 `/creation`
- 不在 UI 中放规则说明、实现说明或“暂不实装”提示。
+126 -98
View File
@@ -4970,6 +4970,95 @@ export function RpgEntryHomeView({
onClose={() => setIsApiKeysModalOpen(false)}
/>
) : null;
const desktopBrandLockup: ReactNode = (
<span className="creation-home-brand-lockup shrink-0">
<img
src={CREATION_HOME_TOPBAR_ASSETS.brandMascot}
alt=""
aria-hidden="true"
draggable={false}
className="creation-home-brand-lockup__art"
/>
<RpgEntryBrandLogo className="shrink-0" decorative />
</span>
);
const desktopSearchBar: ReactNode = (
<PublicCodeSearchBar
value={desktopSearchKeyword}
onChange={updateDesktopSearchKeyword}
onSubmit={submitDesktopSearch}
isSearching={!onSearchPublicCode || Boolean(isSearchingPublicCode)}
className="max-w-[34rem] flex-1"
/>
);
const desktopTopbarActions: ReactNode = (
<div className="platform-desktop-topbar__actions flex items-center gap-3">
{isAuthenticated && (activeTab === 'create' || activeTab === 'saves') ? (
<TopbarWalletShortcutButton
variant="desktop"
balanceLabel={profileDashboardPresentation.walletBalanceWithUnitLabel}
onClick={openRechargeOrRewardCodeModal}
/>
) : null}
<button
type="button"
onClick={openUserSurface}
className="platform-desktop-search flex items-center gap-3 px-3 py-2.5 text-left"
>
<span
className="flex h-11 w-11 items-center justify-center overflow-hidden rounded-full text-base font-black text-white"
style={{
background: 'var(--platform-profile-avatar-fill)',
boxShadow: 'var(--platform-profile-avatar-shadow)',
}}
>
{avatarUrl ? (
<img src={avatarUrl} alt="" className="h-full w-full object-cover" />
) : (
avatarLabel
)}
</span>
<span className="min-w-0">
<span className="block truncate text-sm font-semibold text-[var(--platform-text-strong)]">
{authUi?.user?.displayName || '登录'}
</span>
<span className="block truncate text-xs text-[var(--platform-text-soft)]">
{authUi?.user ? publicUserCode : '账号入口'}
</span>
</span>
</button>
</div>
);
const desktopRailNav: ReactNode = (
<nav className="platform-desktop-rail flex w-[5.8rem] shrink-0 flex-col gap-3 p-3">
{visibleDesktopNavTabs.map((tab) => (
<DesktopTabButton
key={tab}
active={isPlatformHomeTab(tab) && activeTab === tab}
label={tabLabels[tab]}
icon={tabIcons[tab]}
creationHomeIconSrc={CREATION_HOME_NAV_ICON_SRC[tab]}
emphasized={tab === 'create'}
showDot={false}
disabled={isRechargePaymentConfirmationPending}
onClick={() => {
if (isRechargePaymentConfirmationPending) {
return;
}
if (tab === 'create') {
onOpenCreateTypePicker();
return;
}
if (tab === 'projects') {
onOpenProjects?.();
return;
}
onTabChange(tab);
}}
/>
))}
</nav>
);
if (!isDesktopLayout) {
const isMobileRecommendTab = activeTab === 'home';
@@ -5139,108 +5228,47 @@ export function RpgEntryHomeView({
>
<div className="flex h-full min-h-0 flex-col">
<div className="platform-desktop-shell flex h-full min-h-0 flex-col p-5 xl:p-6">
<div className="platform-desktop-topbar flex items-center gap-4 px-5 py-4">
<div className="platform-desktop-topbar__brand-search flex min-w-0 flex-1 items-center gap-5">
<span className="creation-home-brand-lockup shrink-0">
<img
src={CREATION_HOME_TOPBAR_ASSETS.brandMascot}
alt=""
aria-hidden="true"
draggable={false}
className="creation-home-brand-lockup__art"
/>
<RpgEntryBrandLogo className="shrink-0" decorative />
</span>
<PublicCodeSearchBar
value={desktopSearchKeyword}
onChange={updateDesktopSearchKeyword}
onSubmit={submitDesktopSearch}
isSearching={
!onSearchPublicCode || Boolean(isSearchingPublicCode)
}
className="max-w-[34rem] flex-1"
/>
</div>
{allowHiddenActiveTab ? (
<div className="platform-desktop-layout flex min-h-0 flex-1">
<aside className="platform-desktop-leftbar flex shrink-0 flex-col">
{desktopBrandLockup}
{desktopRailNav}
</aside>
<div className="platform-desktop-topbar__actions flex items-center gap-3">
{isAuthenticated &&
(activeTab === 'create' || activeTab === 'saves') ? (
<TopbarWalletShortcutButton
variant="desktop"
balanceLabel={
profileDashboardPresentation.walletBalanceWithUnitLabel
}
onClick={openRechargeOrRewardCodeModal}
/>
) : null}
<button
type="button"
onClick={openUserSurface}
className="platform-desktop-search flex items-center gap-3 px-3 py-2.5 text-left"
>
<span
className="flex h-11 w-11 items-center justify-center overflow-hidden rounded-full text-base font-black text-white"
style={{
background: 'var(--platform-profile-avatar-fill)',
boxShadow: 'var(--platform-profile-avatar-shadow)',
}}
>
{avatarUrl ? (
<img
src={avatarUrl}
alt=""
className="h-full w-full object-cover"
/>
) : (
avatarLabel
)}
</span>
<span className="min-w-0">
<span className="block truncate text-sm font-semibold text-[var(--platform-text-strong)]">
{authUi?.user?.displayName || '登录'}
</span>
<span className="block truncate text-xs text-[var(--platform-text-soft)]">
{authUi?.user ? publicUserCode : '账号入口'}
</span>
</span>
</button>
</div>
</div>
<div className="platform-desktop-main flex min-w-0 flex-1 flex-col">
<div className="platform-desktop-topbar flex items-center gap-4 px-5 py-4">
<div className="platform-desktop-topbar__brand-search flex min-w-0 flex-1 items-center gap-5">
{desktopSearchBar}
</div>
<div className="mt-5 flex min-h-0 gap-5">
<aside className="platform-desktop-rail flex w-[5.8rem] shrink-0 flex-col gap-3 p-3">
{visibleDesktopNavTabs.map((tab) => (
<DesktopTabButton
key={tab}
active={isPlatformHomeTab(tab) && activeTab === tab}
label={tabLabels[tab]}
icon={tabIcons[tab]}
creationHomeIconSrc={CREATION_HOME_NAV_ICON_SRC[tab]}
emphasized={tab === 'create'}
showDot={false}
disabled={isRechargePaymentConfirmationPending}
onClick={() => {
if (isRechargePaymentConfirmationPending) {
return;
}
if (tab === 'create') {
onOpenCreateTypePicker();
return;
}
if (tab === 'projects') {
onOpenProjects?.();
return;
}
onTabChange(tab);
}}
/>
))}
</aside>
{desktopTopbarActions}
</div>
<div className="platform-tab-panel-stack min-w-0 flex-1">
{tabPanels}
<div className="platform-tab-panel-stack min-w-0 flex-1">
{tabPanels}
</div>
</div>
</div>
</div>
) : (
<>
<div className="platform-desktop-topbar flex items-center gap-4 px-5 py-4">
<div className="platform-desktop-topbar__brand-search flex min-w-0 flex-1 items-center gap-5">
{desktopBrandLockup}
{desktopSearchBar}
</div>
{desktopTopbarActions}
</div>
<div className="mt-5 flex min-h-0 gap-5">
{desktopRailNav}
<div className="platform-tab-panel-stack min-w-0 flex-1">
{tabPanels}
</div>
</div>
</>
)}
</div>
</div>
</div>
+39 -44
View File
@@ -10687,12 +10687,8 @@ button.image-canvas-editor__reference-chip:disabled {
--creation-home-sidebar-width: 13.75rem;
border-color: rgba(221, 191, 166, 0.9);
border-radius: 1.85rem;
padding: 0 !important;
background:
linear-gradient(
90deg,
rgba(255, 250, 245, 0.94) 0 var(--creation-home-sidebar-width),
transparent var(--creation-home-sidebar-width)
),
linear-gradient(rgba(255, 250, 244, 0.72), rgba(255, 250, 244, 0.72)),
url('/creation-home/background-clay-workspace.png') center top / 64rem 64rem repeat,
linear-gradient(180deg, #fffaf4 0%, #fffdf9 52%, #fff8f0 100%);
@@ -10700,32 +10696,36 @@ button.image-canvas-editor__reference-chip:disabled {
}
.creation-home-stage .platform-desktop-shell::before {
background:
linear-gradient(
90deg,
transparent 0 var(--creation-home-sidebar-width),
rgba(219, 190, 166, 0.72) var(--creation-home-sidebar-width),
rgba(219, 190, 166, 0.72) calc(var(--creation-home-sidebar-width) + 1px),
transparent calc(var(--creation-home-sidebar-width) + 1px)
);
opacity: 1;
display: none;
}
.creation-home-stage .platform-desktop-shell::after {
display: none;
}
.creation-home-stage .platform-desktop-layout {
position: relative;
z-index: 1;
width: 100%;
height: 100%;
}
.creation-home-stage .platform-desktop-leftbar {
width: var(--creation-home-sidebar-width);
min-height: 0;
border-right: 1px solid rgba(219, 190, 166, 0.72);
background: rgba(255, 250, 245, 0.46);
padding: 1.22rem 1rem 1.3rem;
}
.creation-home-stage .platform-desktop-main {
min-height: 0;
}
.creation-home-stage .platform-desktop-topbar {
display: grid;
grid-template-columns:
var(--creation-home-sidebar-width)
minmax(8rem, 19.65rem)
minmax(24rem, 38.75rem)
minmax(1rem, 1fr)
auto;
display: flex;
gap: 1rem;
min-height: 5.65rem;
margin: -1.25rem -1.25rem 0;
min-height: 5.9rem;
border: 0;
border-bottom: 1px solid rgba(219, 190, 166, 0.72);
border-radius: 0;
@@ -10738,9 +10738,9 @@ button.image-canvas-editor__reference-chip:disabled {
display: none;
}
.creation-home-stage .platform-desktop-topbar > .flex:first-child,
.creation-home-stage .platform-desktop-topbar__brand-search {
display: contents;
justify-content: flex-start;
padding-left: clamp(10rem, 18vw, 22rem);
}
.creation-home-stage .platform-brand-logo {
@@ -10748,16 +10748,16 @@ button.image-canvas-editor__reference-chip:disabled {
}
.creation-home-stage .creation-home-brand-lockup {
grid-column: 1;
align-self: center;
align-self: flex-start;
gap: 0.62rem;
padding-left: 0.24rem;
min-height: 4.35rem;
padding-left: 0.48rem;
}
.creation-home-stage .creation-home-brand-lockup__art {
display: block;
width: 3.38rem;
height: 3.38rem;
width: 3.44rem;
height: 3.44rem;
flex: 0 0 auto;
border-radius: 999px;
object-fit: cover;
@@ -10779,18 +10779,13 @@ button.image-canvas-editor__reference-chip:disabled {
.creation-home-stage
.platform-desktop-topbar__brand-search
> .platform-desktop-search {
grid-column: 3;
align-self: center;
width: 100%;
max-width: 38.75rem !important;
}
.creation-home-stage .platform-desktop-topbar > .flex:last-child,
.creation-home-stage .platform-desktop-topbar__actions {
grid-column: 5;
align-self: center;
justify-self: end;
padding-right: 0.98rem;
margin-left: auto;
}
.creation-home-stage .platform-desktop-search {
@@ -10878,17 +10873,10 @@ button.image-canvas-editor__reference-chip:disabled {
height: 3.34rem;
}
.creation-home-stage .platform-desktop-shell > .mt-5 {
position: relative;
z-index: 1;
margin-top: 0;
gap: 0;
}
.creation-home-stage .platform-desktop-rail {
align-self: flex-start;
width: 10.28rem;
margin: 1.42rem 1.26rem 0 0.3rem;
margin: 1.82rem auto 0;
border-color: rgba(220, 192, 168, 0.7);
border-radius: 1.55rem;
background: rgba(255, 250, 244, 0.54);
@@ -10984,13 +10972,20 @@ button.image-canvas-editor__reference-chip:disabled {
}
.creation-home-stage .platform-tab-panel-stack {
min-height: 0;
background: transparent;
}
.creation-home-stage .platform-tab-panel {
height: 100%;
overflow: auto;
padding-right: 0;
}
.creation-home-stage .creation-landing {
background: transparent;
}
.platform-desktop-trending-item {
position: relative;
overflow: hidden;