const {SectionLabel}=window.VedutaDesignSystem_f6874f;
function VSection({bg='var(--cream)',label,headline,intro,children,dark=false,center=false,narrow=false,style,id}){
return
{label&&{label}}
{headline&&
{headline}
}
{intro&&
{intro}
}
{children}
;
}
const CITIES=[
['Chicago','chicago',['Electric','Culture','Professional']],
['Miami','miami',['Coast','Electric','Professional']],
['Mexico City','mexico-city',['Adventure','Culture','Electric']],
['Prague','prague',['Culture','Quiet','Adventure']],
['Rome','rome',['Culture','Adventure','Quiet']],
['New York','new-york',['Electric','Culture','Professional']],
['London','london',['Culture','Professional','Quiet']],
['Paris','paris',['Culture','Quiet','Adventure']],
['Barcelona','barcelona',['Coast','Electric','Adventure']],
['Boston','boston',['Culture','Professional']]
];
const SEASONALS=[
['⛵','Lake Geneva','Summer Escape','May – Oct','lake-geneva'],
['🎨','Santa Fe','Art & Desert','Jun – Nov','santa-fe'],
['🏔️','New Hampshire','Fall & Winter','Sep – Mar','new-hampshire'],
['🌊','San Diego','Pacific Coast','Nov – Apr','san-diego'],
['🏝️','Saint Martin','Caribbean','Dec – Apr','saint-martin']
];
const TIERS=[
{number:'01',name:'Curated Database',tagline:'We did the research. You reap the rewards.',price:'$250/year',priceNote:'monthly increments on an annual contract · 10% off paid up front',features:['Curated properties across 15 cities','Search by mood','Guides updated every 6 months','Direct booking','Exclusive Community Events'],cta:'Get Access'},
{number:'02',name:'The Concie-agent',tagline:'Tell us where and when. We handle everything else.',price:'$50/month',priceNote:'or $600/yr concierge reservation · + 20% on travel we book',features:['Everything in the Database','A travel agent and concierge in one','All travel booked at partnership discounts','Full itinerary with iterations','Our team\u2019s time, reserved for you'],cta:'Get Started',featured:true},
{number:'03',name:'The Scout',tagline:'We go first. Everything is perfect before you arrive.',price:'$5,000+',priceNote:'per trip · 100% bespoke',features:['Everything in the Concie-agent','Built entirely on your travel designs and wishes','Advance scouting of your exact trip','On-the-ground preparation','Real-time trip management','Optional travel companion'],cta:'Inquire'},
{number:'04',name:'The Owner',tagline:'Travel to your own places.',price:'$35,000+',priceNote:'investment · accredited investors only',features:['Fractional ownership (1 of 10)','21 usage days/year','Rental income intended to offset costs','Potential for appreciation','Professional management','Reservations booked 6 months ahead on our proprietary platform','Separate legal agreement and documents per property'],cta:'Learn About Ownership'}
];
function VWaitlist({center=true,style}){
const {Button,Input}=window.VedutaDesignSystem_f6874f;
const [email,setEmail]=React.useState('');
const [status,setStatus]=React.useState('idle');
const submit=async()=>{
const v=email.trim();
if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)){setStatus('invalid');return;}
if(status==='sending')return;
setStatus('sending');
const ok=await window.vedutaSubmitEmail(v,'waitlist');
setStatus(ok?'sent':'error');
};
return
Something went wrong. Please try again in a moment.
}
Launching Spring 2027 · Founding members lock in pricing for life
;
}
/* Brand lockup built from the supplied mark plus live type, so it sits cleanly on any background.
tone 'dark' = for navy/photo backgrounds, 'light' = for cream backgrounds. */
function VLogo({variant='horizontal',tone='dark',height=38,style}){
const dark=tone==='dark';
const mark='assets/brand/mark-'+(dark?'gold':'navy')+'-trim.png';
const stacked=variant==='stacked';
const word={fontFamily:'var(--font-serif)',fontWeight:400,fontSize:stacked?Math.round(height*0.42)+'px':Math.round(height*0.5)+'px',letterSpacing:'0.22em',textTransform:'uppercase',lineHeight:1,color:dark?'var(--text-on-dark)':'var(--navy)',whiteSpace:'nowrap'};
const sub={fontFamily:'var(--font-sans)',fontWeight:500,fontSize:stacked?Math.round(height*0.16)+'px':Math.round(height*0.24)+'px',letterSpacing:'0.3em',textTransform:'uppercase',lineHeight:1,color:'var(--gold)',marginTop:stacked?'8px':'6px',whiteSpace:'nowrap'};
return VedutaTravel Club;
}
function VFooter({onNavigate}){
const go=p=>e=>{e.preventDefault();onNavigate&&onNavigate(p);};
const a={fontFamily:'var(--font-sans)',color:'var(--text-on-dark-muted)',textDecoration:'none',fontSize:'12px',letterSpacing:'0.14em',textTransform:'uppercase'};
return ;
}
/* Seasonal destination card with a photo band on top (the design-system SeasonalCard is text-only). */
function VSeasonalCard({emoji,city,subtitle,season,img,style}){
const [hover,setHover]=React.useState(false);
return
;
}
/* Scrolls to the waitlist form on the current page (every page has one). */
function vedutaScrollToWaitlist(){
const el=document.getElementById('waitlist');
if(el)el.scrollIntoView({behavior:'smooth',block:'center'});
}
/* Submits to a Netlify Form (declared as hidden HTML in index.html). Resolves true on success. */
function vedutaSubmitForm(name,fields){
const body=new URLSearchParams({'form-name':name,'bot-field':''});
Object.entries(fields||{}).forEach(([k,v])=>{if(v!==undefined&&v!==null)body.append(k,String(v));});
return fetch('/',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:body.toString()})
.then(r=>r.ok).catch(()=>false);
}
function vedutaSubmitEmail(email,source){
return vedutaSubmitForm(source==='register'?'register':'waitlist',{email,page:window.location.hash||'#home'});
}
/* Photo credit for a hero image, read from assets/cities/hero-credits.json. Renders nothing when there is no entry. */
function VCredit({id,style}){
const [c,setC]=React.useState(null);
React.useEffect(()=>{
fetch('assets/cities/hero-credits.json').then(r=>r.json()).then(j=>{
const x=j[id];
setC(x&&x.lic?('Photo: '+(x.artist||'Wikimedia Commons')+' · '+x.lic):null);
}).catch(()=>{});
},[id]);
if(!c)return null;
return
{c}
;
}
function VUpsell({tier,name,line,cta='See Membership',onNavigate,style}){
const {Button}=window.VedutaDesignSystem_f6874f;
return