From 8b1bdfd3c629cf340d69c5599837b5d4987a3a04 Mon Sep 17 00:00:00 2001 From: ayrisdev Date: Tue, 14 Apr 2026 12:34:19 +0300 Subject: [PATCH] Initial commit: Salmakis Yachting Portal with Cloudinary & i18n --- Dockerfile | 55 ++ app/[locale]/contact/page.tsx | 101 ++ app/[locale]/fleet/[slug]/page.tsx | 481 ++++++++++ app/[locale]/fleet/page.tsx | 76 ++ app/[locale]/layout.tsx | 55 ++ app/[locale]/page.tsx | 141 +++ app/components/Destinations.tsx | 41 + app/components/FleetPreview.tsx | 66 ++ app/components/Footer.tsx | 119 +++ app/components/Hero.tsx | 38 + app/components/Navbar.tsx | 218 +++++ app/components/ValueProp.tsx | 31 + app/components/YachtCard.tsx | 93 ++ app/data/yachts.ts | 323 +++++++ app/globals.css | 153 ++- app/layout.tsx | 33 - app/page.tsx | 65 -- docs/dolcemare.md | 41 + docs/meira.md | 52 ++ docs/melda.md | 68 ++ docs/prd.md | 64 ++ docs/queensalmakis.md | 54 ++ docs/sunworld.md | 30 + i18n/request.ts | 17 + i18n/routing.ts | 15 + messages/en.json | 89 ++ messages/tr.json | 89 ++ middleware.ts | 9 + next.config.ts | 19 +- package-lock.json | 882 +++++++++++++++++- package.json | 5 + public/2.jpg | Bin 0 -> 1191805 bytes public/hero-yacht.png | Bin 0 -> 1033232 bytes .../dolcemare/Dolce-Mare-12-1024x680.jpg | Bin 0 -> 113590 bytes .../dolcemare/Dolce-Mare-33-1024x680.jpg | Bin 0 -> 105915 bytes .../dolcemare/Dolce-Mare-41-1024x680.jpg | Bin 0 -> 109857 bytes .../dolcemare/Dolce-Mare-47-1024x680.jpg | Bin 0 -> 102126 bytes .../dolcemare/Dolce-Mare-57-1024x680 (1).jpg | Bin 0 -> 115004 bytes .../dolcemare/Dolce-Mare-57-1024x680.jpg | Bin 0 -> 115004 bytes .../dolcemare/Dolce-Mare-63-1024x680.jpg | Bin 0 -> 102256 bytes .../dolcemare/Dolce-Mare-66-1024x680 (1).jpg | Bin 0 -> 92458 bytes .../dolcemare/Dolce-Mare-66-1024x680.jpg | Bin 0 -> 92458 bytes .../dolcemare/Dolce-Mare-80-1024x680.jpg | Bin 0 -> 86286 bytes .../dolcemare/Dolce-Mare-90-2000x1328.jpg | Bin 0 -> 254532 bytes .../images/meira/GUEST-CABIN-3-1-1024x680.jpg | Bin 0 -> 110619 bytes .../images/meira/MASTER-CABIN-4-1024x680.jpg | Bin 0 -> 121230 bytes public/images/meira/MEIRA-2000x1333.jpg | Bin 0 -> 307564 bytes .../images/meira/MS-MEIRA-53-1-1024x683.jpg | Bin 0 -> 117316 bytes public/images/meira/MS-MEIRA-58-1024x683.jpg | Bin 0 -> 110039 bytes public/images/meira/PSU3709-1024x683.jpg | Bin 0 -> 105908 bytes public/images/meira/PSU3739-1-1024x683.jpg | Bin 0 -> 134368 bytes public/images/meira/PSU3741-1024x683.jpg | Bin 0 -> 147371 bytes public/images/meira/PSU3748-1024x683.jpg | Bin 0 -> 125687 bytes public/images/meira/PSU3965-1024x683.jpg | Bin 0 -> 118743 bytes public/images/meira/PSU4215-1024x683.jpg | Bin 0 -> 142508 bytes public/images/meira/PSU4475-1024x683.jpg | Bin 0 -> 112293 bytes public/images/meira/PSU4519-1024x683.jpg | Bin 0 -> 58166 bytes public/images/meira/PSU4814-1024x683.jpg | Bin 0 -> 163996 bytes public/images/meira/VIP-CABIN-1-1024x680.jpg | Bin 0 -> 96429 bytes public/images/melda/balkon4-768x432.jpg | Bin 0 -> 44246 bytes public/images/melda/master3-768x432.jpg | Bin 0 -> 37456 bytes public/images/melda/master4-768x432.jpg | Bin 0 -> 42916 bytes public/images/melda/mastertuvalet-768x432.jpg | Bin 0 -> 39167 bytes .../melda/mastertuvalet.jpg2_-768x432.jpg | Bin 0 -> 37476 bytes public/images/melda/masteryeni2-768x432.jpg | Bin 0 -> 47039 bytes public/images/melda/twin1-768x432.jpg | Bin 0 -> 36349 bytes public/images/melda/yuzen-yat-2000x1125.jpg | Bin 0 -> 433471 bytes .../Onaylanmayan 417802.crdownload | Bin 0 -> 589812 bytes .../queenofsalmakis/QOS-AFTDECK-1 (1).jpg | Bin 0 -> 751485 bytes .../images/queenofsalmakis/QOS-AFTDECK-1.jpg | Bin 0 -> 751485 bytes .../queenofsalmakis/QOS-AFTDECK-4 (1).jpg | Bin 0 -> 540152 bytes .../images/queenofsalmakis/QOS-AFTDECK-4.jpg | Bin 0 -> 540152 bytes .../images/queenofsalmakis/QOS-FOREDECK-6.jpg | Bin 0 -> 514467 bytes .../QOS-cabin-BOW-MASTER-7.jpg | Bin 0 -> 1274832 bytes .../QOS-guverte-FOREDECK-2-scaled.jpg | Bin 0 -> 640017 bytes .../QOS-guverte-FOREDECK-4-scaled.jpg | Bin 0 -> 650883 bytes .../QOS-yelkenli-beyaz-7-2000x1333.jpg | Bin 0 -> 397910 bytes .../queenofsalmakis/kic-master-lumboz-1.jpg | Bin 0 -> 401150 bytes .../784ff3f3e0fa5982c77288ecf6612842 (1).jpg | Bin 0 -> 461279 bytes .../784ff3f3e0fa5982c77288ecf6612842.jpg | Bin 0 -> 461279 bytes .../images/sunworld/Aft-Double-Bed-Cabin.jpg | Bin 0 -> 105131 bytes public/images/sunworld/Double-Bed-Cabin-1.jpg | Bin 0 -> 100619 bytes public/images/sunworld/Double-Bed-Cabin.jpg | Bin 0 -> 102003 bytes public/images/sunworld/Sailing-Boat.jpg | Bin 0 -> 95485 bytes public/images/sunworld/Saloon.jpg | Bin 0 -> 130991 bytes public/images/sunworld/Sitting-Area.jpg | Bin 0 -> 133372 bytes public/images/sunworld/Sunbeds-on-Deck.jpg | Bin 0 -> 126216 bytes public/images/sunworld/Toilet-1.jpg | Bin 0 -> 99403 bytes public/images/sunworld/Triple-Bed-Cabin.jpg | Bin 0 -> 103834 bytes public/images/sunworld/Twin-Bed-Cabin.jpg | Bin 0 -> 94867 bytes .../bodrum-sunworld-8-kiralik-gulet-5 (1).jpg | Bin 0 -> 154901 bytes .../bodrum-sunworld-8-kiralik-gulet-5.jpg | Bin 0 -> 154901 bytes scratch/bulk_upload.js | 59 ++ scratch/scan_cloudinary.js | 38 + scratch/upload_report.json | 248 +++++ stitch.zip | Bin 0 -> 391815 bytes stitch/DESIGN.md | 72 ++ stitch/code.html | 293 ++++++ stitch/screen.png | Bin 0 -> 385058 bytes 99 files changed, 4118 insertions(+), 115 deletions(-) create mode 100644 Dockerfile create mode 100644 app/[locale]/contact/page.tsx create mode 100644 app/[locale]/fleet/[slug]/page.tsx create mode 100644 app/[locale]/fleet/page.tsx create mode 100644 app/[locale]/layout.tsx create mode 100644 app/[locale]/page.tsx create mode 100644 app/components/Destinations.tsx create mode 100644 app/components/FleetPreview.tsx create mode 100644 app/components/Footer.tsx create mode 100644 app/components/Hero.tsx create mode 100644 app/components/Navbar.tsx create mode 100644 app/components/ValueProp.tsx create mode 100644 app/components/YachtCard.tsx create mode 100644 app/data/yachts.ts delete mode 100644 app/layout.tsx delete mode 100644 app/page.tsx create mode 100644 docs/dolcemare.md create mode 100644 docs/meira.md create mode 100644 docs/melda.md create mode 100644 docs/prd.md create mode 100644 docs/queensalmakis.md create mode 100644 docs/sunworld.md create mode 100644 i18n/request.ts create mode 100644 i18n/routing.ts create mode 100644 messages/en.json create mode 100644 messages/tr.json create mode 100644 middleware.ts create mode 100644 public/2.jpg create mode 100644 public/hero-yacht.png create mode 100644 public/images/dolcemare/Dolce-Mare-12-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-33-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-41-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-47-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-57-1024x680 (1).jpg create mode 100644 public/images/dolcemare/Dolce-Mare-57-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-63-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-66-1024x680 (1).jpg create mode 100644 public/images/dolcemare/Dolce-Mare-66-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-80-1024x680.jpg create mode 100644 public/images/dolcemare/Dolce-Mare-90-2000x1328.jpg create mode 100644 public/images/meira/GUEST-CABIN-3-1-1024x680.jpg create mode 100644 public/images/meira/MASTER-CABIN-4-1024x680.jpg create mode 100644 public/images/meira/MEIRA-2000x1333.jpg create mode 100644 public/images/meira/MS-MEIRA-53-1-1024x683.jpg create mode 100644 public/images/meira/MS-MEIRA-58-1024x683.jpg create mode 100644 public/images/meira/PSU3709-1024x683.jpg create mode 100644 public/images/meira/PSU3739-1-1024x683.jpg create mode 100644 public/images/meira/PSU3741-1024x683.jpg create mode 100644 public/images/meira/PSU3748-1024x683.jpg create mode 100644 public/images/meira/PSU3965-1024x683.jpg create mode 100644 public/images/meira/PSU4215-1024x683.jpg create mode 100644 public/images/meira/PSU4475-1024x683.jpg create mode 100644 public/images/meira/PSU4519-1024x683.jpg create mode 100644 public/images/meira/PSU4814-1024x683.jpg create mode 100644 public/images/meira/VIP-CABIN-1-1024x680.jpg create mode 100644 public/images/melda/balkon4-768x432.jpg create mode 100644 public/images/melda/master3-768x432.jpg create mode 100644 public/images/melda/master4-768x432.jpg create mode 100644 public/images/melda/mastertuvalet-768x432.jpg create mode 100644 public/images/melda/mastertuvalet.jpg2_-768x432.jpg create mode 100644 public/images/melda/masteryeni2-768x432.jpg create mode 100644 public/images/melda/twin1-768x432.jpg create mode 100644 public/images/melda/yuzen-yat-2000x1125.jpg create mode 100644 public/images/queenofsalmakis/Onaylanmayan 417802.crdownload create mode 100644 public/images/queenofsalmakis/QOS-AFTDECK-1 (1).jpg create mode 100644 public/images/queenofsalmakis/QOS-AFTDECK-1.jpg create mode 100644 public/images/queenofsalmakis/QOS-AFTDECK-4 (1).jpg create mode 100644 public/images/queenofsalmakis/QOS-AFTDECK-4.jpg create mode 100644 public/images/queenofsalmakis/QOS-FOREDECK-6.jpg create mode 100644 public/images/queenofsalmakis/QOS-cabin-BOW-MASTER-7.jpg create mode 100644 public/images/queenofsalmakis/QOS-guverte-FOREDECK-2-scaled.jpg create mode 100644 public/images/queenofsalmakis/QOS-guverte-FOREDECK-4-scaled.jpg create mode 100644 public/images/queenofsalmakis/QOS-yelkenli-beyaz-7-2000x1333.jpg create mode 100644 public/images/queenofsalmakis/kic-master-lumboz-1.jpg create mode 100644 public/images/sunworld/784ff3f3e0fa5982c77288ecf6612842 (1).jpg create mode 100644 public/images/sunworld/784ff3f3e0fa5982c77288ecf6612842.jpg create mode 100644 public/images/sunworld/Aft-Double-Bed-Cabin.jpg create mode 100644 public/images/sunworld/Double-Bed-Cabin-1.jpg create mode 100644 public/images/sunworld/Double-Bed-Cabin.jpg create mode 100644 public/images/sunworld/Sailing-Boat.jpg create mode 100644 public/images/sunworld/Saloon.jpg create mode 100644 public/images/sunworld/Sitting-Area.jpg create mode 100644 public/images/sunworld/Sunbeds-on-Deck.jpg create mode 100644 public/images/sunworld/Toilet-1.jpg create mode 100644 public/images/sunworld/Triple-Bed-Cabin.jpg create mode 100644 public/images/sunworld/Twin-Bed-Cabin.jpg create mode 100644 public/images/sunworld/bodrum-sunworld-8-kiralik-gulet-5 (1).jpg create mode 100644 public/images/sunworld/bodrum-sunworld-8-kiralik-gulet-5.jpg create mode 100644 scratch/bulk_upload.js create mode 100644 scratch/scan_cloudinary.js create mode 100644 scratch/upload_report.json create mode 100644 stitch.zip create mode 100644 stitch/DESIGN.md create mode 100644 stitch/code.html create mode 100644 stitch/screen.png diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..288e979 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,55 @@ +# 1. Base image +FROM node:20-alpine AS base + +# 2. Dependencies +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json package-lock.json* ./ +RUN npm ci --legacy-peer-deps + + +# 3. Builder +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Environment variables must be present at build time for Next.js +# Coolify will provide these, but we can set defaults +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN npm run build + +# 4. Runner +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 + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +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 +# set hostname to localhost +ENV HOSTNAME="0.0.0.0" + +CMD ["node", "server.js"] diff --git a/app/[locale]/contact/page.tsx b/app/[locale]/contact/page.tsx new file mode 100644 index 0000000..62decc3 --- /dev/null +++ b/app/[locale]/contact/page.tsx @@ -0,0 +1,101 @@ +import { useTranslations } from 'next-intl'; + +export default function ContactPage() { + const t = useTranslations('Contact'); + return ( +
+
+
+ {/* Editorial Column */} +
+ {t('reservation_concierge')} +

