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,7 +4,7 @@ import { useRef, useState, useEffect } from 'react';
import { motion, useInView } from 'framer-motion';
import { ScrollReveal, StaggerReveal } from '@/components/ui/scroll-reveal';
import { ArrowRight, Target, Heart, Lightbulb, CheckCircle2 } from 'lucide-react';
import { GrainOverlay, FloatingInkParticles, SectionLabel, EASE_OUT } from '@/components/ui/page-decoration';
import { GrainOverlay, SectionLabel, EASE_OUT } from '@/components/ui/page-decoration';
import { useReducedMotion } from '@/hooks/use-reduced-motion';
const CORE_VALUES = [
@@ -140,8 +140,7 @@ export default function AboutContentV2() {
{/* Hero Section */}
<section className="relative min-h-[85vh] flex items-center overflow-hidden bg-ink">
<GrainOverlay />
<FloatingInkParticles />
<div className="absolute inset-0 bg-gradient-to-b from-ink-light/30 via-transparent to-ink pointer-events-none" />
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10 w-full py-28 sm:py-36 md:py-44 lg:py-56">
@@ -347,8 +346,7 @@ export default function AboutContentV2() {
{/* CTA Section */}
<section className="relative py-20 sm:py-28 md:py-36 lg:py-44 overflow-hidden">
<GrainOverlay />
<FloatingInkParticles />
<div className="absolute inset-0 bg-gradient-to-b from-ink to-ink-light/50 pointer-events-none" />
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10">
@@ -8,7 +8,7 @@ import {
import { ScrollReveal, StaggerReveal } from '@/components/ui/scroll-reveal';
import { MetricCard } from '@/components/ui/metric-card';
import { MilestoneTimeline } from '@/components/ui/milestone-timeline';
import { GrainOverlay, FloatingInkParticles, SectionLabel } from '@/components/ui/page-decoration';
import { GrainOverlay, SectionLabel } from '@/components/ui/page-decoration';
const CORE_VALUES = [
{
@@ -153,7 +153,6 @@ export default function AboutContentV3() {
{/* Hero Section */}
<section className="relative min-h-[85vh] flex items-center overflow-hidden bg-ink">
<GrainOverlay />
<FloatingInkParticles />
<div className="absolute inset-0 bg-gradient-to-b from-ink-light/30 via-transparent to-ink pointer-events-none" />
@@ -408,7 +407,6 @@ export default function AboutContentV3() {
{/* CTA Section */}
<section className="relative py-20 sm:py-28 md:py-36 lg:py-44 overflow-hidden">
<GrainOverlay />
<FloatingInkParticles />
<div className="absolute inset-0 bg-gradient-to-b from-ink to-ink-light/50 pointer-events-none" />
@@ -105,16 +105,18 @@ function HeroSection({ data }: { data: AboutData }) {
>
<a
href={data.heroPrimaryCtaHref || '#'}
aria-label={data.heroPrimaryCtaLabel || '预约咨询'}
className="group inline-flex items-center justify-center gap-3 px-10 py-5 font-semibold text-base bg-brand text-white transition-all duration-300 hover:bg-brand/90 min-h-[52px] touch-manipulation"
>
{data.heroPrimaryCtaLabel || ''}
{data.heroPrimaryCtaLabel || '预约咨询'}
<ArrowUpRight className="w-4 h-4 transition-transform duration-300 group-hover:translate-x-0.5 group-hover:-translate-y-0.5" />
</a>
<a
href={data.heroSecondaryCtaHref || '#'}
aria-label={data.heroSecondaryCtaLabel || '了解更多'}
className="inline-flex items-center justify-center gap-3 px-10 py-5 font-semibold text-base text-ink border border-border-primary hover:border-border-secondary hover:bg-bg-secondary transition-all duration-300 min-h-[52px] touch-manipulation"
>
{data.heroSecondaryCtaLabel || ''}
{data.heroSecondaryCtaLabel || '了解更多'}
</a>
</motion.div>
</div>
@@ -377,16 +379,18 @@ function CTASection({ data }: { data: AboutData }) {
<div className="flex flex-col sm:flex-row gap-4 sm:gap-6">
<a
href={data.ctaPrimaryHref || '#'}
aria-label={data.ctaPrimaryLabel || '预约咨询'}
className="group inline-flex items-center justify-center gap-3 px-10 py-5 font-semibold text-base bg-brand text-white transition-all duration-300 hover:bg-brand/90 min-h-[52px] touch-manipulation"
>
{data.ctaPrimaryLabel || ''}
{data.ctaPrimaryLabel || '预约咨询'}
<ArrowUpRight className="w-4 h-4 transition-transform duration-300 group-hover:translate-x-0.5 group-hover:-translate-y-0.5" />
</a>
<a
href={data.ctaSecondaryHref || '#'}
aria-label={data.ctaSecondaryLabel || '了解更多'}
className="inline-flex items-center justify-center gap-3 px-10 py-5 font-semibold text-base text-ink border border-border-primary hover:border-border-secondary hover:bg-bg-secondary transition-all duration-300 min-h-[52px] touch-manipulation"
>
{data.ctaSecondaryLabel || ''}
{data.ctaSecondaryLabel || '了解更多'}
</a>
</div>
</motion.div>
@@ -0,0 +1,397 @@
'use client';
import { motion } from 'framer-motion';
import { ScrollReveal } from '@/components/ui/scroll-reveal';
import {
ArrowRight,
Target,
Eye,
Heart,
TrendingUp,
Shield,
Users,
Building2,
Globe,
ChevronRight,
} from 'lucide-react';
const EASE_OUT = [0.22, 1, 0.36, 1] as const;
// ============ 品牌数据 ============
const brandValues = [
{
icon: Target,
title: '结果导向',
description: '每个项目都以可衡量的业务改善为交付标准,不追求表面完工,只关注真实价值。',
},
{
icon: Eye,
title: '远见卓识',
description: '立足行业前沿,帮助企业预见技术趋势,提前布局数字化能力,而非被动应对。',
},
{
icon: Heart,
title: '长期陪伴',
description: '不做一次性项目,而是成为企业数字化转型的长期伙伴,共同穿越技术迭代周期。',
},
{
icon: TrendingUp,
title: '持续进化',
description: '方法论与工具持续迭代,保持对新技术、新模式的敏锐度,确保方案始终领先一步。',
},
];
const milestones = [
{
year: '2014',
title: '扬帆起航',
description: '核心团队组建,聚焦企业信息化咨询与系统集成服务,服务首批制造行业客户。',
highlight: '起点',
},
{
year: '2016',
title: '能力沉淀',
description: '建立自有方法论体系,完成 ERP、CRM 等核心产品线布局,服务客户突破 50 家。',
highlight: '50+',
},
{
year: '2018',
title: '行业深耕',
description: '业务覆盖制造、零售、医疗、金融四大行业,推出行业化解决方案,团队规模突破 100 人。',
highlight: '4 行业',
},
{
year: '2020',
title: '平台升级',
description: '完成核心产品云化改造,推出数据中台与 BI 平台,助力企业应对数字化转型加速需求。',
highlight: '云化',
},
{
year: '2022',
title: '生态扩展',
description: '业务拓展至教育、物流行业,服务客户突破 300 家,建立产学研合作生态。',
highlight: '300+',
},
{
year: '2024',
title: '品牌升级',
description: '正式确立「睿新致远」品牌,以数据驱动的决策能力为核心价值主张,服务客户突破 500 家。',
highlight: '500+',
},
];
const brandStats = [
{ value: '12+', label: '年行业深耕' },
{ value: '500+', label: '服务企业' },
{ value: '200+', label: '专业顾问' },
{ value: '6', label: '行业覆盖' },
];
export default function BrandContent() {
return (
<main className="min-h-screen bg-white overflow-x-hidden">
{/* ============ L1: Hero 品牌情感入口 ============ */}
<section className="relative min-h-[90vh] flex items-center overflow-hidden bg-white">
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10 w-full py-28 sm:py-36 md:py-44 lg:py-56">
<div className="max-w-4xl">
{/* 眉标 */}
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.1, ease: EASE_OUT }}
className="mb-8 sm:mb-10"
>
<span className="inline-flex items-center gap-2 px-3 py-1.5 bg-brand/[0.08] border border-brand/20 rounded-full">
<span className="w-1.5 h-1.5 rounded-full bg-brand" />
<span className="text-[13px] font-semibold text-brand tracking-[0.08em] uppercase">
品牌故事
</span>
</span>
</motion.div>
{/* 主标题 */}
<motion.h1
initial={{ opacity: 0, y: 40 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.2, ease: EASE_OUT }}
className="text-4xl sm:text-5xl md:text-6xl lg:text-7xl xl:text-8xl font-black text-ink leading-[0.92] tracking-tightest mb-8 sm:mb-10"
>
睿新致远
<br />
<span className="text-brand">以技术驱动业务增长</span>
</motion.h1>
{/* 数据条 */}
<motion.div
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.7, delay: 0.4, ease: EASE_OUT }}
className="flex flex-wrap gap-6 sm:gap-10 md:gap-14 mb-10"
>
{brandStats.map((stat, i) => (
<div key={i} className="flex items-baseline gap-2">
<span className="text-3xl sm:text-4xl md:text-5xl font-black text-brand tabular-nums leading-none">
{stat.value}
</span>
<span className="text-sm text-text-muted whitespace-nowrap">
{stat.label}
</span>
</div>
))}
</motion.div>
{/* 副标题 */}
<motion.p
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.7, delay: 0.5, ease: EASE_OUT }}
className="text-lg sm:text-xl text-text-secondary/70 max-w-2xl leading-relaxed"
>
12 年深耕企业数字化,从战略规划到系统落地,陪伴 500+ 企业实现可衡量的业务改善。
我们相信,技术的力量在于让每一家企业都拥有数据驱动的决策能力。
</motion.p>
</div>
</div>
</section>
{/* ============ L2: 品牌价值理性支撑 ============ */}
{/* 品牌定位 */}
<section className="relative py-24 sm:py-32 md:py-40 overflow-hidden bg-bg-secondary">
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10">
<ScrollReveal className="max-w-3xl mb-16 sm:mb-20">
<div className="flex items-center gap-3 mb-6">
<div className="w-10 h-px bg-brand" />
<span className="text-[13px] tracking-[0.15em] font-medium text-brand">
品牌定位
</span>
</div>
<h2 className="font-sans text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-black text-ink tracking-tight leading-[1.05]">
做企业数字化转型的
<span className="text-brand">长期同行者</span>
</h2>
<p className="text-text-secondary leading-relaxed mt-6 text-base sm:text-lg max-w-2xl">
我们不是传统的外包服务商,而是深度嵌入客户业务的战略伙伴。
从需求诊断到系统落地,从数据治理到决策赋能,我们陪伴企业穿越转型周期的每一个阶段。
</p>
</ScrollReveal>
{/* 品牌价值观 */}
<div className="grid sm:grid-cols-2 lg:grid-cols-4 gap-6">
{brandValues.map((item, i) => (
<ScrollReveal key={item.title} delay={i * 0.1}>
<div className="group relative bg-white border border-border-primary p-8 h-full transition-all duration-300 hover:border-brand/20 hover:shadow-md">
<div className="absolute top-0 left-0 right-0 h-0.5 bg-brand scale-x-0 group-hover:scale-x-100 transition-transform duration-500 origin-left" />
<div className="w-12 h-12 flex items-center justify-center bg-brand/[0.06] text-brand mb-6 transition-colors duration-300 group-hover:bg-brand group-hover:text-white">
<item.icon className="w-5 h-5" />
</div>
<h3 className="text-lg font-bold text-ink mb-3">{item.title}</h3>
<p className="text-sm text-text-secondary leading-relaxed">{item.description}</p>
</div>
</ScrollReveal>
))}
</div>
</div>
</section>
{/* 品牌使命与愿景 */}
<section className="relative py-24 sm:py-32 md:py-40 overflow-hidden bg-white">
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10">
<div className="grid lg:grid-cols-2 gap-16 lg:gap-20">
{/* 使命 */}
<ScrollReveal>
<div className="relative border border-border-primary p-10 sm:p-12 lg:p-14 h-full">
<div className="absolute top-0 left-0 bottom-0 w-1 bg-brand" />
<div className="flex items-center gap-4 mb-8">
<div className="w-14 h-14 flex items-center justify-center bg-brand text-white">
<Target className="w-6 h-6" />
</div>
<div>
<span className="text-[11px] tracking-[0.2em] uppercase text-text-muted font-medium">Mission</span>
<h3 className="text-2xl font-black text-ink tracking-tight">品牌使命</h3>
</div>
</div>
<p className="text-2xl sm:text-3xl font-black text-ink leading-tight tracking-tight">
让每一家企业
<br />
都拥有<span className="text-brand">数据驱动</span>的
<br />
决策能力
</p>
<p className="text-text-secondary leading-relaxed mt-8">
我们致力于消除技术与业务之间的鸿沟,让数据不再沉睡在系统中,而是成为企业决策的「导航仪」。
通过咨询、软件、数据的深度融合,帮助企业建立可持续的数字化竞争力。
</p>
</div>
</ScrollReveal>
{/* 愿景 */}
<ScrollReveal delay={0.1}>
<div className="relative border border-border-primary bg-dark-bg text-dark-text-primary p-10 sm:p-12 lg:p-14 h-full">
<div className="absolute top-0 left-0 bottom-0 w-1 bg-brand" />
<div className="flex items-center gap-4 mb-8">
<div className="w-14 h-14 flex items-center justify-center bg-brand text-white">
<Eye className="w-6 h-6" />
</div>
<div>
<span className="text-[11px] tracking-[0.2em] uppercase text-dark-text-muted font-medium">Vision</span>
<h3 className="text-2xl font-black text-dark-text-primary tracking-tight">品牌愿景</h3>
</div>
</div>
<p className="text-2xl sm:text-3xl font-black text-dark-text-primary leading-tight tracking-tight">
成为中国企业
<br />
<span className="text-brand">数字化转型</span>的
<br />
首选伙伴
</p>
<p className="text-dark-text-secondary leading-relaxed mt-8">
我们致力于成为企业数字化转型的首选品牌——当企业需要技术赋能业务增长时,第一个想到睿新致远。
这不仅意味着技术能力的领先,更意味着专业可信赖的品牌承诺。
</p>
</div>
</ScrollReveal>
</div>
</div>
</section>
{/* ============ L3: 品牌信任证明 — 发展历程 ============ */}
<section className="relative py-24 sm:py-32 md:py-40 overflow-hidden bg-bg-secondary">
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10">
<ScrollReveal className="max-w-3xl mb-16 sm:mb-20">
<div className="flex items-center gap-3 mb-6">
<div className="w-10 h-px bg-brand" />
<span className="text-[13px] tracking-[0.15em] font-medium text-brand">
发展历程
</span>
</div>
<h2 className="font-sans text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-black text-ink tracking-tight leading-[1.05]">
12 年深耕,每一步都
<span className="text-brand">脚踏实地</span>
</h2>
</ScrollReveal>
{/* 时间线 */}
<div className="relative">
{/* 竖线 */}
<div className="absolute left-4 md:left-1/2 top-0 bottom-0 w-px bg-border-primary -translate-x-1/2 hidden md:block" />
<div className="space-y-12 md:space-y-16">
{milestones.map((item, i) => (
<ScrollReveal key={item.year} delay={i * 0.08}>
<div className={`relative flex flex-col md:flex-row gap-6 md:gap-12 ${i % 2 === 0 ? 'md:flex-row' : 'md:flex-row-reverse'}`}>
{/* 时间节点 */}
<div className="md:w-1/2 flex md:justify-end items-center">
<div className={`${i % 2 === 0 ? 'md:text-right md:pr-12' : 'md:text-left md:pl-12'} flex-1`}>
<div className="flex items-center gap-4 md:justify-end mb-3">
<span className="text-3xl sm:text-4xl font-black text-brand tracking-tight">
{item.year}
</span>
<span className="text-[11px] tracking-[0.15em] uppercase text-text-muted bg-bg-tertiary px-2 py-0.5">
{item.highlight}
</span>
</div>
<h3 className="text-lg font-bold text-ink mb-2">{item.title}</h3>
<p className="text-sm text-text-secondary leading-relaxed">{item.description}</p>
</div>
</div>
{/* 时间线节点 */}
<div className="hidden md:flex absolute left-1/2 top-0 -translate-x-1/2 flex-col items-center">
<div className="w-3 h-3 rounded-full bg-brand border-2 border-white shadow-sm" />
</div>
{/* 移动端节点 */}
<div className="md:hidden flex items-center gap-4">
<div className="w-3 h-3 rounded-full bg-brand shrink-0" />
<div className="w-8 h-px bg-brand/30" />
</div>
{/* 右侧占位 */}
<div className="hidden md:block md:w-1/2" />
</div>
</ScrollReveal>
))}
</div>
</div>
</div>
</section>
{/* 品牌实力 */}
<section className="relative py-24 sm:py-32 md:py-40 overflow-hidden bg-white">
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10">
<ScrollReveal className="max-w-3xl mb-16 sm:mb-20">
<div className="flex items-center gap-3 mb-6">
<div className="w-10 h-px bg-brand" />
<span className="text-[13px] tracking-[0.15em] font-medium text-brand">
品牌实力
</span>
</div>
<h2 className="font-sans text-2xl sm:text-3xl md:text-4xl lg:text-5xl font-black text-ink tracking-tight leading-[1.05]">
用实力赢得
<span className="text-brand">每一份信任</span>
</h2>
</ScrollReveal>
<div className="grid sm:grid-cols-2 lg:grid-cols-4 gap-6">
{[
{ icon: Building2, title: '500+ 企业客户', desc: '覆盖制造、零售、医疗、金融、教育、物流六大行业' },
{ icon: Users, title: '200+ 专业顾问', desc: '核心团队来自头部咨询公司与科技企业,平均从业经验 8 年以上' },
{ icon: Shield, title: '可验证的交付质量', desc: '90%+ 方案落地率,客户满意度持续保持在 95% 以上' },
{ icon: Globe, title: '全行业覆盖', desc: '从传统制造到新兴零售,方法论适配多行业场景' },
].map((item, i) => (
<ScrollReveal key={item.title} delay={i * 0.1}>
<div className="group relative bg-bg-secondary border border-border-primary p-8 h-full transition-all duration-300 hover:border-brand/20 hover:bg-white hover:shadow-sm">
<div className="w-12 h-12 flex items-center justify-center bg-brand/[0.06] text-brand mb-6 transition-colors duration-300 group-hover:bg-brand group-hover:text-white">
<item.icon className="w-5 h-5" />
</div>
<h3 className="text-lg font-bold text-ink mb-3">{item.title}</h3>
<p className="text-sm text-text-secondary leading-relaxed">{item.desc}</p>
</div>
</ScrollReveal>
))}
</div>
</div>
</section>
{/* ============ L4: CTA 品牌行动号召 ============ */}
<section className="relative py-24 sm:py-32 md:py-44 overflow-hidden bg-dark-bg">
<div className="absolute top-0 left-0 right-0 h-px bg-gradient-to-r from-transparent via-dark-border to-transparent" />
<div className="absolute inset-0 pointer-events-none">
<div className="absolute top-1/3 right-1/4 w-[500px] h-[500px] bg-brand/[0.04] rounded-full blur-[140px]" />
</div>
<div className="max-w-container mx-auto px-4 sm:px-6 lg:px-10 relative z-10">
<ScrollReveal className="max-w-3xl">
<h2 className="font-sans text-2xl sm:text-3xl md:text-4xl lg:text-6xl xl:text-7xl font-black text-dark-text-primary tracking-tightest leading-[0.9] mb-8 sm:mb-10">
成为下一个
<br />
<span className="text-brand">数据驱动型企业</span>
</h2>
<p className="text-dark-text-secondary text-lg leading-relaxed mb-12 sm:mb-16 max-w-xl">
无论您处于数字化转型的哪个阶段,我们都愿意成为您的长期伙伴。
从一次深入的业务诊断开始,开启您的数据驱动之旅。
</p>
<div className="flex flex-col sm:flex-row gap-4 sm:gap-6">
<a
href="/contact"
className="group inline-flex items-center justify-center gap-3 px-10 py-5 font-semibold text-base bg-brand text-white transition-all duration-300 hover:bg-brand/90 min-h-[52px]"
>
预约咨询
<ArrowRight className="w-5 h-5 transition-transform duration-300 group-hover:translate-x-1" />
</a>
<a
href="/cases"
className="group inline-flex items-center justify-center gap-2 px-10 py-5 font-semibold text-base text-dark-text-primary border border-dark-border hover:border-dark-text-muted transition-all duration-300 min-h-[52px]"
>
查看客户案例
<ChevronRight className="w-4 h-4 transition-transform duration-300 group-hover:translate-x-1" />
</a>
</div>
</ScrollReveal>
</div>
</section>
</main>
);
}
+12
View File
@@ -0,0 +1,12 @@
import { Metadata } from 'next';
import { COMPANY_INFO } from '@/lib/constants';
import BrandContent from './brand-content';
export const metadata: Metadata = {
title: `品牌故事 - ${COMPANY_INFO.displayName}`,
description: `了解${COMPANY_INFO.name}的品牌理念、使命愿景与发展历程。12年深耕企业数字化,以「睿新致远」为品牌精神,专注可衡量的业务改善。`,
};
export default function BrandPage() {
return <BrandContent />;
}