﻿import { useState, useEffect, useRef, useCallback, useMemo, useReducer } from "react";

/* ═══════════════════════════════════════════════════════════════════════════
   ROAMROUTE V1 — AI-POWERED TRAVEL PLANNER
   Smart Itineraries · Multi-city · Visa Checker · Budget Tracker
   Packing Lists · Weather Forecasts · Plan Comparison · PDF Export
   Social Sharing · Personalized AI · PWA · Team Collaboration · Debrief
   ═══════════════════════════════════════════════════════════════════════════ */

// ── TOKENS ────────────────────────────────────────────────────────────────────
const T = {
  gold:"#C9A96E", goldLight:"#EDD9A3", goldDark:"#A07840",
  bg:"#0D9488", bgCard:"#FFFFFF", bgCardHov:"rgba(201,169,110,0.08)",
  bgModal:"#FFFFFF", border:"rgba(201,169,110,0.35)", borderSub:"rgba(255,255,255,0.15)",
  text:"#FFFFFF", muted:"rgba(255,255,255,0.72)", faint:"rgba(255,255,255,0.45)",
  err:"#FFB3B3", ok:"#A7F3D0", warn:"#FDE68A",
  fd:"'Playfair Display',serif", fb:"'DM Sans',sans-serif",
  r:"14px", rs:"8px",
  tb:"all 0.22s cubic-bezier(0.4,0,0.2,1)",
  ts:"all 0.36s cubic-bezier(0.34,1.56,0.64,1)",
};

// ── IMAGES ───────────────────────────────────────────────────────────────────
const IMGS = {
  paris:"https://images.unsplash.com/photo-1499856871958-5b9627545d1a?w=900&q=70",
  tokyo:"https://images.unsplash.com/photo-1540959733332-eab4deabeeaf?w=900&q=70",
  bali:"https://images.unsplash.com/photo-1537996194471-e657df975ab4?w=900&q=70",
  rome:"https://images.unsplash.com/photo-1552832230-c0197dd311b5?w=900&q=70",
  "new york":"https://images.unsplash.com/photo-1496442226666-8d4d0e62e6e9?w=900&q=70",
  london:"https://images.unsplash.com/photo-1513635269975-59663e0ac1ad?w=900&q=70",
  barcelona:"https://images.unsplash.com/photo-1583422409516-2895a77efded?w=900&q=70",
  maldives:"https://images.unsplash.com/photo-1573843981267-be1999ff37cd?w=900&q=70",
  dubai:"https://images.unsplash.com/photo-1512453979798-5ea266f8880c?w=900&q=70",
  santorini:"https://images.unsplash.com/photo-1570077188670-e3a8d69ac5ff?w=900&q=70",
  kyoto:"https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e?w=900&q=70",
  iceland:"https://images.unsplash.com/photo-1476610182048-b716b8518aae?w=900&q=70",
  morocco:"https://images.unsplash.com/photo-1489749798305-4fea3ae63d43?w=900&q=70",
  amsterdam:"https://images.unsplash.com/photo-1512470876302-972faa2aa9a4?w=900&q=70",
  thailand:"https://images.unsplash.com/photo-1528360983277-13d401cdc186?w=900&q=70",
  singapore:"https://images.unsplash.com/photo-1525625293386-3f8f99389edd?w=900&q=70",
  default:"https://images.unsplash.com/photo-1469854523086-cc02fe5d8800?w=900&q=70",
};
const getImg = d => { const k = (d||"").toLowerCase(); for(const[n,v] of Object.entries(IMGS)) if(k.includes(n)) return v; return IMGS.default; };

const POPULAR = [
  {name:"Paris",flag:"🇫🇷"},{name:"Tokyo",flag:"🇯🇵"},{name:"Bali",flag:"🇮🇩"},
  {name:"New York",flag:"🇺🇸"},{name:"Santorini",flag:"🇬🇷"},{name:"Dubai",flag:"🇦🇪"},
  {name:"Kyoto",flag:"🇯🇵"},{name:"Maldives",flag:"🇲🇻"},{name:"Barcelona",flag:"🇪🇸"},
  {name:"Amsterdam",flag:"🇳🇱"},{name:"Morocco",flag:"🇲🇦"},{name:"Thailand",flag:"🇹🇭"},
];

const OPT = {
  budget:[{v:"Budget",e:"💸"},{v:"Mid-range",e:"🏨"},{v:"Luxury",e:"✨"},{v:"Ultra-luxury",e:"💎"}],
  pace:[{v:"Relaxed",e:"🌿"},{v:"Balanced",e:"⚖️"},{v:"Action-packed",e:"🏃"}],
  interests:[
    {v:"History & Culture",e:"🏛️"},{v:"Food & Dining",e:"🍽️"},{v:"Adventure",e:"🧗"},
    {v:"Nature",e:"🌲"},{v:"Shopping",e:"🛍️"},{v:"Nightlife",e:"🎶"},
    {v:"Wellness & Spa",e:"🧘"},{v:"Art & Museums",e:"🖼️"},{v:"Photography",e:"📸"},{v:"Beach & Water",e:"🏖️"},
  ],
  accommodation:[{v:"Hotel",e:"🏩"},{v:"Boutique",e:"🏡"},{v:"Resort",e:"🏖️"},{v:"Airbnb",e:"🏠"}],
  dietary:[{v:"No restrictions",e:"🍴"},{v:"Vegetarian",e:"🥦"},{v:"Vegan",e:"🌱"},{v:"Halal",e:"🕌"},{v:"Gluten-Free",e:"🌾"}],
  style:[{v:"Solo explorer",e:"🎒"},{v:"Romantic",e:"💑"},{v:"Family fun",e:"👨‍👩‍👧"},{v:"Friend group",e:"🎉"},{v:"Business+leisure",e:"💼"},{v:"Adventure seeker",e:"🏔️"}],
};

const PLANS = {
  free:{name:"Explorer",price:0,limit:1,color:T.muted,features:["1 plan/month","Basic itinerary","AI suggestions"]},
  pro:{name:"Voyager",price:19,limit:999,color:T.gold,features:["Unlimited plans","Full day-by-day","PDF & email export","Saved trips","Weather forecasts","Refinement chat","Multi-city trips","Plan comparison"]},
  elite:{name:"Concierge",price:49,limit:999,color:T.goldLight,features:["Everything in Pro","Priority AI","Visa checker","Collaboration links","Budget tracker","Packing lists","Post-trip debrief","White-glove support"]},
};

// ── CSS ───────────────────────────────────────────────────────────────────────
const CSS = `
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,700;1,400;1,600&family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600&display=swap');
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent;}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;}
body{background:#0D9488;color:#FFFFFF;font-family:'DM Sans',sans-serif;overscroll-behavior:none;font-size:17px;font-weight:500;}
button,input,textarea,select{font-family:inherit;-webkit-appearance:none;appearance:none;}
button{cursor:pointer;border:none;background:none;color:inherit;}
input,textarea{outline:none;border:none;}
a{color:inherit;text-decoration:none;}
img{display:block;max-width:100%;}
::-webkit-scrollbar{width:3px;height:3px;}
::-webkit-scrollbar-thumb{background:rgba(201,169,110,0.4);border-radius:2px;}
input::placeholder,textarea::placeholder{color:rgba(255,255,255,0.35);}
.gold{background:linear-gradient(135deg,#C9A96E,#EDD9A3,#C9A96E);background-size:200%;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}
.ms{color:#065F5A!important;}
.gc,.gc *{color:#C9A96E!important;}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}
.safe-bot{padding-bottom:max(16px,env(safe-area-inset-bottom));}
.safe-top{padding-top:max(0px,env(safe-area-inset-top));}
.ripple-wrap{position:relative;overflow:hidden;}
@keyframes fadeUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes slideUp{from{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}
@keyframes slideR{from{opacity:0;transform:translateX(-16px)}to{opacity:1;transform:translateX(0)}}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes shimmer{0%{background-position:200% center}100%{background-position:-200% center}}
@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
@keyframes twinkle{0%,100%{opacity:.1}50%{opacity:.55}}
@keyframes ripple{to{transform:scale(4);opacity:0}}
@keyframes scaleIn{from{opacity:0;transform:scale(0.95)}to{opacity:1;transform:scale(1)}}
@keyframes boardingPulse{0%,100%{box-shadow:0 0 0 0 rgba(201,169,110,0.5)}70%{box-shadow:0 0 0 10px rgba(201,169,110,0)}}
.pe{animation:fadeUp 0.36s cubic-bezier(0.4,0,0.2,1) both;}
.se{animation:slideR 0.26s cubic-bezier(0.4,0,0.2,1) both;}
.ske{background:linear-gradient(90deg,rgba(0,0,0,0.12) 25%,rgba(255,255,255,0.1) 50%,rgba(0,0,0,0.12) 75%);background-size:200% 100%;animation:shimmer 1.5s ease infinite;}
:focus-visible{outline:2px solid rgba(201,169,110,0.8);outline-offset:3px;border-radius:6px;}
`;

// ── HOOKS ─────────────────────────────────────────────────────────────────────
function useLS(k, init) {
  const [v,sv] = useState(()=>{try{const s=localStorage.getItem(k);return s?JSON.parse(s):init;}catch{return init;}});
  useEffect(()=>{try{localStorage.setItem(k,JSON.stringify(v));}catch{}},[k,v]);
  return [v,sv];
}
function useMQ(q){const[m,sm]=useState(()=>typeof window!=="undefined"?window.matchMedia(q).matches:false);useEffect(()=>{const mq=window.matchMedia(q);const h=e=>sm(e.matches);mq.addEventListener("change",h);return()=>mq.removeEventListener("change",h);},[q]);return m;}
function useHaptic(){return useCallback((t="light")=>{if(navigator.vibrate)navigator.vibrate(t==="light"?10:t==="medium"?25:50);},[]);}
function useRipple(ref){return useCallback((e)=>{if(!ref.current)return;const rect=ref.current.getBoundingClientRect();const r=document.createElement("span");const sz=Math.max(rect.width,rect.height);const x=(e.clientX||e.touches?.[0]?.clientX||rect.left+rect.width/2)-rect.left-sz/2;const y=(e.clientY||e.touches?.[0]?.clientY||rect.top+rect.height/2)-rect.top-sz/2;Object.assign(r.style,{position:"absolute",width:sz+"px",height:sz+"px",left:x+"px",top:y+"px",borderRadius:"50%",background:"rgba(201,169,110,0.22)",transform:"scale(0)",animation:"ripple 0.55s linear",pointerEvents:"none"});ref.current.appendChild(r);setTimeout(()=>r.remove(),600);},[ref]);}

function useToast(){
  const[ts,sts]=useState([]);
  const show=useCallback((msg,type="info",dur=3200)=>{const id=Date.now();sts(t=>[...t,{id,msg,type}]);setTimeout(()=>sts(t=>t.filter(x=>x.id!==id)),dur);},[]);
  return{toasts:ts,show};
}

// ── AI CALL (Groq — free tier, no credit card required) ──────────────────────
async function ai(prompt, max=1000) {
  const key = import.meta.env.VITE_GROQ_API_KEY;
  if (!key) throw new Error("Add VITE_GROQ_API_KEY to your .env file. Get a free key at console.groq.com");
  const res = await fetch("https://api.groq.com/openai/v1/chat/completions", {
    method: "POST",
    headers: { "Content-Type": "application/json", "Authorization": `Bearer ${key}` },
    body: JSON.stringify({
      model: "llama-3.3-70b-versatile",
      max_tokens: max,
      temperature: 0.7,
      messages: [{ role: "user", content: prompt }]
    })
  });
  if (!res.ok) { const e = await res.json(); throw new Error(e.error?.message || `Groq error ${res.status}`); }
  const d = await res.json();
  return d.choices?.[0]?.message?.content || "";
}
async function aiJSON(prompt, max=1000) {
  const t = await ai(prompt, max);
  const clean = t.replace(/```json\n?|```\n?/g, "").trim();
  const match = clean.match(/\{[\s\S]*\}/);
  if (!match) throw new Error("No JSON in AI response");
  return JSON.parse(match[0]);
}

// ── SIMULATED BACKEND (localStorage as DB) ────────────────────────────────────
const DB = {
  getUsers: ()=>JSON.parse(localStorage.getItem("vg4_users")||"{}"),
  saveUsers: u=>localStorage.setItem("vg4_users",JSON.stringify(u)),
  getUser: email=>{const u=DB.getUsers();return u[email]||null;},
  upsertUser: (email,data)=>{const u=DB.getUsers();u[email]={...u[email],...data};DB.saveUsers(u);return u[email];},
  getTrips: ()=>JSON.parse(localStorage.getItem("vg4_trips")||"[]"),
  saveTrip: trip=>{const ts=DB.getTrips();const idx=ts.findIndex(t=>t.id===trip.id);if(idx>=0)ts[idx]=trip;else ts.unshift(trip);localStorage.setItem("vg4_trips",JSON.stringify(ts.slice(0,30)));},
  getUserTrips: email=>DB.getTrips().filter(t=>t.userEmail===email||!t.userEmail).slice(0,20),
  getSharedTrip: id=>DB.getTrips().find(t=>t.id===id)||null,
};

// ── STRIPE SIMULATION ─────────────────────────────────────────────────────────
async function simulateStripe(plan, user) {
  await new Promise(r=>setTimeout(r,1400));
  const updated = DB.upsertUser(user.email,{plan,stripeSubscribed:true,subscribedAt:Date.now()});
  return updated;
}

// ── EMAIL SIMULATION ──────────────────────────────────────────────────────────
async function sendItineraryEmail(email, plan, form) {
  await new Promise(r=>setTimeout(r,800));
  // In production: POST to /api/send-email with SendGrid/Resend
  console.log(`[EMAIL] Sent itinerary to ${email}:`, form.destination);
  return true;
}

// ── AFFILIATE LINKS ───────────────────────────────────────────────────────────
const aff = (dest,org)=>({
  flights:`https://www.skyscanner.com/flights/${encodeURIComponent(org)}/${encodeURIComponent(dest)}/`,
  hotel:`https://www.booking.com/searchresults.html?ss=${encodeURIComponent(dest)}`,
  car:`https://www.rentalcars.com/?country=${encodeURIComponent(dest)}`,
  activities:`https://www.viator.com/searchResults/all?text=${encodeURIComponent(dest)}`,
  insurance:`https://www.worldnomads.com/`,
  transfers:`https://www.kiwitaxi.com/?destination=${encodeURIComponent(dest)}`,
});

// ── STARS ─────────────────────────────────────────────────────────────────────
function Stars(){
  const s=useMemo(()=>Array.from({length:55},()=>({top:Math.random()*100,left:Math.random()*100,sz:Math.random()*1.6+0.4,del:Math.random()*8,dur:Math.random()*4+3})),[]);
  return(<div aria-hidden style={{position:"fixed",inset:0,pointerEvents:"none",zIndex:0,overflow:"hidden"}}>{s.map((x,i)=><div key={i} style={{position:"absolute",top:x.top+"%",left:x.left+"%",width:x.sz,height:x.sz,borderRadius:"50%",background:`rgba(255,255,255,${Math.random()*0.3+0.08})`,animation:`twinkle ${x.dur}s ease-in-out ${x.del}s infinite`}}/>)}</div>);
}

// ── TOAST ─────────────────────────────────────────────────────────────────────
function Toast({toasts}){
  return(<div style={{position:"fixed",bottom:88,left:"50%",transform:"translateX(-50%)",zIndex:9999,display:"flex",flexDirection:"column",gap:8,alignItems:"center",width:"calc(100% - 32px)",maxWidth:420,pointerEvents:"none"}}>
    {toasts.map(t=>(
      <div key={t.id} style={{background:"rgba(255,255,255,0.96)",border:`1px solid ${t.type==="error"?T.err:t.type==="success"?T.ok:t.type==="warn"?T.warn:T.border}`,borderRadius:10,padding:"11px 18px",fontSize:15,color:"#065F5A",animation:"slideUp 0.3s ease both",backdropFilter:"blur(20px)",display:"flex",gap:9,alignItems:"center",boxShadow:T.shadow}}>
        <span>{t.type==="error"?"⚠️":t.type==="success"?"✓":t.type==="warn"?"⚡":"✦"}</span>{t.msg}
      </div>
    ))}
  </div>);
}

// ── ATOMS ─────────────────────────────────────────────────────────────────────
function G({children,sz}){return <span className="gold" style={sz?{fontSize:sz}:{}}>{children}</span>;}
function Ske({w="100%",h=16,r=6,mb=0}){return <div className="ske" style={{width:w,height:h,borderRadius:r,marginBottom:mb}}/>;}

function Btn({children,onClick,disabled,loading,variant="primary",size="lg",icon,full=true,style:sx={}}){
  const ref=useRef(); const rp=useRipple(ref); const hp=useHaptic();
  const ghost=variant==="ghost",sec=variant==="secondary",danger=variant==="danger";
  return(
    <button ref={ref} onClick={e=>{if(!disabled&&!loading){hp("medium");rp(e);onClick?.();}}} disabled={disabled||loading} aria-disabled={disabled||loading} aria-busy={loading}
      style={{position:"relative",overflow:"hidden",width:full?"100%":"auto",minHeight:size==="lg"?52:size==="md"?44:36,padding:size==="lg"?"0 28px":size==="md"?"0 20px":"0 14px",borderRadius:T.rs,border:ghost?`1.5px solid ${T.border}`:sec?`1.5px solid ${T.borderSub}`:danger?`1.5px solid ${T.err}40`:"none",background:ghost?"transparent":sec?"rgba(0,0,0,0.12)":danger?"rgba(224,112,112,0.12)":disabled?"rgba(201,169,110,0.1)":`linear-gradient(135deg,${T.gold} 0%,${T.goldLight} 50%,${T.gold} 100%)`,backgroundSize:"200%",color:ghost?T.gold:sec?T.muted:danger?T.err:disabled?"rgba(255,255,255,0.2)":"#FFFFFF",fontSize:size==="lg"?14:13,fontWeight:700,letterSpacing:"0.1em",textTransform:"uppercase",cursor:disabled||loading?"not-allowed":"pointer",opacity:disabled&&!loading?0.45:1,transition:T.tb,display:"flex",alignItems:"center",justifyContent:"center",gap:8,animation:loading?"shimmer 1.5s ease infinite":"none",touchAction:"manipulation",WebkitAppearance:"none",...sx}}>
      {loading?(<span style={{display:"flex",alignItems:"center",gap:9}}><span style={{width:15,height:15,border:"2px solid rgba(0,0,0,0.15)",borderTop:"2px solid rgba(0,0,0,0.6)",borderRadius:"50%",animation:"spin 0.7s linear infinite",display:"inline-block"}}/>Processing…</span>):(<>{icon&&<span>{icon}</span>}{children}</>)}
    </button>
  );
}

