commit 363d4b1e9e09c984f6f8360ff96d1c3672f02b8c Author: Bognar Date: Wed Jan 28 10:38:56 2026 +0100 first commit 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/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/akciok/facebook-google/page.tsx b/app/akciok/facebook-google/page.tsx new file mode 100644 index 0000000..825513a --- /dev/null +++ b/app/akciok/facebook-google/page.tsx @@ -0,0 +1,129 @@ +"use client" + +import Navbar from "@/components/navbar" +import { ArrowLeft, Facebook, Star, CheckCircle2 } from "lucide-react" +import Link from "next/link" +import Image from "next/image" +import { useLanguage } from "@/lib/language-context" +import { motion } from "framer-motion" + +export default function FacebookGoogleDiscountPage() { + const { t } = useLanguage() + + return ( +
+ + + {/* Header Section */} +
+
+
+ + + {t.discounts.pages.fbGoogle.title} + +

+ {t.discounts.fbGoogle.title}
+ Kedvezmény +

+
+
+ +
+
+
+ {/* Facebook Section */} +
+
+
+
+ +
+

{t.discounts.pages.fbGoogle.fbTitle}

+
+
    + {t.discounts.pages.fbGoogle.fbSteps.map((step: string, idx: number) => ( +
  • + + {step} +
  • + ))} +
+ +
+ +
+

{t.discounts.pages.fbGoogle.helperText}

+
+ Facebook Like Help +
+
+
+ + {/* Google Section */} +
+
+
+
+ +
+

{t.discounts.pages.fbGoogle.googleTitle}

+
+
    + {t.discounts.pages.fbGoogle.googleSteps.map((step: string, idx: number) => ( +
  • + + {step} +
  • + ))} +
+ +
+ +
+

Facebook:

+
+ +
+
+
+
+
+
+
+ ) +} diff --git a/app/akciok/tiktok/page.tsx b/app/akciok/tiktok/page.tsx new file mode 100644 index 0000000..64e5713 --- /dev/null +++ b/app/akciok/tiktok/page.tsx @@ -0,0 +1,80 @@ +"use client" + +import Navbar from "@/components/navbar" +import { ArrowLeft, CheckCircle2 } from "lucide-react" +import Link from "next/link" +import Script from "next/script" +import { useLanguage } from "@/lib/language-context" +import { motion } from "framer-motion" + +export default function TikTokDiscountPage() { + const { t } = useLanguage() + + return ( +
+ + + {/* Header Section */} +
+
+
+ + + {t.discounts.pages.tiktok.title} + +

+ TikTok
+ Kedvezmény +

+
+
+ +
+
+
+
+
+
+ +
+

Kedvezmény igénylése

+
+
    + {t.discounts.pages.tiktok.steps.map((step: string, idx: number) => ( +
  • + + {step} +
  • + ))} +
+
+ +
+

{t.discounts.pages.tiktok.videoTitle}

+
+
+
+ @skyflytravel.transfer +
+
+ +
+
+ + +
+
+
+
+ ) +} diff --git a/app/api/contact/route.ts b/app/api/contact/route.ts new file mode 100644 index 0000000..521626d --- /dev/null +++ b/app/api/contact/route.ts @@ -0,0 +1,98 @@ +import { NextResponse } from "next/server" +import nodemailer from "nodemailer" + +export async function POST(req: Request) { + try { + const body = await req.json() + const { name, email, phone, service, message, recaptcha } = body + + // 1. Verify reCaptcha + const recaptchaResponse = await fetch( + `https://www.google.com/recaptcha/api/siteverify?secret=${process.env.RECAPTCHA_SECRET_KEY}&response=${recaptcha}`, + { method: "POST" } + ) + const recaptchaData = await recaptchaResponse.json() + + // For local testing without secret key, we might skip this + if (process.env.RECAPTCHA_SECRET_KEY && !recaptchaData.success) { + return NextResponse.json({ error: "reCaptcha verification failed" }, { status: 400 }) + } + + // 2. Configure Nodemailer + // NOTE: In a real environment, you'd use your SMTP credentials (Gmail, SendGrid, etc.) + const transporter = nodemailer.createTransport({ + host: process.env.SMTP_HOST || "smtp.gmail.com", + port: Number(process.env.SMTP_PORT) || 587, + secure: false, + auth: { + user: process.env.SMTP_USER, + pass: process.env.SMTP_PASS, + }, + }) + + // 3. Create HTML Email + const htmlEmail = ` + + + + + + +
+
+

Új üzenet érkezett

+
+
+
+ Név +
${name}
+
+
+ Email +
${email}
+
+
+ Telefonszám +
${phone || "-"}
+
+
+ Szolgáltatás típusa +
${service}
+
+
+ Üzenet +
${message}
+
+
+
+ © 2026 SkyFly Travel Landing Page System +
+
+ + + ` + + // 4. Send Email + await transporter.sendMail({ + from: `"SkyFly Web" <${process.env.SMTP_USER}>`, + to: "bognar.szialrd83@gmail.com", + subject: `Weboldal Üzenet: ${name} (${service})`, + html: htmlEmail, + }) + + return NextResponse.json({ success: true }) + } catch (error) { + console.error("Email error:", error) + return NextResponse.json({ error: "Failed to send email" }, { status: 500 }) + } +} diff --git a/app/arak/page.tsx b/app/arak/page.tsx new file mode 100644 index 0000000..956f905 --- /dev/null +++ b/app/arak/page.tsx @@ -0,0 +1,196 @@ +"use client" + +import Navbar from "@/components/navbar" +import PricingTable from "@/components/pricing-table" +import { Button } from "@/components/ui/button" +import { Card } from "@/components/ui/card" +import { ArrowLeft, Phone, Mail, Clock, Shield, MapPin } from "lucide-react" +import Link from "next/link" +import { useLanguage } from "@/lib/language-context" + +const becsRows = [ + { persons: "1 pax / 1 way", express: "16.000 HUF", private: "29.000 HUF" }, + { persons: "2 pax / 1 way", express: "23.500 HUF", private: "29.000 HUF" }, + { persons: "3 pax / 1 way", express: "26.500 HUF", private: "29.000 HUF" }, + { persons: "4 pax / 1 way", express: "31.000 HUF", private: "35.000 HUF" }, + { persons: "5-6 pax / 1 way", express: "33.000 HUF", private: "37.500 HUF" }, + { persons: "7-8 pax / 1 way", express: "35.000 HUF", private: "39.000 HUF" }, +] + +const budapestRows = [ + { persons: "1 pax / 1 way", express: "22.000 HUF", private: "38.000 HUF" }, + { persons: "2 pax / 1 way", express: "28.000 HUF", private: "38.000 HUF" }, + { persons: "3 pax / 1 way", express: "33.000 HUF", private: "38.000 HUF" }, + { persons: "4 pax / 1 way", express: "38.000 HUF", private: "45.000 HUF" }, + { persons: "5-6 pax / 1 way", express: "42.000 HUF", private: "50.000 HUF" }, + { persons: "7-8 pax / 1 way", express: "45.000 HUF", private: "52.000 HUF" }, +] + +export default function PricingPage() { + const { language, t } = useLanguage() + + // Dynamic passenger text + const getFaresHub = (rows: any[]) => { + return rows.map(r => ({ + ...r, + persons: language === "hu" ? r.persons.replace("pax", "fő").replace("way", "út") : r.persons + })) + } + + const specials = [ + { + name: language === "hu" ? "Családi csomag" : "Family package", + price: "33.000 HUF", + description: language === "hu" + ? "max. 4 fő, min. 1 gyermek (0-14 éves), private transzfer, max. 3 normál és 3 kézi poggyász (Teljesítés: személygépjárművel)" + : "max. 4 pax, min. 1 child (0-14 yrs), private transfer, max. 3 standard and 3 hand luggage (Performed by passenger car)" + }, + { + name: language === "hu" ? "„Nagy” családi csomag" : "„Large” family package", + price: "36.000 HUF", + description: language === "hu" + ? "max. 6 fő, min. 1 gyermek (0-14 éves), private transzfer, max. 6 normál és 6 kézi poggyász (Teljesítés: kisbusszal)" + : "max. 6 pax, min. 1 child (0-14 yrs), private transfer, max. 6 standard and 6 hand luggage (Performed by minibus)" + } + ] + + const vipInfo = language === "hu" + ? ["1-3 fő (Mercedes E-class): 40.000 Ft", "4-6 fő (Mercedes Vito / Ford Tourneo Custom): 50.000 Ft"] + : ["1-3 pax (Mercedes E-class): 40.000 Ft", "4-6 pax (Mercedes Vito / Ford Tourneo Custom): 50.000 Ft"] + + return ( +
+ + + {/* Background Decorations matching Home page */} +
+
+
+
+ + {/* Header Section */} +
+ {/* Background gradient covers full section now */} +
+
+ +
+ +
+ +
+ {t.pricing.back} + + +
+

+ {t.pricing.title}
+ {t.pricing.titleAccent} +

+

+ {t.pricing.description} +

+
+
+
+ + {/* Pricing Content */} +
+
+ {/* Info Banner */} + +
+ +
+
+

{t.pricing.banner.title}

+

+ {t.pricing.banner.description} +

+
+ +
+ + {/* Tables */} + + + + + {/* Additional Info Cards */} +
+ +
+ +
+

{t.pricing.extra.security.title}

+

+ {t.pricing.extra.security.desc} +

+
+ + +
+ +
+

{t.pricing.extra.addresses.title}

+

+ {t.pricing.extra.addresses.desc} +

+
+ + +
+ +
+

{t.pricing.extra.custom.title}

+

+ {t.pricing.extra.custom.desc} +

+
+
+ + {/* Footer CTA */} +
+ +
+
+
+ ) +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/app/favicon.ico differ diff --git a/app/feltetelek/page.tsx b/app/feltetelek/page.tsx new file mode 100644 index 0000000..9faa10e --- /dev/null +++ b/app/feltetelek/page.tsx @@ -0,0 +1,93 @@ +"use client" + +import Navbar from "@/components/navbar" +import { Card } from "@/components/ui/card" +import { ArrowLeft, Info } from "lucide-react" +import Link from "next/link" +import { useLanguage } from "@/lib/language-context" +import { cn } from "@/lib/utils" + +export default function ConditionsPage() { + const { t } = useLanguage() + + return ( +
+ + + {/* Background Decorations */} +
+
+
+
+ + {/* Header Section */} +
+
+
+ +
+ +
+ +
+ {t.conditionsPage.back} + + +
+

+ {t.conditionsPage.title}
+ {t.conditionsPage.titleAccent} +

+
+
+
+ +
+
+
+ {t.conditionsPage.sections.map((section: any, idx: number) => ( +
+ {/* Section Header */} +
+
+ +
+

+ {section.title} +

+
+ + {/* Section Content */} + + {section.content.map((paragraph: string, pIdx: number) => ( +

+ {paragraph} +

+ ))} +
+
+ ))} +
+ + {/* Contact Info Footer */} +
+
+

+ SkyFly Travel +

+

+ {t.nav.contact} +

+ +
+
+
+
+ ) +} diff --git a/app/flotta/page.tsx b/app/flotta/page.tsx new file mode 100644 index 0000000..2d953e4 --- /dev/null +++ b/app/flotta/page.tsx @@ -0,0 +1,227 @@ +"use client" + +import Navbar from "@/components/navbar" +import { Card } from "@/components/ui/card" +import { ArrowLeft, Users, Briefcase, Wind, Wifi, ShieldCheck, ChevronRight } from "lucide-react" +import Link from "next/link" +import Image from "next/image" +import { useLanguage } from "@/lib/language-context" +import { motion } from "framer-motion" + +export default function FleetPage() { + const { t } = useLanguage() + + const vehicles = [ + { + id: "vclass", + data: t.fleetPage.vehicles.vclass, + image: "/images/fleet/v-class.jpg", + large: true, + icon: Users + }, + { + id: "eclass", + data: t.fleetPage.vehicles.eclass, + image: "/images/fleet/e-class.jpg", + large: false, + icon: Briefcase + }, + { + id: "superb", + data: t.fleetPage.vehicles.superb, + image: "/images/fleet/superb.jpg", + large: false, + icon: Wind + }, + { + id: "transit", + data: t.fleetPage.vehicles.transit, + image: "/images/fleet/transit.jpg", + large: true, + icon: Users + } + ] + + const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.2 + } + } + } + + const itemVariants = { + hidden: { opacity: 0, y: 30 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.8 + } + } + } + + return ( +
+ + + {/* Background elements - Softer and more premium */} +
+
+
+
+ + {/* Header Section */} +
+
+ + + + {t.fleetPage.back} + + + +
+ +

+ {t.fleetPage.title}
+ {t.fleetPage.titleAccent} +

+

+ {t.fleetPage.description} +

+
+
+
+
+ + {/* Fleet Grid */} +
+ + {vehicles.map((vehicle, idx) => ( + + + {/* Image with refined hover scaling */} + {vehicle.data.name} + + {/* Darker bottom gradient for text readability */} +
+ + {/* Content Details - Overlay style without box */} +
+
+
+
+ + {vehicle.data.category} + +
+
+
+ Elérhető +
+
+ +
+

+ {vehicle.data.name} +

+

+ {vehicle.data.description} +

+
+ +
+ {vehicle.data.features.map((feature: string, fIdx: number) => ( +
+
+ {feature} +
+ ))} +
+ +
+ + {t.nav.cta} + + + +
+
+ +
+
+
+
+
+ + + ))} + +
+ + {/* Quality Statement */} +
+
+ + + + +

+ {t.servicesPage.whyUs.items[1]} +

+ +
+
+

0-3

+

Éves átlagéletkor

+
+
+

100%

+

Tisztasági garancia

+
+
+

24/7

+

Műszaki felügyelet

+
+
+
+
+
+ ) +} diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..19478b7 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,149 @@ +@import "tailwindcss"; + +@theme { + --font-sans: var(--font-inter); + + --color-background: hsl(var(--background)); + --color-foreground: hsl(var(--foreground)); + + --color-card: hsl(var(--card)); + --color-card-foreground: hsl(var(--card-foreground)); + + --color-popover: hsl(var(--popover)); + --color-popover-foreground: hsl(var(--popover-foreground)); + + --color-primary: hsl(var(--primary)); + --color-primary-foreground: hsl(var(--primary-foreground)); + + --color-secondary: hsl(var(--secondary)); + --color-secondary-foreground: hsl(var(--secondary-foreground)); + + --color-muted: hsl(var(--muted)); + --color-muted-foreground: hsl(var(--muted-foreground)); + + --color-accent: hsl(var(--accent)); + --color-accent-foreground: hsl(var(--accent-foreground)); + + --color-destructive: hsl(var(--destructive)); + --color-destructive-foreground: hsl(var(--destructive-foreground)); + + --color-border: hsl(var(--border)); + --color-input: hsl(var(--input)); + --color-ring: hsl(var(--ring)); +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 224 71.4% 4.1%; + --card: 0 0% 100%; + --card-foreground: 224 71.4% 4.1%; + --popover: 0 0% 100%; + --popover-foreground: 224 71.4% 4.1%; + --primary: 42 74% 49%; + /* Mustard Gold/Yellow from screenshot */ + --primary-foreground: 0 0% 100%; + --secondary: 0 0% 10%; + /* Dark Grey from screenshot */ + --secondary-foreground: 0 0% 100%; + --muted: 0 0% 96%; + --muted-foreground: 0 0% 45%; + --accent: 42 74% 95%; + --accent-foreground: 42 74% 20%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 20% 98%; + --border: 0 0% 90%; + --input: 0 0% 90%; + --ring: 42 74% 49%; + --radius: 0.75rem; + } + + .dark { + --background: 0 0% 10%; + --foreground: 0 0% 98%; + --card: 0 0% 10%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 10%; + --popover-foreground: 0 0% 98%; + --primary: 42 74% 49%; + --primary-foreground: 0 0% 10%; + --secondary: 0 0% 20%; + --secondary-foreground: 0 0% 100%; + --muted: 0 0% 15%; + --muted-foreground: 0 0% 65%; + --accent: 42 74% 15%; + --accent-foreground: 42 74% 90%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 20% 98%; + --border: 0 0% 20%; + --input: 0 0% 20%; + --ring: 42 74% 49%; + } +} + +@layer base { + * { + @apply border-border; + } + + body { + @apply bg-background text-foreground font-sans; + font-feature-settings: "rlig" 1, "calt" 1; + } + + html { + scroll-behavior: smooth; + } +} + +@utility bg-diagonal { + background: linear-gradient(135deg, #D9A321 0%, #B8860B 100%); +} + +@utility animation-delay-2000 { + animation-delay: 2s; +} + +@utility animation-delay-4000 { + animation-delay: 4s; +} + +@keyframes float { + 0% { + transform: translateY(0px) rotate(0deg); + } + + 50% { + transform: translateY(-20px) rotate(2deg); + } + + 100% { + transform: translateY(0px) rotate(0deg); + } +} + +.animate-float { + animation: float 6s ease-in-out infinite; +} + +@keyframes blob { + 0% { + transform: translate(0px, 0px) scale(1); + } + + 33% { + transform: translate(30px, -50px) scale(1.1); + } + + 66% { + transform: translate(-20px, 20px) scale(0.9); + } + + 100% { + transform: translate(0px, 0px) scale(1); + } +} + +.animate-blob { + animation: blob 7s infinite; +} \ No newline at end of file diff --git a/app/kapcsolat/page.tsx b/app/kapcsolat/page.tsx new file mode 100644 index 0000000..00bf6a7 --- /dev/null +++ b/app/kapcsolat/page.tsx @@ -0,0 +1,153 @@ +"use client" + +import Navbar from "@/components/navbar" +import { Button } from "@/components/ui/button" +import { Card } from "@/components/ui/card" +import { ArrowLeft, Phone, Mail, MessageSquare, Clock, MapPin, Smartphone } from "lucide-react" +import Link from "next/link" +import { useLanguage } from "@/lib/language-context" +import { cn } from "@/lib/utils" +import ContactForm from "@/components/contact-form" + +export default function ContactPage() { + const { t } = useLanguage() + + const contactMethods = [ + { + icon: Smartphone, + label: t.contactPage.info.phone, + value: "+36 30 5543838", + href: "tel:+36305543838", + color: "bg-primary" + }, + { + icon: Phone, + label: t.contactPage.info.landline, + value: "+36 96 283676", + href: "tel:+3696283676", + color: "bg-blue-500" + }, + { + icon: Mail, + label: t.contactPage.info.email, + value: "info@skyflytravel.hu", + href: "mailto:info@skyflytravel.hu", + color: "bg-purple-500" + } + ] + + return ( +
+ + + {/* Background Decorations */} +
+
+
+
+ + {/* Header Section */} +
+
+
+ +
+ +
+ +
+ {t.contactPage.back} + + +
+

+ {t.contactPage.title}
+ {t.contactPage.titleAccent} +

+

+ {t.contactPage.description} +

+
+
+
+ +
+
+
+ {contactMethods.map((method, idx) => ( + +
+ +
+

+ {method.label} +

+ + {method.value} + +
+ ))} +
+ +
+
+
+

+ {t.contactPage.cta.title} +

+

+ {t.contactPage.cta.description} +

+
+ +
+
+ + {/* Business & Legal Info Section */} +
+
+
+ {t.contactPage.business.title} +
+
+

{t.contactPage.business.operator}

+
+

{t.contactPage.business.address}

+

{t.contactPage.business.taxNumber}

+

{t.contactPage.business.bankAccount}

+
+
+

{t.contactPage.business.phone}

+

{t.contactPage.business.infoLine}

+

{t.contactPage.business.email}

+
+
+
+ +
+
+ {t.contactPage.legal.title} +
+
+

{t.contactPage.legal.name}

+
+

{t.contactPage.legal.office}

+

{t.contactPage.legal.address}

+
+
+ + {t.contactPage.legal.web} + +

{t.contactPage.legal.phone}

+
+
+
+
+
+
+
+ ) +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..2e55fe3 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,35 @@ +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import "./globals.css"; + +const inter = Inter({ + variable: "--font-inter", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "SkyFly Travel - Reptéri Transzfer Győr, Budapest, Bécs, Pozsony", + description: "Gyors, megbízható és kényelmes reptéri transzfer szolgáltatás 0-24 órában.", +}; + +import { LanguageProvider } from "@/lib/language-context"; +import ScrollToTop from "@/components/scroll-to-top"; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + {children} + + + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..4c519bd --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,302 @@ +"use client" + +import Navbar from "@/components/navbar" +import Hero from "@/components/hero" +import FeatureSection from "@/components/feature-section" +import CookieConsent from "@/components/cookie-consent" +import { Button } from "@/components/ui/button" +import { useLanguage } from "@/lib/language-context" +import { Card } from "@/components/ui/card" +import Link from "next/link" +import Image from "next/image" +import { Star, ArrowLeft, Facebook } from "lucide-react" + +export default function Home() { + const { t } = useLanguage() + + return ( +
+ + + {/* Background Decorations */} +
+
+
+
+
+ + + + {/* Build Section */} + +
+
+ + Airport Transfer +
+
+

{t.features.transfer.cardCaption}

+

{t.features.transfer.cardDescription}

+
+
+
+
+ + + {/* Customize Section */} + +
+
+ + Family Packages +
+
+

{t.features.packages.cardCaption}

+

{t.features.packages.cardDescription}

+
+
+
+
+ + + {/* Promote Section */} + +
+
+ + Security and Comfort +
+
+

{t.features.security.cardCaption}

+

{t.features.security.cardDescription}

+
+
+
+
+ + + {/* Sell Section */} + +
+
+ +
+
+ +
+

{t.features.booking.cardCaption}

+

+ {t.features.booking.cardDescription} +

+
+
+
+
+
+ +
+ + + {/* Showcase Section */} + +
+
+ + Our Fleet +
+
+

{t.features.fleet.cardCaption}

+

{t.features.fleet.cardDescription}

+
+
+
+
+ + + {/* Engage Section */} + +
+

{t.contactPage.info.phone}

+ +36 30 282 1101 +
+
+

{t.contactPage.info.email}

+ info@skyflytravel.hu +
+
+ } + > +
+
+ + Non-stop help +
+

{t.features.nonstop.cardCaption}

+
+
+
+ + + {/* Discounts Section */} + + + +
+ } + > +
+
+ + Special Discounts + +
+
+
+
+

{t.discounts.fbGoogle.title}

+
+

{t.discounts.fbGoogle.desc}

+ + {t.discounts.fbGoogle.cta} + +
+ +
+
+
+ +
+

{t.discounts.tiktok.title}

+
+

{t.discounts.tiktok.desc}

+ + {t.discounts.tiktok.cta} + +
+
+
+
+ + + {/* SEO Optimized Content Section - Full Width */} +
+
+
+
+

SkyFly Travel

+

+ {t.contactPage.seo.title} +

+

+ {t.contactPage.seo.subtitle} +

+
+ +
+ {t.contactPage.seo.content.map((paragraph: string, idx: number) => ( +

+ {paragraph} +

+ ))} +
+
+
+
+ + {/* Footer / Final CTA */} +
+
+

{t.footer.ready}

+

+ {t.footer.description} +

+ +
+ +
+ © 2026 SkyFly Travel. {t.footer.rights} +
+
+ reptéri transzfer, transzfer Győr, Budapest, Bécs Schwechat, Pozsony - airport Shuttle - Airport taxi - Reptéri járatok - Repülőtéri transzfer - Budapest reptér - Pozsony repter - Bécs reptér (Vienna Airport) - Transfer Budapest airport - Transfer Vienna Airport Budapest Liszt Ferenc Ferihegy +
+ +
+
+
+ + +
+ ) +} diff --git a/app/szolgaltatasok/page.tsx b/app/szolgaltatasok/page.tsx new file mode 100644 index 0000000..494b634 --- /dev/null +++ b/app/szolgaltatasok/page.tsx @@ -0,0 +1,207 @@ +"use client" + +import Navbar from "@/components/navbar" +import { Button } from "@/components/ui/button" +import { Card } from "@/components/ui/card" +import { ArrowLeft, CheckCircle2, Facebook, Phone, Info } from "lucide-react" +import Link from "next/link" +import { useLanguage } from "@/lib/language-context" +import { cn } from "@/lib/utils" + +export default function ServicesPage() { + const { t } = useLanguage() + + const packageEntries = [ + { + unique: t.servicesPage.packages.classic.unique, + name: t.servicesPage.packages.classic.title, + desc: t.servicesPage.packages.classic.desc, + toAirport: t.servicesPage.packages.classic.toAirport, + toCity: t.servicesPage.packages.classic.toCity + }, + { + unique: t.servicesPage.packages.express.unique, + name: t.servicesPage.packages.express.title, + desc: t.servicesPage.packages.express.desc, + toAirport: t.servicesPage.packages.express.toAirport, + toCity: t.servicesPage.packages.express.toCity + }, + { + unique: t.servicesPage.packages.private.unique, + name: t.servicesPage.packages.private.title, + desc: t.servicesPage.packages.private.desc, + toAirport: t.servicesPage.packages.private.toAirport, + toCity: t.servicesPage.packages.private.toCity + }, + { + unique: t.servicesPage.packages.family.unique, + name: t.servicesPage.packages.family.title, + desc: t.servicesPage.packages.family.desc, + toAirport: t.servicesPage.packages.family.toAirport, + toCity: t.servicesPage.packages.family.toCity + }, + { + unique: t.servicesPage.packages.bigFamily.unique, + name: t.servicesPage.packages.bigFamily.title, + desc: t.servicesPage.packages.bigFamily.desc, + toAirport: t.servicesPage.packages.bigFamily.toAirport, + toCity: t.servicesPage.packages.bigFamily.toCity + } + ] + + return ( +
+ + + {/* Header Section */} +
+
+ + + {t.servicesPage.back} + +

+ {t.servicesPage.title} {t.servicesPage.titleAccent} +

+
+
+ +
+
+
+ + {/* Left Column - Packages (2/3 width) */} +
+ + {/* Common Shared Features */} +
+
+

{t.servicesPage.commonFeatures.title}

+
+
+
+
{t.servicesPage.commonFeatures.toAirport}
+
{t.servicesPage.commonFeatures.toAirportDesc}
+
+
+
{t.servicesPage.commonFeatures.toCity}
+
{t.servicesPage.commonFeatures.toCityDesc}
+
+
+
+ + {/* Individual Packages */} + {packageEntries.map((pkg, idx) => ( +
+
+

{pkg.unique}

+
+
+
+
"{pkg.name}"
+
{pkg.desc}
+
+
+
{t.servicesPage.commonFeatures.toAirport}
+
{pkg.toAirport}
+
+
+
{t.servicesPage.commonFeatures.toCity}
+
{pkg.toCity}
+
+
+
+ ))} +
+ + {/* Right Column - Info Panels (1/3 width) */} +
+ + {/* Why Us */} +
+
+

{t.servicesPage.whyUs.title}

+
+
+
    + {t.servicesPage.whyUs.items.map((item: string, i: number) => ( +
  • +
    + {item} +
  • + ))} +
+
+
+ + {/* Free of Charge */} +
+
+

{t.servicesPage.freeOfCharge.title}

+
+
+
    + {t.servicesPage.freeOfCharge.items.map((item: string, i: number) => ( +
  • +
    + {item} +
  • + ))} +
+
+
+ + {/* Discounts */} +
+
+

{t.servicesPage.discounts.title}

+
+
+
+

+ {t.servicesPage.discounts.fb} {t.servicesPage.discounts.fbLink} +

+
+ + + +
+
+
+
+

+ {t.servicesPage.discounts.loyalty.split(':')[0]}: + {t.servicesPage.discounts.loyalty.split(':')[1]} +

+
+
+
+ + {/* Hotline quick link */} + +
+ +
+
+

Hotline 0-24

+

+36 30 554 3838

+
+
+ +
+
+ + {/* Final CTA */} + + +
+
+
+ ) +} diff --git a/components/contact-form.tsx b/components/contact-form.tsx new file mode 100644 index 0000000..9f47ba4 --- /dev/null +++ b/components/contact-form.tsx @@ -0,0 +1,229 @@ +"use client" + +import React, { useState, useRef } from "react" +import { useLanguage } from "@/lib/language-context" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Textarea } from "@/components/ui/textarea" +import { Card } from "@/components/ui/card" +import { cn } from "@/lib/utils" +import ReCAPTCHA from "react-google-recaptcha" +import { Send, CheckCircle2, AlertCircle } from "lucide-react" + +export default function ContactForm() { + const { t } = useLanguage() + const recaptchaRef = useRef(null) + + const [status, setStatus] = useState<"idle" | "loading" | "success" | "error">("idle") + const [formData, setFormData] = useState({ + name: "", + email: "", + phone: "", + service: "REPTÉRI TRANSZFER", + message: "", + consent: false + }) + + const handleChange = (e: React.ChangeEvent) => { + const { name, value, type } = e.target as any + setFormData(prev => ({ + ...prev, + [name]: type === "checkbox" ? (e.target as HTMLInputElement).checked : value + })) + } + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + + const recaptchaValue = recaptchaRef.current?.getValue() + if (!recaptchaValue) { + alert("Please complete the reCaptcha") + return + } + + if (!formData.consent) { + alert("Please accept the privacy policy") + return + } + + setStatus("loading") + + try { + // In a static export environment, this would hit a PHP script on the server + // or an external API. Here we assume an API route for local testing. + const response = await fetch("/api/contact", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ ...formData, recaptcha: recaptchaValue }) + }) + + if (response.ok) { + setStatus("success") + setFormData({ name: "", email: "", phone: "", service: "REPTÉRI TRANSZFER", message: "", consent: false }) + recaptchaRef.current?.reset() + } else { + setStatus("error") + } + } catch (err) { + setStatus("error") + } + } + + if (status === "success") { + return ( + +
+ +
+

Köszönjük!

+

+ {t.contactPage.form.success} +

+ +
+ ) + } + + return ( + +
+
+ {/* Name */} +
+ + +
+ + {/* Email */} +
+ + +
+
+ +
+ {/* Phone */} +
+ + +
+ + {/* Service Type */} +
+ + +
+
+ + {/* Message */} +
+ +