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
+28 -23
View File
@@ -1,9 +1,8 @@
'use client';
import { motion } from 'framer-motion';
import { ArrowRight, MessageCircle, Download } from 'lucide-react';
import { ArrowRight, MessageCircle } from 'lucide-react';
import type { HeroTheme } from '@/lib/constants/hero-themes';
import { DESIGN_SYSTEM } from '@/lib/constants/design-system';
interface DetailCTASectionProps {
theme: HeroTheme;
@@ -21,48 +20,54 @@ export function DetailCTASection({
secondaryAction,
}: DetailCTASectionProps) {
return (
<section className="relative py-24 lg:py-32 overflow-hidden bg-bg-secondary">
<div className="absolute top-0 left-0 right-0 h-px bg-border-primary" />
<div className="absolute bottom-0 left-0 right-0 h-px bg-border-primary" />
<section className="relative py-24 sm:py-32 md:py-40 overflow-hidden bg-brand-section">
{/* 背景纹理 */}
<div className="absolute inset-0 pointer-events-none opacity-[0.04]"
style={{
backgroundImage: `radial-gradient(circle at 25% 25%, rgba(255,255,255,0.3) 1px, transparent 1px)`,
backgroundSize: '48px 48px',
}}
/>
<div className="absolute inset-0 pointer-events-none">
<div className="absolute top-1/3 right-1/4 w-[500px] h-[500px] bg-white/[0.03] rounded-full blur-[140px]" />
</div>
<div className="container-wide relative">
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10">
<motion.div
initial={{ opacity: 0, y: 32 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: '-100px' }}
transition={{ duration: 0.8, ease: [0.4, 0, 0.2, 1] }}
className="max-w-3xl mx-auto text-center"
transition={{ duration: 0.8, ease: [0.22, 1, 0.36, 1] }}
className="max-w-3xl"
>
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-brand-soft text-brand text-sm font-medium mb-6 border border-brand/20">
{/* 标签 */}
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/10 text-white/80 text-sm font-medium mb-8 border border-white/20">
<MessageCircle className="w-4 h-4" />
免费咨询
</div>
<h2 className={`${DESIGN_SYSTEM.typography.hero.title} text-ink mb-6`}>
<h2 className="text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-black text-white tracking-tight leading-[0.95] mb-10">
{title}
</h2>
<p className="text-lg md:text-xl text-text-secondary mb-12 max-w-2xl mx-auto leading-relaxed">
<p className="text-lg md:text-xl text-white/70 max-w-2xl leading-relaxed mb-12">
{description}
</p>
<div className="flex flex-col sm:flex-row items-center justify-center gap-5">
<motion.a
<div className="flex flex-col sm:flex-row items-start sm:items-center gap-5">
<a
href={primaryAction.href}
whileHover={{ scale: 1.02, y: -2 }}
whileTap={{ scale: 0.98 }}
className="group relative inline-flex items-center gap-3 px-10 py-4 bg-brand text-white font-bold rounded-xl shadow-md hover:shadow-lg transition-all duration-300"
className="group inline-flex items-center gap-3 px-10 py-4 bg-white text-brand font-bold text-base hover:bg-white/90 transition-all duration-200"
>
<span>{primaryAction.label}</span>
<ArrowRight className="w-5 h-5 group-hover:translate-x-1 transition-transform" />
</motion.a>
<ArrowRight className="w-5 h-5 transition-transform duration-300 group-hover:translate-x-1" />
</a>
{secondaryAction && (
<a
href={secondaryAction.href}
className="group inline-flex items-center gap-2.5 px-8 py-4 text-ink font-semibold rounded-xl border-2 border-border-primary hover:bg-white hover:border-brand/30 transition-all duration-300"
className="group inline-flex items-center gap-2.5 px-8 py-4 text-white/80 font-semibold text-sm border border-white/30 hover:border-white/60 hover:text-white hover:bg-white/10 transition-all duration-200"
>
<Download className="w-5 h-5 transition-transform duration-300 group-hover:-translate-y-0.5" />
{secondaryAction.label}
</a>
)}
@@ -73,7 +78,7 @@ export function DetailCTASection({
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
transition={{ delay: 0.5, duration: 0.6 }}
className="mt-10 text-sm text-text-muted"
className="mt-10 text-sm text-white/50"
>
平均响应时间 &lt; 2小时 · 7×24小时技术支持 · 无需预付费用
</motion.p>
@@ -81,4 +86,4 @@ export function DetailCTASection({
</div>
</section>
);
}
}