function Card({children,style:sx={},onClick,hov}){
  const[h,sh]=useState(false);
  return(<div className="ripple-wrap gc" onClick={onClick} onMouseEnter={()=>hov&&sh(true)} onMouseLeave={()=>hov&&sh(false)}
    style={{background:h?T.bgCardHov:T.bgCard,border:`1px solid ${h?T.border:"rgba(201,169,110,0.25)"}`,borderRadius:T.r,transition:T.tb,transform:h&&hov?"translateY(-2px)":"none",cursor:onClick?"pointer":"default",...sx}}>{children}</div>);
}

function Inp({label,value,onChange,placeholder,icon,hint,type="text",required,autoFocus,inputMode,multiline,rows=3}){
  const[f,sf]=useState(false);const ref=useRef();
  useEffect(()=>{if(autoFocus&&ref.current)setTimeout(()=>ref.current?.focus(),220);},[autoFocus]);
  const shared={ref,value,onChange:e=>onChange(e.target.value),placeholder,onFocus:()=>sf(true),onBlur:()=>sf(false),"aria-label":label||placeholder,style:{width:"100%",minHeight:multiline?undefined:52,padding:icon?"13px 16px 13px 46px":"13px 16px",background:f?"rgba(201,169,110,0.07)":"rgba(0,0,0,0.12)",border:`1.5px solid ${f?T.gold:T.borderSub}`,borderRadius:T.rs,color:T.text,fontSize:18,transition:T.tb,resize:multiline?"vertical":"none",lineHeight:1.6}};
  return(
    <div style={{marginBottom:20}}>
      {label&&<label style={{display:"flex",justifyContent:"space-between",fontSize:12,letterSpacing:"0.16em",textTransform:"uppercase",color:T.gold,marginBottom:9,fontFamily:T.fd}}>{label}{required&&<span style={{color:T.err,fontSize:11}}>REQUIRED</span>}</label>}
      <div style={{position:"relative"}}>
        {icon&&<span aria-hidden style={{position:"absolute",left:14,top:multiline?16:"50%",transform:multiline?"none":"translateY(-50%)",fontSize:19,pointerEvents:"none",opacity:f?1:0.55,transition:T.tb,zIndex:1}}>{icon}</span>}
        {multiline?<textarea {...shared} rows={rows}/>:<input {...shared} type={type} inputMode={inputMode}/>}
      </div>
      {hint&&<div style={{fontSize:13,color:T.faint,marginTop:5,paddingLeft:2}}>{hint}</div>}
    </div>
  );
}

function Chip({emoji,label,active,onClick,sm}){
  const ref=useRef();const rp=useRipple(ref);const hp=useHaptic();
  return(
    <button ref={ref} onClick={e=>{hp("light");rp(e);onClick();}} aria-pressed={active}
      style={{position:"relative",overflow:"hidden",display:"flex",alignItems:"center",gap:sm?5:7,padding:sm?"8px 13px":"10px 17px",minHeight:44,borderRadius:50,border:`1.5px solid ${active?T.gold:T.borderSub}`,background:active?"rgba(201,169,110,0.16)":"rgba(0,0,0,0.12)",color:active?T.goldLight:T.muted,fontSize:sm?12:14,fontWeight:active?500:400,transition:T.ts,transform:active?"scale(1.03)":"scale(1)",touchAction:"manipulation"}}>
      {emoji&&<span style={{fontSize:sm?13:15}}>{emoji}</span>}{label}
    </button>
  );
}

function Section({icon,title,children,sx={}}){
  return(<Card style={{padding:"20px",marginBottom:14,...sx}}>
    <div style={{display:"flex",alignItems:"center",gap:10,marginBottom:16}}>
      <span style={{fontSize:22,lineHeight:1}}>{icon}</span>
      <span style={{fontSize:12,letterSpacing:"0.2em",textTransform:"uppercase",color:T.gold,fontFamily:T.fd}}>{title}</span>
    </div>
    {children}
  </Card>);
}

function AffBtn({href,label,icon}){
  return(<a href={href} target="_blank" rel="noopener noreferrer"
    style={{display:"inline-flex",alignItems:"center",gap:7,padding:"9px 16px",minHeight:40,background:"rgba(201,169,110,0.1)",border:`1px solid ${T.border}`,borderRadius:T.rs,color:T.gold,fontSize:15,transition:T.tb,touchAction:"manipulation"}}
    onMouseEnter={e=>{e.currentTarget.style.background="rgba(201,169,110,0.2)";}}
    onMouseLeave={e=>{e.currentTarget.style.background="rgba(201,169,110,0.1)";}}>
    {icon} {label} <span style={{opacity:0.5}}>→</span>
  </a>);
}

// ── PROGRESS BAR ─────────────────────────────────────────────────────────────
function ProgBar({cur,total,labels}){
  const pct=Math.round((cur/total)*100);
  return(
    <div role="progressbar" aria-valuenow={pct} aria-valuemin={0} aria-valuemax={100} style={{marginBottom:26}}>
      <div style={{height:3,background:T.borderSub,borderRadius:3,overflow:"hidden"}}>
        <div style={{height:"100%",width:pct+"%",background:`linear-gradient(90deg,${T.gold},${T.goldLight})`,borderRadius:3,transition:"width 0.5s cubic-bezier(0.4,0,0.2,1)"}}/>
      </div>
      {labels&&<div style={{display:"flex",justifyContent:"space-between",marginTop:7}}>{labels.map((l,i)=><div key={i} style={{fontSize:11,color:i<cur?T.gold:T.faint,letterSpacing:"0.08em",transition:T.tb}}>{i<cur?"✓":i+1}</div>)}</div>}
    </div>
  );
}

// ── ONBOARDING QUIZ ───────────────────────────────────────────────────────────
const QUIZ = [
  {q:"What's your dream travel style?",opts:[{v:"Luxury & comfort",e:"💎"},{v:"Off the beaten path",e:"🗺️"},{v:"Cultural immersion",e:"🏛️"},{v:"Pure relaxation",e:"🌴"}],key:"style"},
  {q:"How do you like to explore?",opts:[{v:"Packed with activities",e:"🏃"},{v:"Slow & savoured",e:"🌿"},{v:"Mix of both",e:"⚖️"},{v:"Spontaneous",e:"🎲"}],key:"pace"},
  {q:"What excites you most?",opts:[{v:"World-class dining",e:"🍽️"},{v:"Historic landmarks",e:"🏛️"},{v:"Natural wonders",e:"🌋"},{v:"Hidden local gems",e:"💎"}],key:"interest"},
  {q:"Your ideal accommodation?",opts:[{v:"5-star hotel",e:"🏨"},{v:"Boutique charm",e:"🏡"},{v:"Luxury resort",e:"🏖️"},{v:"Local Airbnb",e:"🏠"}],key:"accommodation"},
  {q:"Typical travel budget?",opts:[{v:"Budget traveller",e:"💸"},{v:"Mid-range comfort",e:"🏨"},{v:"Luxury all the way",e:"✨"},{v:"Money is no object",e:"💎"}],key:"budget"},
];

function OnboardingQuiz({onComplete}){
  const[step,setStep]=useState(0);
  const[answers,setAnswers]=useState({});
  const hp=useHaptic();
  const pick=(key,val)=>{
    hp("light");
    const next={...answers,[key]:val};
    setAnswers(next);
    if(step<QUIZ.length-1)setTimeout(()=>setStep(s=>s+1),300);
    else onComplete(next);
  };
  const q=QUIZ[step];
  return(
    <div className="pe" style={{padding:"32px 0"}}>
      <div style={{textAlign:"center",marginBottom:32}}>
        <div style={{fontSize:12,color:T.gold,letterSpacing:"0.25em",marginBottom:12,fontFamily:T.fd}}>PERSONALIZING YOUR EXPERIENCE</div>
        <h2 style={{fontFamily:T.fd,fontSize:"clamp(22px,5vw,32px)",fontWeight:600,lineHeight:1.2,marginBottom:8}}>{q.q}</h2>
        <div style={{fontSize:15,color:T.faint}}>{step+1} of {QUIZ.length}</div>
      </div>
      <div style={{height:3,background:T.borderSub,borderRadius:3,marginBottom:32}}>
        <div style={{height:"100%",width:((step+1)/QUIZ.length*100)+"%",background:`linear-gradient(90deg,${T.gold},${T.goldLight})`,borderRadius:3,transition:"width 0.4s ease"}}/>
      </div>
      <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12}}>
        {q.opts.map(o=>(
          <button key={o.v} onClick={()=>pick(q.key,o.v)}
            style={{padding:"20px 16px",border:`1.5px solid ${answers[q.key]===o.v?T.gold:T.borderSub}`,borderRadius:T.r,background:answers[q.key]===o.v?"rgba(201,169,110,0.14)":"rgba(0,0,0,0.12)",color:answers[q.key]===o.v?T.goldLight:T.muted,display:"flex",flexDirection:"column",alignItems:"center",gap:10,minHeight:96,transition:T.ts,touchAction:"manipulation",transform:answers[q.key]===o.v?"scale(1.02)":"scale(1)"}}>
            <span style={{fontSize:30}}>{o.e}</span>
            <span style={{fontSize:15,textAlign:"center",lineHeight:1.4}}>{o.v}</span>
          </button>
        ))}
      </div>
    </div>
  );
}

// ── MULTI-CITY PLANNER ────────────────────────────────────────────────────────
function MultiCityBuilder({cities,onChange}){
  const add=()=>onChange([...cities,{city:"",nights:""}]);
  const upd=(i,k,v)=>onChange(cities.map((c,j)=>j===i?{...c,[k]:v}:c));
  const rem=(i)=>onChange(cities.filter((_,j)=>j!==i));
  return(
    <div>
      {cities.map((c,i)=>(
        <div key={i} style={{display:"flex",gap:8,marginBottom:10,alignItems:"flex-end"}}>
          <div style={{flex:2}}>
            <Inp label={i===0?"Origin":i===cities.length-1?"Final Destination":`City ${i+1}`} value={c.city} onChange={v=>upd(i,"city",v)} placeholder={i===0?"e.g. Toronto":"e.g. Tokyo"} icon={i===0?"📍":"🌍"}/>
          </div>
          {i>0&&i<cities.length-1&&(
            <div style={{flex:1}}>
              <Inp label="Nights" value={c.nights} onChange={v=>upd(i,"nights",v)} placeholder="3" inputMode="numeric"/>
            </div>
          )}
          {cities.length>2&&i>0&&i<cities.length-1&&(
            <button onClick={()=>rem(i)} style={{minHeight:52,padding:"0 12px",border:`1px solid ${T.err}40`,borderRadius:T.rs,color:T.err,fontSize:20,marginBottom:20,flexShrink:0,touchAction:"manipulation"}}>×</button>
          )}
        </div>
      ))}
      <button onClick={add} style={{width:"100%",padding:"12px",border:`1.5px dashed ${T.border}`,borderRadius:T.rs,color:T.gold,fontSize:15,display:"flex",alignItems:"center",justifyContent:"center",gap:8,minHeight:44,touchAction:"manipulation",transition:T.tb}}
        onMouseEnter={e=>{e.target.style.background="rgba(201,169,110,0.06)";}} onMouseLeave={e=>{e.target.style.background="transparent";}}>
        + Add Stop
      </button>
    </div>
  );
}

// ── VISA CHECKER ──────────────────────────────────────────────────────────────
function VisaChecker({destination,passport}){
  const[data,setData]=useState(null);const[loading,setLoading]=useState(true);
  useEffect(()=>{
    if(!destination||!passport){setLoading(false);return;}
    let cancelled=false;
    (async()=>{
      try{
        const r=await aiJSON(`Visa requirements for a ${passport} passport holder visiting ${destination}. Return ONLY JSON: {"required":true/false,"type":"visa on arrival/e-visa/no visa/visa required","cost":"$0-$100","processing":"immediate/1-3 days/2-4 weeks","duration":"30 days/90 days etc","notes":"key requirement","link":"official embassy URL","entry_requirements":["req1","req2","req3"]}`);
        if(!cancelled)setData(r);
      }catch{if(!cancelled)setData({required:false,type:"Check official sources",cost:"Varies",processing:"Varies",duration:"Varies",notes:"Always verify with your country's embassy before travel",link:"https://www.iatatravelcentre.com/",entry_requirements:["Valid passport (6+ months validity)","Return/onward ticket","Proof of accommodation","Sufficient funds"]});}
      if(!cancelled)setLoading(false);
    })();
    return()=>{cancelled=true;};
  },[destination,passport]);
  if(loading)return(<div style={{display:"flex",flexDirection:"column",gap:8}}><Ske h={20} mb={8}/><Ske w="70%" h={16} mb={6}/><Ske w="50%" h={14}/></div>);
  if(!data)return null;
  const ok=!data.required||data.type==="visa on arrival"||data.type==="no visa";
  return(
    <div>
      <div style={{display:"flex",alignItems:"center",gap:12,marginBottom:14,padding:"12px 14px",background:`rgba(${ok?"110,201,154":"224,112,112"},0.1)`,borderRadius:T.rs,border:`1px solid rgba(${ok?"110,201,154":"224,112,112"},0.25)`}}>
        <span style={{fontSize:26}}>{ok?"✅":"🔴"}</span>
        <div>
          <div style={{fontSize:16,fontWeight:700,color:ok?T.ok:T.err,marginBottom:2}}>{data.type?.toUpperCase()}</div>
          <div style={{fontSize:14,color:T.muted}}>Cost: {data.cost} · Processing: {data.processing} · Stay: {data.duration}</div>
        </div>
      </div>
      <div style={{fontSize:15,color:T.muted,marginBottom:10,fontStyle:"italic"}}>ℹ️ {data.notes}</div>
      <div style={{display:"flex",flexDirection:"column",gap:5}}>
        {data.entry_requirements?.map((r,i)=><div key={i} style={{fontSize:14,color:T.faint,display:"flex",gap:8}}><span style={{color:T.gold}}>✦</span>{r}</div>)}
      </div>
      {data.link&&<div style={{marginTop:12}}><AffBtn href={data.link} label="Official Requirements" icon="🔗"/></div>}
    </div>
  );
}

