Files
demo-ayristech/components/templates/KurumsalTemplate/index.tsx
T
2026-06-06 00:43:39 +03:00

965 lines
48 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import { motion, AnimatePresence } from "framer-motion";
import { useState, useEffect } from "react";
import type { DemoData } from "@/data/demos";
const fadeUp = {
hidden: { opacity: 0, y: 35 },
show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } },
};
const stagger = {
hidden: {},
show: { transition: { staggerChildren: 0.08 } },
};
const translations = {
tr: {
navServices: "Hizmetlerimiz",
navProjects: "Referanslarımız",
navTeam: "Ekibimiz",
navReviews: "Görüşler",
navBooking: "Teklif Al",
badge: "PREMIUM LOJİSTİK OPERATÖRÜ",
heroTitlePart1: "Lojistikte",
heroTitlePart2: "Fark Yaratan",
heroTitlePart3: "Çözümler",
heroDesc: "Güvenli taşımacılık ve zamanında teslimat çözümleri. Teknoloji destekli operasyon yönetimi ve küresel tedarik zinciri entegrasyonu ile işinizi büyütüyoruz. Atlas Lojistik premium ağı.",
getQuote: "Teklif Al",
learnMore: "Referanslar",
projectsTitle: "Referanslarımız",
projectsHeader: "BİRLİKTE BÜYÜDÜĞÜMÜZ KÜRESEL MARKALAR",
teamTitle: "Ekibimiz",
teamHeader: "YÖNETİM VE OPERASYON KADROMUZ",
reviewsTitle: "Müşteri Görüşleri",
reviewsHeader: "GÜVENİLİR İŞ ORTAKLARIMIZ",
bookingTitle: "Teklif Talebi",
bookingHeader: "BİRLİKTE ÇALIŞALIM",
bookingDesc: "Tedarik zincirinizi veya lojistik operasyonunuzu optimize etmek için bilgilerinizi bırakın, uzmanlarımız özel çalışma planıyla geri dönsün.",
fieldsName: "Ad Soyad",
fieldsPhone: "Telefon Numarası",
fieldsEmail: "E-Posta Adresi",
fieldsCategory: "Hizmet Kategorisi",
fieldsDate: "Planlanan Tarih",
fieldsNotes: "Operasyon Notları / Detaylar",
fieldsNotesPlaceholder: "Yıllık sevkiyat hacmi, depo alanı veya özel taşıma ihtiyaçları...",
dispatchForm: "TEKLİF TALEBİ GÖNDER",
contactChannels: "İLETİŞİM KANALLARI",
callCenter: "Destek Hattı",
addressLabel: "Lojistik Merkezi",
emailLabel: "Kurumsal E-Posta",
footerDesc: "Tedarik zinciri yönetiminde JIT (Just-In-Time) modelleri, GDP sertifikalı soğuk zincir lojistiği ve 7/24 anlık takip güvencesi.",
privacyRegs: "Gizlilik Sözleşmesi",
termsStay: "Kullanım Şartları",
dismiss: "KAPAT",
contactTitle: "Hızlı Teklif Danışmanlığı",
contactDesc: "Lojistik gereksinimlerinizi bırakın, operasyon yöneticimiz 15 dakika içinde arasın.",
submit: "Gönder",
statExp: "Yıl Deneyim",
statClients: "Aktif Müşteri",
statCities: "Şehir Ağı",
statDelivery: "Zamanında Teslimat",
// Services Localized
serviceKarayolu: "Karayolu Taşımacılığı",
serviceKarayoluDesc: "Yurtiçi ve uluslararası karayolu ile güvenli ve hızlı komple/parsiyel taşımacılık.",
serviceDepolama: "Depolama & Lojistik",
serviceDepolamaDesc: "Modern antrepolarımızda güvenli stok yönetimi, etiketleme ve dağıtım.",
serviceEticaret: "E-ticaret Lojistiği",
serviceEticaretDesc: "Son mile teslimat, iade yönetimi ve tam entegre fulfillment çözümleri.",
serviceUlusal: "Uluslararası Nakliye",
serviceUlusalDesc: "Gümrükleme, evrak takibi dahil kapıdan kapıya uluslararası taşımacılık.",
serviceSoguk: "Soğuk Zincir Lojistiği",
serviceSogukDesc: "Gıda ve ilaç sektörü için kontrollü sıcaklıkta GDP sertifikalı taşıma.",
serviceTakip: "7/24 Anlık Takip",
serviceTakipDesc: "Yüklerinizi ve sevkiyat rotalarınızı uydu üzerinden anlık takip edin.",
// Projects Localized
projMigros: "Migros Dağıtım Ağı",
projMigrosDesc: "12 şehirde günlük 400+ perakende noktasına kesintisiz soğuk zincir dağıtım yönetimi.",
projTrendyol: "Trendyol Fulfillment",
projTrendyolDesc: "Günlük 8.000+ e-ticaret sipariş işleme, paketleme ve son mile hızlı teslimat.",
projFord: "Ford Otosan Tedarik",
projFordDesc: "JIT (Just-In-Time) metodolojisiyle otomotiv üretim fabrikasına parça tedarik zinciri lojistiği.",
projPfizer: "Pfizer İlaç Dağıtımı",
projPfizerDesc: "GDP standartlarında, tam ısı kontrollü soğuk zincir ile ilaç ve aşı lojistiği.",
},
en: {
navServices: "Our Services",
navProjects: "References",
navTeam: "Our Team",
navReviews: "Testimonials",
navBooking: "Get Quote",
badge: "PREMIUM LOGISTICS OPERATOR",
heroTitlePart1: "Logistics",
heroTitlePart2: "Redefined With",
heroTitlePart3: "Precision",
heroDesc: "Secured transportation and JIT delivery frameworks. We optimize your supply chain with modern tech tracking, integrated warehousing, and global networks. Premium Atlas logistics hub.",
getQuote: "Get Quote",
learnMore: "References",
projectsTitle: "Our Works",
projectsHeader: "GLOBAL PARTNERS WE ARE PROUD TO GROW WITH",
teamTitle: "Our Team",
teamHeader: "OUR EXECUTIVE AND OPERATIONS DIRECTORS",
reviewsTitle: "Client Reviews",
reviewsHeader: "TRUSTED BY SECTOR LEADERS",
bookingTitle: "Quote Request",
bookingHeader: "WORK WITH US",
bookingDesc: "To optimize your supply chain or schedule specialized cargo coordination, leave your credentials and our managers will draft a customized execution plan.",
fieldsName: "Full Name",
fieldsPhone: "Phone Number",
fieldsEmail: "Email Address",
fieldsCategory: "Service Category",
fieldsDate: "Target Date",
fieldsNotes: "Operations Details",
fieldsNotesPlaceholder: "Annual volume, cold storage requests, or specific cargo dimensions...",
dispatchForm: "SEND QUOTE REQUEST",
contactChannels: "CONTACT CHANNELS",
callCenter: "Support Helpline",
addressLabel: "Logistics Hub",
emailLabel: "Corporate Email",
footerDesc: "Just-In-Time (JIT) manufacturing workflows, GDP certified cold chain facilities, and 7/24 satellite tracking systems.",
privacyRegs: "Privacy Policy",
termsStay: "Terms of Service",
dismiss: "DISMISS",
contactTitle: "Quick Consultation",
contactDesc: "Outline your logistics coordinates and our transport managers will reach back in 15 minutes.",
submit: "Submit",
statExp: "Years Experience",
statClients: "Active Clients",
statCities: "City Hubs",
statDelivery: "On-Time Delivery",
// Services Localized
serviceKarayolu: "Road Transportation",
serviceKarayoluDesc: "Secured and rapid domestic/international full or partial truckload transport.",
serviceDepolama: "Warehousing & Logistics",
serviceDepolamaDesc: "Bespoke inventory management, labeling, and retail cross-docking.",
serviceEticaret: "E-Commerce Fulfillment",
serviceEticaretDesc: "Last-mile courier integration, automated return flows, and fulfillment.",
serviceUlusal: "Global Air/Ocean Cargo",
serviceUlusalDesc: "Door-to-door global shipping routes with integrated custom clearance clearance.",
serviceSoguk: "Cold Chain Transport",
serviceSogukDesc: "GDP certified multi-temp fleet specifically for food and pharmaceutical sectors.",
serviceTakip: "7/24 Satellite Tracking",
serviceTakipDesc: "Real-time satellite path tracking and automated delay coordination.",
// Projects Localized
projMigros: "Migros Retail Supply",
projMigrosDesc: "Daily cold chain distribution routing to over 400+ points across 12 cities.",
projTrendyol: "Trendyol Fulfillment Hub",
projTrendyolDesc: "Handling 8,000+ daily e-commerce order dispatches with priority last-mile courier lanes.",
projFord: "Ford Otosan JIT Tedarik",
projFordDesc: "JIT manufacturing line support, synchronizing auto parts arrival exactly within scheduled shifts.",
projPfizer: "Pfizer Cold Chain Pharma",
projPfizerDesc: "GDP certified pharmaceutical transport using automated multi-temperature thermal cargo.",
}
};
export default function KurumsalTemplate({ data }: { data: DemoData }) {
const { firma, istatistikler = [], hizmetler = [], yorumlar = [], projeler = [], ekip = [] } = data;
const [showBookingModal, setShowBookingModal] = useState(false);
const [lang, setLang] = useState<"tr" | "en">("tr");
const [preloader, setPreloader] = useState(true);
const t = translations[lang];
// Lenis Smooth Scroll Integration
useEffect(() => {
let lenis: any;
import("@studio-freight/lenis").then(({ default: Lenis }) => {
lenis = new Lenis({ duration: 1.2, easing: (x: number) => Math.min(1, 1.001 - Math.pow(2, -10 * x)) });
function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); }
requestAnimationFrame(raf);
});
return () => lenis?.destroy();
}, []);
// Preloader Curtain Timer
useEffect(() => {
const timer = setTimeout(() => {
setPreloader(false);
}, 1500);
return () => clearTimeout(timer);
}, []);
// Localized stats label mappings
const getLocalizedStatLabel = (etiket: string) => {
if (etiket.includes("Deneyim")) return t.statExp;
if (etiket.includes("Müşteri")) return t.statClients;
if (etiket.includes("Şehir")) return t.statCities;
return t.statDelivery;
};
// Localized services text mappings
const getLocalizedServiceText = (baslik: string) => {
if (baslik.includes("Karayolu")) return { title: t.serviceKarayolu, desc: t.serviceKarayoluDesc };
if (baslik.includes("Depolama")) return { title: t.serviceDepolama, desc: t.serviceDepolamaDesc };
if (baslik.includes("E-ticaret")) return { title: t.serviceEticaret, desc: t.serviceEticaretDesc };
if (baslik.includes("Uluslararası")) return { title: t.serviceUlusal, desc: t.serviceUlusalDesc };
if (baslik.includes("Soğuk")) return { title: t.serviceSoguk, desc: t.serviceSogukDesc };
return { title: t.serviceTakip, desc: t.serviceTakipDesc };
};
// Localized projects text mappings
const getLocalizedProjectText = (baslik: string) => {
if (baslik.includes("Migros")) return { title: t.projMigros, desc: t.projMigrosDesc, sector: lang === "tr" ? "Perakende" : "Retail" };
if (baslik.includes("Trendyol")) return { title: t.projTrendyol, desc: t.projTrendyolDesc, sector: lang === "tr" ? "E-Ticaret" : "E-Commerce" };
if (baslik.includes("Ford")) return { title: t.projFord, desc: t.projFordDesc, sector: lang === "tr" ? "Otomotiv" : "Automotive" };
return { title: t.projPfizer, desc: t.projPfizerDesc, sector: lang === "tr" ? "İlaç" : "Pharmaceutical" };
};
// Custom vector icons for services (No generic emojis)
const getServiceIconSvg = (baslik: string) => {
if (baslik.includes("Karayolu")) {
return (
<svg className="w-6 h-6 stroke-[#6366f1] fill-none" viewBox="0 0 24 24" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M9 17a2 2 0 11-4 0 2 2 0 014 0zM19 17a2 2 0 11-4 0 2 2 0 014 0z" />
<path strokeLinecap="round" strokeLinejoin="round" d="M13 16V6a1 1 0 00-1-1H4a1 1 0 00-1 1v10a1 1 0 001 1h1M21 16V10a1 1 0 00-1-1h-7m8 7h-1m-6 0h-2" />
</svg>
);
}
if (baslik.includes("Depolama")) {
return (
<svg className="w-6 h-6 stroke-[#6366f1] fill-none" viewBox="0 0 24 24" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
</svg>
);
}
if (baslik.includes("E-ticaret")) {
return (
<svg className="w-6 h-6 stroke-[#6366f1] fill-none" viewBox="0 0 24 24" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z" />
</svg>
);
}
if (baslik.includes("Uluslararası")) {
return (
<svg className="w-6 h-6 stroke-[#6366f1] fill-none" viewBox="0 0 24 24" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 002 2h2.945M12 2a10 10 0 110 20 10 10 0 010-20z" />
</svg>
);
}
if (baslik.includes("Soğuk")) {
return (
<svg className="w-6 h-6 stroke-[#6366f1] fill-none" viewBox="0 0 24 24" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M12 3v18M3 12h18m-3-3l3 3-3 3M6 9l-3 3 3 3M9 6l3-3 3 3m-6 12l3 3 3-3" />
</svg>
);
}
return (
<svg className="w-6 h-6 stroke-[#6366f1] fill-none" viewBox="0 0 24 24" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
);
};
const getLocalizedTeam = (ad: string) => {
if (ad.includes("Murat")) return { name: "Murat Yıldız", role: lang === "tr" ? "Genel Müdür" : "Managing Director" };
if (ad.includes("Hande")) return { name: "Hande Çelik", role: lang === "tr" ? "Operasyon Direktörü" : "Operations Director" };
if (ad.includes("Serkan")) return { name: "Serkan Aydın", role: lang === "tr" ? "Teknoloji Müdürü" : "Technology Director" };
return { name: "Neslihan Kara", role: lang === "tr" ? "Müşteri Deneyimi Yöneticisi" : "Customer Success Lead" };
};
const css = `
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
:root {
--color-kurumsal-indigo: #6366f1;
--color-kurumsal-indigo-dark: #4f46e5;
--color-kurumsal-indigo-light: #eef2ff;
--color-kurumsal-charcoal: #0F172A;
--color-kurumsal-sand: #FAF8F5;
}
.font-heavy-sans {
font-family: 'Inter', sans-serif;
font-weight: 900;
}
.font-sans-clean {
font-family: 'Inter', sans-serif;
}
.shadow-premium {
box-shadow: 0 20px 40px -15px rgba(15, 23, 42, 0.05);
}
.hero-title-clamp {
font-size: clamp(38px, 6vw, 90px);
letter-spacing: -0.03em;
line-height: 0.95;
}
`;
return (
<>
<style>{css}</style>
{/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */}
<AnimatePresence>
{preloader && (
<motion.div
className="fixed inset-0 z-50 bg-[#0F172A] flex flex-col items-center justify-center p-6"
exit={{
clipPath: "polygon(0 0, 100% 0, 100% 0, 0 0)",
transition: { duration: 0.85, ease: [0.16, 1, 0.3, 1] }
}}
>
<div className="max-w-md text-center space-y-6">
<motion.span
className="text-[9px] font-heavy-sans tracking-[4px] uppercase text-[#6366f1] block"
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
>
ATLAS LOGISTICS
</motion.span>
<div className="h-[1px] w-48 bg-white/10 mx-auto relative overflow-hidden">
<motion.div
className="absolute inset-y-0 left-0 bg-[#6366f1]"
initial={{ width: "0%" }}
animate={{ width: "100%" }}
transition={{ duration: 1.2, ease: "easeInOut" }}
/>
</div>
<motion.h2
className="font-sans-clean text-white/50 text-xs tracking-wider uppercase font-semibold"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 0.4, duration: 0.5 }}
>
interactive prototype
</motion.h2>
</div>
</motion.div>
)}
</AnimatePresence>
<div className="bg-[#FAF8F5] text-[#0F172A] min-h-screen font-sans-clean selection:bg-[#6366f1] selection:text-white overflow-hidden relative pb-20">
{/* Floating Ambient Orbs */}
<div className="absolute top-[10%] left-[-15%] w-[600px] h-[600px] bg-[#6366f1]/3 blur-[120px] rounded-full pointer-events-none z-0" />
<div className="absolute bottom-[20%] right-[-15%] w-[600px] h-[600px] bg-[#4f46e5]/3 blur-[140px] rounded-full pointer-events-none z-0" />
{/* ── FLOATING CONCEPT BANNER ── */}
<div className="fixed bottom-4 left-4 z-40 bg-[#0F172A]/90 backdrop-blur-md border border-white/10 px-4 py-2.5 rounded-xl shadow-2xl flex items-center gap-2.5 max-w-sm pointer-events-none select-none">
<div className="w-1.5 h-1.5 rounded-full bg-[#6366f1] animate-pulse" />
<span className="text-[9px] font-sans-clean uppercase tracking-[1.5px] text-white/90 font-bold">
{lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."}
</span>
</div>
{/* ── PREMIUM HEADER ── */}
<motion.header
className="fixed top-4 left-4 right-4 z-50 px-4"
initial={{ y: -80, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
transition={{ duration: 0.85, ease: [0.16, 1, 0.3, 1] }}
>
<div className="mx-auto max-w-7xl h-20 flex items-center justify-between px-8 bg-white/80 backdrop-blur-xl border border-white/40 rounded-2xl shadow-[0_10px_30px_rgba(15,23,42,0.03)]">
{/* Logo */}
<a href="#" className="flex items-center gap-2.5 group">
<span className="text-lg font-black tracking-tight text-[#0F172A] font-heavy-sans flex items-center gap-2.5 uppercase">
<svg className="w-5 h-5 text-[#6366f1]" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z" />
<path d="M12 6v12M6 12h12" />
</svg>
{firma.adi}
</span>
</a>
{/* Links */}
<nav className="hidden lg:flex items-center gap-8">
{[
{ label: t.navServices, href: "#hizmetler" },
{ label: t.navProjects, href: "#projeler" },
{ label: t.navTeam, href: "#ekip" },
{ label: t.navReviews, href: "#testimonials" }
].map(item => (
<a
key={item.label}
href={item.href}
className="text-[10px] font-black tracking-[2px] uppercase text-[#0F172A]/70 hover:text-[#6366f1] transition-colors relative py-1 cursor-pointer group"
>
{item.label}
<span className="absolute bottom-0 left-0 w-0 h-0.5 bg-[#6366f1] transition-all group-hover:w-full" />
</a>
))}
</nav>
{/* Language Selector + Quote Button */}
<div className="flex items-center gap-4">
{/* Language Switcher */}
<div className="flex items-center gap-1 bg-[#0F172A]/5 border border-[#0F172A]/10 rounded-xl p-1 shrink-0">
<button
onClick={() => setLang("tr")}
className={`text-[9px] font-sans-clean font-black px-2 py-1.5 rounded-lg transition-all cursor-pointer ${
lang === "tr" ? "bg-white text-slate-900 shadow-sm" : "text-[#0F172A]/60 hover:text-[#0F172A]"
}`}
>
TR
</button>
<button
onClick={() => setLang("en")}
className={`text-[9px] font-sans-clean font-black px-2 py-1.5 rounded-lg transition-all cursor-pointer ${
lang === "en" ? "bg-white text-slate-900 shadow-sm" : "text-[#0F172A]/60 hover:text-[#0F172A]"
}`}
>
EN
</button>
</div>
<motion.button
onClick={() => setShowBookingModal(true)}
className="text-[10px] font-black tracking-[2.5px] uppercase text-white bg-[#6366f1] hover:bg-[#4f46e5] px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_4px_12px_rgba(99,102,241,0.15)] hidden sm:block"
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.98 }}
>
{t.navBooking}
</motion.button>
</div>
</div>
</motion.header>
{/* ── HERO & BENTO HIGHLIGHTS ── */}
<section className="relative min-h-screen pt-32 pb-20 flex items-center z-10 px-6">
<div className="max-w-7xl mx-auto w-full">
<div className="grid lg:grid-cols-12 gap-16 items-center">
{/* Left Column: Heavy typography and stats */}
<motion.div
className="lg:col-span-6 z-20"
variants={stagger}
initial="hidden"
animate="show"
>
<motion.div
variants={fadeUp}
className="inline-flex items-center gap-2 text-[10px] font-black uppercase tracking-widest text-[#6366f1] mb-6 bg-[#6366f1]/5 border border-[#6366f1]/10 px-4 py-2 rounded-full"
>
<span className="w-1.5 h-1.5 rounded-full bg-[#6366f1] animate-pulse" />
{t.badge}
</motion.div>
<motion.h1
variants={fadeUp}
className="font-heavy-sans text-[#0F172A] leading-[1.1] mb-8 hero-title-clamp uppercase"
>
{t.heroTitlePart1}
<br />
<span className="text-[#6366f1] font-light italic">{t.heroTitlePart2}</span>
<br />
{t.heroTitlePart3}
</motion.h1>
<motion.p
variants={fadeUp}
className="text-[#0F172A]/60 text-xs lg:text-sm leading-relaxed max-w-md mb-12 font-semibold"
>
{t.heroDesc}
</motion.p>
{/* Statistics Grid */}
<motion.div
variants={fadeUp}
className="grid grid-cols-2 sm:grid-cols-4 gap-6 mb-12 font-semibold"
>
{istatistikler.map((stat, idx) => (
<div key={idx} className="border-l border-[#6366f1]/30 pl-4 py-1">
<h4 className="font-heavy-sans text-[#0F172A] text-lg uppercase tracking-wider mb-1 leading-none">
{stat.deger}
</h4>
<p className="text-[#0F172A]/50 text-[10px] leading-snug">
{getLocalizedStatLabel(stat.etiket)}
</p>
</div>
))}
</motion.div>
{/* CTA buttons */}
<motion.div variants={fadeUp} className="flex gap-4">
<motion.button
onClick={() => setShowBookingModal(true)}
className="inline-flex items-center gap-3 px-8 py-4.5 rounded-xl bg-[#6366f1] hover:bg-[#4f46e5] text-white font-black text-[10px] tracking-[2px] uppercase transition-all shadow-[0_5px_15px_rgba(99,102,241,0.2)] cursor-pointer"
whileHover={{ scale: 1.02 }}
>
📅 {t.getQuote}
</motion.button>
<a
href="#projeler"
className="inline-flex items-center gap-3 px-8 py-4.5 rounded-xl border border-[#0F172A]/10 bg-white/40 hover:bg-white/80 text-[#0F172A] font-black text-[10px] tracking-[2px] uppercase transition-all cursor-pointer"
>
{t.learnMore}
</a>
</motion.div>
</motion.div>
{/* Right Column: Bento style highlights preview */}
<div className="lg:col-span-6 grid sm:grid-cols-2 gap-4 w-full">
{hizmetler.slice(0, 4).map((h, i) => {
const s = getLocalizedServiceText(h.baslik);
return (
<motion.div
key={i}
className="bg-white rounded-3xl p-6 shadow-premium border border-white hover:border-[#6366f1]/30 transition-all duration-300 flex flex-col justify-between group h-64"
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.5, delay: i * 0.1 }}
whileHover={{ y: -4 }}
>
<div className="w-12 h-12 rounded-2xl flex items-center justify-center transition-transform group-hover:scale-105 shadow-sm border border-gray-100 bg-gray-50 shrink-0">
{getServiceIconSvg(h.baslik)}
</div>
<div>
<h4 className="font-heavy-sans text-gray-900 text-xs uppercase tracking-wide leading-tight mb-2">{s.title}</h4>
<p className="text-gray-400 text-[10px] leading-relaxed font-semibold">{s.desc}</p>
</div>
</motion.div>
);
})}
</div>
</div>
</div>
</section>
{/* ── HİZMETLER FULL BENTO GRID ── */}
<section id="hizmetler" className="py-32 bg-white px-6 border-t border-gray-100 relative z-10">
<div className="max-w-7xl mx-auto">
<motion.div
className="mb-20"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
<motion.span
variants={fadeUp}
className="inline-block text-[10px] font-black uppercase tracking-widest px-4 py-2 rounded-full mb-4 bg-[#6366f1]/5 text-[#6366f1] border border-[#6366f1]/10"
>
{t.navServices}
</motion.span>
<motion.h2 variants={fadeUp} className="text-4xl lg:text-5xl font-heavy-sans text-gray-900 leading-tight uppercase">
{lang === "tr" ? "Kapsamlı Lojistik Çözüm Paketi" : "Comprehensive Logistics Solutions"}
</motion.h2>
</motion.div>
<motion.div
className="grid sm:grid-cols-2 lg:grid-cols-3 gap-6"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
{hizmetler.map((h, i) => {
const s = getLocalizedServiceText(h.baslik);
return (
<motion.div
key={i}
variants={fadeUp}
className="bg-white rounded-3xl p-8 border border-gray-100 group flex flex-col justify-between h-80 transition-all duration-300"
whileHover={{ y: -6, boxShadow: `0 24px 60px rgba(99,102,241,0.08)`, borderColor: `${firma.renkAna}30` }}
>
<div>
<div className="w-14 h-14 rounded-2xl flex items-center justify-center transition-transform group-hover:scale-105 shadow-sm border border-gray-100 bg-gray-50 mb-6 shrink-0">
{getServiceIconSvg(h.baslik)}
</div>
<h3 className="font-heavy-sans text-gray-900 text-sm uppercase tracking-wide leading-tight mb-3">{s.title}</h3>
<p className="text-gray-500 text-xs leading-relaxed font-semibold">{s.desc}</p>
</div>
<button
onClick={() => setShowBookingModal(true)}
className="text-[#6366f1] font-black text-[9px] tracking-[2.5px] uppercase flex items-center gap-1 cursor-pointer hover:text-opacity-80 transition-colors pt-4 border-t border-gray-100 shrink-0"
>
{lang === "tr" ? "DETAYLI BİLGİ →" : "MORE DETAILS →"}
</button>
</motion.div>
);
})}
</motion.div>
</div>
</section>
{/* ── REFERANSLAR (PROJELER) ── */}
<section id="projeler" className="py-32 px-6 bg-gray-950 border-t border-white/5 relative z-10">
<div className="max-w-7xl mx-auto">
<motion.div
className="mb-20"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
<motion.span
variants={fadeUp}
className="inline-block text-[10px] font-black uppercase tracking-widest px-4 py-2 rounded-full mb-4 bg-white/5 text-[#6366f1] border border-white/10"
>
{t.projectsTitle}
</motion.span>
<motion.h2 variants={fadeUp} className="text-4xl lg:text-5xl font-heavy-sans text-white uppercase">
{t.projectsHeader}
</motion.h2>
</motion.div>
<motion.div
className="grid sm:grid-cols-2 gap-6"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
{projeler.map((p, i) => {
const proj = getLocalizedProjectText(p.baslik);
return (
<motion.div
key={i}
variants={fadeUp}
className="bg-white/5 border border-white/10 rounded-3xl p-8 group flex flex-col justify-between h-56 transition-all duration-300"
whileHover={{ y: -4, background: "rgba(255,255,255,0.08)", borderColor: "rgba(255,255,255,0.2)" }}
>
<div className="flex items-start gap-5">
<div className="w-14 h-14 rounded-2xl flex items-center justify-center text-xl shrink-0"
style={{ background: `${p.renk}20` }}>
<span className="select-none text-2xl">{p.ikon}</span>
</div>
<div>
<div className="flex items-center gap-3 mb-2 flex-wrap">
<h3 className="font-heavy-sans text-white text-[15px] uppercase tracking-wide">{proj.title}</h3>
<span className="text-[9px] font-black uppercase tracking-widest px-2.5 py-1 rounded-full border border-white/10"
style={{ background: `${p.renk}20`, color: p.renk }}>
{proj.sector}
</span>
</div>
<p className="text-white/50 text-xs leading-relaxed font-semibold">{proj.desc}</p>
</div>
</div>
<button
onClick={() => setShowBookingModal(true)}
className="text-white/80 font-black text-[9px] tracking-[2.5px] uppercase flex items-center gap-1 cursor-pointer hover:text-white transition-colors pt-4 border-t border-white/5 shrink-0"
>
{lang === "tr" ? "VAKAYI İNCELE →" : "VIEW CASE STUDY →"}
</button>
</motion.div>
);
})}
</motion.div>
</div>
</section>
{/* ── EKİP (TEAM) ── */}
{ekip.length > 0 && (
<section id="ekip" className="py-32 px-6 bg-[#f8fafc] border-t border-gray-100 relative z-10">
<div className="max-w-7xl mx-auto">
<motion.div
className="mb-20"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
<motion.span
variants={fadeUp}
className="inline-block text-[10px] font-black uppercase tracking-widest px-4 py-2 rounded-full mb-4 bg-[#6366f1]/5 text-[#6366f1] border border-[#6366f1]/10"
>
{t.teamTitle}
</motion.span>
<motion.h2 variants={fadeUp} className="text-4xl lg:text-5xl font-heavy-sans text-gray-900 uppercase">
{t.teamHeader}
</motion.h2>
</motion.div>
<motion.div
className="grid sm:grid-cols-2 lg:grid-cols-4 gap-6 font-semibold"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
{ekip.map((k, i) => {
const member = getLocalizedTeam(k.ad);
return (
<motion.div
key={i}
variants={fadeUp}
className="bg-white rounded-3xl overflow-hidden border border-gray-100/60 shadow-premium flex flex-col justify-between"
whileHover={{ y: -6 }}
>
<div
className="h-44 flex items-center justify-center text-6xl select-none"
style={{ background: `linear-gradient(135deg, ${firma.renkAcik}, rgba(99,102,241,0.15))` }}
>
<motion.span whileHover={{ scale: 1.15 }} transition={{ type: "spring", stiffness: 300 }}>
{k.emoji}
</motion.span>
</div>
<div className="p-6">
<h3 className="font-heavy-sans text-gray-900 text-sm uppercase leading-tight">{member.name}</h3>
<p className="text-[11px] font-bold mt-1.5 text-[#6366f1] uppercase tracking-wide">{member.role}</p>
</div>
</motion.div>
);
})}
</motion.div>
</div>
</section>
)}
{/* ── YORUMLAR (TESTIMONIALS) ── */}
<section id="testimonials" className="py-32 px-6 bg-white border-t border-gray-100 relative z-10">
<div className="max-w-7xl mx-auto font-semibold">
<motion.div
className="mb-20"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
<motion.span
variants={fadeUp}
className="inline-block text-[10px] font-black uppercase tracking-widest px-4 py-2 rounded-full mb-4 bg-[#6366f1]/5 text-[#6366f1] border border-[#6366f1]/10"
>
{t.reviewsTitle}
</motion.span>
<motion.h2 variants={fadeUp} className="text-4xl lg:text-5xl font-heavy-sans text-gray-900 uppercase">
{t.reviewsHeader}
</motion.h2>
</motion.div>
<motion.div
className="grid md:grid-cols-3 gap-6"
initial="hidden"
whileInView="show"
viewport={{ once: true }}
variants={stagger}
>
{yorumlar.map((y, i) => (
<motion.div
key={i}
variants={fadeUp}
className="bg-gray-50 rounded-3xl p-8 border border-gray-100 flex flex-col justify-between h-80"
whileHover={{ y: -4, boxShadow: `0 20px 40px rgba(99,102,241,0.06)`, borderColor: `${firma.renkAna}30` }}
>
<div>
<div className="flex gap-1.5 mb-5">
{[...Array(y.puan || 5)].map((_, j) => (
<svg key={j} className="w-4.5 h-4.5 fill-[#6366f1]" viewBox="0 0 24 24">
<path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z" />
</svg>
))}
</div>
<p className="text-gray-600 text-xs leading-relaxed italic mb-6">&ldquo;{y.yorum}&rdquo;</p>
</div>
<div className="flex items-center gap-3.5 pt-4 border-t border-gray-200/60 shrink-0">
<div className="w-9 h-9 rounded-full flex items-center justify-center text-base bg-white shadow-sm border border-gray-100 select-none">
{y.emoji}
</div>
<div>
<p className="text-gray-900 font-bold text-xs uppercase tracking-wide leading-tight">{y.yazar.split("—")[0]}</p>
<p className="text-gray-400 text-[9px] uppercase tracking-widest font-black mt-0.5">{y.yazar.split("—")[1] || t.reviewsTitle}</p>
</div>
</div>
</motion.div>
))}
</motion.div>
</div>
</section>
{/* ── İLETİŞİM / TEKLİF AL ── */}
<section id="iletisim" className="py-32 px-6 relative overflow-hidden"
style={{ background: `linear-gradient(135deg, ${firma.renkKoyu} 0%, ${firma.renkAna} 100%)` }}>
{/* Subtle cosmic grid layout */}
<div className="absolute inset-0 opacity-[0.03] pointer-events-none"
style={{ backgroundImage: "linear-gradient(#fff 1px,transparent 1px),linear-gradient(90deg,#fff 1px,transparent 1px)", backgroundSize: "40px 40px" }} />
<div className="max-w-7xl mx-auto relative z-10">
<div className="grid lg:grid-cols-2 gap-16 items-start">
{/* Left Column: contact information */}
<motion.div initial="hidden" whileInView="show" viewport={{ once: true }} variants={stagger}>
<motion.span
variants={fadeUp}
className="inline-block text-[9px] font-black uppercase tracking-widest px-4 py-2 rounded-full mb-4 bg-white/20 text-white border border-white/10"
>
{t.bookingTitle}
</motion.span>
<motion.h2 variants={fadeUp} className="text-4xl lg:text-5xl font-heavy-sans text-white leading-tight mb-6 uppercase">
{t.bookingHeader}
</motion.h2>
<motion.p variants={fadeUp} className="text-white/70 text-xs lg:text-sm mb-10 font-semibold leading-relaxed">
{t.bookingDesc}
</motion.p>
<motion.div variants={fadeUp} className="space-y-4 font-semibold">
{[
{ ikon: "📞", baslik: t.callCenter, aciklama: firma.telefon },
{ ikon: "📍", baslik: t.addressLabel, aciklama: firma.adres },
{ ikon: "✉️", baslik: t.emailLabel, aciklama: firma.email },
].map((item) => (
<div key={item.baslik} className="flex items-start gap-4 bg-white/10 rounded-2xl p-4 border border-white/5">
<span className="text-xl mt-0.5 shrink-0 select-none">{item.ikon}</span>
<div>
<p className="text-white/60 text-[9px] font-black uppercase tracking-wider">{item.baslik}</p>
<p className="text-white text-xs mt-1 leading-snug">{item.aciklama}</p>
</div>
</div>
))}
</motion.div>
</motion.div>
{/* Right Column: Quote Form */}
<motion.div
className="bg-white rounded-3xl p-8 shadow-2xl border border-white/10"
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.7, delay: 0.2 }}
>
<h3 className="font-heavy-sans text-gray-900 text-lg mb-6 uppercase tracking-wide">{t.bookingTitle}</h3>
<div className="grid grid-cols-2 gap-4 font-semibold">
{[
{ label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Full Name", type: "text", full: false },
{ label: t.fieldsPhone, placeholder: "05xx xxx xx xx", type: "tel", full: false },
{ label: t.fieldsEmail, placeholder: "ornek@mail.com", type: "email", full: false },
{ label: t.fieldsCategory, placeholder: "", type: "select", full: false },
{ label: t.fieldsDate, placeholder: "", type: "date", full: false },
{ label: t.fieldsNotes, placeholder: t.fieldsNotesPlaceholder, type: "text", full: true },
].map((field, i) => (
<div key={i} className={field.full ? "col-span-2" : "col-span-2 sm:col-span-1"}>
<label className="block text-[10px] font-black text-gray-700 mb-1.5 uppercase tracking-wider">{field.label}</label>
{field.type === "select" ? (
<select className="w-full px-4 py-3.5 rounded-xl border border-gray-200 text-xs text-slate-800 focus:outline-none focus:ring-2 focus:ring-[#6366f1] bg-gray-50/50 transition-all font-semibold cursor-pointer">
<option>{t.serviceKarayolu}</option>
<option>{t.serviceDepolama}</option>
<option>{t.serviceEticaret}</option>
<option>{t.serviceUlusal}</option>
<option>{t.serviceSoguk}</option>
</select>
) : (
<input type={field.type} placeholder={field.placeholder}
className="w-full px-4 py-3.5 rounded-xl border border-gray-200 text-xs focus:outline-none focus:ring-2 focus:ring-[#6366f1] bg-gray-50/50 transition-all placeholder-slate-300 font-semibold" />
)}
</div>
))}
</div>
<motion.button
onClick={() => setShowBookingModal(true)}
className="mt-6 w-full py-4.5 rounded-xl text-white font-black text-xs uppercase tracking-widest cursor-pointer shadow-[0_5px_15px_rgba(99,102,241,0.2)]"
style={{ background: `linear-gradient(135deg, ${firma.renkAna}, ${firma.renkKoyu})` }}
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.98 }}
>
📅 {t.dispatchForm}
</motion.button>
</motion.div>
</div>
</div>
</section>
{/* ── FOOTER ── */}
<footer className="bg-gray-950 border-t border-white/5 px-6 pt-24 pb-8 relative z-10">
<div className="max-w-7xl mx-auto font-semibold">
<div className="grid md:grid-cols-4 gap-12 pb-16 border-b border-white/5">
<div className="md:col-span-2">
<div className="flex items-center gap-3 mb-4">
<svg className="w-5 h-5 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z" />
<path d="M12 6v12M6 12h12" />
</svg>
<span className="font-bold text-white text-lg font-heavy-sans uppercase tracking-wide">{firma.adi}</span>
</div>
<p className="text-white/40 text-xs leading-relaxed max-w-sm mb-8">{firma.slogan} {t.footerDesc}</p>
<div className="text-white/50 text-xs space-y-3">
<p className="flex items-center gap-2">📍 <span className="text-white/80">{firma.adres}</span></p>
<p className="flex items-center gap-2">📞 <span className="text-white/80">{firma.telefon}</span></p>
</div>
</div>
<div>
<h4 className="font-heavy-sans text-white font-bold text-xs uppercase tracking-wider mb-6">{t.navServices}</h4>
{hizmetler.slice(0, 4).map((h, i) => {
const s = getLocalizedServiceText(h.baslik);
return (
<a key={i} href="#hizmetler" className="block text-white/40 text-xs mb-3 hover:text-white transition-colors">{s.title}</a>
);
})}
</div>
<div>
<h4 className="font-heavy-sans text-white font-bold text-xs uppercase tracking-wider mb-6">Company</h4>
{[t.navServices, t.navProjects, t.navTeam, t.navReviews].map((item) => (
<a key={item} href="#" className="block text-white/40 text-xs mb-3 hover:text-white transition-colors">{item}</a>
))}
</div>
</div>
<div className="flex flex-col md:flex-row justify-between items-center pt-8 gap-4 text-white/30 text-xs">
<p>© 2026 {firma.adi}. All rights reserved.</p>
<div className="flex gap-4">
<a href="#" className="hover:text-white transition-colors">{t.privacyRegs}</a>
<span>·</span>
<a href="#" className="hover:text-white transition-colors">{t.termsStay}</a>
</div>
</div>
</div>
</footer>
{/* ── CONSULTATION SUCCESS MODAL ── */}
<AnimatePresence>
{showBookingModal && (
<motion.div
className="fixed inset-0 z-50 flex items-center justify-center p-6 bg-black/60 backdrop-blur-sm"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
>
<motion.div
className="bg-white rounded-3xl p-8 max-w-md w-full relative shadow-2xl border border-gray-100"
initial={{ scale: 0.95, y: 20 }}
animate={{ scale: 1, y: 0 }}
exit={{ scale: 0.95, y: 20 }}
>
<button
className="absolute top-6 right-6 w-8 h-8 rounded-full bg-gray-100 flex items-center justify-center font-bold text-gray-500 hover:bg-gray-200 transition-colors cursor-pointer"
onClick={() => setShowBookingModal(false)}
>
</button>
<h3 className="font-heavy-sans text-[#0F172A] text-2xl mb-1 uppercase tracking-wide leading-none">{t.contactTitle}</h3>
<p className="text-gray-400 text-xs mb-6 font-semibold">{t.contactDesc}</p>
<div className="space-y-4 font-semibold">
<div>
<label className="block text-[10px] font-black text-gray-500 mb-1.5 uppercase tracking-wider">{t.fieldsName}</label>
<input type="text" className="w-full px-4 py-3.5 rounded-xl border bg-gray-50/50 text-xs focus:outline-none focus:ring-2 focus:ring-[#6366f1]" placeholder="John Doe" />
</div>
<div>
<label className="block text-[10px] font-black text-gray-500 mb-1.5 uppercase tracking-wider">{t.fieldsPhone}</label>
<input type="tel" className="w-full px-4 py-3.5 rounded-xl border bg-gray-50/50 text-xs focus:outline-none focus:ring-2 focus:ring-[#6366f1]" placeholder="05xx xxx xx xx" />
</div>
<motion.button
className="w-full py-4 rounded-xl bg-[#6366f1] text-white font-black text-xs hover:bg-[#4f46e5] transition-colors mt-2 cursor-pointer shadow-[0_4px_12px_rgba(99,102,241,0.15)] uppercase tracking-widest"
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.98 }}
onClick={() => setShowBookingModal(false)}
>
{t.submit}
</motion.button>
</div>
</motion.div>
</motion.div>
)}
</AnimatePresence>
</div>
</>
);
}