Next.js 14 website with standalone output configured for Docker deployment. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
76 lines
3.2 KiB
TypeScript
76 lines
3.2 KiB
TypeScript
import { Metadata } from "next";
|
||
import { experiences } from "@/lib/constants";
|
||
import { generatePageMetadata } from "@/lib/metadata";
|
||
import { generateTouristTripSchema, generateBreadcrumbSchema } from "@/lib/structured-data";
|
||
import { ExperienceHero } from "@/components/experiences/ExperienceHero";
|
||
import { Itinerary } from "@/components/experiences/Itinerary";
|
||
import { BookingWidget } from "@/components/experiences/BookingWidget";
|
||
import { Testimonials } from "@/components/home/Testimonials";
|
||
import { FinalCTA } from "@/components/home/FinalCTA";
|
||
|
||
const experience = experiences.find((e) => e.slug === "first-light")!;
|
||
|
||
export const metadata: Metadata = generatePageMetadata({
|
||
title: "First Light — The Asian Side Breakfast Experience",
|
||
description: "Istanbul's breakfast culture is legendary. The best of it happens on the Asian side. Serpme kahvaltı, Kadıköy market, Turkish coffee ritual.",
|
||
path: "/experiences/first-light",
|
||
});
|
||
|
||
export default function FirstLightPage() {
|
||
return (
|
||
<>
|
||
<script
|
||
type="application/ld+json"
|
||
dangerouslySetInnerHTML={{ __html: JSON.stringify(generateTouristTripSchema(experience)) }}
|
||
/>
|
||
<script
|
||
type="application/ld+json"
|
||
dangerouslySetInnerHTML={{
|
||
__html: JSON.stringify(generateBreadcrumbSchema([
|
||
{ name: "Home", url: "https://theanatolianedit.com" },
|
||
{ name: "Experiences", url: "https://theanatolianedit.com/experiences" },
|
||
{ name: "First Light", url: "https://theanatolianedit.com/experiences/first-light" },
|
||
])),
|
||
}}
|
||
/>
|
||
|
||
<ExperienceHero experience={experience} />
|
||
|
||
<section className="py-12 section-padding">
|
||
<div className="max-w-4xl mx-auto">
|
||
<div className="flex flex-wrap justify-center gap-4">
|
||
{experience.highlights.map((h, i) => (
|
||
<div key={i} className="inline-flex items-center gap-2 bg-warm-sand rounded-full px-5 py-3 text-sm text-deep-nazar font-medium">
|
||
<span className="text-lg">{h.icon}</span>
|
||
{h.text}
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section className="py-12 section-padding bg-warm-sand">
|
||
<div className="max-w-3xl mx-auto">
|
||
<h2 className="font-display text-2xl md:text-3xl font-bold text-deep-nazar mb-8 text-center">What's Included</h2>
|
||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
||
{experience.includes.map((item, i) => (
|
||
<div key={i} className="flex items-start gap-3 bg-white rounded-2xl p-4">
|
||
<span className="text-bosphorus mt-0.5">
|
||
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
||
</svg>
|
||
</span>
|
||
<span className="text-deep-nazar/80 text-sm">{item}</span>
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
{experience.itinerary && <Itinerary stops={experience.itinerary} />}
|
||
<BookingWidget experience={experience} />
|
||
<Testimonials />
|
||
<FinalCTA />
|
||
</>
|
||
);
|
||
}
|