// ── PACKING LIST ──────────────────────────────────────────────────────────────
function PackingList({destination,duration,travelers,interests,weather}){
  const[items,setItems]=useState(null);const[loading,setLoading]=useState(true);
  const[checked,setChecked]=useLS(`packing_${destination}`,[]);
  useEffect(()=>{
    let cancelled=false;
    (async()=>{
      try{
        const r=await aiJSON(`Generate a smart packing list for ${travelers} visiting ${destination} for ${duration} days. Interests: ${interests?.join(", ")||"general"}. Weather: ${weather||"temperate"}. Return ONLY JSON: {"categories":[{"name":"Clothing","icon":"👕","items":["item1","item2"]},{"name":"Documents","icon":"📄","items":["item1"]},{"name":"Health & Safety","icon":"🏥","items":[]},{"name":"Electronics","icon":"💻","items":[]},{"name":"Toiletries","icon":"🧴","items":[]},{"name":"Destination Specific","icon":"🌍","items":[]}]}`);
        if(!cancelled)setItems(r.categories);
      }catch{if(!cancelled)setItems([{name:"Essentials",icon:"✦",items:["Valid passport","Travel insurance","Hotel booking confirmations","Credit/debit cards","Local currency","Phone charger","Adapter","Medications","Sunscreen","Comfortable walking shoes"]}]);}
      if(!cancelled)setLoading(false);
    })();
    return()=>{cancelled=true;};
  },[]);
  const toggle=(item)=>setChecked(c=>c.includes(item)?c.filter(x=>x!==item):[...c,item]);
  const totalItems=items?.flatMap(c=>c.items).length||0;
  const packedItems=checked.length;
  if(loading)return(<div>{[1,2,3].map(i=><div key={i} style={{marginBottom:16}}><Ske w="40%" h={14} mb={8}/><Ske h={12} mb={6}/><Ske w="80%" h={12} mb={6}/><Ske w="60%" h={12}/></div>)}</div>);
  return(
    <div>
      <div style={{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:16,padding:"10px 14px",background:"rgba(201,169,110,0.07)",borderRadius:T.rs}}>
        <span style={{fontSize:15,color:T.muted}}>Packing progress</span>
        <span style={{fontSize:15,color:T.gold,fontWeight:700}}>{packedItems}/{totalItems} items</span>
      </div>
      <div style={{height:4,background:T.borderSub,borderRadius:2,marginBottom:20,overflow:"hidden"}}>
        <div style={{height:"100%",width:totalItems?`${(packedItems/totalItems)*100}%`:"0%",background:`linear-gradient(90deg,${T.gold},${T.goldLight})`,transition:"width 0.4s ease",borderRadius:2}}/>
      </div>
      {items?.map(cat=>(
        <div key={cat.name} style={{marginBottom:18}}>
          <div style={{fontSize:13,color:T.gold,letterSpacing:"0.15em",marginBottom:10,display:"flex",gap:7,alignItems:"center"}}><span>{cat.icon}</span>{cat.name.toUpperCase()}</div>
          <div style={{display:"flex",flexDirection:"column",gap:0}}>
            {cat.items.map(item=>(
              <label key={item} style={{display:"flex",gap:12,alignItems:"center",padding:"9px 0",borderBottom:`1px solid ${T.borderSub}`,cursor:"pointer",touchAction:"manipulation"}}>
                <div style={{width:20,height:20,borderRadius:4,border:`1.5px solid ${checked.includes(item)?T.gold:T.borderSub}`,background:checked.includes(item)?"rgba(201,169,110,0.2)":"transparent",flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center",transition:T.tb}}>
                  {checked.includes(item)&&<span style={{color:T.gold,fontSize:13}}>✓</span>}
                </div>
                <input type="checkbox" checked={checked.includes(item)} onChange={()=>toggle(item)} className="sr-only"/>
                <span style={{fontSize:15,color:checked.includes(item)?T.faint:T.muted,textDecoration:checked.includes(item)?"line-through":"none",transition:T.tb}}>{item}</span>
              </label>
            ))}
          </div>
        </div>
      ))}
    </div>
  );
}

// ── BUDGET TRACKER ────────────────────────────────────────────────────────────
function BudgetTracker({tripId,estimated}){
  const[entries,setEntries]=useLS(`budget_${tripId}`,[]);
  const[form,setForm]=useState({category:"Food & Dining",amount:"",note:"",date:new Date().toISOString().split("T")[0]});
  const[adding,setAdding]=useState(false);
  const cats=["Flights","Accommodation","Food & Dining","Activities","Transport","Shopping","Other"];
  const totalEst=Object.values(estimated||{}).reduce((sum,v)=>sum+parseFloat(v?.replace(/[^0-9.]/g,"")||0),0);
  const totalSpent=entries.reduce((s,e)=>s+parseFloat(e.amount||0),0);
  const pct=totalEst>0?Math.min((totalSpent/totalEst)*100,100):0;
  const over=totalSpent>totalEst;
  const byCat=cats.map(c=>({cat:c,spent:entries.filter(e=>e.category===c).reduce((s,e)=>s+parseFloat(e.amount||0),0)})).filter(x=>x.spent>0);
  const addEntry=()=>{
    if(!form.amount)return;
    setEntries(e=>[{...form,id:Date.now()},...e]);
    setForm(f=>({...f,amount:"",note:""}));
    setAdding(false);
  };
  return(
    <div>
      <div style={{marginBottom:16}}>
        <div style={{display:"flex",justifyContent:"space-between",marginBottom:8}}>
          <span style={{fontSize:15,color:T.muted}}>Spent vs Estimated</span>
          <span style={{fontSize:15,color:over?T.err:T.ok,fontWeight:700}}>{over?"Over budget":"On track"}</span>
        </div>
        <div style={{height:8,background:T.borderSub,borderRadius:4,overflow:"hidden",marginBottom:8}}>
          <div style={{height:"100%",width:pct+"%",background:`linear-gradient(90deg,${over?T.err:T.ok},${over?"#FF9090":"#90EFB5"})`,transition:"width 0.5s ease",borderRadius:4}}/>
        </div>
        <div style={{display:"flex",justifyContent:"space-between",fontSize:14,color:T.faint}}>
          <span>Spent: <span style={{color:T.text,fontWeight:700}}>${totalSpent.toFixed(0)}</span></span>
          <span>Estimated: <span style={{color:T.text,fontWeight:700}}>${totalEst.toFixed(0)}</span></span>
        </div>
      </div>
      {byCat.length>0&&(
        <div style={{marginBottom:16,display:"flex",flexDirection:"column",gap:6}}>
          {byCat.map(({cat,spent})=>(
            <div key={cat} style={{display:"flex",justifyContent:"space-between",padding:"7px 0",borderBottom:`1px solid ${T.borderSub}`,fontSize:15}}>
              <span style={{color:T.muted}}>{cat}</span>
              <span style={{color:T.text}}>${spent.toFixed(0)}</span>
            </div>
          ))}
        </div>
      )}
      {adding?(
        <div style={{padding:"16px",background:"rgba(0,0,0,0.12)",borderRadius:T.rs,border:`1px solid ${T.borderSub}`,marginBottom:12}}>
          <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8,marginBottom:8}}>
            <select value={form.category} onChange={e=>setForm(f=>({...f,category:e.target.value}))} style={{background:"rgba(0,0,0,0.12)",border:`1px solid ${T.borderSub}`,borderRadius:T.rs,padding:"10px 12px",color:T.text,fontSize:15,minHeight:44}}>
              {cats.map(c=><option key={c} value={c}>{c}</option>)}
            </select>
            <Inp value={form.amount} onChange={v=>setForm(f=>({...f,amount:v}))} placeholder="Amount $" inputMode="decimal"/>
          </div>
          <Inp value={form.note} onChange={v=>setForm(f=>({...f,note:v}))} placeholder="Note (optional)" icon="📝"/>
          <div style={{display:"flex",gap:8}}>
            <Btn onClick={addEntry} size="md">Add Expense</Btn>
            <Btn onClick={()=>setAdding(false)} size="md" variant="ghost" full={false}>Cancel</Btn>
          </div>
        </div>
      ):(
        <Btn onClick={()=>setAdding(true)} size="md" variant="secondary" icon="＋">Log Expense</Btn>
      )}
      {entries.slice(0,5).map(e=>(
        <div key={e.id} style={{display:"flex",justifyContent:"space-between",padding:"8px 0",borderBottom:`1px solid ${T.borderSub}`,fontSize:14}}>
          <div><span style={{color:T.muted}}>{e.category}</span>{e.note&&<span style={{color:T.faint}}> · {e.note}</span>}</div>
          <span style={{color:T.text,fontWeight:600}}>${parseFloat(e.amount).toFixed(0)}</span>
        </div>
      ))}
    </div>
  );
}

// ── PLAN COMPARISON ───────────────────────────────────────────────────────────
function PlanComparison({plans,form,onSelect}){
  const[active,setActive]=useState(0);
  if(!plans||!plans.length)return null;
  const p=plans[active];
  return(
    <div>
      <div style={{display:"flex",gap:8,marginBottom:20}}>
        {plans.map((pl,i)=>(
          <button key={i} onClick={()=>setActive(i)}
            style={{flex:1,padding:"12px 8px",border:`1.5px solid ${active===i?T.gold:T.borderSub}`,borderRadius:T.rs,background:active===i?"rgba(201,169,110,0.14)":"rgba(0,0,0,0.12)",color:active===i?T.goldLight:T.muted,fontSize:14,fontWeight:active===i?600:400,transition:T.tb,minHeight:52,touchAction:"manipulation"}}>
            <div style={{fontFamily:T.fd,fontSize:16}}>{pl.variant}</div>
            <div style={{fontSize:13,color:active===i?T.gold:T.faint,marginTop:3}}>{pl.budget_breakdown?.total||"See plan"}</div>
          </button>
        ))}
      </div>
      <div style={{padding:"14px",background:"rgba(201,169,110,0.06)",borderRadius:T.rs,marginBottom:14}}>
        <div style={{fontFamily:T.fd,fontSize:17,color:T.text,marginBottom:6,fontStyle:"italic"}}>"{p.summary}"</div>
        <div style={{display:"flex",gap:12,flexWrap:"wrap"}}>
          {p.highlights?.map((h,i)=><span key={i} style={{fontSize:14,color:T.gold}}>✦ {h}</span>)}
        </div>
      </div>
      <Btn onClick={()=>onSelect(p)} icon="✦">Use This Plan</Btn>
    </div>
  );
}

// ── POST-TRIP DEBRIEF ─────────────────────────────────────────────────────────
function PostTripDebrief({trip,onSave}){
  const[step,setStep]=useState(0);
  const[data,setData]=useState({rating:0,highlights:"",lowlights:"",actualBudget:"",wouldReturn:"",recommendations:"",photos:[]});
  const[insights,setInsights]=useState(null);const[loading,setLoading]=useState(false);const[done,setDone]=useState(false);
  const hp=useHaptic();
  const submit=async()=>{
    setLoading(true);
    try{
      const ins=await aiJSON(`A traveller just returned from ${trip?.form?.destination} (${trip?.form?.duration} days, ${trip?.form?.travelers}). Their debrief: Rating ${data.rating}/5. Highlights: ${data.highlights}. Issues: ${data.lowlights}. Actual budget: ${data.actualBudget}. Would return: ${data.wouldReturn}. Return ONLY JSON: {"insights":["insight1","insight2","insight3"],"next_trips":["destination1","destination2","destination3"],"profile_updates":["update1","update2"],"accuracy_score":"85%","money_tips":["tip1","tip2"]}`);
      setInsights(ins);
    }catch{setInsights({insights:["Your preferences have been saved","We'll improve your next recommendation","Thank you for the feedback"],next_trips:["Kyoto, Japan","Amalfi Coast, Italy","Chiang Mai, Thailand"],profile_updates:["Updated budget preference","Added interest in local cuisine"],accuracy_score:"82%",money_tips:["Book flights 6-8 weeks ahead","Use a travel credit card for rewards"]});}
    setLoading(false);
    onSave({...trip,debrief:data,debriefAt:Date.now()});
    setDone(true);
  };
  if(done&&insights)return(
    <div className="pe">
      <div style={{fontSize:26,textAlign:"center",marginBottom:16}}>🎉</div>
      <div style={{textAlign:"center",marginBottom:20}}>
        <div style={{fontFamily:T.fd,fontSize:22,marginBottom:6}}>Trip Analysed!</div>
        <div style={{fontSize:15,color:T.muted}}>Plan accuracy: <span style={{color:T.ok,fontWeight:700}}>{insights.accuracy_score}</span></div>
      </div>
      <div style={{marginBottom:16}}>
        <div style={{fontSize:12,color:T.gold,letterSpacing:"0.15em",marginBottom:10}}>INSIGHTS FROM YOUR TRIP</div>
        {insights.insights?.map((ins,i)=><div key={i} style={{fontSize:15,color:T.muted,padding:"7px 0",borderBottom:`1px solid ${T.borderSub}`,display:"flex",gap:9}}><span style={{color:T.gold}}>✦</span>{ins}</div>)}
      </div>
      <div style={{marginBottom:16}}>
        <div style={{fontSize:12,color:T.gold,letterSpacing:"0.15em",marginBottom:10}}>YOU MIGHT LOVE NEXT</div>
        <div style={{display:"flex",gap:8,flexWrap:"wrap"}}>
          {insights.next_trips?.map((d,i)=><span key={i} style={{fontSize:15,padding:"7px 14px",background:"rgba(201,169,110,0.1)",border:`1px solid ${T.border}`,borderRadius:50,color:T.goldLight}}>✈️ {d}</span>)}
        </div>
      </div>
    </div>
  );
  const steps=[
    <div className="se" key="s0">
      <div style={{fontSize:13,color:T.gold,letterSpacing:"0.15em",marginBottom:16}}>HOW WAS THE TRIP?</div>
      <div style={{display:"flex",gap:8,marginBottom:20}}>
        {[1,2,3,4,5].map(s=>(
          <button key={s} onClick={()=>{hp("light");setData(d=>({...d,rating:s}));}} aria-label={`Rate ${s} stars`}
            style={{fontSize:34,background:"none",border:"none",minWidth:44,minHeight:44,touchAction:"manipulation",filter:s<=(data.rating)?("none"):"grayscale(1) opacity(0.3)",transition:T.ts,transform:s<=(data.rating)?"scale(1.2)":"scale(1)"}}>⭐</button>
        ))}
      </div>
      <Inp label="Trip highlights" value={data.highlights} onChange={v=>setData(d=>({...d,highlights:v}))} placeholder="What was the best part?" icon="✨" multiline rows={2}/>
    </div>,
    <div className="se" key="s1">
      <Inp label="What could have been better?" value={data.lowlights} onChange={v=>setData(d=>({...d,lowlights:v}))} placeholder="Any disappointments or things to improve?" icon="🔍" multiline rows={2}/>
      <Inp label="Actual total spend" value={data.actualBudget} onChange={v=>setData(d=>({...d,actualBudget:v}))} placeholder="e.g. $2,400" icon="💰" inputMode="decimal"/>
    </div>,
    <div className="se" key="s2">
      <div style={{fontSize:13,color:T.gold,letterSpacing:"0.15em",marginBottom:12}}>WOULD YOU RETURN?</div>
      <div style={{display:"flex",gap:10,marginBottom:20,flexWrap:"wrap"}}>
        {["Definitely!","Probably","Not sure","Unlikely"].map(v=>(
          <Chip key={v} label={v} active={data.wouldReturn===v} onClick={()=>{hp("light");setData(d=>({...d,wouldReturn:v}));}} sm/>
        ))}
      </div>
      <Inp label="Recommendations for others?" value={data.recommendations} onChange={v=>setData(d=>({...d,recommendations:v}))} placeholder="What would you tell a friend going?" icon="💬" multiline rows={2}/>
    </div>,
  ];
  return(
    <div>
      {steps[step]}
      <div style={{display:"flex",gap:8,marginTop:20}}>
        {step>0&&<Btn onClick={()=>setStep(s=>s-1)} size="md" variant="ghost" full={false}>← Back</Btn>}
        {step<steps.length-1?<Btn onClick={()=>setStep(s=>s+1)} size="md" disabled={step===0&&!data.rating}>Next →</Btn>:<Btn onClick={submit} loading={loading}>Submit Debrief ✦</Btn>}
      </div>
    </div>
  );
}

// ── SOCIAL SHARE CARD ─────────────────────────────────────────────────────────
function BoardingPassCard({plan,form,user}){
  const ref=useRef();const[copied,setCopied]=useState(false);
  const shareText=`✈️ ${form.origin} → ${form.destination}\n${form.duration} days · ${form.travelers}\n"${plan?.tagline||plan?.summary?.slice(0,80)}"\n\nPlanned by RoamRoute 🌍`;
  const copy=()=>{navigator.clipboard?.writeText(shareText);setCopied(true);setTimeout(()=>setCopied(false),2500);};
  const share=()=>{if(navigator.share)navigator.share({title:`My ${form.destination} Trip`,text:shareText});else copy();};
  return(
    <div>
      <div ref={ref} style={{background:"linear-gradient(135deg,#08655E 0%,#0A7A72 50%,#08655E 100%)",border:`1px solid ${T.border}`,borderRadius:T.r,padding:"24px 22px",marginBottom:16,position:"relative",overflow:"hidden",animation:"boardingPulse 3s ease-in-out infinite"}}>
        <div aria-hidden style={{position:"absolute",top:-20,right:-20,width:120,height:120,borderRadius:"50%",border:`1px solid ${T.border}`,opacity:0.3}}/>
        <div aria-hidden style={{position:"absolute",bottom:-30,left:-30,width:100,height:100,borderRadius:"50%",border:`1px solid ${T.border}`,opacity:0.2}}/>
        <div style={{fontSize:11,letterSpacing:"0.3em",color:T.gold,marginBottom:16,fontFamily:T.fd}}>✦ ROAMROUTE · BOARDING PASS</div>
        <div style={{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:20}}>
          <div>
            <div style={{fontFamily:T.fd,fontSize:"clamp(28px,8vw,48px)",fontWeight:700,lineHeight:0.9,color:T.text}}>{form.origin?.slice(0,3).toUpperCase()}</div>
            <div style={{fontSize:13,color:T.muted,marginTop:4}}>{form.origin}</div>
          </div>
          <div style={{textAlign:"center",flex:1,padding:"0 16px"}}>
            <div style={{fontSize:22,marginBottom:4,animation:"float 2s ease-in-out infinite"}}>✈️</div>
            <div style={{height:1,background:`linear-gradient(90deg,transparent,${T.gold},transparent)`}}/>
            <div style={{fontSize:12,color:T.gold,marginTop:4,letterSpacing:"0.15em"}}>{form.duration} DAYS</div>
          </div>
          <div style={{textAlign:"right"}}>
            <div style={{fontFamily:T.fd,fontSize:"clamp(28px,8vw,48px)",fontWeight:700,lineHeight:0.9,color:T.text}}>{form.destination?.slice(0,3).toUpperCase()}</div>
            <div style={{fontSize:13,color:T.muted,marginTop:4}}>{form.destination}</div>
          </div>
        </div>
        <div style={{borderTop:`1px dashed rgba(201,169,110,0.3)`,paddingTop:16,display:"flex",justifyContent:"space-between"}}>
          <div><div style={{fontSize:11,color:T.faint,letterSpacing:"0.12em",marginBottom:3}}>PASSENGER</div><div style={{fontSize:15,color:T.text}}>{user?.name||"TRAVELLER"}</div></div>
          <div><div style={{fontSize:11,color:T.faint,letterSpacing:"0.12em",marginBottom:3}}>TRAVELERS</div><div style={{fontSize:15,color:T.text}}>{form.travelers}</div></div>
          <div><div style={{fontSize:11,color:T.faint,letterSpacing:"0.12em",marginBottom:3}}>CLASS</div><div style={{fontSize:15,color:T.text}}>{form.budget||"EXPLORER"}</div></div>
        </div>
        {plan?.tagline&&<div style={{marginTop:14,fontFamily:T.fd,fontSize:15,color:T.gold,fontStyle:"italic",textAlign:"center"}}>"{plan.tagline}"</div>}
      </div>
      <div style={{display:"flex",gap:8}}>
        <Btn onClick={share} icon="↗" size="md">{navigator.share?"Share":"Copy Card"}</Btn>
        <Btn onClick={copy} icon={copied?"✓":"📋"} size="md" variant="ghost" full={false}>{copied?"Copied!":"Copy Text"}</Btn>
      </div>
    </div>
  );
}

