diff --git a/src/app/(marketing)/about/client.tsx b/src/app/(marketing)/about/client.tsx
index 266e966..fd4d36a 100644
--- a/src/app/(marketing)/about/client.tsx
+++ b/src/app/(marketing)/about/client.tsx
@@ -1,253 +1,147 @@
'use client';
-import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
-import { useRef, useMemo } from 'react';
-import { COMPANY_INFO, STATS } from '@/lib/constants';
-import { Card, CardContent } from '@/components/ui/card';
-import { PageHeader } from '@/components/ui/page-header';
-import { Button } from '@/components/ui/button';
+import { motion, useInView } from 'framer-motion';
+import { useRef } from 'react';
import { StaticLink } from '@/components/ui/static-link';
-import { Lightbulb, Users, Target, MapPin, Mail, ArrowRight } from 'lucide-react';
+import { RippleButton } from '@/components/ui/ripple-button';
+import { COMPANY_INFO } from '@/lib/constants';
+import { ArrowRight, Target, HeartHandshake, Award, Shield, Building2, Users, Code, TrendingUp } from 'lucide-react';
+import { useReducedMotion } from '@/hooks/use-reduced-motion';
+import { InkReveal, BlurReveal, StaggerContainer, StaggerItem, CountUp } from '@/lib/animations';
+import { TextReveal } from '@/components/ui/scroll-animations';
+
+const VALUES = [
+ { title: '务实', description: '不追逐风口,只做真正为客户创造价值的事。', icon: Target },
+ { title: '陪伴', description: '交付只是开始,长期陪跑才是我们的承诺。', icon: HeartHandshake },
+ { title: '专业', description: '用扎实的工程能力和行业经验赢得信任。', icon: Award },
+];
+
+const TEAM_PILLARS = [
+ { icon: Shield, title: '12+ 年行业深耕', description: '核心团队长期从事技术咨询、企业数字化等领域,服务覆盖金融、制造、零售、政务、农业等多个行业。' },
+ { icon: Building2, title: '大型 IT 企业背景', description: '开发团队成员来自多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。' },
+ { icon: Users, title: '复合型技术团队', description: '团队成员既懂技术又懂业务,能够深入理解客户的真实场景和痛点。' },
+ { icon: Code, title: '全栈技术能力', description: '掌握从前端到后端、从云原生到数据智能的全栈技术能力。' },
+ { icon: TrendingUp, title: '结果导向交付', description: '以"客户业务是否真正改善"为衡量标准,追求可量化的业务价值。' },
+];
+
+const COMPANY_STATS = [
+ { value: 12, label: '年+核心成员行业经验', suffix: '' },
+ { value: 5, label: '覆盖行业', suffix: '+' },
+ { value: 6, label: '自研产品', suffix: '款' },
+ { value: 98, label: '客户满意度', suffix: '%' },
+];
export function AboutClient() {
- const contentRef = useRef(null);
- const isContentInView = useInView(contentRef, { once: true, margin: '-100px' });
-
- const values = useMemo(() => [
- {
- icon: Lightbulb,
- title: '务实',
- description: '不追逐风口,只做真正为客户创造价值的事。每一个方案都源于对业务场景的深入洞察。',
- },
- {
- icon: Users,
- title: '陪伴',
- description: '交付只是开始,长期陪跑才是我们的承诺。我们关注的不只是项目是否上线,更是您的业务是否真正改善。',
- },
- {
- icon: Target,
- title: '专业',
- description: '用扎实的工程能力和行业经验赢得信任。既懂技术又懂业务,提供真正可落地的解决方案。',
- },
- ], []);
-
- const milestones = useMemo(() => [
- {
- date: '2026年1月',
- title: '公司成立',
- description: '四川睿新致远科技有限公司在成都龙泉驿区正式成立,专注于企业数字化转型解决方案',
- },
- {
- date: '2026年1月',
- title: '团队组建',
- description: '核心团队到位,技术团队拥有丰富的行业经验和专业技能',
- },
- {
- date: '2026年2月',
- title: '业务启动',
- description: '推出企业数字化转型解决方案,开始服务首批客户',
- },
- {
- date: '2026年2月',
- title: '产品研发',
- description: '启动ERP、CRM等自研产品的研发工作,致力于为企业提供一站式数字化服务',
- },
- ], []);
+ const ref = useRef(null);
+ const isInView = useInView(ref, { once: true, margin: '-100px' });
+ const shouldReduceMotion = useReducedMotion();
return (
-
+ {/* Hero - InkReveal */}
+
+
+
+
+
+ 关于 {COMPANY_INFO.shortName}
+
+ {COMPANY_INFO.slogan}
+
+
+
-
+
+ {/* 品牌理念 - TextReveal 逐词揭示 */}
+
+
+ {/* 核心理念 - BlurReveal */}
+
+
+ 我们只做一件事:成为您数字化转型路上,信得过的成长伙伴。
+
+
+
+ {/* 数据指标 - CountUp */}
-
-
睿新的选择
-
- 所以我们选择了一条不同的路。
-
-
-
-
智连未来
-
- 我们坚持对行业趋势的深度研究,不追逐昙花一现的概念。
-
-
- 每一次方案,都源于对您业务场景的洞察;
-
-
- 每一次连接,都为了让技术真正服务于您的未来。
-
-
-
-
-
成长伙伴
-
- 我们不把“项目交付”当作终点。
-
-
- 您的业务增长了吗?您的团队能力提升了吗?
-
-
- 您下一次遇到难题时,还会第一个想到我们吗?
-
-
- 这些问题,比“项目是否按时交付”更让我们在意。
-
-
-
-
-
-
品牌承诺
-
- 我们承诺:
-
-
- -
- ✅
- 不卖您用不上的技术
-
- -
- ✅
- 不说不懂业务的术语
-
- -
- ✅
- 不做路过就忘的“一锤子买卖”
-
-
-
- 我们只做一件事:成为您数字化转型路上,信得过的成长伙伴。
-
-
-
-
- {STATS.map((stat, idx) => (
-
-
- {stat.value}
- {stat.label}
-
-
- ))}
-
-
-
- 核心价值观
-
- {values.map((value, idx) => (
-
-
-
-
-
-
{value.title}
-
{value.description}
-
-
- ))}
-
-
-
-
- 发展历程
-
- {milestones.map((milestone, idx) => (
-
-
- {milestone.date}
-
-
-
{milestone.title}
-
{milestone.description}
-
-
- ))}
-
-
-
-
- 联系我们
-
-
-
-
-
-
-
公司地址
-
{COMPANY_INFO.address}
-
+ {COMPANY_STATS.map((stat) => (
+
+
+
+ {stat.suffix}
-
-
+
{stat.label}
-
+ ))}
+
- {/* Bottom CTA */}
-
-
- 想了解更多?
-
-
- 我们期待与您交流,共同探讨数字化转型之路
-
-
-
+ {/* 核心价值观 - StaggerContainer */}
+
+ {VALUES.map((value) => {
+ const Icon = value.icon;
+ return (
+
+
+
+
+
+
{value.title}
+
{value.description}
+
+
+ );
+ })}
+
+
+ {/* 团队优势 - StaggerContainer */}
+
+ {TEAM_PILLARS.map((item, idx) => {
+ const Icon = item.icon;
+ return (
+
+ = 3 ? 'md:col-span-1 lg:col-start-1' : ''}`}>
+
+
+
+
{item.title}
+
{item.description}
+
+
+ );
+ })}
+
+
+ {/* CTA */}
+
+
+ 想了解更多?
+
+
+ 我们期待与您交流,共同探讨数字化转型之路
+
+
+
+ 立即咨询
+
+
+
diff --git a/src/app/(marketing)/about/page.test.tsx b/src/app/(marketing)/about/page.test.tsx
index d866ea4..3a80045 100644
--- a/src/app/(marketing)/about/page.test.tsx
+++ b/src/app/(marketing)/about/page.test.tsx
@@ -97,7 +97,7 @@ jest.mock('@/lib/constants', () => ({
{ value: '10+', label: '企业客户' },
{ value: '20+', label: '成功案例' },
{ value: '30+', label: '项目交付' },
- { value: '12+', label: '年行业经验' },
+ { value: '12+', label: '年核心成员行业经验' },
],
}));
diff --git a/src/app/(marketing)/cases/[id]/client.tsx b/src/app/(marketing)/cases/[id]/client.tsx
index 298f989..13df1bf 100644
--- a/src/app/(marketing)/cases/[id]/client.tsx
+++ b/src/app/(marketing)/cases/[id]/client.tsx
@@ -1,6 +1,5 @@
'use client';
-import { useEffect, useRef, useState } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
@@ -13,6 +12,8 @@ import {
Award,
TrendingUp,
} from 'lucide-react';
+import { InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { ScrollReveal } from '@/components/ui/scroll-animations';
interface CaseKeyMoment {
title: string;
@@ -39,17 +40,11 @@ interface CaseItem {
slug: string;
date: string;
image?: string;
- /** 客户面临的挑战 */
challenge: string;
- /** 我们的解决方案 */
solution: string;
- /** 关键时刻 */
keyMoments: CaseKeyMoment[];
- /** 成果数据 */
results: CaseResult[];
- /** 客户证言 */
testimonial?: CaseTestimonial;
- /** 合作时长 */
duration: string;
}
@@ -58,32 +53,13 @@ interface CaseDetailClientProps {
}
export function CaseDetailClient({ caseItem }: CaseDetailClientProps) {
- const [isVisible, setIsVisible] = useState(false);
- const contentRef = useRef(null);
-
- useEffect(() => {
- const observer = new IntersectionObserver(
- ([entry]) => {
- if (entry?.isIntersecting) {
- setIsVisible(true);
- }
- },
- { threshold: 0.1 }
- );
-
- if (contentRef.current) {
- observer.observe(contentRef.current);
- }
-
- return () => observer.disconnect();
- }, []);
-
return (
+ {/* Hero - InkReveal */}
-
+
{caseItem.category}
@@ -91,193 +67,199 @@ export function CaseDetailClient({ caseItem }: CaseDetailClientProps) {
{caseItem.title}
{caseItem.excerpt}
-
+
-
-
+
+
- {/* 客户遇到的成长瓶颈 */}
-
-
-
-
+ {/* 客户遇到的成长瓶颈 - ScrollReveal */}
+
+
-
- {caseItem.challenge}
-
-
-
- {/* 我们如何智连未来 */}
-
-
-
- {caseItem.solution}
+ {caseItem.challenge}
-
-
-
- {/* 共同成长的故事 */}
- {caseItem.keyMoments && caseItem.keyMoments.length > 0 && (
-
-
-
- {caseItem.keyMoments.map((moment, index) => (
-
-
-
-
-
- {moment.title}
-
-
- {moment.description}
-
-
-
-
- ))}
-
- )}
+
- {/* 今天,他们走到了哪里 */}
- {caseItem.results && caseItem.results.length > 0 && (
+ {/* 我们如何智连未来 - ScrollReveal */}
+
-
- {caseItem.results.map((result, index) => (
-
-
-
- {result.value}
-
-
- {result.label}
-
-
- ))}
-
-
- )}
-
- {/* 客户证言精选 */}
- {caseItem.testimonial && (
-
-
-
-
-
- {caseItem.testimonial.quote}
+
+
+ {caseItem.solution}
-
-
- 客
-
-
-
- {caseItem.testimonial.author}
-
-
- {caseItem.testimonial.role}
-
-
-
+
+
+ {/* 共同成长的故事 - StaggerContainer */}
+ {caseItem.keyMoments && caseItem.keyMoments.length > 0 && (
+
+
+
+
+ {caseItem.keyMoments.map((moment, index) => (
+
+
+
+
+
+
+ {moment.title}
+
+
+ {moment.description}
+
+
+
+
+
+ ))}
+
+
+
+ )}
+
+ {/* 今天,他们走到了哪里 - StaggerContainer 数据指标 */}
+ {caseItem.results && caseItem.results.length > 0 && (
+
+
+
+
+ {caseItem.results.map((result, index) => (
+
+
+
+
+ {result.value}
+
+
+ {result.label}
+
+
+
+ ))}
+
+
+
+ )}
+
+ {/* 客户证言精选 - ScrollReveal */}
+ {caseItem.testimonial && (
+
+
+
+
+
+
+ {caseItem.testimonial.quote}
+
+
+
+ 客
+
+
+
+ {caseItem.testimonial.author}
+
+
+ {caseItem.testimonial.role}
+
+
+
+
+
+
)}
{/* 侧边栏 */}
-
-
- 项目信息
-
-
-
-
- 客户名称
- -
- {caseItem.testimonial?.author || '客户企业'}
-
-
-
-
- 行业领域
- -
- {caseItem.category}
-
-
-
-
- 合作时长
- -
- {caseItem.duration || '3年'}
-
-
-
-
- 发布时间
- - {caseItem.date}
-
-
-
+
+
+
+ 项目信息
+
+
+
+
- 客户名称
+ -
+ {caseItem.testimonial?.author || '客户企业'}
+
+
+
+
- 行业领域
+ -
+ {caseItem.category}
+
+
+
+
- 合作时长
+ -
+ {caseItem.duration || '3年'}
+
+
+
+
- 发布时间
+ - {caseItem.date}
+
+
+
+
-
-
想要了解更多?
-
- 联系我们的专家团队,获取定制化解决方案
-
-
-
+
+
+
想要了解更多?
+
+ 联系我们的专家团队,获取定制化解决方案
+
+
+
+
diff --git a/src/app/(marketing)/cases/page.tsx b/src/app/(marketing)/cases/page.tsx
index 715aa16..7492d84 100644
--- a/src/app/(marketing)/cases/page.tsx
+++ b/src/app/(marketing)/cases/page.tsx
@@ -1,7 +1,6 @@
'use client';
-import { useState, useMemo, useRef, ChangeEvent } from 'react';
-import { useInView } from 'framer-motion';
+import { useState, useMemo, ChangeEvent } from 'react';
import { CASES } from '@/lib/constants';
import { Badge } from '@/components/ui/badge';
import { Input } from '@/components/ui/input';
@@ -9,8 +8,9 @@ import { Button } from '@/components/ui/button';
import { PageHeader } from '@/components/ui/page-header';
import { Search, ArrowLeft, Building2, Calendar, TrendingUp, Filter, SearchX } from 'lucide-react';
import { StaticLink } from '@/components/ui/static-link';
-import { motion } from 'framer-motion';
import { Pagination } from '@/components/ui/pagination';
+import { InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { ScrollReveal } from '@/components/ui/scroll-animations';
const industries = ['全部', ...Array.from(new Set(CASES.map((c) => c.industry)))];
const ITEMS_PER_PAGE = 6;
@@ -19,8 +19,6 @@ export default function CasesPage() {
const [selectedIndustry, setSelectedIndustry] = useState('全部');
const [searchQuery, setSearchQuery] = useState('');
const [currentPage, setCurrentPage] = useState(1);
- const contentRef = useRef(null);
- const isContentInView = useInView(contentRef, { once: true, margin: '-100px' });
const filteredCases = useMemo(() => {
return CASES.filter((caseItem) => {
@@ -60,14 +58,10 @@ export default function CasesPage() {
description="我们与优秀的企业同行,共同成长,共创未来"
/>
-
+
-
+ {/* 筛选区 - InkReveal */}
+
@@ -102,7 +96,7 @@ export default function CasesPage() {
aria-label="搜索案例"
/>
-
+
{paginatedCases.length === 0 ? (
@@ -119,14 +113,10 @@ export default function CasesPage() {
) : (
<>
-
- {paginatedCases.map((caseItem, index) => (
-
+ {/* 卡片网格 - StaggerContainer */}
+
+ {paginatedCases.map((caseItem) => (
+
-
+
))}
-
+
@@ -189,20 +179,17 @@ export default function CasesPage() {
-
-
-
- 准备开始您的数字化转型之旅?
-
-
- 让我们与您同行,共创美好未来
-
-
);
}
diff --git a/src/app/(marketing)/contact/page.tsx b/src/app/(marketing)/contact/page.tsx
index c1768e2..f5a7139 100644
--- a/src/app/(marketing)/contact/page.tsx
+++ b/src/app/(marketing)/contact/page.tsx
@@ -1,6 +1,6 @@
'use client';
-import { useState, useEffect, useRef, Suspense } from 'react';
+import { useState, Suspense } from 'react';
import { useSearchParams } from 'next/navigation';
import { z } from 'zod';
import { Button } from '@/components/ui/button';
@@ -10,6 +10,8 @@ import { Toast } from '@/components/ui/toast';
import { Mail, MapPin, Send, Loader2, Clock, HeadphonesIcon, CheckCircle2 } from 'lucide-react';
import { COMPANY_INFO } from '@/lib/constants';
import { trackContactForm, trackConversion } from '@/lib/analytics';
+import { InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { ScrollReveal } from '@/components/ui/scroll-animations';
const contactFormSchema = z.object({
name: z.string().min(2, '姓名至少需要2个字符'),
@@ -32,7 +34,6 @@ interface FormErrors {
function ContactFormContent() {
const searchParams = useSearchParams();
const isSuccessFromRedirect = searchParams.get('success') === 'true';
- const [isVisible, setIsVisible] = useState(false);
const [showToast, setShowToast] = useState(isSuccessFromRedirect);
const [toastMessage, setToastMessage] = useState(
isSuccessFromRedirect ? '表单提交成功!我们会尽快与您联系。' : ''
@@ -50,13 +51,6 @@ function ContactFormContent() {
message: '',
});
const [errors, setErrors] = useState({});
- const sectionRef = useRef(null);
-
- useEffect(() => {
- requestAnimationFrame(() => {
- setIsVisible(true);
- });
- }, []);
const validateField = (field: keyof ContactFormData, value: string) => {
try {
@@ -162,18 +156,14 @@ function ContactFormContent() {
/>
)}
-
+
-
+ {/* 标题区 - InkReveal */}
+
联系我们
@@ -184,91 +174,87 @@ function ContactFormContent() {
无论您有任何问题或合作意向,我们都很乐意与您交流
-
+
-
-
-
联系方式
-
-
-
-
+ {/* 左侧联系信息 - StaggerContainer */}
+
+
+
+
联系方式
+
-
-
-
-
-
-
地址
-
{COMPANY_INFO.address}
+
+
+
+
+
+
地址
+
{COMPANY_INFO.address}
+
-
+
-
-
-
-
工作时间
-
-
-
-
周一至周五
-
9:00 - 18:00
+
+
+
+
+
工作时间
+
+
+
+ 周一至周五
+ 9:00 - 18:00
+
-
+
-
-
-
-
我们的承诺
-
-
-
-
-
工作日 2 小时内快速响应您的咨询
+
+
-
+
+
-
+ {/* 右侧表单 - ScrollReveal */}
+
发送消息
{isSubmitted ? (
-
+
消息已发送
@@ -314,9 +300,9 @@ function ContactFormContent() {
required
value={formData.email}
onChange={(e) => handleChange('email', e.target.value)}
- onBlur={(e) => handleBlur('email', e.target.value)}
- error={errors.email}
- />
+ onBlur={(e) => handleBlur('email', e.target.value)}
+ error={errors.email}
+ />
handleChange('subject', e.target.value)}
- onBlur={(e) => handleBlur('subject', e.target.value)}
- error={errors.subject}
- />
+ onChange={(e) => handleChange('subject', e.target.value)}
+ onBlur={(e) => handleBlur('subject', e.target.value)}
+ error={errors.subject}
+ />
-
+
diff --git a/src/app/(marketing)/home-content.tsx b/src/app/(marketing)/home-content.tsx
index f612aaa..4ead89f 100644
--- a/src/app/(marketing)/home-content.tsx
+++ b/src/app/(marketing)/home-content.tsx
@@ -5,6 +5,7 @@ import { useSearchParams } from 'next/navigation';
import dynamic from 'next/dynamic';
import { HeroSection } from "@/components/sections/hero-section";
import { SectionSkeleton } from "@/components/ui/loading-skeleton";
+import { AnimatedInkDivider } from "@/components/ui/animated-ink-divider";
import type { ReactNode } from 'react';
declare global {
@@ -102,23 +103,17 @@ function HomeContent({ heroStats }: { heroStats: ReactNode }) {
return (
- {/* 墨韵分割线 */}
-
+
- {/* 墨韵分割线 */}
-
+
- {/* 墨韵分割线 */}
-
+
- {/* 墨韵分割线 */}
-
+
- {/* 墨韵分割线 */}
-
+
- {/* 墨韵分割线 */}
-
+
);
diff --git a/src/app/(marketing)/news/page.tsx b/src/app/(marketing)/news/page.tsx
index e4d0d57..0725138 100644
--- a/src/app/(marketing)/news/page.tsx
+++ b/src/app/(marketing)/news/page.tsx
@@ -1,7 +1,6 @@
'use client';
-import { useState, useMemo, useRef, ChangeEvent } from 'react';
-import { useInView } from 'framer-motion';
+import { useState, useMemo, ChangeEvent } from 'react';
import { NEWS } from '@/lib/constants';
import { Card, CardContent } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
@@ -10,8 +9,9 @@ import { Button } from '@/components/ui/button';
import { PageHeader } from '@/components/ui/page-header';
import { Search, Calendar, Filter, ArrowRight, SearchX } from 'lucide-react';
import { StaticLink } from '@/components/ui/static-link';
-import { motion } from 'framer-motion';
import { Pagination } from '@/components/ui/pagination';
+import { InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { ScrollReveal } from '@/components/ui/scroll-animations';
const categories = ['全部', '公司新闻', '产品发布', '研发动态'];
const ITEMS_PER_PAGE = 9;
@@ -20,8 +20,7 @@ export default function NewsListPage() {
const [selectedCategory, setSelectedCategory] = useState('全部');
const [searchQuery, setSearchQuery] = useState('');
const [currentPage, setCurrentPage] = useState(1);
- const contentRef = useRef(null);
- const isContentInView = useInView(contentRef, { once: true, margin: '-100px' });
+
const filteredNews = useMemo(() => {
return NEWS.filter((newsItem) => {
const matchesCategory = selectedCategory === '全部' || newsItem.category === selectedCategory;
@@ -60,13 +59,9 @@ export default function NewsListPage() {
description="了解睿新致远最新动态,把握行业发展脉搏"
/>
-
-
+
+ {/* 筛选区 - InkReveal */}
+
@@ -101,7 +96,7 @@ export default function NewsListPage() {
aria-label="搜索新闻"
/>
-
+
{paginatedNews.length === 0 ? (
@@ -118,14 +113,10 @@ export default function NewsListPage() {
) : (
<>
-
- {paginatedNews.map((newsItem, index) => (
-
+ {/* 卡片网格 - StaggerContainer */}
+
+ {paginatedNews.map((newsItem) => (
+
@@ -164,9 +155,9 @@ export default function NewsListPage() {
-
+
))}
-
+
@@ -176,21 +167,23 @@ export default function NewsListPage() {
>
)}
- {/* Bottom CTA */}
-
-
- 想获取最新行业资讯?
-
-
- 关注我们的公众号,第一时间了解数字化转型趋势和公司动态
-
-
-
- 联系我们
-
-
-
-
+ {/* CTA - ScrollReveal */}
+
+
+
+ 想获取最新行业资讯?
+
+
+ 关注我们的公众号,第一时间了解数字化转型趋势和公司动态
+
+
+
+ 联系我们
+
+
+
+
+
);
diff --git a/src/app/(marketing)/services/page.tsx b/src/app/(marketing)/services/page.tsx
index e9606a1..a69be71 100644
--- a/src/app/(marketing)/services/page.tsx
+++ b/src/app/(marketing)/services/page.tsx
@@ -1,7 +1,6 @@
'use client';
-import { useState, useMemo, useRef, ChangeEvent } from 'react';
-import { useInView } from 'framer-motion';
+import { useState, useMemo, ChangeEvent } from 'react';
import { SERVICES } from '@/lib/constants';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
@@ -9,8 +8,9 @@ import { Input } from '@/components/ui/input';
import { PageHeader } from '@/components/ui/page-header';
import { Search, ArrowLeft, Code, BarChart3, Lightbulb, Puzzle, Filter, SearchX } from 'lucide-react';
import { StaticLink } from '@/components/ui/static-link';
-import { motion } from 'framer-motion';
import { Pagination } from '@/components/ui/pagination';
+import { InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { ScrollReveal } from '@/components/ui/scroll-animations';
const iconMap: Record> = {
Code,
@@ -26,8 +26,7 @@ export default function ServicesPage() {
const [selectedCategory, setSelectedCategory] = useState('全部');
const [searchQuery, setSearchQuery] = useState('');
const [currentPage, setCurrentPage] = useState(1);
- const contentRef = useRef(null);
- const isContentInView = useInView(contentRef, { once: true, margin: '-100px' });
+
const filteredServices = useMemo(() => {
return SERVICES.filter((service) => {
const matchesCategory = selectedCategory === '全部' || service.title.includes(selectedCategory);
@@ -66,14 +65,10 @@ export default function ServicesPage() {
description="专业技术团队,为您提供全方位的数字化解决方案"
/>
-
+
-
+ {/* 筛选区 - InkReveal */}
+
@@ -108,7 +103,7 @@ export default function ServicesPage() {
aria-label="搜索服务"
/>
-
+
{paginatedServices.length === 0 ? (
@@ -125,16 +120,12 @@ export default function ServicesPage() {
) : (
<>
-
- {paginatedServices.map((service, index) => {
+ {/* 卡片网格 - StaggerContainer */}
+
+ {paginatedServices.map((service) => {
const Icon = iconMap[service.icon];
return (
-
+
-
+
);
})}
-
+
@@ -184,31 +175,29 @@ export default function ServicesPage() {
-
-
-
- 准备开始您的数字化转型之旅?
-
-
- 让我们与您同行,共创美好未来
-
-
-
- 立即咨询
-
-
-
+ {/* CTA - ScrollReveal */}
+
+
+
+
+ 准备开始您的数字化转型之旅?
+
+
+ 让我们与您同行,共创美好未来
+
+
+
+ 立即咨询
+
+
+
+
-
+
);
}
diff --git a/src/app/(marketing)/team/client.tsx b/src/app/(marketing)/team/client.tsx
index b30e3b1..787622d 100644
--- a/src/app/(marketing)/team/client.tsx
+++ b/src/app/(marketing)/team/client.tsx
@@ -1,41 +1,55 @@
'use client';
-import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
-import { useRef } from 'react';
+import { motion, useInView, useMotionValue, useSpring, useTransform } from 'framer-motion';
+import { useRef, type MouseEvent } from 'react';
import { StaticLink } from '@/components/ui/static-link';
-import { Button } from '@/components/ui/button';
import { PageHeader } from '@/components/ui/page-header';
+import { RippleButton } from '@/components/ui/ripple-button';
import { Shield, Building2, Users, Code, Target, ArrowRight } from 'lucide-react';
+import { InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { TextReveal } from '@/components/ui/scroll-animations';
const TEAM_PILLARS = [
- {
- icon: Shield,
- title: '12+ 年行业深耕',
- description: '核心团队长期从事技术咨询、企业数字化等领域,服务覆盖金融、制造、零售、政务、农业等多个行业,积累了丰富的跨行业经验和最佳实践。',
- },
- {
- icon: Building2,
- title: '大型 IT 企业背景',
- description: '开发团队成员来自多个大型传统 IT 企业,具备扎实的工程能力、规范化的交付流程和严格的质量意识,确保每一个项目都经得起考验。',
- },
- {
- icon: Users,
- title: '复合型技术团队',
- description: '我们的团队成员既懂技术又懂业务,能够深入理解客户的真实场景和痛点,提供真正可落地的解决方案,而非纸上谈兵。',
- },
- {
- icon: Code,
- title: '全栈技术能力',
- description: '团队掌握从前端到后端、从云原生到数据智能、从移动端到物联网的全栈技术能力,能够应对各种复杂的技术挑战。',
- },
- {
- icon: Target,
- title: '结果导向交付',
- description: '我们不以"项目上线"为终点,而是以"客户业务是否真正改善"为衡量标准。每一个交付成果,都追求可量化的业务价值。',
- },
+ { icon: Shield, title: '12+ 年行业深耕', description: '核心团队长期从事技术咨询、企业数字化等领域,服务覆盖金融、制造、零售、政务、农业等多个行业,积累了丰富的跨行业经验和最佳实践。' },
+ { icon: Building2, title: '大型 IT 企业背景', description: '开发团队成员来自多个大型传统 IT 企业,具备扎实的工程能力、规范化的交付流程和严格的质量意识,确保每一个项目都经得起考验。' },
+ { icon: Users, title: '复合型技术团队', description: '我们的团队成员既懂技术又懂业务,能够深入理解客户的真实场景和痛点,提供真正可落地的解决方案,而非纸上谈兵。' },
+ { icon: Code, title: '全栈技术能力', description: '团队掌握从前端到后端、从云原生到数据智能、从移动端到物联网的全栈技术能力,能够应对各种复杂的技术挑战。' },
+ { icon: Target, title: '结果导向交付', description: '我们不以"项目上线"为终点,而是以"客户业务是否真正改善"为衡量标准。每一个交付成果,都追求可量化的业务价值。' },
];
+/** 3D Tilt 卡片组件 */
+function TiltCard({ children, className = '' }: { children: React.ReactNode; className?: string }) {
+ const ref = useRef(null);
+ const x = useMotionValue(0);
+ const y = useMotionValue(0);
+ const rotateX = useSpring(useTransform(y, [-0.5, 0.5], [5, -5]), { stiffness: 300, damping: 30 });
+ const rotateY = useSpring(useTransform(x, [-0.5, 0.5], [-5, 5]), { stiffness: 300, damping: 30 });
+
+ function handleMouse(e: MouseEvent) {
+ if (!ref.current) {return;}
+ const rect = ref.current.getBoundingClientRect();
+ x.set((e.clientX - rect.left) / rect.width - 0.5);
+ y.set((e.clientY - rect.top) / rect.height - 0.5);
+ }
+
+ function handleMouseLeave() {
+ x.set(0);
+ y.set(0);
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+
export function TeamClient() {
const contentRef = useRef(null);
const isContentInView = useInView(contentRef, { once: true, margin: '-100px' });
@@ -48,81 +62,57 @@ export function TeamClient() {
/>
+ {/* 团队概述 - TextReveal + InkReveal */}
+
+
+
关于我们的团队
+
+
+
+
+ {/* 团队优势 - StaggerContainer + TiltCard */}
+
+ {TEAM_PILLARS.map((item, idx) => {
+ const Icon = item.icon;
+ return (
+
+ = 3 ? 'md:col-span-1 lg:col-start-1' : ''}>
+
+
+
+
+
{item.title}
+
{item.description}
+
+
+
+ );
+ })}
+
+
+ {/* Bottom CTA */}
- {/* 团队概述 */}
-
- 关于我们的团队
-
-
- 我们的核心团队长期从事技术咨询、企业数字化等行业,拥有 12 年以上的深厚积累。
-
-
- 开发团队成员来自于多个大型传统 IT 企业,具备扎实的工程能力和规范化的交付经验。
-
-
- 我们相信,优秀的技术咨询不仅需要过硬的技术能力,更需要深入理解客户的业务场景和真实需求。
- 每一位成员都是既懂技术又懂业务的复合型人才。
-
-
-
-
- {/* 团队优势 */}
-
-
团队优势
-
- {TEAM_PILLARS.map((item, idx) => {
- const Icon = item.icon;
- return (
-
= 3 ? 'md:col-span-1 lg:col-start-1' : ''}
- >
-
-
-
-
-
{item.title}
-
{item.description}
-
-
- );
- })}
-
-
-
- {/* Bottom CTA */}
-
-
- 想了解更多?
-
-
- 我们期待与您交流,共同探讨数字化转型之路
-
-
-
- 立即咨询
-
-
-
-
+
+ 想了解更多?
+
+
+ 我们期待与您交流,共同探讨数字化转型之路
+
+
+
+ 立即咨询
+
+
+
diff --git a/src/components/sections/about-section.tsx b/src/components/sections/about-section.tsx
index 1f34add..2888f3e 100644
--- a/src/components/sections/about-section.tsx
+++ b/src/components/sections/about-section.tsx
@@ -1,13 +1,14 @@
'use client';
-import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
+import { motion, useInView } from 'framer-motion';
import { useRef } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import { RippleButton } from '@/components/ui/ripple-button';
import { COMPANY_INFO } from '@/lib/constants';
import { ArrowRight, Target, HeartHandshake, Award } from 'lucide-react';
import { useReducedMotion } from '@/hooks/use-reduced-motion';
+import { InkReveal, BlurReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { TextReveal } from '@/components/ui/scroll-animations';
const VALUES = [
{ title: '务实', description: '不追逐风口,只做真正为客户创造价值的事。', icon: Target },
@@ -26,13 +27,8 @@ export function AboutSection() {
-
- {/* 标题 */}
+ {/* 标题 - InkReveal 墨迹揭示 */}
+
@@ -42,60 +38,53 @@ export function AboutSection() {
{COMPANY_INFO.slogan}
+
- {/* 品牌理念引用 */}
-
-
- “企业需要的,不是一个高高在上的‘专家’,也不是一个做完就跑的‘卖家’,而是一个能坐下来、一起想办法的同行者。”
-
-
- 我们只做一件事:成为您数字化转型路上,信得过的成长伙伴。
-
-
+ {/* 品牌理念 - TextReveal 逐词揭示 */}
+
- {/* 核心价值观 */}
-
- {VALUES.map((value) => {
- const Icon = value.icon;
- return (
-
-
-
+ {/* 核心理念强调 - BlurReveal */}
+
+
+ 我们只做一件事:成为您数字化转型路上,信得过的成长伙伴。
+
+
+
+ {/* 核心价值观 - StaggerContainer 交错入场 */}
+
+ {VALUES.map((value) => {
+ const Icon = value.icon;
+ return (
+
+
+
+
+
+
{value.title}
+
{value.description}
- {value.title}
- {value.description}
-
- );
- })}
-
+
+ );
+ })}
+
- {/* CTA */}
-
-
-
- 了解更多关于我们
-
-
-
-
+ {/* CTA */}
+
+
+
+ 了解更多关于我们
+
+
+
diff --git a/src/components/sections/home-solutions-section.tsx b/src/components/sections/home-solutions-section.tsx
index 81f3c73..3fdd959 100644
--- a/src/components/sections/home-solutions-section.tsx
+++ b/src/components/sections/home-solutions-section.tsx
@@ -1,11 +1,12 @@
'use client';
-import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
+import { motion, useInView } from 'framer-motion';
import { useRef } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import { Button } from '@/components/ui/button';
import { ArrowRight, Lightbulb, Cpu, Users } from 'lucide-react';
+import { InkReveal, StaggerContainer, StaggerItem, CountUp } from '@/lib/animations';
+import { ScrollReveal } from '@/components/ui/scroll-animations';
const SOLUTIONS_OVERVIEW = [
{
@@ -31,6 +32,13 @@ const SOLUTIONS_OVERVIEW = [
},
];
+const SOLUTION_STATS = [
+ { value: 5, label: '覆盖行业', suffix: '+' },
+ { value: 6, label: '自研产品', suffix: '款' },
+ { value: 12, label: '年核心成员行业经验', suffix: '' },
+ { value: 98, label: '客户满意度', suffix: '%' },
+];
+
export function HomeSolutionsSection() {
const ref = useRef(null);
const isInView = useInView(ref, { once: true, margin: '-100px' });
@@ -38,12 +46,8 @@ export function HomeSolutionsSection() {
return (
-
+ {/* 标题 - InkReveal 墨迹揭示 */}
+
三种角色,一种身份
@@ -51,18 +55,30 @@ export function HomeSolutionsSection() {
您的数字化转型成长伙伴——从战略咨询到技术落地,再到长期陪跑
-
+
-
- {SOLUTIONS_OVERVIEW.map((item, idx) => {
+ {/* 数据指标 - ScrollReveal 滚动驱动 + CountUp 数字滚动 */}
+
+ {SOLUTION_STATS.map((stat) => (
+
+
+
+ {stat.suffix}
+
+
{stat.label}
+
+ ))}
+
+
+ {/* 卡片 - StaggerContainer 交错入场 */}
+
+ {SOLUTIONS_OVERVIEW.map((item) => {
const Icon = item.icon;
return (
-
+
@@ -79,10 +95,10 @@ export function HomeSolutionsSection() {
))}
-
+
);
})}
-
+
-
+ {/* 标题 - InkReveal 墨迹揭示 */}
+
最新资讯
@@ -33,17 +29,12 @@ export function NewsSection() {
了解公司最新动态、行业资讯和技术分享
-
+
{displayedNews.length > 0 ? (
-
- {displayedNews.map((newsItem, idx) => (
-
+
+ {displayedNews.map((newsItem) => (
+
@@ -70,9 +61,9 @@ export function NewsSection() {
-
+
))}
-
+
) : (
暂无新闻信息
diff --git a/src/components/sections/products-section.tsx b/src/components/sections/products-section.tsx
index 1c19912..02bc642 100644
--- a/src/components/sections/products-section.tsx
+++ b/src/components/sections/products-section.tsx
@@ -1,16 +1,22 @@
'use client';
-import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
+import { motion, useInView } from 'framer-motion';
import { useRef } from 'react';
import { StaticLink } from '@/components/ui/static-link';
-import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';
import { RippleButton } from '@/components/ui/ripple-button';
-import { InkCard } from '@/lib/animations';
-import { Badge } from '@/components/ui/badge';
-import { ArrowRight, Check, TrendingUp } from 'lucide-react';
+import { InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
+import { ArrowRight, Check, Database, Users, FileText, BarChart3, Layers, MessageSquare } from 'lucide-react';
import { PRODUCTS } from '@/lib/constants';
+const productIcons: Record
> = {
+ erp: Layers,
+ crm: Users,
+ cms: FileText,
+ bi: BarChart3,
+ dss: Database,
+ oa: MessageSquare,
+};
+
export function ProductsSection() {
const ref = useRef(null);
const isInView = useInView(ref, { once: true, margin: '-100px' });
@@ -20,103 +26,101 @@ export function ProductsSection() {
-
+ {/* 标题 - InkReveal 墨迹揭示 */}
+
我们的产品
- 自主研发的企业级产品,助力企业高效运营,实现数字化转型
+ 自主研发的企业级产品矩阵,覆盖 ERP、CRM、OA 等核心场景,支持信创环境与私有化部署
-
+
{PRODUCTS.length > 0 ? (
-
- {PRODUCTS.map((product) => (
-
-
-
-
-
- {product.category}
-
- {product.title}
-
-
-
- {product.description}
-
-
-
-
核心功能
-
- {product.features.slice(0, 4).map((feature, idx) => (
-
+ {PRODUCTS.map((product) => {
+ const Icon = productIcons[product.id] || Layers;
+ return (
+
+
+
+ {/* 悬停光泽效果 */}
+
+
+
+ {/* 图标 + 分类 */}
+
+
+
+
+
+ {product.category}
+
+
+
+ {/* 标题 + 描述 */}
+
+ {product.title}
+
+
+ {product.description}
+
+
+ {/* 核心功能标签 */}
+
+ {product.features.slice(0, 3).map((feature, idx) => (
+
{feature}
))}
+ {product.features.length > 3 && (
+
+ +{product.features.length - 3}
+
+ )}
+
+
+ {/* CTA */}
+
-
-
-
-
- 核心价值
-
-
- {product.benefits.map((benefit, idx) => (
- -
- •
- {benefit}
-
- ))}
-
-
-
-
-
-
-
-
- ))}
-
+
+
+
+ );
+ })}
+
) : (
)}
-
-
+
-
+
需要定制化解决方案?
-
+
我们的专业团队可以根据您的业务需求,提供量身定制的产品开发和系统集成服务
diff --git a/src/components/sections/services-section.tsx b/src/components/sections/services-section.tsx
index 7e0dcfb..7d92398 100644
--- a/src/components/sections/services-section.tsx
+++ b/src/components/sections/services-section.tsx
@@ -1,13 +1,12 @@
'use client';
-import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
+import { motion, useInView } from 'framer-motion';
import { useRef } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import { Code, BarChart3, Lightbulb, Puzzle, ArrowRight } from 'lucide-react';
import { Card, CardContent } from '@/components/ui/card';
import { RippleButton } from '@/components/ui/ripple-button';
-import { InkCard } from '@/lib/animations';
+import { InkCard, InkReveal, StaggerContainer, StaggerItem } from '@/lib/animations';
import { SERVICES } from '@/lib/constants';
const iconMap: Record> = {
@@ -27,12 +26,8 @@ export function ServicesSection() {
-
+ {/* 标题 - InkReveal 墨迹揭示 */}
+
我们的 核心业务
@@ -40,36 +35,37 @@ export function ServicesSection() {
专业技术团队,为您提供全方位的数字化解决方案
-
+
{SERVICES.length > 0 ? (
-
+
{SERVICES.map((service) => {
const Icon = iconMap[service.icon];
return (
-
-
-
-
-
- {Icon && }
-
- {service.title}
- {service.description}
-
-
-
-
-
+
+
+
+
+
+
+ {Icon && }
+
+ {service.title}
+ {service.description}
+
+
+
+
+
+
);
})}
-
+
) : (
暂无服务信息
diff --git a/src/components/sections/team-section.tsx b/src/components/sections/team-section.tsx
index 591f34a..916d490 100644
--- a/src/components/sections/team-section.tsx
+++ b/src/components/sections/team-section.tsx
@@ -1,11 +1,11 @@
'use client';
-import { motion } from 'framer-motion';
-import { useInView } from 'framer-motion';
-import { useRef } from 'react';
+import { motion, useInView, useMotionValue, useSpring, useTransform } from 'framer-motion';
+import { useRef, type MouseEvent } from 'react';
import { StaticLink } from '@/components/ui/static-link';
import { RippleButton } from '@/components/ui/ripple-button';
import { ArrowRight, Briefcase, GraduationCap, Target, Users } from 'lucide-react';
+import { InkReveal, StaggerContainer, StaggerItem, CountUp } from '@/lib/animations';
const TEAM_MEMBERS = [
{
@@ -43,12 +43,46 @@ const TEAM_MEMBERS = [
];
const TEAM_STATS = [
- { value: '12+', label: '年团队经验' },
- { value: '80%', label: '本科及以上学历' },
- { value: '4', label: '核心服务' },
- { value: '5+', label: '行业覆盖' },
+ { value: 12, label: '年+核心成员行业经验', suffix: '' },
+ { value: 80, label: '%本科及以上学历', suffix: '' },
+ { value: 4, label: '核心服务', suffix: '' },
+ { value: 5, label: '行业+', suffix: '' },
];
+/** 3D Tilt 卡片组件 */
+function TiltCard({ children, className = '' }: { children: React.ReactNode; className?: string }) {
+ const ref = useRef
(null);
+ const x = useMotionValue(0);
+ const y = useMotionValue(0);
+
+ const rotateX = useSpring(useTransform(y, [-0.5, 0.5], [6, -6]), { stiffness: 300, damping: 30 });
+ const rotateY = useSpring(useTransform(x, [-0.5, 0.5], [-6, 6]), { stiffness: 300, damping: 30 });
+
+ function handleMouse(e: MouseEvent) {
+ if (!ref.current) {return;}
+ const rect = ref.current.getBoundingClientRect();
+ x.set((e.clientX - rect.left) / rect.width - 0.5);
+ y.set((e.clientY - rect.top) / rect.height - 0.5);
+ }
+
+ function handleMouseLeave() {
+ x.set(0);
+ y.set(0);
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+
export function TeamSection() {
const ref = useRef(null);
const isInView = useInView(ref, { once: true, margin: '-100px' });
@@ -59,13 +93,8 @@ export function TeamSection() {
- {/* 标题区 */}
-
+ {/* 标题区 - InkReveal 墨迹揭示 */}
+
核心团队
@@ -73,9 +102,9 @@ export function TeamSection() {
来自大型IT企业的核心团队,既懂技术又懂业务,能深入理解客户场景,提供真正落地的解决方案。
-
+
- {/* 团队数据概览 */}
+ {/* 团队数据概览 - CountUp 数字滚动 */}
- {stat.value}
+
+ {stat.suffix}
{stat.label}
))}
- {/* 团队成员卡片 */}
-
- {TEAM_MEMBERS.map((member, idx) => {
+ {/* 团队成员卡片 - StaggerContainer + 3D Tilt */}
+
+ {TEAM_MEMBERS.map((member) => {
const Icon = member.icon;
return (
-
-
- {/* 头像区 */}
-
-
-
+
+
+
+ {/* 头像区 */}
+
+
+
+
+
+
{member.name}
+ {member.initials}
+
-
-
{member.name}
-
{member.initials}
+
+ {/* 简介 */}
+
{member.bio}
+
+ {/* 专业领域标签 */}
+
+ {member.specialties.map((spec) => (
+
+ {spec}
+
+ ))}
-
- {/* 简介 */}
-
{member.bio}
-
- {/* 专业领域标签 */}
-
- {member.specialties.map((spec) => (
-
- {spec}
-
- ))}
-
-
-
+
+
);
})}
-
+
{/* CTA */}
(null);
+ const isInView = useInView(ref, { once: true, margin: '-80px' });
+
+ return (
+
+ {/* 左侧线条 - 从中心向左展开 */}
+
+ {/* 中心装饰 - 圆点 + 外圈 */}
+
+ {/* 外圈光晕 */}
+
+ {/* 中心实心圆 */}
+
+
+ {/* 右侧线条 - 从中心向右展开 */}
+
+
+ );
+}
diff --git a/src/lib/constants/stats.ts b/src/lib/constants/stats.ts
index 6f91fae..3b7c5c5 100644
--- a/src/lib/constants/stats.ts
+++ b/src/lib/constants/stats.ts
@@ -6,6 +6,6 @@ export interface StatItem {
export const STATS: StatItem[] = [
{ value: '12+', label: '年核心成员行业经验' },
{ value: '4', label: '核心服务' },
- { value: '4', label: '自研产品' },
+ { value: '6', label: '自研产品' },
{ value: '5+', label: '行业覆盖' },
];