+ {t('title1')}
+ {t('title2')} +

+
+ +
+
+

{t('headquarters')}

+

+ {t('hq_address1')}
+ {t('hq_address2')} +

+
+ +
+
+

{t('direct_line')}

+

+90 (252) 316 12 34

+
+
+

{t('digital_mail')}

+

atelier@salmakis.com

+
+
+ +
+ +
+
+
+ + {/* Minimalist Form Column */} +
+

{t('form_title')}

+
+
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+ + +
+
+
+
+
+ ); +} + diff --git a/app/[locale]/fleet/[slug]/page.tsx b/app/[locale]/fleet/[slug]/page.tsx new file mode 100644 index 0000000..b1c37ff --- /dev/null +++ b/app/[locale]/fleet/[slug]/page.tsx @@ -0,0 +1,481 @@ +'use client'; + +import { yachts } from "../../../data/yachts"; +import { notFound } from "next/navigation"; +import { Link } from "@/i18n/routing"; +import { motion } from "framer-motion"; +import { use, useState, useCallback, useEffect } from "react"; +import { AnimatePresence } from "framer-motion"; +import { CldImage } from "next-cloudinary"; +import { useTranslations, useLocale } from "next-intl"; + +interface PageProps { + params: Promise<{ slug: string }>; +} + +export default function YachtPage({ params }: PageProps) { + const { slug } = use(params); + const yacht = yachts.find((y) => y.slug === slug); + const [lightboxIndex, setLightboxIndex] = useState(null); + const t = useTranslations('FleetDetail'); + const locale = useLocale(); + + const openLightbox = (index: number) => setLightboxIndex(index); + const closeLightbox = () => setLightboxIndex(null); + + const goNext = useCallback(() => { + if (lightboxIndex !== null && yacht) { + setLightboxIndex((lightboxIndex + 1) % yacht.gallery.length); + } + }, [lightboxIndex, yacht]); + + const goPrev = useCallback(() => { + if (lightboxIndex !== null && yacht) { + setLightboxIndex((lightboxIndex - 1 + yacht.gallery.length) % yacht.gallery.length); + } + }, [lightboxIndex, yacht]); + + useEffect(() => { + const handleKey = (e: KeyboardEvent) => { + if (lightboxIndex === null) return; + if (e.key === 'Escape') closeLightbox(); + if (e.key === 'ArrowRight') goNext(); + if (e.key === 'ArrowLeft') goPrev(); + }; + window.addEventListener('keydown', handleKey); + return () => window.removeEventListener('keydown', handleKey); + }, [lightboxIndex, goNext, goPrev]); + + if (!yacht) { + notFound(); + } + + const fadeInUp = { + hidden: { opacity: 0, y: 40 }, + visible: { opacity: 1, y: 0, transition: { duration: 0.8, ease: "easeOut" } } + }; + + const staggerContainer = { + hidden: { opacity: 0 }, + visible: { opacity: 1, transition: { staggerChildren: 0.15 } } + }; + + return ( +
+ {/* Editorial Hero Section */} +
+ + + + +
+ + + The Fleet Collection + + + {yacht.name} + + + {yacht.tagline} + + + + + Explore Specifications +
+
+
+
+ + {/* Technical Atelier Bar */} +
+
+
+
+ straighten + {t('length')} + {yacht.length} +
+
+ groups + {t('guests')} + {yacht.guests} +
+
+ bed + {t('cabins')} + {yacht.cabins} +
+
+ support_agent + {t('crew')} + {yacht.crew} +
+
+ speed + {t('speed')} + {yacht.speed} +
+
+
+
+ + {/* Editorial Content Section */} +
+ + {/* Intro Block - Full Width Centered */} + + + {t('design_engineering')} + + + {t('sanctuary_title1')}
+ {t('sanctuary_title2')} +
+ + + +
+ {t('builder')} + {yacht.builder} +
+
+
+ {t('year_refit')} + {yacht.year} {yacht.refitYear && `(${yacht.refitYear})`} +
+
+ + + {locale === 'tr' && yacht.description_tr ? yacht.description_tr : yacht.description} + + + + + {t('inquire_btn')} + + +
+ + {/* Specifications Grid - Modern Cards */} +
+ + {/* 1. Construction & Design */} + {(yacht.construction || yacht.furniture) && ( + + + 01 +

{t('design_construction').replace(/0\d\s\/\s/, '')}

+
+
+ +
+ {yacht.construction && Object.entries(yacht.construction).map(([key, value]) => ( + + + {key.replace(/([A-Z])/g, ' $1').trim()} + + + {value} + + + ))} +
+ + +
+ )} + + {/* 2. Equipment on Board */} + {yacht.equipment && yacht.equipment.length > 0 && ( + + + 02 +

{t('tech_equipment').replace(/0\d\s\/\s/, '')}

+
+
+ +
+ {yacht.equipment.map((item, idx) => ( + +
+ check +
+ {item} +
+ ))} +
+
+ )} + + {/* 3. Tenders & Toys */} + {yacht.watersports && yacht.watersports.length > 0 && ( + + + 03 +

{t('water_toys').replace(/0\d\s\/\s/, '')}

+
+
+ +
+ {yacht.watersports.map((item, idx) => ( + +
+ anchor + {item} +
+
+ ))} +
+
+ )} + +
+
+ + {/* Atelier Gallery Section */} + {yacht.gallery && yacht.gallery.length > 0 && ( +
+
+ {t('atelier_experience')} +

+ {t('gallery')} +

+
+ + + {yacht.gallery.map((imgUrl, index) => { + const isLarge = index === 0; + return ( + openLightbox(index)} + className={`relative overflow-hidden group cursor-pointer ${isLarge ? 'md:col-span-2 lg:col-span-2 row-span-2' : 'col-span-1 row-span-1'}`} + > + +
+ zoom_in +
+
+ ); + })} +
+
+ )} + + {/* Charter Rates Section */} + {yacht.prices && yacht.prices.length > 0 && ( +
+
+ RATES +
+ + +
+ + Charter Investment + + + {t('rates')} + + + {t('rates_desc')} + +
+ +
+ {yacht.prices.map((p) => ( + + + {p.month} + + + {p.price} + + + ))} +
+ + +

+ * {t('apa_note')}
+ * {t('vat_note')} +

+
+
+
+ )} + + {/* Editorial Navigation */} +
+ + + {t('journey_title')} + + + {t('ready_title')} + + + + {t('start_inquiry_btn')} + + + {t('explore_btn')} + + + +
+ + {/* Lightbox Overlay */} + + {lightboxIndex !== null && yacht.gallery && ( + + {/* Close Button */} + + + {/* Image Counter */} +
+ {lightboxIndex + 1} / {yacht.gallery.length} +
+ + {/* Previous Arrow */} + + + {/* Next Arrow */} + + + {/* Main Image */} + e.stopPropagation()} + > + + +
+ )} +
+
+ ); +} + diff --git a/app/[locale]/fleet/page.tsx b/app/[locale]/fleet/page.tsx new file mode 100644 index 0000000..0d9b6b1 --- /dev/null +++ b/app/[locale]/fleet/page.tsx @@ -0,0 +1,76 @@ +import { yachts } from "../../data/yachts"; +import { Link } from "@/i18n/routing"; +import { useTranslations, useLocale } from "next-intl"; +import { CldImage } from "next-cloudinary"; + +export default function FleetPage() { + const t = useTranslations('FleetList'); + const locale = useLocale(); + return ( +
+
+
+
+ {t('collection')} +

+ {t('title1')}
+ {t('title2')} +

+
+

+ {t('description')} +

+
+
+
+ {t('bg_text')} +
+
+
+ +
+ {yachts.map((yacht, index) => ( +
+
+ +
+
+
+ {t('masterpiece')}{index + 1} +

{yacht.name}

+

+ {locale === 'tr' && yacht.description_tr ? yacht.description_tr : yacht.description} +

+
+
+ straighten + {t('length')} + {yacht.length} +
+
+ groups + {t('guests')} + {yacht.guests} {t('guests_suffix')} +
+
+ + {t('discover')} + +
+
+
+
+ ))} +
+
+
+ ); +} + diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx new file mode 100644 index 0000000..22458be --- /dev/null +++ b/app/[locale]/layout.tsx @@ -0,0 +1,55 @@ +import type { Metadata } from "next"; +import { Inter, Oswald } from "next/font/google"; +import "../globals.css"; +import Navbar from "../components/Navbar"; +import Footer from "../components/Footer"; +import {NextIntlClientProvider} from 'next-intl'; +import {getMessages} from 'next-intl/server'; + +const inter = Inter({ + variable: "--font-inter", + subsets: ["latin"], +}); + +const oswald = Oswald({ + variable: "--font-oswald", + subsets: ["latin", "latin-ext"], +}); + +export const metadata: Metadata = { + title: "Salmakis Yachting | Luxury Yacht Charters in Bodrum & Aegean", + description: "Experience the pinnacle of Aegean luxury with Salmakis Yachting. Premium yacht charters since 1980.", + keywords: ["yacht charter", "bodrum", "luxury yacht", "meira", "salmakis yachting"], +}; + +export default async function RootLayout({ + children, + params +}: { + children: React.ReactNode; + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + const messages = await getMessages(); + + return ( + + + + + + + +
+ {children} +
+