'use client'; import { motion } from 'framer-motion'; import { ScrollReveal, StaggerReveal } from '@/components/ui/scroll-reveal'; import { SectionLabel, EASE_OUT } from '@/components/ui/page-decoration'; import { CheckCircle2, ChevronDown } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useState } from 'react'; export interface MethodologyLayer { title: string; description: string; items: string[]; } export interface MethodologyFrameworkProps { title: string; subtitle?: string; layers: MethodologyLayer[]; accentColor?: string; } export function MethodologyFramework({ title, subtitle, layers, accentColor = '#C41E3A', }: MethodologyFrameworkProps) { return ( Methodology {title} {subtitle && ( {subtitle} )} {layers.map((layer, index) => ( {String(index + 1).padStart(2, '0')} {index < layers.length - 1 && ( )} {layer.title} {layer.description} {layer.items.map((item, i) => ( {item} ))} ))} ); } export interface TechStackCategory { name: string; items: string[]; } export interface TechStackShowcaseProps { title: string; subtitle?: string; categories: TechStackCategory[]; } export function TechStackShowcase({ title, subtitle, categories }: TechStackShowcaseProps) { return ( Tech Stack {title} {subtitle && ( {subtitle} )} {categories.map((category, index) => ( {category.name} {category.items.map((item, i) => ( {item} ))} ))} ); } export interface TimelineStep { phase: string; title: string; description: string; duration: string; deliverables: string[]; } export interface DeliveryTimelineProps { title: string; subtitle?: string; steps: TimelineStep[]; accentColor?: string; } export function DeliveryTimeline({ title, subtitle, steps, accentColor = '#C41E3A', }: DeliveryTimelineProps) { return ( Delivery Process {title} {subtitle && ( {subtitle} )} {steps.map((step, index) => ( {step.phase} {step.duration} {step.title} {step.description} 交付物 {step.deliverables.map((deliverable, i) => ( {deliverable} ))} ))} ); } export interface FAQItem { question: string; answer: string; } export interface FAQSectionProps { title: string; subtitle?: string; items: FAQItem[]; } export function FAQSection({ title, subtitle, items }: FAQSectionProps) { const [openIndex, setOpenIndex] = useState(0); return ( FAQ {title} {subtitle && ( {subtitle} )} {items.map((item, index) => ( setOpenIndex(openIndex === index ? null : index)} className="w-full flex items-center justify-between gap-6 p-6 lg:p-7 text-left" > {item.question} {item.answer} ))} ); } export interface DataMetric { value: string; label: string; description?: string; trend?: string; trendUp?: boolean; } export interface DataProofSectionProps { title: string; subtitle?: string; metrics: DataMetric[]; } export function DataProofSection({ title, subtitle, metrics }: DataProofSectionProps) { return ( Proven Results {title} {subtitle && ( {subtitle} )} {metrics.map((metric, index) => ( {metric.value} {metric.label} {metric.description && ( {metric.description} )} {metric.trend && ( {metric.trend} )} ))} ); }
{subtitle}
{layer.description}
{step.description}
{metric.description}