// ── COLLABORATION ─────────────────────────────────────────────────────────────
function CollabPanel({trip,user}){
  const[link,setLink]=useState("");const[copied,setCopied]=useState(false);const[comments,setComments]=useLS(`collab_${trip?.id}`,[]);const[comment,setComment]=useState("");
  const generate=()=>{
    DB.saveTrip({...trip,shared:true,sharedAt:Date.now()});
    const url=`${window.location.origin}?share=${trip.id}`;
    setLink(url);navigator.clipboard?.writeText(url);setCopied(true);setTimeout(()=>setCopied(false),2500);
  };
  const addComment=()=>{
    if(!comment.trim())return;
    setComments(c=>[...c,{text:comment,author:user?.name||"Guest",time:Date.now()}]);
    setComment("");
  };
  return(
    <div>
      <div style={{marginBottom:16}}>
        <div style={{fontSize:15,color:T.muted,marginBottom:12}}>Share this itinerary with your travel companions. They can view and comment.</div>
        <Btn onClick={generate} icon="🔗" size="md">{copied?"✓ Link Copied!":"Generate Share Link"}</Btn>
        {link&&<div style={{marginTop:10,padding:"10px 14px",background:"rgba(0,0,0,0.12)",borderRadius:T.rs,fontSize:14,color:T.faint,wordBreak:"break-all"}}>{link}</div>}
      </div>
      {comments.length>0&&(
        <div style={{marginBottom:14}}>
          <div style={{fontSize:12,color:T.gold,letterSpacing:"0.15em",marginBottom:10}}>COMMENTS</div>
          {comments.map((c,i)=>(
            <div key={i} style={{padding:"10px 0",borderBottom:`1px solid ${T.borderSub}`}}>
              <div style={{fontSize:13,color:T.gold,marginBottom:4}}>{c.author} · {new Date(c.time).toLocaleDateString()}</div>
              <div style={{fontSize:15,color:T.muted}}>{c.text}</div>
            </div>
          ))}
        </div>
      )}
      <div style={{display:"flex",gap:8}}>
        <input value={comment} onChange={e=>setComment(e.target.value)} onKeyDown={e=>e.key==="Enter"&&addComment()} placeholder="Add a comment…" style={{flex:1,background:"rgba(0,0,0,0.12)",border:`1px solid ${T.borderSub}`,borderRadius:T.rs,padding:"10px 14px",color:T.text,fontSize:15,minHeight:44}}/>
        <button onClick={addComment} style={{minWidth:44,minHeight:44,background:"rgba(201,169,110,0.15)",border:`1px solid ${T.border}`,borderRadius:T.rs,color:T.gold,fontSize:18,touchAction:"manipulation"}}>→</button>
      </div>
    </div>
  );
}

// ── SEO DESTINATION PAGE ──────────────────────────────────────────────────────
function DestinationPage({destination,onPlanTrip}){
  const[content,setContent]=useState(null);const[loading,setLoading]=useState(true);
  useEffect(()=>{
    let cancelled=false;
    (async()=>{
      try{
        const r=await aiJSON(`Create an engaging destination guide for ${destination} for a travel website. Return ONLY JSON: {"title":"Best Things to Do in ${destination}","subtitle":"...","best_time":"Month range","avg_budget":"$X/day","facts":["fact1","fact2","fact3"],"top_experiences":["exp1","exp2","exp3","exp4","exp5"],"neighborhoods":[{"name":"...","vibe":"..."}],"cuisine":["dish1","dish2","dish3"],"tips":["tip1","tip2","tip3"],"avg_flight_from_us":"$X-X"}`);
        if(!cancelled)setContent(r);
      }catch{if(!cancelled)setContent({title:`Explore ${destination}`,subtitle:"An unforgettable destination awaits",best_time:"Year-round",avg_budget:"$100-200/day",facts:["World-class cuisine","Rich cultural heritage","Stunning architecture"],top_experiences:["Historic city centre","Local food markets","Scenic viewpoints","Cultural museums","Day trips to surroundings"],neighborhoods:[{name:"City Centre",vibe:"Vibrant & walkable"}],cuisine:["Local specialties","Street food","Fine dining"],tips:["Book accommodation early","Learn basic local phrases","Carry local currency"],avg_flight_from_us:"$400-1200"});}
      if(!cancelled)setLoading(false);
    })();
    return()=>{cancelled=true;};
  },[destination]);
  const img=getImg(destination);
  return(
    <div className="pe">
      <div style={{borderRadius:T.r,overflow:"hidden",marginBottom:24,position:"relative",height:200}}>
        <img src={img} alt={destination} style={{width:"100%",height:"100%",objectFit:"cover",filter:"brightness(0.4)"}} loading="lazy"/>
        <div style={{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",padding:"20px 20px"}}>
          <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:6,fontFamily:T.fd}}>DESTINATION GUIDE</div>
          <h1 style={{fontFamily:T.fd,fontSize:"clamp(22px,5vw,36px)",fontWeight:600,lineHeight:1.2}}>{destination}</h1>
          {!loading&&content&&<div style={{fontSize:16,color:"rgba(255,255,255,0.6)",marginTop:6,fontStyle:"italic"}}>{content.subtitle}</div>}
        </div>
      </div>
      {loading?(<div>{[1,2,3,4].map(i=><div key={i} style={{marginBottom:16}}><Ske w="40%" h={14} mb={8}/><Ske h={13} mb={6}/><Ske w="75%" h={13}/></div>)}</div>):(
        <div>
          <div style={{display:"grid",gridTemplateColumns:"repeat(3,1fr)",gap:10,marginBottom:20}}>
            {[{label:"Best Time",val:content.best_time,icon:"🗓️"},{label:"Avg Budget",val:content.avg_budget,icon:"💰"},{label:"Flights from US",val:content.avg_flight_from_us,icon:"✈️"}].map(s=>(
              <div key={s.label} className="gc" style={{padding:"12px 10px",background:"#FFFFFF",border:`1px solid rgba(201,169,110,0.25)`,borderRadius:T.rs,textAlign:"center"}}>
                <div style={{fontSize:20,marginBottom:4}}>{s.icon}</div>
                <div style={{fontSize:13,color:T.faint,marginBottom:2}}>{s.label}</div>
                <div style={{fontSize:14,color:T.text,fontWeight:600}}>{s.val}</div>
              </div>
            ))}
          </div>
          <Section icon="🎯" title="Top Experiences">
            <div style={{display:"flex",flexDirection:"column",gap:8}}>
              {content.top_experiences?.map((e,i)=><div key={i} style={{fontSize:15,color:T.muted,display:"flex",gap:10,padding:"7px 0",borderBottom:`1px solid ${T.borderSub}`}}><span style={{color:T.gold,fontWeight:700,minWidth:20}}>{i+1}.</span>{e}</div>)}
            </div>
          </Section>
          <Section icon="🍽️" title="Local Cuisine">
            <div style={{display:"flex",gap:8,flexWrap:"wrap"}}>
              {content.cuisine?.map((c,i)=><span key={i} style={{fontSize:15,padding:"7px 14px",background:"rgba(201,169,110,0.09)",border:`1px solid ${T.border}`,borderRadius:50,color:T.goldLight}}>🍴 {c}</span>)}
            </div>
          </Section>
          <Section icon="💡" title="Travel Tips">
            {content.tips?.map((t,i)=><div key={i} style={{fontSize:15,color:T.muted,padding:"7px 0",borderBottom:`1px solid ${T.borderSub}`,display:"flex",gap:10}}><span style={{color:T.gold}}>✦</span>{t}</div>)}
          </Section>
          <Btn onClick={()=>onPlanTrip(destination)} icon="✈️">Plan My Trip to {destination}</Btn>
        </div>
      )}
    </div>
  );
}

// ── REFERRAL PANEL ────────────────────────────────────────────────────────────
function ReferralPanel({user}){
  const code=user?.email?.split("@")[0]?.toUpperCase()+"VOYAGE";
  const[copied,setCopied]=useState(false);
  const referrals=JSON.parse(localStorage.getItem("vg4_referrals")||"[]").filter(r=>r.referrer===user?.email);
  const copy=()=>{navigator.clipboard?.writeText(`https://roamroute.ai?ref=${code}`);setCopied(true);setTimeout(()=>setCopied(false),2500);};
  return(
    <div>
      <div style={{padding:"16px",background:"rgba(201,169,110,0.07)",border:`1px solid ${T.border}`,borderRadius:T.rs,marginBottom:16}}>
        <div style={{fontSize:12,color:T.gold,letterSpacing:"0.15em",marginBottom:8}}>YOUR REFERRAL CODE</div>
        <div style={{fontFamily:T.fd,fontSize:26,letterSpacing:"0.2em",color:T.goldLight,marginBottom:4}}>{code}</div>
        <div style={{fontSize:14,color:T.faint}}>Give a friend 1 free Pro plan · You get 1 free month</div>
      </div>
      <Btn onClick={copy} icon={copied?"✓":"📋"} size="md">{copied?"Copied!":"Copy Referral Link"}</Btn>
      {referrals.length>0&&<div style={{marginTop:14,fontSize:15,color:T.gold}}>🎉 {referrals.length} referral{referrals.length>1?"s":""} · {referrals.length} free month{referrals.length>1?"s":""} earned</div>}
      {!referrals.length&&<div style={{marginTop:12,fontSize:14,color:T.faint}}>No referrals yet — share your link to start earning!</div>}
    </div>
  );
}

