From bbd3930e7f47aed529c286ee98f05a2f011007ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Thu, 26 Feb 2026 21:23:45 +0800 Subject: [PATCH] feat: add services list page --- src/app/(marketing)/services/page.tsx | 112 ++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/app/(marketing)/services/page.tsx diff --git a/src/app/(marketing)/services/page.tsx b/src/app/(marketing)/services/page.tsx new file mode 100644 index 0000000..361bf61 --- /dev/null +++ b/src/app/(marketing)/services/page.tsx @@ -0,0 +1,112 @@ +'use client'; + +import Link from 'next/link'; +import { motion } from 'framer-motion'; +import { useInView } from 'framer-motion'; +import { useRef } from 'react'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; +import { Card, CardContent } from '@/components/ui/card'; +import { PageHeader } from '@/components/ui/page-header'; +import { ArrowRight, Code, Cloud, BarChart3, Shield } from 'lucide-react'; +import { SERVICES } from '@/lib/constants'; + +const iconMap: Record> = { + Code, + Cloud, + BarChart3, + Shield, +}; + +export default function ServicesPage() { + const contentRef = useRef(null); + const isContentInView = useInView(contentRef, { once: true, margin: '-100px' }); + + return ( +
+ + +
+
+
+ {SERVICES.map((service, index) => { + const Icon = iconMap[service.icon]; + return ( + + +
+
+
+ {Icon && } +
+
+

+ {service.title} +

+

+ {service.description} +

+
+
+ +
+
+ {service.features.slice(0, 3).map((feature, idx) => ( + + {feature.split(':')[0]} + + ))} +
+
+ 了解详情 + +
+
+
+ +
+ ); + })} +
+
+
+ + +
+

+ 准备开始您的数字化转型之旅? +

+

+ 让我们与您同行,共创美好未来 +

+ +
+
+
+ ); +}