chore: sync marketing pages, CMS extensions, tests and project docs

同步工作区剩余变更,主要包括:
- 营销页面组件与布局持续优化(about/news/services/solutions/team 等)
- 详情页四层叙事组件、布局组件、UI 组件调整
- CMS 数据模型、API 路由、权限、工作流、站内通知、媒体管理扩展
- 新增/补充单元测试与 E2E 测试(cms-workflow.spec.ts 等)
- ESLint 9 迁移、jest/tsconfig 配置更新、依赖调整
- 新增 ADR、CMS 评估文档、Release Review / Acceptance 报告
- 移除水墨装饰组件与大体积未使用字体文件
This commit is contained in:
张翔
2026-07-25 08:04:01 +08:00
parent e35090b914
commit 10404dbb36
208 changed files with 18107 additions and 8330 deletions
+4 -18
View File
@@ -123,15 +123,6 @@ jest.mock('./micro-interactions', () => ({
{children}
</button>
),
InkGlowCard: ({ children, className, active }: any) => (
<div
data-testid="ink-glow-card"
data-active={active}
className={className}
>
{children}
</div>
),
HoverLink: ({ children, href, className }: any) => (
<a data-testid="hover-link" href={href} className={className}>{children}</a>
),
@@ -225,7 +216,7 @@ jest.mock('@/lib/constants/design-system', () => ({
const mockHeroTheme = {
id: 'erp',
name: 'ERP 水墨雅致',
name: 'ERP',
gradientFrom: '#f8f6f3',
gradientTo: '#f0ebe4',
gradientAngle: 135,
@@ -404,14 +395,15 @@ describe('ProductValueSection', () => {
it('should render product title and overview', async () => {
const { ProductValueSection } = await import('./detail-product-value');
render(<ProductValueSection product={mockProduct} />);
expect(screen.getByRole('heading', { name: /为企业打造的/ })).toHaveTextContent(mockProduct.title);
const heading = screen.getByRole('heading', { name: new RegExp(mockProduct.title) });
expect(heading).toHaveTextContent('核心能力');
expect(screen.getByText(mockProduct.overview)).toBeInTheDocument();
});
it('should render feature items', async () => {
const { ProductValueSection } = await import('./detail-product-value');
render(<ProductValueSection product={mockProduct} />);
expect(screen.getByText('功能模块')).toBeInTheDocument();
expect(screen.getByText('产品功能')).toBeInTheDocument();
// Features are rendered via FeatureTags which splits on ":"
expect(screen.getByText('财务管理')).toBeInTheDocument();
});
@@ -444,12 +436,6 @@ describe('ProductValueSection', () => {
expect(screen.queryByText('用真实效果证明价值')).not.toBeInTheDocument();
});
it('should render ink glow cards for features', async () => {
const { ProductValueSection } = await import('./detail-product-value');
render(<ProductValueSection product={mockProduct} />);
const glowCards = screen.getAllByTestId('ink-glow-card');
expect(glowCards.length).toBeGreaterThanOrEqual(mockProduct.features.length);
});
});
describe('DetailTrustSection', () => {