This commit is contained in:
mstfyldz
2026-06-06 00:43:39 +03:00
parent ddb0847978
commit 6a313e1b40
67 changed files with 19328 additions and 0 deletions
@@ -0,0 +1,964 @@
"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>
</>
);
}