调整首页品牌文案层级

更新首页唯一 H1、小眉题、产品说明与权益文案
统一游戏美术 AI 创作工具 H2 和功能弹窗 H2 语义
补充首页标题层级测试与 SEO、创作主页文档约束
This commit is contained in:
2026-07-12 19:32:11 +08:00
parent 300e69c97d
commit 2b13067492
5 changed files with 91 additions and 29 deletions
@@ -9,7 +9,9 @@
- `public/robots.txt` 是真实静态文件;非 SEO 产品路径本轮阻止抓取,但不把 `Disallow` 解释为保证不收录。
- `public/sitemap.xml` 本轮只包含 `https://www.genarrative.world/`,不写难以持续维护的 `lastmod`
- `index.html` 提供首页 title、description、canonical、robots、基础 OG/Twitter 文本和 JSON-LD;没有正式分享图时不写 `og:image``twitter:image` 或 JSON-LD `logo`
- 首页渲染后只有一个稳定、可见的产品定位 H1;动态作品名、卡片标题、按钮内部标题和隐藏 Tab 不作为 H1。
- 桌面首页与 `/creation` 创作主页渲染后只有一个稳定、可见的产品定位 H1,固定为 `陶泥儿 · 开启全民精品游戏创作`;小眉题、产品说明、权益提示、动态作品名、卡片标题、按钮内部标题、弹窗标题和隐藏 Tab 不作为 H1。
- H1 下方真实展示游戏美术 AI 工作台、美术 Agent、无限画布以及角色、场景、UI、宣发素材说明,不使用透明、极小、屏幕外或页面底部堆词文本;`游戏美术 AI 创作工具` 使用 H2,能力卡标题使用 H3。
- 本轮可见首页文案调整不得删除或改写已经验收的 title、description、canonical、robots、OG/Twitter 文本和 JSON-LD。
- Nginx 和 Pingora 只对当前已知完整 SPA 路径回退 `index.html`;未知路径以及 `/creation/not-exist` 等同前缀未知路径返回 HTTP 404。
- Nginx access log 继续使用现有 `$http_referer`,本轮不新增前端 pageview 或用户身份采集。
@@ -22,10 +22,12 @@
### 顶部品牌区
- 题:`陶泥儿 - 开启全民精品游戏创作`
- 小眉题:`陶泥儿 Genarrative|游戏美术 AI 创作工具`,保持普通小字,不使用 heading 标签。
- 唯一 H1`陶泥儿 · 开启全民精品游戏创作`
- 产品说明:`面向个人创作者的游戏美术 AI 工作台。用美术 Agent 与无限画布,快速制作角色、场景、UI 与宣发素材。`,作为 H1 下方真实可见的普通正文分两行展示。
- 主按钮:`开始创作`
- 社群入口:原地弹出“玩家社区”二维码弹窗,复用现有社区弹层能力,不跳转或切换到“我的 / 用户中心”。
- 营销点:`登录即送100泥点,可以免费制作50个素材`
- 营销点:`登录即送 100 泥点,可以免费制作 50 个素材`,作为产品说明下方的小字权益提示。
`开始创作` 与“新建项目”使用同一项目创建链路。用户已登录时调用现有 `createEditorProject`,成功后进入 `/editor/canvas?projectid=xxx&guide=toolbar`,画布只消费一次 `guide=toolbar` 并清理 query,用于显示新画布工具栏引导;未登录或登录过期时打开登录弹窗,并在登录后重试创建。
@@ -33,7 +35,7 @@
### 九大创作工具能力
创作主页展示九项能力,用于说明陶泥儿创作工具覆盖范围:
分区标题使用 H2 `游戏美术 AI 创作工具`创作主页展示九项能力,用于说明陶泥儿创作工具覆盖范围,卡片标题继续使用 H3
1. 游戏视觉规范:轻松约束多类素材视觉一致性。
2. 游戏角色:整套高完成度 2D / 3D 角色素材及动画。
@@ -156,16 +156,34 @@ describe('CreationLandingView', () => {
renderCreationLanding();
expect(screen.getByRole('main', { name: '陶泥儿创作主页' })).toBeTruthy();
expect(screen.getAllByRole('heading', { level: 1 })).toHaveLength(1);
expect(
screen.getByRole('heading', {
name: '游戏美术AI工作台,让个人创作者更快做出角色、场景与宣发素材',
level: 1,
name: '陶泥儿 · 开启全民精品游戏创作',
}),
).toBeTruthy();
expect(
screen.getByText(/ Genarrative Agent /u),
screen.getByText('陶泥儿 Genarrative|游戏美术 AI 创作工具'),
).toBeTruthy();
const subtitle = screen.getByText(
/ AI /u,
);
expect(subtitle.textContent).toContain('美术 Agent');
expect(subtitle.textContent).toContain('无限画布');
expect(subtitle.textContent).toContain('角色、场景、UI 与宣发素材');
expect(
screen.getByText('登录即送 100 泥点,可以免费制作 50 个素材'),
).toBeTruthy();
expect(
screen.getByRole('heading', {
level: 2,
name: '游戏美术 AI 创作工具',
}),
).toBeTruthy();
expect(
screen.getByRole('heading', { level: 3, name: '游戏视觉规范' }),
).toBeTruthy();
expect(screen.getByRole('heading', { name: '创作工具' })).toBeTruthy();
expect(screen.getByText('游戏视觉规范')).toBeTruthy();
expect(screen.getByRole('heading', { name: '陶泥儿精选' })).toBeTruthy();
expect(screen.getByRole('tab', { name: '全部' })).toBeTruthy();
expect(screen.queryByRole('tab', { name: '素材包' })).toBeNull();
@@ -310,6 +328,10 @@ describe('CreationLandingView', () => {
await user.click(screen.getByRole('button', { name: //u }));
const dialog = screen.getByRole('dialog', { name: '抱歉' });
expect(screen.getAllByRole('heading', { level: 1 })).toHaveLength(1);
expect(
within(dialog).getByRole('heading', { level: 2, name: '抱歉' }),
).toBeTruthy();
expect(dialog.textContent).toContain('功能还在调试中');
expect(dialog.textContent).toContain('暂未开放');
expect(dialog.closest('.platform-theme--light')).toBeTruthy();
@@ -858,14 +858,20 @@ export function CreationLandingView({
<main className="creation-landing" aria-label="陶泥儿创作主页">
<section className="creation-landing__hero">
<div className="creation-landing__hero-copy">
<span className="creation-landing__eyebrow"></span>
<h1>
AI工作台
</h1>
<p>
Genarrative Agent
10050
</p>
<span className="creation-landing__eyebrow">
Genarrative AI
</span>
<h1> · </h1>
<div className="creation-landing__hero-detail">
<p className="creation-landing__hero-subtitle">
AI
<br />
Agent UI
</p>
<p className="creation-landing__hero-benefit">
100 50
</p>
</div>
<div className="creation-landing__hero-actions">
<PlatformActionButton
size="md"
@@ -913,7 +919,7 @@ export function CreationLandingView({
<section className="creation-landing__section">
<div className="creation-landing__section-header">
<div>
<h2></h2>
<h2> AI </h2>
</div>
</div>
<div className="creation-landing__feature-grid">
@@ -1089,7 +1095,7 @@ export function CreationLandingView({
alt=""
className="platform-mobile-home-welcome-dialog__icon"
/>
<h1 className="platform-mobile-home-welcome-dialog__title"></h1>
<h2 className="platform-mobile-home-welcome-dialog__title"></h2>
<p className="platform-mobile-home-welcome-dialog__copy">
<br />
+41 -11
View File
@@ -3428,8 +3428,8 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
color: #8c796c;
font-size: clamp(0.86rem, 1.2vw, 1.02rem);
font-weight: 860;
letter-spacing: 0.56em;
text-indent: 0.56em;
letter-spacing: 0.18em;
text-indent: 0.18em;
}
.creation-landing__hero h1 {
@@ -3443,13 +3443,33 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
line-height: 1.04;
}
.creation-landing__hero p {
.creation-landing__hero-detail {
display: grid;
max-width: 54rem;
justify-items: center;
gap: 0.42rem;
}
.creation-landing__hero-subtitle,
.creation-landing__hero-benefit {
margin: 0;
color: #8a7466;
font-size: clamp(1rem, 1.45vw, 1.28rem);
font-weight: 820;
letter-spacing: 0.38em;
text-indent: 0.38em;
text-indent: 0;
}
.creation-landing__hero-subtitle {
font-size: clamp(1rem, 1.55vw, 1.35rem);
font-weight: 620;
letter-spacing: 0.04em;
line-height: 1.7;
}
.creation-landing__hero-benefit {
color: #9a6f56;
font-size: clamp(0.8rem, 0.92vw, 0.94rem);
font-weight: 680;
letter-spacing: 0.08em;
line-height: 1.55;
}
.creation-landing__hero-actions {
@@ -4339,10 +4359,20 @@ html[data-mobile-keyboard-open='true'] .platform-mobile-bottom-dock {
padding-top: 1.6rem;
}
.creation-landing__eyebrow,
.creation-landing__hero p {
letter-spacing: 0.18em;
text-indent: 0.18em;
.creation-landing__eyebrow {
letter-spacing: 0.1em;
text-indent: 0.1em;
}
.creation-landing__hero-subtitle {
font-size: 0.95rem;
letter-spacing: 0.02em;
line-height: 1.62;
}
.creation-landing__hero-benefit {
font-size: 0.8rem;
letter-spacing: 0.04em;
}
.creation-landing__hero-actions {