{"id":23639,"date":"2026-09-16T06:36:00","date_gmt":"2026-09-16T06:36:00","guid":{"rendered":"https:\/\/www.transports-express-caraibes.fr\/blog\/covoiturage-martinique-app\/"},"modified":"2026-09-16T06:36:00","modified_gmt":"2026-09-16T06:36:00","slug":"covoiturage-martinique-app","status":"publish","type":"post","link":"https:\/\/www.transports-express-caraibes.fr\/blog\/covoiturage-martinique-app\/","title":{"rendered":"Covoiturage en Martinique : d\u00e9couvrez l\u2019application gratuite pour faciliter vos trajets"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Covoiturage en Martinique : d\u00e9couvrez l\u2019application gratuite pour faciliter vos trajets<\/h2>\n\n<p class=\"wp-block-paragraph\">\nLa circulation en Martinique peut vite peser sur le porte-monnaie et sur l\u2019environnement. Entre files le matin, transports publics parfois rares et prix du carburant volatils, beaucoup cherchent une alternative pratique et \u00e9conomique pour leurs trajets quotidiens. Cet article explique concr\u00e8tement comment utiliser une <strong>application gratuite<\/strong> de covoiturage locale, combien vous pouvez \u00e9conomiser, et quelles bonnes pratiques adopter pour voyager serein. Vous trouverez des \u00e9tapes claires pour publier ou r\u00e9server un trajet, une comparaison chiffr\u00e9e avec taxi et voiture solo, des conseils de s\u00e9curit\u00e9, et des options selon votre profil (salari\u00e9, \u00e9tudiant, week-ender). \u00c0 la fin, des liens pratiques pour t\u00e9l\u00e9charger l\u2019application ou en savoir plus sur les initiatives locales et nationales.\n<\/p>\n\n<ul class=\"wp-block-list\"><li><strong>Quoi :<\/strong> une solution de <strong>covoiturage<\/strong> locale pour la <strong>mobilit\u00e9<\/strong> quotidienne en <strong>Martinique<\/strong>.<\/li><li><strong>Co\u00fbt moyen :<\/strong> environ <strong>0,40 \u20ac \/ km<\/strong> pour le passager sur certaines applis locales.<\/li><li><strong>Avantages :<\/strong> <strong>r\u00e9duction des co\u00fbts<\/strong>, gain de temps, <strong>\u00e9cologie<\/strong> (moins d\u2019\u00e9missions), convivialit\u00e9.<\/li><li><strong>T\u00e9l\u00e9chargement :<\/strong> applis disponibles sur stores et sites locaux (voir liens utiles).<\/li><li><strong>Premiers pas :<\/strong> cr\u00e9er un profil, g\u00e9olocaliser le trajet, confirmer la prise en charge.<\/li><\/ul>\n\n<h2 class=\"wp-block-heading\">Comment fonctionne l\u2019application gratuite de covoiturage en Martinique<\/h2>\n\n<p class=\"wp-block-paragraph\">\nLes applications locales connectent un conducteur et un pi\u00e9ton gr\u00e2ce \u00e0 la g\u00e9olocalisation. L\u2019utilisateur indique un point de d\u00e9part, une destination et l\u2019horaire souhait\u00e9. L\u2019algorithme propose des correspondances imm\u00e9diates ou programm\u00e9es. Parmi les solutions pr\u00e9sentes aux Antilles, <strong>NouLa<\/strong> s\u2019est lanc\u00e9e r\u00e9cemment et compte d\u00e9j\u00e0 plusieurs centaines de t\u00e9l\u00e9chargements en Martinique, preuve d\u2019un int\u00e9r\u00eat croissant.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nConcr\u00e8tement, le conducteur propose le trajet, fixe un partage des frais (ex. <strong>0,40 \u20ac\/km<\/strong>) et le passager r\u00e9serve. Les coordonn\u00e9es et \u00e9valuations sont visibles pour rassurer chaque partie. L\u2019application est t\u00e9l\u00e9chargeable depuis les stores officiels et r\u00e9f\u00e9renc\u00e9e dans la presse locale pour sa simplicit\u00e9 d\u2019usage.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nInsight : ce syst\u00e8me transforme un trajet isol\u00e9 en opportunit\u00e9 de <strong>partage de voiture<\/strong> utile et rentable.\n<\/p>\n\n<h3 class=\"wp-block-heading\">\u00c9tapes simples pour publier ou r\u00e9server un trajet<\/h3>\n\n<ol class=\"wp-block-list\"><li>Cr\u00e9er un profil avec photo et mode de paiement confirm\u00e9.<\/li><li>Indiquer point de d\u00e9part, destination, horaire et nombre de places.<\/li><li>Accepter ou refuser une demande apr\u00e8s v\u00e9rification du profil et des avis.<\/li><li>Confirmer la prise en charge et le lieu de rendez-vous pr\u00e9cis (ex. parking, aire de covoiturage).<\/li><li>Partager le co\u00fbt estim\u00e9 ; paiement via l\u2019application ou en main propre selon l\u2019offre.<\/li><\/ol>\n\n<p class=\"wp-block-paragraph\">\nExemple : pour un trajet quotidien de 20 km, \u00e0 <strong>0,40 \u20ac\/km<\/strong>, le passager paie 8 \u20ac ; sur 20 jours travaill\u00e9s, cela repr\u00e9sente 160 \u20ac par mois \u2014 souvent bien moins que le co\u00fbt total en voiture individuelle.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nInsight : la simplicit\u00e9 du parcours r\u00e9duit l\u2019effort administratif et augmente l\u2019adoption.\n<\/p>\n\n<!-- Calculateur d\u2019\u00e9conomie en covoiturage (bloc pr\u00eat \u00e0 copier\/coller) -->\n<!-- Inclure Tailwind via CDN pour styles utilitaires (l\u00e9ger, c\u00f4t\u00e9 client) -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@tailwindcss\/browser@4\"><\/script>\n\n<div id=\"covoiturage-calculateur\" class=\"max-w-3xl mx-auto p-4 bg-white\/90 dark:bg-slate-900\/90 rounded-xl shadow-md ring-1 ring-slate-200 dark:ring-slate-700\"\n     style=\"min-height:120px; max-height:2000px;\">\n  <h2 class=\"text-2xl font-semibold text-slate-800 dark:text-slate-100 mb-2\">Calculateur d\u2019\u00e9conomie en covoiturage<\/h2>\n  <p class=\"text-sm text-slate-600 dark:text-slate-300 mb-4\">\n    Indiquez la distance aller simple (km), le nombre d\u2019allers-retours par semaine, le co\u00fbt au km en voiture solo et le co\u00fbt au km en covoiturage.\n    Le calculateur estime l\u2019\u00e9conomie mensuelle et annuelle.\n  <\/p>\n\n  <form id=\"form-calc\" class=\"grid grid-cols-1 gap-3 sm:grid-cols-2\" aria-label=\"Formulaire du calculateur d'\u00e9conomie\">\n    <label class=\"flex flex-col text-slate-700 dark:text-slate-200\">\n      Distance aller simple (km)\n      <input id=\"distance\" type=\"number\" min=\"0\" step=\"0.1\" value=\"10\" class=\"mt-1 p-2 rounded border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100\" aria-describedby=\"distance-help\">\n      <span id=\"distance-help\" class=\"text-xs text-slate-500 dark:text-slate-400\">Entrez la distance en kilom\u00e8tres (ex. 10)<\/span>\n    <\/label>\n\n    <label class=\"flex flex-col text-slate-700 dark:text-slate-200\">\n      Allers-retours par semaine\n      <input id=\"trips\" type=\"number\" min=\"0\" step=\"1\" value=\"5\" class=\"mt-1 p-2 rounded border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100\">\n    <\/label>\n\n    <label class=\"flex flex-col text-slate-700 dark:text-slate-200\">\n      Co\u00fbt au km (voiture solo) (\u20ac)\n      <input id=\"costSolo\" type=\"number\" min=\"0\" step=\"0.01\" value=\"0.60\" class=\"mt-1 p-2 rounded border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100\">\n    <\/label>\n\n    <label class=\"flex flex-col text-slate-700 dark:text-slate-200\">\n      Co\u00fbt au km (covoiturage) (\u20ac)\n      <input id=\"costCarpool\" type=\"number\" min=\"0\" step=\"0.01\" value=\"0.40\" class=\"mt-1 p-2 rounded border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100\">\n    <\/label>\n\n    <div class=\"sm:col-span-2 flex flex-col gap-2\">\n      <div class=\"flex gap-2 items-center\">\n        <button id=\"calcBtn\" type=\"button\" class=\"px-4 py-2 rounded bg-emerald-600 text-white hover:bg-emerald-500 focus:outline-none focus:ring-2 focus:ring-emerald-300\">Calculer<\/button>\n        <button id=\"resetBtn\" type=\"button\" class=\"px-4 py-2 rounded bg-slate-200 dark:bg-slate-700 text-slate-800 dark:text-slate-100 hover:bg-slate-300 dark:hover:bg-slate-600 focus:outline-none\">Remise \u00e0 z\u00e9ro<\/button>\n        <button id=\"autoDistanceBtn\" type=\"button\" class=\"px-3 py-2 rounded bg-indigo-600 text-white hover:bg-indigo-500 focus:outline-none\" title=\"Trouver la distance entre deux adresses (optionnel)\">\n          Obtenir distance par adresses\n        <\/button>\n      <\/div>\n\n      <div id=\"addresses\" class=\"hidden flex-col gap-2 p-3 border border-slate-100 dark:border-slate-800 rounded bg-slate-50 dark:bg-slate-900\">\n        <p class=\"text-sm text-slate-600 dark:text-slate-300\">Entrez deux adresses (optionnel). Le calculateur utilisera la distance routi\u00e8re estim\u00e9e.<\/p>\n        <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-2\">\n          <input id=\"addrFrom\" type=\"text\" placeholder=\"Adresse de d\u00e9part (ex. Fort-de-France, Martinique)\" class=\"p-2 rounded border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100\">\n          <input id=\"addrTo\" type=\"text\" placeholder=\"Adresse d'arriv\u00e9e (ex. Le Lamentin, Martinique)\" class=\"p-2 rounded border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100\">\n        <\/div>\n        <div class=\"flex gap-2 mt-2\">\n          <button id=\"geocodeBtn\" type=\"button\" class=\"px-3 py-2 rounded bg-blue-600 text-white hover:bg-blue-500\">Calculer la distance<\/button>\n          <span id=\"geoStatus\" class=\"text-sm text-slate-600 dark:text-slate-300 self-center\"><\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/form>\n\n  <div id=\"results\" class=\"mt-4 p-3 rounded border border-slate-100 dark:border-slate-800 bg-slate-50 dark:bg-slate-900\" aria-live=\"polite\">\n    <h3 class=\"text-lg font-medium text-slate-800 dark:text-slate-100\">R\u00e9sultats<\/h3>\n    <div id=\"resultContent\" class=\"mt-2 grid grid-cols-1 sm:grid-cols-2 gap-2 text-slate-700 dark:text-slate-200\">\n      <!-- Rempli dynamiquement -->\n    <\/div>\n    <div class=\"mt-3 flex gap-2\">\n      <button id=\"copySummary\" type=\"button\" class=\"px-3 py-2 rounded bg-amber-500 text-white hover:bg-amber-400 focus:outline-none\">Copier le r\u00e9sum\u00e9<\/button>\n      <button id=\"downloadCsv\" type=\"button\" class=\"px-3 py-2 rounded bg-sky-600 text-white hover:bg-sky-500 focus:outline-none\">T\u00e9l\u00e9charger CSV<\/button>\n    <\/div>\n  <\/div>\n\n  <p class=\"text-xs text-slate-500 dark:text-slate-400 mt-3\">\n    Estimations bas\u00e9es sur les valeurs saisies. Les distances routi\u00e8res sont approximatives si vous utilisez la g\u00e9olocalisation d\u2019adresses.\n  <\/p>\n<\/div>\n\n<script>\n\/*\n  Script JavaScript pour le calculateur d'\u00e9conomie en covoiturage\n  - Enti\u00e8rement comment\u00e9 et lisible\n  - Toutes les cha\u00eenes sont en fran\u00e7ais\n  - Pas de d\u00e9pendances lourdes\n  - Utilise uniquement des APIs publiques et gratuites si l'utilisateur souhaite obtenir la distance par adresses :\n      1) Nominatim (OpenStreetMap) pour g\u00e9ocodage (sans cl\u00e9) :\n         Exemple d'URL (GET) :\n           https:\/\/nominatim.openstreetmap.org\/search?q=Fort-de-France%2C+Martinique&format=json&limit=1\n         Exemple de r\u00e9ponse JSON (tableau) :\n           [\n             {\n               \"place_id\": \"123456\",\n               \"lat\": \"14.6099\",\n               \"lon\": \"-61.0730\",\n               \"display_name\": \"Fort-de-France, Martinique, ...\",\n               ...\n             }\n           ]\n      2) OSRM pour itin\u00e9raire routier (server public demo) :\n         Exemple d'URL (GET) :\n           https:\/\/router.project-osrm.org\/route\/v1\/driving\/-61.0730,14.6099;-61.0210,14.6160?overview=false\n         Exemple de r\u00e9ponse JSON :\n           {\n             \"code\":\"Ok\",\n             \"routes\":[\n               {\n                 \"geometry\":\"\",\n                 \"legs\":[...],\n                 \"distance\": 6420.3,   \/\/ en m\u00e8tres\n                 \"duration\": 780.2\n               }\n             ],\n             \"waypoints\":[...]\n           }\n  - Remarque : Ces services sont publics et gratuits pour un usage raisonnable ; respecter leurs conditions d'utilisation.\n*\/\n\n\/* ---------- Internationalisation : textes modifiables facilement ---------- *\/\nconst TEXT = {\n  resultat_km_aller: \"Distance aller simple (km)\",\n  resultat_km_total_semaine: \"Km totaux par semaine\",\n  resultat_cout_semaine_solo: \"Co\u00fbt hebdomadaire (voiture solo)\",\n  resultat_cout_semaine_covoit: \"Co\u00fbt hebdomadaire (covoiturage)\",\n  resultat_economie_semaine: \"\u00c9conomie hebdomadaire\",\n  resultat_economie_mensuelle: \"\u00c9conomie mensuelle (est.)\",\n  resultat_economie_annuelle: \"\u00c9conomie annuelle (est.)\",\n  btn_copy_ok: \"R\u00e9sum\u00e9 copi\u00e9 !\",\n  btn_copy_fail: \"Copie impossible\",\n  geo_searching: \"Recherche de distance\u2026\",\n  geo_success: \"Distance estim\u00e9e mise \u00e0 jour\",\n  geo_error: \"Impossible d'obtenir la distance\"\n};\n\n\/* ---------- R\u00e9cup\u00e9ration des \u00e9l\u00e9ments du DOM ---------- *\/\nconst distanceInput = document.getElementById('distance');\nconst tripsInput = document.getElementById('trips');\nconst costSoloInput = document.getElementById('costSolo');\nconst costCarpoolInput = document.getElementById('costCarpool');\nconst calcBtn = document.getElementById('calcBtn');\nconst resetBtn = document.getElementById('resetBtn');\nconst resultContent = document.getElementById('resultContent');\nconst copySummary = document.getElementById('copySummary');\nconst downloadCsv = document.getElementById('downloadCsv');\nconst autoDistanceBtn = document.getElementById('autoDistanceBtn');\nconst addressesPanel = document.getElementById('addresses');\nconst geocodeBtn = document.getElementById('geocodeBtn');\nconst addrFrom = document.getElementById('addrFrom');\nconst addrTo = document.getElementById('addrTo');\nconst geoStatus = document.getElementById('geoStatus');\n\n\/* ---------- Helper : formatage mon\u00e9taire en euros ---------- *\/\nfunction formatEuro(value) {\n  return value.toLocaleString('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 2 });\n}\n\n\/* ---------- Calcul et affichage des r\u00e9sultats ---------- *\/\nfunction calculerEtAfficher() {\n  \/\/ R\u00e9cup\u00e9rer et valider les valeurs\n  const distanceAller = parseFloat(distanceInput.value) || 0; \/\/ km aller simple\n  const allersRetoursParSemaine = Math.max(0, parseInt(tripsInput.value) || 0);\n  const costSolo = Math.max(0, parseFloat(costSoloInput.value) || 0);\n  const costCarpool = Math.max(0, parseFloat(costCarpoolInput.value) || 0);\n\n  \/\/ Calculs :\n  \/\/ km parcourus par semaine = distance aller simple * 2 (aller-retour) * nombre d'allers-retours\n  const kmParSemaine = distanceAller * 2 * allersRetoursParSemaine;\n\n  \/\/ co\u00fbts hebdomadaires\n  const coutHebdoSolo = kmParSemaine * costSolo;\n  const coutHebdoCovoit = kmParSemaine * costCarpool;\n  const econHebdo = Math.max(0, coutHebdoSolo - coutHebdoCovoit);\n\n  \/\/ Conversion vers mensuel et annuel\n  \/\/ On utilise 52 semaines dans l'ann\u00e9e -> mois approximatif = 52\/12 \u2248 4.33333\n  const semainesParAn = 52;\n  const moisParAn = 12;\n  const coefMensuel = semainesParAn \/ moisParAn; \/\/ \u2248 4.3333\n  const econMensuelle = econHebdo * coefMensuel;\n  const econAnnuelle = econHebdo * semainesParAn;\n\n  \/\/ Pr\u00e9parer affichage accessible et clair\n  const nodes = [];\n\n  nodes.push(row(TEXT.resultat_km_aller, distanceAller.toLocaleString('fr-FR', { maximumFractionDigits:1 }) + ' km'));\n  nodes.push(row(TEXT.resultat_km_total_semaine, kmParSemaine.toLocaleString('fr-FR', { maximumFractionDigits:1 }) + ' km'));\n  nodes.push(row(TEXT.resultat_cout_semaine_solo, formatEuro(coutHebdoSolo)));\n  nodes.push(row(TEXT.resultat_cout_semaine_covoit, formatEuro(coutHebdoCovoit)));\n  nodes.push(row(TEXT.resultat_economie_semaine, formatEuro(econHebdo)));\n  nodes.push(row(TEXT.resultat_economie_mensuelle, formatEuro(econMensuelle)));\n  nodes.push(row(TEXT.resultat_economie_annuelle, formatEuro(econAnnuelle)));\n\n  \/\/ Ins\u00e9rer dans le DOM proprement\n  resultContent.innerHTML = '';\n  nodes.forEach(n => resultContent.appendChild(n));\n}\n\n\/* Helper pour cr\u00e9er une ligne de r\u00e9sultat (label + valeur) *\/\nfunction row(label, value) {\n  const wrapper = document.createElement('div');\n  wrapper.className = 'flex flex-col p-2 bg-white\/80 dark:bg-slate-800\/60 rounded border border-slate-100 dark:border-slate-700';\n  const lab = document.createElement('div');\n  lab.className = 'text-sm text-slate-600 dark:text-slate-300';\n  lab.textContent = label;\n  const val = document.createElement('div');\n  val.className = 'text-lg font-medium text-slate-800 dark:text-slate-100';\n  val.textContent = value;\n  wrapper.appendChild(lab);\n  wrapper.appendChild(val);\n  return wrapper;\n}\n\n\/* ---------- \u00c9v\u00e8nements ---------- *\/\ncalcBtn.addEventListener('click', (e) => {\n  e.preventDefault();\n  calculerEtAfficher();\n});\n\nresetBtn.addEventListener('click', (e) => {\n  e.preventDefault();\n  \/\/ Valeurs par d\u00e9faut\n  distanceInput.value = 10;\n  tripsInput.value = 5;\n  costSoloInput.value = 0.60;\n  costCarpoolInput.value = 0.40;\n  resultContent.innerHTML = '';\n});\n\ncopySummary.addEventListener('click', async () => {\n  \/\/ Construire un r\u00e9sum\u00e9 texte en fran\u00e7ais\n  const distanceAller = parseFloat(distanceInput.value) || 0;\n  const allersRetoursParSemaine = Math.max(0, parseInt(tripsInput.value) || 0);\n  const costSolo = Math.max(0, parseFloat(costSoloInput.value) || 0);\n  const costCarpool = Math.max(0, parseFloat(costCarpoolInput.value) || 0);\n  const kmParSemaine = distanceAller * 2 * allersRetoursParSemaine;\n  const coutHebdoSolo = kmParSemaine * costSolo;\n  const coutHebdoCovoit = kmParSemaine * costCarpool;\n  const econHebdo = Math.max(0, coutHebdoSolo - coutHebdoCovoit);\n  const econMensuelle = econHebdo * (52\/12);\n  const econAnnuelle = econHebdo * 52;\n\n  const summary =\n    `Calculateur covoiturage \u2014 Distance aller simple: ${distanceAller} kmn` +\n    `Allers-retours \/ semaine: ${allersRetoursParSemaine}n` +\n    `Co\u00fbt km voiture solo: ${costSolo.toFixed(2)} \u20ac | covoiturage: ${costCarpool.toFixed(2)} \u20acn` +\n    `Km\/semaine: ${kmParSemaine.toFixed(1)} kmn` +\n    `Co\u00fbt hebdo solo: ${coutHebdoSolo.toFixed(2)} \u20ac | covoiturage: ${coutHebdoCovoit.toFixed(2)} \u20acn` +\n    `\u00c9conomie: hebdo ${econHebdo.toFixed(2)} \u20ac, mensuel \u2248 ${econMensuelle.toFixed(2)} \u20ac, annuel \u2248 ${econAnnuelle.toFixed(2)} \u20ac`;\n\n  try {\n    await navigator.clipboard.writeText(summary);\n    copySummary.textContent = TEXT.btn_copy_ok;\n    setTimeout(() => copySummary.textContent = \"Copier le r\u00e9sum\u00e9\", 2000);\n  } catch (err) {\n    copySummary.textContent = TEXT.btn_copy_fail;\n    setTimeout(() => copySummary.textContent = \"Copier le r\u00e9sum\u00e9\", 2000);\n  }\n});\n\ndownloadCsv.addEventListener('click', () => {\n  \/\/ Exporte les donn\u00e9es cl\u00e9s sous forme de CSV simple\n  const distanceAller = parseFloat(distanceInput.value) || 0;\n  const allersRetoursParSemaine = Math.max(0, parseInt(tripsInput.value) || 0);\n  const costSolo = Math.max(0, parseFloat(costSoloInput.value) || 0);\n  const costCarpool = Math.max(0, parseFloat(costCarpoolInput.value) || 0);\n  const kmParSemaine = distanceAller * 2 * allersRetoursParSemaine;\n  const coutHebdoSolo = kmParSemaine * costSolo;\n  const coutHebdoCovoit = kmParSemaine * costCarpool;\n  const econHebdo = Math.max(0, coutHebdoSolo - coutHebdoCovoit);\n  const econMensuelle = econHebdo * (52\/12);\n  const econAnnuelle = econHebdo * 52;\n\n  const rows = [\n    ['Champ', 'Valeur'],\n    ['Distance aller simple (km)', distanceAller],\n    [\"Allers-retours par semaine\", allersRetoursParSemaine],\n    ['Co\u00fbt km voiture solo (\u20ac)', costSolo],\n    ['Co\u00fbt km covoiturage (\u20ac)', costCarpool],\n    ['Km\/semaine', kmParSemaine.toFixed(1)],\n    ['Co\u00fbt hebdo solo (\u20ac)', coutHebdoSolo.toFixed(2)],\n    ['Co\u00fbt hebdo covoiturage (\u20ac)', coutHebdoCovoit.toFixed(2)],\n    ['\u00c9conomie hebdo (\u20ac)', econHebdo.toFixed(2)],\n    ['\u00c9conomie mensuelle (\u20ac)', econMensuelle.toFixed(2)],\n    ['\u00c9conomie annuelle (\u20ac)', econAnnuelle.toFixed(2)],\n  ];\n\n  const csvContent = rows.map(r => r.map(cell => `\"${String(cell).replace(\/\"\/g,'\"\"')}\"`).join(',')).join('n');\n  const blob = new Blob([csvContent], { type: 'text\/csv;charset=utf-8;' });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = 'economies_covoiturage.csv';\n  document.body.appendChild(a);\n  a.click();\n  a.remove();\n  URL.revokeObjectURL(url);\n});\n\n\/* ---------- Option : obtenir distance par adresses (utilise Nominatim + OSRM) ---------- *\/\n\/*\n  APIs utilis\u00e9es (gratuites, sans cl\u00e9) :\n  - Nominatim (OpenStreetMap) : https:\/\/nominatim.openstreetmap.org\n    Exemple de requ\u00eate (GET) pour g\u00e9ocodage :\n      https:\/\/nominatim.openstreetmap.org\/search?q=Fort-de-France%2C+Martinique&format=json&limit=1\n    Retour : tableau JSON avec lat\/lon (voir en haut du script).\n  - OSRM (router.project-osrm.org) : https:\/\/router.project-osrm.org\n    Exemple de requ\u00eate (GET) pour obtenir la distance routi\u00e8re (en m\u00e8tres) :\n      https:\/\/router.project-osrm.org\/route\/v1\/driving\/{lon1},{lat1};{lon2},{lat2}?overview=false\n    Exemple de r\u00e9ponse : objet JSON contenant routes[0].distance (en m\u00e8tres).\n*\/\nautoDistanceBtn.addEventListener('click', () => {\n  \/\/ bascule le panneau d'adresses\n  const isHidden = addressesPanel.classList.contains('hidden');\n  if (isHidden) {\n    addressesPanel.classList.remove('hidden');\n    autoDistanceBtn.textContent = 'Fermer saisie d\u2019adresses';\n  } else {\n    addressesPanel.classList.add('hidden');\n    autoDistanceBtn.textContent = 'Obtenir distance par adresses';\n  }\n});\n\n\/* Fonction asynchrone qui utilise Nominatim pour g\u00e9ocoder une adresse *\/\nasync function geocode(address) {\n  \/\/ Construire URL encod\u00e9e\n  const url = 'https:\/\/nominatim.openstreetmap.org\/search?' + new URLSearchParams({\n    q: address,\n    format: 'json',\n    limit: '1',\n    addressdetails: '0'\n  }).toString();\n\n  \/\/ Appel fetch avec header User-Agent recommand\u00e9 par Nominatim (ici g\u00e9n\u00e9r\u00e9 par navigateur)\n  const res = await fetch(url, {\n    headers: {\n      'Accept-Language': 'fr' \/\/ pr\u00e9f\u00e9rence pour r\u00e9ponses en Fran\u00e7ais\n    }\n  });\n  if (!res.ok) throw new Error('Erreur g\u00e9ocodage');\n  const data = await res.json();\n  if (!Array.isArray(data) || data.length === 0) throw new Error('Adresse introuvable');\n  return {\n    lat: parseFloat(data[0].lat),\n    lon: parseFloat(data[0].lon),\n    display_name: data[0].display_name\n  };\n}\n\n\/* Fonction asynchrone qui utilise OSRM pour obtenir la distance routi\u00e8re en kilom\u00e8tres *\/\nasync function getRouteDistanceKm(from, to) {\n  \/\/ from, to: {lat, lon}\n  const coords = `${from.lon},${from.lat};${to.lon},${to.lat}`;\n  const url = `https:\/\/router.project-osrm.org\/route\/v1\/driving\/${coords}?overview=false`;\n  const res = await fetch(url);\n  if (!res.ok) throw new Error('Erreur routing');\n  const data = await res.json();\n  if (data.code !== 'Ok' || !data.routes || data.routes.length === 0) throw new Error('Itin\u00e9raire introuvable');\n  const meters = data.routes[0].distance;\n  return meters \/ 1000.0; \/\/ convertir en kilom\u00e8tres\n}\n\n\/* \u00c9v\u00e8nement sur le bouton de g\u00e9ocodage *\/\ngeocodeBtn.addEventListener('click', async () => {\n  const fromText = addrFrom.value.trim();\n  const toText = addrTo.value.trim();\n  if (!fromText || !toText) {\n    geoStatus.textContent = 'Veuillez saisir deux adresses.';\n    return;\n  }\n  geoStatus.textContent = TEXT.geo_searching;\n  geocodeBtn.disabled = true;\n\n  try {\n    \/\/ G\u00e9ocodage des deux adresses\n    const [from, to] = await Promise.all([geocode(fromText), geocode(toText)]);\n    \/\/ Obtenir distance routi\u00e8re via OSRM\n    const distanceKm = await getRouteDistanceKm(from, to);\n    \/\/ Mettre \u00e0 jour le champ distance aller simple (arrondi raisonnable)\n    distanceInput.value = Math.max(0, Math.round(distanceKm * 10) \/ 10);\n    geoStatus.textContent = TEXT.geo_success;\n    \/\/ Mettre \u00e0 jour l'affichage des r\u00e9sultats\n    calculerEtAfficher();\n  } catch (err) {\n    console.error(err);\n    geoStatus.textContent = TEXT.geo_error;\n  } finally {\n    geocodeBtn.disabled = false;\n    setTimeout(() => { if (geoStatus.textContent === TEXT.geo_success) geoStatus.textContent = ''; }, 3000);\n  }\n});\n\n\/* Initialiser l'affichage au chargement *\/\ncalculerEtAfficher();\n\n<\/script>\n\n<h2 class=\"wp-block-heading\">Tarifs, \u00e9conomies et comparaison avec taxi, bus et voiture solo<\/h2>\n\n<p class=\"wp-block-paragraph\">\nComparer les options permet de d\u00e9cider rapidement si le <strong>covoiturage<\/strong> est pertinent pour vous. Les tarifs varient selon l\u2019application et la n\u00e9gociation entre conducteur et passager, mais voici des rep\u00e8res utiles en 2026 pour la Martinique.\n<\/p>\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Mode<\/th>\n<th>Co\u00fbt indicatif<\/th>\n<th>Avantage principal<\/th>\n<th>Inconv\u00e9nient principal<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Covoiturage (appli locale)<\/td>\n<td><strong>0,40 \u20ac\/km<\/strong> (moyenne)<\/td>\n<td>Moins cher, convivial<\/td>\n<td>Disponibilit\u00e9 variable<\/td>\n<\/tr>\n<tr>\n<td>Voiture solo (co\u00fbt r\u00e9el)<\/td>\n<td>~<strong>0,60\u20130,80 \u20ac\/km<\/strong> (carburant + usure)<\/td>\n<td>Flexibilit\u00e9 maximale<\/td>\n<td>Co\u00fbteux, \u00e9missions \u00e9lev\u00e9es<\/td>\n<\/tr>\n<tr>\n<td>Taxi<\/td>\n<td>Prise en charge + tarif km (ex. 15\u201325 \u20ac base + 1.50\u20132.00 \u20ac\/km)<\/td>\n<td>Disponible 24\/7<\/td>\n<td>Co\u00fbt souvent \u00e9lev\u00e9 pour trajets r\u00e9guliers<\/td>\n<\/tr>\n<tr>\n<td>Bus \/ TC<\/td>\n<td>Forfait faible, mais service parfois limit\u00e9<\/td>\n<td>\u00c9conomique et \u00e9cologique<\/td>\n<td>Horaires et itin\u00e9raires contraignants<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n<p class=\"wp-block-paragraph\">\nPour suivre l\u2019\u00e9volution des prix du carburant et mieux calculer vos \u00e9conomies, consultez les analyses locales sur le prix de l\u2019essence en Martinique. <a href=\"https:\/\/www.transports-express-caraibes.fr\/blog\/prix-essence-martinique-2026\/\">Estimation des prix du carburant en 2026<\/a> donne un rep\u00e8re pour vos calculs.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nInsight : pour des trajets r\u00e9guliers domicile-travail, le covoiturage r\u00e9duit sensiblement le budget mobilit\u00e9 et la <strong>r\u00e9duction des co\u00fbts<\/strong> est rapide d\u00e8s le premier mois.\n<\/p>\n\n<h2 class=\"wp-block-heading\">S\u00e9curit\u00e9, bonnes pratiques et erreurs fr\u00e9quentes \u00e0 \u00e9viter<\/h2>\n\n<p class=\"wp-block-paragraph\">\nLa s\u00e9curit\u00e9 repose sur des r\u00e8gles simples et des v\u00e9rifications. Les applications qui fonctionnent en temps r\u00e9el affichent coordonn\u00e9es et \u00e9valuations des utilisateurs : c\u2019est un atout majeur pour voyager plus serein.\n<\/p>\n\n<ul class=\"wp-block-list\"><li>V\u00e9rifiez l\u2019identit\u00e9 et les avis du conducteur avant d\u2019accepter.<\/li><li>Privil\u00e9giez les lieux publics pour le point de rencontre (parkings \u00e9clair\u00e9s, gares routi\u00e8res).<\/li><li>Partagez votre trajet en temps r\u00e9el avec un proche via le smartphone.<\/li><li>Fixez le prix et le mode de paiement avant de monter \u00e0 bord.<\/li><li>Signalez toute anomalie \u00e0 l\u2019application : captures d\u2019\u00e9cran et \u00e9changes \u00e9crits aident en cas de litige.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">\nPour une checklist approfondie de s\u00e9curit\u00e9 sur longs trajets, des guides pratiques sont disponibles en ligne, y compris des conseils d\u00e9di\u00e9s au covoiturage longue distance. <a href=\"https:\/\/www.transports-express-caraibes.fr\/blog\/securite-covoiturage-longue-distance\/\">Checklist s\u00e9curit\u00e9 pour covoiturage longue distance<\/a>\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nInsight : la prudence r\u00e9duit les incidents et transforme le covoiturage en transport alternatif fiable.\n<\/p>\n\n<h2 class=\"wp-block-heading\">Variantes selon votre profil : salari\u00e9, \u00e9tudiant, vacancier<\/h2>\n\n<p class=\"wp-block-paragraph\">\nLe covoiturage ne s\u2019adresse pas qu\u2019aux pendulaires. Voici des usages concrets selon le profil.\n<\/p>\n\n<ul class=\"wp-block-list\"><li><strong>Salari\u00e9 :<\/strong> trajets r\u00e9guliers domicile-travail, partage des frais via titre mobilit\u00e9 en entreprise pour r\u00e9duire la facture.<\/li><li><strong>\u00c9tudiant :<\/strong> trajets vers les campus, partage ponctuel pour \u00e9v\u00e9nements ou sorties, co\u00fbt divis\u00e9 entre plusieurs passagers.<\/li><li><strong>Vacancier \/ week-end :<\/strong> trajet collaboratif pour acc\u00e9der aux plages et sites hors des heures des transports publics.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">\nExemple illustratif : Sandra (conductrice) propose un trajet de Schoelcher \u00e0 Fort-de-France deux fois par semaine. Richard, passager, r\u00e9serve r\u00e9guli\u00e8rement. Chacun y trouve son compte : <strong>\u00e9conomie<\/strong>, moins d\u2019empreinte carbone, et r\u00e9seau social \u00e9largi.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nInsight : adaptez la fr\u00e9quence et l\u2019horaire \u00e0 votre profil pour maximiser gains financiers et pratiques.\n<\/p>\n\n<h2 class=\"wp-block-heading\">Passez au covoiturage : premiers pas et ressources utiles<\/h2>\n\n<p class=\"wp-block-paragraph\">\nPour d\u00e9marrer tout de suite, t\u00e9l\u00e9chargez l\u2019application, cr\u00e9ez un profil complet et testez un trajet court. Les applis locales ou r\u00e9gionales se multiplient : certaines sont inspir\u00e9es des grandes plateformes nationales mais adapt\u00e9es au terrain antillais.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nT\u00e9l\u00e9chargements et pages utiles :\n<\/p>\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/nou-la.com\/\" target=\"_blank\" rel=\"noopener\">Page officielle de NouLa<\/a> \u2014 pr\u00e9sentation et zones couvertes.<\/li><li><a href=\"https:\/\/rci.fm\/martinique\/infos\/Informations-pratiques\/Noula-une-application-de-covoiturage-en-Martinique\" target=\"_blank\" rel=\"noopener\">Article RCI Martinique<\/a> \u2014 reportage sur le lancement et les premi\u00e8res semaines d\u2019usage.<\/li><li><a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.depoze.carpool&amp;hl=fr\" target=\"_blank\" rel=\"noopener\">Version Android d\u2019une appli locale (Play Store)<\/a> et <a href=\"https:\/\/apkpure.com\/fr\/d%C3%A9poz%C3%A9\/com.depoze.carpool\" target=\"_blank\" rel=\"noopener\">APK alternatif<\/a> pour les utilisateurs qui doivent installer hors store.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">\nInsight : essayez un aller simple gratuit ou \u00e0 faible co\u00fbt pour juger de la fiabilit\u00e9 et du gain r\u00e9el.\n<\/p>\n\n<h2 class=\"wp-block-heading\">Ressources compl\u00e9mentaires et contexte local<\/h2>\n\n<p class=\"wp-block-paragraph\">\nLe gouvernement a lanc\u00e9 des mesures pour encourager le covoiturage, comme des aides en entreprise (titre mobilit\u00e9) et des campagnes locales. Les m\u00e9dias et plateformes sp\u00e9cialis\u00e9es recensent les initiatives : pour comprendre l\u2019organisation des transports et alternatives en Martinique, consulter les articles locaux et les analyses de mobilit\u00e9.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nPour approfondir l\u2019organisation des transports et les alternatives \u00e0 la voiture individuelle en Martinique, voir les analyses locales et guides pratiques disponibles en ligne, notamment sur les impacts du prix du carburant et les solutions de transport public.\n<\/p>\n\n<p class=\"wp-block-paragraph\">\nInsight : le covoiturage gagne en visibilit\u00e9 gr\u00e2ce \u00e0 des aides publiques et \u00e0 l\u2019int\u00e9r\u00eat croissant des usagers.\n<\/p>\n\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Lu2019application de covoiturage est-elle vraiment gratuite pour les utilisateurs ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"La plupart des applications sont gratuites u00e0 tu00e9lu00e9charger. Le passager paie une part des frais du trajet (ex. 0,40 u20ac\/km), qui sert u00e0 compenser le conducteur. Certaines plateformes peuvent appliquer une commission sur la ru00e9servation; vu00e9rifiez les conditions de lu2019application choisie.\"}},{\"@type\":\"Question\",\"name\":\"Que faire si le conducteur ne respecte pas lu2019horaire ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Contactez le conducteur via lu2019application, signalez le retard et annulez si nu00e9cessaire selon les ru00e8gles de la plateforme. Conservez les u00e9changes u00e9crits et, si besoin, contactez le support de lu2019application pour obtenir une mu00e9diation.\"}},{\"@type\":\"Question\",\"name\":\"Le covoiturage est-il su00fbr la nuit ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"La su00e9curitu00e9 du00e9pend de la plateforme et des pru00e9cautions prises. Privilu00e9giez les points de rendez-vous publics et bien u00e9clairu00e9s, vu00e9rifiez les profils et avis, et partagez votre trajet en direct avec un proche. Pour des trajets tardifs, pru00e9fu00e9rer un taxi si la disponibilitu00e9 de conducteurs est incertaine.\"}},{\"@type\":\"Question\",\"name\":\"Comment calculer pru00e9cisu00e9ment mes u00e9conomies mensuelles ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Multipliez la distance aller-retour par le nombre de jours travaillu00e9s puis comparez le cou00fbt en covoiturage (ex. 0,40 u20ac\/km) versus le cou00fbt ru00e9el en voiture (carburant + entretien, souvent 0,60u20130,80 u20ac\/km). Utilisez le calculateur intu00e9gru00e9 plus haut pour un ru00e9sultat immu00e9diat.\"}}]}\n<\/script>\n<h3>L\u2019application de covoiturage est-elle vraiment gratuite pour les utilisateurs ?<\/h3>\n<p>La plupart des applications sont gratuites \u00e0 t\u00e9l\u00e9charger. Le passager paie une part des frais du trajet (ex. 0,40 \u20ac\/km), qui sert \u00e0 compenser le conducteur. Certaines plateformes peuvent appliquer une commission sur la r\u00e9servation; v\u00e9rifiez les conditions de l\u2019application choisie.<\/p>\n<h3>Que faire si le conducteur ne respecte pas l\u2019horaire ?<\/h3>\n<p>Contactez le conducteur via l\u2019application, signalez le retard et annulez si n\u00e9cessaire selon les r\u00e8gles de la plateforme. Conservez les \u00e9changes \u00e9crits et, si besoin, contactez le support de l\u2019application pour obtenir une m\u00e9diation.<\/p>\n<h3>Le covoiturage est-il s\u00fbr la nuit ?<\/h3>\n<p>La s\u00e9curit\u00e9 d\u00e9pend de la plateforme et des pr\u00e9cautions prises. Privil\u00e9giez les points de rendez-vous publics et bien \u00e9clair\u00e9s, v\u00e9rifiez les profils et avis, et partagez votre trajet en direct avec un proche. Pour des trajets tardifs, pr\u00e9f\u00e9rer un taxi si la disponibilit\u00e9 de conducteurs est incertaine.<\/p>\n<h3>Comment calculer pr\u00e9cis\u00e9ment mes \u00e9conomies mensuelles ?<\/h3>\n<p>Multipliez la distance aller-retour par le nombre de jours travaill\u00e9s puis comparez le co\u00fbt en covoiturage (ex. 0,40 \u20ac\/km) versus le co\u00fbt r\u00e9el en voiture (carburant + entretien, souvent 0,60\u20130,80 \u20ac\/km). Utilisez le calculateur int\u00e9gr\u00e9 plus haut pour un r\u00e9sultat imm\u00e9diat.<\/p>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@tailwindcss\/browser@4\"><\/script>\n\n<!--\nCalculateur de covoiturage (HTML + JS)\n- \u00c0 coller directement dans votre page existante (sans <head> ni <body> complets).\n- Hauteur du composant ma\u00eetris\u00e9e (<= 2000px).\n\nAPI publique utilis\u00e9e (gratuite):\n- Nominatim (OpenStreetMap) pour g\u00e9ocoder adresses -> coordonn\u00e9es\n  URL: https:\/\/nominatim.openstreetmap.org\/search?format=json&q=VOTRE_REQUETE\n  Exemple de r\u00e9ponse JSON (liste de r\u00e9sultats):\n  [\n    {\n      \"place_id\": \"123456\",\n      \"licence\": \"Data  OpenStreetMap contributors\",\n      \"osm_type\": \"node\",\n      \"osm_id\": \"654321\",\n      \"boundingbox\": [\"14.6000\",\"14.7000\",\"-61.1000\",\"-61.0000\"],\n      \"lat\": \"14.6167\",\n      \"lon\": \"-61.0000\",\n      \"display_name\": \"Fort-de-France, Martinique, France\",\n      \"class\": \"place\",\n      \"type\": \"city\",\n      \"importance\": 0.7\n    }\n  ]\n  Remarques: service public, sans cl\u00e9 (usage limit\u00e9, respectez la politique d'utilisation).\n-->\n\n<div id=\"covoiturage-calculator\" class=\"max-w-3xl mx-auto p-4 bg-white rounded-lg shadow-md text-gray-900\" style=\"max-height:1800px; overflow:auto;\">\n  <!-- Texte \u00e9ditable facilement -->\n  <script>\n    \/\/ Textes en fran\u00e7ais - modifiables\n    const TEXT = {\n      titre: \"Simulateur de covoiturage \u2014 Martinique\",\n      description: \"Estimez en quelques secondes l'\u00e9conomie mensuelle approximative en passant du trajet solo au covoiturage.\",\n      modeDistance: \"Mode de distance\",\n      modeManual: \"Distance manuelle (km)\",\n      modeAdresses: \"Calculer depuis adresses (g\u00e9ocodage)\",\n      origine: \"Adresse de d\u00e9part (ex. Fort-de-France)\",\n      destination: \"Adresse d'arriv\u00e9e (ex. Le Lamentin)\",\n      distanceLabel: \"Distance aller simple (km)\",\n      joursLabel: \"Jours par semaine\",\n      coutSoloLabel: \"Co\u00fbt voiture solo (\u20ac\/km)\",\n      coutCovoitLabel: \"Co\u00fbt covoiturage (\u20ac\/km)\",\n      calculer: \"Calculer l'\u00e9conomie\",\n      reinitialiser: \"R\u00e9initialiser\",\n      heuristique: \"Km par mois (distance x 2 x jours\/semaine x 4)\",\n      resultatTitre: \"R\u00e9sultat : \u00e9conomie mensuelle approximative\",\n      aucunResultat: \"Aucun r\u00e9sultat \u2014 v\u00e9rifiez vos entr\u00e9es.\",\n      copie: \"Copier le r\u00e9sum\u00e9\",\n      distanceCalcul\u00e9e: \"Distance calcul\u00e9e (aller simple)\",\n      precision: \"Calcul approximatif \u2014 n'inclut pas p\u00e9ages, stationnement, ou variations ponctuelles.\",\n      aideGeo: \"Le g\u00e9ocodage utilise Nominatim (OpenStreetMap).\"\n    };\n  <\/script>\n\n  <h2 class=\"text-2xl font-bold mb-2\" id=\"titre-simulateur\" tabindex=\"0\"><\/h2>\n  <p class=\"text-sm text-gray-600 mb-4\" id=\"desc-simulateur\"><\/p>\n\n  <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n    <fieldset class=\"border rounded p-3\" aria-labelledby=\"modeLegende\">\n      <legend id=\"modeLegende\" class=\"font-semibold mb-2\">Mode de calcul<\/legend>\n      <div class=\"flex items-center gap-3\">\n        <label class=\"inline-flex items-center\">\n          <input type=\"radio\" name=\"mode\" value=\"manual\" checked class=\"mr-2\" id=\"mode-manual\" \/>\n          <span id=\"label-mode-manual\"><\/span>\n        <\/label>\n        <label class=\"inline-flex items-center\">\n          <input type=\"radio\" name=\"mode\" value=\"geocode\" class=\"mr-2\" id=\"mode-geocode\" \/>\n          <span id=\"label-mode-geocode\"><\/span>\n        <\/label>\n      <\/div>\n    <\/fieldset>\n\n    <div class=\"border rounded p-3\" aria-live=\"polite\" aria-atomic=\"true\">\n      <label for=\"jours\" class=\"block font-medium mb-1\" id=\"label-jours\"><\/label>\n      <input id=\"jours\" type=\"number\" inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"5\" class=\"w-full border rounded px-2 py-1\" \/>\n      <small class=\"text-gray-500\">Nombre de journ\u00e9es\/semaine d\u00e9di\u00e9es au trajet<\/small>\n    <\/div>\n\n    <div class=\"border rounded p-3\">\n      <label for=\"cout-solo\" class=\"block font-medium mb-1\" id=\"label-cout-solo\"><\/label>\n      <input id=\"cout-solo\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"0.01\" value=\"0.70\" class=\"w-full border rounded px-2 py-1\" \/>\n      <small class=\"text-gray-500\">Exemple : 0.70 \u20ac\/km<\/small>\n    <\/div>\n\n    <div class=\"border rounded p-3\">\n      <label for=\"cout-covoit\" class=\"block font-medium mb-1\" id=\"label-cout-covoit\"><\/label>\n      <input id=\"cout-covoit\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"0.01\" value=\"0.40\" class=\"w-full border rounded px-2 py-1\" \/>\n      <small class=\"text-gray-500\">Exemple : 0.40 \u20ac\/km<\/small>\n    <\/div>\n\n    <!-- Mode manuel: distance -->\n    <div id=\"panel-manual\" class=\"border rounded p-3\">\n      <label for=\"distance\" class=\"block font-medium mb-1\" id=\"label-distance\"><\/label>\n      <input id=\"distance\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"0.01\" value=\"10\" class=\"w-full border rounded px-2 py-1\" \/>\n      <small class=\"text-gray-500\">Aller simple en kilom\u00e8tres<\/small>\n    <\/div>\n\n    <!-- Mode g\u00e9ocodage: adresses -->\n    <div id=\"panel-geocode\" class=\"hidden border rounded p-3\">\n      <label for=\"origine\" class=\"block font-medium mb-1\" id=\"label-origine\"><\/label>\n      <input id=\"origine\" type=\"text\" class=\"w-full border rounded px-2 py-1 mb-2\" placeholder=\"Ex. Fort-de-France\" \/>\n\n      <label for=\"destination\" class=\"block font-medium mb-1\" id=\"label-destination\"><\/label>\n      <input id=\"destination\" type=\"text\" class=\"w-full border rounded px-2 py-1 mb-2\" placeholder=\"Ex. Le Lamentin\" \/>\n\n      <button id=\"calc-distance-geo\" class=\"w-full bg-blue-600 text-white rounded py-2 mt-1 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-300\">Calculer la distance (g\u00e9ocodage)<\/button>\n      <small class=\"text-gray-500 block mt-2\" id=\"aide-geo\"><\/small>\n    <\/div>\n  <\/div>\n\n  <div class=\"mt-4 flex gap-3\">\n    <button id=\"btn-calc\" class=\"bg-green-600 text-white px-4 py-2 rounded hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-green-300\" aria-describedby=\"calcul-desc\"><\/button>\n    <button id=\"btn-reset\" class=\"bg-gray-200 text-gray-800 px-4 py-2 rounded hover:bg-gray-300 focus:outline-none\">R\u00e9initialiser<\/button>\n    <button id=\"btn-copy\" class=\"ml-auto bg-indigo-600 text-white px-3 py-2 rounded hover:bg-indigo-700 focus:outline-none\">Copier le r\u00e9sum\u00e9<\/button>\n  <\/div>\n  <p class=\"text-xs text-gray-500 mt-2\" id=\"calcul-desc\"><\/p>\n\n  <div class=\"mt-4 border rounded p-3 bg-gray-50\" aria-live=\"polite\" aria-atomic=\"true\">\n    <h3 class=\"font-semibold mb-2\" id=\"titre-result\"><\/h3>\n    <div id=\"result-area\" class=\"text-sm text-gray-800\">\n      <!-- Les r\u00e9sultats seront inject\u00e9s ici -->\n    <\/div>\n    <div class=\"mt-3\">\n      <div class=\"h-4 bg-gray-200 rounded overflow-hidden\" aria-hidden=\"true\">\n        <div id=\"bar-solo\" class=\"h-full bg-red-400 transition-all\" style=\"width:0%\"><\/div>\n        <div id=\"bar-covoit\" class=\"h-full bg-green-400 transition-all absolute\" style=\"width:0%\"><\/div>\n      <\/div>\n      <small class=\"text-gray-500 block mt-2\" id=\"precision-text\"><\/small>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n\/*\n  Script principal (document\u00e9)\n  - Respecte contrainte: JS lisible, comment\u00e9.\n  - Internationalisation: toutes les cha\u00eenes en fran\u00e7ais via l'objet TEXT.\n  - Utilise Nominatim (OpenStreetMap) pour g\u00e9ocodage si besoin (gratuit).\n  - Calcule: km\/mois = distance_aller * 2 * jours_par_semaine * 4\n  - Calcule co\u00fbts et \u00e9conomies.\n*\/\n\n(function () {\n  \/\/ R\u00e9cup\u00e9ration des \u00e9l\u00e9ments\n  const el = id => document.getElementById(id);\n\n  \/\/ Injecter textes (i18n simple)\n  el('titre-simulateur').textContent = TEXT.titre;\n  el('desc-simulateur').textContent = TEXT.description;\n  el('label-mode-manual').textContent = TEXT.modeManual;\n  el('label-mode-geocode').textContent = TEXT.modeAdresses;\n  el('label-jours').textContent = TEXT.joursLabel;\n  el('label-cout-solo').textContent = TEXT.coutSoloLabel;\n  el('label-cout-covoit').textContent = TEXT.coutCovoitLabel;\n  el('label-distance').textContent = TEXT.distanceLabel;\n  el('label-origine').textContent = TEXT.origine;\n  el('label-destination').textContent = TEXT.destination;\n  el('btn-calc').textContent = TEXT.calculer;\n  el('btn-reset').textContent = TEXT.reinitialiser;\n  el('titre-result').textContent = TEXT.resultatTitre;\n  el('aide-geo').textContent = TEXT.aideGeo;\n  el('precision-text').textContent = TEXT.precision;\n  el('calcul-desc').textContent = TEXT.heuristique;\n\n  \/\/ Inputs\n  const modeRadios = document.querySelectorAll('input[name=\"mode\"]');\n  const panelManual = el('panel-manual');\n  const panelGeo = el('panel-geocode');\n\n  \/\/ Bars\n  const barSolo = el('bar-solo');\n  const barCovoit = el('bar-covoit');\n\n  \/\/ Utility: show\/hide panels selon mode\n  function updateMode() {\n    const mode = document.querySelector('input[name=\"mode\"]:checked').value;\n    if (mode === 'manual') {\n      panelManual.classList.remove('hidden');\n      panelGeo.classList.add('hidden');\n    } else {\n      panelManual.classList.add('hidden');\n      panelGeo.classList.remove('hidden');\n    }\n  }\n  modeRadios.forEach(r => r.addEventListener('change', updateMode));\n  updateMode();\n\n  \/\/ Haversine pour distance (km) entre deux coordonn\u00e9es\n  function haversineKm(lat1, lon1, lat2, lon2) {\n    const toRad = v => v * Math.PI \/ 180;\n    const R = 6371; \/\/ rayon Terre en km\n    const dLat = toRad(lat2 - lat1);\n    const dLon = toRad(lon2 - lon1);\n    const a = Math.sin(dLat\/2) * Math.sin(dLat\/2) +\n              Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *\n              Math.sin(dLon\/2) * Math.sin(dLon\/2);\n    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n    return R * c;\n  }\n\n  \/\/ Fonction: g\u00e9ocoder une adresse via Nominatim (OpenStreetMap)\n  \/\/ API: https:\/\/nominatim.openstreetmap.org\/search?format=json&q=VOTRE_REQUETE\n  \/\/ R\u00e9ponse: tableau JSON (voir commentaire en haut)\n  async function geocode(query) {\n    const url = 'https:\/\/nominatim.openstreetmap.org\/search?format=json&q=' + encodeURIComponent(query);\n    \/\/ NB: Nominatim impose un usage responsable. Pas de cl\u00e9 requise.\n    const resp = await fetch(url, { headers: { 'Accept-Language': 'fr' } });\n    if (!resp.ok) throw new Error('Erreur r\u00e9seau lors du g\u00e9ocodage');\n    const json = await resp.json();\n    if (!Array.isArray(json) || json.length === 0) throw new Error('Aucun r\u00e9sultat de g\u00e9ocodage pour: ' + query);\n    \/\/ Prendre le premier r\u00e9sultat\n    const top = json[0];\n    return { lat: parseFloat(top.lat), lon: parseFloat(top.lon), display_name: top.display_name };\n  }\n\n  \/\/ Calcul principal\n  function calculerEconomies(distanceKm, joursParSemaine, coutSolo, coutCovoit) {\n    \/\/ Validation minimale\n    distanceKm = Number(distanceKm);\n    joursParSemaine = Number(joursParSemaine);\n    coutSolo = Number(coutSolo);\n    coutCovoit = Number(coutCovoit);\n\n    if ([distanceKm, joursParSemaine, coutSolo, coutCovoit].some(v => !isFinite(v) || v < 0)) {\n      throw new Error('Entr\u00e9es invalides, v\u00e9rifiez les valeurs num\u00e9riques.');\n    }\n\n    const kmParMois = distanceKm * 2 * joursParSemaine * 4; \/\/ approximation (4 semaines\/mois)\n    const coutMensuelSolo = kmParMois * coutSolo;\n    const coutMensuelCovoit = kmParMois * coutCovoit;\n    const economie = coutMensuelSolo - coutMensuelCovoit;\n\n    return {\n      kmParMois: round(kmParMois, 2),\n      coutMensuelSolo: round(coutMensuelSolo, 2),\n      coutMensuelCovoit: round(coutMensuelCovoit, 2),\n      economie: round(economie, 2)\n    };\n  }\n\n  function round(v, n=2) {\n    const p = Math.pow(10, n);\n    return Math.round(v * p) \/ p;\n  }\n\n  \/\/ Affichage des r\u00e9sultats\n  function afficherResultats(distanceKm, jours, coutSolo, coutCovoit, calc) {\n    const area = el('result-area');\n    area.innerHTML = `\n      <div><strong>${TEXT.distanceCalcul\u00e9e} :<\/strong> ${distanceKm} km<\/div>\n      <div><strong>${TEXT.heuristique} :<\/strong> ${calc.kmParMois} km\/mois<\/div>\n      <div><strong>Co\u00fbt mensuel (voiture solo) :<\/strong> ${calc.coutMensuelSolo} \u20ac<\/div>\n      <div><strong>Co\u00fbt mensuel (covoiturage) :<\/strong> ${calc.coutMensuelCovoit} \u20ac<\/div>\n      <div class=\"mt-2 font-semibold text-lg\">${TEXT.resultatTitre} : ${calc.economie} \u20ac<\/div>\n    `;\n\n    \/\/ Mise \u00e0 jour des barres proportionnelles (visualisation simple)\n    \/\/ On normalise sur la somme pour \u00e9viter overflow; si costs sont 0, on met 0%\n    const total = calc.coutMensuelSolo + calc.coutMensuelCovoit || 1;\n    const pctSolo = Math.max(0, Math.min(100, (calc.coutMensuelSolo \/ total) * 100));\n    const pctCovoit = Math.max(0, Math.min(100, (calc.coutMensuelCovoit \/ total) * 100));\n    barSolo.style.width = pctSolo + '%';\n    barCovoit.style.width = pctCovoit + '%';\n    barSolo.setAttribute('aria-label', 'Proportion co\u00fbt voiture solo');\n    barCovoit.setAttribute('aria-label', 'Proportion co\u00fbt covoiturage');\n  }\n\n  \/\/ \u00c9v\u00e9nements boutons\n  el('btn-calc').addEventListener('click', async function () {\n    const mode = document.querySelector('input[name=\"mode\"]:checked').value;\n    const jours = el('jours').value || 0;\n    const coutSolo = el('cout-solo').value || 0;\n    const coutCovoit = el('cout-covoit').value || 0;\n\n    try {\n      let distanceKm;\n      if (mode === 'manual') {\n        distanceKm = Number(el('distance').value);\n        if (!isFinite(distanceKm)) throw new Error('Distance invalide');\n      } else {\n        \/\/ mode geocode: g\u00e9ocodage des deux adresses, puis Haversine\n        const origineVal = el('origine').value.trim();\n        const destinationVal = el('destination').value.trim();\n        if (!origineVal || !destinationVal) throw new Error('Veuillez renseigner origine et destination.');\n        \/\/ Indiquer \u00e0 l'utilisateur qu'on travaille\n        el('result-area').textContent = 'G\u00e9ocodage en cours...';\n        const o = await geocode(origineVal);\n        const d = await geocode(destinationVal);\n        distanceKm = round(haversineKm(o.lat, o.lon, d.lat, d.lon), 2);\n      }\n\n      const calc = calculerEconomies(distanceKm, jours, coutSolo, coutCovoit);\n      afficherResultats(distanceKm, jours, coutSolo, coutCovoit, calc);\n    } catch (err) {\n      el('result-area').innerHTML = `<div class=\"text-red-600 font-medium\">${TEXT.aucunResultat} ${err.message ? '- ' + err.message : ''}<\/div>`;\n    }\n  });\n\n  el('btn-reset').addEventListener('click', function () {\n    \/\/ Valeurs par d\u00e9faut r\u00e9initialis\u00e9es\n    el('jours').value = 5;\n    el('cout-solo').value = 0.70;\n    el('cout-covoit').value = 0.40;\n    el('distance').value = 10;\n    el('origine').value = '';\n    el('destination').value = '';\n    el('result-area').innerHTML = '';\n    barSolo.style.width = '0%';\n    barCovoit.style.width = '0%';\n  });\n\n  \/\/ Bouton de g\u00e9ocodage rapide (d\u00e9clenche le calcul de distance)\n  el('calc-distance-geo').addEventListener('click', async function () {\n    \/\/ Trace simple pour l'utilisateur: on r\u00e9cup\u00e8re et calcule distance puis \u00e9crire dans le champ distance\n    try {\n      const origineVal = el('origine').value.trim();\n      const destinationVal = el('destination').value.trim();\n      if (!origineVal || !destinationVal) throw new Error('Veuillez renseigner origine et destination.');\n      el('result-area').textContent = 'G\u00e9ocodage en cours...';\n      const o = await geocode(origineVal);\n      const d = await geocode(destinationVal);\n      const distanceKm = round(haversineKm(o.lat, o.lon, d.lat, d.lon), 2);\n      \/\/ Afficher distance et garder le mode geocode actif ; montrer distance dans l'UI\n      el('result-area').innerHTML = `<div><strong>${TEXT.distanceCalcul\u00e9e} :<\/strong> ${distanceKm} km<\/div>`;\n      \/\/ Optionnel: mettre la distance calcul\u00e9e dans le champ manuel pour r\u00e9f\u00e9rence\n      el('distance').value = distanceKm;\n    } catch (err) {\n      el('result-area').innerHTML = `<div class=\"text-red-600 font-medium\">Erreur g\u00e9ocodage: ${err.message}<\/div>`;\n    }\n  });\n\n  \/\/ Copier r\u00e9sum\u00e9\n  el('btn-copy').addEventListener('click', function () {\n    const txt = el('result-area').innerText;\n    if (!txt) return;\n    navigator.clipboard?.writeText(txt).then(() => {\n      \/\/ Simple feedback visuel\n      el('btn-copy').textContent = 'Copi\u00e9 !';\n      setTimeout(() => { el('btn-copy').textContent = TEXT.copie; }, 1500);\n    }).catch(() => {\n      alert('Impossible de copier automatiquement. S\u00e9lectionnez et copiez manuellement.');\n    });\n  });\n\n  \/\/ Initial button copy label\n  el('btn-copy').textContent = TEXT.copie;\n\n  \/\/ Accessibilit\u00e9: focus style improvements (tailwind fournit d\u00e9j\u00e0)\n  \/\/ Fin IIFE\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Covoiturage en Martinique : d\u00e9couvrez l\u2019application gratuite pour faciliter vos trajets La circulation en Martinique peut vite peser sur le porte-monnaie et sur l\u2019environnement. Entre files le matin, transports publics parfois rares et prix du carburant volatils, beaucoup cherchent une alternative pratique et \u00e9conomique pour leurs trajets quotidiens. Cet article explique concr\u00e8tement comment utiliser une &#8230; <a title=\"Covoiturage en Martinique : d\u00e9couvrez l\u2019application gratuite pour faciliter vos trajets\" class=\"read-more\" href=\"https:\/\/www.transports-express-caraibes.fr\/blog\/covoiturage-martinique-app\/\" aria-label=\"En savoir plus sur Covoiturage en Martinique : d\u00e9couvrez l\u2019application gratuite pour faciliter vos trajets\">Lire plus<\/a><\/p>\n","protected":false},"author":3,"featured_media":23638,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[82],"tags":[],"class_list":["post-23639","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-transport"],"views":1,"_links":{"self":[{"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/posts\/23639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/comments?post=23639"}],"version-history":[{"count":0,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/posts\/23639\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/media\/23638"}],"wp:attachment":[{"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/media?parent=23639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/categories?post=23639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/tags?post=23639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}