From 76af0683fd78d39a44712d4e375925a60f1e7487 Mon Sep 17 00:00:00 2001 From: ayrisdev Date: Tue, 16 Jun 2026 13:02:08 +0300 Subject: [PATCH] first commit --- .dockerignore | 9 + .gitignore | 41 + AGENTS.md | 42 + CLAUDE.md | 1 + Dockerfile | 34 + README.md | 36 + app/[locale]/admin/layout.tsx | 97 + app/[locale]/admin/page.tsx | 47 + app/[locale]/aktiviteler/page.tsx | 24 + app/[locale]/hakkimizda/page.tsx | 33 + app/[locale]/iletisim/page.tsx | 83 + app/[locale]/layout.tsx | 62 + app/[locale]/login/page.tsx | 94 + app/[locale]/page.tsx | 86 + app/[locale]/tekne-turlari/page.tsx | 24 + app/[locale]/turlar/page.tsx | 24 + app/api/auth/[...nextauth]/route.ts | 3 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 134 + components.json | 25 + components/home/HeroSlider.tsx | 96 + components/layout/Footer.tsx | 54 + components/layout/Navbar.tsx | 62 + components/ui/TourCard.tsx | 54 + components/ui/button.tsx | 58 + components/ui/card.tsx | 103 + components/ui/input.tsx | 20 + docs/oludeniz-tour/brief-oludeniz-tour.md | 7 + docs/oludeniz-tour/veri-oludeniz-tour.md | 169 + eslint.config.mjs | 18 + i18n/request.ts | 15 + i18n/routing.ts | 10 + lib/auth.ts | 47 + lib/cloudinary.ts | 20 + lib/data.ts | 55 + lib/db.ts | 9 + lib/utils.ts | 6 + messages/en.json | 14 + messages/tr.json | 14 + next.config.ts | 18 + package-lock.json | 11008 ++++++++++++++++++++ package.json | 40 + postcss.config.mjs | 7 + prisma/schema.prisma | 61 + proxy.ts | 20 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/vercel.svg | 1 + public/window.svg | 1 + tsconfig.json | 34 + 51 files changed, 12923 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app/[locale]/admin/layout.tsx create mode 100644 app/[locale]/admin/page.tsx create mode 100644 app/[locale]/aktiviteler/page.tsx create mode 100644 app/[locale]/hakkimizda/page.tsx create mode 100644 app/[locale]/iletisim/page.tsx create mode 100644 app/[locale]/layout.tsx create mode 100644 app/[locale]/login/page.tsx create mode 100644 app/[locale]/page.tsx create mode 100644 app/[locale]/tekne-turlari/page.tsx create mode 100644 app/[locale]/turlar/page.tsx create mode 100644 app/api/auth/[...nextauth]/route.ts create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 components.json create mode 100644 components/home/HeroSlider.tsx create mode 100644 components/layout/Footer.tsx create mode 100644 components/layout/Navbar.tsx create mode 100644 components/ui/TourCard.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/input.tsx create mode 100644 docs/oludeniz-tour/brief-oludeniz-tour.md create mode 100644 docs/oludeniz-tour/veri-oludeniz-tour.md create mode 100644 eslint.config.mjs create mode 100644 i18n/request.ts create mode 100644 i18n/routing.ts create mode 100644 lib/auth.ts create mode 100644 lib/cloudinary.ts create mode 100644 lib/data.ts create mode 100644 lib/db.ts create mode 100644 lib/utils.ts create mode 100644 messages/en.json create mode 100644 messages/tr.json create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 prisma/schema.prisma create mode 100644 proxy.ts create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 tsconfig.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..430f1b2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.next +node_modules +.env +.env.*.local +.git +.vscode +docs +README.md +AGENTS.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f7f0cbb --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,42 @@ +# AGENTS.md + +## Stack +- Framework: Next.js 16, App Router, TypeScript strict +- Styling: Tailwind CSS v4 +- UI: shadcn/ui (new-york style, OKLCH) +- Animation: Framer Motion +- Icons: Lucide React +- i18n: next-intl +- ORM: Prisma + PostgreSQL +- Auth: NextAuth.js v5 +- Media: Cloudinary +- Deploy: Coolify (Docker, standalone output) + +## Sabit Tercihler +- Mock data: USE_MOCK=true (demo aşaması) +- proxy.ts kullan — middleware.ts deprecated (Next.js 15.3+) +- İletişim formu sadece /iletisim sayfasında — ana sayfada olmaz +- Footer'da "Created by ayris.tech" linki zorunlu +- Dockerfile'da dummy DATABASE_URL (prisma generate için) + +## Altyapı +- Gitea: https://git.ayris.tech (kullanıcı: ayrisdev) +- Coolify: https://client2.ayris.tech +- Cloudflare zone: ayris.tech +- Server IP: 188.245.175.169 + +## docs/ Klasörü +- docs/prd.md → ana içerik kaynağı +- docs/*.html → varsa mevcut site içeriği +- docs/*.md → ek belgeler + +## Aktif Skill'ler +- nextjs-seo → sitemap, metadata, robots.txt +- next-best-practices → kod kalitesi +- nextjs-app-router-patterns → Server Actions, Suspense +- demo-site → komple site üretimi +- design-demo → görsel kalite +- coolify-deploy → deploy pipeline + +## Proje Özel Notlar + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..20dd2ca --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +FROM node:22-alpine AS base + +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app +COPY package.json package-lock.json* ./ +RUN npm ci --legacy-peer-deps + +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +ENV NEXT_TELEMETRY_DISABLED=1 +# Prisma generate için dummy URL — build sırasında gerçek DB gerekmez +ARG DATABASE_URL=postgresql://dummy:dummy@localhost:5432/dummy +ENV DATABASE_URL=$DATABASE_URL +RUN npx prisma generate +RUN npm run build + +FROM base AS runner +WORKDIR /app +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +COPY --from=builder /app/public ./public +RUN mkdir .next && chown nextjs:nodejs .next +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +USER nextjs +EXPOSE 3000 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" +CMD ["node", "server.js"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +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). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +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. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [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. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +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. diff --git a/app/[locale]/admin/layout.tsx b/app/[locale]/admin/layout.tsx new file mode 100644 index 0000000..d16615e --- /dev/null +++ b/app/[locale]/admin/layout.tsx @@ -0,0 +1,97 @@ +'use client' + +import { signOut } from 'next-auth/react' +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { LayoutDashboard, Users, Settings, LogOut, Menu, X } from 'lucide-react' +import { useState } from 'react' + +export default function AdminLayout({ children }: { children: React.ReactNode }) { + const pathname = usePathname() + const [sidebarOpen, setSidebarOpen] = useState(false) + + const navigation = [ + { name: 'Dashboard', href: '/admin', icon: LayoutDashboard }, + { name: 'Kullanıcılar', href: '/admin/users', icon: Users }, + { name: 'Ayarlar', href: '/admin/settings', icon: Settings }, + ] + + return ( +
+ {/* Mobile sidebar backdrop */} + {sidebarOpen && ( +
setSidebarOpen(false)} + /> + )} + + {/* Sidebar */} +
+
+
+

