// === Seven Yachts — Per-yacht microsite === function YachtPage({ slug, setRoute, openBooking, favs, toggleFav, showRates }) { const y = findYacht(slug); if (!y) return
Yacht not found
; const isFav = favs.includes(y.slug); const related = FLEET.filter(f => f.slug !== y.slug).slice(0, 3); return (
{/* Cinematic hero */}
{`${y.name}
setRoute({ name: 'home' })} style={{ cursor: 'pointer' }}>Seven Yachts · setRoute({ name: 'fleet' })} style={{ cursor: 'pointer', margin: '0 4px' }}> Fleet · {y.name}
{y.builder} · {y.length}ft

{y.name}

{y.tagline &&

— {y.tagline}

}
Length
{y.length}ft
{y.cruisingGuests ? (
Cruising
{y.cruisingGuests}guests
) : (
Cruising
On request
)} {y.overnightGuests ? (
Overnight
{y.overnightGuests}guests
) : (
Overnight
On request
)}
Min charter
{y.minCharter || '— hr'}
WhatsApp
{showRates && y.fromHourly && (
from AED {fmtAED(y.fromHourly)}/hr {y.fromDaily ? `· AED ${fmtAED(y.fromDaily)}/day` : ''} · indicative — confirm a live rate card
)}
{/* Intro — drop cap */}
The Vessel

{y.builder}.
{y.length} feet.
Quietly definitive.

{y.description ? (

{y.description}

) : (

{y.name} is a {y.builder} of {y.length} feet, part of our active charter fleet at Dubai Harbour. Full specifications — guest capacity, cabin configuration, crew — are confirmed at the time of enquiry. Speak with our concierge for a tailored proposal.

)}

Built by one of yachting's most considered houses, {y.name} is maintained under our in-house yacht-management programme — fresh paint, fresh linens, fresh crew rotation. Berthed at DA37–DA41 and ready for departure within hours of confirmation.

◇ Private boarding ◇ European crew ◇ Yacht-wide Wi-Fi ◇ Climate-controlled salon
{/* Gallery */}
Gallery

Decks, salon, master.

A working preview. The client will replace these with hi-res cinematic stills and a 60-second hero film at handover.

{y.gallery && y.gallery.length >= 3 ? ( <>
{y.gallery[0].caption}
{y.gallery[1].caption}
{y.gallery[2].caption}
) : y.gallery && y.gallery.length === 2 ? ( <>
{y.gallery[0].caption}
{y.gallery[1].caption}
) : (
{y.name}
)}
{/* Spec + amenities */}
Specification

The numbers.

Confirmed fields shown verbatim. Where the client has not yet supplied a value, we render on request rather than guess — never invent.

Builder{y.builder}
Length{y.length} ft {y.lengthNote && {y.lengthNote}}
Cruising guests{y.cruisingGuests || On request}
Overnight guests{y.overnightGuests || On request}
Cabins{y.cabins || On request}
Crew nationalities{y.crew || On request}
Minimum charter{y.minCharter || On request}
Year builtOn request
{showRates && y.fromHourly && (
From rateAED {fmtAED(y.fromHourly)} / hr{y.fromDaily ? ` · ${fmtAED(y.fromDaily)} / day` : ''}
)}
{/* Amenities */} {y.amenities && y.amenities.length > 0 && (
On Board

What's included.

A working list from the live listing. The client will sign off the final inventory at handover.

{y.amenities.map((a, i) => (

{a.title}

{a.desc}

))}
)} {/* Booking band */}
Check Availability

Pick a date.
We'll WhatsApp you back
within the hour.

No live calendar yet — every enquiry is hand-confirmed by the concierge desk against the live fleet schedule. Faster than it sounds.

openBooking({ ...d, yacht: y.slug })} />
{/* Related */}
Also in the Fleet

Related yachts.

Comparable in length, builder or temperament.

{related.map(r => ( { setRoute({ name: 'yacht', slug: s }); window.scrollTo(0,0); }} showRates={showRates} /> ))}
); } window.YachtPage = YachtPage;