feat: 更新营销页面组件与交互优化
- 删除 .impeccable.md - 新增 detail-swipe-nav, loading-state, skeleton, tooltip 组件 - 新增 use-keyboard-shortcuts, use-swipe-gesture hooks - 更新 contact, news, products, services, solutions 等页面 - 优化 header, mobile-menu, input, page-transition 组件 - 添加 terms 与错误追踪测试页面
This commit is contained in:
@@ -1,19 +1,21 @@
|
||||
'use client';
|
||||
|
||||
import { motion } from 'framer-motion';
|
||||
import { useState } from 'react';
|
||||
import { motion, AnimatePresence } from 'framer-motion';
|
||||
import { useReducedMotion } from '@/hooks/use-reduced-motion';
|
||||
import { StaticLink } from '@/components/ui/static-link';
|
||||
import { ArrowRight, Lightbulb, Cpu, Users, CheckCircle2 } from 'lucide-react';
|
||||
import { ArrowRight, Lightbulb, Cpu, Users, CheckCircle2, ChevronDown } from 'lucide-react';
|
||||
import { MethodologySection } from '@/components/sections/methodology-section';
|
||||
import { CTASection } from '@/components/sections/cta-section';
|
||||
import { PageNav } from '@/components/layout/page-nav';
|
||||
import { BreadcrumbSchema } from '@/components/seo/structured-data';
|
||||
import { SwipeNavigation } from '@/hooks/use-swipe-gesture';
|
||||
|
||||
const modules = [
|
||||
{
|
||||
icon: Lightbulb,
|
||||
title: '数字化转型咨询 · 参谋伙伴',
|
||||
subtitle: '帮您看清前路,迈对第一步',
|
||||
title: '数字化转型咨询',
|
||||
subtitle: '参谋伙伴 — 帮您看清前路,迈对第一步',
|
||||
paragraphs: [
|
||||
'数字化转型最大的成本,是走错方向的成本。',
|
||||
'我们用行业智慧帮您洞察趋势,用理性分析帮您避开陷阱。',
|
||||
@@ -28,8 +30,8 @@ const modules = [
|
||||
},
|
||||
{
|
||||
icon: Cpu,
|
||||
title: '信息技术解决方案 · 技术伙伴',
|
||||
subtitle: '让技术真正为业务服务',
|
||||
title: '信息技术解决方案',
|
||||
subtitle: '技术伙伴 — 让技术真正为业务服务',
|
||||
paragraphs: [
|
||||
'我们不追逐"最火"的技术,只选择"最对"的技术。',
|
||||
'将前沿技术深度融入您的业务场景,让每一行代码都产生业务价值。',
|
||||
@@ -44,8 +46,8 @@ const modules = [
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: '长期陪跑服务 · 同行伙伴',
|
||||
subtitle: '从需求理解到产品落地,陪伴才是常态',
|
||||
title: '长期陪跑服务',
|
||||
subtitle: '同行伙伴 — 从需求到落地,持续陪伴',
|
||||
paragraphs: [
|
||||
'当产品真正为您所用那天,才是我们成为伙伴的开始。',
|
||||
'我们建立长效服务机制,定期回访、持续优化、随时响应。',
|
||||
@@ -63,9 +65,28 @@ const modules = [
|
||||
export default function SolutionsPage() {
|
||||
const shouldReduceMotion = useReducedMotion();
|
||||
const fadeUp = shouldReduceMotion ? {} : { initial: { opacity: 0, y: 20 } };
|
||||
const [expandedModules, setExpandedModules] = useState<Set<number>>(new Set([0]));
|
||||
|
||||
const toggleModule = (index: number) => {
|
||||
setExpandedModules(prev => {
|
||||
const next = new Set(prev);
|
||||
if (next.has(index)) {
|
||||
next.delete(index);
|
||||
} else {
|
||||
next.add(index);
|
||||
}
|
||||
return next;
|
||||
});
|
||||
};
|
||||
return (
|
||||
<div className="min-h-screen bg-[var(--color-bg-primary)]">
|
||||
<BreadcrumbSchema items={[{ name: '首页', href: '/' }, { name: '解决方案', href: '/solutions' }]} />
|
||||
<SwipeNavigation
|
||||
prevRoute="/products"
|
||||
nextRoute="/services"
|
||||
prevLabel="产品方案"
|
||||
nextLabel="服务支持"
|
||||
/>
|
||||
<section className="pt-32 pb-16">
|
||||
<div className="container-wide">
|
||||
<PageNav items={[{ label: '解决方案' }]} />
|
||||
@@ -99,7 +120,7 @@ export default function SolutionsPage() {
|
||||
whileInView={shouldReduceMotion ? {} : { opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.5, delay: index * 0.1 }}
|
||||
className={`p-8 md:p-12 rounded-xl border border-[var(--color-border-primary)] border-l-4 ${module.accentBorder} bg-[var(--color-bg-primary)] hover:border-[var(--color-border-primary)] transition-colors`}
|
||||
className={`p-8 md:p-12 rounded-xl border border-[var(--color-border-primary)] bg-[var(--color-bg-primary)] hover:border-[var(--color-border-primary)] transition-colors`}
|
||||
>
|
||||
<div className="flex items-start gap-4 mb-6">
|
||||
<div className="w-12 h-12 rounded-xl flex items-center justify-center shrink-0" style={{ backgroundColor: module.accentBg }}>
|
||||
@@ -114,9 +135,29 @@ export default function SolutionsPage() {
|
||||
</div>
|
||||
|
||||
<div className="space-y-4 mb-8">
|
||||
{module.paragraphs.map((p, i) => (
|
||||
<p key={i} className="text-[var(--color-text-primary)] leading-relaxed">{p}</p>
|
||||
))}
|
||||
<button
|
||||
onClick={() => toggleModule(index)}
|
||||
className="flex items-center gap-2 text-sm font-medium text-[var(--color-brand-primary)] hover:text-[var(--color-brand-primary-hover)] transition-colors group"
|
||||
aria-expanded={expandedModules.has(index)}
|
||||
>
|
||||
<ChevronDown className={`w-4 h-4 transition-transform duration-200 ${expandedModules.has(index) ? 'rotate-180' : ''}`} />
|
||||
{expandedModules.has(index) ? '收起详情' : '展开了解详情'}
|
||||
</button>
|
||||
<AnimatePresence>
|
||||
{expandedModules.has(index) && (
|
||||
<motion.div
|
||||
initial={{ opacity: 0, height: 0 }}
|
||||
animate={{ opacity: 1, height: 'auto' }}
|
||||
exit={{ opacity: 0, height: 0 }}
|
||||
transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
|
||||
className="overflow-hidden"
|
||||
>
|
||||
{module.paragraphs.map((p, i) => (
|
||||
<p key={i} className="text-[var(--color-text-primary)] leading-relaxed mb-3 last:mb-0">{p}</p>
|
||||
))}
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
|
||||
<div className="mb-8">
|
||||
|
||||
Reference in New Issue
Block a user