From 591d878ac6d05403e1f080e4393bf176ec4df1eb Mon Sep 17 00:00:00 2001 From: Temmuz Aslan Date: Sun, 15 Feb 2026 22:34:25 +0300 Subject: [PATCH] Initial commit: The Anatolian Edit website Next.js 14 website with standalone output configured for Docker deployment. Co-Authored-By: Claude Opus 4.6 --- .dockerignore | 7 + .eslintrc.json | 3 + .gitignore | 41 + Dockerfile | 36 + README.md | 36 + app/about/page.tsx | 128 + app/blog/[slug]/page.tsx | 129 + app/blog/page.tsx | 79 + app/contact/page.tsx | 110 + app/experiences/after-dark/page.tsx | 76 + app/experiences/first-light/page.tsx | 76 + app/experiences/page.tsx | 65 + app/experiences/the-other-side/page.tsx | 125 + app/faq/page.tsx | 38 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 39 + app/layout.tsx | 78 + app/not-found.tsx | 31 + app/page.tsx | 27 + app/robots.ts | 12 + app/sitemap.ts | 31 + components/experiences/BookingWidget.tsx | 140 + components/experiences/ExperienceCard.tsx | 66 + components/experiences/ExperienceHero.tsx | 73 + components/experiences/Itinerary.tsx | 76 + components/experiences/PhotoGallery.tsx | 119 + components/home/ExperienceGrid.tsx | 219 + components/home/FinalCTA.tsx | 64 + components/home/Hero.tsx | 110 + components/home/HomeFAQ.tsx | 102 + components/home/HowItWorks.tsx | 77 + components/home/InteractiveMap.tsx | 298 + components/home/Manifesto.tsx | 122 + components/home/Testimonials.tsx | 85 + components/home/WhyAsianSide.tsx | 88 + components/layout/Footer.tsx | 132 + components/layout/Header.tsx | 103 + components/layout/MobileNav.tsx | 78 + components/layout/StickyBookingBar.tsx | 45 + components/shared/AnimatedCounter.tsx | 46 + components/shared/Button.tsx | 74 + components/shared/CookieConsent.tsx | 57 + components/shared/NewsletterSignup.tsx | 38 + components/shared/SectionHeader.tsx | 33 + components/shared/WhatsAppButton.tsx | 27 + lib/constants.ts | 387 ++ lib/metadata.ts | 61 + lib/structured-data.ts | 162 + next.config.mjs | 14 + package-lock.json | 5998 +++++++++++++++++++++ package.json | 27 + postcss.config.mjs | 8 + public/images/first_light.jpg | Bin 0 -> 316038 bytes public/images/hero_main.jpg | Bin 0 -> 556704 bytes public/images/istanbul_map.png | Bin 0 -> 9447700 bytes public/images/manifesto_coastline.jpg | Bin 0 -> 508945 bytes public/images/the_other_side.jpg | Bin 0 -> 418708 bytes tailwind.config.ts | 45 + tsconfig.json | 26 + 59 files changed, 10167 insertions(+) create mode 100644 .dockerignore create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 app/about/page.tsx create mode 100644 app/blog/[slug]/page.tsx create mode 100644 app/blog/page.tsx create mode 100644 app/contact/page.tsx create mode 100644 app/experiences/after-dark/page.tsx create mode 100644 app/experiences/first-light/page.tsx create mode 100644 app/experiences/page.tsx create mode 100644 app/experiences/the-other-side/page.tsx create mode 100644 app/faq/page.tsx create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/not-found.tsx create mode 100644 app/page.tsx create mode 100644 app/robots.ts create mode 100644 app/sitemap.ts create mode 100644 components/experiences/BookingWidget.tsx create mode 100644 components/experiences/ExperienceCard.tsx create mode 100644 components/experiences/ExperienceHero.tsx create mode 100644 components/experiences/Itinerary.tsx create mode 100644 components/experiences/PhotoGallery.tsx create mode 100644 components/home/ExperienceGrid.tsx create mode 100644 components/home/FinalCTA.tsx create mode 100644 components/home/Hero.tsx create mode 100644 components/home/HomeFAQ.tsx create mode 100644 components/home/HowItWorks.tsx create mode 100644 components/home/InteractiveMap.tsx create mode 100644 components/home/Manifesto.tsx create mode 100644 components/home/Testimonials.tsx create mode 100644 components/home/WhyAsianSide.tsx create mode 100644 components/layout/Footer.tsx create mode 100644 components/layout/Header.tsx create mode 100644 components/layout/MobileNav.tsx create mode 100644 components/layout/StickyBookingBar.tsx create mode 100644 components/shared/AnimatedCounter.tsx create mode 100644 components/shared/Button.tsx create mode 100644 components/shared/CookieConsent.tsx create mode 100644 components/shared/NewsletterSignup.tsx create mode 100644 components/shared/SectionHeader.tsx create mode 100644 components/shared/WhatsAppButton.tsx create mode 100644 lib/constants.ts create mode 100644 lib/metadata.ts create mode 100644 lib/structured-data.ts create mode 100644 next.config.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/images/first_light.jpg create mode 100644 public/images/hero_main.jpg create mode 100644 public/images/istanbul_map.png create mode 100644 public/images/manifesto_coastline.jpg create mode 100644 public/images/the_other_side.jpg create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..eb25362 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +node_modules +.next +.vercel +.claude +.git +imagesforyou +server.md diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..3722418 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["next/core-web-vitals", "next/typescript"] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7afd19b --- /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.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# project-specific +imagesforyou/ +.claude/ +server.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..053dc42 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +FROM node:18-alpine AS base + +# Stage 1: Install dependencies +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app +COPY package.json package-lock.json* ./ +RUN npm ci + +# Stage 2: Build the application +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build + +# Stage 3: Production runner +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public +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/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..98521f2 --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,128 @@ +import { Metadata } from "next"; +import Image from "next/image"; +import { generatePageMetadata } from "@/lib/metadata"; +import { generateBreadcrumbSchema } from "@/lib/structured-data"; +import { Button } from "@/components/shared/Button"; +import { FinalCTA } from "@/components/home/FinalCTA"; + +export const metadata: Metadata = generatePageMetadata({ + title: "About Us — The Anatolian Edit", + description: + "We're not guides. We're editors. We edit out the noise and show you only the good parts of Istanbul's Asian side.", + path: "/about", +}); + +export default function AboutPage() { + return ( + <> +