From 716bad9d7ce3f874b54a79aaf6a2341071a60778 Mon Sep 17 00:00:00 2001 From: mstfyldz Date: Wed, 3 Jun 2026 16:13:15 +0300 Subject: [PATCH] first commit --- README.md | 61 ++-- app/[lang]/HomeClient.tsx | 468 ++++++++++++++++++++++++++ app/[lang]/galeri/GaleriClient.tsx | 140 ++++++++ app/[lang]/galeri/page.tsx | 18 + app/[lang]/iletisim/page.tsx | 186 ++++++++++ app/[lang]/kurumsal/page.tsx | 58 ++++ app/[lang]/layout.tsx | 48 +++ app/[lang]/menu/page.tsx | 121 +++++++ app/[lang]/page.tsx | 13 + app/[lang]/sss/SSSClient.tsx | 106 ++++++ app/[lang]/sss/page.tsx | 18 + app/components/Footer.tsx | 108 ++++++ app/components/Navbar.tsx | 121 +++++++ app/components/ui/animated-number.tsx | 50 +++ app/components/ui/badge.tsx | 31 ++ app/components/ui/button.tsx | 56 +++ app/components/ui/card.tsx | 66 ++++ app/components/ui/index.ts | 9 + app/components/ui/input.tsx | 68 ++++ app/components/ui/marquee.tsx | 49 +++ app/components/ui/section-header.tsx | 69 ++++ app/components/ui/shimmer-button.tsx | 54 +++ app/components/ui/text-reveal.tsx | 49 +++ app/dictionaries.ts | 16 + app/favicon.ico | Bin 25931 -> 15406 bytes app/globals.css | 174 +++++++++- app/layout.tsx | 33 -- app/page.tsx | 65 ---- dictionaries/en.json | 185 ++++++++++ dictionaries/tr.json | 185 ++++++++++ docs/prd.md | 104 ++++++ lib/utils.ts | 3 + next.config.ts | 9 +- package-lock.json | 53 +++ package.json | 2 + proxy.ts | 37 ++ public/kite-beach-hotel.jpg | Bin 0 -> 504686 bytes public/logo.png | Bin 0 -> 6259 bytes public/moy-beach.jpg | Bin 0 -> 1228933 bytes public/volkswagen-kite.png | Bin 0 -> 836888 bytes 40 files changed, 2698 insertions(+), 135 deletions(-) create mode 100644 app/[lang]/HomeClient.tsx create mode 100644 app/[lang]/galeri/GaleriClient.tsx create mode 100644 app/[lang]/galeri/page.tsx create mode 100644 app/[lang]/iletisim/page.tsx create mode 100644 app/[lang]/kurumsal/page.tsx create mode 100644 app/[lang]/layout.tsx create mode 100644 app/[lang]/menu/page.tsx create mode 100644 app/[lang]/page.tsx create mode 100644 app/[lang]/sss/SSSClient.tsx create mode 100644 app/[lang]/sss/page.tsx create mode 100644 app/components/Footer.tsx create mode 100644 app/components/Navbar.tsx create mode 100644 app/components/ui/animated-number.tsx create mode 100644 app/components/ui/badge.tsx create mode 100644 app/components/ui/button.tsx create mode 100644 app/components/ui/card.tsx create mode 100644 app/components/ui/index.ts create mode 100644 app/components/ui/input.tsx create mode 100644 app/components/ui/marquee.tsx create mode 100644 app/components/ui/section-header.tsx create mode 100644 app/components/ui/shimmer-button.tsx create mode 100644 app/components/ui/text-reveal.tsx create mode 100644 app/dictionaries.ts delete mode 100644 app/layout.tsx delete mode 100644 app/page.tsx create mode 100644 dictionaries/en.json create mode 100644 dictionaries/tr.json create mode 100644 docs/prd.md create mode 100644 lib/utils.ts create mode 100644 proxy.ts create mode 100644 public/kite-beach-hotel.jpg create mode 100644 public/logo.png create mode 100644 public/moy-beach.jpg create mode 100644 public/volkswagen-kite.png diff --git a/README.md b/README.md index e215bc4..0d8c03f 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,49 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# Moy Group -## Getting Started +Modern, şık ve çift dilli (TR/EN) kurumsal web sitesi projesi. Moy Group çatısı altında yer alan Moy Beach, Kite Beach Hotel ve Volkswagen Kite (Surfing) mekanlarının tanıtımı, hizmet detayları, galeri ve iletişim/rezervasyon bilgilerini içerir. -First, run the development server: +## Teknolojiler -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` +- **[Next.js 15+ (App Router)](https://nextjs.org/)**: React tabanlı modern web framework. +- **[Tailwind CSS](https://tailwindcss.com/)**: Özelleştirilmiş tasarım sistemi (`tailwind.config.ts` üzerinden yapılandırılmış Moy Group marka renkleri). +- **[Framer Motion](https://www.framer.com/motion/)**: Akıcı sayfa geçişleri ve mikro animasyonlar. +- **[Lucide Icons](https://lucide.dev/)**: Minimal ve modern ikon seti. +- **i18n (Uluslararasılaştırma)**: Klasör bazlı (`app/[lang]`) özel dil desteği mimarisi. Sözlük (dictionary) yaklaşımı ile Türkçe ve İngilizce tam sayfa desteği. -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +## Proje Yapısı -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +- `app/[lang]/`: Tüm sayfalar, TR ve EN desteği için bu dinamik rota altında yer alır. +- `app/components/`: Yeniden kullanılabilir UI bileşenleri (Navbar, Footer, SectionHeader vb.). +- `dictionaries/`: Dil dosyalarının bulunduğu klasör (`tr.json`, `en.json` ve `index.ts`). +- `public/`: Görseller, videolar ve statik kaynaklar. +- `proxy.ts`: Next.js middleware / proxy yönlendirmeleri (Kullanıcının diline göre otomatik sayfa seçimi). -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. +## Kurulum ve Çalıştırma -## Learn More +Projeyi lokalinizde çalıştırmak için aşağıdaki adımları izleyin: -To learn more about Next.js, take a look at the following resources: +1. **Bağımlılıkları Yükleyin** + ```bash + npm install + # veya + yarn install + # veya + pnpm install + ``` -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +2. **Geliştirme Sunucusunu Başlatın** + ```bash + npm run dev + ``` -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! +3. Tarayıcınızda [http://localhost:3000](http://localhost:3000) adresine gidin. -## Deploy on Vercel +## Marka Renkleri +- **Moy Gold**: `#c9a96e` +- **Moy Dark**: `#1a1f24` +- **Moy Light**: `#f8f9fa` +- **Moy Blue**: `#2a3b4c` +- **Moy Green**: `#2c4c3b` -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +## Geliştirici +created by [ayris.tech](https://ayris.tech) diff --git a/app/[lang]/HomeClient.tsx b/app/[lang]/HomeClient.tsx new file mode 100644 index 0000000..a66d336 --- /dev/null +++ b/app/[lang]/HomeClient.tsx @@ -0,0 +1,468 @@ +"use client"; + +import { useState } from "react"; +import { motion, type Variants } from "framer-motion"; +import Link from "next/link"; +import { Utensils, Umbrella, Home, Wind, Hotel, Star, MapPin, ArrowRight } from "lucide-react"; +import { Button } from "@/app/components/ui/button"; +import { SectionHeader } from "@/app/components/ui/section-header"; +import { Marquee } from "@/app/components/ui/marquee"; +import { AnimatedNumber } from "@/app/components/ui/animated-number"; +import { TextReveal } from "@/app/components/ui/text-reveal"; +import { ShimmerButton } from "@/app/components/ui/shimmer-button"; +import { Badge } from "@/app/components/ui/badge"; + +const HERO_BG = + "https://images.unsplash.com/photo-1499793983690-e29da59ef1c2?auto=format&fit=crop&q=80&w=2070"; + +const MARQUEE_ITEMS = [ + "Akyaka", + "Akçapınar", + "Datça", + "Beach Bar", + "Kite Surf", + "Restaurant", + "Bungalov", + "Hotel", + "Ege Denizi", +]; + +const STATS = [ + { value: 15, suffix: "+", label: "Yıl Deneyim" }, + { value: 3, suffix: "", label: "Lokasyon" }, + { value: 5000, suffix: "+", label: "Mutlu Misafir" }, + { value: 5, suffix: "", label: "Hizmet Kategorisi" }, +]; + +const SERVICES = [ + { + id: "restaurant", + title: "Restaurant", + icon: Utensils, + desc: "Ege'nin taze lezzetleri, yerel malzemeler ve şef imzalı tatlar.", + bg: "https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?auto=format&fit=crop&q=80&w=800", + }, + { + id: "beach", + title: "Beach Bar", + icon: Umbrella, + desc: "Altın kumlar, masmavi deniz ve özenle seçilmiş içecekler.", + bg: "https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&fit=crop&q=80&w=800", + }, + { + id: "bungalow", + title: "Bungalov", + icon: Home, + desc: "Doğa ile iç içe, huzurlu ve modern konaklama deneyimi.", + bg: "https://images.unsplash.com/photo-1449844908441-8829872d2607?auto=format&fit=crop&q=80&w=800", + }, + { + id: "kitesurf", + title: "Kite Surf", + icon: Wind, + desc: "Rüzgarın enerjisini hissedin; başlangıç ve ileri seviye dersler.", + bg: "https://images.unsplash.com/photo-1526685514088-290076a0d426?auto=format&fit=crop&q=80&w=800", + }, + { + id: "hotel", + title: "Hotel", + icon: Hotel, + desc: "Premium konfor ve Ege'nin eşsiz manzarasıyla özel tatil.", + bg: "https://images.unsplash.com/photo-1566073771259-6a8506099945?auto=format&fit=crop&q=80&w=800", + }, +]; + + + +const TESTIMONIALS = [ + { + name: "Ayşe Y.", + origin: "İstanbul", + comment: + "Ege'de şimdiye kadar geçirdiğim en güzel tatildi. Hizmet kalitesi muazzamdı, her detay özenle düşünülmüş.", + rating: 5, + }, + { + name: "John S.", + origin: "London", + comment: + "The kite surfing instructors were incredibly professional. The location is breathtaking — I'll be back next summer.", + rating: 5, + }, + { + name: "Mehmet K.", + origin: "Ankara", + comment: + "Bungalovlar son derece huzurlu. Doğanın içindeyken şehrin konforundan hiç taviz vermiyorsunuz.", + rating: 5, + }, +]; + +const fadeUp: Variants = { + hidden: { opacity: 0, y: 30 }, + visible: (i = 0) => ({ + opacity: 1, + y: 0, + transition: { duration: 0.65, delay: i * 0.12, ease: [0.16, 1, 0.3, 1] as [number, number, number, number] }, + }), +}; + +export default function HomeClient({ lang, dict }: { lang: string; dict: any }) { + const [activeMap, setActiveMap] = useState(0); + + const VENUES: { id: string; title: string; tag: string; desc: string; img: string; color: string }[] = dict.venuesList; + const LOCATIONS_MAP: { place: string; addr: string; embed: string }[] = dict.locationsMap; + + return ( +
+ + {/* ── Hero ── */} +
+
+
+
+ +
+ {/* Eyebrow */} + + {dict.hero.eyebrow} + + + {/* Main heading */} +

