/* ── DominiTrip Sections — v2: Research-backed pricing & US/CA copy ── */ /* ── Tour Data (2025 market-rate aligned) ── */ const TOURS = [ { id: 1, name: 'Saona Island VIP Catamaran', price: 99, duration: '8–9 hours', pax: 'Up to 30', gradient: 'linear-gradient(135deg, #0891B2, #22D3EE, #67E8F9)', img: 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?auto=format&fit=crop&w=800&q=80', description: 'Speedboat to a private beach, catamaran cruise with open bar, natural pool swim with starfish, and a fresh Dominican BBQ lunch. Zero souvenir-shop stops.', includes: ['Speedboat + catamaran', 'Open bar & BBQ lunch', 'Private beach access'], tag: 'Most Popular' }, { id: 2, name: 'Off-Road Buggy & ATV Adventure', price: 65, duration: '4 hours', pax: '2 per buggy', gradient: 'linear-gradient(135deg, #065F46, #059669, #34D399)', img: 'https://images.unsplash.com/photo-1504280390367-361c6d9f38f4?auto=format&fit=crop&w=800&q=80', description: 'Tear through Dominican countryside trails, explore a hidden cenote cave, visit a cacao plantation, and hit Macao Beach — all mud, no gift shops.', includes: ['Buggy or ATV rental', 'Cenote swim', 'Macao Beach stop'], tag: 'Adventure' }, { id: 3, name: 'Scape Park & Hoyo Azul Cenote', price: 109, duration: '6 hours', pax: 'Up to 20', gradient: 'linear-gradient(135deg, #164E63, #0E7490, #06B6D4)', img: 'https://images.unsplash.com/photo-1552083375-1447ce886485?auto=format&fit=crop&w=800&q=80', description: 'Swim in the electric-blue Hoyo Azul cenote, fly the Superman zipline headfirst over jungle canopy, explore Iguabonita Cave, and walk eco-trails at Cap Cana\'s premier adventure park.', includes: ['Full Scape Park pass', 'Hoyo Azul cenote swim', 'Ziplines + cave tour'], tag: 'Premium' }, { id: 4, name: 'Monkeyland & Jungle Zipline Combo', price: 89, duration: '5 hours', pax: 'Up to 15', gradient: 'linear-gradient(135deg, #166534, #16A34A, #4ADE80)', img: 'https://images.unsplash.com/photo-1448375240586-882707db888b?auto=format&fit=crop&w=800&q=80', description: 'Play with free-roaming squirrel monkeys in their forest habitat, then soar above the canopy on ziplines. Family-friendly and hands-on — kids love this one.', includes: ['Monkey sanctuary access', 'Canopy zipline course', 'Hotel pickup & dropoff'], tag: 'Family Friendly' }, { id: 5, name: 'Bávaro Coastline Snorkeling Cruise', price: 75, duration: '5 hours', pax: 'Up to 25', gradient: 'linear-gradient(135deg, #1E3A5F, #0369A1, #38BDF8)', img: 'https://images.unsplash.com/photo-1544551763-46a013bb70d5?auto=format&fit=crop&w=800&q=80', description: 'Explore coral reefs and tropical fish, then cruise the Bávaro coastline on a party catamaran with Dominican music, open bar, and fresh ceviche.', includes: ['Snorkel gear provided', 'Open bar & snacks', 'Party catamaran cruise'], tag: 'Best Value' }, ]; /* ── Transfer Data (market-rate, distance-based) ── */ const TRANSFERS = [ { name: 'Airport Pickup & Dropoff', desc: 'PUJ Airport ↔ Your Hotel', price: 35, priceLabel: 'From', icon: Icons.plane, time: '10–25 min' }, { name: 'Hotel-to-Hotel', desc: 'Transfer between any resorts', price: 25, priceLabel: 'From', icon: Icons.hotel, time: 'Varies' }, { name: 'Private SUV', desc: 'Exclusive comfort for couples', price: 65, priceLabel: 'From', icon: Icons.car, time: 'Any route' }, { name: 'Shared Shuttle', desc: 'Budget-friendly, AC, WiFi', price: 18, priceLabel: 'From', unit: '/person', icon: Icons.users, time: '20–35 min' }, { name: 'Group Van (15 pax)', desc: 'Perfect for large groups', price: 150, priceLabel: 'From', icon: Icons.van, time: 'Any route' }, ]; /* ── Vehicles ── */ const VEHICLES = [ { name: 'Sedan', capacity: '1–3 passengers', desc: 'Comfortable and private', gradient: 'linear-gradient(135deg, var(--primary), var(--primary-dark))', img: 'https://images.unsplash.com/photo-1550355291-bbee04a92027?auto=format&fit=crop&w=800&q=80' }, { name: 'Minivan', capacity: 'Up to 7 passengers', desc: 'Great for families', gradient: 'linear-gradient(135deg, var(--accent), var(--accent-dark))', img: 'https://images.unsplash.com/photo-1559416523-140ddc3d238c?auto=format&fit=crop&w=800&q=80' }, { name: 'Van', capacity: 'Up to 15 passengers', desc: 'Ideal for groups', gradient: 'linear-gradient(135deg, var(--green), #047857)', img: 'https://images.unsplash.com/photo-1570125909232-eb263c188f7e?auto=format&fit=crop&w=800&q=80' }, ]; /* ── Pain Points We Solve ── */ const PAIN_POINTS = [ { bad: 'Forced gift-shop stops that waste your day', good: 'Zero commercial stops — unless you ask', icon: Icons.clock }, { bad: 'Unmarked cars and unlicensed drivers', good: 'MITUR-licensed, branded vehicles with uniformed drivers', icon: Icons.shield }, { bad: 'Surprise fees and hidden costs', good: 'All-inclusive pricing — what you see is what you pay', icon: Icons.tag }, { bad: 'No-shows and late pickups at the airport', good: 'Real-time flight tracking — your driver is always waiting', icon: Icons.plane }, { bad: 'Last-minute cancellation penalties', good: 'Free cancellation up to 24 hours before', icon: Icons.check }, { bad: 'Drivers who don\'t speak your language', good: 'Fully bilingual team (English & Spanish)', icon: Icons.globe }, ]; /* ── Trust-Focused USPs ── */ const USPS = [ { icon: Icons.shield, title: 'Licensed & Insured', desc: 'Fully registered with MITUR. Liability insurance on every ride.' }, { icon: Icons.clock, title: '24/7 Availability', desc: 'Red-eye flight? 4 AM pickup? We\'re always on.' }, { icon: Icons.globe, title: 'Bilingual Drivers', desc: 'Every driver speaks English and Spanish fluently.' }, { icon: Icons.wifi, title: 'Free WiFi + AC', desc: 'Stay connected and cool in every vehicle.' }, { icon: Icons.heart, title: 'Airport Meet & Greet', desc: 'Name sign, cold water, help with bags — the full welcome.' }, { icon: Icons.drink, title: 'Cold Drinks on Arrival', desc: 'Complimentary water and refreshments in every vehicle.' }, ]; /* ── Testimonials (US/CA specific) ── */ const TESTIMONIALS = [ { name: 'Sarah M.', from: 'New York, USA', rating: 5, text: 'After reading horror stories about tourist taxis in Punta Cana, DominiTrip was a breath of fresh air. Driver tracked our delayed flight and was waiting with cold water. No drama, no haggling.' }, { name: 'James & Lisa K.', from: 'Toronto, Canada', rating: 5, text: 'The Saona Island tour was the highlight of our trip. No gift shop stops, real food, and our guide knew every hidden spot. Already booked them for next year.' }, { name: 'Carlos R.', from: 'Miami, USA', rating: 5, text: 'We did 3 tours and all airport transfers through DominiTrip. Every vehicle was clean, on time, with WiFi. The pricing matched what they quoted — no surprises. That\'s rare here.' }, { name: 'Emma & Dave W.', from: 'Vancouver, Canada', rating: 5, text: 'The buggy adventure was incredible! We were nervous about safety but the vehicles were legit, helmets provided, and our guide was super professional. A must-do for adventurous couples.' }, ]; /* ── FAQs (US/CA market concerns) ── */ const FAQS = [ { q: 'Is it safe to book private transfers in Punta Cana?', a: 'Absolutely. DominiTrip is fully licensed with the Dominican Ministry of Tourism (MITUR) and INTRANT. All vehicles are branded, insured, and GPS-tracked. Our uniformed drivers carry official ID — you\'ll never have to worry about unmarked cars or unlicensed operators.' }, { q: 'What if my flight is delayed?', a: 'We track every incoming flight in real-time. If your flight is delayed — even by hours — your driver will be waiting at arrivals at no extra charge. No penalties, no rebooking fees.' }, { q: 'Do you make forced stops at souvenir shops?', a: 'Never. A top complaint on Reddit and TripAdvisor about Dominican tours is wasted time at gift shops. DominiTrip tours have zero commercial stops unless you specifically request one.' }, { q: 'Can I pay in Canadian or US dollars?', a: 'Yes! We accept USD, CAD, and major credit cards. All prices on our site can be viewed in both currencies. No hidden conversion fees.' }, { q: 'How far in advance should I book?', a: 'We recommend at least 48 hours for tours and 24 hours for transfers. That said, we often accommodate same-day bookings — just message us on WhatsApp.' }, { q: 'What\'s your cancellation policy?', a: 'Free cancellation up to 24 hours before your scheduled service — full refund, no questions asked. Need to modify? Changes are free anytime.' }, { q: 'Do vehicles have WiFi and air conditioning?', a: 'Every single vehicle in our fleet has high-speed WiFi and powerful AC. Punta Cana is hot — we keep you cool and connected.' }, { q: 'Why book direct instead of through Viator or GetYourGuide?', a: 'OTAs charge us 20–30% commission, which inflates the price you pay. Booking direct with DominiTrip gets you the same (or better) experience at a lower price, plus direct WhatsApp support and flexible changes.' }, ]; /* ── Destinations ── */ const DESTINATIONS = [ { name: 'PUJ Airport', time: '10–15 min', icon: Icons.plane }, { name: 'Bávaro Beach', time: '20–25 min', icon: Icons.mapPin }, { name: 'Cap Cana', time: '10–15 min', icon: Icons.mapPin }, { name: 'Uvero Alto', time: '45–50 min', icon: Icons.mapPin }, { name: 'Bayahibe / Saona', time: '60–70 min', icon: Icons.car }, { name: 'Miches', time: '90 min', icon: Icons.car }, ]; /* ── Partners ── */ const PARTNERS = [ { name: 'GetYourGuide', color: '#FF5533' }, { name: 'Viator', color: '#00AA6C' }, { name: 'Civitatis', color: '#1A73E8' }, { name: 'Booking.com', color: '#003580' }, ]; /* ── Gallery ── */ const GALLERY_ITEMS = [ { label: 'Saona Island Beach', gradient: 'linear-gradient(135deg, #0891B2, #67E8F9)', img: 'https://images.unsplash.com/photo-1519046904884-53103b34b206?auto=format&fit=crop&w=600&q=80' }, { label: 'Airport Meet & Greet', gradient: 'linear-gradient(135deg, #164E63, #0E7490)', img: 'https://images.unsplash.com/photo-1530521954074-e64f6810b32d?auto=format&fit=crop&w=600&q=80' }, { label: 'Catamaran Cruise', gradient: 'linear-gradient(135deg, #1E3A5F, #38BDF8)', img: 'https://images.unsplash.com/photo-1540946485063-a40da27545f8?auto=format&fit=crop&w=600&q=80' }, { label: 'Jungle Adventure', gradient: 'linear-gradient(135deg, #065F46, #34D399)', img: 'https://images.unsplash.com/photo-1448375240586-882707db888b?auto=format&fit=crop&w=600&q=80' }, { label: 'Hoyo Azul Cenote', gradient: 'linear-gradient(135deg, #155E75, #22D3EE)', img: 'https://images.unsplash.com/photo-1552083375-1447ce886485?auto=format&fit=crop&w=600&q=80' }, { label: 'Sunset Views', gradient: 'linear-gradient(135deg, #EA580C, #FBBF24)', img: 'https://images.unsplash.com/photo-1506929562872-bb421503ef21?auto=format&fit=crop&w=600&q=80' }, ]; /* ═══════════════════════════════════════════════════════ COMPONENTS ═══════════════════════════════════════════════════════ */ /* ── DominiTrip Difference (Pain Points) ── */ function DominiTripDifference() { return (
{PAIN_POINTS.map((p, i) => (
{p.icon}

{p.bad}

{p.good}

))}
); } /* ── Tour Card ── */ function TourCard({ tour, onBook, cardStyle, currency }) { const [hovered, setHovered] = React.useState(false); const radius = cardStyle === 'rounded' ? 'var(--radius)' : '4px'; return (
setHovered(true)} onMouseLeave={() => setHovered(false)} style={{ borderRadius: radius, overflow: 'hidden', background: 'var(--surface)', boxShadow: hovered ? 'var(--card-shadow-hover)' : 'var(--card-shadow)', transform: hovered ? 'translateY(-6px)' : 'none', transition: 'all 0.4s cubic-bezier(0.22,1,0.36,1)', cursor: 'pointer', display: 'flex', flexDirection: 'column', }} onClick={() => onBook(tour)}>
{tour.tag}
{tour.duration}

{tour.name}

{tour.description}

{tour.includes && (
{tour.includes.map((inc, j) => (
{Icons.check} {inc}
))}
)}
{formatPrice(tour.price, currency)} /person
Book
); } /* ── Tours Section ── */ function ToursSection({ onBook, cardStyle, currency }) { return (
{TOURS.map((t, i) => ( ))}
); } /* ── Transfers Section ── */ function TransfersSection({ onBook, cardStyle, currency }) { const radius = cardStyle === 'rounded' ? 'var(--radius)' : '4px'; return (
{TRANSFERS.map((t, i) => ( onBook({ name: t.name, price: 0, isTransfer: true })}>
{t.icon}

{t.name}

{t.desc}

{t.time &&

{t.time}

} {t.priceLabel} {formatPrice(t.price, currency)}{t.unit || ''}
))}
{/* Vehicle Fleet */}

Our Fleet

{VEHICLES.map((v, i) => (
{Icons.car}

{v.name}

{v.capacity}

{v.desc}

))}
); } /* ── Special Offer ── */ function SpecialOffer({ onBook }) { return (
{Icons.tag} Book Direct & Save

Skip the OTA Markup — Save 15%

OTAs like Viator charge us 20–30% commission. Book direct and we pass the savings to you. Use code DOMINISUN

Book Direct & Save
); } /* ── Why Choose Us ── */ function WhyChooseUs() { return (
{USPS.map((u, i) => (
{u.icon}

{u.title}

{u.desc}

))}
); } /* ── Partners ── */ function PartnersSection() { return (
{PARTNERS.map((p, i) => (
{p.name}
))}
); } /* ── Testimonials ── */ function TestimonialsSection() { const [active, setActive] = React.useState(0); React.useEffect(() => { const timer = setInterval(() => setActive(a => (a + 1) % TESTIMONIALS.length), 5000); return () => clearInterval(timer); }, []); return (

"{TESTIMONIALS[active].text}"

{TESTIMONIALS[active].name}

{TESTIMONIALS[active].from}

{TESTIMONIALS.map((_, i) => ( ))}
); } /* ── Gallery ── */ function GallerySection() { return (
{GALLERY_ITEMS.map((item, i) => (
{item.label}
))}
); } /* ── FAQ ── */ function FAQSection() { const [openIdx, setOpenIdx] = React.useState(null); return (
{FAQS.map((faq, i) => (

{faq.a}

))}
); } /* ── Destinations ── */ function DestinationsSection() { return (
{DESTINATIONS.map((d, i) => (
{d.icon}

{d.name}

{d.time}

))}
); } /* ── Stats Bar ── */ function StatsBar() { const stats = [ { value: '62%', label: 'of DR tourists are from US & Canada' }, { value: '24/7', label: 'Support via WhatsApp' }, { value: '0', label: 'Forced gift-shop stops' }, { value: 'Free', label: 'Cancellation (24h)' }, ]; return (
{stats.map((s, i) => (
{s.value}
{s.label}
))}
); } Object.assign(window, { TOURS, TRANSFERS, VEHICLES, USPS, TESTIMONIALS, FAQS, DESTINATIONS, PARTNERS, PAIN_POINTS, GALLERY_ITEMS, TourCard, ToursSection, TransfersSection, SpecialOffer, WhyChooseUs, PartnersSection, TestimonialsSection, GallerySection, FAQSection, DestinationsSection, StatsBar, DominiTripDifference, });