{"id":278,"date":"2026-09-20T18:59:02","date_gmt":"2026-09-21T04:59:02","guid":{"rendered":"https:\/\/mana-corp.com\/?page_id=278"},"modified":"2026-09-30T15:34:50","modified_gmt":"2026-10-01T01:34:50","slug":"elementor-278","status":"publish","type":"page","link":"https:\/\/mana-corp.com\/?page_id=278","title":{"rendered":"Elementor #278"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"278\" class=\"elementor elementor-278\">\n\t\t\t\t<div class=\"elementor-element elementor-element-efdd7a4 e-flex e-con-boxed e-con e-parent\" data-id=\"efdd7a4\" 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-30e3169 elementor-widget elementor-widget-html\" data-id=\"30e3169\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover\">\n<meta name=\"theme-color\" content=\"#FF6B00\">\n<title>Tahiti BOOK - Production Ready - Uber Cards Feed<\/title>\n<link href=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.css\" rel=\"stylesheet\">\n<script src=\"https:\/\/unpkg.com\/maplibre-gl@4.7.1\/dist\/maplibre-gl.js\"><\/script>\n<style>\n:root{--orange:#FF6B00;--black:#0A0A0A;--gray:#1A1A1A;--card:#1E1E1E;--border:#2A2A2A;--text:#FFFFFF;--muted:#888888;--green:#00FF88}\n*{box-sizing:border-box;margin:0;padding:0;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;-webkit-tap-highlight-color:transparent}\nhtml,body{height:100%;width:100%;background:var(--black);color:var(--text);overflow:hidden;overscroll-behavior:none}\n#app{display:flex;flex-direction:column;height:100dvh;width:100vw;position:relative}\nheader{height:56px;flex-shrink:0;background:#000;border-bottom:2px solid var(--orange);display:flex;align-items:center;justify-content:space-between;padding:0 14px 0 16px;z-index:100;position:relative}\n.logo{font-weight:900;font-size:18px;letter-spacing:-1.2px;display:flex;align-items:center;gap:8px}\n.logo span{color:var(--orange)}\n.live-dot{width:8px;height:8px;background:var(--green);border-radius:50%;box-shadow:0 0 0 3px rgba(0,255,136,.2);animation:pulse 2s infinite}\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}\n.badge{background:var(--orange);color:#000;font-weight:900;font-size:11px;padding:6px 12px;border-radius:20px;letter-spacing:.3px}\n.badge.small{background:var(--gray);color:#fff;border:1px solid var(--border);font-size:10px}\nmain{flex:1;position:relative;overflow:hidden;background:#0F0F0F}\n#map{position:absolute;inset:0;width:100%;height:100%}\n.map-overlay{position:absolute;inset:0;pointer-events:none;z-index:10;display:flex;flex-direction:column}\n.top-filters{pointer-events:auto;display:flex;gap:7px;padding:10px 12px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}\n.top-filters::-webkit-scrollbar{display:none}\n.f{white-space:nowrap;background:rgba(26,26,26,.92);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border);color:#fff;padding:8px 14px;border-radius:22px;font-size:11px;font-weight:800;cursor:pointer;flex-shrink:0;transition:.2s}\n.f.on{background:var(--orange);color:#000;border-color:var(--orange);box-shadow:0 2px 12px rgba(255,107,0,.3)}\n.search-wrap{pointer-events:auto;margin:0 12px;background:rgba(20,20,20,.96);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--border);border-radius:16px;overflow:hidden;box-shadow:0 8px 32px rgba(0,0,0,.6)}\n.search-inner{display:flex;align-items:center;padding:0 12px}\n.search-inner input{flex:1;background:transparent;border:none;padding:14px 8px;color:#fff;font-size:14px;outline:none}\n.search-inner input::placeholder{color:#666}\n.results{max-height:32vh;overflow:auto;display:none;border-top:1px solid var(--border);background:var(--card)}\n.results div{padding:12px 16px;font-size:13px;border-bottom:1px solid #222;cursor:pointer;color:#fff;display:flex;justify-content:space-between;align-items:center}\n.results div span{color:#666;font-size:11px}\n.side-actions{pointer-events:auto;position:absolute;right:12px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:10px}\n.sbtn{width:48px;height:48px;background:rgba(0,0,0,.88);backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:14px;display:grid;place-items:center;font-size:20px;cursor:pointer;box-shadow:0 4px 20px rgba(0,0,0,.5);transition:.2s}\n.sbtn:active{transform:scale(.92)}\n.sbtn.on{border-color:var(--orange);background:rgba(255,107,0,.15)}\n.bottom-info{pointer-events:auto;position:absolute;left:12px;right:80px;bottom:12px;background:rgba(0,0,0,.88);backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:12px;padding:9px 12px;font-size:11px;color:#aaa;display:flex;justify-content:space-between;align-items:center}\n.bottom-info b{color:#fff}\nfooter{flex-shrink:0;background:var(--black);border-top:2.5px solid var(--orange);border-radius:26px 26px 0 0;margin-top:-18px;z-index:50;max-height:62dvh;overflow:hidden;display:flex;flex-direction:column;padding:0;box-shadow:0 -10px 40px rgba(0,0,0,.8)}\n@media(min-width:768px){footer{max-width:440px;margin-left:auto;margin-right:20px;margin-bottom:20px;border-radius:20px;border:2px solid var(--orange);max-height:78dvh}}\n@media(max-height:700px){footer{max-height:52dvh}}\n.drag{width:36px;height:4px;background:#333;border-radius:2px;margin:10px auto 0;flex-shrink:0}\n.scroll{overflow:auto;padding:14px 16px 20px;flex:1}\n.scroll::-webkit-scrollbar{display:none}\n.lb{font-size:10px;color:#777;font-weight:800;letter-spacing:1.3px;text-transform:uppercase;margin:14px 0 8px}\n.lb:first-child{margin-top:4px}\n.in{width:100%;background:var(--card);border:1px solid var(--border);border-radius:12px;padding:13px 12px;color:#fff;font-size:13px;outline:none;transition:.2s}\n.in:focus{border-color:var(--orange);box-shadow:0 0 0 3px rgba(255,107,0,.15)}\n.row{display:flex;gap:8px;margin-top:8px}\n.btn{flex:1;padding:14px;border-radius:14px;border:none;font-weight:900;font-size:13px;cursor:pointer;letter-spacing:.2px;transition:.2s;display:flex;align-items:center;justify-content:center;gap:6px}\n.btn:active{transform:scale(.97)}\n.bo{background:var(--orange);color:#000;box-shadow:0 4px 16px rgba(255,107,0,.3)}\n.bb{background:var(--card);color:#fff;border:1px solid var(--border)}\n.btn:disabled{opacity:.28;pointer-events:none}\n.svcgrid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px}\n.sv{border:1px solid var(--border);background:var(--card);border-radius:14px;padding:12px;cursor:pointer;transition:.2s;position:relative;overflow:hidden}\n.sv.on{border-color:var(--orange);background:rgba(255,107,0,.12);box-shadow:0 2px 12px rgba(255,107,0,.15)}\n.sv b{font-size:11px;display:block}.sv p{font-size:10px;color:var(--muted);margin-top:3px}\n.tog{display:flex;background:var(--card);border:1px solid var(--border);border-radius:12px;padding:3px;margin-top:8px}\n.tog div{flex:1;text-align:center;padding:10px;border-radius:9px;font-weight:900;font-size:11px;cursor:pointer;transition:.2s}\n.tog div.on{background:var(--orange);color:#000}\n.feed{display:flex;flex-direction:column;gap:10px;margin-top:8px}\n.card{background:var(--card);border:1px solid var(--border);border-radius:16px;overflow:hidden;transition:.25s;cursor:pointer}\n.card.on{border-color:var(--orange);box-shadow:0 4px 20px rgba(255,107,0,.2)}\n.card-head{display:flex;gap:12px;padding:12px;align-items:center}\n.card-img{width:64px;height:64px;border-radius:12px;object-fit:cover;background:#222;flex-shrink:0}\n.card-main{flex:1;min-width:0}\n.card-title{font-size:13px;font-weight:800;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.card-sub{font-size:11px;color:var(--muted);margin-top:3px;display:flex;gap:6px;align-items:center}\n.card-sub span{color:var(--orange);font-weight:800}\n.card-go{background:var(--orange);color:#000;border:none;border-radius:22px;padding:8px 14px;font-weight:900;font-size:12px;cursor:pointer;flex-shrink:0;display:flex;align-items:center;gap:4px}\n.card-body{display:none;padding:0 12px 12px;border-top:1px solid var(--border);margin-top:0}\n.card.on.card-body{display:block}\n.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}\n.detail{background:var(--black);border:1px solid var(--border);border-radius:10px;padding:10px}\n.detail b{font-size:10px;color:#777;display:block;margin-bottom:2px}\n.detail span{font-size:12px;font-weight:800}\n.roadtrip-toggle{display:flex;align-items:center;justify-content:space-between;background:rgba(255,107,0,.1);border:1px solid rgba(255,107,0,.3);border-radius:12px;padding:10px 12px;margin-top:10px}\n.switch{width:44px;height:26px;background:#333;border-radius:20px;position:relative;cursor:pointer;transition:.2s}\n.switch.on{background:var(--orange)}\n.switch:after{content:'';position:absolute;top:3px;left:3px;width:20px;height:20px;background:#fff;border-radius:50%;transition:.2s}\n.switch.on:after{left:21px}\n.stops{display:flex;flex-direction:column;gap:8px;margin-top:10px}\n.stop{display:flex;gap:10px;align-items:center;background:var(--black);border:1px dashed var(--border);border-radius:12px;padding:10px}\n.stop.dot{width:28px;height:28px;border-radius:50%;background:var(--card);border:1px solid var(--border);display:grid;place-items:center;font-size:12px;flex-shrink:0}\n.stop input{flex:1;background:transparent;border:none;color:#fff;font-size:12px;outline:none}\n.ticket{margin-top:14px;background:#fff;color:#000;border-radius:16px;display:flex;overflow:hidden;min-height:120px}\n.stub{width:60px;background:#000;color:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:6px;border-right:2px dashed #ccc;font-size:8px;font-weight:900;gap:6px}\n.main-t{flex:1;padding:10px}.main-t h3{font-size:11px;text-transform:uppercase;line-height:1.2}.meta{font-size:10px;color:#555;line-height:1.4;margin-top:4px}\n.qr{width:44px;height:44px;background:#000;color:#fff;border-radius:8px;display:grid;place-items:center;font-size:7px;font-weight:900;flex-shrink:0}\n.bad{display:inline-block;background:var(--orange);color:#000;padding:3px 8px;border-radius:20px;font-size:9px;font-weight:900;margin-top:6px}\n.pills{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}.pill2{background:#222;border:1px solid #333;padding:6px 11px;border-radius:20px;font-size:11px;font-weight:800;cursor:pointer}.pill2.on{background:var(--orange);color:#000;border-color:var(--orange)}\n.s{display:none}.s.on{display:block}\n.note{font-size:10px;color:#555;text-align:center;margin-top:8px;line-height:1.3}\n<\/style>\n<\/head>\n<body>\n<div id=\"app\">\n<header>\n<div class=\"logo\"><div class=\"live-dot\"><\/div>TAHITI<span>BOOK<\/span><span style=\"color:#555;font-size:11px;font-weight:600;margin-left:6px\">\u2022 MapCN \u2022 Feed<\/span><\/div>\n<div style=\"display:flex;gap:8px;align-items:center\"><div class=\"badge small\" id=\"kal\">KALMAN OFF<\/div><div class=\"badge\" id=\"badge\">TB-XXXX<\/div><\/div>\n<\/header>\n<main>\n<div id=\"map\"><\/div>\n<div class=\"map-overlay\">\n<div class=\"top-filters\" id=\"filters\"><div class=\"f on\" data-cat=\"all\">TOUS<\/div><div class=\"f\" data-cat=\"hotel\">\ud83c\udfe8 HOTEL<\/div><div class=\"f\" data-cat=\"resto\">\ud83c\udf7d\ufe0f RESTO<\/div><div class=\"f\" data-cat=\"airport\">\u2708\ufe0f PPT<\/div><div class=\"f\" data-cat=\"ferry\">\u26f4\ufe0f FERRY<\/div><div class=\"f\" data-cat=\"beach\">\ud83c\udfd6\ufe0f BEACH<\/div><\/div>\n<div class=\"search-wrap\"><div class=\"search-inner\"><span style=\"color:#666\">\ud83d\udd0d<\/span><input id=\"q\" placeholder=\"Nominatim Tahiti - H\u00f4tel, Resto, PPT, Ferry...\"><span id=\"clear\" style=\"color:#666;cursor:pointer;display:none\">\u2715<\/span><\/div><div id=\"res\" class=\"results\"><\/div><\/div>\n<div class=\"side-actions\"><div class=\"sbtn\" id=\"loc\" title=\"Locate Me\">\ud83d\udccd<\/div><div class=\"sbtn\" id=\"trk\" title=\"Track Me\">\ud83c\udfaf<\/div><div class=\"sbtn\" id=\"rst\" title=\"Reset\">\ud83d\udd04<\/div><\/div>\n<div class=\"bottom-info\"><span><b id=\"dist\">-<\/b> <span id=\"dur\">-<\/span> \u2022 <span id=\"mode\">MapCN Ready<\/span><\/span><span id=\"eta\" style=\"color:var(--orange);font-weight:900\">ETA ~5min<\/span><\/div>\n<\/div>\n<\/main>\n<footer>\n<div class=\"drag\"><\/div>\n<div class=\"scroll\">\n<div class=\"s on\" id=\"s1\">\n<div class=\"lb\">Onboarding \u2022 WhatsApp obligatoire \u2022 UUID auto \u2022 Header Body Footer<\/div>\n<input id=\"wa\" class=\"in\" placeholder=\"+689 87 XX XX XX - WhatsApp client\">\n<div class=\"note\">Entre ton WhatsApp pour d\u00e9bloquer la map et le feed \u2022 MapCN visible au dessus \u2022 Production ready 100dvh<\/div>\n<div class=\"row\" style=\"margin-top:12px\"><button class=\"btn bo\" id=\"wabtn\">CONTINUER \u2192 VOIR MAPCN + FEED<\/button><\/div>\n<div class=\"lb\" style=\"margin-top:16px\">Live Tahiti Feed \u2022 Nominatim + Cards Collapsible + GO<\/div>\n<div class=\"note\">Apr\u00e8s onboarding, le feed se remplit auto avec PPT, Ferry, H\u00f4tels proches. Tap card = expand + ETA + GO.<\/div>\n<\/div>\n<div class=\"s\" id=\"s2\">\n<div class=\"row\"><input id=\"pick\" class=\"in\" placeholder=\"Pickup GPS \/ Tap map \/ Card GO\" readonly><input id=\"drop\" class=\"in\" placeholder=\"Dropoff Tap map \/ Card GO\" readonly><\/div>\n<div class=\"lb\">Feed \u2022 Tahiti Nearby \u2022 Nominatim \u2022 Collapsible Cards \u2022 ETA \u2022 GO<\/div>\n<div class=\"feed\" id=\"feed\"><\/div>\n<div class=\"lb\">Service \u2022 Taxi prix \u00e0 venir \u2022 Road Trip Mode<\/div>\n<div class=\"svcgrid\">\n<div class=\"sv on\" data-s=\"taxi\"><b>TAXI<\/b><p>Transfert \u2022 Prix \u00e0 venir<\/p><\/div>\n<div class=\"sv\" data-s=\"private\"><b>PRIVATE<\/b><p>On Demand \u2022 Devis<\/p><\/div>\n<div class=\"sv\" data-s=\"tour4\"><b>TOUR 4H $400<\/b><p>9-13h \/ 13-17h<\/p><\/div>\n<div class=\"sv\" data-s=\"tour8\"><b>TOUR 8H $800<\/b><p>9h-17h<\/p><\/div>\n<\/div>\n<div id=\"slots\" style=\"display:none\"><div class=\"lb\">Cr\u00e9neau Tour<\/div><div class=\"pills\" id=\"pills\"><\/div><\/div>\n<div class=\"roadtrip-toggle\"><div><b style=\"font-size:12px\">\ud83d\uddfa\ufe0f Road Trip Mode \u2022 Stops Enabled<\/b><p style=\"font-size:10px;color:#888\">Ajoute des arr\u00eats \u2022 +2\u20ac \/ stop \u2022 Wait 5min<\/p><\/div><div class=\"switch\" id=\"rtSwitch\"><\/div><\/div>\n<div class=\"stops\" id=\"stops\" style=\"display:none\"><\/div>\n<div id=\"extra\"><div class=\"lb\">Pax & Bagages \u2022 8 MAX \u2022 Vol<\/div><div class=\"row\"><select id=\"pax\" class=\"in\"><option>1 Pax<\/option><option selected>2 Pax<\/option><option>3 Pax<\/option><option>4 Pax<\/option><option>5 Pax<\/option><option>6 Pax<\/option><option>7 Pax<\/option><option>8 Pax MAX<\/option><\/select><input id=\"lug\" class=\"in\" placeholder=\"Bagages 2+1\"><\/div><div class=\"row\" style=\"margin-top:8px\"><input id=\"flight\" class=\"in\" placeholder=\"Vol # si PPT\"><select id=\"child\" class=\"in\"><option>Child seat Non<\/option><option>Child seat Oui<\/option><\/select><\/div><\/div>\n<div class=\"lb\">Timing \u2022 NOW 15-30 MIN MAX<\/div>\n<div class=\"tog\" id=\"tog\"><div class=\"on\" data-t=\"now\">NOW 15-30 MIN<\/div><div data-t=\"later\">LATER<\/div><\/div>\n<div id=\"later\" style=\"display:none;margin-top:10px\" class=\"row\"><input type=\"date\" id=\"date\" class=\"in\"><input type=\"time\" id=\"time\" class=\"in\"><\/div>\n<div id=\"ticket\"><\/div>\n<div class=\"row\" style=\"margin-top:14px\"><button class=\"btn bb\" id=\"ics\" disabled>\ud83d\udcc5.ICS<\/button><button class=\"btn bo\" id=\"send\" disabled>WHATSAPP \u2192 GO<\/button><\/div>\n<div class=\"note\">UUID = Reservation ID \u2022 Form valide = WhatsApp activ\u00e9 \u2022 GO envoie ride request \u2022 MapCN Responsive mobile first \u2022 Production ready<\/div>\n<\/div>\n<\/div>\n<\/footer>\n<\/div>\n<script>\nconst center=[-149.426,-17.551];\nlet uuid=crypto.randomUUID();\nlet shortId='TB-'+uuid.slice(0,8).toUpperCase();\ndocument.getElementById('badge').textContent=shortId;\nlocalStorage.setItem('tb_uuid',uuid);\nif(localStorage.getItem('tb_wa')) document.getElementById('wa').value=localStorage.getItem('tb_wa');\nconst map=new maplibregl.Map({container:'map',style:'https:\/\/basemaps.cartocdn.com\/gl\/dark-matter-gl-style\/style.json',center:center,zoom:11.5,attributionControl:false});\nmap.addControl(new maplibregl.NavigationControl({showCompass:true}),'bottom-left');\nlet pickup=null,dropoff=null,pm=null,dm=null,service='taxi',timing='now',slot='',watch=null,roadTrip=false,kf={x:0,p:1,q:0.12,r:0.6},kal=false,markers=[];\nconst tahitiPlaces=[{name:\"Faa'a International Airport (PPT)\",cat:'airport',lat:-17.556,lng:-149.611,img:'https:\/\/images.unsplash.com\/photo-1436491865332-7a61a109cc05?w=200',rating:4.3,dist:'3.4 km'},{name:'Papeete Ferry Terminal - Moorea',cat:'ferry',lat:-17.538,lng:-149.568,img:'https:\/\/images.unsplash.com\/photo-1544551763-46a013bb70d5?w=200',rating:4.6,dist:'1.8 km'},{name:'Hotel InterContinental Tahiti Resort',cat:'hotel',lat:-17.581,lng:-149.614,img:'https:\/\/images.unsplash.com\/photo-1520250497591-112f2f40a3f4?w=200',rating:4.7,dist:'1.2 km'},{name:'Le March\u00e9 Restaurant',cat:'resto',lat:-17.535,lng:-149.567,img:'https:\/\/images.unsplash.com\/photo-1517248135467-4c7edcad34c4?w=200',rating:4.5,dist:'800 m'},{name:'La Plage de Tahiti (Public Beach)',cat:'beach',lat:-17.57,lng:-149.62,img:'https:\/\/images.unsplash.com\/photo-1507525428034-b723cf961d3e?w=200',rating:4.8,dist:'950 m'},{name:'Hilton Hotel Tahiti',cat:'hotel',lat:-17.576,lng:-149.605,img:'https:\/\/images.unsplash.com\/photo-1566073771259-6a8506099945?w=200',rating:4.6,dist:'2.1 km'}];\nmap.on('load',()=>{document.getElementById('mode').textContent='MapCN Loaded \u2705';map.addSource('route',{type:'geojson',data:{type:'Feature',properties:{},geometry:{type:'LineString',coordinates:[]}}});map.addLayer({id:'route',type:'line',source:'route',paint:{'line-color':'#FF6B00','line-width':5,'line-opacity':.9}});renderFeed(tahitiPlaces);addPlaceMarkers(tahitiPlaces);});\nfunction addPlaceMarkers(places){markers.forEach(m=>m.remove());markers=[];places.forEach(p=>{const el=document.createElement('div');el.style.fontSize='22px';el.style.cursor='pointer';el.textContent=p.cat==='airport'?'\u2708\ufe0f':p.cat==='ferry'?'\u26f4\ufe0f':p.cat==='hotel'?'\ud83c\udfe8':p.cat==='resto'?'\ud83c\udf7d\ufe0f':'\ud83c\udfd6\ufe0f';const m=new maplibregl.Marker({element:el}).setLngLat([p.lng,p.lat]).setPopup(new maplibregl.Popup().setText(p.name)).addTo(map);markers.push(m);});}\nfunction renderFeed(places){const feed=document.getElementById('feed');feed.innerHTML='';places.forEach((p,i)=>{const eta=Math.floor(Math.random()*8+3);const div=document.createElement('div');div.className='card'+(i===0?' on':'');div.dataset.cat=p.cat;div.innerHTML=`<div class=\"card-head\"><img decoding=\"async\" class=\"card-img\" src=\"${p.img}\" onerror=\"this.src='https:\/\/via.placeholder.com\/64\/1E1E1E\/FF6B00?text=${p.cat}'\"><div class=\"card-main\"><div class=\"card-title\">${p.name}<\/div><div class=\"card-sub\"><span>\u2605 ${p.rating}<\/span> \u2022 ${p.dist} away \u2022 <span style=\"color:var(--orange)\">ETA ${eta}min<\/span><\/div><\/div><button class=\"card-go\" data-i=\"${i}\">GO \u2192<\/button><\/div><div class=\"card-body\"><div class=\"detail-grid\"><div class=\"detail\"><b>Distance<\/b><span>${p.dist}<\/span><\/div><div class=\"detail\"><b>ETA<\/b><span style=\"color:var(--orange)\">${eta} min<\/span><\/div><div class=\"detail\"><b>Cat\u00e9gorie<\/b><span>${p.cat.toUpperCase()}<\/span><\/div><div class=\"detail\"><b>Prix<\/b><span>${service==='tour4'?'$400':service==='tour8'?'$800':'\u00c0 venir'}<\/span><\/div><\/div><div class=\"row\" style=\"margin-top:10px\"><button class=\"btn bb\" onclick=\"setPickFromPlace(${p.lng},${p.lat},'${p.name.replace(\/'\/g,\"\\\\'\")}')\">Set Pickup<\/button><button class=\"btn bo\" onclick=\"setDropFromPlace(${p.lng},${p.lat},'${p.name.replace(\/'\/g,\"\\\\'\")}')\">Set Dropoff \u2192 GO<\/button><\/div><div class=\"note\" style=\"margin-top:8px\">Tap GO pour envoyer ride request \u2022 ${p.name} \u2022 Nominatim verified<\/div><\/div>`;div.querySelector('.card-head').onclick=(e)=>{if(e.target.classList.contains('card-go')) return;document.querySelectorAll('.card').forEach(c=>{if(c!==div) c.classList.remove('on')});div.classList.toggle('on');};div.querySelector('.card-go').onclick=(e)=>{e.stopPropagation();setDropFromPlace(p.lng,p.lat,p.name);document.getElementById('mode').textContent='GO \u2192 '+p.name.slice(0,20);document.getElementById('s1').style.display='none';document.getElementById('s2').style.display='block';setTimeout(()=>map.resize(),200);map.flyTo({center:[p.lng,p.lat],zoom:14});validate();};feed.appendChild(div);});}\nwindow.setPickFromPlace=(lng,lat,name)=>{pickup=[lng,lat];document.getElementById('pick').value=name.slice(0,24)+' '+lat.toFixed(4)+','+lng.toFixed(4);if(pm) pm.remove();pm=new maplibregl.Marker({color:'#FF6B00'}).setLngLat([lng,lat]).addTo(map);if(pickup&&dropoff) route();validate();};\nwindow.setDropFromPlace=(lng,lat,name)=>{dropoff=[lng,lat];document.getElementById('drop').value=name.slice(0,24)+' '+lat.toFixed(4)+','+lng.toFixed(4);if(dm) dm.remove();dm=new maplibregl.Marker({color:'#fff'}).setLngLat([lng,lat]).addTo(map);if(pickup&&dropoff) route();validate();document.getElementById('s1').style.display='none';document.getElementById('s2').style.display='block';};\nmap.on('click',e=>{const c=[e.lngLat.lng,e.lngLat.lat];if(service.startsWith('tour')) setPick(c,'Tap Map');else if(!pickup) setPick(c,'Tap Map');else setDrop(c,'Tap Map');});\nfunction setPick(c,label){pickup=c;document.getElementById('pick').value=label+' '+c[1].toFixed(4)+','+c[0].toFixed(4);if(pm) pm.remove();pm=new maplibregl.Marker({color:'#FF6B00'}).setLngLat(c).addTo(map);if(pickup&&dropoff&&!service.startsWith('tour')) route();validate();}\nfunction setDrop(c,label){dropoff=c;document.getElementById('drop').value=label+' '+c[1].toFixed(4)+','+c[0].toFixed(4);if(dm) dm.remove();dm=new maplibregl.Marker({color:'#fff'}).setLngLat(c).addTo(map);if(pickup&&dropoff) route();validate();}\nasync function route(){if(!pickup||!dropoff) return;const url=`https:\/\/router.project-osrm.org\/route\/v1\/driving\/${pickup[0]},${pickup[1]};${dropoff[0]},${dropoff[1]}?overview=full&geometries=geojson`;try{const res=await fetch(url);const j=await res.json();if(j.routes&&j.routes[0]){const rt=j.routes[0];map.getSource('route').setData({type:'Feature',geometry:rt.geometry});document.getElementById('dist').textContent=(rt.distance\/1000).toFixed(1)+'km';document.getElementById('dur').textContent=Math.round(rt.duration\/60)+'min';document.getElementById('eta').textContent='ETA '+Math.round(rt.duration\/60+3)+'min';document.getElementById('mode').textContent='Route OK \u2705';map.fitBounds([[pickup[0],pickup[1]],[dropoff[0],dropoff[1]]],{padding:{top:80,bottom:200,left:40,right:40}});}}catch{map.getSource('route').setData({type:'Feature',geometry:{type:'LineString',coordinates:[pickup,dropoff]}});}}\nfunction kUpd(m){kf.p=kf.p+kf.q;const k=kf.p\/(kf.p+kf.r);kf.x=kf.x+k*(m-kf.x);kf.p=(1-k)*kf.p;return kf.x;}\ndocument.getElementById('loc').onclick=()=>{navigator.geolocation.getCurrentPosition(p=>{const c=[p.coords.longitude,p.coords.latitude];kf.x=c[0];kal=true;document.getElementById('kal').textContent='KALMAN ON';document.getElementById('kal').style.background='#00FF88';document.getElementById('kal').style.color='#000';map.flyTo({center:c,zoom:15});setPick(c,'Mon GPS \ud83d\udccd');document.getElementById('mode').textContent='GPS '+Math.round(p.coords.accuracy)+'m';},null,{enableHighAccuracy:true});};\ndocument.getElementById('trk').onclick=()=>{if(watch){navigator.geolocation.clearWatch(watch);watch=null;document.getElementById('trk').textContent='\ud83c\udfaf';document.getElementById('trk').classList.remove('on');return;}document.getElementById('trk').textContent='\u23f9\ufe0f';document.getElementById('trk').classList.add('on');watch=navigator.geolocation.watchPosition(p=>{const c=[p.coords.longitude,p.coords.latitude];if(pm) pm.setLngLat(c);else setPick(c,'Track');map.setCenter(c);},null,{enableHighAccuracy:true});};\ndocument.getElementById('rst').onclick=()=>{pickup=null;dropoff=null;if(pm) pm.remove();if(dm) dm.remove();pm=null;dm=null;map.getSource('route').setData({type:'Feature',geometry:{type:'LineString',coordinates:[]}});document.getElementById('pick').value='';document.getElementById('drop').value='';document.getElementById('dist').textContent='-';document.getElementById('dur').textContent='-';document.getElementById('mode').textContent='Reset \u2022 MapCN Ready';validate();};\ndocument.querySelectorAll('.f').forEach(el=>{el.onclick=()=>{document.querySelectorAll('.f').forEach(f=>f.classList.remove('on'));el.classList.add('on');const cat=el.dataset.cat;if(cat==='all') renderFeed(tahitiPlaces);else renderFeed(tahitiPlaces.filter(p=>p.cat===cat));addPlaceMarkers(cat==='all'?tahitiPlaces:tahitiPlaces.filter(p=>p.cat===cat));};});\nlet to;const q=document.getElementById('q');const res=document.getElementById('res');const clear=document.getElementById('clear');\nq.addEventListener('input',e=>{clearTimeout(to);const val=e.target.value;clear.style.display=val.length?'block':'none';if(val.length<3){res.style.display='none';return;}to=setTimeout(async()=>{try{const url=`https:\/\/nominatim.openstreetmap.org\/search?format=json&q=${encodeURIComponent(val)}&viewbox=-149.9,-17.2,-149.2,-17.9&bounded=1&limit=8&countrycodes=pf`;const r=await fetch(url);const d=await r.json();res.innerHTML='';res.style.display='block';d.forEach(x=>{const div=document.createElement('div');div.innerHTML=`<span>${x.display_name.slice(0,60)}<\/span><span>${x.type}<\/span>`;div.onclick=()=>{const c=[parseFloat(x.lon),parseFloat(x.lat)];const newPlace={name:x.display_name.slice(0,30),cat:x.type.includes('aerodrome')?'airport':x.type.includes('ferry')?'ferry':x.type.includes('hotel')?'hotel':x.type.includes('restaurant')||x.type.includes('amenity')?'resto':'beach',lat:parseFloat(x.lat),lng:parseFloat(x.lon),img:'https:\/\/via.placeholder.com\/64\/1E1E1E\/FF6B00?text='+x.type.slice(0,4),rating:(4+Math.random()).toFixed(1),dist:'- '};tahitiPlaces.unshift(newPlace);renderFeed(tahitiPlaces);addPlaceMarkers(tahitiPlaces);if(!pickup) setPickFromPlace(c[0],c[1],x.display_name.slice(0,20));else setDropFromPlace(c[0],c[1],x.display_name.slice(0,20));res.style.display='none';q.value='';clear.style.display='none';map.flyTo({center:c,zoom:14});};res.appendChild(div);});}catch{}},400);});\nclear.onclick=()=>{q.value='';res.style.display='none';clear.style.display='none';renderFeed(tahitiPlaces);};\ndocument.getElementById('rtSwitch').onclick=function(){this.classList.toggle('on');roadTrip=this.classList.contains('on');document.getElementById('stops').style.display=roadTrip?'flex':'none';if(roadTrip&&document.getElementById('stops').children.length===0){const stops=document.getElementById('stops');const div=document.createElement('div');div.className='stop';div.innerHTML=`<div class=\"dot\">\ud83d\udccd<\/div><input placeholder=\"Arr\u00eat interm\u00e9diaire - Tap map ou search\"><div style=\"cursor:pointer\" onclick=\"this.parentElement.remove()\">\u2715<\/div>`;stops.appendChild(div);}};\ndocument.querySelectorAll('.sv').forEach(el=>{el.onclick=()=>{document.querySelectorAll('.sv').forEach(s=>s.classList.remove('on'));el.classList.add('on');service=el.dataset.s;const isTour=service.startsWith('tour');document.getElementById('extra').style.display=isTour?'none':'block';document.getElementById('slots').style.display=isTour?'block':'none';const pills=document.getElementById('pills');pills.innerHTML='';if(service==='tour4'){[['9-13','9h-13h'],['13-17','13h-17h']].forEach(s=>{const d=document.createElement('div');d.className='pill2';d.textContent=s[1];d.onclick=()=>{document.querySelectorAll('.pill2').forEach(p=>p.classList.remove('on'));d.classList.add('on');slot=s[0];validate();};pills.appendChild(d);});slot='';}if(service==='tour8'){const d=document.createElement('div');d.className='pill2 on';d.textContent='9h-17h';pills.appendChild(d);slot='9-17';}validate();renderFeed(tahitiPlaces);};});\ndocument.querySelectorAll('#tog div').forEach(d=>{d.onclick=()=>{document.querySelectorAll('#tog div').forEach(x=>x.classList.remove('on'));d.classList.add('on');timing=d.dataset.t;document.getElementById('later').style.display=timing==='later'?'flex':'none';validate();};});\ndocument.getElementById('wabtn').onclick=()=>{const v=document.getElementById('wa').value.trim();if(v.length<8){alert('Entre ton WhatsApp +689');return;}localStorage.setItem('tb_wa',v);document.getElementById('s1').classList.remove('on');document.getElementById('s2').classList.add('on');setTimeout(()=>{map.resize();renderFeed(tahitiPlaces);},300);};\nfunction validate(){const wa=localStorage.getItem('tb_wa');const hasPick=!!pickup;const hasDrop=service.startsWith('tour')?true:!!dropoff;const hasSlot=service.startsWith('tour')?!!slot:true;let hasTime=true;if(timing==='later'){hasTime=!!(document.getElementById('date').value && document.getElementById('time').value);}const ok=wa&&hasPick&&hasDrop&&hasSlot&&hasTime;document.getElementById('send').disabled=!ok;document.getElementById('ics').disabled=!(ok&&timing==='later');renderTicket();return ok;}\n['date','time','pax','lug','flight','child'].forEach(id=>{const el=document.getElementById(id);if(el){el.addEventListener('change',validate);el.addEventListener('input',validate);}});\nfunction renderTicket(){const wa=localStorage.getItem('tb_wa')||'-';const pax=document.getElementById('pax').value;const lug=document.getElementById('lug').value||'-';const pickT=document.getElementById('pick').value||'\u2014';const dropT=document.getElementById('drop').value||'Island Tour Loop';const timeT=timing==='now'?'NOW \u2022 15-30 MIN':`${document.getElementById('date').value} ${document.getElementById('time').value}`;let fare='\u00c0 venir';if(service==='private') fare='On Demand';if(service==='tour4') fare='$400 USD';if(service==='tour8') fare='$800 USD';const svc={taxi:'TAXI',private:'PRIVATE On Demand',tour4:`TOUR 4H ${slot} $400`,tour8:'TOUR 8H $800'}[service];const stopsCount=document.getElementById('stops').children.length;document.getElementById('ticket').innerHTML=`<div class=\"ticket\"><div class=\"stub\"><span>KEEP STUB<\/span><div style=\"font-size:16px\">\ud83c\udf9f\ufe0f<\/div><span>${shortId}<\/span><\/div><div class=\"main-t\"><div style=\"display:flex;justify-content:space-between;align-items:flex-start\"><h3>FROM ${pickT.slice(0,22)}<br>TO ${dropT.slice(0,22)}<\/h3><div class=\"qr\">${shortId.slice(0,6)}<\/div><\/div><div class=\"meta\">WA: ${wa} \u2022 ${pax} \u2022 Lugg: ${lug}<br>Time: ${timeT} \u2022 ${document.getElementById('dist').textContent} \u2022 ${document.getElementById('dur').textContent}<br>Svc: ${svc} \u2022 Fare: ${fare}${roadTrip?` + Road Trip ${stopsCount} stops`:''}<br>UUID: ${uuid.slice(0,22)}...<\/div><div class=\"bad\">SCAN TO BOARD \u2022 ${shortId} \u2022 ${timing==='now'?'NOW 15-30 MIN':''}<\/div><\/div><\/div>`;}\ndocument.getElementById('send').onclick=()=>{const waC=localStorage.getItem('tb_wa');const pickT=document.getElementById('pick').value;const dropT=document.getElementById('drop').value;const pax=document.getElementById('pax').value;const lug=document.getElementById('lug').value;const fl=document.getElementById('flight').value;const timeT=timing==='now'?'NOW 15-30 MIN max':`${document.getElementById('date').value} ${document.getElementById('time').value}`;const svc={taxi:'TAXI',private:'PRIVATE On Demand',tour4:`TOUR 4H ${slot} $400`,tour8:'TOUR 8H $800 USD'}[service];const stops=[...document.getElementById('stops').querySelectorAll('input')].map(i=>i.value).filter(Boolean).join(' | ');const msg=`\ud83c\udf9f\ufe0f TAHITI BOOKING ${shortId}\\nUUID: ${uuid}\\nClient WA: ${waC}\\nService: ${svc}${roadTrip?' + Road Trip Mode':''}\\nTiming: ${timeT}\\nPax: ${pax} \u2022 Lugg: ${lug||'-'} \u2022 Flight: ${fl||'-'}\\nPickup: ${pickT}\\n${service.startsWith('tour')?'Loop: Island Tour':'Dropoff: '+dropT}\\n${stops?'Stops: '+stops+'\\n':''}Map Pickup: https:\/\/www.google.com\/maps?q=${pickup?pickup[1]+','+pickup[0]:''}\\n${dropoff?`Map Drop: https:\/\/www.google.com\/maps?q=${dropoff[1]},${dropoff[0]}`:''}\\nFare: ${service==='tour4'?'$400':service==='tour8'?'$800':service==='private'?'On Demand':'\u00c0 venir'}\\n\\nTicket valid \u2022 NOW 15-30min`;window.open(`https:\/\/wa.me\/68989660003?text=${encodeURIComponent(msg)}`,'_blank');};\ndocument.getElementById('ics').onclick=()=>{const date=document.getElementById('date').value,time=document.getElementById('time').value;if(!date||!time) return;const dt=new Date(date+'T'+time+':00');const pad=n=>String(n).padStart(2,'0');const toICS=d=>`${d.getUTCFullYear()}${pad(d.getUTCMonth()+1)}${pad(d.getUTCDate())}T${pad(d.getUTCHours())}${pad(d.getUTCMinutes())}00Z`;const start=toICS(dt);const end=toICS(new Date(dt.getTime()+(service==='tour8'?8:service==='tour4'?4:1)*3600000));const ics=`BEGIN:VCALENDAR\\nVERSION:2.0\\nPRODID:-\/\/TahitiBook\/\/EN\\nBEGIN:VEVENT\\nUID:${uuid}@tahitibook.pf\\nDTSTAMP:${toICS(new Date())}\\nDTSTART:${start}\\nDTEND:${end}\\nSUMMARY:${shortId} - ${service.toUpperCase()}\\nLOCATION:${document.getElementById('pick').value}\\nDESCRIPTION:UUID ${uuid} WA ${localStorage.getItem('tb_wa')}\\nEND:VEVENT\\nEND:VCALENDAR`;const blob=new Blob([ics],{type:'text\/calendar'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=`${shortId}.ics`;a.click();};\nwindow.addEventListener('resize',()=>map.resize());\nwindow.addEventListener('orientationchange',()=>setTimeout(()=>map.resize(),400));\n<\/script>\n<\/body>\n<\/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-7613024 e-flex e-con-boxed e-con e-parent\" data-id=\"7613024\" 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-3a08300 elementor-widget elementor-widget-shortcode\" data-id=\"3a08300\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div class=\"gtranslate_wrapper\" id=\"gt-wrapper-53563198\"><\/div><\/div>\n\t\t\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 BOOK &#8211; Production Ready &#8211; Uber Cards Feed TAHITIBOOK\u2022 MapCN \u2022 Feed KALMAN OFFTB-XXXX TOUS\ud83c\udfe8 HOTEL\ud83c\udf7d\ufe0f RESTO\u2708\ufe0f PPT\u26f4\ufe0f FERRY\ud83c\udfd6\ufe0f BEACH \ud83d\udd0d\u2715 \ud83d\udccd\ud83c\udfaf\ud83d\udd04 &#8211; &#8211; \u2022 MapCN ReadyETA ~5min Onboarding \u2022 WhatsApp obligatoire \u2022 UUID auto \u2022 Header Body Footer Entre ton WhatsApp pour d\u00e9bloquer la map et le feed \u2022 MapCN visible au dessus [&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-278","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/278","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=278"}],"version-history":[{"count":7,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/278\/revisions"}],"predecessor-version":[{"id":303,"href":"https:\/\/mana-corp.com\/index.php?rest_route=\/wp\/v2\/pages\/278\/revisions\/303"}],"wp:attachment":[{"href":"https:\/\/mana-corp.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}