// ── PLANNING ANIMATION ────────────────────────────────────────────────────────
function PlanningView({destination,variant}){
  const stages=[{icon:"🌍",l:"Analyzing destination"},{icon:"✈️",l:"Finding best flights"},{icon:"🏨",l:"Curating accommodations"},{icon:"🚗",l:"Arranging transport"},{icon:"🍽️",l:"Discovering local dining"},{icon:"🎯",l:"Selecting activities"},{icon:"🌤️",l:"Checking weather"},{icon:"🛡️",l:"Verifying visa requirements"},{icon:"🧳",l:"Building packing list"},{icon:"✨",l:variant?"Generating variant "+variant:"Finalizing your plan"}];
  const[cur,setCur]=useState(0);const[done,setDone]=useState([]);
  useEffect(()=>{const t=setInterval(()=>{setCur(i=>{setDone(d=>[...d,i]);return Math.min(i+1,stages.length-1);});},800);return()=>clearInterval(t);},[]);
  return(
    <div style={{textAlign:"center",padding:"16px 0 28px"}}>
      <div style={{width:"100%",height:140,borderRadius:T.r,overflow:"hidden",marginBottom:24,position:"relative"}}>
        <img src={getImg(destination)} alt="" style={{width:"100%",height:"100%",objectFit:"cover",filter:"brightness(0.3)"}} loading="lazy"/>
        <div style={{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column",gap:6}}>
          <div style={{fontSize:40,animation:"float 2s ease-in-out infinite"}}>✈️</div>
          <div className="gold" style={{fontSize:15,fontFamily:T.fd,letterSpacing:"0.15em"}}>{destination}</div>
          {variant&&<div style={{fontSize:13,color:T.faint}}>Variant {variant} of 3</div>}
        </div>
      </div>
      <div style={{display:"flex",flexDirection:"column",gap:8,maxWidth:300,margin:"0 auto",textAlign:"left"}}>
        {stages.map((s,i)=>(
          <div key={i} style={{display:"flex",alignItems:"center",gap:10,padding:"8px 14px",background:done.includes(i)?"rgba(201,169,110,0.08)":i===cur?"rgba(0,0,0,0.12)":"transparent",borderRadius:T.rs,transition:T.tb,opacity:i>cur?0.25:1}}>
            <span style={{fontSize:18,animation:i===cur?"pulse 0.8s ease infinite":"none"}}>{s.icon}</span>
            <span style={{fontSize:14,color:done.includes(i)?T.gold:i===cur?T.text:T.faint,flex:1}}>{s.l}</span>
            {done.includes(i)&&<span style={{color:T.ok,fontSize:14}}>✓</span>}
            {i===cur&&<div style={{display:"flex",gap:3}}>{[0,1,2].map(j=><div key={j} style={{width:4,height:4,borderRadius:"50%",background:T.gold,animation:`bounce 1s ease ${j*0.15}s infinite`}}/>)}</div>}
          </div>
        ))}
      </div>
    </div>
  );
}

// ── CHAT ─────────────────────────────────────────────────────────────────────
function Chat({plan,form,prefs}){
  const[msgs,setMsgs]=useState([{r:"ai",t:"How can I improve your plan? Ask me to adjust activities, swap restaurants, find cheaper options, or add special experiences."}]);
  const[input,setInput]=useState("");const[loading,setLoading]=useState(false);
  const endRef=useRef();const hp=useHaptic();
  const QUICK=["More budget-friendly","Add a beach day","Best local restaurants","Family-friendly options","Cheapest flights","Add a day trip"];
  const send=async(text)=>{
    const msg=text||input.trim();if(!msg||loading)return;
    hp("light");setInput("");setMsgs(m=>[...m,{r:"user",t:msg}]);setLoading(true);
    try{
      const t=await ai(`Expert travel concierge. Trip: ${form.travelers||""} to ${form.destination||""}, ${form.duration||""} days, ${prefs?.budget||""} budget, ${prefs?.pace||""} pace. User: "${msg}". Reply in 2-3 sentences, specific, warm, expert. Name real restaurants/places.`);
      setMsgs(m=>[...m,{r:"ai",t}]);
    }catch{setMsgs(m=>[...m,{r:"ai",t:"I'm here to help perfect your journey — could you rephrase that?"}]);}
    setLoading(false);setTimeout(()=>endRef.current?.scrollIntoView({behavior:"smooth"}),100);
  };
  return(
    <Card style={{overflow:"hidden",marginBottom:14}}>
      <div style={{padding:"14px 18px",borderBottom:`1px solid ${T.borderSub}`,display:"flex",gap:10,alignItems:"center"}}>
        <div style={{width:32,height:32,borderRadius:"50%",background:"rgba(201,169,110,0.15)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:17}}>💬</div>
        <div><div style={{fontSize:15,fontWeight:700,color:T.text}}>Refine Your Plan</div><div style={{fontSize:13,color:T.faint}}>AI travel concierge</div></div>
      </div>
      <div style={{padding:"10px 16px 0",display:"flex",gap:7,flexWrap:"wrap"}}>
        {QUICK.map(q=><button key={q} onClick={()=>send(q)} style={{fontSize:13,padding:"6px 12px",border:`1px solid ${T.borderSub}`,borderRadius:50,color:T.muted,background:"rgba(0,0,0,0.12)",minHeight:32,transition:T.tb,touchAction:"manipulation"}} onMouseEnter={e=>{e.target.style.borderColor=T.gold;e.target.style.color=T.gold;}} onMouseLeave={e=>{e.target.style.borderColor=T.borderSub;e.target.style.color=T.muted;}}>{q}</button>)}
      </div>
      <div style={{padding:"12px 16px",maxHeight:220,overflowY:"auto",display:"flex",flexDirection:"column",gap:10}}>
        {msgs.map((m,i)=>(
          <div key={i} style={{display:"flex",justifyContent:m.r==="user"?"flex-end":"flex-start",animation:"fadeUp 0.2s ease"}}>
            <div style={{maxWidth:"85%",padding:"9px 13px",borderRadius:m.r==="user"?"14px 14px 4px 14px":"14px 14px 14px 4px",fontSize:15,lineHeight:1.65,background:m.r==="user"?"rgba(201,169,110,0.18)":"rgba(0,0,0,0.12)",color:m.r==="user"?T.goldLight:T.muted,border:`1px solid ${m.r==="user"?"rgba(201,169,110,0.25)":T.borderSub}`}}>{m.t}</div>
          </div>
        ))}
        {loading&&<div style={{display:"flex",gap:5,paddingLeft:8}}>{[0,1,2].map(i=><div key={i} style={{width:7,height:7,borderRadius:"50%",background:T.gold,animation:`bounce 1.1s ease ${i*0.18}s infinite`}}/>)}</div>}
        <div ref={endRef}/>
      </div>
      <div style={{padding:"10px 12px",borderTop:`1px solid ${T.borderSub}`,display:"flex",gap:8}}>
        <input value={input} onChange={e=>setInput(e.target.value)} onKeyDown={e=>e.key==="Enter"&&!e.shiftKey&&send()} placeholder="Ask anything about your trip…" aria-label="Refine your plan" style={{flex:1,background:"rgba(0,0,0,0.12)",border:`1px solid ${T.borderSub}`,borderRadius:T.rs,padding:"10px 14px",color:T.text,fontSize:16,minHeight:44}}/>
        <button onClick={()=>send()} disabled={!input.trim()||loading} aria-label="Send" style={{minWidth:44,minHeight:44,background:input.trim()?"rgba(201,169,110,0.18)":"rgba(0,0,0,0.12)",border:`1px solid ${input.trim()?T.border:T.borderSub}`,borderRadius:T.rs,color:input.trim()?T.gold:T.faint,fontSize:20,touchAction:"manipulation",transition:T.tb}}>→</button>
      </div>
    </Card>
  );
}

// ── DAY CARD ─────────────────────────────────────────────────────────────────
function DayCard({day,data,onRegen}){
  const[open,setOpen]=useState(day===1);const[loading,setLoading]=useState(false);
  const handle=async(e)=>{e.stopPropagation();setLoading(true);await onRegen(day);setLoading(false);};
  return(
    <div className="gc" style={{marginBottom:10,background:"#FFFFFF",border:`1px solid ${open?T.border:"rgba(201,169,110,0.25)"}`,borderRadius:T.r,overflow:"hidden",transition:T.tb}}>
      <button onClick={()=>setOpen(o=>!o)} aria-expanded={open} style={{width:"100%",minHeight:54,padding:"13px 16px",display:"flex",justifyContent:"space-between",alignItems:"center",touchAction:"manipulation"}}>
        <div style={{display:"flex",alignItems:"center",gap:11,textAlign:"left"}}>
          <div style={{width:28,height:28,borderRadius:"50%",background:open?"rgba(201,169,110,0.22)":"rgba(0,0,0,0.15)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,transition:T.tb}}>
            <span className={open?"gold":""} style={{fontSize:13,fontWeight:700}}>{day}</span>
          </div>
          <span style={{fontSize:16,color:open?T.text:T.muted,fontFamily:T.fd,fontWeight:600,transition:T.tb}}>{data.title}</span>
        </div>
        <div style={{display:"flex",gap:7,alignItems:"center",flexShrink:0}}>
          <button onClick={handle} aria-label={`Regenerate day ${day}`} disabled={loading} style={{fontSize:13,padding:"4px 11px",border:`1px solid ${T.border}`,borderRadius:50,color:T.gold,background:"transparent",minHeight:32,touchAction:"manipulation",opacity:loading?0.5:1,transition:T.tb}}>
            {loading?"…":"↻"}
          </button>
          <span style={{color:T.gold,fontSize:19,transition:"transform 0.3s",transform:open?"rotate(180deg)":"none",display:"inline-block"}}>⌄</span>
        </div>
      </button>
      {open&&(
        <div style={{padding:"0 16px 16px",borderTop:`1px solid ${T.borderSub}`,animation:"fadeUp 0.22s ease"}}>
          {[["☀️ Morning",data.morning],["⛅ Afternoon",data.afternoon],["🌙 Evening",data.evening]].map(([lbl,content])=>content&&(
            <div key={lbl} style={{marginTop:14}}>
              <div style={{fontSize:12,color:T.gold,letterSpacing:"0.14em",marginBottom:5}}>{lbl}</div>
              <div style={{fontSize:15,color:T.muted,lineHeight:1.7}}>{content}</div>
            </div>
          ))}
          {data.meals&&Object.keys(data.meals).length>0&&(
            <div style={{marginTop:14}}>
              <div style={{fontSize:12,color:T.gold,letterSpacing:"0.14em",marginBottom:8}}>🍽️ WHERE TO EAT</div>
              {Object.entries(data.meals).map(([type,rest])=>(
                <div key={type} style={{display:"flex",gap:8,alignItems:"baseline",padding:"5px 0",borderBottom:`1px solid ${T.borderSub}`}}>
                  <span style={{fontSize:13,color:T.faint,textTransform:"capitalize",minWidth:72}}>{type}</span>
                  <span style={{fontSize:15,color:T.text}}>{rest}</span>
                </div>
              ))}
            </div>
          )}
          {data.weather&&<div style={{marginTop:10,fontSize:13,color:T.faint}}>🌡 {data.weather}</div>}
          {data.tips&&<div style={{marginTop:12,padding:"9px 13px",background:"rgba(201,169,110,0.07)",borderRadius:T.rs,fontSize:14,color:T.muted,fontStyle:"italic",borderLeft:`2px solid ${T.gold}`}}>💡 {data.tips}</div>}
        </div>
      )}
    </div>
  );
}

// ── WEATHER ──────────────────────────────────────────────────────────────────
function Weather({destination}){
  const[data,setData]=useState(null);const[loading,setLoading]=useState(true);
  useEffect(()=>{
    let c=false;
    (async()=>{
      try{const r=await aiJSON(`Typical weather for ${destination} now. ONLY JSON: {"high":"28°C","low":"20°C","condition":"Warm & sunny","humidity":"65%","rain":"Low","uv":"High","tip":"Wear light clothes","icon":"☀️"}`);if(!c)setData(r);}
      catch{if(!c)setData({high:"—",low:"—",condition:"Check local forecasts",humidity:"—",rain:"—",uv:"—",tip:"Always pack layers for variable weather",icon:"🌤️"});}
      if(!c)setLoading(false);
    })();
    return()=>{c=true;};
  },[destination]);
  if(loading)return(<div style={{display:"flex",gap:12}}><Ske w={44} h={44} r={10}/><div style={{flex:1}}><Ske w="60%" h={16} mb={7}/><Ske w="80%" h={12} mb={5}/><Ske w="50%" h={12}/></div></div>);
  return(
    <div style={{display:"flex",gap:14,alignItems:"flex-start"}}>
      <div style={{fontSize:38,lineHeight:1}}>{data.icon}</div>
      <div style={{flex:1}}>
        <div style={{fontFamily:T.fd,fontSize:19,color:T.text,marginBottom:4}}>{data.condition}</div>
        <div style={{fontSize:14,color:T.muted,marginBottom:7}}>{data.low}–{data.high} · Humidity {data.humidity} · UV {data.uv}</div>
        <span style={{fontSize:13,padding:"3px 10px",background:"rgba(201,169,110,0.1)",borderRadius:50,color:T.gold}}>🌧 Rain: {data.rain}</span>
        {data.tip&&<div style={{marginTop:9,fontSize:14,color:T.faint,fontStyle:"italic"}}>💡 {data.tip}</div>}
      </div>
    </div>
  );
}

// ── EXPORT ───────────────────────────────────────────────────────────────────
function doExport(plan,form,prefs){
  const lines=[`ROAMROUTE — TRIP ITINERARY`,"═".repeat(52),"",`Route: ${form.origin} → ${form.destination}`,`Travelers: ${form.travelers}  |  Duration: ${form.duration} days`,`Budget: ${prefs?.budget}  |  Pace: ${prefs?.pace}`,`Style: ${prefs?.style||""}`,`Dietary: ${prefs?.dietary?.join(", ")||"None"}`,"",...(form.cities?.length>2?[`MULTI-CITY ROUTE`,"─".repeat(32),...form.cities.map((c,i)=>`  Stop ${i+1}: ${c.city} (${c.nights||""}${c.nights?" nights":""})`),""]:[""]),"OVERVIEW","─".repeat(32),plan.summary||"","",...(plan.flights?[`FLIGHTS`,"─".repeat(32),`Outbound: ${plan.flights.outbound||""}`,`Return:   ${plan.flights.return||""}`,`Tip: ${plan.flights.tips||""}`,""]:[""]),...(plan.accommodation?[`ACCOMMODATION`,"─".repeat(32),`${plan.accommodation.name||""} — ${plan.accommodation.location||""}`,`${plan.accommodation.price_per_night||""}/night  |  ${plan.accommodation.highlights||""}`,""]:[""]),"DAILY ITINERARY","─".repeat(32),...(plan.days||[]).flatMap((d,i)=>[``,`Day ${i+1}: ${d.title}`,`  ☀ ${d.morning||""}`,`  ⛅ ${d.afternoon||""}`,`  🌙 ${d.evening||""}`,`  🍽 ${Object.entries(d.meals||{}).map(([t,r])=>`${t}: ${r}`).join(" | ")}`,`  💡 ${d.tips||""}`]),``,`BUDGET ESTIMATE`,"─".repeat(32),...Object.entries(plan.budget_breakdown||{}).map(([k,v])=>`  ${k.padEnd(16)}: ${v}`),``,`PACKING TIPS`,"─".repeat(32),...(plan.packing_tips||[]).map(t=>`  • ${t}`),``,`HIDDEN GEMS`,"─".repeat(32),...(plan.hidden_gems||[]).map(g=>`  💎 ${g}`),``,"═".repeat(52),`Generated by RoamRoute  ·  roamroute.ai`];
  const blob=new Blob([lines.join("\n")],{type:"text/plain"});
  const a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download=`roamroute-${(form.destination||"trip").toLowerCase().replace(/\s+/g,"-")}.txt`;a.click();
}

// ══════════════════════════════════════════════════════════════════════════════
// MAIN APP
// ══════════════════════════════════════════════════════════════════════════════
const STEPS=["origin","destination","travelers","duration","preferences"];
const STEP_LABELS=["From","To","Who","When","Style"];

export default function RoamRouteV1(){
  const isMobile=useMQ("(max-width:640px)");
  const hp=useHaptic();

  // ── State ──────────────────────────────────────────────────────
  const[user,setUser]=useLS("vg4_session",null);
  const[trips,setTrips]=useLS("vg4_trips_local",[]);
  const[view,setView]=useState("home");
  const[stepIdx,setStepIdx]=useState(0);
  const[multiCity,setMultiCity]=useState(false);
  const[cities,setCities]=useState([{city:"",nights:""},{city:"",nights:""},{city:"",nights:""}]);
  const[form,setForm]=useState({origin:"",destination:""});
  const[travelers,setTravelers]=useState("");
  const[duration,setDuration]=useState("");
  const[prefs,setPrefs]=useState({budget:"",pace:"",interests:[],accommodation:"",dietary:[],style:""});
  const[passport,setPassport]=useState("");
  const[plan,setPlan]=useState(null);
  const[planVariants,setPlanVariants]=useState(null);
  const[genLoading,setGenLoading]=useState(false);
  const[genVariant,setGenVariant]=useState(null);
  const[activeTab,setActiveTab]=useState("overview");
  const[showOnboarding,setShowOnboarding]=useState(false);
  const[deferredPrompt,setDeferredPrompt]=useState(null);
  const[showInstallPrompt,setShowInstallPrompt]=useState(false);
  const[destPage,setDestPage]=useState(null);
  const[authModal,setAuthModal]=useState(null);
  const[showUpgrade,setShowUpgrade]=useState(false);
  const[showShare,setShowShare]=useState(false);
  const[payLoading,setPayLoading]=useState(null);
  const[emailSent,setEmailSent]=useState(false);
  const{toasts,show:toast}=useToast();
  const topRef=useRef();

  const installApp = async () => {
    if (!deferredPrompt) {
      toast("Use your browser menu to add RoamRoute to your home screen.", "info");
      return;
    }

    deferredPrompt.prompt();
    const choice = await deferredPrompt.userChoice;
    if (choice.outcome === "accepted") {
      toast("Thanks for installing RoamRoute!", "success");
    } else {
      toast("Installation cancelled.", "warn");
    }

    setDeferredPrompt(null);
    setShowInstallPrompt(false);
  };

  useEffect(() => {
    const onBeforeInstallPrompt = (e) => {
      e.preventDefault();
      setDeferredPrompt(e);
      setShowInstallPrompt(true);
    };
    const onAppInstalled = () => {
      setDeferredPrompt(null);
      setShowInstallPrompt(false);
      toast("RoamRoute installed! Open it from your home screen.", "success");
    };

    window.addEventListener("beforeinstallprompt", onBeforeInstallPrompt);
    window.addEventListener("appinstalled", onAppInstalled);

    return () => {
      window.removeEventListener("beforeinstallprompt", onBeforeInstallPrompt);
      window.removeEventListener("appinstalled", onAppInstalled);
    };
  }, [toast]);

  // First-time onboarding
  useEffect(()=>{
    const seen=localStorage.getItem("vg4_onboarded");
    if(!seen&&!user)setTimeout(()=>setShowOnboarding(true),1200);
  },[]);

  // ── Validation ─────────────────────────────────────────────────
  const canNext=[
    multiCity?cities[0].city.trim().length>1:form.origin.trim().length>1,
    multiCity?cities[cities.length-1].city.trim().length>1:form.destination.trim().length>1,
    travelers.trim().length>0,
    duration.trim().length>0,
    !!prefs.budget&&!!prefs.pace,
  ][stepIdx]??false;

  // ── Generate Plan ──────────────────────────────────────────────
  const checkLimit=()=>{
    if(!user){const anon=trips.filter(t=>new Date(t.date).getMonth()===new Date().getMonth());if(anon.length>=1){setAuthModal("signup");toast("Sign up free to continue planning!","info");return false;}}
    if(user?.plan==="free"||!user?.plan){const mo=trips.filter(t=>t.userEmail===user?.email&&new Date(t.date).getMonth()===new Date().getMonth());if(mo.length>=1){setShowUpgrade(true);return false;}}
    return true;
  };

  const buildPrompt=(variant="")=>{
    const dest=multiCity?cities.map(c=>c.city).filter(Boolean).join(" → "):form.destination;
    const org=multiCity?cities[0].city:form.origin;
    const profile=buildProfile(trips);
    const fdbk=trips.slice(-3).map(t=>t.feedback?.note).filter(Boolean);
    return`You are an elite luxury travel concierge AI. Generate a highly specific, opinionated trip plan.

Route: ${org} → ${dest}
Travelers: ${travelers} | Duration: ${duration} days
Budget: ${prefs.budget}${variant?` (${variant} variant)`:""}
Pace: ${prefs.pace} | Style: ${prefs.style||"General"}
Interests: ${prefs.interests.join(", ")||"General"}
Accommodation: ${prefs.accommodation||"Hotel"}
Dietary: ${prefs.dietary.join(", ")||"None"}
${profile?`Past preferences: budget=${profile.preferredBudget}, trips=${profile.tripCount}`:""}
${fdbk.length?`Apply this feedback: ${fdbk.join("; ")}`:""}

Return ONLY valid JSON (no markdown):
{
  "summary":"2-sentence evocative description",
  "tagline":"6-word poetic tagline",
  "variant":"${variant||"Recommended"}",
  "highlights":["key selling point 1","key selling point 2","key selling point 3"],
  "flights":{"outbound":"airline + route + price","return":"airline + route + price","tips":"booking strategy"},
  "accommodation":{"name":"specific property","type":"type","location":"neighborhood desc","price_per_night":"price","highlights":"3 highlights","booking_tip":"tip"},
  "transport":{"type":"type","details":"provider + details","estimated_cost":"cost"},
  "days":[{"title":"evocative title","morning":"activity + venue","afternoon":"activity + venue","evening":"activity + venue","meals":{"breakfast":"restaurant","lunch":"restaurant","dinner":"restaurant"},"weather":"expected conditions","tips":"local insider tip"}],
  "budget_breakdown":{"flights":"amount","accommodation":"amount","food":"amount","activities":"amount","transport":"amount","total":"total"},
  "packing_tips":["tip1","tip2","tip3","tip4"],
  "hidden_gems":["secret1","secret2","secret3"],
  "best_practices":["cultural tip","practical tip"]
}

Generate exactly ${Math.min(parseInt(duration)||3,7)} days. Use real venue/restaurant names. Be specific and inspiring.`;
  };

  const generate=async()=>{
    if(!checkLimit())return;
    setView("planning");setGenLoading(true);setGenVariant(null);setPlanVariants(null);
    try{
      const parsed=await aiJSON(buildPrompt(), 6000);
      setPlan(parsed);setView("result");
      window.scrollTo({top:0,behavior:"smooth"});
    }catch(e){toast("Something went wrong. Please try again.","error");setView("plan");setStepIdx(STEPS.length-1);}
    setGenLoading(false);
  };

  const generateComparison=async()=>{
    if(!checkLimit())return;
    setView("planning");setGenLoading(true);
    const variants=["Budget-optimized","Balanced","Luxury splurge"];
    const results=[];
    for(let i=0;i<variants.length;i++){
      setGenVariant(i+1);
      try{const p=await aiJSON(buildPrompt(variants[i]), 6000);results.push(p);}
      catch{results.push({variant:variants[i],summary:"Could not generate this variant.",days:[],budget_breakdown:{total:"N/A"},highlights:[]});}
    }
    setPlanVariants(results);setPlan(results[0]);setView("compare");
    window.scrollTo({top:0,behavior:"smooth"});
    setGenLoading(false);setGenVariant(null);
  };

  const regenDay=useCallback(async(dayNum)=>{
    if(!plan)return;
    try{
      const dest=multiCity?cities.map(c=>c.city).filter(Boolean).join("→"):form.destination;
      const d=await aiJSON(`Regenerate Day ${dayNum} of a ${duration}-day trip to ${dest} for ${travelers}. Budget: ${prefs.budget}. Pace: ${prefs.pace}. Interests: ${prefs.interests.join(", ")}.
Return ONLY JSON: {"title":"...","morning":"...","afternoon":"...","evening":"...","meals":{"breakfast":"...","lunch":"...","dinner":"..."},"weather":"...","tips":"..."}`);
      setPlan(p=>({...p,days:p.days.map((dd,i)=>i===dayNum-1?d:dd)}));
      toast("Day "+dayNum+" refreshed! ✦","success");
    }catch{toast("Couldn't regenerate. Try again.","error");}
  },[plan,form,travelers,duration,prefs,multiCity,cities]);

  const saveTrip=useCallback((feedback=null)=>{
    const dest=multiCity?cities.map(c=>c.city).filter(Boolean).join("→"):form.destination;
    const entry={id:Date.now().toString(),date:new Date().toISOString(),userEmail:user?.email,form:{...form,travelers,duration,destination:dest,origin:multiCity?cities[0].city:form.origin,cities:multiCity?cities:null,budget:prefs?.budget,pace:prefs?.pace},prefs,plan,feedback};
    DB.saveTrip(entry);
    setTrips(t=>[entry,...t].slice(0,20));
    toast("Trip saved! ✦","success");
    return entry;
  },[form,travelers,duration,prefs,plan,user,multiCity,cities]);

  const handleEmailSend=async()=>{
    if(!user?.email){toast("Sign in to receive email","info");setAuthModal("login");return;}
    await sendItineraryEmail(user.email,plan,{...form,travelers,destination:form.destination});
    setEmailSent(true);toast("Itinerary sent to "+user.email+" ✉️","success");
  };

  const handleUpgrade=async(planKey)=>{
    if(!user){setAuthModal("signup");setShowUpgrade(false);return;}
    setPayLoading(planKey);
    try{
      const updated=await simulateStripe(planKey,user);
      setUser(u=>({...u,...updated}));
      DB.upsertUser(user.email,{plan:planKey});
      setShowUpgrade(false);
      toast(`Upgraded to ${PLANS[planKey].name}! ✦`,"success");
    }catch{toast("Payment failed. Try again.","error");}
    setPayLoading(null);
  };

  function buildProfile(trips){
    if(!trips.length)return null;
    const bs=trips.map(t=>t.prefs?.budget).filter(Boolean);
    const top=bs.sort((a,b)=>bs.filter(v=>v===b).length-bs.filter(v=>v===a).length)[0];
    return{preferredBudget:top,tripCount:trips.length};
  }

  const reset=()=>{setView("home");setStepIdx(0);setForm({origin:"",destination:""});setTravelers("");setDuration("");setPrefs({budget:"",pace:"",interests:[],accommodation:"",dietary:[],style:""});setPlan(null);setPlanVariants(null);setMultiCity(false);setCities([{city:"",nights:""},{city:"",nights:""},{city:"",nights:""}]);setEmailSent(false);window.scrollTo({top:0,behavior:"smooth"});};

  const currentDest=multiCity?cities[cities.length-1]?.city:form.destination;
  const currentOrg=multiCity?cities[0]?.city:form.origin;
  const links=useMemo(()=>currentDest?aff(currentDest,currentOrg):null,[currentDest,currentOrg]);
  const destImg=useMemo(()=>getImg(currentDest),[currentDest]);

  // ── STEP RENDERER ──────────────────────────────────────────────
  const renderStep=()=>{
    switch(stepIdx){
      case 0:return(
        <div className="se" key="s0">
          <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:18,fontFamily:T.fd}}>STEP 1 — DEPARTURE</div>
          <h2 style={{fontFamily:T.fd,fontSize:"clamp(22px,5vw,28px)",fontWeight:600,marginBottom:24,lineHeight:1.25}}>Where are you flying <em>from?</em></h2>
          <div style={{display:"flex",gap:10,marginBottom:16}}>
            <button onClick={()=>setMultiCity(false)} style={{flex:1,padding:"11px",border:`1.5px solid ${!multiCity?T.gold:T.borderSub}`,borderRadius:T.rs,background:!multiCity?"rgba(201,169,110,0.12)":"rgba(0,0,0,0.12)",color:!multiCity?T.goldLight:T.muted,fontSize:15,minHeight:44,transition:T.tb,touchAction:"manipulation"}}>✈️ Direct trip</button>
            <button onClick={()=>setMultiCity(true)} style={{flex:1,padding:"11px",border:`1.5px solid ${multiCity?T.gold:T.borderSub}`,borderRadius:T.rs,background:multiCity?"rgba(201,169,110,0.12)":"rgba(0,0,0,0.12)",color:multiCity?T.goldLight:T.muted,fontSize:15,minHeight:44,transition:T.tb,touchAction:"manipulation"}}>🗺️ Multi-city</button>
          </div>
          {multiCity?(<MultiCityBuilder cities={cities} onChange={setCities}/>):(<Inp label="Departure city or airport" value={form.origin} onChange={v=>setForm(f=>({...f,origin:v}))} placeholder="e.g. Toronto, New York, JFK…" icon="📍" required autoFocus hint="City name or IATA code"/>)}
        </div>
      );
      case 1:return(
        <div className="se" key="s1">
          <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:18,fontFamily:T.fd}}>STEP 2 — DESTINATION</div>
          <h2 style={{fontFamily:T.fd,fontSize:"clamp(22px,5vw,28px)",fontWeight:600,marginBottom:22,lineHeight:1.25}}>Where does the adventure take you?</h2>
          {!multiCity&&(
            <>
              {form.destination.length>2&&<div style={{width:"100%",height:120,borderRadius:T.rs,overflow:"hidden",marginBottom:18,position:"relative"}}><img src={getImg(form.destination)} alt="" style={{width:"100%",height:"100%",objectFit:"cover",filter:"brightness(0.4)"}}/><div style={{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",fontFamily:T.fd,fontSize:22,color:"#fff",textShadow:"0 2px 12px rgba(0,0,0,0.6)"}}>{form.destination}</div></div>}
              <Inp label="Destination" value={form.destination} onChange={v=>setForm(f=>({...f,destination:v}))} placeholder="e.g. Tokyo, Bali, Paris…" icon="🌍" required autoFocus/>
              <div style={{marginBottom:4}}>
                <div style={{fontSize:12,color:T.faint,letterSpacing:"0.1em",marginBottom:10}}>POPULAR</div>
                <div style={{display:"flex",gap:8,flexWrap:"wrap"}}>
                  {POPULAR.map(p=><button key={p.name} onClick={()=>setForm(f=>({...f,destination:p.name}))} style={{fontSize:14,padding:"6px 13px",border:`1px solid ${form.destination===p.name?T.gold:T.borderSub}`,borderRadius:50,color:form.destination===p.name?T.gold:T.muted,background:form.destination===p.name?"rgba(201,169,110,0.12)":"rgba(0,0,0,0.12)",minHeight:36,touchAction:"manipulation",transition:T.tb}}>{p.flag} {p.name}</button>)}
                </div>
              </div>
            </>
          )}
          {multiCity&&<div style={{padding:"14px",background:"rgba(201,169,110,0.06)",border:`1px solid ${T.border}`,borderRadius:T.rs,fontSize:15,color:T.muted}}>✦ Multi-city route set above. Destination is your final stop: <strong style={{color:T.text}}>{cities[cities.length-1]?.city||"(add above)"}</strong></div>}
        </div>
      );
      case 2:return(
        <div className="se" key="s2">
          <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:18,fontFamily:T.fd}}>STEP 3 — TRAVELLERS</div>
          <h2 style={{fontFamily:T.fd,fontSize:"clamp(22px,5vw,28px)",fontWeight:600,marginBottom:22,lineHeight:1.25}}>Who's joining the journey?</h2>
          <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:10,marginBottom:18}}>
            {["Solo","Couple","Family of 3","Family of 4","Friends (3)","Friends (4+)"].map(t=><button key={t} onClick={()=>{hp("light");setTravelers(t);}} style={{padding:"14px 10px",border:`1.5px solid ${travelers===t?T.gold:T.borderSub}`,borderRadius:T.rs,background:travelers===t?"rgba(201,169,110,0.12)":"rgba(0,0,0,0.12)",color:travelers===t?T.goldLight:T.muted,fontSize:15,minHeight:52,touchAction:"manipulation",transition:T.ts,fontWeight:travelers===t?500:400}}>{t}</button>)}
          </div>
          <Inp label="Or describe your group" value={travelers} onChange={setTravelers} placeholder="e.g. 2 adults, 1 toddler" icon="👥" hint="Details help tailor activities and accommodations"/>
        </div>
      );
      case 3:return(
        <div className="se" key="s3">
          <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:18,fontFamily:T.fd}}>STEP 4 — DURATION</div>
          <h2 style={{fontFamily:T.fd,fontSize:"clamp(22px,5vw,28px)",fontWeight:600,marginBottom:22,lineHeight:1.25}}>How long is your escape?</h2>
          <div style={{display:"grid",gridTemplateColumns:"repeat(3,1fr)",gap:10,marginBottom:18}}>
            {["3","5","7","10","14","21"].map(d=><button key={d} onClick={()=>{hp("light");setDuration(d);}} style={{padding:"14px 8px",border:`1.5px solid ${duration===d?T.gold:T.borderSub}`,borderRadius:T.rs,background:duration===d?"rgba(201,169,110,0.12)":"rgba(0,0,0,0.12)",color:duration===d?T.goldLight:T.muted,fontSize:20,minHeight:60,fontFamily:T.fd,fontWeight:600,touchAction:"manipulation",transition:T.ts}}>{d}<span style={{fontSize:12,display:"block",color:duration===d?T.gold:T.faint}}>days</span></button>)}
          </div>
          <Inp label="Custom duration" value={duration} onChange={setDuration} placeholder="e.g. 12" icon="📅" inputMode="numeric" hint="We plan up to 7 detailed days"/>
        </div>
      );
      case 4:return(
        <div className="se" key="s4">
          <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:18,fontFamily:T.fd}}>STEP 5 — PERSONALIZE</div>
          <h2 style={{fontFamily:T.fd,fontSize:"clamp(20px,4vw,26px)",fontWeight:600,marginBottom:6,lineHeight:1.25}}>Shape your experience</h2>
          <p style={{fontSize:15,color:T.faint,marginBottom:22}}>More detail = more precise plan</p>
          {[
            {label:"BUDGET LEVEL *",key:"budget",opts:OPT.budget,multi:false},
            {label:"TRAVEL PACE *",key:"pace",opts:OPT.pace,multi:false},
            {label:"TRAVEL STYLE",key:"style",opts:OPT.style,multi:false},
            {label:"INTERESTS",key:"interests",opts:OPT.interests,multi:true},
            {label:"ACCOMMODATION",key:"accommodation",opts:OPT.accommodation,multi:false},
            {label:"DIETARY",key:"dietary",opts:OPT.dietary,multi:true},
          ].map(({label,key,opts,multi})=>(
            <div key={key} style={{marginBottom:22}}>
              <div style={{fontSize:12,color:T.gold,letterSpacing:"0.18em",marginBottom:10,fontFamily:T.fd}}>{label}</div>
              <div style={{display:"flex",gap:7,flexWrap:"wrap"}}>
                {opts.map(o=><Chip key={o.v} emoji={o.e} label={o.v} sm active={multi?(prefs[key]||[]).includes(o.v):prefs[key]===o.v} onClick={()=>setPrefs(p=>{if(multi)return{...p,[key]:(p[key]||[]).includes(o.v)?(p[key]||[]).filter(x=>x!==o.v):[...(p[key]||[]),o.v]};return{...p,[key]:o.v};})}/>)}
              </div>
            </div>
          ))}
          <Inp label="Your passport nationality (for visa check)" value={passport} onChange={setPassport} placeholder="e.g. Canadian, American, British…" icon="🛂" hint="Optional — enables visa requirements check"/>
          <div style={{padding:"12px 14px",background:"rgba(201,169,110,0.05)",border:`1px solid ${T.border}`,borderRadius:T.rs,marginTop:8}}>
            <div style={{fontSize:14,color:T.muted,marginBottom:8}}>Want to compare 3 budget variants side-by-side?</div>
            <div style={{display:"flex",gap:8}}>
              <Btn onClick={generate} disabled={!canNext} size="md">✦ Generate Plan</Btn>
              {(user?.plan==="pro"||user?.plan==="elite")&&<Btn onClick={generateComparison} disabled={!canNext} size="md" variant="ghost" full={false}>Compare 3 Plans</Btn>}
            </div>
          </div>
        </div>
      );
    }
  };

  // ── RESULT TABS ────────────────────────────────────────────────
  const TABS=[{id:"overview",label:"Overview",icon:"✈️"},{id:"days",label:"Itinerary",icon:"📅"},{id:"tools",label:"Tools",icon:"🛠️"},{id:"social",label:"Share",icon:"↗"}];

  const NAV_ITEMS=[
    {icon:"🏠",label:"Home",action:reset,active:view==="home"},
    {icon:"✈️",label:"Plan",action:()=>{setView("plan");setStepIdx(0);},active:view==="plan"||view==="planning"},
    {icon:"🗂",label:"Trips",action:()=>setView("dashboard"),active:view==="dashboard"},
    {icon:"🌍",label:"Explore",action:()=>setView("explore"),active:view==="explore"},
    {icon:user?"👤":"🔐",label:user?user.name?.split(" ")[0]||"Me":"Sign In",action:()=>user?setView("account"):setAuthModal("login"),active:view==="account"},
  ];

  // ─────────────────────────────────────────────────────────────
  return(
    <>
      <style>{CSS}</style>
      <div style={{minHeight:"100vh",background:T.bg,position:"relative",paddingBottom:isMobile?80:0}}>
        <Stars/>
        <Toast toasts={toasts}/>

        {/* ONBOARDING */}
        {showOnboarding&&(
          <div style={{position:"fixed",inset:0,background:"rgba(255,255,255,0.35)",zIndex:600,display:"flex",alignItems:"flex-end",justifyContent:"center",backdropFilter:"blur(12px)"}} onClick={e=>e.target===e.currentTarget&&(setShowOnboarding(false),localStorage.setItem("vg4_onboarded","1"))}>
            <div className="ms" style={{background:T.bgModal,border:`1px solid ${T.border}`,borderRadius:"20px 20px 0 0",padding:"28px 20px 36px",width:"100%",maxWidth:520,animation:"slideUp 0.3s ease",maxHeight:"88vh",overflowY:"auto"}}>
              <div style={{width:36,height:4,background:T.borderSub,borderRadius:2,margin:"0 auto 24px"}}/>
              <OnboardingQuiz onComplete={answers=>{setPrefs(p=>({...p,budget:answers.budget?.includes("Budget")?"Budget":answers.budget?.includes("Mid")?"Mid-range":answers.budget?.includes("Luxury")?"Luxury":"Ultra-luxury",pace:answers.pace?.includes("Packed")?"Action-packed":answers.pace?.includes("Slow")?"Relaxed":"Balanced",accommodation:answers.accommodation?.includes("5-star")?"Hotel":answers.accommodation?.includes("Boutique")?"Boutique":answers.accommodation?.includes("Resort")?"Resort":"Airbnb"}));setShowOnboarding(false);localStorage.setItem("vg4_onboarded","1");toast("Preferences saved! Ready to plan ✦","success");setView("plan");setStepIdx(0);}}/>
            </div>
          </div>
        )}

        {/* AUTH MODAL */}
        {authModal&&(
          <div role="dialog" aria-modal="true" style={{position:"fixed",inset:0,background:"rgba(255,255,255,0.35)",zIndex:500,display:"flex",alignItems:"flex-end",justifyContent:"center",backdropFilter:"blur(12px)"}} onClick={e=>e.target===e.currentTarget&&setAuthModal(null)}>
            <div className="ms" style={{background:T.bgModal,border:`1px solid ${T.border}`,borderRadius:"20px 20px 0 0",padding:"28px 20px 40px",width:"100%",maxWidth:480,animation:"slideUp 0.3s ease"}}>
              <div style={{width:36,height:4,background:T.borderSub,borderRadius:2,margin:"0 auto 24px"}}/>
              <div className="gold" style={{fontSize:12,letterSpacing:"0.25em",marginBottom:10,fontFamily:T.fd}}>✦ ROAMROUTE</div>
              <h2 style={{fontFamily:T.fd,fontSize:26,fontWeight:600,marginBottom:24,color:T.text}}>{authModal==="login"?"Welcome back":"Start your journey"}</h2>
              {(()=>{
                const[nm,snm]=useState("");const[em,sem]=useState("");const[pw,spw]=useState("");const[er,ser]=useState("");const[ld,sld]=useState(false);
                const sub=async()=>{if(!em.trim()||!pw.trim()){ser("Please fill all fields.");return;}sld(true);ser("");await new Promise(r=>setTimeout(r,700));
                  const users=DB.getUsers();
                  if(authModal==="signup"){if(users[em]){ser("Account already exists.");sld(false);return;}const u=DB.upsertUser(em,{email:em,pass:pw,name:nm||em.split("@")[0],plan:"free",joined:Date.now()});setUser(u);toast(`Welcome, ${u.name}! 🎉`,"success");}
                  else{if(!users[em]||users[em].pass!==pw){ser("Invalid credentials.");sld(false);return;}setUser(users[em]);toast(`Welcome back, ${users[em].name}! ✦`,"success");}
                  setAuthModal(null);sld(false);};
                return(<>
                  {authModal==="signup"&&<Inp label="Name" value={nm} onChange={snm} placeholder="Your name" icon="👤" autoFocus/>}
                  <Inp label="Email" value={em} onChange={sem} placeholder="you@example.com" icon="✉️" type="email" inputMode="email" autoFocus={authModal==="login"}/>
                  <Inp label="Password" value={pw} onChange={spw} placeholder="••••••••" icon="🔒" type="password"/>
                  {er&&<div role="alert" style={{color:T.err,fontSize:15,marginBottom:14,padding:"9px 13px",background:"rgba(224,112,112,0.1)",borderRadius:T.rs}}>⚠️ {er}</div>}
                  <Btn onClick={sub} loading={ld}>{authModal==="login"?"Sign In":"Create Free Account"}</Btn>
                  <div style={{textAlign:"center",marginTop:16,fontSize:15,color:T.muted}}>{authModal==="login"?"No account?":"Already a member?"} <button onClick={()=>setAuthModal(m=>m==="login"?"signup":"login")} style={{color:T.gold,fontSize:15,touchAction:"manipulation"}}>{authModal==="login"?"Sign up free":"Sign in"}</button></div>
                  {authModal==="signup"&&<div style={{textAlign:"center",marginTop:10,fontSize:13,color:T.faint}}>Free plan · 1 itinerary/month · No card required</div>}
                </>);
              })()}
            </div>
          </div>
        )}

        {/* UPGRADE MODAL */}
        {showUpgrade&&(
          <div style={{position:"fixed",inset:0,background:"rgba(255,255,255,0.35)",zIndex:500,display:"flex",alignItems:"flex-end",justifyContent:"center",backdropFilter:"blur(12px)"}} onClick={e=>e.target===e.currentTarget&&setShowUpgrade(false)}>
            <div className="ms" style={{background:T.bgModal,border:`1px solid ${T.border}`,borderRadius:"20px 20px 0 0",padding:"28px 20px 40px",width:"100%",maxWidth:520,animation:"slideUp 0.3s ease",maxHeight:"88vh",overflowY:"auto"}}>
              <div style={{width:36,height:4,background:T.borderSub,borderRadius:2,margin:"0 auto 24px"}}/>
              <div style={{textAlign:"center",marginBottom:24}}><div className="gold" style={{fontSize:12,letterSpacing:"0.25em",marginBottom:8,fontFamily:T.fd}}>UPGRADE</div><h2 style={{fontFamily:T.fd,fontSize:26,fontWeight:600,color:T.text}}>Unlock Premium Planning</h2><p style={{fontSize:15,color:T.muted,marginTop:8}}>You've reached your free plan limit</p></div>
              {[PLANS.pro,PLANS.elite].map(pl=>(
                <div key={pl.name} style={{padding:"18px",border:`1.5px solid ${pl.color}35`,borderRadius:T.r,background:`${pl.color}07`,marginBottom:12,cursor:"pointer",transition:T.tb}} onClick={()=>handleUpgrade(pl.name.toLowerCase())} onMouseEnter={e=>{e.currentTarget.style.borderColor=pl.color+"70";}} onMouseLeave={e=>{e.currentTarget.style.borderColor=pl.color+"35";}}>
                  <div style={{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12}}>
                    <div><div style={{fontSize:12,letterSpacing:"0.15em",color:pl.color,marginBottom:4}}>{pl.name.toUpperCase()}</div><div style={{fontFamily:T.fd,fontSize:28,color:T.text}}>${pl.price}<span style={{fontSize:15,color:T.muted}}>/mo</span></div></div>
                    {payLoading===pl.name.toLowerCase()?(<span style={{width:20,height:20,border:`2px solid ${pl.color}40`,borderTop:`2px solid ${pl.color}`,borderRadius:"50%",animation:"spin 0.7s linear infinite",display:"inline-block"}}/>):(<div style={{padding:"7px 14px",background:`${pl.color}20`,border:`1px solid ${pl.color}40`,borderRadius:50,fontSize:14,color:pl.color,fontWeight:600}}>Select →</div>)}
                  </div>
                  <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:5}}>{pl.features.map(f=><div key={f} style={{fontSize:13,color:T.muted,display:"flex",gap:5}}><span style={{color:pl.color,flexShrink:0}}>✓</span>{f}</div>)}</div>
                </div>
              ))}
              <div style={{textAlign:"center",marginTop:12,fontSize:13,color:T.faint}}>Prototype — payments simulated for demo</div>
            </div>
          </div>
        )}

        {/* SHARE MODAL */}
        {showShare&&plan&&(
          <div style={{position:"fixed",inset:0,background:"rgba(255,255,255,0.3)",zIndex:500,display:"flex",alignItems:"flex-end",justifyContent:"center",backdropFilter:"blur(12px)"}} onClick={e=>e.target===e.currentTarget&&setShowShare(false)}>
            <div className="ms" style={{background:T.bgModal,border:`1px solid ${T.border}`,borderRadius:"20px 20px 0 0",padding:"28px 20px 40px",width:"100%",maxWidth:480,animation:"slideUp 0.3s ease"}}>
              <div style={{width:36,height:4,background:T.borderSub,borderRadius:2,margin:"0 auto 24px"}}/>
              <BoardingPassCard plan={plan} form={{...form,origin:currentOrg,destination:currentDest,travelers,duration,budget:prefs.budget}} user={user}/>
            </div>
          </div>
        )}

        {/* TOP NAV */}
        <header style={{position:"sticky",top:0,zIndex:100,borderBottom:"1px solid rgba(0,0,0,0.08)",background:"rgba(255,255,255,0.96)",backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)"}}>
          <div className="safe-top"/>
          <div style={{maxWidth:760,margin:"0 auto",padding:"0 16px",height:56,display:"flex",alignItems:"center",justifyContent:"space-between"}}>
            <button onClick={reset} aria-label="RoamRoute Home" style={{display:"flex",alignItems:"center",gap:8,touchAction:"manipulation",minHeight:40,transition:T.tb,opacity:0.9,":hover":{opacity:1}}}><img src="/logo.svg" alt="RoamRoute AI" style={{height:36,width:36}}/><span className="gold" style={{fontFamily:T.fd,fontSize:16,letterSpacing:"0.1em",fontWeight:700}}>ROAMROUTE</span></button>
            <div style={{display:"flex",gap:8,alignItems:"center"}}>
              {user&&<span style={{fontSize:12,padding:"3px 9px",borderRadius:50,border:`1px solid ${PLANS[user.plan||"free"].color}40`,color:PLANS[user.plan||"free"].color,background:`${PLANS[user.plan||"free"].color}10`}}>{PLANS[user.plan||"free"].name}</span>}
              {user&&(!user.plan||user.plan==="free")&&!isMobile&&<button onClick={()=>setShowUpgrade(true)} style={{fontSize:14,padding:"6px 14px",background:`linear-gradient(135deg,${T.gold},${T.goldLight})`,border:"none",borderRadius:6,color:"#FFFFFF",fontWeight:700,minHeight:32,touchAction:"manipulation"}}>Upgrade ✦</button>}
              {user?(<button onClick={()=>{setUser(null);reset();}} style={{fontSize:14,padding:"6px 12px",border:"1px solid rgba(0,0,0,0.15)",borderRadius:6,color:"#065F5A",minHeight:32,touchAction:"manipulation"}}>Sign Out</button>):(!isMobile&&<div style={{display:"flex",gap:8}}><button onClick={()=>setAuthModal("login")} style={{fontSize:15,padding:"6px 14px",border:"1px solid rgba(0,0,0,0.15)",borderRadius:6,color:"#065F5A",minHeight:36,touchAction:"manipulation"}}>Sign In</button><button onClick={()=>setAuthModal("signup")} style={{fontSize:15,padding:"6px 14px",background:"rgba(201,169,110,0.15)",border:`1px solid ${T.border}`,borderRadius:6,color:T.gold,minHeight:36,touchAction:"manipulation"}}>Free Sign Up</button></div>)}
            </div>
          </div>
        </header>

        {/* MAIN */}
        <main ref={topRef} style={{position:"relative",zIndex:5,maxWidth:760,margin:"0 auto",padding:"0 16px"}}>

          {/* ── HOME ── */}
          {view==="home"&&(
            <div className="pe">
              <div style={{textAlign:"center",padding:"48px 0 36px"}}>
                <img src="/logo.svg" alt="RoamRoute AI Logo" style={{height:80,width:80,margin:"0 auto 20px",animation:"fadeUp 0.6s ease"}}/>
                <div style={{fontSize:12,letterSpacing:"0.3em",color:T.gold,marginBottom:16,fontFamily:T.fd}}>AI-POWERED TRAVEL CONCIERGE</div>
                <h1 style={{fontFamily:T.fd,fontSize:"clamp(34px,8vw,62px)",fontWeight:600,lineHeight:1.08,marginBottom:18}}>
                  Your perfect trip,<br/><em><G>planned in moments.</G></em>
                </h1>
                <p style={{fontSize:18,color:T.muted,maxWidth:400,margin:"0 auto 32px",lineHeight:1.8}}>Flights, hotels, restaurants, activities, visa check — your complete itinerary in seconds, powered by AI that learns your taste.</p>
                <div style={{display:"flex",gap:12,justifyContent:"center",flexWrap:"wrap"}}>
                  <Btn onClick={()=>{setView("plan");setStepIdx(0);}} icon="✦" style={{maxWidth:240}}>Start Planning</Btn>
                  <Btn onClick={()=>setShowOnboarding(true)} variant="ghost" full={false} size="lg">Take Quiz</Btn>
                  {showInstallPrompt && <Btn onClick={installApp} variant="secondary" style={{maxWidth:240}} icon="⬇️">Install App</Btn>}
                </div>
                {!user&&<div style={{marginTop:14,fontSize:15,color:T.faint}}>Free · No card required · <button onClick={()=>setAuthModal("signup")} style={{color:T.gold,fontSize:15,touchAction:"manipulation"}}>Sign up</button></div>}
              </div>
              <div style={{display:"grid",gridTemplateColumns:isMobile?"1fr 1fr":"repeat(3,1fr)",gap:10,marginBottom:36}}>
                {[{icon:"✈️",t:"Smart Flights",d:"Optimal routes & prices"},{icon:"🏨",t:"Curated Stays",d:"Matched to your style"},{icon:"🍽️",t:"Local Dining",d:"Real restaurants only"},{icon:"🎯",t:"Activities",d:"Day-by-day experiences"},{icon:"🛂",t:"Visa Checker",d:"Requirements by passport"},{icon:"🧠",t:"Learns You",d:"Smarter every trip"}].map(f=>(
                  <Card key={f.t} style={{padding:"16px 14px"}}><div style={{fontSize:24,marginBottom:7}}>{f.icon}</div><div style={{fontSize:15,fontWeight:700,color:T.text,marginBottom:3}}>{f.t}</div><div style={{fontSize:14,color:T.faint}}>{f.d}</div></Card>
                ))}
              </div>
              <div style={{marginBottom:36}}>
                <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:14,fontFamily:T.fd}}>EXPLORE DESTINATIONS</div>
                <div style={{display:"flex",gap:10,overflowX:"auto",paddingBottom:8,scrollbarWidth:"none"}}>
                  {POPULAR.map(p=>(
                    <button key={p.name} onClick={()=>setDestPage(p.name)} style={{flexShrink:0,width:110,height:85,borderRadius:T.rs,overflow:"hidden",position:"relative",border:`1px solid ${T.borderSub}`,touchAction:"manipulation",transition:T.tb}} onMouseEnter={e=>{e.currentTarget.style.transform="scale(1.04)";}} onMouseLeave={e=>{e.currentTarget.style.transform="scale(1)";}}>
                      <img src={getImg(p.name)} alt={p.name} style={{width:"100%",height:"100%",objectFit:"cover",filter:"brightness(0.45)"}} loading="lazy"/>
                      <div style={{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"}}><span style={{fontSize:19}}>{p.flag}</span><span style={{fontSize:13,color:"#fff",fontFamily:T.fd,marginTop:4}}>{p.name}</span></div>
                    </button>
                  ))}
                </div>
              </div>
              <div style={{marginBottom:56}}>
                <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:14,fontFamily:T.fd}}>PRICING</div>
                <div style={{display:"grid",gridTemplateColumns:isMobile?"1fr":user?"repeat(3,1fr)":"repeat(3,1fr)",gap:10}}>
                  {Object.values(PLANS).map(pl=>(
                    <Card key={pl.name} style={{padding:"18px 16px",border:pl.name==="Voyager"?`1.5px solid ${T.border}`:`1px solid ${T.borderSub}`,position:"relative"}} hov onClick={()=>pl.price>0&&setShowUpgrade(true)}>
                      {pl.name==="Voyager"&&<div style={{position:"absolute",top:-10,left:"50%",transform:"translateX(-50%)",fontSize:11,padding:"3px 12px",background:T.gold,borderRadius:50,color:"#FFFFFF",fontWeight:700,letterSpacing:"0.1em",whiteSpace:"nowrap"}}>MOST POPULAR</div>}
                      <div style={{fontSize:12,letterSpacing:"0.15em",color:pl.color,marginBottom:5}}>{pl.name.toUpperCase()}</div>
                      <div style={{fontFamily:T.fd,fontSize:26,color:T.text,marginBottom:3}}>{pl.price===0?"Free":`$${pl.price}`}<span style={{fontSize:13,color:T.faint}}>{pl.price>0?"/mo":""}</span></div>
                      <div style={{fontSize:13,color:T.faint,marginBottom:10}}>{pl.limit===Infinity?"Unlimited plans":`${pl.limit} plan/month`}</div>
                      {pl.features.slice(0,3).map(f=><div key={f} style={{fontSize:13,color:T.faint,display:"flex",gap:5,marginBottom:3}}><span style={{color:pl.color}}>✓</span>{f}</div>)}
                    </Card>
                  ))}
                </div>
              </div>
            </div>
          )}

          {/* ── EXPLORE / DESTINATION PAGE ── */}
          {(view==="explore"||destPage)&&(
            <div style={{padding:"24px 0"}}>
              {!destPage && <div style={{display:"flex",alignItems:"center",gap:12,marginBottom:28,justifyContent:"center"}}><img src="/logo.svg" alt="RoamRoute" style={{height:48,width:48}}/><h2 style={{fontFamily:T.fd,fontSize:26,fontWeight:600}}>Explore</h2></div>}
              {destPage?(
                <>
                  <button onClick={()=>setDestPage(null)} style={{display:"flex",alignItems:"center",gap:8,color:T.muted,fontSize:15,marginBottom:20,minHeight:36,touchAction:"manipulation"}}>← Back</button>
                  <DestinationPage destination={destPage} onPlanTrip={d=>{setForm(f=>({...f,destination:d}));setDestPage(null);setView("plan");setStepIdx(1);}}/>
                </>
              ):(
                <>
                  <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:20,fontFamily:T.fd}}>EXPLORE DESTINATIONS</div>
                  <div style={{display:"grid",gridTemplateColumns:isMobile?"1fr 1fr":"repeat(3,1fr)",gap:12}}>
                    {POPULAR.map(p=>(
                      <Card key={p.name} hov onClick={()=>setDestPage(p.name)} style={{overflow:"hidden",padding:0}}>
                        <div style={{height:120,position:"relative"}}><img src={getImg(p.name)} alt={p.name} style={{width:"100%",height:"100%",objectFit:"cover",filter:"brightness(0.45)"}} loading="lazy"/><div style={{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"}}><span style={{fontSize:24}}>{p.flag}</span><span style={{fontFamily:T.fd,fontSize:17,color:"#fff",marginTop:5}}>{p.name}</span></div></div>
                      </Card>
                    ))}
                  </div>
                </>
              )}
            </div>
          )}

          {/* ── PLAN FLOW ── */}
          {view==="plan"&&(
            <div style={{padding:"24px 0"}}>
              <div style={{display:"flex",alignItems:"center",gap:12,marginBottom:22}}>
                <button onClick={()=>{if(stepIdx>0)setStepIdx(i=>i-1);else setView("home");}} aria-label="Back" style={{width:40,height:40,borderRadius:"50%",border:`1px solid ${T.borderSub}`,color:T.muted,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,touchAction:"manipulation"}}>←</button>
                <div style={{flex:1}}><ProgBar cur={stepIdx+1} total={STEPS.length} labels={STEP_LABELS}/></div>
              </div>
              <Card style={{padding:"24px 18px",marginBottom:18}}>{renderStep()}</Card>
              {stepIdx<STEPS.length-1&&<Btn onClick={()=>{if(canNext){hp("light");setStepIdx(i=>i+1);}}} disabled={!canNext}>Continue →</Btn>}
              {stepIdx===STEPS.length-1&&!user&&<div style={{textAlign:"center",marginTop:12,fontSize:14,color:T.faint}}><button onClick={()=>setAuthModal("signup")} style={{color:T.gold,fontSize:14,touchAction:"manipulation"}}>Sign up free</button> to save trips & personalize planning</div>}
            </div>
          )}

          {/* ── PLANNING ANIMATION ── */}
          {view==="planning"&&(
            <div style={{padding:"24px 0"}}><Card style={{padding:"24px 18px"}}><PlanningView destination={currentDest} variant={genVariant}/></Card></div>
          )}

          {/* ── PLAN COMPARISON ── */}
          {view==="compare"&&planVariants&&(
            <div className="pe" style={{padding:"24px 0"}}>
              <div style={{marginBottom:20}}>
                <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:8,fontFamily:T.fd}}>COMPARE PLANS</div>
                <h2 style={{fontFamily:T.fd,fontSize:26,fontWeight:600}}>3 Versions of Your Trip</h2>
                <p style={{fontSize:15,color:T.faint,marginTop:6}}>{currentOrg} → {currentDest} · {travelers} · {duration} days</p>
              </div>
              <Card style={{padding:"20px"}}>
                <PlanComparison plans={planVariants} form={{...form,travelers,duration}} onSelect={p=>{setPlan(p);setView("result");window.scrollTo({top:0,behavior:"smooth"});}}/>
              </Card>
            </div>
          )}

          {/* ── RESULT ── */}
          {view==="result"&&plan&&(
            <div className="pe" style={{padding:"16px 0"}}>
              <div style={{display:"flex",alignItems:"center",gap:12,marginBottom:20,justifyContent:"center"}}><img src="/logo.svg" alt="RoamRoute" style={{height:40,width:40}}/><h2 style={{fontFamily:T.fd,fontSize:20,fontWeight:600}}>Your Itinerary</h2></div>
              {/* Hero */}
              <div style={{borderRadius:T.r,overflow:"hidden",marginBottom:18,position:"relative"}}>
                <img src={destImg} alt={currentDest} style={{width:"100%",height:isMobile?190:240,objectFit:"cover",filter:"brightness(0.33)"}} loading="lazy"/>
                <div style={{position:"absolute",inset:0,padding:"18px 18px",display:"flex",flexDirection:"column",justifyContent:"flex-end"}}>
                  <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:7,fontFamily:T.fd}}>YOUR ITINERARY</div>
                  <h2 style={{fontFamily:T.fd,fontSize:"clamp(19px,4.5vw,28px)",fontWeight:600,marginBottom:5,lineHeight:1.2}}>{currentOrg} <G>→</G> {currentDest}</h2>
                  {plan.tagline&&<div style={{fontSize:15,color:"rgba(255,255,255,0.5)",fontStyle:"italic",fontFamily:T.fd,marginBottom:11}}>"{plan.tagline}"</div>}
                  <div style={{display:"flex",gap:7,flexWrap:"wrap"}}>{[travelers,`${duration} days`,prefs.budget,prefs.pace].filter(Boolean).map(t=><span key={t} style={{fontSize:12,padding:"3px 9px",borderRadius:50,border:`1px solid rgba(201,169,110,0.3)`,color:T.gold,background:"rgba(201,169,110,0.1)"}}>{t}</span>)}</div>
                </div>
              </div>

              {/* Action bar */}
              <div style={{display:"grid",gridTemplateColumns:"repeat(5,1fr)",gap:7,marginBottom:18}}>
                {[
                  {icon:"⬇",label:"Export",action:()=>{doExport(plan,{...form,origin:currentOrg,destination:currentDest,travelers,duration},prefs);toast("Downloading…","success");}},
                  {icon:"✉️",label:emailSent?"Sent!":"Email",action:handleEmailSend},
                  {icon:"↗",label:"Share",action:()=>setShowShare(true)},
                  {icon:"💾",label:"Save",action:()=>saveTrip()},
                  {icon:"＋",label:"New",action:reset},
                ].map(a=>(
                  <button key={a.label} onClick={a.action} style={{padding:"10px 4px",border:`1px solid ${T.borderSub}`,borderRadius:T.rs,background:T.bgCard,color:T.muted,fontSize:12,minHeight:52,display:"flex",flexDirection:"column",alignItems:"center",gap:4,touchAction:"manipulation",transition:T.tb}} onMouseEnter={e=>{e.currentTarget.style.borderColor=T.border;e.currentTarget.style.color=T.gold;}} onMouseLeave={e=>{e.currentTarget.style.borderColor=T.borderSub;e.currentTarget.style.color=T.muted;}}>
                    <span style={{fontSize:20}}>{a.icon}</span>{a.label}
                  </button>
                ))}
              </div>

              {/* Summary */}
              <div style={{padding:"16px 18px",background:"rgba(201,169,110,0.05)",border:`1px solid ${T.border}`,borderRadius:T.r,marginBottom:14}}>
                <p style={{fontSize:16,color:T.muted,lineHeight:1.78,fontFamily:T.fd,fontStyle:"italic"}}>{plan.summary}</p>
                {plan.highlights&&<div style={{display:"flex",gap:8,marginTop:12,flexWrap:"wrap"}}>{plan.highlights.map((h,i)=><span key={i} style={{fontSize:13,color:T.gold}}>✦ {h}</span>)}</div>}
              </div>

              {/* TABS */}
              <div style={{display:"flex",gap:0,borderBottom:`1px solid ${T.borderSub}`,marginBottom:18,overflowX:"auto",scrollbarWidth:"none"}}>
                {TABS.map(tab=>(
                  <button key={tab.id} onClick={()=>setActiveTab(tab.id)} style={{padding:"12px 16px",fontSize:15,color:activeTab===tab.id?T.gold:T.muted,borderBottom:`2px solid ${activeTab===tab.id?T.gold:"transparent"}`,transition:T.tb,flexShrink:0,touchAction:"manipulation",display:"flex",gap:6,alignItems:"center",minHeight:44}}>
                    <span>{tab.icon}</span><span>{tab.label}</span>
                  </button>
                ))}
              </div>

              {/* TAB: OVERVIEW */}
              {activeTab==="overview"&&(
                <div className="pe">
                  <Section icon="🌤️" title="Weather Forecast"><Weather destination={currentDest}/></Section>
                  {plan.flights&&(<Section icon="✈️" title="Flights"><div style={{fontSize:16,color:T.muted,lineHeight:1.85}}>
                    <div style={{marginBottom:9}}><span style={{fontSize:12,color:T.gold,letterSpacing:"0.12em",display:"block",marginBottom:3}}>OUTBOUND</span>{plan.flights.outbound}</div>
                    <div style={{marginBottom:9}}><span style={{fontSize:12,color:T.gold,letterSpacing:"0.12em",display:"block",marginBottom:3}}>RETURN</span>{plan.flights.return}</div>
                    {plan.flights.tips&&<div style={{fontSize:14,color:T.faint,fontStyle:"italic",padding:"8px 11px",background:"rgba(201,169,110,0.06)",borderRadius:T.rs}}>💡 {plan.flights.tips}</div>}
                  </div>{links&&<div style={{marginTop:12}}><AffBtn href={links.flights} label="Search on Skyscanner" icon="✈️"/></div>}</Section>)}
                  {plan.accommodation&&(<Section icon="🏨" title="Accommodation"><div style={{fontFamily:T.fd,fontSize:19,color:T.goldLight,marginBottom:5}}>{plan.accommodation.name}</div><div style={{fontSize:15,color:T.muted,lineHeight:1.8}}><div>{plan.accommodation.location} · {plan.accommodation.type}</div><div style={{color:T.gold,fontWeight:700,marginTop:3,marginBottom:5}}>{plan.accommodation.price_per_night}/night</div><div>{plan.accommodation.highlights}</div>{plan.accommodation.booking_tip&&<div style={{fontSize:14,color:T.faint,fontStyle:"italic",marginTop:7}}>💡 {plan.accommodation.booking_tip}</div>}</div>{links&&<div style={{marginTop:12}}><AffBtn href={links.hotel} label="Book on Booking.com" icon="🏨"/></div>}</Section>)}
                  {plan.transport&&(<Section icon="🚗" title="Ground Transport"><div style={{fontSize:16,color:T.muted,lineHeight:1.75}}><span style={{color:T.gold}}>{plan.transport.type}: </span>{plan.transport.details}{plan.transport.estimated_cost&&<div style={{marginTop:5,color:T.faint,fontSize:14}}>Est: {plan.transport.estimated_cost}</div>}</div>{links&&<div style={{marginTop:12,display:"flex",gap:8,flexWrap:"wrap"}}><AffBtn href={links.car} label="Compare Rentals" icon="🚗"/><AffBtn href={links.transfers} label="Airport Transfers" icon="🚐"/></div>}</Section>)}
                  {plan.budget_breakdown&&(<Section icon="💰" title="Budget Breakdown">
                    <div style={{display:"flex",flexDirection:"column",gap:0}}>
                      {Object.entries(plan.budget_breakdown).filter(([k])=>k!=="total").map(([k,v])=>(
                        <div key={k} style={{display:"flex",justifyContent:"space-between",padding:"9px 0",borderBottom:`1px solid ${T.borderSub}`,fontSize:15}}><span style={{color:T.muted,textTransform:"capitalize"}}>{k}</span><span style={{color:T.text}}>{v}</span></div>
                      ))}
                      <div style={{display:"flex",justifyContent:"space-between",padding:"13px 0 0",fontSize:19,fontFamily:T.fd}}><span style={{color:T.gold}}>Total</span><G>{plan.budget_breakdown.total}</G></div>
                    </div>
                    <div style={{marginTop:16}}><BudgetTracker tripId={plan.tagline||"current"} estimated={plan.budget_breakdown}/></div>
                  </Section>)}
                  {passport&&currentDest&&(<Section icon="🛂" title="Visa Requirements"><VisaChecker destination={currentDest} passport={passport}/></Section>)}
                  {links&&(<div style={{display:"flex",gap:8,flexWrap:"wrap",marginBottom:14}}><AffBtn href={links.activities} label="Tours & Activities" icon="🎯"/><AffBtn href={links.insurance} label="Travel Insurance" icon="🛡️"/></div>)}
                  <Chat plan={plan} form={{...form,origin:currentOrg,destination:currentDest,travelers,duration}} prefs={prefs}/>
                </div>
              )}

              {/* TAB: DAYS */}
              {activeTab==="days"&&(
                <div className="pe">
                  {plan.days?.map((d,i)=><DayCard key={i} day={i+1} data={d} onRegen={regenDay}/>)}
                  {(plan.packing_tips?.length||plan.hidden_gems?.length)&&(
                    <Section icon="🧳" title="Tips & Hidden Gems">
                      {[...(plan.packing_tips||[]).map(t=>({t,i:"✦"})),...(plan.hidden_gems||[]).map(t=>({t,i:"💎"})),...(plan.best_practices||[]).map(t=>({t,i:"📌"}))].map(({t,i},idx)=>(
                        <div key={idx} style={{display:"flex",gap:10,alignItems:"flex-start",padding:"6px 0",borderBottom:`1px solid ${T.borderSub}`,fontSize:15,color:T.muted,lineHeight:1.65}}><span style={{color:T.gold,flexShrink:0,marginTop:1}}>{i}</span>{t}</div>
                      ))}
                    </Section>
                  )}
                </div>
              )}

              {/* TAB: TOOLS */}
              {activeTab==="tools"&&(
                <div className="pe">
                  <Section icon="🧳" title="Packing List">
                    <PackingList destination={currentDest} duration={duration} travelers={travelers} interests={prefs.interests} weather={null}/>
                  </Section>
                  <Section icon="🤝" title="Share with Travel Companions">
                    <CollabPanel trip={{id:plan.tagline||Date.now().toString(),...saveTrip&&{},form:{...form,origin:currentOrg,destination:currentDest,travelers,duration},plan}} user={user}/>
                  </Section>
                  <Section icon="📋" title="Post-Trip Debrief" sx={{opacity:0.7}}>
                    <div style={{fontSize:15,color:T.muted,marginBottom:12}}>Complete this after your trip to improve future recommendations.</div>
                    <PostTripDebrief trip={{form:{...form,origin:currentOrg,destination:currentDest,travelers,duration},prefs,plan}} onSave={t=>{DB.saveTrip(t);toast("Debrief saved! Improving your profile ✦","success");}}/>
                  </Section>
                </div>
              )}

              {/* TAB: SOCIAL */}
              {activeTab==="social"&&(
                <div className="pe">
                  <Section icon="🎫" title="Boarding Pass">
                    <BoardingPassCard plan={plan} form={{...form,origin:currentOrg,destination:currentDest,travelers,duration,budget:prefs.budget}} user={user}/>
                  </Section>
                  {user&&(<Section icon="🎁" title="Refer Friends">
                    <ReferralPanel user={user}/>
                  </Section>)}
                  {!user&&<Section icon="🔐" title="Sign In to Share"><div style={{fontSize:15,color:T.muted,marginBottom:12}}>Create an account to access the full sharing suite, referral rewards, and saved trips.</div><Btn onClick={()=>setAuthModal("signup")} size="md">Create Free Account</Btn></Section>}
                </div>
              )}

              {/* Bottom CTA */}
              <div style={{textAlign:"center",padding:"28px 0 16px"}}>
                <Btn variant="ghost" onClick={reset}>✦ Plan Another Journey</Btn>
              </div>
            </div>
          )}

          {/* ── DASHBOARD ── */}
          {view==="dashboard"&&(
            <div className="pe" style={{padding:"24px 0"}}>
              <div style={{display:"flex",alignItems:"center",gap:12,marginBottom:28,justifyContent:"center"}}><img src="/logo.svg" alt="RoamRoute" style={{height:48,width:48}}/><h2 style={{fontFamily:T.fd,fontSize:26,fontWeight:600}}>My Trips</h2></div>
              <div style={{marginBottom:24}}>
                <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:8,fontFamily:T.fd}}>YOUR JOURNEYS</div>
                <h2 style={{fontFamily:T.fd,fontSize:28,fontWeight:600,marginBottom:4}}><G>{user?.name||"Traveller"}</G>'s Trips</h2>
                <p style={{fontSize:15,color:T.muted}}>{trips.length} saved {trips.length===1?"itinerary":"itineraries"}</p>
              </div>
              <Btn onClick={()=>{setView("plan");setStepIdx(0);}} icon="+" style={{marginBottom:22}}>Plan New Journey</Btn>
              {trips.length===0?(
                <div style={{textAlign:"center",padding:"52px 16px",color:T.faint}}>
                  <div style={{fontSize:48,marginBottom:14,animation:"float 3s ease-in-out infinite"}}>✈️</div>
                  <div style={{fontFamily:T.fd,fontSize:19,color:T.muted,marginBottom:6}}>No trips yet</div>
                  <div style={{fontSize:15}}>Your saved itineraries will appear here</div>
                </div>
              ):(
                <div style={{display:"grid",gridTemplateColumns:isMobile?"1fr":"repeat(auto-fill,minmax(280px,1fr))",gap:12}}>
                  {trips.map((t,i)=>(
                    <Card key={t.id||i} hov onClick={()=>{setForm(f=>({...f,origin:t.form?.origin||"",destination:t.form?.destination||""}));setTravelers(t.form?.travelers||"");setDuration(t.form?.duration||"");setPrefs(t.prefs||{budget:"",pace:"",interests:[],accommodation:"",dietary:[],style:""});setPlan(t.plan);setView("result");window.scrollTo({top:0});}} style={{overflow:"hidden",padding:0}}>
                      <div style={{height:105,position:"relative"}}><img src={getImg(t.form?.destination)} alt="" style={{width:"100%",height:"100%",objectFit:"cover",filter:"brightness(0.44)"}} loading="lazy"/><div style={{position:"absolute",inset:0,padding:"12px 14px",display:"flex",flexDirection:"column",justifyContent:"flex-end"}}><div style={{fontFamily:T.fd,fontSize:16,color:"#fff",fontWeight:600}}>{t.form?.origin} → {t.form?.destination}</div><div style={{fontSize:13,color:"rgba(255,255,255,0.52)",marginTop:2}}>{t.form?.travelers} · {t.form?.duration} days</div></div></div>
                      <div style={{padding:"10px 14px",display:"flex",justifyContent:"space-between",alignItems:"center"}}><div style={{fontSize:13,color:T.faint}}>{new Date(t.date).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}</div>{t.feedback&&<div style={{fontSize:13,color:T.gold}}>{"⭐".repeat(t.feedback.rating)}</div>}</div>
                    </Card>
                  ))}
                </div>
              )}
            </div>
          )}

          {/* ── ACCOUNT ── */}
          {view==="account"&&user&&(
            <div className="pe" style={{padding:"24px 0"}}>
              <div style={{display:"flex",alignItems:"center",gap:12,marginBottom:28,justifyContent:"center"}}><img src="/logo.svg" alt="RoamRoute" style={{height:48,width:48}}/><h2 style={{fontFamily:T.fd,fontSize:26,fontWeight:600}}>Account</h2></div>
              <div style={{marginBottom:24}}>
                <div style={{fontSize:12,color:T.gold,letterSpacing:"0.22em",marginBottom:8,fontFamily:T.fd}}>YOUR ACCOUNT</div>
                <h2 style={{fontFamily:T.fd,fontSize:28,fontWeight:600}}><G>{user.name}</G></h2>
                <p style={{fontSize:15,color:T.muted}}>{user.email}</p>
              </div>
              <div style={{display:"grid",gridTemplateColumns:isMobile?"1fr":"1fr 1fr",gap:12,marginBottom:20}}>
                {[{label:"Plan",val:PLANS[user.plan||"free"].name,icon:"✦"},{label:"Trips Planned",val:trips.length,icon:"✈️"},{label:"Member Since",val:user.joined?new Date(user.joined).toLocaleDateString("en-US",{month:"short",year:"numeric"}):"—",icon:"📅"},{label:"Referrals",val:"0",icon:"🎁"}].map(s=>(
                  <Card key={s.label} style={{padding:"16px"}}><div style={{fontSize:20,marginBottom:6}}>{s.icon}</div><div style={{fontSize:13,color:T.faint,marginBottom:3}}>{s.label}</div><div style={{fontSize:20,fontFamily:T.fd,color:T.text}}>{s.val}</div></Card>
                ))}
              </div>
              {(!user.plan||user.plan==="free")&&(<Card style={{padding:"18px",marginBottom:16,border:`1px solid ${T.border}`}}><div style={{fontSize:12,color:T.gold,letterSpacing:"0.15em",marginBottom:8,fontFamily:T.fd}}>UPGRADE YOUR PLAN</div><div style={{fontSize:15,color:T.muted,marginBottom:12}}>Unlock unlimited plans, multi-city trips, visa checker, packing lists, and more.</div><Btn onClick={()=>setShowUpgrade(true)} size="md">Upgrade to Pro ✦</Btn></Card>)}
              <Section icon="🎁" title="Referral Program"><ReferralPanel user={user}/></Section>
              <Btn onClick={()=>{setUser(null);reset();}} variant="danger" size="md" style={{marginTop:8}}>Sign Out</Btn>
            </div>
          )}

        </main>

        {/* MOBILE INSTALL BANNER */}
        {isMobile && showInstallPrompt && (
          <div style={{position:"fixed",bottom:56,left:0,right:0,zIndex:95,background:"linear-gradient(135deg,rgba(201,169,110,0.97),rgba(237,217,163,0.95))",backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)",borderTop:`1px solid ${T.gold}40`,animation:"slideUp 0.4s cubic-bezier(0.4,0,0.2,1)"}}>
            <div style={{maxWidth:760,margin:"0 auto",padding:"14px 16px",display:"flex",alignItems:"center",justifyContent:"space-between",gap:12}}>
              <div style={{display:"flex",alignItems:"center",gap:12,flex:1}}>
                <div style={{fontSize:26}}>📱</div>
                <div style={{flex:1}}>
                  <div style={{fontSize:15,fontWeight:700,color:"#FFFFFF",marginBottom:2}}>Add RoamRoute to Home Screen</div>
                  <div style={{fontSize:13,color:"rgba(255,255,255,0.8)"}}>Access your trips instantly, works offline</div>
                </div>
              </div>
              <div style={{display:"flex",gap:8,flexShrink:0}}>
                <button onClick={installApp} style={{minHeight:40,padding:"0 16px",background:"#0D9488",border:"none",borderRadius:8,color:T.gold,fontWeight:700,fontSize:14,cursor:"pointer",touchAction:"manipulation",letterSpacing:"0.08em",transition:T.tb}} onMouseEnter={e=>{e.currentTarget.style.background="rgba(255,255,255,0.85)";}} onMouseLeave={e=>{e.currentTarget.style.background="#0D9488";}}>INSTALL</button>
                <button onClick={()=>setShowInstallPrompt(false)} style={{minHeight:40,width:40,background:"rgba(255,255,255,0.2)",border:"none",borderRadius:8,color:"#FFFFFF",fontSize:20,cursor:"pointer",touchAction:"manipulation",transition:T.tb}} onMouseEnter={e=>{e.currentTarget.style.background="rgba(255,255,255,0.35)";}} onMouseLeave={e=>{e.currentTarget.style.background="rgba(255,255,255,0.2)";}}>×</button>
              </div>
            </div>
          </div>
        )}

        {/* MOBILE BOTTOM NAV */}
        {isMobile&&(
          <nav aria-label="Main navigation" style={{position:"fixed",bottom:0,left:0,right:0,zIndex:100,background:"rgba(255,255,255,0.97)",backdropFilter:"blur(20px)",WebkitBackdropFilter:"blur(20px)",borderTop:"1px solid rgba(0,0,0,0.08)"}}>
            <div className="safe-bot" style={{display:"flex"}}>
              {NAV_ITEMS.map(item=>(
                <button key={item.label} onClick={item.action} aria-label={item.label} aria-current={item.active?"page":undefined} style={{flex:1,padding:"11px 0",display:"flex",flexDirection:"column",alignItems:"center",gap:3,minHeight:56,touchAction:"manipulation",position:"relative"}}>
                  <span style={{fontSize:23,lineHeight:1}}>{item.icon}</span>
                  <span style={{fontSize:11,color:item.active?T.gold:"#0F766E",letterSpacing:"0.04em",transition:T.tb}}>{item.label}</span>
                  {item.active&&<div style={{width:18,height:2,background:T.gold,borderRadius:1,position:"absolute",bottom:"max(9px,env(safe-area-inset-bottom))"}}/>}
                </button>
              ))}
            </div>
          </nav>
        )}
      </div>
    </>
  );
}
