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
+2 -4
View File
@@ -4,7 +4,7 @@ import { useCallback, useRef, useState } from 'react';
import { motion } from 'framer-motion';
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { HeroInkBackground } from '@/components/ui/hero-ink-background';
import { COMPANY_INFO } from '@/lib/constants';
import { ArrowRight, MessageSquare, Search, Rocket, Handshake } from 'lucide-react';
import { useReducedMotion } from '@/hooks/use-reduced-motion';
@@ -52,8 +52,6 @@ export function HeroSectionV2() {
aria-labelledby="hero-heading"
className="relative min-h-screen flex flex-col justify-center overflow-hidden bg-[var(--color-bg-primary)]"
>
<HeroInkBackground />
<div className="container-wide py-16 md:py-24 lg:py-32 relative z-10 flex-1 flex items-center">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-center w-full">
<div>
@@ -112,7 +110,7 @@ export function HeroSectionV2() {
>
<div
ref={cardRef}
className="relative ink-glow-border rounded-2xl lg:opacity-95"
className="relative overflow-hidden rounded-2xl lg:opacity-95 border border-[var(--color-border-primary)]"
style={
{
'--glow-start': 'var(--color-brand)',
@@ -5,7 +5,7 @@ import { useInView } from 'framer-motion';
import { useRef } from 'react';
import { METHODOLOGY } from '@/lib/constants/methodology';
import { CheckCircle2 } from 'lucide-react';
import { InkGlowCard } from '@/components/ui/ink-glow-card';
import { Card } from '@/components/ui/card';
const phaseBgOpacities = [0.1, 0.08, 0.12, 0.06];
@@ -38,9 +38,9 @@ export function MethodologySection() {
{METHODOLOGY.map((phase, idx) => {
const bgOpacity = phaseBgOpacities[idx % phaseBgOpacities.length];
return (
<InkGlowCard
<Card
key={phase.id}
index={idx}
className="relative overflow-hidden transition-all duration-300 hover:-translate-y-1 hover:shadow-lg"
>
<div className="p-6 md:p-8">
<div
@@ -78,7 +78,7 @@ export function MethodologySection() {
</ul>
</div>
</div>
</InkGlowCard>
</Card>
);
})}
</div>
+2 -2
View File
@@ -43,8 +43,8 @@ export function ProductCard({
{/* Content */}
<div className="relative z-10">
{/* Icon */}
<div className="w-10 h-10 sm:w-12 sm:h-12 rounded-lg bg-[var(--color-brand-bg)] flex items-center justify-center mb-4 sm:mb-5 transition-transform duration-500 group-hover:scale-110">
{/* Icon: 装饰性图标,对屏幕阅读器隐藏 */}
<div className="w-10 h-10 sm:w-12 sm:h-12 rounded-lg bg-[var(--color-brand-bg)] flex items-center justify-center mb-4 sm:mb-5 transition-transform duration-500 group-hover:scale-110" aria-hidden="true">
{icon}
</div>
-10
View File
@@ -78,10 +78,6 @@ jest.mock('@/components/ui/brand-visuals', () => ({
),
}));
jest.mock('@/components/ui/hero-ink-background', () => ({
HeroInkBackground: () => <div data-testid="hero-ink-bg" />,
}));
jest.mock('next/link', () => ({
__esModule: true,
default: ({ children, href, className, ...props }: any) => (
@@ -354,12 +350,6 @@ describe('HeroSectionV2', () => {
expect(screen.getAllByText('长期陪跑').length).toBeGreaterThanOrEqual(1);
});
it('should render ink background', async () => {
const { HeroSectionV2 } = await import('./hero-section-v2');
render(<HeroSectionV2 />);
expect(screen.getByTestId('hero-ink-bg')).toBeInTheDocument();
});
it('should provide CTA link to contact', async () => {
const { HeroSectionV2 } = await import('./hero-section-v2');
render(<HeroSectionV2 />);