'use client'; import { motion } from 'framer-motion'; import { ScrollReveal } from '@/components/ui/scroll-reveal'; import { CTAButton } from '@/components/ui/cta-button'; import { Shield, Building2, Users, Code, Target, Layers, BookOpen, Sparkles, type LucideIcon } from 'lucide-react'; import { EASE_OUT } from '@/components/ui/page-decoration'; import { useReducedMotion } from '@/hooks/use-reduced-motion'; /** Icon name-to-component mapping for CMS string-based icons */ const ICON_MAP: Record = { Shield, Building2, Users, Code, Target, Layers, BookOpen, Sparkles, }; interface StrengthData { number: string; title: string; description: string; iconName: string; } interface CultureData { number: string; title: string; description: string; iconName: string; } interface ParagraphData { text: string; } interface TeamData { heroSubtitle?: string; heroTitle?: string; heroDescription?: string; heroPrimaryCtaLabel?: string; heroPrimaryCtaHref?: string; heroSecondaryCtaLabel?: string; heroSecondaryCtaHref?: string; strengths?: StrengthData[]; culture?: CultureData[]; stats?: { value: number; suffix: string; label: string }[]; aboutTitle?: string; aboutParagraphs?: ParagraphData[]; ctaTitle?: string; ctaDescription?: string; ctaPrimaryLabel?: string; ctaPrimaryHref?: string; ctaSecondaryLabel?: string; ctaSecondaryHref?: string; } function StrengthCard({ strength, index }: { strength: StrengthData; index: number }) { const Icon = ICON_MAP[strength.iconName] ?? Shield; const shouldReduceMotion = useReducedMotion(); return (
{/* 纯装饰序号:与右侧 h3 标题并列,无独立语义。 aria-hidden 让 WCAG 1.4.3 对比度要求不适用于装饰内容(1.13:1 无需强行提亮) */}

{strength.title}

{strength.description}

); } function CultureCard({ culture, index }: { culture: CultureData; index: number }) { const Icon = ICON_MAP[culture.iconName] ?? Layers; const shouldReduceMotion = useReducedMotion(); return (

{culture.title}

{culture.description}

); } export default function TeamContentV3({ data }: { data: Record }) { const teamData = data as TeamData; const strengths = teamData.strengths ?? []; const culture = teamData.culture ?? []; const stats = teamData.stats ?? []; const aboutParagraphs = teamData.aboutParagraphs ?? []; // Empty state when no CMS data is available if (!data || Object.keys(data).length === 0) { return (
内容暂未发布
); } return (
{/* ============ L1: Hero 团队情感入口 ============ */}
{/* 眉标 Badge */} {teamData.heroSubtitle || '核心团队'} {/* 主标题 — Bain 风格:大号加粗 + 品牌红关键词 */} {(teamData.heroTitle || '').split('\n').map((line, i) => ( {i > 0 && } {i === 0 ? line : {line}} ))} {/* 数据指标条 — Bain 风格:答案优先,数据先行 */} {stats.length > 0 && ( {stats.map((stat, i) => (
{stat.value}{stat.suffix} {stat.label}
))}
)} {/* 描述 — alpha 0.7 仅 4.35:1 未达 WCAG AA 4.5:1,提到 0.8 → 5.74:1,视觉几乎无变化 */} {teamData.heroDescription && ( {teamData.heroDescription} )} {/* CTA 按钮组 */} {teamData.heroPrimaryCtaLabel || '加入我们'} {teamData.heroSecondaryCtaLabel && ( {teamData.heroSecondaryCtaLabel} )}
{/* ============ L2: 团队实力理性支撑 ============ */} {strengths.length > 0 && (
团队实力

专业团队背景, 结果导向 的交付能力

复合型专家团队,从战略咨询到技术落地,全链路覆盖

{strengths.map((strength, idx) => ( ))}
)} {/* Team About Section */} {(teamData.aboutTitle || aboutParagraphs.length > 0) && (
关于我们

{teamData.aboutTitle || ''}

{aboutParagraphs.map((p, i) => (

{p.text}

))}
)} {/* ============ L3: 团队文化信任证明 ============ */} {culture.length > 0 && (
团队文化

专业文化,让每个项目都成为 行业标杆

好的团队文化,最终体现在为客户创造的价值上

{culture.map((item, idx) => ( ))}
)} {/* ============ L4: CTA 团队行动号召 ============ */}

{teamData.ctaTitle || '成为下一个'}
数据驱动型企业

{teamData.ctaDescription || '无论您处于数字化转型的哪个阶段,我们都愿意成为您的长期伙伴。'}

{teamData.ctaPrimaryLabel || '预约咨询'} {teamData.ctaSecondaryLabel || '查看客户案例'}
); }