Admin Paneli

+ +
+ + + +
+ +
+
+
+ + {/* Main content */} +
+
+ + Admin Paneli +
+ +
+ {children} +
+
+
+ ) +} diff --git a/app/[locale]/admin/page.tsx b/app/[locale]/admin/page.tsx new file mode 100644 index 0000000..4b16051 --- /dev/null +++ b/app/[locale]/admin/page.tsx @@ -0,0 +1,47 @@ +import { auth } from '@/lib/auth' + +export default async function AdminDashboardPage() { + const session = await auth() + + return ( +
+
+

Dashboard

+

+ Hoş geldiniz, {session?.user?.name || session?.user?.email}. İşte projenizin genel görünümü. +

+
+ +
+ {/* Placeholder Stat Cards */} + {[ + { name: 'Toplam Kullanıcı', stat: '1,245' }, + { name: 'Aktif Oturumlar', stat: '42' }, + { name: 'Yeni Kayıtlar', stat: '8' }, + { name: 'Sistem Durumu', stat: 'Online' }, + ].map((item) => ( +
+
{item.name}
+
+ {item.stat} +
+
+ ))} +
+ +
+
+

Son Aktiviteler

+
+
+ Henüz aktivite kaydı bulunmuyor. +
+
+
+
+
+ ) +} diff --git a/app/[locale]/aktiviteler/page.tsx b/app/[locale]/aktiviteler/page.tsx new file mode 100644 index 0000000..7561276 --- /dev/null +++ b/app/[locale]/aktiviteler/page.tsx @@ -0,0 +1,24 @@ +import { setRequestLocale } from 'next-intl/server'; +import { aktiviteler } from '@/lib/data'; +import { TourCard } from '@/components/ui/TourCard'; + +export default async function ActivitiesPage({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params; + setRequestLocale(locale); + + return ( +
+
+

Aktiviteler

+

+ Tatilinize heyecan katacak, birbirinden eğlenceli aktiviteler. +

+
+ {aktiviteler.map(activity => ( + + ))} +
+
+
+ ); +} diff --git a/app/[locale]/hakkimizda/page.tsx b/app/[locale]/hakkimizda/page.tsx new file mode 100644 index 0000000..9dc73d8 --- /dev/null +++ b/app/[locale]/hakkimizda/page.tsx @@ -0,0 +1,33 @@ +import { setRequestLocale } from 'next-intl/server'; + +export default async function AboutPage({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params; + setRequestLocale(locale); + + return ( +
+
+

Hakkımızda

+
+

+ ÖLÜDENİZ TOUR TRAVELS - Ölüdeniz Tur Rezervasyon +

+

+ Mavi Yolculuk - Günübirlik Turlar - Aktiviteler - Özel Turlar - Araç Kiralama - Villa Kiralama +

+

+ Uzman kadroya sahip olan şirketimiz Deniz Turu, Kara Turu ve Aktiviteler ile Siz değerli misafirlerimize Hizmet Vermektedir. + Firmamız, profesyonel uzman kadrosu ile, konforlu, modern ve üstün kalitede hizmet sunmaktadır. + Firmamızın, değişmeyen prensipleri daima kaliteli hizmet, zamanında ulaşım ve uygun fiyat olmuştur. +

+

+ Kaliteye verdiği önem ve zoru başarma azmi sayesinde kısa sürede Turizm sektöründe tanınmış ve bu ilkelerden asla vazgeçmemiştir. +

+

+ Turizm Sektöründe başarı ve sürekliliğin teminatı hizmette dürüstlük ve kalitedir prensibiyle çalışan Ölüdeniz Tour Travel, gösterdiğiniz yakın ilgi ve desteğinizden ötürü teşekkür ederek sizlere bugün ve gelecekte hizmet vermeye devam edecektir. +

+
+
+
+ ); +} diff --git a/app/[locale]/iletisim/page.tsx b/app/[locale]/iletisim/page.tsx new file mode 100644 index 0000000..a6695eb --- /dev/null +++ b/app/[locale]/iletisim/page.tsx @@ -0,0 +1,83 @@ +import { setRequestLocale } from 'next-intl/server'; +import { siteInfo } from '@/lib/data'; +import { MapPin, Phone, Mail } from 'lucide-react'; + +export default async function ContactPage({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params; + setRequestLocale(locale); + + return ( +
+
+

İletişim

+

+ Rezervasyon ve sorularınız için bize ulaşın. +

+ +
+
+

İletişim Bilgileri

+
+
+
+ +
+
+

Adres

+

{siteInfo.address}

+
+
+ +
+
+ +
+
+

Telefon

+ {siteInfo.phone} +
+
+ +
+
+ +
+
+

E-Posta

+ {siteInfo.email} +
+
+
+ + +
+ +
+

Bize Mesaj Gönderin

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ ); +} diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx new file mode 100644 index 0000000..9a7200b --- /dev/null +++ b/app/[locale]/layout.tsx @@ -0,0 +1,62 @@ +import type { Metadata } from "next"; +import { Outfit, Work_Sans } from "next/font/google"; +import { NextIntlClientProvider } from 'next-intl'; +import { getMessages, setRequestLocale } from 'next-intl/server'; +import { notFound } from 'next/navigation'; +import { routing } from '@/i18n/routing'; +import { Navbar } from '@/components/layout/Navbar'; +import { Footer } from '@/components/layout/Footer'; +import "../globals.css"; + +const outfit = Outfit({ + variable: "--font-heading", + subsets: ["latin"], +}); + +const workSans = Work_Sans({ + variable: "--font-sans", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Ölüdeniz Tour Travels", + description: "Mavi Yolculuk, Günübirlik Turlar ve Aktiviteler", +}; + +export function generateStaticParams() { + return routing.locales.map((locale) => ({locale})); +} + +export default async function RootLayout({ + children, + params +}: Readonly<{ + children: React.ReactNode; + params: Promise<{ locale: string }>; +}>) { + const { locale } = await params; + + if (!routing.locales.includes(locale as any)) { + notFound(); + } + + setRequestLocale(locale); + const messages = await getMessages(); + + return ( + + + + +
+ {children} +
+