+ +

+ + + {dict.hero.subtitle} + + + + + + + + +
+ + {/* Scroll indicator */} + + {dict.hero.scroll} + + +
+ + {/* ── Marquee Strip ── */} +
+ + + + {/* ── Stats ── */} +
+
+
+ {STATS.map((s, i) => ( + +

+ +

+

+ {s.label} +

+
+ ))} +
+
+
+ + {/* ── Services (Geçici olarak gizlendi) ── */} + {/* +
+
+ + +
+ {SERVICES.map((service, i) => ( + +
+
+ +
+ +
+
+ +
+

{service.title}

+

+ {service.desc} +

+
+ + ))} +
+
+
+ */} + + {/* ── Venues ── */} +
+
+ + +
+ {VENUES.map((venue, i) => ( + + {/* Image */} +
+ {venue.title} +
+ + {venue.tag} + +
+ + {/* Text */} +
+

+ {venue.tag} +

+

+ {venue.title} +

+ +

{venue.desc}

+ + {dict.cta.exploreBtn} + + +
+ + ))} +
+
+
+ + {/* ── Testimonials (Geçici olarak gizlendi) ── */} + {/* +
+
+ +
+ + +
+ {TESTIMONIALS.map((t, i) => ( + + + " + + +
+ {[...Array(t.rating)].map((_, j) => ( + + ))} +
+ +

+ "{t.comment}" +

+ +
+
+
+

{t.name}

+

{t.origin}

+
+
+ + ))} +
+
+
+ */} + + {/* ── CTA Banner ── */} +
+
+
+ +
+

+ {dict.cta.eyebrow} +

+

+ {dict.cta.title1}
+ {dict.cta.title2} +

+

+ {dict.cta.subtitle} +

+
+ + + {dict.cta.btn1} + + + + + +
+
+
+ + {/* ── Map / Location ── */} +
+
+
+
+ +

+ {dict.venues.subtitle} +

+
    + {LOCATIONS_MAP.map((loc, idx) => ( +
  • setActiveMap(idx)} + > + +
    + + {loc.place} + + {loc.addr} +
    +
  • + ))} +
+
+ +
+