{"id":246,"date":"2026-09-19T12:53:56","date_gmt":"2026-09-19T22:53:56","guid":{"rendered":"https:\/\/mana-corp.com\/?page_id=246"},"modified":"2026-09-19T13:01:57","modified_gmt":"2026-09-19T23:01:57","slug":"elementor-246","status":"publish","type":"page","link":"https:\/\/mana-corp.com\/?page_id=246","title":{"rendered":"Elementor #246"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"246\" class=\"elementor elementor-246\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8e9cab9 e-flex e-con-boxed e-con e-parent\" data-id=\"8e9cab9\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-feb3994 elementor-widget elementor-widget-html\" data-id=\"feb3994\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">\n<meta name=\"theme-color\" content=\"#FF6B00\"><meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n<title>Tahiti SuperApp \u2022 Mobile WebApp \u2022 Airy Fintech<\/title>\n<script src=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.js\"><\/script><link href=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.css\" rel=\"stylesheet\">\n<script src=\"https:\/\/unpkg.com\/peerjs@1.5.4\/dist\/peerjs.min.js\"><\/script>\n<style>\n*{box-sizing:border-box;margin:0;padding:0;font-family:-apple-system,Inter,SF Pro,system-ui}\nhtml,body{height:100%;background:#0a0a0a}\nbody{display:flex;justify-content:center;background:#000}\n#app{width:100%;max-width:430px;height:100dvh;position:relative;background:#0e0e0e;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 0 80px rgba(0,0,0,.8)}\n:root{--p:#FF6B00;--bg:#0e0e0e;--card:#181818;--card2:#1f1f1f;--text:#fff;--muted:#8a8a8a;--line:#ffffff12;--radius:22px}\nbody.theme-blue{ --p:#0066FF; --bg:#f7f9ff; --card:#ffffff; --card2:#f0f4ff; --text:#0a1931; --muted:#7a8aaa; --line:#00000012}\nbody.theme-green{ --p:#25D366; --bg:#f3faf5; --card:#ffffff; --card2:#eaf7ed; --text:#0a2814; --muted:#6e8a76; --line:#00000010}\n#app{background:var(--bg);color:var(--text);transition:.3s}\n#map{position:absolute;inset:0;z-index:0}\n.header{position:absolute;top:0;left:0;right:0;z-index:20;padding:12px 14px;display:flex;justify-content:space-between;align-items:center;pointer-events:none}\n.header > *{pointer-events:auto}\n.glass{background:rgba(24,24,24,.85);backdrop-filter:blur(20px);border:1px solid var(--line);border-radius:999px;padding:8px 12px;display:flex;align-items:center;gap:8px}\n.theme-blue.glass{background:rgba(255,255,255,.9)}\n.theme-green.glass{background:rgba(255,255,255,.92)}\n.avatar{width:34px;height:34px;border-radius:50%;background:var(--p);display:grid;place-items:center;font-weight:900;color:#000;font-size:14px}\n.pill{border:0;border-radius:999px;padding:8px 12px;background:var(--p);color:#000;font-weight:800;font-size:12px;cursor:pointer}\n.pill-ghost{background:var(--card);color:var(--text);border:1px solid var(--line)}\n.sheet{position:absolute;left:0;right:0;z-index:15;background:var(--bg);border-radius:28px 28px 0 0;box-shadow:0 -20px 60px rgba(0,0,0,.4);transition:transform.35s cubic-bezier(.2,.8,.2,1);border-top:1px solid var(--line);display:flex;flex-direction:column;max-height:88vh}\n.sheet.collapsed{transform:translateY(calc(100% - 92px))}\n.sheet.full{transform:translateY(0);max-height:92vh}\n.handle{width:36px;height:4px;background:var(--line);border-radius:999px;margin:10px auto 6px}\n.tabs{position:absolute;bottom:0;left:0;right:0;z-index:30;background:var(--card);border-top:1px solid var(--line);display:flex;justify-content:space-around;padding:8px 0 calc(10px + env(safe-area-inset-bottom));border-radius:0}\n.tabs button{border:0;background:transparent;color:var(--muted);font-size:10px;font-weight:700;display:flex;flex-direction:column;align-items:center;gap:4px;flex:1}\n.tabs button.active{color:var(--p)}\n.tabs button.ic{width:28px;height:28px;border-radius:10px;display:grid;place-items:center;background:var(--card2);font-size:14px}\n.tabs button.active.ic{background:var(--p);color:#000}\n.page{display:none;overflow:auto;flex:1;padding-bottom:10px}\n.page.active{display:block}\n.card{background:var(--card);border:1px solid var(--line);border-radius:22px;padding:16px;margin:10px 12px}\n.card-airy{background:var(--card2);border-radius:22px;padding:14px;margin:8px 12px;border:1px solid transparent}\n.chip{display:inline-flex;align-items:center;gap:6px;padding:9px 14px;border-radius:999px;background:var(--card);border:1px solid var(--line);color:var(--text);font-weight:600;font-size:13px;margin:4px;cursor:pointer;white-space:nowrap}\n.chip.active{background:var(--p);color:#000;border-color:var(--p)}\n.badge{background:var(--p);color:#000;padding:5px 10px;border-radius:999px;font-weight:800;font-size:11px}\n.btn{border:0;border-radius:16px;padding:14px 16px;font-weight:800;cursor:pointer;font-size:14px;display:flex;justify-content:center;align-items:center;gap:8px}\n.btn-p{background:var(--p);color:#000;width:100%}\n.btn-g{background:var(--card);color:var(--text);border:1px solid var(--line);width:100%}\n.input{width:100%;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:12px 14px;color:var(--text);font-size:14px;font-weight:600}\n.input:focus{outline:none;border-color:var(--p)}\n.collapse{overflow:hidden;transition:max-height.3s ease}\n.collapse-head{display:flex;justify-content:space-between;align-items:center;cursor:pointer}\n.voucher{background:linear-gradient(135deg,#161616,#2a2a2a);color:white;border-radius:24px;padding:18px;margin:12px;border:1px solid #ffffff12;position:relative}\n.theme-blue.voucher{background:linear-gradient(135deg,#0a1931,#1a3d8a)}\n.theme-green.voucher{background:linear-gradient(135deg,#0e2814,#1a5a2e)}\nvideo{width:100%;border-radius:16px;background:#000;aspect-ratio:16\/9}\n#toast{position:fixed;bottom:84px;left:50%;transform:translateX(-50%);background:#000;color:white;padding:12px 18px;border-radius:999px;display:none;z-index:99;font-weight:700;max-width:90%;text-align:center}\n.map-toggle{position:absolute;right:12px;top:68px;z-index:19;display:flex;flex-direction:column;gap:8px}\n.map-toggle button{width:42px;height:42px;border-radius:14px;background:var(--card);border:1px solid var(--line);display:grid;place-items:center;cursor:pointer;font-size:16px}\n<\/style><\/head><body class=\"theme-orange\">\n<div id=\"app\">\n<div id=\"map\"><\/div>\n<div class=\"map-toggle\"><button id=\"btnFull\">\u26f6<\/button><button id=\"btnTile\">\ud83d\uddfa\ufe0f<\/button><button id=\"btnLocate\">\ud83d\udccd<\/button><\/div>\n<div class=\"header\"><div class=\"glass\"><div class=\"avatar\">T<\/div><div><div style=\"font-weight:800;font-size:13px;line-height:1\">Tahiti \u2022 Black Orange FIRE<\/div><div style=\"font-size:10px;color:var(--muted)\">PeerJS \u2022 15-30 min wait \u2022 <span id=\"peerIdShort\">connecting<\/span><\/div><\/div><\/div><div style=\"display:flex;gap:6px\"><button class=\"pill\" id=\"btnTheme\">\ud83c\udfa8<\/button><\/div><\/div>\n<div class=\"sheet\" id=\"sheet\"><div class=\"handle\" id=\"handle\"><\/div>\n<div class=\"page active\" id=\"pExplore\">\n<div style=\"padding:0 12px;display:flex;gap:6px;overflow:auto\"><button class=\"chip active\" data-theme=\"orange\">\ud83d\udfe0 Orange Black<\/button><button class=\"chip\" data-theme=\"blue\">\ud83d\udd35 Blue White<\/button><button class=\"chip\" data-theme=\"green\">\ud83d\udfe2 Green White<\/button><\/div>\n<div class=\"card\"><div class=\"collapse-head\" onclick=\"toggleCollapse('c1')\"><b>\ud83c\udf3a Archipelago<\/b><span>\u2303<\/span><\/div><div id=\"c1\" class=\"collapse\" style=\"max-height:200px\"><div style=\"margin-top:10px;display:flex;flex-wrap:wrap\"><span class=\"chip active\" data-arch=\"Society\">Society Islands<\/span><span class=\"chip\" data-arch=\"Tuamotu\">Tuamotu 80+<\/span><span class=\"chip\" data-arch=\"Marquesas\">Marquesas<\/span><span class=\"chip\" data-arch=\"Austral\">Austral<\/span><span class=\"chip\" data-arch=\"Gambier\">Gambier<\/span><\/div><div style=\"margin-top:6px;display:flex;flex-wrap:wrap\"><span class=\"chip\" data-island=\"Tahiti\">Tahiti Papeete<\/span><span class=\"chip\" data-island=\"Moorea\">Moorea<\/span><span class=\"chip\" data-island=\"Bora Bora\">Bora Bora<\/span><span class=\"chip\" data-island=\"Rangiroa\">Rangiroa<\/span><\/div><\/div><\/div>\n<div class=\"card\"><b>Book Anything<\/b><div style=\"font-size:12px;color:var(--muted)\">Hotel, Restaurant, Activity, Bar, Caf\u00e9, Babysitting, Taxi, Circle Island<\/div><\/div>\n<\/div>\n<div class=\"page\" id=\"pChat\">\n<div class=\"card-airy\"><div class=\"collapse-head\" onclick=\"toggleCollapse('peerBox')\"><b>\ud83d\udcac PeerJS \u2022 Chat \u2022 Visio \u2022 Location DataChannel<\/b><span>\u2303<\/span><\/div><div id=\"peerBox\" class=\"collapse\" style=\"max-height:600px\">\n<div style=\"display:flex;gap:8px;margin-top:10px\"><input id=\"peerIdInput\" class=\"input\" placeholder=\"Your ID auto \u2022 Enter remote ID\"><button class=\"pill\" id=\"btnConnectPeer\" style=\"white-space:nowrap\">Connect<\/button><\/div>\n<div style=\"display:flex;gap:8px;margin-top:10px\"><video id=\"localVideo\" autoplay muted playsinline><\/video><video id=\"remoteVideo\" autoplay playsinline><\/video><\/div>\n<div style=\"display:flex;gap:8px;margin-top:8px\"><button class=\"chip\" id=\"btnCam\">\ud83d\udcf9 Visio<\/button><button class=\"chip\" id=\"btnShareLoc\">\ud83d\udccd Live Location<\/button><button class=\"chip\" id=\"btnSwitchDriver\">\ud83d\udd04 Switch Driver<\/button><\/div>\n<div id=\"chatBox\" style=\"margin-top:8px;max-height:140px;overflow:auto\"><\/div>\n<div style=\"display:flex;gap:6px;margin-top:8px\"><input id=\"chatInput\" class=\"input\" placeholder=\"Message via DataChannel...\"><button class=\"pill\" id=\"btnSend\">Send<\/button><\/div>\n<\/div><\/div>\n<div class=\"card\"><div class=\"collapse-head\" onclick=\"toggleCollapse('bookBox')\"><b>\ud83e\udded Book Ride \u2022 Service<\/b><span>\u2303<\/span><\/div><div id=\"bookBox\" class=\"collapse\" style=\"max-height:900px\">\n<div style=\"margin-top:10px;display:flex;flex-wrap:wrap;overflow:auto\"><span class=\"chip active\" data-cat=\"taxi\">Taxi<\/span><span class=\"chip\" data-cat=\"circle\">Circle $100\/h ONLY min4h<\/span><span class=\"chip\" data-cat=\"hotel\">Hotel<\/span><span class=\"chip\" data-cat=\"restaurant\">Restaurant<\/span><span class=\"chip\" data-cat=\"activity\">Activity<\/span><span class=\"chip\" data-cat=\"bar\">Bar<\/span><span class=\"chip\" data-cat=\"cafe\">Caf\u00e9<\/span><span class=\"chip\" data-cat=\"babysitting\">Babysitting<\/span><\/div>\n<div style=\"display:flex;gap:8px;margin-top:10px\"><input id=\"profile\" class=\"input\" placeholder=\"Profile Name\"><select id=\"pax\" class=\"input\" style=\"width:110px\"><option>1 pax<\/option><option selected>8 max<\/option><\/select><\/div>\n<div style=\"display:flex;gap:8px;margin-top:8px\"><input id=\"pickup\" class=\"input\" placeholder=\"\ud83d\udccd Pickup \u2014 tap map\" readonly><input id=\"dropoff\" class=\"input\" placeholder=\"\ud83d\udccd Drop \/ Place \u2014 tap map\" readonly><\/div>\n<div id=\"airportBox\" style=\"display:none;margin-top:8px;gap:6px;flex-wrap:wrap\"><select id=\"airline\" class=\"input\" style=\"flex:1\"><option>Airline?<\/option><option>Air Tahiti Nui TN<\/option><option>Air Tahiti VT<\/option><option>Air Moana<\/option><option>French Bee BF<\/option><option>Private<\/option><\/select><input id=\"flightNo\" class=\"input\" placeholder=\"TN101\" style=\"width:90px\"><input id=\"flightTime\" type=\"time\" class=\"input\" style=\"width:90px\"><\/div>\n<div style=\"display:flex;gap:8px;margin-top:10px\"><button class=\"btn btn-g\" style=\"flex:1\" id=\"btnNow\">Now<br><span style=\"font-size:10px\">15-30 min wait<\/span><\/button><button class=\"btn btn-p\" style=\"flex:1\" id=\"btnLater\">Later<br><span style=\"font-size:10px\">+ ICS GCal<\/span><\/button><\/div>\n<div id=\"etaBox\" style=\"display:none;margin-top:10px\" class=\"card-airy\"><b id=\"etaText\">--<\/b><div id=\"etaSub\" style=\"font-size:12px;color:var(--muted)\">--<\/div><\/div>\n<div id=\"voucherPreview\" style=\"margin-top:6px\"><\/div>\n<\/div><\/div>\n<\/div>\n<div class=\"page\" id=\"pRoadmap\">\n<div class=\"card\"><b>\ud83e\udded Trip Roadmap \u2022 Voucher Cards<\/b><div style=\"font-size:12px;color:var(--muted)\">Tap + to build your Polynesia trip. ICS auto Google Calendar.<\/div><button class=\"btn btn-p\" style=\"margin-top:10px\" onclick=\"switchTab('pChat')\">+ Add another booking<\/button><\/div>\n<div id=\"roadmapList\"><\/div>\n<\/div>\n<div class=\"page\" id=\"pDriver\">\n<div class=\"card\" style=\"background:var(--p);color:#000\"><b>\ud83d\ude95 Driver \u2022 Waiting List \u2022 Online<\/b><div style=\"font-size:12px\">Wait 15-30 min \u2022 Switch Driver \u2022 PeerJS location<\/div><div style=\"display:flex;gap:8px;margin-top:8px\"><span class=\"badge\" style=\"background:#000;color:var(--p)\">Now \u2022 <span id=\"nowCount\">0<\/span><\/span><span class=\"badge\" style=\"background:#000;color:var(--p)\">Later \u2022 <span id=\"laterCount\">0<\/span><\/span><\/div><\/div>\n<div id=\"driverList\"><\/div>\n<div class=\"card\"><div class=\"collapse-head\" onclick=\"toggleCollapse('drivers')\"><b>Switchable Drivers<\/b><span>\u2303<\/span><\/div><div id=\"drivers\" class=\"collapse\" style=\"max-height:200px\"><div style=\"display:flex;flex-wrap:wrap;margin-top:8px\"><span class=\"chip active\" data-driver=\"Teva\">Teva 4.9\u2605 2min<\/span><span class=\"chip\" data-driver=\"Maui\">Maui 4.8\u2605 5min<\/span><span class=\"chip\" data-driver=\"Heiva\">Heiva 5.0\u2605 8min<\/span><\/div><\/div><\/div>\n<div class=\"card\"><b>\ud83d\udcc5 Google Calendar \u2022 ICS<\/b><div id=\"calList\" style=\"font-size:12px;color:var(--muted)\"><\/div><\/div>\n<\/div>\n<\/div>\n<div class=\"tabs\"><button class=\"active\" data-page=\"pExplore\"><span class=\"ic\">\ud83c\udfdd\ufe0f<\/span>Explore<\/button><button data-page=\"pChat\"><span class=\"ic\">\ud83d\udcac<\/span>Chat \u2022 PeerJS<\/button><button data-page=\"pRoadmap\"><span class=\"ic\">\ud83e\udded<\/span>Roadmap<\/button><button data-page=\"pDriver\"><span class=\"ic\">\ud83d\ude95<\/span>Driver<\/button><\/div>\n<\/div>\n<div id=\"toast\"><\/div>\n<script>\nconst _w=atob(\"Njg5ODk2NjAwMDM=\"); const WA_BASE=\"https:\/\/wa.me\/\"+_w;\nconst styles={liberty:\"https:\/\/tiles.openfreemap.org\/styles\/liberty\",sat:{version:8,sources:{sat:{type:\"raster\",tiles:[\"https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}\"],tileSize:256}},layers:[{id:\"sat\",type:\"raster\",source:\"sat\"}]}};\nlet arch=\"Society\",island=\"Tahiti\",cat=\"taxi\",pickupLL=null,dropoffLL=null,pickupShort=\"\",dropoffShort=\"\",timing=\"now\",currentDriver=\"Teva\",isFullMap=false;\nlet trips=JSON.parse(localStorage.getItem(\"tahiti_trips\")||\"[]\");\nlet fares=[{id:1,min:400,only:\"circle\"},{id:2,min:800,only:\"circle\"},{id:3,flat:25,perKm:2.5,min:25,only:\"taxi\"}];\nconst map=new maplibregl.Map({container:'map',style:styles.liberty,center:[-149.4068,-17.65],zoom:11,attributionControl:false});map.addControl(new maplibregl.NavigationControl({showCompass:false}),'bottom-right');\nlet pickM=null,dropM=null;\nfunction toast(m){const t=document.getElementById('toast');t.textContent=m;t.style.display='block';setTimeout(()=>t.style.display='none',3500);}\nfunction shortAddr(f){return f?f.split(',').slice(0,3).join(', ').slice(0,55):\"Tahiti\";}\nasync function reverse(lng,lat){try{const r=await fetch(`https:\/\/nominatim.openstreetmap.org\/reverse?format=json&lon=${lng}&lat=${lat}&zoom=14`);const j=await r.json();return j.display_name||`${lat.toFixed(4)},${lng.toFixed(4)}`;}catch{return `${lat.toFixed(4)},${lng.toFixed(4)}`;}}\nwindow.toggleCollapse=(id)=>{const el=document.getElementById(id); if(!el) return; el.style.maxHeight=el.style.maxHeight==='0px'?'900px':'0px';};\nfunction switchTab(id){document.querySelectorAll('.page').forEach(p=>p.classList.remove('active'));document.getElementById(id).classList.add('active');document.querySelectorAll('.tabs button').forEach(b=>b.classList.remove('active'));document.querySelector(`[data-page=\"${id}\"]`)?.classList.add('active'); if(id==='pExplore') document.getElementById('sheet').classList.add('collapsed'); else document.getElementById('sheet').classList.remove('collapsed'); map.resize();}\ndocument.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>switchTab(b.dataset.page));\ndocument.getElementById('handle').onclick=()=>{document.getElementById('sheet').classList.toggle('collapsed');};\ndocument.getElementById('btnFull').onclick=()=>{isFullMap=!isFullMap; const sheet=document.getElementById('sheet'); if(isFullMap){sheet.classList.add('collapsed'); toast(\"Fullscreen Map \u2014 tap map to set pickup\/drop\");} else {sheet.classList.remove('collapsed');} map.resize();};\ndocument.querySelectorAll('[data-theme]').forEach(b=>b.onclick=()=>{document.querySelectorAll('[data-theme]').forEach(x=>x.classList.remove('active'));b.classList.add('active');document.body.className='theme-'+b.dataset.theme; localStorage.setItem('theme',b.dataset.theme); toast(\"Theme: \"+b.dataset.theme);});\nlet savedTheme=localStorage.getItem('theme')||'orange'; document.body.className='theme-'+savedTheme;\ndocument.querySelectorAll('[data-arch]').forEach(c=>c.onclick=()=>{document.querySelectorAll('[data-arch]').forEach(x=>x.classList.remove('active'));c.classList.add('active');arch=c.dataset.arch;});\ndocument.querySelectorAll('[data-island]').forEach(c=>c.onclick=()=>{island=c.dataset.island; const cent={Tahiti:[-149.4068,-17.65],Moorea:[-149.83,-17.54],\"Bora Bora\":[-151.74,-16.5],Rangiroa:[-147.64,-15.12]}; if(cent[island]) map.flyTo({center:cent[island],zoom:12});});\ndocument.querySelectorAll('[data-cat]').forEach(c=>c.onclick=()=>{document.querySelectorAll('[data-cat]').forEach(x=>x.classList.remove('active'));c.classList.add('active');cat=c.dataset.cat;});\ndocument.querySelectorAll('[data-driver]').forEach(c=>c.onclick=()=>{document.querySelectorAll('[data-driver]').forEach(x=>x.classList.remove('active'));c.classList.add('active');currentDriver=c.dataset.driver; toast(\"Driver: \"+currentDriver);});\nfunction setPickup(ll,s){pickupLL=ll;pickupShort=s; if(pickM)pickM.remove(); pickM=new maplibregl.Marker({color:\"#FF6B00\"}).setLngLat(ll).addTo(map); document.getElementById('pickup').value=s; maybeRoute(); document.getElementById('sheet').classList.remove('collapsed');}\nfunction setDropoff(ll,s){dropoffLL=ll;dropoffShort=s; if(dropM)dropM.remove(); dropM=new maplibregl.Marker({color:\"#ff0000\"}).setLngLat(ll).addTo(map); document.getElementById('dropoff').value=s; maybeRoute(); const isAir=\/airport|faa'a\/i.test(s); document.getElementById('airportBox').style.display=isAir?'flex':'none';}\nasync function maybeRoute(){ if(!pickupLL||!dropoffLL) return; const url=`https:\/\/router.project-osrm.org\/route\/v1\/driving\/${pickupLL[0]},${pickupLL[1]};${dropoffLL[0]},${dropoffLL[1]}?overview=full&geometries=geojson`; try{ const r=await fetch(url); const j=await r.json(); if(j.routes&&j.routes[0]){ const rt=j.routes[0]; const dist=rt.distance\/1000; const dur=rt.duration\/60; if(map.getSource('route')){map.removeLayer('route');map.removeSource('route');} map.addSource('route',{type:'geojson',data:{type:'Feature',properties:{},geometry:rt.geometry}}); map.addLayer({id:'route',type:'line',source:'route',paint:{'line-color':getComputedStyle(document.body).getPropertyValue('--p'),'line-width':5}}); document.getElementById('etaBox').style.display='block'; document.getElementById('etaText').textContent=`${Math.round(dur)} min \u2022 ${dist.toFixed(1)} km \u2022 Driver ${currentDriver}`; let best=Infinity; fares.forEach(f=>{ if(f.only!==cat){ if(cat==='circle'&&f.only!=='circle') return; if(cat!=='circle'&&f.only==='circle') return; } let p=(f.flat||0)+(f.perKm||0)*dist; if(f.min) p=Math.max(p,f.min); if(p<best) best=p; }); if(cat==='circle') best=Math.max(best,400); window._lastFare=isFinite(best)?best:(cat==='circle'?400:25); document.getElementById('etaSub').textContent=cat==='circle'?`Circle Island ONLY $100\/h min 4h = $${window._lastFare} drinks+fruits free`:`Taxi $${window._lastFare} \u2022 15-30 min wait if Now`; } }catch{} }\nmap.on('click',async e=>{ const lng=e.lngLat.lng,lat=e.lngLat.lat; const full=await reverse(lng,lat); const s=shortAddr(full); if(!pickupLL){ setPickup([lng,lat],s); } else if(!dropoffLL){ setDropoff([lng,lat],s);} else { if(pickM)pickM.remove(); if(dropM)dropM.remove(); if(map.getSource('route')){map.removeLayer('route');map.removeSource('route');} pickupLL=null; dropoffLL=null; setPickup([lng,lat],s);} });\ndocument.getElementById('btnLocate').onclick=()=>{ navigator.geolocation.getCurrentPosition(async pos=>{ const ll=[pos.coords.longitude,pos.coords.latitude]; map.flyTo({center:ll,zoom:14}); const f=await reverse(ll[0],ll[1]); setPickup(ll,shortAddr(f)); if(conn&&conn.open) conn.send({type:'location',lat:ll[1],lng:ll[0]}); }); };\ndocument.getElementById('btnTile').onclick=()=>{ if(map.getSource('sat')) map.setStyle(styles.liberty); else map.setStyle(styles.sat); };\ndocument.getElementById('btnTheme').onclick=()=>{ const t=['orange','blue','green']; let cur=localStorage.getItem('theme')||'orange'; let idx=(t.indexOf(cur)+1)%t.length; document.body.className='theme-'+t[idx]; localStorage.setItem('theme',t[idx]); toast(\"Theme \"+t[idx]); };\nlet peer=null,conn=null,localStream=null;\nfunction initPeer(){ peer=new Peer('tahiti-'+Math.floor(Math.random()*10000)); peer.on('open',id=>{ document.getElementById('peerIdShort').textContent=id; document.getElementById('peerIdInput').placeholder='Your ID: '+id; }); peer.on('connection',c=>{ conn=c; setupConn(); }); peer.on('call',call=>{ navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(s=>{ localStream=s; document.getElementById('localVideo').srcObject=s; call.answer(s); call.on('stream',rs=>{ document.getElementById('remoteVideo').srcObject=rs; }); }); }); }\nfunction setupConn(){ conn.on('open',()=>{ toast(\"PeerJS DataChannel connected\"); addChat(\"System: Connected via DataChannel\"); }); conn.on('data',d=>{ if(d.type==='chat') addChat(\"Driver: \"+d.msg); else if(d.type==='location'){ addChat(`\ud83d\udccd ${d.lat.toFixed(4)},${d.lng.toFixed(4)}`); if(pickM) pickM.setLngLat([d.lng,d.lat]); } else if(d.type==='booking') addChat(\"\ud83d\udce6 \"+d.msg); }); }\nfunction addChat(t){ const div=document.createElement('div'); div.style.cssText='background:var(--card);padding:8px 10px;border-radius:12px;margin:4px 0;font-size:13px;border:1px solid var(--line)'; div.textContent=t; document.getElementById('chatBox').appendChild(div); document.getElementById('chatBox').scrollTop=9999; }\ndocument.getElementById('btnConnectPeer').onclick=()=>{ const rid=document.getElementById('peerIdInput').value.trim(); if(!rid||!peer) return toast(\"Enter remote Peer ID\"); conn=peer.connect(rid); setupConn(); if(localStream){ const call=peer.call(rid,localStream); if(call) call.on('stream',rs=>{ document.getElementById('remoteVideo').srcObject=rs; }); } };\ndocument.getElementById('btnSend').onclick=()=>{ const m=document.getElementById('chatInput').value; if(!m) return; addChat(\"You: \"+m); if(conn&&conn.open) conn.send({type:'chat',msg:m}); document.getElementById('chatInput').value=''; };\ndocument.getElementById('btnCam').onclick=async()=>{ try{ localStream=await navigator.mediaDevices.getUserMedia({video:true,audio:true}); document.getElementById('localVideo').srcObject=localStream; toast(\"Visio ON via PeerJS\"); }catch{ toast(\"Camera blocked\"); } };\ndocument.getElementById('btnShareLoc').onclick=()=>{ navigator.geolocation.getCurrentPosition(p=>{ const d={type:'location',lat:p.coords.latitude,lng:p.coords.longitude}; if(conn&&conn.open) conn.send(d); addChat(`\ud83d\udccd You ${d.lat.toFixed(4)},${d.lng.toFixed(4)} via DataChannel`); }); };\ndocument.getElementById('btnSwitchDriver').onclick=()=>{ const dr=['Teva','Maui','Heiva']; let i=dr.indexOf(currentDriver); currentDriver=dr[(i+1)%dr.length]; toast(\"Switched to \"+currentDriver); if(conn&&conn.open) conn.send({type:'chat',msg:'Driver switched to '+currentDriver}); };\ninitPeer();\ndocument.getElementById('btnNow').onclick=()=>{ timing='now'; createVoucher(); };\ndocument.getElementById('btnLater').onclick=()=>{ timing='later'; createVoucher(); };\nfunction buildData(){ return {id:Date.now(),profile:document.getElementById('profile').value||\"Guest\",pax:document.getElementById('pax').value,cat,arch,island,pickup:pickupShort||\"Tahiti\",dropoff:dropoffShort||\"Tahiti\",pickupLL,dropoffLL,fare:window._lastFare||400,airline:document.getElementById('airline').value,flightNo:document.getElementById('flightNo').value,flightTime:document.getElementById('flightTime').value,timing,driver:currentDriver,eta:document.getElementById('etaText').textContent}; }\nfunction createVoucher(){ if(!pickupLL||!dropoffLL){ toast(\"Tap map: pickup then drop\"); return; } const d=buildData(); trips.push(d); localStorage.setItem(\"tahiti_trips\",JSON.stringify(trips)); renderAll(); if(conn&&conn.open) conn.send({type:'booking',msg:`${d.cat} ${d.pickup}\u2192${d.dropoff} $${d.fare} ${d.driver}`}); const fareT=d.cat==='circle'?`Circle $100\/h ONLY min4h $${d.fare}`:`$${d.fare}`; const html=`<div class=\"voucher\"><div style=\"display:flex;justify-content:space-between\"><div><div style=\"font-size:10px;letter-spacing:.12em;opacity:.6\">VOUCHER \u2022 ${d.cat.toUpperCase()} \u2022 ${d.timing.toUpperCase()} \u2022 ${d.driver}<\/div><div style=\"font-size:17px;font-weight:800;margin-top:4px\">${d.pickup} \u2192 ${d.dropoff}<\/div><div style=\"font-size:11px;color:#aaa\">${d.arch} \u2022 ${d.island} \u2022 ${d.eta}<\/div><\/div><span class=\"badge\">${d.timing==='now'?'15-30 WAIT':'SCHED'}<\/span><\/div><div style=\"border-top:1px dashed rgba(255,255,255,.15);margin:12px 0\"><\/div><div style=\"display:flex;gap:10px;font-size:12px\"><div>\ud83d\udc64 ${d.profile}<\/div><div>\ud83d\udc65 ${d.pax}<\/div><div>\ud83d\udcb0 ${fareT}<\/div><\/div><div style=\"display:flex;gap:8px;margin-top:12px\"><button class=\"btn\" style=\"flex:1;background:white;color:#111;border-radius:14px\" onclick=\"declineVoucher(${d.id})\">Decline<\/button><button class=\"btn btn-p\" style=\"flex:1\" onclick=\"acceptVoucher(${d.id})\">Accept + ICS<\/button><\/div><button class=\"btn\" style=\"width:100%;margin-top:8px;background:rgba(255,255,255,.12);color:white\" onclick=\"downloadICS(${d.id})\">\ud83d\udcc5 GCal.ics<\/button><\/div>`; document.getElementById('voucherPreview').innerHTML=html; toast(\"Voucher added to Roadmap\"); }\nfunction renderAll(){ const rl=document.getElementById('roadmapList'); rl.innerHTML=\"\"; trips.forEach(t=>{ const div=document.createElement('div'); div.className='card'; div.innerHTML=`<div style=\"display:flex;justify-content:space-between\"><b>${t.cat} \u2022 ${t.driver}<\/b><span class=\"badge\">${t.timing}<\/span><\/div><div style=\"font-size:14px;margin-top:4px\">${t.pickup} \u2192 ${t.dropoff}<\/div><div style=\"font-size:11px;color:var(--muted)\">${t.arch} \u2022 $${t.fare} \u2022 WA${t.id.toString().slice(-4)} \u2022 ${t.eta||''}<\/div>`; rl.appendChild(div); }); const dl=document.getElementById('driverList'); dl.innerHTML=\"\"; trips.forEach(t=>{ const d=document.createElement('div'); d.className='card'; d.innerHTML=`<div style=\"display:flex;justify-content:space-between\"><b>#WA${t.id.toString().slice(-4)} ${t.cat} ${t.driver}<\/b><span style=\"font-size:11px;color:var(--muted)\">${t.timing}<\/span><\/div><div style=\"font-size:13px\">${t.pickup} \u2192 ${t.dropoff} \u2022 $${t.fare}<\/div><button class=\"btn btn-p\" style=\"margin-top:8px\" onclick=\"acceptVoucher(${t.id})\">Accept + ICS<\/button>`; dl.appendChild(d); }); document.getElementById('nowCount').textContent=trips.filter(t=>t.timing==='now').length; document.getElementById('laterCount').textContent=trips.filter(t=>t.timing==='later').length; document.getElementById('calList').innerHTML=trips.map(t=>`\u2022 ${t.pickup}\u2192${t.dropoff} $${t.fare} ${t.driver}`).join('<br>'); }\nwindow.acceptVoucher=(id)=>{ const t=trips.find(x=>x.id===id); if(!t) return; const txt=`\ud83c\udf3a ${t.timing.toUpperCase()} ACCEPTED\\n\ud83d\udc64 ${t.profile} \ud83d\udc65 ${t.pax}\\n\ud83d\udccd ${t.pickup} https:\/\/maps.google.com\/?q=${t.pickupLL?t.pickupLL[1]+','+t.pickupLL[0]:''}\\n\ud83d\udccd ${t.dropoff} https:\/\/maps.google.com\/?q=${t.dropoffLL?t.dropoffLL[1]+','+t.dropoffLL[0]:''}\\n\ud83c\udfdd\ufe0f ${t.arch} \u2022 ${t.island}\\n\ud83d\ude95 ${t.cat} ${t.cat==='circle'?'$100\/h ONLY min4h $400 drinks+fruits free':''} $${t.fare}\\nDriver ${t.driver} \u2022 Voucher WA${t.id.toString().slice(-4)}`; window.open(WA_BASE+\"?text=\"+encodeURIComponent(txt),\"_blank\"); downloadICS(id); };\nwindow.declineVoucher=(id)=>{ window.open(WA_BASE+\"?text=\"+encodeURIComponent(`\u274c DECLINED WA${id}`),\"_blank\"); };\nwindow.downloadICS=(id)=>{ const t=trips.find(x=>x.id===id); if(!t) return; const now=new Date(); const start=new Date(); if(t.timing==='now') start.setMinutes(start.getMinutes()+30); else start.setHours(start.getHours()+2); const end=new Date(start.getTime()+(t.cat==='circle'?4:1)*3600*1000); function fmt(dt){return dt.toISOString().replace(\/[-:]\/g,'').split('.')[0]+'Z';} const ics=`BEGIN:VCALENDAR\\nVERSION:2.0\\nPRODID:-\/\/TahitiSuperApp\/\/EN\\nBEGIN:VEVENT\\nUID:${t.id}@tahitidriver.pf\\nDTSTAMP:${fmt(now)}\\nDTSTART:${fmt(start)}\\nDTEND:${fmt(end)}\\nSUMMARY:Tahiti ${t.cat} - ${t.profile} - Driver ${t.driver}\\nDESCRIPTION:Arch:${t.arch} Island:${t.island} Pickup:${t.pickup} Drop:${t.dropoff} Fare:$${t.fare} Cat:${t.cat} Driver:${t.driver} Voucher:WA${t.id.toString().slice(-4)}\\nLOCATION:${t.pickup} -> ${t.dropoff}\\nEND:VEVENT\\nEND:VCALENDAR`; const blob=new Blob([ics],{type:'text\/calendar'}); const url=URL.createObjectURL(blob); const a=document.createElement('a'); a.href=url; a.download=`Tahiti-${t.cat}-${t.profile}.ics`; a.click(); const gcal=`https:\/\/calendar.google.com\/calendar\/render?action=TEMPLATE&text=${encodeURIComponent('Tahiti '+t.cat+' - '+t.profile+' - '+t.driver)}&details=${encodeURIComponent('WA'+t.id+' $'+t.fare)}&location=${encodeURIComponent(t.pickup+' -> '+t.dropoff)}&dates=${fmt(start)}\/${fmt(end)}`; window.open(gcal,'_blank'); };\nrenderAll(); document.getElementById('sheet').classList.add('collapsed');\n<\/script><\/body><\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-559294b e-flex e-con-boxed e-con e-parent\" data-id=\"559294b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b550775 elementor-widget elementor-widget-html\" data-id=\"b550775\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\">\n<title>Tahiti SuperApp \u2022 Onboarding \u2192 Map \u2192 Chat \u2022 Black Orange<\/title>\n<script src=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.js\"><\/script><link href=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.css\" rel=\"stylesheet\">\n<script src=\"https:\/\/unpkg.com\/peerjs@1.5.4\/dist\/peerjs.min.js\"><\/script>\n<style>\n*{box-sizing:border-box;margin:0;padding:0;font-family:-apple-system,Inter,SF Pro}\nhtml,body{height:100%;background:#000}body{display:flex;justify-content:center}\n#app{width:100%;max-width:430px;height:100dvh;position:relative;background:#0e0e0e;overflow:hidden;box-shadow:0 0 80px #000}\n:root{--p:#FF6B00;--bg:#0e0e0e;--card:#181818;--card2:#1f1f1f;--text:#fff;--muted:#8a8a8a;--line:#ffffff14;--r:22px}\nbody.blue{--p:#0066FF;--bg:#f7f9ff;--card:#fff;--card2:#eef3ff;--text:#0a1931;--muted:#7a8aaa;--line:#00000012}\nbody.green{--p:#25D366;--bg:#f3faf5;--card:#fff;--card2:#e8f5ea;--text:#0a2814;--muted:#6e8a76;--line:#00000010}\n#app{background:var(--bg);color:var(--text)}\n#map{position:absolute;inset:0;z-index:0}\n.header{position:absolute;top:0;left:0;right:0;z-index:20;padding:12px;display:flex;justify-content:space-between;pointer-events:none}\n.header>*{pointer-events:auto}\n.glass{background:rgba(24,24,24,.85);backdrop-filter:blur(20px);border:1px solid var(--line);border-radius:999px;padding:8px 12px;display:flex;align-items:center;gap:8px}\n.blue.glass,.green.glass{background:rgba(255,255,255,.92)}\n.avatar{width:34px;height:34px;border-radius:50%;background:var(--p);display:grid;place-items:center;font-weight:900;color:#000}\n.pill{border:0;border-radius:999px;padding:8px 12px;background:var(--p);color:#000;font-weight:800;font-size:12px;cursor:pointer}\n.onboard{position:absolute;inset:0;z-index:50;background:var(--bg);display:flex;flex-direction:column;justify-content:space-between;padding:24px;transition:transform.4s}\n.onboard.hide{transform:translateX(-100%)}\n.dots{display:flex;gap:6px;justify-content:center}.dots span{width:20px;height:6px;border-radius:999px;background:var(--line)}.dots span.active{background:var(--p);width:28px}\n.sheet{position:absolute;left:0;right:0;bottom:68px;z-index:15;background:var(--bg);border-radius:28px 28px 0 0;box-shadow:0 -20px 60px rgba(0,0,0,.5);transition:transform.35s;border-top:1px solid var(--line);max-height:86vh;display:flex;flex-direction:column}\n.sheet.collapsed{transform:translateY(calc(100% - 92px))}\n.handle{width:36px;height:4px;background:var(--line);border-radius:999px;margin:10px auto}\n.mode-switch{position:absolute;top:64px;left:50%;transform:translateX(-50%);z-index:19;background:var(--card);border:1px solid var(--line);border-radius:999px;padding:4px;display:flex;gap:4px}\n.mode-switch button{border:0;padding:8px 16px;border-radius:999px;font-weight:800;font-size:13px;background:transparent;color:var(--muted);cursor:pointer}\n.mode-switch button.active{background:var(--p);color:#000}\n.map-tools{position:absolute;right:12px;top:108px;z-index:19;display:flex;flex-direction:column;gap:8px}\n.map-tools button{width:42px;height:42px;border-radius:14px;background:var(--card);border:1px solid var(--line);display:grid;place-items:center;cursor:pointer}\n.tabs{position:absolute;bottom:0;left:0;right:0;z-index:30;background:var(--card);border-top:1px solid var(--line);display:flex;justify-content:space-around;padding:8px 0 14px}\n.tabs button{border:0;background:transparent;color:var(--muted);font-size:10px;font-weight:700;display:flex;flex-direction:column;align-items:center;gap:4px;flex:1}\n.tabs button.active{color:var(--p)}\n.tabs.ic{width:28px;height:28px;border-radius:10px;background:var(--card2);display:grid;place-items:center;font-size:14px}\n.tabs button.active.ic{background:var(--p);color:#000}\n.page{display:none;overflow:auto;flex:1;padding-bottom:8px}.page.active{display:block}\n.card{background:var(--card);border:1px solid var(--line);border-radius:22px;padding:16px;margin:10px 12px}\n.card2{background:var(--card2);border-radius:22px;padding:14px;margin:8px 12px}\n.chip{display:inline-flex;padding:9px 14px;border-radius:999px;background:var(--card);border:1px solid var(--line);font-weight:600;font-size:13px;margin:4px;cursor:pointer;white-space:nowrap}\n.chip.active{background:var(--p);color:#000;border-color:var(--p)}\n.badge{background:var(--p);color:#000;padding:5px 10px;border-radius:999px;font-weight:800;font-size:11px}\n.btn{border:0;border-radius:16px;padding:14px 16px;font-weight:800;cursor:pointer;font-size:14px;width:100%;display:flex;justify-content:center;gap:8px}\n.btn-p{background:var(--p);color:#000}.btn-g{background:var(--card);border:1px solid var(--line);color:var(--text)}\n.input{width:100%;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:12px 14px;color:var(--text);font-weight:600}\n.input:focus{outline:none;border-color:var(--p)}\n.collapse{overflow:hidden;transition:max-height.3s}.collapse-head{display:flex;justify-content:space-between;align-items:center;cursor:pointer}\n.voucher{background:linear-gradient(135deg,#161616,#2a2a2a);color:white;border-radius:24px;padding:18px;margin:12px;border:1px solid #ffffff14}\nvideo{width:100%;border-radius:16px;background:#000;aspect-ratio:16\/9}\n#toast{position:fixed;bottom:84px;left:50%;transform:translateX(-50%);background:#000;color:#fff;padding:12px 18px;border-radius:999px;display:none;z-index:99;font-weight:700;max-width:90%}\n<\/style><\/head><body class=\"orange\">\n<div id=\"app\">\n<div id=\"map\"><\/div>\n<div class=\"map-tools\"><button id=\"btnFull\">\u26f6<\/button><button id=\"btnTile\">\ud83d\uddfa\ufe0f<\/button><button id=\"btnLocate\">\ud83d\udccd<\/button><\/div>\n<div class=\"header\"><div class=\"glass\"><div class=\"avatar\">T<\/div><div><div style=\"font-weight:800;font-size:13px\">Tahiti \u2022 FIRE<\/div><div style=\"font-size:10px;color:var(--muted)\">PeerJS \u2022 <span id=\"peerIdShort\">connecting<\/span> \u2022 15-30 min<\/div><\/div><\/div><button class=\"pill\" id=\"btnTheme\">\ud83c\udfa8 Theme<\/button><\/div>\n<div class=\"mode-switch\" id=\"modeSwitch\"><button class=\"active\" data-mode=\"map\">Map Mode<\/button><button data-mode=\"chat\">Chat Mode<\/button><\/div>\n\n<!-- ONBOARDING -->\n<div class=\"onboard\" id=\"onboard\"><div style=\"margin-top:40px\"><div style=\"font-size:42px;font-weight:900;line-height:.9\">Ride &<br>Pay All<br>in One<\/div><div style=\"margin-top:12px;color:var(--muted)\">Tahiti SuperApp \u2022 Archipelago Selector \u2022 Book Anything Hotel Restaurant Bar Cafe Babysitting Taxi Circle Island $100\/h<\/div><div style=\"margin-top:20px;display:flex;gap:6px;flex-wrap:wrap\"><span class=\"chip active\">Society Islands<\/span><span class=\"chip\">Tuamotu 80+<\/span><span class=\"chip\">Marquesas<\/span><\/div><\/div><div><input id=\"onName\" class=\"input\" placeholder=\"Profile Name\" style=\"margin-bottom:8px\"><select id=\"onPax\" class=\"input\" style=\"margin-bottom:12px\"><option>1 pax<\/option><option selected>8 pax max<\/option><\/select><button class=\"btn btn-p\" id=\"btnStart\">Get Started \u2192 Map Mode<\/button><div class=\"dots\" style=\"margin-top:12px\"><span class=\"active\"><\/span><span><\/span><span><\/span><\/div><\/div><\/div>\n\n<div class=\"sheet collapsed\" id=\"sheet\"><div class=\"handle\" id=\"handle\"><\/div>\n<div class=\"page active\" id=\"pExplore\">\n<div style=\"padding:0 12px;display:flex;gap:6px;overflow:auto\"><button class=\"chip active\" data-theme=\"orange\">\ud83d\udfe0 Orange Black<\/button><button class=\"chip\" data-theme=\"blue\">\ud83d\udd35 Blue White<\/button><button class=\"chip\" data-theme=\"green\">\ud83d\udfe2 Green White<\/button><\/div>\n<div class=\"card\"><div class=\"collapse-head\" onclick=\"toggleC('c1')\"><b>\ud83c\udf3a Archipelago Selector<\/b><span>\u2303<\/span><\/div><div id=\"c1\" style=\"max-height:200px;overflow:hidden;transition:.3s\"><div style=\"margin-top:10px;display:flex;flex-wrap:wrap\"><span class=\"chip active\" data-arch=\"Society\">Society Islands<\/span><span class=\"chip\" data-arch=\"Tuamotu\">Tuamotu 80+<\/span><span class=\"chip\" data-arch=\"Marquesas\">Marquesas<\/span><span class=\"chip\" data-arch=\"Austral\">Austral<\/span><\/div><div style=\"display:flex;flex-wrap:wrap;margin-top:6px\"><span class=\"chip active\" data-island=\"Tahiti\">Tahiti Papeete<\/span><span class=\"chip\" data-island=\"Moorea\">Moorea<\/span><span class=\"chip\" data-island=\"Bora Bora\">Bora Bora<\/span><span class=\"chip\" data-island=\"Rangiroa\">Rangiroa<\/span><\/div><\/div><\/div>\n<\/div>\n\n<div class=\"page\" id=\"pMap\">\n<div class=\"card\"><div class=\"collapse-head\" onclick=\"toggleC('bookBox')\"><b>\ud83e\udded Book Ride \u2022 Service<\/b><span>\u2303<\/span><\/div><div id=\"bookBox\" style=\"max-height:900px;overflow:hidden;transition:.3s\">\n<div style=\"margin-top:10px;display:flex;flex-wrap:wrap\"><span class=\"chip active\" data-cat=\"taxi\">Taxi<\/span><span class=\"chip\" data-cat=\"circle\">Circle $100\/h ONLY min4h<\/span><span class=\"chip\" data-cat=\"hotel\">Hotel<\/span><span class=\"chip\" data-cat=\"restaurant\">Restaurant<\/span><span class=\"chip\" data-cat=\"activity\">Activity<\/span><span class=\"chip\" data-cat=\"bar\">Bar<\/span><span class=\"chip\" data-cat=\"cafe\">Caf\u00e9<\/span><span class=\"chip\" data-cat=\"babysitting\">Babysitting<\/span><\/div>\n<div style=\"display:flex;gap:8px;margin-top:10px\"><input id=\"pickup\" class=\"input\" placeholder=\"\ud83d\udccd Pickup \u2014 tap map\" readonly><input id=\"dropoff\" class=\"input\" placeholder=\"\ud83d\udccd Drop \u2014 tap map\" readonly><\/div>\n<div id=\"airportBox\" style=\"display:none;margin-top:8px;gap:6px;flex-wrap:wrap\"><select id=\"airline\" class=\"input\" style=\"flex:1\"><option>Airline?<\/option><option>Air Tahiti Nui TN<\/option><option>Air Tahiti VT<\/option><option>Air Moana<\/option><option>French Bee BF<\/option><option>Private<\/option><\/select><input id=\"flightNo\" class=\"input\" placeholder=\"TN101\" style=\"width:90px\"><input id=\"flightTime\" type=\"time\" class=\"input\" style=\"width:90px\"><\/div>\n<div style=\"display:flex;gap:8px;margin-top:10px\"><button class=\"btn btn-g\" style=\"flex:1\" id=\"btnNow\">Now<br><span style=\"font-size:10px\">15-30 min wait<\/span><\/button><button class=\"btn btn-p\" style=\"flex:1\" id=\"btnLater\">Later<br><span style=\"font-size:10px\">+ ICS GCal<\/span><\/button><\/div>\n<div id=\"etaBox\" style=\"display:none;margin-top:10px\" class=\"card2\"><b id=\"etaText\">--<\/b><div id=\"etaSub\" style=\"font-size:12px;color:var(--muted)\">--<\/div><\/div>\n<div id=\"voucherPreview\"><\/div>\n<\/div><\/div>\n<\/div>\n\n<div class=\"page\" id=\"pChat\">\n<div class=\"card2\"><div class=\"collapse-head\" onclick=\"toggleC('peerBox')\"><b>\ud83d\udcac PeerJS Chat \u2022 Visio \u2022 Live Location via DataChannel<\/b><span>\u2303<\/span><\/div><div id=\"peerBox\" style=\"max-height:600px;overflow:hidden;transition:.3s\">\n<div style=\"display:flex;gap:8px;margin-top:10px\"><input id=\"peerIdInput\" class=\"input\" placeholder=\"Your ID auto \u2022 Enter remote ID\"><button class=\"pill\" id=\"btnConnectPeer\">Connect<\/button><\/div>\n<div style=\"display:flex;gap:8px;margin-top:10px\"><video id=\"localVideo\" autoplay muted playsinline><\/video><video id=\"remoteVideo\" autoplay playsinline><\/video><\/div>\n<div style=\"display:flex;gap:6px;margin-top:8px\"><button class=\"chip\" id=\"btnCam\">\ud83d\udcf9 Visio<\/button><button class=\"chip\" id=\"btnShareLoc\">\ud83d\udccd Live Location<\/button><button class=\"chip\" id=\"btnSwitchDriver\">\ud83d\udd04 Switch Driver<\/button><\/div>\n<div id=\"chatBox\" style=\"margin-top:8px;max-height:140px;overflow:auto\"><\/div>\n<div style=\"display:flex;gap:6px;margin-top:8px\"><input id=\"chatInput\" class=\"input\" placeholder=\"Message via DataChannel...\"><button class=\"pill\" id=\"btnSend\">Send<\/button><\/div>\n<\/div><\/div>\n<\/div>\n\n<div class=\"page\" id=\"pRoadmap\">\n<div class=\"card\"><b>\ud83e\udded Trip Roadmap \u2022 Voucher Timeline<\/b><div style=\"font-size:12px;color:var(--muted)\">60% completed \u2022 + Add another booking builds trip<\/div><button class=\"btn btn-p\" style=\"margin-top:10px\" onclick=\"setMode('map')\">+ Add booking in Map Mode<\/button><\/div>\n<div id=\"roadmapList\"><\/div>\n<\/div>\n\n<div class=\"page\" id=\"pDriver\">\n<div class=\"card\" style=\"background:var(--p);color:#000\"><b>\ud83d\ude95 Driver \u2022 Waiting List \u2022 Online<\/b><div style=\"font-size:12px\">Wait 15-30 min \u2022 Switch Driver Teva\/Maui\/Heiva \u2022 PeerJS<\/div><div style=\"display:flex;gap:8px;margin-top:8px\"><span class=\"badge\" style=\"background:#000;color:var(--p)\">Now <span id=\"nowCount\">0<\/span><\/span><span class=\"badge\" style=\"background:#000;color:var(--p)\">Later <span id=\"laterCount\">0<\/span><\/span><\/div><\/div>\n<div id=\"driverList\"><\/div>\n<div class=\"card\"><div class=\"collapse-head\" onclick=\"toggleC('drv')\"><b>Switchable Drivers<\/b><span>\u2303<\/span><\/div><div id=\"drv\" style=\"max-height:200px;overflow:hidden;transition:.3s\"><div style=\"display:flex;flex-wrap:wrap;margin-top:8px\"><span class=\"chip active\" data-driver=\"Teva\">Teva 4.9\u2605 2min<\/span><span class=\"chip\" data-driver=\"Maui\">Maui 4.8\u2605 5min<\/span><span class=\"chip\" data-driver=\"Heiva\">Heiva 5.0\u2605 8min<\/span><\/div><\/div><\/div>\n<div class=\"card\"><b>\ud83d\udcc5 Google Calendar \u2022 ICS<\/b><div id=\"calList\" style=\"font-size:12px;color:var(--muted)\"><\/div><\/div>\n<\/div>\n\n<\/div>\n<div class=\"tabs\"><button class=\"active\" data-page=\"pExplore\"><span class=\"ic\">\ud83c\udfdd\ufe0f<\/span>Explore<\/button><button data-page=\"pMap\"><span class=\"ic\">\ud83d\uddfa\ufe0f<\/span>Map Mode<\/button><button data-page=\"pChat\"><span class=\"ic\">\ud83d\udcac<\/span>Chat Mode<\/button><button data-page=\"pRoadmap\"><span class=\"ic\">\ud83e\udded<\/span>Roadmap<\/button><button data-page=\"pDriver\"><span class=\"ic\">\ud83d\ude95<\/span>Driver<\/button><\/div>\n<\/div>\n<div id=\"toast\"><\/div>\n<script>\nconst _w=atob(\"Njg5ODk2NjAwMDM=\"); const WA_BASE=\"https:\/\/wa.me\/\"+_w;\nconst styles={liberty:\"https:\/\/tiles.openfreemap.org\/styles\/liberty\",sat:{version:8,sources:{sat:{type:\"raster\",tiles:[\"https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}\"],tileSize:256}},layers:[{id:\"sat\",type:\"raster\",source:\"sat\"}]}};\nlet arch=\"Society\",island=\"Tahiti\",cat=\"taxi\",pickupLL=null,dropoffLL=null,pickupShort=\"\",dropoffShort=\"\",timing=\"now\",currentDriver=\"Teva\",isFull=false,currentMode=\"map\";\nlet trips=JSON.parse(localStorage.getItem(\"tahiti_trips\")||\"[]\");\nlet fares=[{min:400,only:\"circle\"},{min:800,only:\"circle\"},{flat:25,perKm:2.5,min:25,only:\"taxi\"}];\nconst map=new maplibregl.Map({container:'map',style:styles.liberty,center:[-149.4068,-17.65],zoom:11,attributionControl:false});map.addControl(new maplibregl.NavigationControl({showCompass:false}),'bottom-right');\nlet pickM=null,dropM=null;\nfunction toast(m){const t=document.getElementById('toast');t.textContent=m;t.style.display='block';setTimeout(()=>t.style.display='none',3500);}\nfunction shortAddr(f){return f?f.split(',').slice(0,3).join(', ').slice(0,55):\"Tahiti\";}\nasync function reverse(lng,lat){try{const r=await fetch(`https:\/\/nominatim.openstreetmap.org\/reverse?format=json&lon=${lng}&lat=${lat}&zoom=14`);const j=await r.json();return j.display_name||`${lat.toFixed(4)},${lng.toFixed(4)}`;}catch{return `${lat.toFixed(4)},${lng.toFixed(4)}`;}}\nwindow.toggleC=(id)=>{const el=document.getElementById(id); if(!el) return; el.style.maxHeight=el.style.maxHeight==='0px'?'900px':'0px';};\nfunction switchTab(id){document.querySelectorAll('.page').forEach(p=>p.classList.remove('active'));document.getElementById(id).classList.add('active');document.querySelectorAll('.tabs button').forEach(b=>b.classList.remove('active'));document.querySelector(`[data-page=\"${id}\"]`)?.classList.add('active'); document.getElementById('sheet').classList.remove('collapsed'); if(id==='pMap') setMode('map'); if(id==='pChat') setMode('chat'); map.resize();}\nfunction setMode(m){currentMode=m; document.querySelectorAll('.mode-switch button').forEach(b=>b.classList.remove('active')); document.querySelector(`[data-mode=\"${m}\"]`)?.classList.add('active'); if(m==='map'){ switchTab('pMap'); } if(m==='chat'){ switchTab('pChat'); } }\ndocument.querySelectorAll('.tabs button').forEach(b=>b.onclick=()=>switchTab(b.dataset.page));\ndocument.querySelectorAll('.mode-switch button').forEach(b=>b.onclick=()=>setMode(b.dataset.mode));\ndocument.getElementById('handle').onclick=()=>document.getElementById('sheet').classList.toggle('collapsed');\ndocument.getElementById('btnFull').onclick=()=>{isFull=!isFull; const s=document.getElementById('sheet'); if(isFull){s.classList.add('collapsed'); toast(\"Fullscreen Map Mode \u2014 tap map\");} else s.classList.remove('collapsed'); map.resize();};\ndocument.querySelectorAll('[data-theme]').forEach(b=>b.onclick=()=>{document.querySelectorAll('[data-theme]').forEach(x=>x.classList.remove('active'));b.classList.add('active');document.body.className=b.dataset.theme; localStorage.setItem('theme',b.dataset.theme); toast(\"Theme \"+b.dataset.theme);});\nlet savedTheme=localStorage.getItem('theme')||'orange'; document.body.className=savedTheme;\ndocument.querySelectorAll('[data-arch]').forEach(c=>c.onclick=()=>{document.querySelectorAll('[data-arch]').forEach(x=>x.classList.remove('active'));c.classList.add('active');arch=c.dataset.arch;});\ndocument.querySelectorAll('[data-island]').forEach(c=>c.onclick=()=>{island=c.dataset.island; const cent={Tahiti:[-149.4068,-17.65],Moorea:[-149.83,-17.54],\"Bora Bora\":[-151.74,-16.5]}; if(cent[island]) map.flyTo({center:cent[island],zoom:12});});\ndocument.querySelectorAll('[data-cat]').forEach(c=>c.onclick=()=>{document.querySelectorAll('[data-cat]').forEach(x=>x.classList.remove('active'));c.classList.add('active');cat=c.dataset.cat;});\ndocument.querySelectorAll('[data-driver]').forEach(c=>c.onclick=()=>{document.querySelectorAll('[data-driver]').forEach(x=>x.classList.remove('active'));c.classList.add('active');currentDriver=c.dataset.driver; toast(\"Driver \"+currentDriver);});\nfunction setPickup(ll,s){pickupLL=ll;pickupShort=s; if(pickM)pickM.remove(); pickM=new maplibregl.Marker({color:\"#FF6B00\"}).setLngLat(ll).addTo(map); document.getElementById('pickup').value=s; maybeRoute(); document.getElementById('sheet').classList.remove('collapsed');}\nfunction setDropoff(ll,s){dropoffLL=ll;dropoffShort=s; if(dropM)dropM.remove(); dropM=new maplibregl.Marker({color:\"#ff0000\"}).setLngLat(ll).addTo(map); document.getElementById('dropoff').value=s; maybeRoute(); document.getElementById('airportBox').style.display=\/airport|faa'a\/i.test(s)?'flex':'none';}\nasync function maybeRoute(){ if(!pickupLL||!dropoffLL) return; const url=`https:\/\/router.project-osrm.org\/route\/v1\/driving\/${pickupLL[0]},${pickupLL[1]};${dropoffLL[0]},${dropoffLL[1]}?overview=full&geometries=geojson`; try{ const r=await fetch(url); const j=await r.json(); if(j.routes&&j.routes[0]){ const rt=j.routes[0]; const dist=rt.distance\/1000; const dur=rt.duration\/60; if(map.getSource('route')){map.removeLayer('route');map.removeSource('route');} map.addSource('route',{type:'geojson',data:{type:'Feature',geometry:rt.geometry}}); map.addLayer({id:'route',type:'line',source:'route',paint:{'line-color':getComputedStyle(document.body).getPropertyValue('--p')||'#FF6B00','line-width':5}}); document.getElementById('etaBox').style.display='block'; document.getElementById('etaText').textContent=`${Math.round(dur)} min \u2022 ${dist.toFixed(1)} km \u2022 Driver ${currentDriver}`; let best=Infinity; fares.forEach(f=>{ if(f.only!==cat){ if(cat==='circle'&&f.only!=='circle') return; if(cat!=='circle'&&f.only==='circle') return; } let p=(f.flat||0)+(f.perKm||0)*dist; if(f.min) p=Math.max(p,f.min); if(p<best) best=p; }); if(cat==='circle') best=Math.max(best,400); window._lastFare=isFinite(best)?best:(cat==='circle'?400:25); document.getElementById('etaSub').textContent=cat==='circle'?`Circle Island ONLY $100\/h min 4h = $${window._lastFare} drinks+fruits free`:`Taxi $${window._lastFare} \u2022 15-30 min wait if Now`; } }catch{} }\nmap.on('click',async e=>{ const lng=e.lngLat.lng,lat=e.lngLat.lat; const full=await reverse(lng,lat); const s=shortAddr(full); if(!pickupLL) setPickup([lng,lat],s); else if(!dropoffLL) setDropoff([lng,lat],s); else { if(pickM)pickM.remove(); if(dropM)dropM.remove(); if(map.getSource('route')){map.removeLayer('route');map.removeSource('route');} pickupLL=null; dropoffLL=null; setPickup([lng,lat],s);} });\ndocument.getElementById('btnLocate').onclick=()=>{ navigator.geolocation.getCurrentPosition(async pos=>{ const ll=[pos.coords.longitude,pos.coords.latitude]; map.flyTo({center:ll,zoom:14}); const f=await reverse(ll[0],ll[1]); setPickup(ll,shortAddr(f)); if(conn&&conn.open) conn.send({type:'location',lat:ll[1],lng:ll[0]}); }); };\ndocument.getElementById('btnTile').onclick=()=>{ if(map.getSource('sat')) map.setStyle(styles.liberty); else map.setStyle(styles.sat); };\ndocument.getElementById('btnTheme').onclick=()=>{ const t=['orange','blue','green']; let cur=localStorage.getItem('theme')||'orange'; let idx=(t.indexOf(cur)+1)%t.length; document.body.className=t[idx]; localStorage.setItem('theme',t[idx]); toast(\"Theme \"+t[idx]); };\ndocument.getElementById('btnStart').onclick=()=>{ document.getElementById('onboard').classList.add('hide'); localStorage.setItem('profile',document.getElementById('onName').value); setTimeout(()=>{ document.getElementById('sheet').classList.remove('collapsed'); toast(\"Onboarding done \u2192 Map Mode\"); },400); };\n\/\/ PeerJS\nlet peer=null,conn=null,localStream=null;\nfunction initPeer(){ peer=new Peer('tahiti-'+Math.floor(Math.random()*10000)); peer.on('open',id=>{ document.getElementById('peerIdShort').textContent=id; document.getElementById('peerIdInput').placeholder='Your ID: '+id; }); peer.on('connection',c=>{ conn=c; setupConn(); }); peer.on('call',call=>{ navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(s=>{ localStream=s; document.getElementById('localVideo').srcObject=s; call.answer(s); call.on('stream',rs=>{ document.getElementById('remoteVideo').srcObject=rs; }); }); }); }\nfunction setupConn(){ conn.on('open',()=>{ toast(\"PeerJS DataChannel connected\"); addChat(\"System: Connected \u2014 chat, location, bookings via DataChannel\"); }); conn.on('data',d=>{ if(d.type==='chat') addChat(\"Driver: \"+d.msg); else if(d.type==='location'){ addChat(`\ud83d\udccd ${d.lat.toFixed(4)},${d.lng.toFixed(4)}`); if(pickM) pickM.setLngLat([d.lng,d.lat]); } else if(d.type==='booking') addChat(\"\ud83d\udce6 \"+d.msg); }); }\nfunction addChat(t){ const div=document.createElement('div'); div.style.cssText='background:var(--card);padding:8px 10px;border-radius:12px;margin:4px 0;font-size:13px;border:1px solid var(--line)'; div.textContent=t; document.getElementById('chatBox').appendChild(div); document.getElementById('chatBox').scrollTop=9999; }\ndocument.getElementById('btnConnectPeer').onclick=()=>{ const rid=document.getElementById('peerIdInput').value.trim(); if(!rid||!peer) return toast(\"Enter remote Peer ID\"); conn=peer.connect(rid); setupConn(); if(localStream){ const call=peer.call(rid,localStream); if(call) call.on('stream',rs=>{ document.getElementById('remoteVideo').srcObject=rs; }); } };\ndocument.getElementById('btnSend').onclick=()=>{ const m=document.getElementById('chatInput').value; if(!m) return; addChat(\"You: \"+m); if(conn&&conn.open) conn.send({type:'chat',msg:m}); document.getElementById('chatInput').value=''; };\ndocument.getElementById('btnCam').onclick=async()=>{ try{ localStream=await navigator.mediaDevices.getUserMedia({video:true,audio:true}); document.getElementById('localVideo').srcObject=localStream; toast(\"Visio ON via PeerJS\"); }catch{ toast(\"Camera blocked\"); } };\ndocument.getElementById('btnShareLoc').onclick=()=>{ navigator.geolocation.getCurrentPosition(p=>{ const d={type:'location',lat:p.coords.latitude,lng:p.coords.longitude}; if(conn&&conn.open) conn.send(d); addChat(`\ud83d\udccd You ${d.lat.toFixed(4)},${d.lng.toFixed(4)} via DataChannel`); }); };\ndocument.getElementById('btnSwitchDriver').onclick=()=>{ const dr=['Teva','Maui','Heiva']; let i=dr.indexOf(currentDriver); currentDriver=dr[(i+1)%dr.length]; toast(\"Switched to \"+currentDriver); if(conn&&conn.open) conn.send({type:'chat',msg:'Driver switched to '+currentDriver}); };\ninitPeer();\ndocument.getElementById('btnNow').onclick=()=>{ timing='now'; createVoucher(); };\ndocument.getElementById('btnLater').onclick=()=>{ timing='later'; createVoucher(); };\nfunction buildData(){ return {id:Date.now(),profile:localStorage.getItem('profile')||document.getElementById('onName').value||\"Guest\",pax:document.getElementById('onPax')?.value||\"8 max\",cat,arch,island,pickup:pickupShort||\"Tahiti\",dropoff:dropoffShort||\"Tahiti\",pickupLL,dropoffLL,fare:window._lastFare||400,airline:document.getElementById('airline').value,flightNo:document.getElementById('flightNo').value,flightTime:document.getElementById('flightTime').value,timing,driver:currentDriver,eta:document.getElementById('etaText').textContent}; }\nfunction createVoucher(){ if(!pickupLL||!dropoffLL){ toast(\"Tap map: pickup then drop\"); return; } const d=buildData(); trips.push(d); localStorage.setItem(\"tahiti_trips\",JSON.stringify(trips)); renderAll(); if(conn&&conn.open) conn.send({type:'booking',msg:`${d.cat} ${d.pickup}\u2192${d.dropoff} $${d.fare} ${d.driver}`}); const fareT=d.cat==='circle'?`Circle $100\/h ONLY min4h $${d.fare}`:`$${d.fare}`; const html=`<div class=\"voucher\"><div style=\"display:flex;justify-content:space-between\"><div><div style=\"font-size:10px;letter-spacing:.12em;opacity:.6\">VOUCHER \u2022 ${d.cat.toUpperCase()} \u2022 ${d.timing.toUpperCase()} \u2022 ${d.driver}<\/div><div style=\"font-size:17px;font-weight:800;margin-top:4px\">${d.pickup} \u2192 ${d.dropoff}<\/div><div style=\"font-size:11px;color:#aaa\">${d.arch} \u2022 ${d.island} \u2022 ${d.eta}<\/div><\/div><span class=\"badge\">${d.timing==='now'?'15-30 WAIT':'SCHED'}<\/span><\/div><div style=\"border-top:1px dashed rgba(255,255,255,.15);margin:12px 0\"><\/div><div style=\"display:flex;gap:10px;font-size:12px\"><div>\ud83d\udc64 ${d.profile}<\/div><div>\ud83d\udc65 ${d.pax}<\/div><div>\ud83d\udcb0 ${fareT}<\/div><\/div><div style=\"display:flex;gap:8px;margin-top:12px\"><button class=\"btn\" style=\"flex:1;background:white;color:#111;border-radius:14px\" onclick=\"declineVoucher(${d.id})\">Decline<\/button><button class=\"btn btn-p\" style=\"flex:1\" onclick=\"acceptVoucher(${d.id})\">Accept + ICS<\/button><\/div><button class=\"btn\" style=\"width:100%;margin-top:8px;background:rgba(255,255,255,.12);color:white\" onclick=\"downloadICS(${d.id})\">\ud83d\udcc5 GCal.ics<\/button><\/div>`; document.getElementById('voucherPreview').innerHTML=html; toast(\"Voucher \u2192 Roadmap\"); }\nfunction renderAll(){ const rl=document.getElementById('roadmapList'); rl.innerHTML=\"\"; trips.forEach(t=>{ const div=document.createElement('div'); div.className='card'; div.innerHTML=`<div style=\"display:flex;justify-content:space-between\"><b>${t.cat} \u2022 ${t.driver}<\/b><span class=\"badge\">${t.timing}<\/span><\/div><div style=\"font-size:14px;margin-top:4px\">${t.pickup} \u2192 ${t.dropoff}<\/div><div style=\"font-size:11px;color:var(--muted)\">${t.arch} \u2022 $${t.fare} \u2022 WA${t.id.toString().slice(-4)} \u2022 ${t.eta||''}<\/div>`; rl.appendChild(div); }); const dl=document.getElementById('driverList'); dl.innerHTML=\"\"; trips.forEach(t=>{ const d=document.createElement('div'); d.className='card'; d.innerHTML=`<div style=\"display:flex;justify-content:space-between\"><b>#WA${t.id.toString().slice(-4)} ${t.cat} ${t.driver}<\/b><span style=\"font-size:11px;color:var(--muted)\">${t.timing}<\/span><\/div><div style=\"font-size:13px\">${t.pickup} \u2192 ${t.dropoff} \u2022 $${t.fare}<\/div><button class=\"btn btn-p\" style=\"margin-top:8px\" onclick=\"acceptVoucher(${t.id})\">Accept + ICS<\/button>`; dl.appendChild(d); }); document.getElementById('nowCount').textContent=trips.filter(t=>t.timing==='now').length; document.getElementById('laterCount').textContent=trips.filter(t=>t.timing==='later').length; document.getElementById('calList').innerHTML=trips.map(t=>`\u2022 ${t.pickup}\u2192${t.dropoff} $${t.fare} ${t.driver}`).join('<br>'); }\nwindow.acceptVoucher=(id)=>{ const t=trips.find(x=>x.id===id); if(!t) return; const txt=`\ud83c\udf3a ${t.timing.toUpperCase()} ACCEPTED\\n\ud83d\udc64 ${t.profile} \ud83d\udc65 ${t.pax}\\n\ud83d\udccd ${t.pickup} https:\/\/maps.google.com\/?q=${t.pickupLL?t.pickupLL[1]+','+t.pickupLL[0]:''}\\n\ud83d\udccd ${t.dropoff} https:\/\/maps.google.com\/?q=${t.dropoffLL?t.dropoffLL[1]+','+t.dropoffLL[0]:''}\\n\ud83c\udfdd\ufe0f ${t.arch} \u2022 ${t.island}\\n\ud83d\ude95 ${t.cat} ${t.cat==='circle'?'$100\/h ONLY min4h $400':''} $${t.fare}\\nDriver ${t.driver} \u2022 Voucher WA${t.id.toString().slice(-4)}`; window.open(WA_BASE+\"?text=\"+encodeURIComponent(txt),\"_blank\"); downloadICS(id); };\nwindow.declineVoucher=(id)=>{ window.open(WA_BASE+\"?text=\"+encodeURIComponent(`\u274c DECLINED WA${id}`),\"_blank\"); };\nwindow.downloadICS=(id)=>{ const t=trips.find(x=>x.id===id); if(!t) return; const now=new Date(); const start=new Date(); if(t.timing==='now') start.setMinutes(start.getMinutes()+30); else start.setHours(start.getHours()+2); const end=new Date(start.getTime()+(t.cat==='circle'?4:1)*3600*1000); function fmt(dt){return dt.toISOString().replace(\/[-:]\/g,'').split('.')[0]+'Z';} const ics=`BEGIN:VCALENDAR\\nVERSION:2.0\\nPRODID:-\/\/TahitiSuperApp\/\/EN\\nBEGIN:VEVENT\\nUID:${t.id}@tahitidriver.pf\\nDTSTAMP:${fmt(now)}\\nDTSTART:${fmt(start)}\\nDTEND:${fmt(end)}\\nSUMMARY:Tahiti ${t.cat} - ${t.profile} - Driver ${t.driver}\\nDESCRIPTION:Arch:${t.arch} Island:${t.island} Pickup:${t.pickup} Drop:${t.dropoff} Fare:$${t.fare} Cat:${t.cat} Driver:${t.driver} Voucher:WA${t.id.toString().slice(-4)}\\nLOCATION:${t.pickup} -> ${t.dropoff}\\nEND:VEVENT\\nEND:VCALENDAR`; const blob=new Blob([ics],{type:'text\/calendar'}); const url=URL.createObjectURL(blob); const a=document.createElement('a'); a.href=url; a.download=`Tahiti-${t.cat}-${t.profile}.ics`; a.click(); const gcal=`https:\/\/calendar.google.com\/calendar\/render?action=TEMPLATE&text=${encodeURIComponent('Tahiti '+t.cat+' - '+t.profile+' - '+t.driver)}&details=${encodeURIComponent('WA'+t.id+' $'+t.fare)}&location=${encodeURIComponent(t.pickup+' -> '+t.dropoff)}&dates=${fmt(start)}\/${fmt(end)}`; window.open(gcal,'_blank'); };\nrenderAll();\nif(localStorage.getItem('profile')) document.getElementById('onboard').classList.add('hide');\n<\/script><\/body><\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Tahiti SuperApp \u2022 Mobile WebApp \u2022 Airy Fintech \u26f6\ud83d\uddfa\ufe0f\ud83d\udccd TTahiti \u2022 Black Orange FIREPeerJS \u2022 15-30 min wait \u2022 connecting\ud83c\udfa8 \ud83d\udfe0 Orange Black\ud83d\udd35 Blue White\ud83d\udfe2 Green White \ud83c\udf3a Archipelago\u2303Society IslandsTuamotu 80+MarquesasAustralGambierTahiti PapeeteMooreaBora BoraRangiroa Book AnythingHotel, Restaurant, Activity, Bar, Caf\u00e9, Babysitting, Taxi, Circle Island \ud83d\udcac PeerJS \u2022 Chat \u2022 Visio \u2022 Location DataChannel\u2303 Connect \ud83d\udcf9 Visio\ud83d\udccd [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-246","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mana-corp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=246"}],"version-history":[{"count":7,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/246\/revisions"}],"predecessor-version":[{"id":253,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/246\/revisions\/253"}],"wp:attachment":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}