feat(home): hero 信息层重构 — 声明先行,数据指标下沉为独立成果带

参考 Accenture Radical Relevance 设计语言(方向 A,用户已决策):
- hero 内数据条移出,主张(副标题)前置,一屏只负责一句话声明 + 一个行动
- 新增 HeroStatsBand 成果带,滚动触发(Glance 层),承接下沉的指标
- H1 字重 900→700,hero 内 KPI 数字同步收敛,对齐「字重 9→3」克制
- 右侧数据看板保持单电压(仅品牌红),hero 内已无辅助色

验证(evidence-first):
- type-check 0 errors / lint 0 errors(127 warnings 均为既有、与本改无关)
- jest 13 passed(含新断言:hero 内不含 hero-stats、数据下沉成果带仍渲染)
- 视觉回归 22 passed(首页浅/深快照已 update;19 个非首页页零 diff,证明改动仅影响首页)

含 docs/design/hero-redesign-proposal.md(设计提案,未改代码)

P0 批次;P1(点阵 token 化 + L2 光标聚光)待续
This commit is contained in:
2026-08-31 21:24:05 +08:00
parent dcc2073e1e
commit e4bbe3822d
7 changed files with 380 additions and 37 deletions
@@ -106,9 +106,13 @@ describe('HomeContentV15 - 浅色 Hero(暗黑模式 token 友好)', () => {
expect(screen.getByTestId('hero-secondary-link')).toBeInTheDocument();
});
it('keeps the answer-first stats bar visible', () => {
it('keeps hero declaration-first: stats sink out of hero into the results band', () => {
render(<HomeContentV15 stats={[{ value: '100%', label: '私有化部署' }]} />);
const hero = screen.getByTestId('hero-section');
// 声明先行:hero 内不再内联数据条(一屏只负责一句话声明 + 一个行动)
expect(hero.querySelector('[data-testid="hero-stats"]')).toBeNull();
// 数据下沉为独立成果带,仍渲染(Glance 层滚动触发)
expect(screen.getByTestId('hero-stats')).toBeInTheDocument();
});