'use client'; /** * CaseStudiesSection — L3 信任层「客户案例」共享区块(B-2 合并自 3 份本地实现) * * 合并来源与差异消解(2026-09-02,修订方案 B' 第二步): * - solution-detail-content-v3 / product-detail-content-v3 的本地实现原本 ~95% 相同, * 仅 section 底色(bg-white vs bg-bg-primary)与 h2 文案不同 → 统一为 token 底色 * (bg-bg-primary:浅色与 bg-white 视觉零差异,深色模式正确反色), * h2 文案改由 heading prop 传入(solution 传「同行业落地案例」,product 用默认「客户案例」)。 * - service-detail-content-v4 的本地实现是异类(motion.a 链接 /cases/、无 SectionLabel、 * 动效 0.8s 违规)→ 统一到本组件:卡片不带链接(/cases/ 依赖尚不存在的案例数据, * 链向 404 违反零编造);如需锚点(service hero 的 #cases CTA)用 id prop。 * * 布局要点:grid 类必须挂在 StaggerReveal 自身——它会给每个子项包一层 motion.div, * 放外层 div 时包装层成为 grid 唯一子项,卡片会堆成单列(commit 3091035 踩坑记录)。 * * 数据闸门:caseStudies 为空时 return null(L3EmptyFallback 接管兜底渲染)。 */ import { ScrollReveal, StaggerReveal } from '@/components/ui/scroll-reveal'; import { SectionLabel } from '@/components/ui/page-decoration'; /** 三处数据源(cases.ts / services.ts / products.ts)的结构公共子集 */ export interface CaseStudyItem { client: string; industry: string; challenge: string; solution?: string; result: string; } interface CaseStudiesSectionProps { caseStudies?: readonly CaseStudyItem[]; /** h2 标题文案(solution 页传「同行业落地案例」,其余用默认) */ heading?: string; /** 锚点 id(service 页 hero 的 #cases CTA 依赖) */ id?: string; } export function CaseStudiesSection({ caseStudies, heading = '客户案例', id, }: CaseStudiesSectionProps) { if (!caseStudies || caseStudies.length === 0) return null; return (
客户案例

{heading}

{/* grid 直接挂 StaggerReveal(见文件头注释),gap-px 露出容器底色形成发丝分隔线 */} {caseStudies.map((study) => (
{/* 客户名首字作占位图形(无真实配图时),纯装饰 → aria-hidden 豁免对比度 */}
{study.industry}

{study.client}

{study.challenge}

{study.result}
核心成果
))}
); }