first commit
This commit is contained in:
@@ -0,0 +1,474 @@
|
||||
"use client";
|
||||
|
||||
import { motion, useScroll, useTransform, AnimatePresence } from "framer-motion";
|
||||
import { useRef, useState } from "react";
|
||||
import type { DemoData } from "@/data/demos";
|
||||
import AnimatedCounter from "@/components/ui/AnimatedCounter";
|
||||
|
||||
const easeOutExpo = [0.16, 1, 0.3, 1] as [number, number, number, number];
|
||||
|
||||
const fadeUp = {
|
||||
hidden: { opacity: 0, y: 40 },
|
||||
show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: easeOutExpo } },
|
||||
};
|
||||
|
||||
const stagger = {
|
||||
hidden: {},
|
||||
show: { transition: { staggerChildren: 0.1 } },
|
||||
};
|
||||
|
||||
export default function DentalTemplate({ data }: { data: DemoData }) {
|
||||
const { firma, istatistikler, hizmetler, projeler = [], yorumlar = [] } = data;
|
||||
const heroRef = useRef<HTMLDivElement>(null);
|
||||
const { scrollYProgress } = useScroll({ target: heroRef, offset: ["start start", "end start"] });
|
||||
const heroY = useTransform(scrollYProgress, [0, 1], ["0%", "20%"]);
|
||||
const heroOpacity = useTransform(scrollYProgress, [0, 0.8], [1, 0]);
|
||||
|
||||
const [activeYorum, setActiveYorum] = useState(0);
|
||||
const [menuOpen, setMenuOpen] = useState(false);
|
||||
const [showBookingModal, setShowBookingModal] = useState(false);
|
||||
|
||||
return (
|
||||
<div className="bg-[#FAF7F2] text-[#1E2E38] font-body">
|
||||
|
||||
{/* ── HEADER ── */}
|
||||
<motion.header
|
||||
className="fixed top-0 left-0 right-0 z-50 px-6 py-4"
|
||||
initial={{ y: -80 }}
|
||||
animate={{ y: 0 }}
|
||||
transition={{ duration: 0.6, ease: easeOutExpo }}
|
||||
>
|
||||
<div className="mx-auto max-w-6xl flex items-center justify-between h-16 px-6 bg-white/40 backdrop-blur-md rounded-3xl border border-white/20 shadow-sm">
|
||||
<div className="flex items-center gap-2.5">
|
||||
<span className="text-xl font-bold tracking-tight text-[#1E2E38] font-display flex items-center gap-1.5 uppercase">
|
||||
<span className="text-2xl">🦷</span> {firma.adi}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-8">
|
||||
<button
|
||||
className="flex flex-col gap-1.5 p-2 bg-[#1E2E38]/5 hover:bg-[#1E2E38]/10 transition-colors rounded-xl"
|
||||
onClick={() => setMenuOpen(!menuOpen)}
|
||||
>
|
||||
<div className="w-5 h-0.5 bg-[#1E2E38]" />
|
||||
<div className="w-3 h-0.5 bg-[#1E2E38]" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="hidden md:flex items-center gap-6">
|
||||
<a href={`tel:${firma.telefon}`} className="text-xs font-bold text-[#1E2E38]/80 hover:text-[#1E2E38] transition-colors">
|
||||
📞 {firma.telefon}
|
||||
</a>
|
||||
<motion.button
|
||||
onClick={() => setShowBookingModal(true)}
|
||||
className="text-xs font-black text-[#FAF7F2] bg-[#1E2E38] px-5 py-2.5 rounded-full hover:bg-[#121C22] transition-colors"
|
||||
whileHover={{ scale: 1.04 }}
|
||||
whileTap={{ scale: 0.97 }}
|
||||
>
|
||||
Contact Us
|
||||
</motion.button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Dropdown Menu */}
|
||||
<AnimatePresence>
|
||||
{menuOpen && (
|
||||
<motion.div
|
||||
className="absolute top-24 left-6 right-6 bg-white/95 backdrop-blur-xl border border-gray-100 rounded-3xl p-6 shadow-2xl flex flex-col gap-4 z-50 md:max-w-md md:left-auto md:right-6"
|
||||
initial={{ opacity: 0, y: -20, scale: 0.95 }}
|
||||
animate={{ opacity: 1, y: 0, scale: 1 }}
|
||||
exit={{ opacity: 0, y: -20, scale: 0.95 }}
|
||||
transition={{ duration: 0.25 }}
|
||||
>
|
||||
<h4 className="text-xs font-black uppercase tracking-widest text-gray-400 border-b pb-2 mb-2">Navigasyon</h4>
|
||||
{[
|
||||
{ label: "001 - Uyelik Programı", href: "#uyelik" },
|
||||
{ label: "002 - Hizmetler", href: "#hizmetler" },
|
||||
{ label: "003 - Portfolyo (Works)", href: "#works" },
|
||||
{ label: "004 - Yorumlar", href: "#yorumlar" },
|
||||
{ label: "005 - Randevu Al", href: "#randevu" }
|
||||
].map(item => (
|
||||
<a
|
||||
key={item.href}
|
||||
href={item.href}
|
||||
onClick={() => setMenuOpen(false)}
|
||||
className="font-display font-bold text-[#1E2E38] hover:text-[#D4AF37] transition-colors text-base"
|
||||
>
|
||||
{item.label}
|
||||
</a>
|
||||
))}
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</motion.header>
|
||||
|
||||
{/* ── HERO SECTION ── */}
|
||||
<section ref={heroRef} className="relative min-h-screen flex items-center overflow-hidden bg-[#FAF7F2] pt-24">
|
||||
<div className="absolute inset-0 pointer-events-none z-10">
|
||||
<div className="absolute top-[25%] left-[8%] text-[#1E2E38]/20 text-3xl font-light select-none">+</div>
|
||||
<div className="absolute bottom-[20%] left-[28%] text-[#1E2E38]/20 text-3xl font-light select-none">+</div>
|
||||
<div className="absolute bottom-[35%] right-[5%] text-[#1E2E38]/30 text-3xl font-light select-none">+</div>
|
||||
</div>
|
||||
|
||||
<div className="relative z-10 max-w-6xl mx-auto px-6 w-full py-12">
|
||||
<div className="grid lg:grid-cols-12 gap-12 items-center">
|
||||
|
||||
<motion.div
|
||||
className="lg:col-span-12 z-20 text-center"
|
||||
variants={stagger}
|
||||
initial="hidden"
|
||||
animate="show"
|
||||
>
|
||||
<motion.div
|
||||
variants={fadeUp}
|
||||
className="inline-flex items-center gap-2 text-[11px] font-black uppercase tracking-widest text-[#1E2E38]/60 mb-6"
|
||||
>
|
||||
<span className="w-1.5 h-1.5 rounded-full bg-[#1E2E38]" />
|
||||
{firma.slogan}
|
||||
</motion.div>
|
||||
|
||||
<motion.h1
|
||||
variants={fadeUp}
|
||||
className="text-6xl md:text-7xl font-display font-black text-[#1E2E38] leading-[1.05] tracking-tight mb-8"
|
||||
>
|
||||
Seamless 🦷
|
||||
<br />
|
||||
<span className="italic font-light opacity-90 text-[#3C5A48]">Dental Care</span>
|
||||
</motion.h1>
|
||||
|
||||
<motion.p
|
||||
variants={fadeUp}
|
||||
className="text-[#1E2E38]/70 text-lg leading-relaxed max-w-md mx-auto mb-10 font-medium"
|
||||
>
|
||||
A smooth and hassle-free dental care experience for a healthy and confident smile.
|
||||
</motion.p>
|
||||
|
||||
<motion.div variants={fadeUp}>
|
||||
<motion.button
|
||||
onClick={() => setShowBookingModal(true)}
|
||||
className="inline-flex items-center gap-3 px-8 py-4 rounded-full bg-[#1E2E38] hover:bg-[#121C22] text-[#FAF7F2] font-black text-sm transition-all"
|
||||
whileHover={{ scale: 1.04, boxShadow: "0 10px 30px rgba(30, 46, 56, 0.15)" }}
|
||||
whileTap={{ scale: 0.97 }}
|
||||
>
|
||||
Book Now <span className="text-xs">→</span>
|
||||
</motion.button>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 001: SAVINGS BENTO ── */}
|
||||
<section id="uyelik" className="py-24 bg-[#FAF7F2] px-6 border-t border-[#1E2E38]/5">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
|
||||
<div className="grid lg:grid-cols-12 gap-16 items-start">
|
||||
|
||||
<motion.div
|
||||
className="lg:col-span-5"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true, amount: 0.2 }}
|
||||
variants={stagger}
|
||||
>
|
||||
<span className="inline-block text-[11px] font-black uppercase tracking-widest text-[#1E2E38]/60 mb-4">
|
||||
001 - Join Membership
|
||||
</span>
|
||||
<h2 className="text-4xl lg:text-5xl font-display font-black text-[#1E2E38] leading-tight mb-6">
|
||||
Affordable Dental Care for Your Family
|
||||
</h2>
|
||||
<p className="text-[#1E2E38]/70 text-base leading-relaxed mb-10">
|
||||
Unlock optimal dental wellness for your loved ones. Get massive savings on check-ups, cleaning, and specialized cosmetic treatments.
|
||||
</p>
|
||||
|
||||
<motion.button
|
||||
onClick={() => setShowBookingModal(true)}
|
||||
className="px-7 py-3.5 rounded-full bg-[#1E2E38] hover:bg-[#121C22] text-[#FAF7F2] font-black text-xs transition-colors"
|
||||
whileHover={{ scale: 1.04 }}
|
||||
whileTap={{ scale: 0.97 }}
|
||||
>
|
||||
Join Membership <span className="text-[10px]">→</span>
|
||||
</motion.button>
|
||||
</motion.div>
|
||||
|
||||
<div className="lg:col-span-7 grid md:grid-cols-2 gap-6 w-full">
|
||||
<motion.div
|
||||
className="bg-[#EBF5F0] rounded-[36px] p-8 flex flex-col justify-between h-[320px] relative overflow-hidden group shadow-sm"
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.6 }}
|
||||
whileHover={{ y: -6 }}
|
||||
>
|
||||
<div className="flex justify-between items-start">
|
||||
<span className="text-5xl font-black text-[#1E2E38] font-display">
|
||||
{istatistikler[0]?.deger}
|
||||
</span>
|
||||
<span className="text-3xl font-light text-[#1E2E38]/50 shrink-0 select-none">+</span>
|
||||
</div>
|
||||
<p className="text-[#1E2E38]/80 text-[13px] leading-relaxed font-medium">
|
||||
{istatistikler[0]?.etiket}
|
||||
</p>
|
||||
</motion.div>
|
||||
|
||||
<motion.div
|
||||
className="bg-[#1E2E38] rounded-[36px] p-8 flex flex-col justify-between h-[320px] relative overflow-hidden group shadow-xl"
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.6, delay: 0.15 }}
|
||||
whileHover={{ y: -6 }}
|
||||
>
|
||||
<div className="flex justify-between items-start">
|
||||
<span className="text-5xl font-black text-[#FAF7F2] font-display">
|
||||
{istatistikler[1]?.deger}
|
||||
</span>
|
||||
<span className="text-3xl font-light text-[#FAF7F2]/50 shrink-0 select-none">+</span>
|
||||
</div>
|
||||
<p className="text-[#FAF7F2]/80 text-[13px] leading-relaxed font-medium">
|
||||
{istatistikler[1]?.etiket}
|
||||
</p>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── CORE SERVICES CARD ROW ── */}
|
||||
<section id="hizmetler" className="py-16 bg-white px-6">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="grid md:grid-cols-3 gap-6">
|
||||
{hizmetler.map((h, i) => (
|
||||
<motion.div
|
||||
key={i}
|
||||
className="bg-[#FAF7F2]/60 hover:bg-[#FAF7F2] rounded-[28px] p-8 border border-gray-100 hover:border-[#1E2E38]/10 transition-all duration-300 flex flex-col items-center text-center group cursor-default"
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.5, delay: i * 0.1 }}
|
||||
whileHover={{ y: -4 }}
|
||||
>
|
||||
<div className="w-14 h-14 rounded-full bg-white flex items-center justify-center text-2xl shadow-sm mb-5 transition-transform group-hover:scale-110">
|
||||
{h.ikon}
|
||||
</div>
|
||||
<h3 className="font-display font-bold text-[#1E2E38] text-base mb-3 leading-snug">
|
||||
{h.baslik}
|
||||
</h3>
|
||||
<p className="text-gray-400 text-xs leading-relaxed">
|
||||
{h.aciklama}
|
||||
</p>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 002: OUR WORKS ── */}
|
||||
<section id="works" className="py-24 bg-[#EBF5F0] px-6">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="flex flex-col md:flex-row md:items-end justify-between mb-16 gap-6">
|
||||
<motion.div
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true }}
|
||||
variants={stagger}
|
||||
>
|
||||
<span className="inline-block text-[11px] font-black uppercase tracking-widest text-[#1E2E38]/60 mb-4">
|
||||
002 - Our Works
|
||||
</span>
|
||||
<h2 className="text-4xl lg:text-5xl font-display font-black text-[#1E2E38] leading-tight">
|
||||
A Healthy Smile<br />Starts Here
|
||||
</h2>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-8">
|
||||
{projeler.map((p, i) => (
|
||||
<motion.div
|
||||
key={i}
|
||||
className="bg-[#FAF7F2] border border-[#E7E5E4] rounded-3xl p-6 hover:border-[#1E2E38] transition-colors"
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.6, delay: i * 0.15 }}
|
||||
whileHover={{ y: -6 }}
|
||||
>
|
||||
<div className="w-10 h-10 rounded-xl bg-[#1E2E38]/5 flex items-center justify-center mb-6 text-xl">
|
||||
{p.ikon}
|
||||
</div>
|
||||
<h3 className="font-display font-bold text-[#1E2E38] text-lg mb-1">{p.baslik}</h3>
|
||||
<p className="text-gray-500 text-xs font-semibold">{p.aciklama}</p>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── YORUMLAR ── */}
|
||||
<section id="yorumlar" className="py-24 bg-white px-6">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="mb-16 text-center">
|
||||
<span className="inline-block text-[11px] font-black uppercase tracking-widest text-[#1E2E38]/60 mb-4">
|
||||
003 - Patient Stories
|
||||
</span>
|
||||
<h2 className="text-4xl font-display font-black text-[#1E2E38]">
|
||||
Patient Experiences
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="relative">
|
||||
<AnimatePresence mode="wait">
|
||||
<motion.div
|
||||
key={activeYorum}
|
||||
className="bg-[#FAF7F2] border border-[#1E2E38]/5 rounded-[36px] p-10 max-w-2xl mx-auto shadow-sm"
|
||||
initial={{ opacity: 0, scale: 0.95 }}
|
||||
animate={{ opacity: 1, scale: 1 }}
|
||||
exit={{ opacity: 0, scale: 0.95 }}
|
||||
transition={{ duration: 0.4 }}>
|
||||
<div className="flex gap-1 mb-6 justify-center">
|
||||
{[...Array(yorumlar[activeYorum]?.puan)].map((_, i) => (
|
||||
<span key={i} className="text-[#1E2E38] text-xl">★</span>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-[#1E2E38]/80 text-lg leading-relaxed italic text-center mb-8 font-medium">
|
||||
“{yorumlar[activeYorum]?.yorum}”
|
||||
</p>
|
||||
<div className="flex items-center gap-4 justify-center">
|
||||
<div className="w-12 h-12 rounded-full flex items-center justify-center text-2xl bg-white shadow-sm border border-[#1E2E38]/5">
|
||||
{yorumlar[activeYorum]?.emoji}
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-[#1E2E38] font-bold text-sm">{yorumlar[activeYorum]?.yazar}</p>
|
||||
<p className="text-gray-400 text-xs">{yorumlar[activeYorum]?.tarih}</p>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
</AnimatePresence>
|
||||
|
||||
<div className="flex justify-center gap-2.5 mt-8">
|
||||
{yorumlar.map((_, i) => (
|
||||
<button key={i} onClick={() => setActiveYorum(i)}
|
||||
className="w-2.5 h-2.5 rounded-full transition-all"
|
||||
style={{ background: i === activeYorum ? "#1E2E38" : "rgba(30,46,56,0.15)",
|
||||
transform: i === activeYorum ? "scale(1.3)" : "scale(1)" }} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── RANDEVU AL ── */}
|
||||
<section id="randevu" className="py-24 bg-[#FAF7F2] px-6 border-t border-[#1E2E38]/5">
|
||||
<div className="max-w-3xl mx-auto">
|
||||
<div className="bg-white rounded-[40px] p-8 md:p-12 shadow-2xl border border-gray-100">
|
||||
<div className="text-center mb-10">
|
||||
<span className="inline-block text-[11px] font-black uppercase tracking-widest text-[#1E2E38]/60 mb-4">
|
||||
004 - Online Appointment
|
||||
</span>
|
||||
<h2 className="text-3xl md:text-4xl font-display font-black text-[#1E2E38]">
|
||||
Appointment Request
|
||||
</h2>
|
||||
<p className="text-gray-400 text-sm mt-2">
|
||||
Hayalinizdeki sağlıklı gülüşe kavuşmak için formu doldurun, sizi arayalım.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
{[
|
||||
{ label: "Ad Soyad", placeholder: "Adınız Soyadınız", type: "text", full: false },
|
||||
{ label: "Telefon", placeholder: "05xx xxx xx xx", type: "tel", full: false },
|
||||
{ label: "E-posta", placeholder: "ornek@mail.com", type: "email", full: false },
|
||||
{ label: "Hizmet Türü", placeholder: "", type: "select", full: false },
|
||||
{ label: "Tercih Edilen Tarih", placeholder: "", type: "date", full: false },
|
||||
{ label: "Şikayetiniz / Notunuz", placeholder: "Belirtmek istediğiniz detaylar...", type: "text", full: true },
|
||||
].map((field, i) => (
|
||||
<div key={i} className={field.full ? "col-span-2" : "col-span-1"}>
|
||||
<label className="block text-[11px] font-bold text-[#1E2E38]/80 mb-1.5 uppercase tracking-wider">{field.label}</label>
|
||||
{field.type === "select" ? (
|
||||
<select className="w-full px-4 py-3 rounded-xl border border-gray-200 text-sm text-gray-700 focus:outline-none focus:ring-2 focus:ring-[#1E2E38] bg-gray-50/50 transition-all">
|
||||
<option>Prevent Cavities & Disease</option>
|
||||
<option>Teeth Sparkling Cleaning</option>
|
||||
<option>Teeth Straightening</option>
|
||||
<option>Dental Implant</option>
|
||||
</select>
|
||||
) : (
|
||||
<input type={field.type} placeholder={field.placeholder}
|
||||
className="w-full px-4 py-3 rounded-xl border border-gray-200 text-sm focus:outline-none focus:ring-2 focus:ring-[#1E2E38] bg-gray-50/50 transition-all" />
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<motion.button
|
||||
className="mt-8 w-full py-4 rounded-full text-[#FAF7F2] font-black text-sm bg-[#1E2E38] hover:bg-[#121C22]"
|
||||
whileHover={{ scale: 1.02, boxShadow: "0 10px 30px rgba(30, 46, 56, 0.2)" }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
>
|
||||
📅 Randevu Talep Et
|
||||
</motion.button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── FOOTER ── */}
|
||||
<footer className="bg-[#121C22] border-t border-white/10 px-6 pt-16 pb-8">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="flex flex-col md:flex-row justify-between items-center pt-8 gap-4 text-white/40">
|
||||
<p className="text-xs">© 2026 {firma.adi}. Tüm hakları saklıdır.</p>
|
||||
<p className="text-[10px]">Gizlilik Politikası · Çerez Ayarları</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{/* ── BOOKING 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-[36px] p-8 max-w-lg w-full relative shadow-2xl"
|
||||
initial={{ scale: 0.9, y: 20 }}
|
||||
animate={{ scale: 1, y: 0 }}
|
||||
exit={{ scale: 0.9, 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"
|
||||
onClick={() => setShowBookingModal(false)}
|
||||
>
|
||||
✕
|
||||
</button>
|
||||
|
||||
<h3 className="font-display font-black text-[#1E2E38] text-2xl mb-2">Hızlı İletişim</h3>
|
||||
<p className="text-gray-400 text-xs mb-6">İletişim bilgilerinizi bırakın, en kısa sürede geri dönelim.</p>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
<label className="block text-[10px] font-bold text-gray-500 mb-1 uppercase">Ad Soyad</label>
|
||||
<input type="text" className="w-full px-4 py-3 rounded-xl border bg-gray-50/50 text-sm focus:outline-none focus:ring-2 focus:ring-[#1E2E38]" placeholder="Adınız Soyadınız" />
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-[10px] font-bold text-gray-500 mb-1 uppercase">Telefon Numarası</label>
|
||||
<input type="tel" className="w-full px-4 py-3 rounded-xl border bg-gray-50/50 text-sm focus:outline-none focus:ring-2 focus:ring-[#1E2E38]" placeholder="05xx xxx xx xx" />
|
||||
</div>
|
||||
<motion.button
|
||||
className="w-full py-4 rounded-full bg-[#1E2E38] text-[#FAF7F2] font-black text-sm hover:bg-[#121C22] transition-colors mt-2"
|
||||
whileHover={{ scale: 1.02 }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
onClick={() => setShowBookingModal(false)}
|
||||
>
|
||||
Gönder
|
||||
</motion.button>
|
||||
</div>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,423 @@
|
||||
"use client";
|
||||
|
||||
import { motion, useScroll, useTransform, AnimatePresence } from "framer-motion";
|
||||
import { useRef, useState } from "react";
|
||||
import type { DemoData } from "@/data/demos";
|
||||
import AnimatedCounter from "@/components/ui/AnimatedCounter";
|
||||
|
||||
const easeOutExpo = [0.16, 1, 0.3, 1] as [number, number, number, number];
|
||||
|
||||
const fadeUp = {
|
||||
hidden: { opacity: 0, y: 40 },
|
||||
show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: easeOutExpo } },
|
||||
};
|
||||
|
||||
const stagger = {
|
||||
hidden: {},
|
||||
show: { transition: { staggerChildren: 0.1 } },
|
||||
};
|
||||
|
||||
export default function KlinikTemplate({ data }: { data: DemoData }) {
|
||||
const { firma, istatistikler, hizmetler, doktorlar, yorumlar } = data;
|
||||
const heroRef = useRef<HTMLDivElement>(null);
|
||||
const { scrollYProgress } = useScroll({ target: heroRef, offset: ["start start", "end start"] });
|
||||
const heroY = useTransform(scrollYProgress, [0, 1], ["0%", "30%"]);
|
||||
const heroOpacity = useTransform(scrollYProgress, [0, 0.8], [1, 0]);
|
||||
const [activeYorum, setActiveYorum] = useState(0);
|
||||
const [menuOpen, setMenuOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<div className="bg-[#FAF9F6] text-[#1C1917] font-body">
|
||||
|
||||
{/* ── HEADER ── */}
|
||||
<motion.header
|
||||
className="fixed top-0 left-0 right-0 z-50 px-6 pt-5"
|
||||
initial={{ y: -80 }}
|
||||
animate={{ y: 0 }}
|
||||
transition={{ duration: 0.6, ease: easeOutExpo }}
|
||||
>
|
||||
<div className="mx-auto max-w-6xl px-6 h-16 flex items-center justify-between bg-[#FAF9F6]/80 backdrop-blur-md border border-[#E7E5E4] rounded-full">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-8 h-8 rounded-lg bg-[#1C1917] flex items-center justify-center text-sm font-bold text-[#FAF9F6]">
|
||||
{firma.logoEmoji}
|
||||
</div>
|
||||
<span className="font-display font-bold text-[15px] tracking-tight">{firma.adi}</span>
|
||||
</div>
|
||||
|
||||
<nav className="hidden md:flex items-center gap-8">
|
||||
{["Hizmetler", "Doktorlar", "Yorumlar", "İletişim"].map((item) => (
|
||||
<a key={item} href={`#${item.toLowerCase()}`}
|
||||
className="text-[12px] font-medium tracking-tight text-[#78716C] hover:text-[#1C1917] transition-colors duration-200">
|
||||
{item}
|
||||
</a>
|
||||
))}
|
||||
</nav>
|
||||
|
||||
<motion.a
|
||||
href="#randevu"
|
||||
className="hidden md:flex items-center gap-2 text-[12px] font-bold text-[#FAF9F6] bg-[#1C1917] px-5 py-2.5 rounded-full hover:bg-[#33302E] transition-colors"
|
||||
whileTap={{ scale: 0.97 }}
|
||||
>
|
||||
Randevu Al
|
||||
</motion.a>
|
||||
|
||||
<button className="md:hidden flex flex-col justify-center items-end gap-1 w-8 h-8 cursor-pointer" onClick={() => setMenuOpen(!menuOpen)}>
|
||||
<span className={`h-0.5 bg-[#1C1917] transition-all duration-300 ${menuOpen ? "w-5 rotate-45 translate-y-1.5" : "w-5"}`} />
|
||||
<span className={`h-0.5 bg-[#1C1917] transition-all duration-300 ${menuOpen ? "w-0 opacity-0" : "w-3"}`} />
|
||||
<span className={`h-0.5 bg-[#1C1917] transition-all duration-300 ${menuOpen ? "w-5 -rotate-45 -translate-y-1.5" : "w-4"}`} />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Mobile Dropdown */}
|
||||
<AnimatePresence>
|
||||
{menuOpen && (
|
||||
<motion.div
|
||||
className="md:hidden max-w-6xl mx-auto mt-2 bg-[#FAF9F6] border border-[#E7E5E4] rounded-2xl p-4 space-y-2"
|
||||
initial={{ opacity: 0, y: -10 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, y: -10 }}
|
||||
transition={{ duration: 0.3, ease: easeOutExpo }}
|
||||
>
|
||||
{["Hizmetler", "Doktorlar", "Yorumlar", "İletişim", "Randevu"].map(item => (
|
||||
<a
|
||||
key={item}
|
||||
href={item === "Randevu" ? "#randevu" : `#${item.toLowerCase()}`}
|
||||
className="block text-[14px] font-medium py-2 px-3 rounded-lg hover:bg-[#E7E5E4]/30 text-[#1C1917]"
|
||||
onClick={() => setMenuOpen(false)}
|
||||
>
|
||||
{item}
|
||||
</a>
|
||||
))}
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</motion.header>
|
||||
|
||||
{/* ── HERO ── */}
|
||||
<section ref={heroRef} className="relative min-h-screen flex items-center overflow-hidden pt-24 pb-16 bg-[#FAF9F6]">
|
||||
{/* Subtle grid pattern */}
|
||||
<div className="absolute inset-0 pointer-events-none opacity-[0.03]"
|
||||
style={{ backgroundImage: "radial-gradient(#1C1917 1px, transparent 1px)", backgroundSize: "32px 32px" }} />
|
||||
|
||||
<div className="relative z-10 max-w-6xl mx-auto px-6 w-full grid grid-cols-1 lg:grid-cols-12 gap-12 items-center">
|
||||
|
||||
{/* Hero Left */}
|
||||
<motion.div className="lg:col-span-8" variants={stagger} initial="hidden" animate="show">
|
||||
<motion.div variants={fadeUp}
|
||||
className="inline-flex items-center gap-2 text-[11px] font-bold uppercase tracking-wider text-[#78716C] mb-8"
|
||||
>
|
||||
<span className="w-1.5 h-1.5 rounded-full bg-[#10B981]" />
|
||||
{firma.sehir}'in Modern Sağlık Üssü
|
||||
</motion.div>
|
||||
|
||||
<motion.h1 variants={fadeUp}
|
||||
className="font-display font-black text-[12vw] sm:text-[8vw] lg:text-[5vw] leading-[0.9] tracking-tight uppercase text-[#1C1917] mb-8">
|
||||
Sağlığınız İçin<br />
|
||||
<span className="text-transparent stroke-text" style={{ WebkitTextStroke: "1px #1C1917" }}>En Doğru</span> Adım.
|
||||
</motion.h1>
|
||||
|
||||
<motion.p variants={fadeUp} className="text-[#57534E] text-base sm:text-lg leading-relaxed max-w-xl mb-10 font-light">
|
||||
{firma.slogan}. Son teknoloji teşhis altyapımız ve alanında uzman hekim kadromuz ile her hastamıza kişiselleştirilmiş bir bakım süreci vadediyoruz.
|
||||
</motion.p>
|
||||
|
||||
<motion.div variants={fadeUp} className="flex flex-wrap gap-4 mb-12">
|
||||
<motion.a href="#randevu"
|
||||
className="flex items-center justify-center px-8 py-4 rounded-full font-bold text-[13px] tracking-wide uppercase bg-[#1C1917] text-[#FAF9F6] cursor-pointer hover:bg-[#33302E] transition-all duration-200"
|
||||
whileTap={{ scale: 0.97 }}>
|
||||
📅 Randevu Oluştur
|
||||
</motion.a>
|
||||
<motion.a href="#hizmetler"
|
||||
className="flex items-center justify-center px-8 py-4 rounded-full font-bold text-[13px] tracking-wide uppercase border border-[#E7E5E4] text-[#1C1917] hover:bg-[#E7E5E4]/20 transition-all cursor-pointer duration-200"
|
||||
whileTap={{ scale: 0.97 }}>
|
||||
Hizmetler →
|
||||
</motion.a>
|
||||
</motion.div>
|
||||
|
||||
{/* Stats */}
|
||||
<motion.div variants={fadeUp} className="grid grid-cols-2 sm:grid-cols-4 gap-6 pt-10 border-t border-[#E7E5E4]">
|
||||
{istatistikler.map(s => {
|
||||
const val = parseInt(s.deger.replace(/\D/g, "")) || 0;
|
||||
const suf = s.deger.replace(/[0-9]/g, "");
|
||||
return (
|
||||
<div key={s.etiket}>
|
||||
<div className="text-3xl font-display font-black text-[#1C1917]">
|
||||
<AnimatedCounter target={val} suffix={suf} />
|
||||
</div>
|
||||
<div className="text-[#78716C] text-[10px] uppercase tracking-wider font-semibold mt-1">{s.etiket}</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
|
||||
{/* Hero Right */}
|
||||
<motion.div
|
||||
className="lg:col-span-4 hidden lg:block"
|
||||
initial={{ opacity: 0, x: 30 }}
|
||||
animate={{ opacity: 1, x: 0 }}
|
||||
transition={{ duration: 0.8, delay: 0.3, ease: easeOutExpo }}
|
||||
style={{ y: heroY }}
|
||||
>
|
||||
<div className="bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl p-6 shadow-sm">
|
||||
<div className="flex items-center justify-between border-b border-[#E7E5E4] pb-4 mb-4">
|
||||
<span className="font-display font-bold text-[12px] uppercase tracking-wider text-[#78716C]">Günlük Randevu Akışı</span>
|
||||
<span className="w-1.5 h-1.5 rounded-full bg-[#10B981] animate-pulse" />
|
||||
</div>
|
||||
|
||||
<div className="space-y-3">
|
||||
{[
|
||||
{ saat: "09:30", tip: "Genel Muayene", dolu: true },
|
||||
{ saat: "11:00", tip: "Check-Up Kontrol", dolu: false },
|
||||
{ saat: "13:30", tip: "Kardiyoloji Muayenesi", dolu: true },
|
||||
{ saat: "15:00", tip: "Göz Polikliniği", dolu: false },
|
||||
].map((r, i) => (
|
||||
<div key={i} className="flex items-center justify-between p-3 rounded-2xl bg-[#FAF9F6] border border-[#E7E5E4]/60">
|
||||
<div className="flex items-center gap-3">
|
||||
<span className={`w-2 h-2 rounded-full ${r.dolu ? "bg-red-400" : "bg-green-400"}`} />
|
||||
<div>
|
||||
<p className="text-[#1C1917] text-[12px] font-bold">{r.saat}</p>
|
||||
<p className="text-[#78716C] text-[10px]">{r.tip}</p>
|
||||
</div>
|
||||
</div>
|
||||
<span className={`text-[10px] font-bold px-2 py-0.5 rounded-full ${r.dolu ? "bg-red-50 text-red-500" : "bg-green-50 text-green-500"}`}>
|
||||
{r.dolu ? "Dolu" : "Müsait"}
|
||||
</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── HİZMETLER ── */}
|
||||
<section id="hizmetler" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="grid grid-cols-1 lg:grid-cols-12 gap-6 border-b border-[#E7E5E4] pb-12 mb-16">
|
||||
<div className="lg:col-span-5">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Tıbbi Birimlerimiz
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase leading-tight tracking-tight text-[#1C1917]">
|
||||
Kapsamlı Tedavi Çözümleri
|
||||
</h2>
|
||||
</div>
|
||||
<div className="lg:col-span-7 flex items-end">
|
||||
<p className="text-[#57534E] text-base leading-relaxed font-light lg:pl-8 border-l border-transparent lg:border-[#E7E5E4]">
|
||||
Her branşta yüksek teknolojik imkanlarla entegre edilmiş tanı ünitelerimiz ile kusursuz bir klinik deneyim sunuyoruz.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{hizmetler.map((h, i) => (
|
||||
<motion.div key={i}
|
||||
className="group p-8 rounded-3xl border border-[#E7E5E4] bg-[#FAF9F6] hover:border-[#1C1917] transition-all duration-300 flex flex-col justify-between min-h-[220px]"
|
||||
whileHover={{ y: -4 }}
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true }}
|
||||
variants={fadeUp}>
|
||||
<div>
|
||||
<div className="w-10 h-10 rounded-xl bg-[#1C1917]/5 flex items-center justify-center mb-6 group-hover:bg-[#1C1917] group-hover:text-[#FAF9F6] transition-colors duration-300">
|
||||
<span className="text-xl">🩺</span>
|
||||
</div>
|
||||
<h3 className="font-display font-black text-xl uppercase text-[#1C1917] mb-2">{h.baslik}</h3>
|
||||
<p className="text-[#57534E] text-[13px] leading-relaxed font-light">{h.aciklama}</p>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── DOKTORLAR ── */}
|
||||
{doktorlar && (
|
||||
<section id="doktorlar" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="mb-16">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Hekim Kadromuz
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase tracking-tight text-[#1C1917]">
|
||||
Alanında Öncü Akademik Ekip
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{doktorlar.map((d, i) => (
|
||||
<motion.div key={i}
|
||||
className="bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl overflow-hidden hover:border-[#1C1917] transition-all duration-300 flex flex-col justify-between"
|
||||
whileHover={{ y: -6 }}
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true }}
|
||||
variants={fadeUp}>
|
||||
<div className="h-44 bg-[#FAF9F6] border-b border-[#E7E5E4] flex items-center justify-center text-5xl relative">
|
||||
<span className="z-10">{d.emoji}</span>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<h3 className="font-display font-black text-[15px] uppercase text-[#1C1917]">{d.ad}</h3>
|
||||
<p className="text-[12px] font-bold uppercase tracking-wider text-[#78716C] mt-0.5 mb-3">{d.uzmanlik}</p>
|
||||
<div className="flex items-center justify-between text-[11px] text-[#78716C] pt-3 border-t border-[#E7E5E4]/60">
|
||||
<span>⭐ {d.puan}</span>
|
||||
<span>🏥 {d.yil} Yıl</span>
|
||||
<span>👥 {d.hasta}+ Hasta</span>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
{/* ── RANDEVU ── */}
|
||||
<section id="randevu" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="grid grid-cols-1 lg:grid-cols-12 gap-12 items-start">
|
||||
|
||||
{/* Left */}
|
||||
<div className="lg:col-span-5">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Hızlı Destek Hattı
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase tracking-tight text-[#1C1917] leading-tight mb-8">
|
||||
İletişime Geçin
|
||||
</h2>
|
||||
<p className="text-[#57534E] text-base font-light mb-10">
|
||||
Form üzerinden randevu talebi oluşturun. Tıbbi sekreterliğimiz detayları onaylamak üzere sizi en kısa sürede arayacaktır.
|
||||
</p>
|
||||
|
||||
<div className="space-y-4">
|
||||
{[
|
||||
{ ikon: "📞", baslik: "Çağrı Merkezi", val: firma.telefon },
|
||||
{ ikon: "📍", baslik: "Poliklinik Adresi", val: firma.adres },
|
||||
{ ikon: "✉️", baslik: "Resmi Yazışmalar", val: firma.email },
|
||||
].map((item) => (
|
||||
<div key={item.baslik} className="flex gap-4 bg-[#FAF9F6] border border-[#E7E5E4] rounded-2xl p-4">
|
||||
<span className="text-xl">{item.ikon}</span>
|
||||
<div>
|
||||
<p className="text-[#78716C] text-[10px] font-bold uppercase tracking-wider">{item.baslik}</p>
|
||||
<p className="text-[#1C1917] text-[13px] font-semibold mt-0.5">{item.val}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Right Form */}
|
||||
<div className="lg:col-span-7 bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl p-8 shadow-sm">
|
||||
<h3 className="font-display font-black text-xl uppercase text-[#1C1917] mb-6">Online Randevu Formu</h3>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6">
|
||||
{[
|
||||
{ label: "Hasta Adı Soyadı", placeholder: "Ad Soyad", type: "text" },
|
||||
{ label: "Telefon Numarası", placeholder: "05xx xxx xx xx", type: "tel" },
|
||||
{ label: "E-Posta Adresi", placeholder: "e-posta@adresiniz.com", type: "email" },
|
||||
{ label: "Birim / Poliklinik", type: "select" },
|
||||
{ label: "Tercih Edilen Tarih", type: "date" },
|
||||
{ label: "Şikayet / Not", placeholder: "Tıbbi geçmişiniz veya eklemek istediğiniz notlar...", type: "textarea", full: true }
|
||||
].map((field, i) => (
|
||||
<div key={i} className={field.full ? "sm:col-span-2 flex flex-col" : "flex flex-col"}>
|
||||
<label className="text-[11px] font-bold uppercase tracking-wider text-[#78716C] mb-2">{field.label}</label>
|
||||
{field.type === "select" ? (
|
||||
<select className="w-full px-0 py-3 bg-transparent border-b border-[#E7E5E4] text-[#1C1917] text-sm focus:outline-none focus:border-[#1C1917] transition-colors rounded-none appearance-none cursor-pointer">
|
||||
<option>Dahiliye</option>
|
||||
<option>Kardiyoloji</option>
|
||||
<option>Göz Sağlığı</option>
|
||||
<option>Diş Hekimliği</option>
|
||||
</select>
|
||||
) : field.type === "textarea" ? (
|
||||
<textarea rows={3} placeholder={field.placeholder} className="w-full px-0 py-3 bg-transparent border-b border-[#E7E5E4] text-[#1C1917] placeholder-[#78716C]/40 text-sm focus:outline-none focus:border-[#1C1917] transition-colors resize-none rounded-none" />
|
||||
) : (
|
||||
<input type={field.type} placeholder={field.placeholder} className="w-full px-0 py-3 bg-transparent border-b border-[#E7E5E4] text-[#1C1917] placeholder-[#78716C]/40 text-sm focus:outline-none focus:border-[#1C1917] transition-colors rounded-none" />
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<motion.button
|
||||
className="mt-8 w-full py-4 rounded-full font-bold text-[13px] tracking-wide uppercase bg-[#1C1917] text-[#FAF9F6] hover:bg-[#33302E] transition-colors cursor-pointer"
|
||||
whileTap={{ scale: 0.98 }}>
|
||||
Randevu Talebi Gönder
|
||||
</motion.button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── YORUMLAR ── */}
|
||||
<section id="yorumlar" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-3xl mx-auto">
|
||||
<div className="mb-16 text-center">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Hasta Görüşleri
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase tracking-tight text-[#1C1917]">
|
||||
Hasta Deneyimleri
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="relative border border-[#E7E5E4] rounded-3xl p-8 bg-[#FAF9F6]">
|
||||
<AnimatePresence mode="wait">
|
||||
<motion.div
|
||||
key={activeYorum}
|
||||
className="min-h-[160px] flex flex-col justify-between"
|
||||
initial={{ opacity: 0, y: 10 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, y: -10 }}
|
||||
transition={{ duration: 0.4 }}>
|
||||
<div>
|
||||
<div className="flex gap-1 mb-4">
|
||||
{[...Array(yorumlar[activeYorum].puan)].map((_, i) => (
|
||||
<span key={i} className="text-yellow-500 text-lg">★</span>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-[#57534E] text-base leading-relaxed italic font-light mb-6">
|
||||
“{yorumlar[activeYorum].yorum}”
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 pt-4 border-t border-[#E7E5E4]/60">
|
||||
<span className="text-2xl">{yorumlar[activeYorum].emoji}</span>
|
||||
<div>
|
||||
<p className="text-[#1C1917] font-bold text-sm uppercase tracking-tight">{yorumlar[activeYorum].yazar}</p>
|
||||
<p className="text-[#78716C] text-[11px]">{yorumlar[activeYorum].tarih}</p>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
</AnimatePresence>
|
||||
|
||||
<div className="flex justify-center gap-2 mt-8">
|
||||
{yorumlar.map((_, i) => (
|
||||
<button key={i} onClick={() => setActiveYorum(i)}
|
||||
className="w-2 h-2 rounded-full cursor-pointer transition-all"
|
||||
style={{ background: i === activeYorum ? "#1C1917" : "#E7E5E4",
|
||||
transform: i === activeYorum ? "scale(1.2)" : "scale(1)" }} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── FOOTER ── */}
|
||||
<footer className="border-t border-[#E7E5E4] bg-[#FAF9F6] px-6 pt-16 pb-8">
|
||||
<div className="max-w-6xl mx-auto flex flex-col sm:flex-row justify-between items-center gap-4 text-[12px] text-[#78716C]">
|
||||
<p>© 2026 {firma.adi}. Tüm hakları saklıdır.</p>
|
||||
<div className="flex gap-6">
|
||||
<a href="#" className="hover:text-[#1C1917] font-light">Gizlilik Bildirgesi</a>
|
||||
<a href="#" className="hover:text-[#1C1917] font-light">Çerez Ayarları</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<style jsx global>{`
|
||||
.stroke-text {
|
||||
font-weight: 900;
|
||||
color: transparent;
|
||||
}
|
||||
`}</style>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,335 @@
|
||||
"use client";
|
||||
|
||||
import { motion, useScroll, useTransform } from "framer-motion";
|
||||
import { useRef } from "react";
|
||||
import type { DemoData } from "@/data/demos";
|
||||
import AnimatedCounter from "@/components/ui/AnimatedCounter";
|
||||
|
||||
const easeOutExpo = [0.16, 1, 0.3, 1] as [number, number, number, number];
|
||||
|
||||
const fadeUp = {
|
||||
hidden: { opacity: 0, y: 40 },
|
||||
show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: easeOutExpo } },
|
||||
};
|
||||
const stagger = { hidden: {}, show: { transition: { staggerChildren: 0.1 } } };
|
||||
|
||||
export default function KurumsalTemplate({ data }: { data: DemoData }) {
|
||||
const { firma, istatistikler, hizmetler, yorumlar, projeler = [], ekip = [] } = data;
|
||||
const heroRef = useRef<HTMLDivElement>(null);
|
||||
const { scrollYProgress } = useScroll({ target: heroRef, offset: ["start start", "end start"] });
|
||||
const heroY = useTransform(scrollYProgress, [0, 1], ["0%", "20%"]);
|
||||
|
||||
return (
|
||||
<div className="bg-[#FAF9F6] text-[#1C1917] font-body">
|
||||
|
||||
{/* ── HEADER ── */}
|
||||
<motion.header
|
||||
className="fixed top-0 left-0 right-0 z-50 px-6 pt-5"
|
||||
initial={{ y: -80 }}
|
||||
animate={{ y: 0 }}
|
||||
transition={{ duration: 0.6, ease: easeOutExpo }}>
|
||||
<div className="mx-auto max-w-6xl px-6 h-16 flex items-center justify-between bg-[#FAF9F6]/80 backdrop-blur-md border border-[#E7E5E4] rounded-full">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-8 h-8 rounded-lg bg-[#1C1917] flex items-center justify-center text-sm font-bold text-[#FAF9F6]">
|
||||
{firma.logoEmoji}
|
||||
</div>
|
||||
<span className="font-display font-bold text-[15px] tracking-tight">{firma.adi}</span>
|
||||
</div>
|
||||
<nav className="hidden md:flex items-center gap-8">
|
||||
{["Hizmetler", "Projeler", "Ekip", "İletişim"].map(item => (
|
||||
<a key={item} href={`#${item.toLowerCase()}`}
|
||||
className="text-[12px] font-medium tracking-tight text-[#78716C] hover:text-[#1C1917] transition-colors">
|
||||
{item}
|
||||
</a>
|
||||
))}
|
||||
</nav>
|
||||
<motion.a href="#iletisim"
|
||||
className="hidden md:flex items-center gap-2 text-[12px] font-bold text-[#FAF9F6] bg-[#1C1917] px-5 py-2.5 rounded-full hover:bg-[#33302E] transition-colors"
|
||||
whileTap={{ scale: 0.97 }}>
|
||||
Teklif Al
|
||||
</motion.a>
|
||||
</div>
|
||||
</motion.header>
|
||||
|
||||
{/* ── HERO ── */}
|
||||
<section ref={heroRef} className="relative min-h-screen flex items-center overflow-hidden bg-[#FAF9F6] pt-24">
|
||||
{/* Subtle grid pattern */}
|
||||
<div className="absolute inset-0 pointer-events-none opacity-[0.03]"
|
||||
style={{ backgroundImage: "radial-gradient(#1C1917 1px, transparent 1px)", backgroundSize: "32px 32px" }} />
|
||||
|
||||
<div className="relative z-10 max-w-6xl mx-auto px-6 w-full grid grid-cols-1 lg:grid-cols-12 gap-12 items-center">
|
||||
|
||||
<motion.div className="lg:col-span-8" variants={stagger} initial="hidden" animate="show">
|
||||
<motion.div variants={fadeUp}
|
||||
className="inline-flex items-center gap-2 text-[11px] font-bold uppercase tracking-wider text-[#78716C] mb-8"
|
||||
>
|
||||
<span className="w-1.5 h-1.5 rounded-full bg-[#10B981]" />
|
||||
{firma.sehir} · {istatistikler[0]?.deger} Lojistik Hizmeti
|
||||
</motion.div>
|
||||
|
||||
<motion.h1 variants={fadeUp}
|
||||
className="font-display font-black text-[12vw] sm:text-[8vw] lg:text-[5vw] leading-[0.9] tracking-tight uppercase text-[#1C1917] mb-8">
|
||||
Lojistikte<br />
|
||||
<span className="text-transparent stroke-text" style={{ WebkitTextStroke: "1px #1C1917" }}>Yeni Nesil</span> Ağı.
|
||||
</motion.h1>
|
||||
|
||||
<motion.p variants={fadeUp} className="text-[#57534E] text-base sm:text-lg leading-relaxed max-w-xl mb-10 font-light">
|
||||
{firma.slogan}. Tedarik zincirinizin uçtan uca akışını optimize etmek için geliştirilmiş son derece güvenli ve anlık takip edilebilen operasyon sistemleri.
|
||||
</motion.p>
|
||||
|
||||
<motion.div variants={fadeUp} className="flex flex-wrap gap-4 mb-12">
|
||||
<motion.a href="#iletisim"
|
||||
className="flex items-center justify-center px-8 py-4 rounded-full font-bold text-[13px] tracking-wide uppercase bg-[#1C1917] text-[#FAF9F6] cursor-pointer hover:bg-[#33302E] transition-all duration-200"
|
||||
whileTap={{ scale: 0.97 }}>
|
||||
Teklif Al →
|
||||
</motion.a>
|
||||
<motion.a href="#projeler"
|
||||
className="flex items-center justify-center px-8 py-4 rounded-full font-bold text-[13px] tracking-wide uppercase border border-[#E7E5E4] text-[#1C1917] hover:bg-[#E7E5E4]/20 transition-all cursor-pointer duration-200"
|
||||
whileTap={{ scale: 0.97 }}>
|
||||
Referanslar
|
||||
</motion.a>
|
||||
</motion.div>
|
||||
|
||||
{/* Stats row */}
|
||||
<motion.div variants={fadeUp}
|
||||
className="grid grid-cols-2 sm:grid-cols-4 gap-6 pt-10 border-t border-[#E7E5E4]">
|
||||
{istatistikler.map((s, i) => (
|
||||
<div key={i}>
|
||||
<div className="text-3xl font-display font-black text-[#1C1917]">
|
||||
<AnimatedCounter target={parseInt(s.deger.replace(/\D/g, "")) || 0}
|
||||
suffix={s.deger.replace(/[0-9]/g, "")} />
|
||||
</div>
|
||||
<div className="text-[#78716C] text-[10px] uppercase tracking-wider font-semibold mt-1">{s.etiket}</div>
|
||||
</div>
|
||||
))}
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
|
||||
{/* Bento grid right side */}
|
||||
<motion.div
|
||||
className="lg:col-span-4 hidden lg:grid grid-cols-2 gap-4"
|
||||
initial={{ opacity: 0, x: 60 }}
|
||||
animate={{ opacity: 1, x: 0 }}
|
||||
transition={{ duration: 0.9, delay: 0.3 }}
|
||||
style={{ y: heroY }}
|
||||
>
|
||||
{hizmetler.slice(0, 4).map((h, i) => (
|
||||
<div key={i} className="bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl p-6 shadow-sm">
|
||||
<div className="w-10 h-10 rounded-xl bg-[#1C1917]/5 flex items-center justify-center mb-4 text-xl">
|
||||
{h.ikon}
|
||||
</div>
|
||||
<h3 className="font-display font-black text-[12px] uppercase text-[#1C1917] mb-1">{h.baslik}</h3>
|
||||
<p className="text-[#78716C] text-[10px] leading-relaxed font-light">{h.aciklama}</p>
|
||||
</div>
|
||||
))}
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── HİZMETLER TAM ── */}
|
||||
<section id="hizmetler" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="grid grid-cols-1 lg:grid-cols-12 gap-6 border-b border-[#E7E5E4] pb-12 mb-16">
|
||||
<div className="lg:col-span-5">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Uçtan Uca Çözümler
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase leading-tight tracking-tight text-[#1C1917]">
|
||||
Kapsamlı Lojistik Paketi
|
||||
</h2>
|
||||
</div>
|
||||
<div className="lg:col-span-7 flex items-end">
|
||||
<p className="text-[#57534E] text-base leading-relaxed font-light lg:pl-8 border-l border-transparent lg:border-[#E7E5E4]">
|
||||
Operasyonel mükemmeliyetçiliği temel alan depolama, yurt içi dağıtım ve anlık takip sistemlerimizle tedarik zincirinize tam entegrasyon sunuyoruz.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{hizmetler.map((h, i) => (
|
||||
<motion.div key={i}
|
||||
className="bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl p-8 hover:border-[#1C1917] transition-all duration-300 flex flex-col justify-between min-h-[220px]"
|
||||
whileHover={{ y: -4 }}
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true }}
|
||||
variants={fadeUp}>
|
||||
<div>
|
||||
<div className="w-10 h-10 rounded-xl bg-[#1C1917]/5 flex items-center justify-center mb-6 text-xl">
|
||||
{h.ikon}
|
||||
</div>
|
||||
<h3 className="font-display font-black text-xl uppercase text-[#1C1917] mb-2">{h.baslik}</h3>
|
||||
<p className="text-[#57534E] text-[13px] leading-relaxed font-light">{h.aciklama}</p>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── REFERANSLAR ── */}
|
||||
<section id="projeler" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="mb-16">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Güçlü Referanslar
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase tracking-tight text-[#1C1917]">
|
||||
Birlikte Yol Aldıklarımız
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
{projeler.map((p, i) => (
|
||||
<motion.div key={i}
|
||||
className="bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl p-7 flex flex-col justify-between hover:border-[#1C1917] transition-all duration-300 relative overflow-hidden"
|
||||
whileHover={{ y: -4 }}
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true }}
|
||||
variants={fadeUp}>
|
||||
<div className="flex items-start gap-5">
|
||||
<div className="w-14 h-14 rounded-2xl flex items-center justify-center text-2xl shrink-0"
|
||||
style={{ background: `${p.renk}10` }}>
|
||||
{p.ikon}
|
||||
</div>
|
||||
<div>
|
||||
<div className="flex items-center gap-3 mb-2">
|
||||
<h3 className="font-display font-black text-[16px] uppercase text-[#1C1917]">{p.baslik}</h3>
|
||||
<span className="text-[10px] font-bold px-2 py-0.5 rounded-full"
|
||||
style={{ background: `${p.renk}10`, color: p.renk }}>
|
||||
{p.sektor}
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-[#57534E] text-[13px] leading-relaxed font-light">{p.aciklama}</p>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── EKİP ── */}
|
||||
{ekip.length > 0 && (
|
||||
<section id="ekip" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="mb-16">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Operasyon Liderleri
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase tracking-tight text-[#1C1917]">
|
||||
Yönetim Ekibimiz
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{ekip.map((k, i) => (
|
||||
<motion.div key={i}
|
||||
className="bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl overflow-hidden hover:border-[#1C1917] transition-all duration-300 flex flex-col justify-between"
|
||||
whileHover={{ y: -6 }}
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true }}
|
||||
variants={fadeUp}>
|
||||
<div className="h-40 bg-[#FAF9F6] border-b border-[#E7E5E4] flex items-center justify-center text-5xl">
|
||||
<span>{k.emoji}</span>
|
||||
</div>
|
||||
<div className="p-6">
|
||||
<h3 className="font-display font-black text-[15px] uppercase text-[#1C1917]">{k.ad}</h3>
|
||||
<p className="text-[12px] font-bold uppercase tracking-wider text-[#78716C] mt-0.5">{k.rol}</p>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
{/* ── YORUMLAR ── */}
|
||||
<section id="yorumlar" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="mb-16">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Müşteri Deneyimleri
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase tracking-tight text-[#1C1917]">
|
||||
Ortaklarımız Ne Söylüyor?
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
{yorumlar.map((y, i) => (
|
||||
<motion.div key={i}
|
||||
className="bg-[#FAF9F6] border border-[#E7E5E4] rounded-3xl p-7 hover:border-[#1C1917] transition-all duration-300 flex flex-col justify-between"
|
||||
whileHover={{ y: -4 }}
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true }}
|
||||
variants={fadeUp}>
|
||||
<div>
|
||||
<div className="flex gap-1 mb-4">
|
||||
{[...Array(y.puan)].map((_, j) => (
|
||||
<span key={j} className="text-[#10B981]">★</span>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-[#57534E] text-[13px] leading-relaxed italic mb-6 font-light">“{y.yorum}”</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-3 pt-4 border-t border-[#E7E5E4]/60">
|
||||
<span className="text-xl">{y.emoji}</span>
|
||||
<div>
|
||||
<p className="text-[#1C1917] font-bold text-xs uppercase tracking-tight">{y.yazar}</p>
|
||||
<p className="text-gray-400 text-[10px] mt-0.5">{y.tarih}</p>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── İLETİŞİM ── */}
|
||||
<section id="iletisim" className="py-24 px-6 border-t border-[#E7E5E4] bg-[#FAF9F6]">
|
||||
<div className="max-w-4xl mx-auto text-center">
|
||||
<span className="inline-block text-[11px] font-bold uppercase tracking-widest px-3 py-1 bg-[#FAF9F6] border border-[#E7E5E4] rounded-full text-[#78716C] mb-4">
|
||||
Operational Blueprint
|
||||
</span>
|
||||
<h2 className="font-display font-black text-4xl sm:text-5xl uppercase tracking-tight text-[#1C1917] mb-6">
|
||||
Birlikte Değer Katalım
|
||||
</h2>
|
||||
<p className="text-[#57534E] text-lg font-light mb-10 max-w-xl mx-auto">
|
||||
Hacminiz ve operasyon sıklığınız ne olursa olsun, lojistik süreçlerinizi en güvenli hatlarla optimize etmek üzere teklif isteyin.
|
||||
</p>
|
||||
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
||||
<motion.a href={`tel:${firma.telefon}`}
|
||||
className="flex items-center justify-center gap-2 px-8 py-4 rounded-full bg-[#1C1917] text-[#FAF9F6] font-bold text-[13px] tracking-wide uppercase hover:bg-[#33302E] transition-colors"
|
||||
whileHover={{ scale: 1.04 }} whileTap={{ scale: 0.97 }}>
|
||||
📞 {firma.telefon}
|
||||
</motion.a>
|
||||
<motion.a href={`mailto:${firma.email}`}
|
||||
className="flex items-center justify-center gap-2 px-8 py-4 rounded-full border border-[#E7E5E4] text-[#1C1917] font-bold text-[13px] tracking-wide uppercase hover:bg-[#E7E5E4]/20 transition-all"
|
||||
whileHover={{ scale: 1.04 }} whileTap={{ scale: 0.97 }}>
|
||||
✉️ {firma.email}
|
||||
</motion.a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── FOOTER ── */}
|
||||
<footer className="border-t border-[#E7E5E4] bg-[#FAF9F6] px-6 pt-16 pb-8">
|
||||
<div className="max-w-6xl mx-auto flex flex-col sm:flex-row justify-between items-center gap-4 text-[12px] text-[#78716C]">
|
||||
<p>© 2026 {firma.adi}. Tüm hakları saklıdır.</p>
|
||||
<p className="hover:text-[#1C1917] transition-colors font-light">Gizlilik Politikası</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<style jsx global>{`
|
||||
.stroke-text {
|
||||
font-weight: 900;
|
||||
color: transparent;
|
||||
}
|
||||
`}</style>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,508 @@
|
||||
"use client";
|
||||
|
||||
import { motion, useScroll, useTransform, AnimatePresence } from "framer-motion";
|
||||
import { useRef, useState } from "react";
|
||||
import type { DemoData } from "@/data/demos";
|
||||
import AnimatedCounter from "@/components/ui/AnimatedCounter";
|
||||
|
||||
const easeOutExpo = [0.16, 1, 0.3, 1] as [number, number, number, number];
|
||||
|
||||
const fadeUp = {
|
||||
hidden: { opacity: 0, y: 40 },
|
||||
show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: easeOutExpo } },
|
||||
};
|
||||
|
||||
const stagger = {
|
||||
hidden: {},
|
||||
show: { transition: { staggerChildren: 0.1 } },
|
||||
};
|
||||
|
||||
export default function RestoranTemplate({ data }: { data: DemoData }) {
|
||||
const { firma, istatistikler, hizmetler, menu = [], yorumlar = [] } = data;
|
||||
const heroRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
const { scrollYProgress } = useScroll({ target: heroRef, offset: ["start start", "end start"] });
|
||||
const heroY = useTransform(scrollYProgress, [0, 1], ["0%", "20%"]);
|
||||
const heroOpacity = useTransform(scrollYProgress, [0, 0.8], [1, 0]);
|
||||
|
||||
const [aktifKategori, setAktifKategori] = useState(0);
|
||||
const [showBookingModal, setShowBookingModal] = useState(false);
|
||||
|
||||
// SVG Render Helper for clean iconography (Replaces all emojis)
|
||||
const getIconSvg = (name: string) => {
|
||||
switch (name) {
|
||||
case "alacarte":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#C5A880]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25" />
|
||||
</svg>
|
||||
);
|
||||
case "special":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#C5A880]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z" />
|
||||
</svg>
|
||||
);
|
||||
case "catering":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#C5A880]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M15.75 10.5V6a3.75 3.75 0 1 0-7.5 0v4.5m11.356-1.993 1.263 12c.07.665-.45 1.243-1.119 1.243H4.25a1.125 1.125 0 0 1-1.12-1.243l1.264-12A1.125 1.125 0 0 1 5.513 7.5h12.974c.576 0 1.059.435 1.119 1.007ZM8.625 10.5a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm7.5 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z" />
|
||||
</svg>
|
||||
);
|
||||
case "delivery":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#C5A880]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M8.25 18.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0ZM19.5 18.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Z" />
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 0 0-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 0 0-16.536-1.84" />
|
||||
</svg>
|
||||
);
|
||||
default:
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#C5A880]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" d="M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="bg-[#090A0C] text-white font-body">
|
||||
|
||||
{/* ── FLOATING NAVIGATION 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.7, ease: easeOutExpo }}
|
||||
>
|
||||
<div className="mx-auto max-w-6xl h-20 flex items-center justify-between px-8 bg-[#090A0C]/80 backdrop-blur-xl border border-[#C5A880]/20 rounded-2xl shadow-2xl">
|
||||
<a href="#" className="flex items-center gap-3 group">
|
||||
<span className="font-display text-2xl font-bold tracking-widest text-white group-hover:text-[#C5A880] transition-colors uppercase">
|
||||
{firma.adi}
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav className="hidden lg:flex items-center gap-10">
|
||||
{[
|
||||
{ label: "Our Heritage", href: "#heritage" },
|
||||
{ label: "Special Meal", href: "#special-meal" },
|
||||
{ label: "Chalkboard Bakery", href: "#bakery" },
|
||||
{ label: "Hizmetlerimiz", href: "#services" },
|
||||
{ label: "Rezervasyon", href: "#randevu" }
|
||||
].map(item => (
|
||||
<a
|
||||
key={item.label}
|
||||
href={item.href}
|
||||
className="text-[11px] font-sans-clean font-bold tracking-[2px] uppercase text-white/60 hover:text-white transition-colors cursor-pointer"
|
||||
>
|
||||
{item.label}
|
||||
</a>
|
||||
))}
|
||||
</nav>
|
||||
|
||||
<div className="flex items-center gap-6">
|
||||
<motion.button
|
||||
onClick={() => setShowBookingModal(true)}
|
||||
className="text-[11px] font-sans-clean font-black tracking-[2px] uppercase text-[#C5A880] border border-[#C5A880] hover:bg-[#C5A880] hover:text-[#090A0C] px-6 py-3 rounded-xl transition-all cursor-pointer"
|
||||
whileHover={{ scale: 1.03 }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
>
|
||||
Enquiry
|
||||
</motion.button>
|
||||
</div>
|
||||
</div>
|
||||
</motion.header>
|
||||
|
||||
{/* ── HERO SECTION ── */}
|
||||
<section ref={heroRef} className="relative min-h-screen flex items-center justify-center overflow-hidden bg-[#090A0C]">
|
||||
<motion.div
|
||||
className="absolute inset-0 pointer-events-none"
|
||||
style={{ y: heroY, opacity: heroOpacity }}
|
||||
>
|
||||
<div className="absolute inset-0 bg-gradient-to-b from-black/80 via-black/60 to-[#090A0C] z-10" />
|
||||
</motion.div>
|
||||
|
||||
<div className="relative z-20 max-w-5xl mx-auto px-6 text-center pt-24">
|
||||
<motion.div
|
||||
variants={stagger}
|
||||
initial="hidden"
|
||||
animate="show"
|
||||
className="flex flex-col items-center"
|
||||
>
|
||||
<motion.span
|
||||
variants={fadeUp}
|
||||
className="text-[#C5A880] italic text-lg lg:text-xl tracking-wider mb-6 block font-display"
|
||||
>
|
||||
welcome to our delicious corner
|
||||
</motion.span>
|
||||
|
||||
<motion.h1
|
||||
variants={fadeUp}
|
||||
className="font-display text-5xl md:text-7xl lg:text-8xl font-black text-white leading-[1.05] tracking-widest uppercase mb-8"
|
||||
>
|
||||
Best Famous
|
||||
<br />
|
||||
Dishes
|
||||
</motion.h1>
|
||||
|
||||
<motion.p
|
||||
variants={fadeUp}
|
||||
className="text-white/60 font-sans-clean font-medium text-sm lg:text-base leading-relaxed max-w-lg mb-12"
|
||||
>
|
||||
A journey of raw ingredients transformed by fire, smoke, and heritage. Exquisite tastes curated for refined palates.
|
||||
</motion.p>
|
||||
|
||||
<motion.div variants={fadeUp}>
|
||||
<motion.a
|
||||
href="#special-meal"
|
||||
className="inline-flex items-center gap-3 text-[11px] font-sans-clean font-bold tracking-[3px] uppercase border-b-2 border-[#C5A880] text-white hover:text-[#C5A880] pb-2 transition-colors cursor-pointer"
|
||||
whileHover={{ y: -3 }}
|
||||
>
|
||||
Learn More
|
||||
</motion.a>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 2: HERITAGE ── */}
|
||||
<section id="heritage" className="py-32 bg-[#090A0C] border-t border-[#C5A880]/15 relative z-10 px-6">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="text-center mb-24">
|
||||
<span className="text-[#C5A880] font-display italic text-base tracking-wider block mb-3">Special moments</span>
|
||||
<h2 className="font-display text-4xl lg:text-5xl font-black tracking-widest text-white uppercase">
|
||||
About Us
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid lg:grid-cols-3 gap-8 items-stretch">
|
||||
<div className="bg-[#13151A] rounded-2xl p-10 border border-[#C5A880]/10 flex flex-col items-center justify-center text-center shadow-2xl relative min-h-[300px]">
|
||||
<span className="text-[#C5A880] text-xs tracking-wider mb-4 block">Taste perception</span>
|
||||
<h3 className="font-display text-2xl lg:text-3xl font-black text-white tracking-widest uppercase mb-6 leading-tight">
|
||||
Traditional
|
||||
<br />
|
||||
& Modern
|
||||
</h3>
|
||||
<p className="text-white/50 font-sans-clean text-xs leading-relaxed max-w-xs mb-8">
|
||||
Palermo’nun en eski geleneksel tekniklerini modern gastronomi vizyonuyla harmanlıyoruz. Her ayrıntıda yüksek zanaatkarlık yatıyor.
|
||||
</p>
|
||||
<motion.button
|
||||
onClick={() => setShowBookingModal(true)}
|
||||
className="text-[10px] font-sans-clean font-bold tracking-[2px] uppercase text-[#C5A880] border border-[#C5A880]/40 hover:border-[#C5A880] px-5 py-3 rounded-lg transition-colors cursor-pointer"
|
||||
whileHover={{ scale: 1.04 }}
|
||||
>
|
||||
Read More
|
||||
</motion.button>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#13151A] rounded-2xl p-10 border border-[#C5A880]/10 flex flex-col items-center justify-center text-center shadow-2xl relative">
|
||||
<span className="text-[#C5A880] text-xs tracking-wider mb-4 block">Crafted Flavours</span>
|
||||
<h3 className="font-display text-2xl lg:text-3xl font-black text-white tracking-widest uppercase mb-6 leading-tight">
|
||||
Wood & Fire
|
||||
</h3>
|
||||
<p className="text-white/50 font-sans-clean text-xs leading-relaxed max-w-xs">
|
||||
Ustalık gerektiren fırınlama ve pişirme aşamalarından geçerek servis edilen tabaklarımız, damak tadınızda unutulmaz izler bırakır.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-[#13151A] rounded-2xl p-10 border border-[#C5A880]/10 flex flex-col items-center justify-center text-center shadow-2xl relative">
|
||||
<span className="text-[#C5A880] text-xs tracking-wider mb-4 block">Atmosphere</span>
|
||||
<h3 className="font-display text-2xl lg:text-3xl font-black text-white tracking-widest uppercase mb-6 leading-tight">
|
||||
Refined Space
|
||||
</h3>
|
||||
<p className="text-white/50 font-sans-clean text-xs leading-relaxed max-w-xs">
|
||||
Özenle dekore edilmiş loş, taş döşemeli şık salonumuzda kendinizi İtalya sokaklarında hissedeceksiniz.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 3: SPECIAL MEAL ── */}
|
||||
<section id="special-meal" className="py-32 bg-[#0E0F12] border-t border-[#C5A880]/15 relative z-10 px-6">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="text-center mb-16">
|
||||
<span className="text-[#C5A880] font-display italic text-base tracking-wider block mb-4">our full menu</span>
|
||||
<h2 className="font-display text-4xl lg:text-5xl font-black tracking-widest text-white uppercase mb-16">
|
||||
Special Meal
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid lg:grid-cols-12 gap-16 items-start">
|
||||
<div className="lg:col-span-12 flex flex-col justify-center">
|
||||
<div className="space-y-6 max-w-4xl mx-auto w-full">
|
||||
{menu[aktifKategori]?.urunler.map((item) => (
|
||||
<div key={item.ad} className="flex flex-col cursor-pointer group">
|
||||
<div className="flex items-end justify-between gap-4">
|
||||
<span className="font-display text-base lg:text-lg font-bold text-white group-hover:text-[#C5A880] transition-colors uppercase">
|
||||
{item.ad}
|
||||
</span>
|
||||
<div className="grow border-b border-dashed border-[#C5A880]/20 mb-2 group-hover:border-[#C5A880]/40 transition-colors mx-2" />
|
||||
<span className="font-display text-base font-black text-[#C5A880] shrink-0">
|
||||
{item.fiyat}
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-white/50 font-sans-clean text-[11px] mt-1 leading-relaxed">
|
||||
{item.aciklama}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Category Tab Buttons */}
|
||||
<div className="flex items-center justify-center gap-4 mt-16 flex-wrap">
|
||||
{menu.map((kat, idx) => (
|
||||
<button
|
||||
key={kat.kategori}
|
||||
onClick={() => setAktifKategori(idx)}
|
||||
className="text-[10px] font-sans-clean font-bold tracking-[2px] uppercase px-5 py-3 rounded-lg border transition-all cursor-pointer"
|
||||
style={aktifKategori === idx
|
||||
? { backgroundColor: "#C5A880", color: "#090A0C", borderColor: "#C5A880" }
|
||||
: { backgroundColor: "transparent", color: "rgba(255,255,255,0.5)", borderColor: "rgba(197,168,128,0.2)" }
|
||||
}
|
||||
>
|
||||
{kat.kategori}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 5: SERVICES ── */}
|
||||
<section id="services" className="py-24 bg-[#090A0C] border-t border-[#C5A880]/15 relative z-10 px-6">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
<div className="text-center mb-16">
|
||||
<span className="text-[#C5A880] font-display italic text-base tracking-wider block mb-3">Our Offerings</span>
|
||||
<h2 className="font-display text-3xl lg:text-4xl font-black tracking-widest text-white uppercase">
|
||||
Hizmetlerimiz
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-4 gap-6">
|
||||
{hizmetler.map((h, i) => (
|
||||
<motion.div
|
||||
key={h.baslik}
|
||||
className="bg-[#13151A] rounded-xl p-8 border border-white/5 hover:border-[#C5A880]/30 hover:bg-[#13151A]/80 transition-all duration-300 flex flex-col items-center text-center group cursor-default"
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.5, delay: i * 0.1 }}
|
||||
whileHover={{ y: -4 }}
|
||||
>
|
||||
<div className="w-14 h-14 rounded-xl bg-white/5 border border-white/10 flex items-center justify-center mb-5 transition-all group-hover:bg-[#C5A880]/10 group-hover:border-[#C5A880]/30">
|
||||
{getIconSvg(h.ikon)}
|
||||
</div>
|
||||
<h3 className="font-display font-bold text-white text-sm mb-3 uppercase tracking-wider leading-snug">
|
||||
{h.baslik}
|
||||
</h3>
|
||||
<p className="text-white/50 font-sans-clean text-[10px] leading-relaxed">
|
||||
{h.aciklama}
|
||||
</p>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 6: TESTIMONIALS ── */}
|
||||
<section id="yorumlar" className="py-28 bg-[#0E0F12] border-t border-[#C5A880]/15 px-6">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
<div className="text-center mb-16">
|
||||
<span className="text-[#C5A880] font-display italic text-base tracking-wider block mb-3">social proof</span>
|
||||
<h2 className="font-display text-3xl lg:text-4xl font-black tracking-widest text-white uppercase">
|
||||
Misafir Deneyimleri
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-6">
|
||||
{yorumlar.map((y, i) => (
|
||||
<motion.div
|
||||
key={y.yazar}
|
||||
className="bg-[#13151A] border border-[#C5A880]/10 rounded-xl p-8 flex flex-col justify-between"
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.5, delay: i * 0.1 }}
|
||||
whileHover={{ y: -4, borderColor: "rgba(197,168,128,0.3)" }}
|
||||
>
|
||||
<div className="flex gap-1 mb-6">
|
||||
{[...Array(y.puan)].map((_, j) => (
|
||||
<span key={j} className="text-[#C5A880]">★</span>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-white/80 font-sans-clean text-xs leading-relaxed italic mb-8">
|
||||
“{y.yorum}”
|
||||
</p>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-10 h-10 rounded-full border border-[#C5A880]/30 flex items-center justify-center text-lg bg-[#090A0C] shrink-0">
|
||||
{y.emoji}
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="font-display text-[#C5A880] text-xs font-bold uppercase tracking-wider">
|
||||
{y.yazar}
|
||||
</h4>
|
||||
<span className="font-sans-clean text-[9px] text-white/40 uppercase tracking-widest">
|
||||
{y.tarih}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 7: RESERVATION ── */}
|
||||
<section id="randevu" className="py-32 bg-[#090A0C] border-t border-[#C5A880]/15 relative z-10 px-6">
|
||||
<div className="max-w-3xl mx-auto">
|
||||
<div className="bg-[#13151A] rounded-2xl p-8 md:p-12 shadow-2xl border border-[#C5A880]/20">
|
||||
<div className="text-center mb-10">
|
||||
<span className="text-[#C5A880] font-display italic text-base tracking-wider block mb-3">booking reservation</span>
|
||||
<h2 className="font-display text-3xl md:text-4xl font-black tracking-widest text-white uppercase">
|
||||
Masa Rezervasyonu
|
||||
</h2>
|
||||
<p className="text-white/60 font-sans-clean text-xs mt-2 leading-relaxed">
|
||||
Benzersiz bir fine dining deneyimi için masanızı önceden ayırtın.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-2 gap-5">
|
||||
{[
|
||||
{ label: "Ad Soyad", placeholder: "Adınız Soyadınız", type: "text", full: false },
|
||||
{ label: "Telefon", placeholder: "05xx xxx xx xx", type: "tel", full: false },
|
||||
{ label: "Tarih", placeholder: "", type: "date", full: false },
|
||||
{ label: "Saat", placeholder: "", type: "time", full: false },
|
||||
{ label: "Kişi Sayısı", placeholder: "2", type: "number", full: false },
|
||||
{ label: "Özel İstek / Not", placeholder: "Diyet hassasiyetleri, kutlamalar vb.", type: "text", full: true },
|
||||
].map((field, i) => (
|
||||
<div key={i} className={field.full ? "col-span-2" : "col-span-1"}>
|
||||
<label className="block text-[9px] font-sans-clean font-bold text-[#C5A880] mb-1.5 uppercase tracking-widest">{field.label}</label>
|
||||
<input
|
||||
type={field.type}
|
||||
placeholder={field.placeholder}
|
||||
className="w-full px-4 py-3 rounded-xl border border-white/10 bg-[#090A0C] text-sm text-white focus:outline-none focus:ring-1 focus:ring-[#C5A880] placeholder-white/20 transition-all font-sans-clean"
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<motion.button
|
||||
className="mt-8 w-full py-4 rounded-xl text-[#090A0C] font-sans-clean font-black tracking-[2px] uppercase bg-[#C5A880] hover:bg-[#D5B990] transition-colors cursor-pointer text-xs"
|
||||
whileHover={{ scale: 1.02, boxShadow: "0 10px 30px rgba(197, 168, 128, 0.25)" }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
>
|
||||
Masa Ayırt
|
||||
</motion.button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── FOOTER ── */}
|
||||
<footer className="bg-[#090A0C] border-t border-white/5 px-6 pt-20 pb-8 relative z-10">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
<div className="grid md:grid-cols-4 gap-12 pb-16 border-b border-white/5">
|
||||
<div className="md:col-span-2">
|
||||
<span className="font-display text-2xl font-black text-[#C5A880] tracking-widest uppercase mb-4 block">
|
||||
{firma.adi}
|
||||
</span>
|
||||
<p className="text-white/60 font-sans-clean text-xs leading-relaxed max-w-xs mb-8">
|
||||
{firma.slogan} — Geleneksel zanaat, modern vizyon.
|
||||
</p>
|
||||
<p className="text-white/60 font-sans-clean text-xs">📍 {firma.adres}</p>
|
||||
<p className="text-white/60 font-sans-clean text-xs mt-1">📞 {firma.telefon}</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h4 className="font-display text-white text-xs font-bold uppercase tracking-wider mb-5">
|
||||
Şefin Menüsü
|
||||
</h4>
|
||||
{menu.map(kat => (
|
||||
<a
|
||||
key={kat.kategori}
|
||||
href="#special-meal"
|
||||
className="block text-white/50 hover:text-white text-xs mb-2.5 transition-colors font-sans-clean uppercase tracking-wider"
|
||||
>
|
||||
{kat.kategori}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h4 className="font-display text-white text-xs font-bold uppercase tracking-wider mb-5">
|
||||
Karaköy Lezzet
|
||||
</h4>
|
||||
{["Heritage", "Special Meal", "Reservation"].map(item => (
|
||||
<a
|
||||
key={item}
|
||||
href="#"
|
||||
className="block text-white/50 hover:text-white text-xs mb-2.5 transition-colors font-sans-clean"
|
||||
>
|
||||
{item}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col md:flex-row justify-between items-center pt-8 gap-4 font-sans-clean text-white/40">
|
||||
<p className="text-xs">© 2026 {firma.adi}. Tüm hakları saklıdır.</p>
|
||||
<p className="text-[10px]">Gizlilik Politikası · Çerez Ayarları</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{/* ── FAST BOOKING OVERLAY MODAL ── */}
|
||||
<AnimatePresence>
|
||||
{showBookingModal && (
|
||||
<motion.div
|
||||
className="fixed inset-0 z-50 flex items-center justify-center p-6 bg-black/80 backdrop-blur-sm"
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: 1 }}
|
||||
exit={{ opacity: 0 }}
|
||||
>
|
||||
<motion.div
|
||||
className="bg-[#13151A] rounded-2xl p-8 max-w-md w-full relative shadow-2xl border border-[#C5A880]/30"
|
||||
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-white/5 flex items-center justify-center text-white/60 hover:text-white transition-colors"
|
||||
onClick={() => setShowBookingModal(false)}
|
||||
>
|
||||
✕
|
||||
</button>
|
||||
|
||||
<h3 className="font-display font-black text-white text-xl mb-1 uppercase tracking-wider">
|
||||
Hızlı Rezervasyon
|
||||
</h3>
|
||||
<p className="text-white/50 font-sans-clean text-[10px] mb-6 uppercase tracking-widest">
|
||||
Karaköy Rezervasyon Hattı
|
||||
</p>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
<label className="block text-[9px] font-sans-clean font-bold text-[#C5A880] mb-1 uppercase tracking-wider">Ad Soyad</label>
|
||||
<input type="text" className="w-full px-4 py-3 rounded-xl border border-white/10 bg-[#090A0C] text-sm text-white focus:outline-none focus:ring-1 focus:ring-[#C5A880]" placeholder="Adınız Soyadınız" />
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-[9px] font-sans-clean font-bold text-[#C5A880] mb-1 uppercase tracking-wider">Telefon Numarası</label>
|
||||
<input type="tel" className="w-full px-4 py-3 rounded-xl border border-white/10 bg-[#090A0C] text-sm text-white focus:outline-none focus:ring-1 focus:ring-[#C5A880]" placeholder="05xx xxx xx xx" />
|
||||
</div>
|
||||
<motion.button
|
||||
className="w-full py-4 rounded-xl bg-[#C5A880] text-[#090A0C] font-sans-clean font-black text-xs uppercase tracking-wider mt-4"
|
||||
whileHover={{ scale: 1.02 }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
onClick={() => setShowBookingModal(false)}
|
||||
>
|
||||
Bilgileri Gönder
|
||||
</motion.button>
|
||||
</div>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,460 @@
|
||||
"use client";
|
||||
|
||||
import { motion, useScroll, useTransform, AnimatePresence } from "framer-motion";
|
||||
import { useRef, useState } from "react";
|
||||
import type { DemoData } from "@/data/demos";
|
||||
import AnimatedCounter from "@/components/ui/AnimatedCounter";
|
||||
|
||||
const easeOutExpo = [0.16, 1, 0.3, 1] as [number, number, number, number];
|
||||
|
||||
const fadeUp = {
|
||||
hidden: { opacity: 0, y: 40 },
|
||||
show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: easeOutExpo } },
|
||||
};
|
||||
|
||||
const stagger = {
|
||||
hidden: {},
|
||||
show: { transition: { staggerChildren: 0.1 } },
|
||||
};
|
||||
|
||||
export default function RestoranTemplate2({ data }: { data: DemoData }) {
|
||||
const { firma, istatistikler, hizmetler, menu = [], yorumlar = [] } = data;
|
||||
const heroRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
const { scrollYProgress } = useScroll({ target: heroRef, offset: ["start start", "end start"] });
|
||||
const heroY = useTransform(scrollYProgress, [0, 1], ["0%", "20%"]);
|
||||
const heroOpacity = useTransform(scrollYProgress, [0, 0.8], [1, 0]);
|
||||
|
||||
const [aktifKategori, setAktifKategori] = useState(0);
|
||||
const [showBookingModal, setShowBookingModal] = useState(false);
|
||||
|
||||
// SVG Render Helper for clean vector icons (No Emojis)
|
||||
const getIconSvg = (name: string) => {
|
||||
switch (name) {
|
||||
case "alacarte":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#0038A8]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25" />
|
||||
</svg>
|
||||
);
|
||||
case "special":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#0038A8]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z" />
|
||||
</svg>
|
||||
);
|
||||
case "catering":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#0038A8]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M12 3v18M3 12h18" />
|
||||
</svg>
|
||||
);
|
||||
case "delivery":
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#0038A8]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M8.25 18.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0ZM19.5 18.75a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Z" />
|
||||
<path strokeLinecap="round" strokeLinejoin="round" d="M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 0 0-3 3h15.75" />
|
||||
</svg>
|
||||
);
|
||||
default:
|
||||
return (
|
||||
<svg className="w-6 h-6 stroke-[#0038A8]" viewBox="0 0 24 24" fill="none" strokeWidth="1.5">
|
||||
<path strokeLinecap="round" d="M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="bg-[#FDFBF7] text-[#121C22] font-body">
|
||||
|
||||
{/* ── 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.7, ease: easeOutExpo }}
|
||||
>
|
||||
<div className="mx-auto max-w-7xl h-20 flex items-center justify-between px-8 bg-[#FDFBF7]/90 backdrop-blur-xl border border-[#0038A8]/10 rounded-2xl shadow-lg">
|
||||
<a href="#" className="flex items-center gap-2">
|
||||
<span className="text-xl font-bold tracking-tight text-[#0038A8] font-display flex items-center gap-1.5 uppercase">
|
||||
<span className="text-2xl">🍋</span> {firma.adi}
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav className="hidden lg:flex items-center gap-8">
|
||||
{[
|
||||
{ label: "Our Story", href: "#story" },
|
||||
{ label: "Pasta & Pizza", href: "#pasta-pizza" },
|
||||
{ label: "Lemon Orchard", href: "#lemon" },
|
||||
{ label: "Hizmetlerimiz", href: "#services" },
|
||||
{ label: "Rezervasyon", href: "#randevu" }
|
||||
].map(item => (
|
||||
<a
|
||||
key={item.label}
|
||||
href={item.href}
|
||||
className="text-[11px] font-sans-clean font-bold tracking-[1.5px] uppercase text-[#0038A8]/70 hover:text-[#0038A8] transition-colors"
|
||||
>
|
||||
{item.label}
|
||||
</a>
|
||||
))}
|
||||
</nav>
|
||||
|
||||
<div className="flex items-center gap-4">
|
||||
<motion.button
|
||||
onClick={() => setShowBookingModal(true)}
|
||||
className="text-[11px] font-sans-clean font-black tracking-[2px] uppercase text-white bg-[#0038A8] hover:bg-[#002266] px-6 py-3 rounded-xl transition-all cursor-pointer shadow-md shadow-[#0038A8]/20"
|
||||
whileHover={{ scale: 1.03 }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
>
|
||||
Book Table
|
||||
</motion.button>
|
||||
</div>
|
||||
</div>
|
||||
</motion.header>
|
||||
|
||||
{/* ── HERO SECTION ── */}
|
||||
<section ref={heroRef} className="relative min-h-screen flex items-center bg-[#FDFBF7] pt-24">
|
||||
<div className="relative z-10 max-w-7xl mx-auto px-6 w-full py-12">
|
||||
<div className="grid lg:grid-cols-12 gap-12 items-center">
|
||||
|
||||
{/* Left Content */}
|
||||
<motion.div
|
||||
className="lg:col-span-12 z-20 text-center"
|
||||
variants={stagger}
|
||||
initial="hidden"
|
||||
animate="show"
|
||||
>
|
||||
<motion.div
|
||||
variants={fadeUp}
|
||||
className="inline-flex items-center gap-2 text-[10px] font-sans-clean font-black uppercase tracking-widest text-[#0038A8]/60 mb-6 bg-[#0038A8]/5 border border-[#0038A8]/10 px-4 py-2 rounded-full"
|
||||
>
|
||||
<span className="w-1.5 h-1.5 rounded-full bg-[#0038A8]" />
|
||||
{firma.slogan}
|
||||
</motion.div>
|
||||
|
||||
<motion.h1
|
||||
variants={fadeUp}
|
||||
className="font-display text-6xl md:text-7xl font-black text-[#0038A8] leading-[1.05] tracking-tight mb-8"
|
||||
>
|
||||
Linen, Lemons
|
||||
<br />
|
||||
<span className="italic font-light opacity-90 text-[#3C5A48]">& Wood-fired</span>
|
||||
</motion.h1>
|
||||
|
||||
<motion.p
|
||||
variants={fadeUp}
|
||||
className="text-gray-600 font-sans-clean text-sm lg:text-base leading-relaxed max-w-md mx-auto mb-12 font-medium"
|
||||
>
|
||||
Karaköy limanında, Sicilya rüzgarları esiyor. El yapımı makarnalar, taze baharatlar ve odun ateşinde karamelize olan lezzetler.
|
||||
</motion.p>
|
||||
|
||||
<motion.div variants={fadeUp}>
|
||||
<motion.a
|
||||
href="#pasta-pizza"
|
||||
className="inline-flex items-center gap-3 px-8 py-4 rounded-full bg-[#0038A8] hover:bg-[#002266] text-white font-sans-clean font-black text-xs transition-all shadow-lg shadow-[#0038A8]/30 cursor-pointer"
|
||||
whileHover={{ scale: 1.04 }}
|
||||
whileTap={{ scale: 0.97 }}
|
||||
>
|
||||
Discover Menu <span className="text-[10px]">→</span>
|
||||
</motion.a>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 2: OUR STORY ── */}
|
||||
<section id="story" className="py-32 bg-[#F5F2EB] px-6 relative z-10 border-t border-[#0038A8]/5">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
<div className="grid lg:grid-cols-12 gap-16 items-center">
|
||||
|
||||
<motion.div
|
||||
className="lg:col-span-12 text-center"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true, amount: 0.2 }}
|
||||
variants={stagger}
|
||||
>
|
||||
<motion.span
|
||||
variants={fadeUp}
|
||||
className="text-[#0038A8] font-display italic text-base tracking-wider block mb-4"
|
||||
>
|
||||
Sicilian Baking Heritage
|
||||
</motion.span>
|
||||
<motion.h2
|
||||
variants={fadeUp}
|
||||
className="font-display text-4xl lg:text-5xl font-black tracking-tight text-[#0038A8] uppercase mb-8"
|
||||
>
|
||||
Our Story
|
||||
</motion.h2>
|
||||
|
||||
<motion.p
|
||||
variants={fadeUp}
|
||||
className="text-gray-600 font-sans-clean text-xs leading-relaxed mb-12 max-w-md mx-auto font-medium"
|
||||
>
|
||||
Odun ateşinin alevi ve zeytin ağacı közlerinin aroması. Sicilia Tavola, nesiller boyu aktarılan İtalyan tariflerini zanaatkar ellerle buluşturuyor. Her pizza taş fırınımızda 485 derecede saniyeler içinde mükemmelleşiyor.
|
||||
</motion.p>
|
||||
|
||||
{/* Grid Metrics */}
|
||||
<motion.div
|
||||
variants={fadeUp}
|
||||
className="grid grid-cols-2 sm:grid-cols-4 gap-4 max-w-4xl mx-auto"
|
||||
>
|
||||
{istatistikler.map((s, i) => (
|
||||
<div key={i} className="bg-white p-6 rounded-2xl border border-[#0038A8]/5">
|
||||
<div className="text-3xl font-black text-[#0038A8] font-display">
|
||||
{s.deger}
|
||||
</div>
|
||||
<div className="text-gray-400 text-[10px] uppercase font-sans-clean font-bold tracking-widest mt-1">
|
||||
{s.etiket}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 3: PASTA & PIZZA MENU ── */}
|
||||
<section id="pasta-pizza" className="py-32 bg-[#FDFBF7] relative z-10 px-6 border-t border-[#0038A8]/5">
|
||||
<div className="max-w-6xl mx-auto">
|
||||
<div className="text-center mb-16">
|
||||
<span className="text-[#0038A8] font-display italic text-base tracking-wider block mb-4">our fresh selections</span>
|
||||
<h2 className="font-display text-4xl lg:text-5xl font-black tracking-tight text-[#0038A8] uppercase mb-16">
|
||||
Pasta & Pizza
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="space-y-6 max-w-3xl mx-auto w-full">
|
||||
{menu[aktifKategori]?.urunler.map((item) => (
|
||||
<div key={item.ad} className="flex flex-col cursor-pointer group">
|
||||
<div className="flex items-end justify-between gap-4">
|
||||
<span className="font-display text-base lg:text-lg font-bold text-[#0038A8] group-hover:opacity-85 transition-opacity uppercase">
|
||||
{item.ad}
|
||||
</span>
|
||||
<div className="grow border-b border-dashed border-[#0038A8]/20 mb-2 transition-colors mx-2" />
|
||||
<span className="font-display text-base font-black text-[#0038A8] shrink-0">
|
||||
{item.fiyat}
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-gray-500 font-sans-clean text-[11px] mt-1 leading-relaxed">
|
||||
{item.aciklama}
|
||||
</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Category Tab Buttons */}
|
||||
<div className="flex items-center justify-center gap-4 mt-16 flex-wrap">
|
||||
{menu.map((kat, idx) => (
|
||||
<button
|
||||
key={kat.kategori}
|
||||
onClick={() => setAktifKategori(idx)}
|
||||
className="text-[10px] font-sans-clean font-bold tracking-[1.5px] uppercase px-5 py-3 rounded-lg border transition-all cursor-pointer"
|
||||
style={aktifKategori === idx
|
||||
? { backgroundColor: "#0038A8", color: "white", borderColor: "#0038A8" }
|
||||
: { backgroundColor: "transparent", color: "rgba(0, 56, 168, 0.6)", borderColor: "rgba(0, 56, 168, 0.2)" }
|
||||
}
|
||||
>
|
||||
{kat.kategori}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 5: SERVICES ── */}
|
||||
<section id="services" className="py-24 bg-[#FDFBF7] border-t border-[#0038A8]/5 relative z-10 px-6">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
<div className="text-center mb-16">
|
||||
<span className="text-[#0038A8] font-display italic text-base tracking-wider block mb-3">Our Offerings</span>
|
||||
<h2 className="font-display text-3xl lg:text-4xl font-black tracking-tight text-[#0038A8] uppercase">
|
||||
Hizmetlerimiz
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-4 gap-6">
|
||||
{hizmetler.map((h, i) => (
|
||||
<motion.div
|
||||
key={h.baslik}
|
||||
className="bg-white rounded-2xl p-8 border border-[#0038A8]/5 hover:border-[#0038A8]/30 hover:bg-[#FDFBF7] transition-all duration-300 flex flex-col items-center text-center group cursor-default shadow-sm"
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.5, delay: i * 0.1 }}
|
||||
whileHover={{ y: -4 }}
|
||||
>
|
||||
<div className="w-14 h-14 rounded-full bg-[#0038A8]/5 flex items-center justify-center mb-5 transition-transform group-hover:scale-110">
|
||||
{getIconSvg(h.ikon)}
|
||||
</div>
|
||||
<h3 className="font-display font-bold text-[#0038A8] text-sm mb-3 uppercase tracking-wider leading-snug">
|
||||
{h.baslik}
|
||||
</h3>
|
||||
<p className="text-gray-400 font-sans-clean text-[10px] leading-relaxed">
|
||||
{h.aciklama}
|
||||
</p>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 6: TESTIMONIALS ── */}
|
||||
<section id="yorumlar" className="py-28 bg-[#F5F2EB] border-t border-[#0038A8]/5 px-6">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
<div className="text-center mb-16">
|
||||
<span className="text-[#0038A8] font-display italic text-base tracking-wider block mb-3">guest stories</span>
|
||||
<h2 className="font-display text-3xl lg:text-4xl font-black tracking-tight text-[#0038A8] uppercase">
|
||||
Misafir Yorumları
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-8 max-w-4xl mx-auto">
|
||||
{yorumlar.map((y, i) => (
|
||||
<motion.div
|
||||
key={y.yazar}
|
||||
className="bg-white border border-[#0038A8]/5 rounded-[28px] p-8 flex flex-col justify-between shadow-sm"
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.5, delay: i * 0.1 }}
|
||||
whileHover={{ y: -4, borderColor: "rgba(0, 56, 168, 0.3)" }}
|
||||
>
|
||||
<div className="flex gap-1 mb-6">
|
||||
{[...Array(y.puan)].map((_, j) => (
|
||||
<span key={j} className="text-[#0038A8]">★</span>
|
||||
))}
|
||||
</div>
|
||||
<p className="text-gray-600 font-sans-clean text-xs leading-relaxed italic mb-8 font-medium">
|
||||
“{y.yorum}”
|
||||
</p>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-10 h-10 rounded-full border border-[#0038A8]/20 flex items-center justify-center text-lg bg-[#FDFBF7] shrink-0 shadow-sm">
|
||||
{y.emoji}
|
||||
</div>
|
||||
<div>
|
||||
<h4 className="font-display text-[#0038A8] text-xs font-bold uppercase tracking-wider">
|
||||
{y.yazar}
|
||||
</h4>
|
||||
<span className="font-sans-clean text-[9px] text-gray-400 uppercase tracking-widest">
|
||||
{y.tarih}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── SECTION 7: RESERVATION ── */}
|
||||
<section id="randevu" className="py-32 bg-[#FDFBF7] border-t border-[#0038A8]/5 relative z-10 px-6">
|
||||
<div className="max-w-3xl mx-auto">
|
||||
<div className="bg-white rounded-[36px] p-8 md:p-12 shadow-2xl border border-[#0038A8]/10">
|
||||
<div className="text-center mb-10">
|
||||
<span className="text-[#0038A8] font-display italic text-base tracking-wider block mb-3">Tavola Reservation</span>
|
||||
<h2 className="font-display text-3xl md:text-4xl font-black tracking-tight text-[#0038A8] uppercase">
|
||||
Masa Rezervasyonu
|
||||
</h2>
|
||||
<p className="text-gray-400 font-sans-clean text-xs mt-2 leading-relaxed font-medium">
|
||||
Karaköy Trattoria'mızda unutulmaz bir akşam yemeği için yerinizi ayırtın.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-2 gap-5">
|
||||
{[
|
||||
{ label: "Ad Soyad", placeholder: "Adınız Soyadınız", type: "text", full: false },
|
||||
{ label: "Telefon", placeholder: "05xx xxx xx xx", type: "tel", full: false },
|
||||
{ label: "Tarih", placeholder: "", type: "date", full: false },
|
||||
{ label: "Saat", placeholder: "", type: "time", full: false },
|
||||
{ label: "Kişi Sayısı", placeholder: "2", type: "number", full: false },
|
||||
{ label: "Özel Notlar", placeholder: "Diyet sınırlandırmaları veya özel kutlamalar...", type: "text", full: true },
|
||||
].map((field, i) => (
|
||||
<div key={i} className={field.full ? "col-span-2" : "col-span-1"}>
|
||||
<label className="block text-[9px] font-sans-clean font-bold text-[#0038A8] mb-1.5 uppercase tracking-widest">{field.label}</label>
|
||||
<input
|
||||
type={field.type}
|
||||
placeholder={field.placeholder}
|
||||
className="w-full px-4 py-3 rounded-xl border border-gray-200 bg-[#FDFBF7] text-sm text-[#121C22] focus:outline-none focus:ring-1 focus:ring-[#0038A8] placeholder-gray-300 transition-all font-sans-clean"
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<motion.button
|
||||
className="mt-8 w-full py-4 rounded-xl text-white font-sans-clean font-black tracking-[2px] uppercase bg-[#0038A8] hover:bg-[#002266] transition-colors cursor-pointer text-xs"
|
||||
whileHover={{ scale: 1.02, boxShadow: "0 10px 30px rgba(0, 56, 168, 0.25)" }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
>
|
||||
Masa Ayırt
|
||||
</motion.button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ── FOOTER ── */}
|
||||
<footer className="bg-[#002266] text-white border-t border-white/5 px-6 pt-20 pb-8 relative z-10">
|
||||
<div className="max-w-6xl mx-auto flex flex-col sm:flex-row justify-between items-center pt-8 gap-4 font-sans-clean text-white/40">
|
||||
<p className="text-xs">© 2026 {firma.adi}. Tüm hakları saklıdır.</p>
|
||||
<p className="text-[10px]">Gizlilik Politikası · Çerez Ayarları</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
{/* ── FAST BOOKING OVERLAY 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-2xl p-8 max-w-md w-full relative shadow-2xl border border-[#0038A8]/20"
|
||||
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 text-gray-500 hover:bg-gray-200 transition-colors"
|
||||
onClick={() => setShowBookingModal(false)}
|
||||
>
|
||||
✕
|
||||
</button>
|
||||
|
||||
<h3 className="font-display font-black text-[#0038A8] text-xl mb-1 uppercase tracking-wider">
|
||||
Hızlı Rezervasyon
|
||||
</h3>
|
||||
<p className="text-gray-400 font-sans-clean text-[10px] mb-6 uppercase tracking-widest font-semibold">
|
||||
Karaköy Trattoria Hattı
|
||||
</p>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
<label className="block text-[9px] font-sans-clean font-bold text-[#0038A8] mb-1 uppercase tracking-wider">Ad Soyad</label>
|
||||
<input type="text" className="w-full px-4 py-3 rounded-xl border border-gray-200 bg-[#FDFBF7] text-sm focus:outline-none focus:ring-1 focus:ring-[#0038A8]" placeholder="Adınız Soyadınız" />
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-[9px] font-sans-clean font-bold text-[#0038A8] mb-1 uppercase tracking-wider">Telefon Numarası</label>
|
||||
<input type="tel" className="w-full px-4 py-3 rounded-xl border border-gray-200 bg-[#FDFBF7] text-sm focus:outline-none focus:ring-1 focus:ring-[#0038A8]" placeholder="05xx xxx xx xx" />
|
||||
</div>
|
||||
<motion.button
|
||||
className="w-full py-4 rounded-xl bg-[#0038A8] text-white font-sans-clean font-black text-xs uppercase tracking-wider mt-4"
|
||||
whileHover={{ scale: 1.02 }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
onClick={() => setShowBookingModal(false)}
|
||||
>
|
||||
Bilgileri Gönder
|
||||
</motion.button>
|
||||
</div>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user