'use client' import React, { useRef, useState } from 'react' import Link from 'next/link' import Image from 'next/image' import { useParams } from 'next/navigation' import { motion, useInView, useMotionValue, useTransform, useSpring, useReducedMotion, AnimatePresence } from 'framer-motion' import { ArrowRight, FileText, Search, MessageSquare, ShieldCheck, Cloud, Lock, CheckCircle2, Sparkles, Scale, GraduationCap, AlertTriangle, FolderOpen, Landmark, Users2, ChevronDown, Copy, Check, Terminal, Cpu, HardDrive, Zap, SlidersHorizontal, Calendar, Clock, Compass, ScanLine, Brain } from 'lucide-react' /* ───────────────────────────────────────────────────────────────────────── Brand tokens — "The Modern Jurist Studio" AyrisLegal Kırmızısı (#E61919) tek aksan renk, nötr paper white & zinc skalası. ───────────────────────────────────────────────────────────────────────── */ const ACCENT = '#E61919' const ACCENT_DARK = '#B8140F' const ACCENT_SOFT = '#FDEEEC' function Reveal({ children, className = '', delay = 0 }: { children: React.ReactNode; className?: string; delay?: number }) { const ref = useRef(null) const inView = useInView(ref, { once: true, margin: '-60px' }) const shouldReduceMotion = useReducedMotion() if (shouldReduceMotion) { return
{children}
} return ( {children} ) } /* Magnetic CTA — spring physics with reduced motion fallback */ function MagneticButton({ href, children, variant = 'solid', className = '' }: { href: string children: React.ReactNode variant?: 'solid' | 'outline' className?: string }) { const shouldReduceMotion = useReducedMotion() const x = useMotionValue(0) const y = useMotionValue(0) const springX = useSpring(x, { stiffness: 150, damping: 15, mass: 0.5 }) const springY = useSpring(y, { stiffness: 150, damping: 15, mass: 0.5 }) const tx = useTransform(springX, v => v) const ty = useTransform(springY, v => v) const handleMove = (e: React.MouseEvent) => { if (shouldReduceMotion) return const rect = e.currentTarget.getBoundingClientRect() x.set((e.clientX - rect.left - rect.width / 2) * 0.22) y.set((e.clientY - rect.top - rect.height / 2) * 0.22) } const handleLeave = () => { x.set(0) y.set(0) } const base = `inline-flex items-center justify-center gap-2 rounded-full px-7 py-3.5 text-sm font-bold transition-all active:scale-[0.98] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#E61919] ${className}` const style = variant === 'solid' ? { background: ACCENT, color: '#ffffff' } : { background: '#ffffff', color: '#18181B', border: '1.5px solid rgb(228 228 231)' } if (shouldReduceMotion) { return ( { if (variant === 'solid') (e.currentTarget as HTMLElement).style.background = ACCENT_DARK }} onMouseLeave={e => { if (variant === 'solid') (e.currentTarget as HTMLElement).style.background = ACCENT }} > {children} ) } return ( { if (variant === 'solid') (e.currentTarget as HTMLElement).style.background = ACCENT_DARK }} onMouseLeave={e => { if (variant === 'solid') (e.currentTarget as HTMLElement).style.background = ACCENT }} > {children} ) } /* Sürekli nabız atan "canlı" durum göstergesi */ const LivePulse = React.memo(function LivePulse() { return (