| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- import React, { useEffect } from 'react';
- import Navbar from '@/src/components/Navbar.tsx';
- import Sidebar from '@/src/components/Sidebar.tsx';
- import Footer from '@/src/components/Footer.tsx';
- import { CONTENT } from '../constants.ts';
- import { useLanguage } from '@/src/contexts/LanguageContext.tsx';
- import { useTheme } from '@/src/contexts/ThemeContext.tsx';
- import { useLocation, Link } from 'react-router-dom';
- import { ArrowRight, Anchor, Star, ChevronRight } from 'lucide-react';
- const Ships: React.FC = () => {
- const { language } = useLanguage();
- const { shipsPageImages } = useTheme();
- // We explicitly type 'any' here or assume CONTENT structure is updated because
- // TS might not immediately pick up the new keys added to constants without a full types reload in this context.
- // In a real app, types.ts should be updated, but here we access the object properties.
- const t = CONTENT[language].shipsPage as any;
- const location = useLocation();
- // Scroll to section on load or location change
- useEffect(() => {
- const params = new URLSearchParams(location.search);
- const section = params.get('section');
- // Always scroll to top first
- if (!section) {
- window.scrollTo({ top: 0, behavior: 'smooth' });
- } else {
- const element = document.getElementById(section);
- if (element) {
- // Small delay to ensure render
- setTimeout(() => {
- element.scrollIntoView({ behavior: 'smooth' });
- }, 300);
- }
- }
- }, [location]);
- return (
- <div className="min-h-screen bg-white font-sans text-vista-darkblue overflow-x-hidden">
- <Navbar />
- <Sidebar />
- {/* Hero Section */}
- <div className="relative h-[70vh] w-full bg-vista-darkblue flex items-center justify-center overflow-hidden">
- <div className="absolute inset-0 bg-black/40 z-10"></div>
- <img
- src="https://images.unsplash.com/photo-1548291616-3c0f5f743538?q=80&w=1920&auto=format&fit=crop"
- alt="Ships Hero"
- className="absolute inset-0 w-full h-full object-cover animate-slow-zoom"
- loading="lazy"
- />
- <div className="relative z-20 text-center text-white px-4 animate-fade-in-up">
- <span className="block text-sm md:text-base tracking-[0.3em] uppercase mb-4 text-vista-gold">{t.hero_sub}</span>
- <h1 className="text-5xl md:text-8xl font-serif italic mb-6">{CONTENT[language].nav.menu[1].title}</h1>
- <p className="max-w-xl mx-auto text-white/80 font-light text-lg">
- {t.hero_desc}
- </p>
- </div>
- </div>
- {/* Section 1: Vista Series Intro */}
- <section id="series" className="py-24 max-w-7xl mx-auto px-6">
- <div className="flex flex-col lg:flex-row gap-16 items-start">
- {/* Left: Text Content */}
- <div className="lg:w-3/5 space-y-12">
- <div>
- <h2 className="text-4xl md:text-5xl font-serif text-vista-darkblue mb-8 leading-tight">
- {t.intro.title}
- </h2>
- <div className="w-20 h-1 bg-vista-gold mb-8"></div>
- <p className="text-xl font-light leading-relaxed text-vista-darkblue/80">
- {t.intro.desc}
- </p>
- </div>
- <div className="space-y-12">
- {t.intro.points.map((point: any, index: number) => (
- <div key={index} className="flex gap-8 group">
- <span className="text-6xl font-serif text-vista-gold/20 font-bold -mt-2 group-hover:text-vista-gold/40 transition-colors duration-500">
- 0{index + 1}
- </span>
- <div>
- <h3 className="text-xl font-bold text-vista-darkblue mb-3 uppercase tracking-wider">{point.title}</h3>
- <p className="text-vista-darkblue/70 leading-relaxed">{point.desc}</p>
- </div>
- </div>
- ))}
- </div>
- </div>
- {/* Right: Navigation Cards */}
- <div className="lg:w-2/5 flex flex-col gap-8 sticky top-24">
- <Link to="/ships?section=lanyue" className="group relative h-72 overflow-hidden block shadow-2xl rounded-sm">
- <img
- src={shipsPageImages.lanyue[0]}
- alt="Lanyue"
- className="w-full h-full object-cover transition-transform duration-700 group-hover:scale-110"
- loading="lazy"
- />
- <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-transparent to-transparent opacity-90 transition-opacity"></div>
- <div className="absolute bottom-8 left-8 text-white">
- <span className="text-xs uppercase tracking-widest block mb-2 text-vista-gold">{t.now_sailing}</span>
- <span className="text-3xl font-serif italic flex items-center gap-4">
- {t.lanyue.title} <ArrowRight size={24} className="transform group-hover:translate-x-4 transition-transform text-vista-gold" />
- </span>
- </div>
- </Link>
- <Link to="/ships?section=aurora" className="group relative h-72 overflow-hidden block shadow-2xl rounded-sm">
- <img
- src={shipsPageImages.aurora}
- alt="Aurora"
- className="w-full h-full object-cover transition-transform duration-700 group-hover:scale-110 grayscale group-hover:grayscale-0"
- loading="lazy"
- />
- <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-transparent to-transparent opacity-90 transition-opacity"></div>
- <div className="absolute bottom-8 left-8 text-white">
- <span className="text-xs uppercase tracking-widest block mb-2 text-vista-gold">{t.coming_soon}</span>
- <span className="text-3xl font-serif italic flex items-center gap-4">
- {t.aurora.title} <ArrowRight size={24} className="transform group-hover:translate-x-4 transition-transform text-vista-gold" />
- </span>
- </div>
- </Link>
- </div>
- </div>
- </section>
- {/* Divider */}
- <div className="w-full h-px bg-vista-darkblue/10 max-w-7xl mx-auto"></div>
- {/* Section 2: Vista Lanyue Details */}
- <section id="lanyue" className="py-32 bg-vista-gray relative">
- {/* Background Decor */}
- <div className="absolute top-0 right-0 w-1/3 h-full bg-white/50 skew-x-12 hidden lg:block pointer-events-none"></div>
- <div className="max-w-7xl mx-auto px-6 relative z-10">
- <div className="text-center mb-20 max-w-4xl mx-auto">
- <div className="flex items-center justify-center gap-4 mb-6">
- <div className="h-px w-12 bg-vista-gold"></div>
- <span className="text-vista-gold uppercase tracking-widest text-sm font-bold">{t.flagship_label}</span>
- <div className="h-px w-12 bg-vista-gold"></div>
- </div>
- <h2 className="text-5xl md:text-7xl font-serif text-vista-darkblue mb-10">{t.lanyue.title}</h2>
- <p className="text-vista-darkblue/70 text-lg md:text-xl leading-relaxed font-light">
- {t.lanyue.desc}
- </p>
- <div className="mt-12 flex justify-center gap-6">
- <div className="flex flex-col items-center gap-2 px-6 border-r border-vista-darkblue/10">
- <Anchor size={24} className="text-vista-gold" />
- <span className="text-xs uppercase tracking-widest font-bold">{t.stats_tons}</span>
- </div>
- <div className="flex flex-col items-center gap-2 px-6 border-r border-vista-darkblue/10">
- <Star size={24} className="text-vista-gold" />
- <span className="text-xs uppercase tracking-widest font-bold">{t.stats_stars}</span>
- </div>
- <div className="flex flex-col items-center gap-2 px-6">
- <span className="text-xl font-serif font-bold text-vista-gold">1:1</span>
- <span className="text-xs uppercase tracking-widest font-bold">{t.stats_ratio}</span>
- </div>
- </div>
- </div>
- {/* Lanyue Image Grid (Masonry style) */}
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-4 auto-rows-[200px]">
- {/* Large Hero Image */}
- <div className="lg:col-span-8 lg:row-span-2 relative group overflow-hidden shadow-lg">
- <img
- src={shipsPageImages.lanyue[0]}
- alt="Lanyue Exterior"
- className="w-full h-full object-cover transition-transform duration-1000 group-hover:scale-105"
- loading="lazy"
- />
- </div>
- {/* Smaller Detail Images */}
- <div className="lg:col-span-4 lg:row-span-1 relative group overflow-hidden shadow-lg">
- <img
- src={shipsPageImages.lanyue[1]}
- alt="Lanyue Interior"
- className="w-full h-full object-cover transition-transform duration-1000 group-hover:scale-105"
- loading="lazy"
- />
- </div>
- <div className="lg:col-span-4 lg:row-span-1 relative group overflow-hidden shadow-lg">
- <img
- src={shipsPageImages.lanyue[2]}
- alt="Lanyue Deck"
- className="w-full h-full object-cover transition-transform duration-1000 group-hover:scale-105"
- loading="lazy"
- />
- </div>
- <div className="lg:col-span-12 lg:row-span-1 relative group overflow-hidden shadow-lg md:hidden lg:block">
- <img
- src={shipsPageImages.lanyue[3]}
- alt="Lanyue Wide"
- className="w-full h-full object-cover transition-transform duration-1000 group-hover:scale-105"
- loading="lazy"
- />
- </div>
- </div>
- <div className="mt-16 text-center">
- <Link to="/itineraries" className="inline-flex items-center gap-3 px-10 py-4 bg-vista-darkblue text-white uppercase tracking-widest text-xs font-bold hover:bg-vista-gold transition-colors duration-300">
- {t.view_itineraries} <ChevronRight size={16} />
- </Link>
- </div>
- </div>
- </section>
- {/* Section 3: Vista Aurora Teaser */}
- <section id="aurora" className="relative h-screen flex items-center justify-center overflow-hidden bg-black">
- <div className="absolute inset-0 opacity-70">
- <img
- src={shipsPageImages.aurora}
- alt="Aurora"
- className="w-full h-full object-cover animate-slow-zoom"
- loading="lazy"
- />
- <div className="absolute inset-0 bg-gradient-to-b from-black via-transparent to-black"></div>
- </div>
- <div className="relative z-10 text-center text-white px-6 max-w-4xl">
- <span className="inline-block border border-white/30 px-4 py-1 rounded-full text-xs uppercase tracking-widest mb-8 backdrop-blur-sm">{t.future_label}</span>
- <h2 className="text-6xl md:text-9xl font-serif italic mb-8 bg-clip-text text-transparent bg-gradient-to-r from-white via-white to-white/50">
- {t.aurora.title}
- </h2>
- <p className="text-xl md:text-2xl font-light tracking-wide mb-12 text-white/90">
- {t.aurora.desc}
- </p>
- <div className="flex flex-col md:flex-row items-center justify-center gap-6">
- <button className="px-10 py-4 bg-white text-black font-bold uppercase text-xs tracking-[0.2em] hover:bg-vista-gold hover:text-white transition-colors">
- {t.coming_soon}
- </button>
- <button className="px-10 py-4 border border-white/30 text-white font-bold uppercase text-xs tracking-[0.2em] hover:bg-white/10 transition-colors backdrop-blur-sm">
- {t.waitlist_btn}
- </button>
- </div>
- </div>
- </section>
- <Footer />
- </div>
- );
- };
- export default Ships;
|