From f6b4acb760e5e9ab087349b16636d0aba23f0cfb Mon Sep 17 00:00:00 2001 From: mstfyldz Date: Tue, 9 Jun 2026 13:06:58 +0300 Subject: [PATCH] ss --- app/aktiviteler/page.tsx | 170 ++++++++++ app/etkinlikler/page.tsx | 179 +++++++++++ app/galeri/page.tsx | 115 +++++++ app/globals.css | 212 ++++++++++++- app/hakkimizda/page.tsx | 155 +++++++++ app/iletisim/page.tsx | 178 +++++++++++ app/layout.tsx | 28 +- app/odalar/page.tsx | 160 ++++++++++ app/page.tsx | 576 ++++++++++++++++++++++++++++++---- app/restoran/page.tsx | 161 ++++++++++ components/Footer.tsx | 162 ++++++++++ components/HeroVideo.tsx | 38 +++ components/Navbar.tsx | 151 +++++++++ components/ScrollReveal.tsx | 51 +++ components/WhatsAppButton.tsx | 28 ++ docs/prd.md | 272 ++++++++++++++++ next.config.ts | 17 +- package-lock.json | 53 ++++ package.json | 2 + 19 files changed, 2633 insertions(+), 75 deletions(-) create mode 100644 app/aktiviteler/page.tsx create mode 100644 app/etkinlikler/page.tsx create mode 100644 app/galeri/page.tsx create mode 100644 app/hakkimizda/page.tsx create mode 100644 app/iletisim/page.tsx create mode 100644 app/odalar/page.tsx create mode 100644 app/restoran/page.tsx create mode 100644 components/Footer.tsx create mode 100644 components/HeroVideo.tsx create mode 100644 components/Navbar.tsx create mode 100644 components/ScrollReveal.tsx create mode 100644 components/WhatsAppButton.tsx create mode 100644 docs/prd.md diff --git a/app/aktiviteler/page.tsx b/app/aktiviteler/page.tsx new file mode 100644 index 0000000..118ea40 --- /dev/null +++ b/app/aktiviteler/page.tsx @@ -0,0 +1,170 @@ +import Image from "next/image"; +import Link from "next/link"; +import { ArrowRight, Clock, Users } from "lucide-react"; +import ScrollReveal from "@/components/ScrollReveal"; + +const activities = [ + { + img: "https://images.unsplash.com/photo-1533000756353-909d73d2a3c7?q=80&w=2940&auto=format&fit=crop", + tag: "IKO Sertifikalı", + tagColor: "bg-accent text-white", + name: "Kitesurf Okulu", + desc: "Akyaka'nın meşhur termal rüzgarında kitesurf yapmayı öğrenin. IKO sertifikalı eğitmenlerimizle başlangıç, orta ve ileri seviye ders seçenekleri sunuyoruz.", + duration: "2–4 Saat", + capacity: "1–3 Kişi", + price: "₺2.000", + unit: "Saat", + levels: ["Başlangıç", "Orta", "İleri"], + }, + { + img: "https://images.unsplash.com/photo-1599901860904-17e08627c271?q=80&w=2940&auto=format&fit=crop", + tag: "Açık Hava", + tagColor: "bg-primary text-white", + name: "Yoga Seansları", + desc: "Nehir kıyısındaki özel ahşap platformumuzda güne yoga ile başlayın. Hafıza seansları, sunset yoga ve özel birebir dersler mevcuttur.", + duration: "60–90 Dak", + capacity: "Grup / Özel", + price: "₺400", + unit: "Kişi", + levels: ["Tüm Seviyeler"], + }, + { + img: "https://images.unsplash.com/photo-1544606771-46abcf9dbb83?q=80&w=2924&auto=format&fit=crop", + tag: "Ekipman Dahil", + tagColor: "bg-dark text-white", + name: "Stand-Up Paddle (SUP)", + desc: "Azmak nehrinin berrak ve sakin sularında kürek çekerek doğanın gizli güzelliklerini keşfedin. Ekipman kiralama ve rehberli tur seçenekleri mevcuttur.", + duration: "1–3 Saat", + capacity: "Bireysel", + price: "₺300", + unit: "Saat", + levels: ["Kolay"], + }, + { + img: "https://images.unsplash.com/photo-1511994298241-608e28f14fde?q=80&w=2940&auto=format&fit=crop", + tag: "Günlük Tur", + tagColor: "bg-primary text-white", + name: "Bisiklet Kiralama", + desc: "Akyaka'nın çam ormanları arasındaki yollarını ve mimarisiyle ünlü sokaklarını bisikletle gezin. Günlük ve saatlik kiralama seçenekleri ile rotaları keşfedin.", + duration: "Tam Gün", + capacity: "Bireysel / Grup", + price: "₺250", + unit: "Gün", + levels: ["Kolay"], + }, +]; + +export default function AktivitelerPage() { + return ( +
+ + {/* Page Header */} +
+
+ Aktiviteler +
+
+
+ + Deneyimler + +

+ Aktiviteler +

+

+ Rüzgarı hisset, doğayla bir ol. +

+
+
+ + {/* Activities */} +
+
+ {activities.map((act, i) => ( + +
+
+ {act.name} + + {act.tag} + +
+ +
+

{act.name}

+

{act.desc}

+ + {/* Meta */} +
+
+ + {act.duration} +
+
+ + {act.capacity} +
+
+ + {/* Levels */} +
+ {act.levels.map((level) => ( + + {level} + + ))} +
+ +
+
+ {act.price} + / {act.unit} +
+ + Bilgi Al + + +
+
+
+
+ ))} +
+
+ + {/* CTA */} +
+
+

+ Özel Paket Teklifi Al +

+

+ Kitesurf + konaklama veya yoga + SUP gibi özel aktivite paketleri için bizimle iletişime geçin. +

+ + İletişime Geç + +
+
+
+ ); +} diff --git a/app/etkinlikler/page.tsx b/app/etkinlikler/page.tsx new file mode 100644 index 0000000..c49862c --- /dev/null +++ b/app/etkinlikler/page.tsx @@ -0,0 +1,179 @@ +import Image from "next/image"; +import Link from "next/link"; +import { ArrowRight, Calendar, Clock, MapPin, Music } from "lucide-react"; +import ScrollReveal from "@/components/ScrollReveal"; + +const events = [ + { + id: "mahmut-orhan", + title: "Mahmut Orhan - Sunset Session", + date: "15 Ağustos 2026", + time: "18:00 - 23:30", + location: "Kite Beach Akyaka, Beach Club", + category: "Elektronik Müzik / DJ Performans", + price: "Biletler Yakında", + image: "https://images.unsplash.com/photo-1540039155732-680c74f07599?q=80&w=2832&auto=format&fit=crop", + description: "Dünyaca ünlü DJ Mahmut Orhan, unutulmaz bir gün batımı performansı için Kite Beach Akyaka'da! Ege'nin muhteşem manzarasına karşı elektronik müziğin ritmini hissedeceğiniz bu özel geceyi kaçırmayın. Bilet detayları çok yakında açıklanacaktır.", + featured: true, + }, + { + id: "kite-festival", + title: "Akyaka Kitesurf Festivali '26", + date: "20-22 Eylül 2026", + time: "Tüm Gün", + location: "Kite Beach Sahili", + category: "Spor & Festival", + price: "Ücretsiz Katılım", + image: "https://images.unsplash.com/photo-1533000756353-909d73d2a3c7?q=80&w=2940&auto=format&fit=crop", + description: "Geleneksel Kitesurf festivalimiz bu yıl daha da büyük! Profesyonel yarışçılar, amatör denemeler, gün boyu müzik ve sahil etkinlikleri ile rüzgarın tadını çıkarın.", + featured: false, + }, + { + id: "yoga-retreat", + title: "Dolunay Yoga & Meditasyon", + date: "28 Ekim 2026", + time: "19:00 - 21:00", + location: "Nehir Platformu", + category: "Wellness", + price: "₺450", + image: "https://images.unsplash.com/photo-1599901860904-17e08627c271?q=80&w=2940&auto=format&fit=crop", + description: "Dolunayın büyüleyici enerjisinde, Azmak Nehri'nin sessizliğinde özel bir yoga ve ses banyosu meditasyonu. Tüm seviyeler için uygundur. Matlar tarafımızdan temin edilir.", + featured: false, + } +]; + +export const metadata = { + title: "Etkinlikler | Kite Beach Akyaka", + description: "Mahmut Orhan konserinden Kitesurf festivallerine, Akyaka'daki en özel etkinlikler ve gün batımı partileri.", +}; + +export default function EventsPage() { + return ( +
+ + {/* ────────────────────────────────────────── + HERO + ────────────────────────────────────────── */} +
+
+ Kite Beach Akyaka Etkinlikler +
+
+ +
+ + + Kite Beach Akyaka + +

+ Etkinlikler +

+

+ Müzik, spor ve doğanın iç içe geçtiği unutulmaz deneyimler. +

+
+
+
+ + {/* ────────────────────────────────────────── + EVENTS LIST + ────────────────────────────────────────── */} +
+
+ +
+ {events.map((event, index) => ( + +
+ + {/* Image Container */} +
+ {event.title} + {event.featured && ( +
+ + Öne Çıkan +
+ )} +
+ + {/* Content Container */} +
+ + {event.category} + +

+ {event.title} +

+ +
+
+ + {event.date} +
+
+ + {event.time} +
+
+ + {event.location} +
+
+ +

+ {event.description} +

+ +
+ {event.price} + + Bilet / Bilgi + +
+
+ +
+
+ ))} +
+ +
+
+ + {/* CTA BAND */} +
+ + Organizasyon +

Kendi Etkinliğinizi Planlayın

+

+ Özel partiler, düğünler veya kurumsal etkinlikler için Kite Beach Akyaka'nın eşsiz atmosferini kiralayabilirsiniz. Detaylar için bizimle iletişime geçin. +

+ + Bize Ulaşın + +
+
+ +
+ ); +} diff --git a/app/galeri/page.tsx b/app/galeri/page.tsx new file mode 100644 index 0000000..001e0f8 --- /dev/null +++ b/app/galeri/page.tsx @@ -0,0 +1,115 @@ +"use client"; + +import Image from "next/image"; +import { useState } from "react"; + +const filters = ["Tümü", "Odalar", "Aktiviteler", "Restoran", "Doğa"] as const; +type Filter = (typeof filters)[number]; + +const gallery: { src: string; alt: string; category: Exclude }[] = [ + { src: "https://images.unsplash.com/photo-1582719478250-c89404bb8a0e?q=80&w=2940&auto=format&fit=crop", alt: "Standart Oda", category: "Odalar" }, + { src: "https://images.unsplash.com/photo-1533000756353-909d73d2a3c7?q=80&w=2940&auto=format&fit=crop", alt: "Kitesurf", category: "Aktiviteler" }, + { src: "https://images.unsplash.com/photo-1544551763-46a013bb70d5?q=80&w=2940&auto=format&fit=crop", alt: "Nehir Doğa", category: "Doğa" }, + { src: "https://images.unsplash.com/photo-1566665797739-1674de7a421a?q=80&w=2874&auto=format&fit=crop", alt: "Nehir Manzaralı Oda",category: "Odalar" }, + { src: "https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?q=80&w=2940&auto=format&fit=crop", alt: "Restoran", category: "Restoran" }, + { src: "https://images.unsplash.com/photo-1599901860904-17e08627c271?q=80&w=2940&auto=format&fit=crop", alt: "Yoga", category: "Aktiviteler" }, + { src: "https://images.unsplash.com/photo-1499955085172-a104c9463ece?q=80&w=2940&auto=format&fit=crop", alt: "Bungalow", category: "Odalar" }, + { src: "https://images.unsplash.com/photo-1544606771-46abcf9dbb83?q=80&w=2924&auto=format&fit=crop", alt: "SUP", category: "Aktiviteler" }, + { src: "https://images.unsplash.com/photo-1551504734-5ee1c4a1479b?q=80&w=2940&auto=format&fit=crop", alt: "Kahvaltı", category: "Restoran" }, + { src: "https://images.unsplash.com/photo-1511994298241-608e28f14fde?q=80&w=2940&auto=format&fit=crop", alt: "Bisiklet", category: "Aktiviteler" }, + { src: "https://images.unsplash.com/photo-1544148103-0773bf10d330?q=80&w=2940&auto=format&fit=crop", alt: "Restoran Ambiyans", category: "Restoran" }, + { src: "https://images.unsplash.com/photo-1498623116890-37e912163d5d?q=80&w=2940&auto=format&fit=crop", alt: "Gün Batımı", category: "Doğa" }, +]; + +export default function GaleriPage() { + const [active, setActive] = useState("Tümü"); + const [lightbox, setLightbox] = useState(null); + + const filtered = + active === "Tümü" ? gallery : gallery.filter((g) => g.category === active); + + return ( +
+
+ + {/* Heading */} +
+ + Fotoğraflar + +

Galeri

+

+ Kite Beach Akyaka'nın eşsiz doğasını, modern odalarını ve heyecan verici aktivitelerini keşfedin. +

+
+ + {/* Filter tabs */} +
+ {filters.map((f) => ( + + ))} +
+ + {/* Grid */} +
+ {filtered.map((img, idx) => ( +
setLightbox(img.src)} + style={{ animation: `scale-in 0.4s cubic-bezier(0.16,1,0.3,1) ${idx * 40}ms both` }} + > +
+ {img.alt} +
+ + {img.alt} + +
+
+
+ ))} +
+ +
+ + {/* Lightbox */} + {lightbox && ( +
setLightbox(null)} + > +
+ Galeri +
+ +
+ )} +
+ ); +} diff --git a/app/globals.css b/app/globals.css index a2dc41e..739daea 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,26 +1,218 @@ @import "tailwindcss"; :root { - --background: #ffffff; - --foreground: #171717; + --background: #F5EDD6; + --foreground: #1C1C1C; + --primary: #1A6B8A; + --accent: #E87040; + --card: #FFFFFF; + --dark: #0E1A24; + --sand: #FBF6EC; + --muted: #9A9490; } @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); + --color-primary: var(--primary); + --color-accent: var(--accent); + --color-card: var(--card); + --color-dark: var(--dark); + --color-sand: var(--sand); + --color-muted: var(--muted); + + --font-sans: var(--font-inter); + --font-serif: var(--font-playfair); } -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } +*, *::before, *::after { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } body { background: var(--background); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + font-family: var(--font-sans), sans-serif; +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-serif), serif; +} + +/* ===================== + KEYFRAME ANIMATIONS + ===================== */ + +@keyframes shimmer-pass { + 0% { left: -100%; } + 100% { left: 200%; } +} + +@keyframes float-y { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-10px); } +} + +@keyframes gradient-pan { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +@keyframes scroll-bounce { + 0%, 100% { transform: translateY(0); opacity: 0.9; } + 55% { transform: translateY(8px); opacity: 0.3; } +} + +@keyframes fade-up { + from { opacity: 0; transform: translateY(28px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes scale-in { + from { opacity: 0; transform: scale(0.94); } + to { opacity: 1; transform: scale(1); } +} + +@keyframes line-grow { + from { transform: scaleX(0); } + to { transform: scaleX(1); } +} + +/* ===================== + ANIMATION UTILITIES + ===================== */ + +.animate-fade-up { + animation: fade-up 0.9s cubic-bezier(0.16, 1, 0.3, 1) both; +} + +.animate-fade-in { + animation: fade-in 1s ease both; +} + +.animate-scale-in { + animation: scale-in 0.8s cubic-bezier(0.16, 1, 0.3, 1) both; +} + +.animate-float { + animation: float-y 5s ease-in-out infinite; +} + +.animate-gradient-pan { + background-size: 400% 400%; + animation: gradient-pan 10s ease infinite; +} + +.animate-scroll-bounce { + animation: scroll-bounce 2s ease-in-out infinite; +} + +.delay-100 { animation-delay: 0.1s; } +.delay-200 { animation-delay: 0.2s; } +.delay-300 { animation-delay: 0.3s; } +.delay-400 { animation-delay: 0.4s; } +.delay-500 { animation-delay: 0.5s; } +.delay-600 { animation-delay: 0.6s; } +.delay-700 { animation-delay: 0.7s; } +.delay-800 { animation-delay: 0.8s; } + +/* ===================== + SCROLL REVEAL + ===================== */ + +.reveal { + opacity: 0; + transform: translateY(32px); + transition: + opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), + transform 0.8s cubic-bezier(0.16, 1, 0.3, 1); +} + +.reveal.visible { + opacity: 1; + transform: translateY(0); +} + +.reveal-stagger > * { + opacity: 0; + transform: translateY(24px); + transition: + opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), + transform 0.7s cubic-bezier(0.16, 1, 0.3, 1); +} + +.reveal-stagger.visible > *:nth-child(1) { opacity:1; transform:translateY(0); transition-delay:0s; } +.reveal-stagger.visible > *:nth-child(2) { opacity:1; transform:translateY(0); transition-delay:0.1s; } +.reveal-stagger.visible > *:nth-child(3) { opacity:1; transform:translateY(0); transition-delay:0.2s; } +.reveal-stagger.visible > *:nth-child(4) { opacity:1; transform:translateY(0); transition-delay:0.3s; } +.reveal-stagger.visible > *:nth-child(5) { opacity:1; transform:translateY(0); transition-delay:0.4s; } + +/* ===================== + SHIMMER BUTTON + ===================== */ + +.btn-shimmer { + position: relative; + overflow: hidden; +} + +.btn-shimmer::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 55%; + height: 100%; + background: linear-gradient( + 90deg, + transparent, + rgba(255, 255, 255, 0.28), + transparent + ); + transform: skewX(-15deg); + animation: shimmer-pass 3.5s ease-in-out infinite; +} + +/* ===================== + CARD LIFT HOVER + ===================== */ + +.card-lift { + transition: + transform 0.4s cubic-bezier(0.16, 1, 0.3, 1), + box-shadow 0.4s cubic-bezier(0.16, 1, 0.3, 1); +} + +.card-lift:hover { + transform: translateY(-6px); + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.1); +} + +/* ===================== + GRADIENT TEXT + ===================== */ + +.gradient-text { + background: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +/* ===================== + SECTION DIVIDER + ===================== */ + +.section-line { + width: 48px; + height: 3px; + background: var(--accent); + border-radius: 999px; } diff --git a/app/hakkimizda/page.tsx b/app/hakkimizda/page.tsx new file mode 100644 index 0000000..4a9d3a4 --- /dev/null +++ b/app/hakkimizda/page.tsx @@ -0,0 +1,155 @@ +import Image from "next/image"; +import { Leaf, ChefHat, Award } from "lucide-react"; +import ScrollReveal from "@/components/ScrollReveal"; + +const values = [ + { + icon: Leaf, + title: "Doğaya Saygı", + desc: "Tesisimizdeki tüm süreçlerde sıfır atık ve sürdürülebilirlik ilkelerini benimsiyoruz. Geleceğe duyarlı bir konaklama deneyimi sunuyoruz.", + }, + { + icon: ChefHat, + title: "Lokal Mutfak", + desc: "Malzemelerimizin büyük bir bölümünü yerel üreticilerden ve Ege köylerinden temin ediyoruz. Taze, mevsimsel ve sürdürülebilir.", + }, + { + icon: Award, + title: "Premium Deneyim", + desc: "IKO sertifikalı kitesurf okulumuzdandan odalarımıza kadar her noktada en yüksek kalite standartlarını sunuyoruz.", + }, +]; + +const stats = [ + { value: "10+", label: "Yıllık Deneyim" }, + { value: "500+", label: "Mutlu Misafir" }, + { value: "3", label: "IKO Sertifikalı Eğitmen" }, + { value: "4", label: "Benzersiz Aktivite" }, +]; + +export default function HakkimizdaPage() { + return ( +
+ + {/* Page Header */} +
+
+ Hakkımızda +
+
+
+ + Biz Kimiz + +

+ Hikayemiz +

+

+ Rüzgarın, denizin ve nehrin kesiştiği yerde. +

+
+
+ + {/* Story */} +
+
+
+ + + Akyaka'nın Kalbinde + +

+ Bir Tutku
Yolculuğu +

+
+

+ Kite Beach Akyaka, Gökova Körfezi'nin kristal sularına dökülen Azmak Nehri'nin + hemen kıyısında doğdu. Amacımız, misafirlerimize sıradan bir konaklamadan çok + daha fazlasını sunmak; rüzgar sörfü tutkusunu doğayla, konforla ve iyi yemekle + bütünleştiren eşsiz bir yaşam alanı yaratmaktı. +

+

+ Doğaya saygılı mimarimiz, lokal üreticileri destekleyen mutfağımız ve IKO + standartlarındaki eğitim merkezimizle, Akyaka'nın sürdürülebilir turizm yüzü + olmayı hedefliyoruz. +

+
+
+ + +
+ Kitesurf +
+
+
+
+
+ + {/* Stats */} +
+
+ + {stats.map((s, i) => ( +
+ {s.value} + {s.label} +
+ ))} +
+
+
+ + {/* Values */} +
+
+ + + Ne İnanıyoruz + +

Değerlerimiz

+
+ + + {values.map((v, i) => { + const Icon = v.icon; + return ( +
+
+ +
+

{v.title}

+

{v.desc}

+
+ ); + })} +
+
+
+ + {/* Vision */} +
+
+ + + Vizyonumuz + +
+ "Akyaka'nın sürdürülebilir turizm yüzü olmak ve her misafirimize benzersiz bir kaçış sunmak." +
+
+ +
+
+
+ ); +} diff --git a/app/iletisim/page.tsx b/app/iletisim/page.tsx new file mode 100644 index 0000000..ffb1cef --- /dev/null +++ b/app/iletisim/page.tsx @@ -0,0 +1,178 @@ +import { MapPin, Phone, Mail, Clock } from "lucide-react"; +import ScrollReveal from "@/components/ScrollReveal"; + +export default function IletisimPage() { + return ( +
+
+ + {/* Heading */} +
+ + Bize Ulaşın + +

+ İletişim & Rezervasyon +

+

+ Sorularınız veya rezervasyon talepleriniz için bizimle iletişime geçin. + Ekibimiz en kısa sürede dönüş yapacaktır. +

+
+ +
+ + {/* Form — takes 3 cols */} + +
+

Mesaj Gönderin

+
+
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+ +
+ +