{"id":23527,"date":"2026-04-26T06:35:12","date_gmt":"2026-04-26T06:35:12","guid":{"rendered":"https:\/\/www.transports-express-caraibes.fr\/blog\/lire-plan-transport-commun\/"},"modified":"2026-04-26T06:35:12","modified_gmt":"2026-04-26T06:35:12","slug":"lire-plan-transport-commun","status":"publish","type":"post","link":"https:\/\/www.transports-express-caraibes.fr\/blog\/lire-plan-transport-commun\/","title":{"rendered":"Comment lire un plan de transport en commun facilement"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>En bref :<\/strong><\/p>\n\n<ul class=\"wp-block-list\"><li><strong>Rep\u00e8res visuels<\/strong> : couleurs, symboles et l\u00e9gendes pour identifier une ligne ou une correspondance.<\/li><li><strong>Plan papier vs appli<\/strong> : quand privil\u00e9gier la carte de m\u00e9tro et quand utiliser une appli pour l\u2019itin\u00e9raire.<\/li><li><strong>Contr\u00f4les rapides<\/strong> : v\u00e9rifier la station de bus, les horaires et les interruptions avant de partir.<\/li><li><strong>Astuce terrain<\/strong> : localiser la sortie la plus proche et m\u00e9moriser un point de rep\u00e8re en cas de d\u00e9tours.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\"><strong>Lire un plan de transport<\/strong> peut sembler intimidant la premi\u00e8re fois, surtout dans une grande agglom\u00e9ration ou en voyage. Ce texte explique concr\u00e8tement comment d\u00e9chiffrer une <strong>carte de m\u00e9tro<\/strong> ou un plan de bus, choisir le bon <strong>itin\u00e9raire<\/strong> et s&rsquo;orienter rapidement en gare ou \u00e0 l&rsquo;arr\u00eat. Vous trouverez des rep\u00e8res visuels, une m\u00e9thode pas \u00e0 pas pour planifier vos trajets sur papier et sur application, des erreurs fr\u00e9quentes \u00e0 \u00e9viter, ainsi que des conseils adapt\u00e9s aux touristes, aux navetteurs et aux personnes \u00e0 mobilit\u00e9 r\u00e9duite. Des exemples chiffr\u00e9s (dur\u00e9es, fr\u00e9quences, proc\u00e9dures) accompagnent chaque conseil pour que vous sachiez exactement ce qu&rsquo;il faut faire sur le terrain. Le ton est pragmatique, avec un brin d&rsquo;humour, pour que l&rsquo;apprentissage reste vivant et utilisable d\u00e8s le prochain d\u00e9placement. \u00c0 la fin, un tableau r\u00e9capitulatif et un petit test pratique vous permettront de v\u00e9rifier que la lecture du plan n&rsquo;est plus un myst\u00e8re. Pr\u00eat pour gagner du temps et voyager plus sereinement ?<\/p>\n\n<h2 class=\"wp-block-heading\">Rep\u00e8res essentiels pour comprendre un plan de transport<\/h2>\n\n<p class=\"wp-block-paragraph\">Commencez par la l\u00e9gende : c&rsquo;est la cl\u00e9 pour <strong>lire un plan<\/strong>. Elle indique ce que signifient les couleurs, les symboles des correspondances et les ic\u00f4nes pour les services (ascenseurs, guichets, v\u00e9los).<\/p>\n\n<p class=\"wp-block-paragraph\">Sur tout plan, identifiez ces \u00e9l\u00e9ments en priorit\u00e9 : le sens de lecture, la position des sorties, les zones tarifaires si pr\u00e9sentes et la repr\u00e9sentation des lignes (m\u00e9tro, bus, tramway, RER).<\/p>\n\n<h3 class=\"wp-block-heading\">Symboles, couleurs et l\u00e9gende<\/h3>\n\n<p class=\"wp-block-paragraph\">Les couleurs repr\u00e9sentent g\u00e9n\u00e9ralement des <strong>lignes de tramway<\/strong> ou de m\u00e9tro distinctes. Les points ou carr\u00e9s marquent les stations ; les symboles additionnels signalent les correspondances ou services.<\/p>\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Symbole<\/th>\n<th>Signification<\/th>\n<th>Exemple pratique<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Ligne color\u00e9e<\/strong><\/td>\n<td>Trajet d&rsquo;une ligne (m\u00e9tro\/tram)<\/td>\n<td>Suivre la couleur pour rester sur la bonne direction<\/td>\n<\/tr>\n<tr>\n<td><strong>Point de correspondance<\/strong><\/td>\n<td>Changez de ligne sans sortir<\/td>\n<td>Planifier une correspondance de 4 \u00e0 8 minutes<\/td>\n<\/tr>\n<tr>\n<td><strong>Ic\u00f4ne bus<\/strong><\/td>\n<td>Station de bus ou arr\u00eat proche<\/td>\n<td>Rep\u00e9rer la <strong>station de bus<\/strong> la plus proche de la sortie<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n<p class=\"wp-block-paragraph\">Insight : ma\u00eetriser la l\u00e9gende coupe imm\u00e9diatement la moiti\u00e9 de la confusion face \u00e0 un grand plan.<\/p>\n\n<h2 class=\"wp-block-heading\">Planifier un itin\u00e9raire : m\u00e9thode simple sur papier et en appli<\/h2>\n\n<p class=\"wp-block-paragraph\">Pour un trajet court, un plan papier ou une <strong>carte de m\u00e9tro<\/strong> suffit. Pour un trajet multi-modes (bus + tram + m\u00e9tro), l&rsquo;application devient plus fiable pour les <strong>horaires<\/strong> et les perturbations.<\/p>\n\n<p class=\"wp-block-paragraph\">\u00c9tapes pratiques pour \u00e9laborer un bon trajet :<\/p>\n\n<ol class=\"wp-block-list\"><li>Identifier votre point de d\u00e9part et votre destination sur le plan.<\/li><li>Rep\u00e9rer la ou les lignes qui relient ces points et notez les correspondances \u00e9ventuelles.<\/li><li>V\u00e9rifier les <strong>horaires<\/strong> et la fr\u00e9quence de la ligne choisie (matin\/soir\/week-end).<\/li><li>Choisir la sortie la plus proche de votre destination et un rep\u00e8re visuel (statue, caf\u00e9, immeuble).<\/li><li>Pr\u00e9voir 10\u201315 minutes de marge pour correspondances ou retards impr\u00e9vus.<\/li><\/ol>\n\n<p class=\"wp-block-paragraph\">Sur smartphone, privil\u00e9giez une appli qui indique en temps r\u00e9el les perturbations et les d\u00e9tours. L&rsquo;<a href=\"https:\/\/transitapp.com\/fr\/\" target=\"_blank\" rel=\"noopener\">application Transit<\/a> est un bon exemple : elle combine horaires, alertes r\u00e9seau et g\u00e9olocalisation.<\/p>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@tailwindcss\/browser@4\"><\/script>\n\n<!-- Infographie interactive : \"Comment lire un plan de transport en commun facilement\"\n     - Bloc pr\u00eat \u00e0 coller dans une page existante.\n     - Hauteur maximale contr\u00f4l\u00e9e (<= 2000px).\n     - Toutes les cha\u00eenes en fran\u00e7ais (facilement \u00e9ditables ci-dessous).\n     - Aucune API externe requise (outil autonome). Si besoin d'API, on peut l'ajouter plus tard.\n-->\n\n<style>\n  \/* Styles compl\u00e9mentaires pour am\u00e9liorer l'aspect sans ajouter d'images *\/\n  #infographie-plan-transport { max-height: 1200px; }\n  .station { transition: transform .18s ease, r .18s ease; cursor: pointer; }\n  .station:focus { outline: 3px dashed rgba(59,130,246,.6); outline-offset: 4px; }\n  .line { transition: stroke-dashoffset .4s ease; }\n  .chip { letter-spacing: .02em; }\n  .pulse { animation: pulse 1.6s infinite; }\n  @keyframes pulse {\n    0% { box-shadow: 0 0 0 0 rgba(34,197,94,.3); }\n    70% { box-shadow: 0 0 0 10px rgba(34,197,94,0); }\n    100% { box-shadow: 0 0 0 0 rgba(34,197,94,0); }\n  }\n  \/* Ensure the infographic doesn't overflow its container on small screens *\/\n  @media (max-width: 880px) {\n    #infographie-plan-transport { padding: 12px; }\n  }\n<\/style>\n\n<div id=\"infographie-plan-transport\" class=\"max-w-6xl mx-auto bg-white dark:bg-slate-900 border rounded-lg shadow-lg p-6 text-slate-800 dark:text-slate-100\">\n  <div class=\"flex flex-col md:flex-row gap-6\">\n    <!-- Colonne gauche : \u00e9tapes et conseils -->\n    <section class=\"md:w-1\/3\">\n      <h2 class=\"text-xl font-bold mb-3\">Comment lire un plan de transport<\/h2>\n      <p class=\"text-sm text-slate-500 mb-4\">Guide pas \u00e0 pas et outil interactif pour simplifier la lecture d\u2019un plan de transport.<\/p>\n\n      <nav aria-label=\"\u00c9tapes pour planifier un itin\u00e9raire\" class=\"space-y-3\">\n        <!-- Steps list generated by JS for accessibility; placeholder for progressive enhancement -->\n        <ul id=\"steps-list\" class=\"space-y-2\"><\/ul>\n      <\/nav>\n\n      <div class=\"mt-4 p-3 bg-slate-50 dark:bg-slate-800 rounded-lg border\">\n        <h3 class=\"font-semibold\">Conseils rapides<\/h3>\n        <ul class=\"mt-2 text-sm space-y-1\">\n          <li>&#8211; V\u00e9rifiez les correspondances et leur sens.<\/li>\n          <li>&#8211; Pr\u00e9voyez une marge de <strong id=\"marge-text\">10\u201315 minutes<\/strong>.<\/li>\n          <li>&#8211; Rep\u00e9rez la sortie la plus proche sur le plan (ic\u00f4nes ou escalier).<\/li>\n        <\/ul>\n      <\/div>\n    <\/section>\n\n    <!-- Centre : simulateur d'itin\u00e9raire et sch\u00e9ma SVG -->\n    <section class=\"md:w-2\/3\">\n      <div class=\"bg-gradient-to-br from-white to-slate-50 dark:from-slate-800 dark:to-slate-900 p-4 rounded-lg border\">\n        <div class=\"flex flex-col md:flex-row gap-3 items-start md:items-center\">\n          <div class=\"flex-1 min-w-0\">\n            <label for=\"select-from\" class=\"block text-sm font-medium\">Point de d\u00e9part<\/label>\n            <select id=\"select-from\" class=\"mt-1 w-full rounded-md border px-3 py-2 focus:outline-none focus:ring-2 focus:ring-sky-400\">\n            <\/select>\n          <\/div>\n          <div class=\"flex-1 min-w-0\">\n            <label for=\"select-to\" class=\"block text-sm font-medium\">Destination<\/label>\n            <select id=\"select-to\" class=\"mt-1 w-full rounded-md border px-3 py-2 focus:outline-none focus:ring-2 focus:ring-sky-400\">\n            <\/select>\n          <\/div>\n\n          <div class=\"flex items-end gap-2\">\n            <button id=\"compute-route\" class=\"inline-flex items-center px-3 py-2 bg-sky-600 text-white rounded-md hover:bg-sky-700 focus:outline-none focus:ring-2 focus:ring-sky-400\" aria-label=\"Calculer l'itin\u00e9raire\">Calculer<\/button>\n            <button id=\"randomize\" title=\"Exemple al\u00e9atoire\" class=\"px-3 py-2 border rounded-md text-slate-700 hover:bg-slate-100\" aria-label=\"Prendre un exemple al\u00e9atoire\">Exemple<\/button>\n          <\/div>\n        <\/div>\n\n        <div class=\"mt-4 grid md:grid-cols-2 gap-4\">\n          <div class=\"bg-white dark:bg-slate-800 rounded-md p-3 border\">\n            <h4 class=\"font-semibold\">Itin\u00e9raire r\u00e9sum\u00e9<\/h4>\n            <div id=\"route-summary\" class=\"mt-2 text-sm text-slate-700 dark:text-slate-200\" aria-live=\"polite\"><\/div>\n            <div class=\"mt-3\">\n              <button id=\"toggle-details\" class=\"text-sm text-sky-600 hover:underline\" aria-expanded=\"false\">Afficher plus de d\u00e9tails<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"bg-white dark:bg-slate-800 rounded-md p-3 border\">\n            <h4 class=\"font-semibold\">V\u00e9rifier horaires &#038; interruptions<\/h4>\n            <div class=\"mt-2 text-sm\">\n              <label for=\"departure-time\" class=\"block text-xs\">Heure de d\u00e9part estim\u00e9e<\/label>\n              <input id=\"departure-time\" type=\"time\" class=\"mt-1 w-full rounded-md border px-2 py-1\" \/>\n              <div class=\"flex items-center gap-2 mt-3\">\n                <input id=\"simulate-interruption\" type=\"checkbox\" class=\"h-4 w-4\" \/>\n                <label for=\"simulate-interruption\" class=\"text-sm\">Simuler interruption \/ travaux<\/label>\n              <\/div>\n              <div id=\"schedule-result\" class=\"mt-3 text-sm text-slate-700 dark:text-slate-200\" aria-live=\"polite\"><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"mt-4 p-3 bg-transparent rounded-md\">\n          <h4 class=\"font-semibold mb-2\">Sch\u00e9ma simplifi\u00e9 du trajet<\/h4>\n          <!-- SVG sch\u00e9ma : accessible, scalable, sans images -->\n          <div class=\"overflow-auto\">\n            <svg id=\"route-svg\" viewBox=\"0 0 800 220\" width=\"100%\" height=\"220\" role=\"img\" aria-label=\"Sch\u00e9ma simplifi\u00e9 du trajet\">\n              <!-- Lines and stations drawn by JS -->\n            <\/svg>\n          <\/div>\n          <p class=\"text-xs text-slate-500 mt-2\">Cliquez sur une station pour en savoir plus. Appuyez sur Tab pour naviguer au clavier.<\/p>\n        <\/div>\n      <\/div>\n\n      <!-- D\u00e9tails cach\u00e9s r\u00e9v\u00e9l\u00e9s par bouton -->\n      <div id=\"details-panel\" class=\"hidden mt-3 bg-slate-50 dark:bg-slate-800 p-3 rounded-md border\">\n        <h5 class=\"font-semibold\">D\u00e9tails de l&rsquo;itin\u00e9raire<\/h5>\n        <ol id=\"details-list\" class=\"mt-2 text-sm list-decimal list-inside space-y-1\"><\/ol>\n      <\/div>\n    <\/section>\n  <\/div>\n\n  <!-- Accessibilit\u00e9: zone de notifications non visible -->\n  <div id=\"annonces\" class=\"sr-only\" aria-live=\"polite\"><\/div>\n<\/div>\n\n<script>\n\/*\n  Infographie interactive (JS)\n  - Enti\u00e8rement comment\u00e9e.\n  - Pas de d\u00e9pendance externe lourde (juste Tailwind via CDN pour le style).\n  - Toutes les cha\u00eenes de texte sont en fran\u00e7ais et facilement modifiables via l'objet 'FR'.\n  - Donn\u00e9es d'exemple int\u00e9gr\u00e9es: stations, lignes, correspondances, horaires simul\u00e9s.\n  - Accessibilit\u00e9 : aria-live, focusable SVG, labels.\n*\/\n\n\/* ---------- CHA\u00ceNES EN FRAN\u00c7AIS (Internationalisation simple) ---------- *\/\nconst FR = {\n  titre: \"Comment lire un plan de transport\",\n  etapes: [\n    \"Choisir point A et B\",\n    \"Rep\u00e9rer lignes et correspondances\",\n    \"V\u00e9rifier horaires et interruptions\",\n    \"Noter sortie la plus proche\",\n    \"Pr\u00e9voir marge de 10\u201315 minutes\"\n  ],\n  conseilMarge: \"10\u201315 minutes\",\n  boutonCalculer: \"Calculer\",\n  boutonExemple: \"Exemple\",\n  afficherPlus: \"Afficher plus de d\u00e9tails\",\n  cacher: \"Cacher les d\u00e9tails\",\n  horaireAucun: \"Aucun horaire disponible pour ce trajet simul\u00e9.\",\n  interruptionActive: \"Attention : interruption ou travaux simul\u00e9s sur une portion du trajet.\",\n  sortieProche: \"Sortie la plus proche : \",\n  tempsEstime: \"Temps estim\u00e9 : \",\n  correspondances: \"Correspondances : \",\n  etapesDetail: \"\u00c9tapes pour planifier un itin\u00e9raire\",\n  stationInfo: \"Station\",\n  voirHoraires: \"Voir prochains passages\"\n};\n\n\/* ---------- DONN\u00c9ES D'EXEMPLE (jeu de donn\u00e9es local, rempla\u00e7able par API si besoin) ----------\n   Structure :\n   - stations: id, nom, x,y (pour placement SVG), sorties (exemples)\n   - lignes: id, nom, couleur, sequence (station ids)\n   - horaires: pour chaque ligne, fr\u00e9quence en minutes (simulation)\n*\/\nconst DATA = {\n  stations: [\n    { id: \"S1\", nom: \"Gare Centrale\", x: 60, y: 110, sortie: \"Hall A (Escalier 2)\" },\n    { id: \"S2\", nom: \"Place Verte\", x: 200, y: 40, sortie: \"Place (Sortie principale)\" },\n    { id: \"S3\", nom: \"Pont Sud\", x: 360, y: 110, sortie: \"Rive sud (Ascenseur)\" },\n    { id: \"S4\", nom: \"Parc Nord\", x: 540, y: 40, sortie: \"Parc (Escalier nord)\" },\n    { id: \"S5\", nom: \"R\u00e9sidence Ouest\", x: 700, y: 110, sortie: \"R\u00e9sidence (Sortie ouest)\" }\n  ],\n  lignes: [\n    { id: \"L1\", nom: \"Ligne 1\", couleur: \"#ef4444\", sequence: [\"S1\", \"S2\", \"S3\"] },\n    { id: \"L2\", nom: \"Ligne 2\", couleur: \"#06b6d4\", sequence: [\"S3\", \"S4\", \"S5\"] }\n  ],\n  horaires: {\n    \/\/ fr\u00e9quence en minutes pour chaque ligne (simulateur)\n    L1: { frequence: 8 },\n    L2: { frequence: 10 }\n  }\n};\n\n\/* ---------- UTILITAIRES ---------- *\/\nfunction findStationById(id) {\n  return DATA.stations.find(s => s.id === id);\n}\n\n\/* ---------- INITIALISATION DOM ---------- *\/\nconst stepsListEl = document.getElementById(\"steps-list\");\nconst selectFrom = document.getElementById(\"select-from\");\nconst selectTo = document.getElementById(\"select-to\");\nconst computeBtn = document.getElementById(\"compute-route\");\nconst randomBtn = document.getElementById(\"randomize\");\nconst routeSummaryEl = document.getElementById(\"route-summary\");\nconst detailsPanel = document.getElementById(\"details-panel\");\nconst toggleDetailsBtn = document.getElementById(\"toggle-details\");\nconst detailsListEl = document.getElementById(\"details-list\");\nconst routeSvg = document.getElementById(\"route-svg\");\nconst arrivalInput = document.getElementById(\"departure-time\");\nconst interruptionCheckbox = document.getElementById(\"simulate-interruption\");\nconst scheduleResultEl = document.getElementById(\"schedule-result\");\nconst annonces = document.getElementById(\"annonces\");\nconst margeText = document.getElementById(\"marge-text\");\n\n\/* Remplir \u00e9tapes \u00e0 partir de DATA fourni *\/\nfunction initSteps() {\n  FR.etapes.forEach((step, idx) => {\n    const li = document.createElement(\"li\");\n    li.innerHTML = `<button class=\"w-full text-left p-2 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700 focus:outline-none\" data-step=\"${idx+1}\"><span class=\"font-semibold mr-2 chip\">${idx+1}.<\/span>${step}<\/button>`;\n    stepsListEl.appendChild(li);\n  });\n  \/\/ interaction: cliquer sur une \u00e9tape annnonce une info\n  stepsListEl.addEventListener(\"click\", (e) => {\n    const btn = e.target.closest(\"button[data-step]\");\n    if (!btn) return;\n    const s = Number(btn.dataset.step) - 1;\n    annonces.textContent = `\u00c9tape ${s+1} : ${FR.etapes[s]}`;\n  });\n}\n\n\/* Remplir selects (stations) *\/\nfunction initStationSelects() {\n  DATA.stations.forEach(s => {\n    const opt1 = document.createElement(\"option\");\n    opt1.value = s.id;\n    opt1.textContent = s.nom;\n    selectFrom.appendChild(opt1);\n\n    const opt2 = document.createElement(\"option\");\n    opt2.value = s.id;\n    opt2.textContent = s.nom;\n    selectTo.appendChild(opt2);\n  });\n  \/\/ valeurs par d\u00e9faut\n  selectFrom.value = \"S1\";\n  selectTo.value = \"S5\";\n}\n\n\/* Dessiner SVG de base : lignes + stations *\/\nfunction drawBaseSvg() {\n  \/\/ Vide le SVG\n  while (routeSvg.firstChild) routeSvg.removeChild(routeSvg.firstChild);\n\n  \/\/ D\u00e9finitions (markers) si besoin\n  const defs = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"defs\");\n  routeSvg.appendChild(defs);\n\n  \/\/ Dessiner chaque ligne\n  DATA.lignes.forEach(ligne => {\n    const coords = ligne.sequence.map(id => {\n      const s = findStationById(id);\n      return [s.x, s.y];\n    });\n\n    \/\/ Ligne (polyline)\n    const poly = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"polyline\");\n    poly.setAttribute(\"points\", coords.map(p => p.join(\",\")).join(\" \"));\n    poly.setAttribute(\"fill\", \"none\");\n    poly.setAttribute(\"stroke\", ligne.couleur);\n    poly.setAttribute(\"stroke-width\", \"10\");\n    poly.setAttribute(\"stroke-linecap\", \"round\");\n    poly.setAttribute(\"stroke-linejoin\", \"round\");\n    poly.classList.add(\"line\");\n    poly.setAttribute(\"aria-hidden\", \"true\");\n    routeSvg.appendChild(poly);\n  });\n\n  \/\/ Dessiner les stations (cercles) avec labels\n  DATA.stations.forEach(st => {\n    \/\/ Cercle\n    const circle = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"circle\");\n    circle.setAttribute(\"cx\", st.x);\n    circle.setAttribute(\"cy\", st.y);\n    circle.setAttribute(\"r\", 10);\n    circle.setAttribute(\"fill\", \"#fff\");\n    circle.setAttribute(\"stroke\", \"#111827\");\n    circle.setAttribute(\"stroke-width\", \"2\");\n    circle.classList.add(\"station\");\n    circle.setAttribute(\"tabindex\", \"0\");\n    circle.dataset.stationId = st.id;\n    circle.setAttribute(\"aria-label\", `${FR.stationInfo} ${st.nom}`);\n    routeSvg.appendChild(circle);\n\n    \/\/ Label\n    const text = document.createElementNS(\"http:\/\/www.w3.org\/2000\/svg\", \"text\");\n    text.setAttribute(\"x\", st.x + 14);\n    text.setAttribute(\"y\", st.y + 5);\n    text.setAttribute(\"font-size\", \"12\");\n    text.setAttribute(\"fill\", \"#0f172a\");\n    text.textContent = st.nom;\n    routeSvg.appendChild(text);\n  });\n}\n\n\/* Fonction principale : calculer un itin\u00e9raire simul\u00e9 entre deux stations\n   - Cherche si elles sont sur la m\u00eame ligne => trajet direct\n   - Sinon, cherche un point de correspondance (station commune entre lignes)\n   - Retourne r\u00e9sum\u00e9, \u00e9tapes d\u00e9taill\u00e9es et SVG mise en avant (animation)\n*\/\nfunction computeItineraire(fromId, toId) {\n  const from = findStationById(fromId);\n  const to = findStationById(toId);\n  if (!from || !to) {\n    routeSummaryEl.textContent = \"Station introuvable.\";\n    return;\n  }\n  \/\/ Si m\u00eame station\n  if (fromId === toId) {\n    routeSummaryEl.innerHTML = `<strong>Vous \u00eates d\u00e9j\u00e0 \u00e0 ${from.nom}.<\/strong>`;\n    detailsListEl.innerHTML = `<li>Restez sur place ou choisissez une autre destination.<\/li>`;\n    detailsPanel.classList.remove(\"hidden\");\n    toggleDetailsBtn.setAttribute(\"aria-expanded\", \"true\");\n    return;\n  }\n\n  \/\/ Trouver lignes contenant from et to\n  const lignesFrom = DATA.lignes.filter(l => l.sequence.includes(fromId));\n  const lignesTo = DATA.lignes.filter(l => l.sequence.includes(toId));\n\n  \/\/ Si on a une ligne commune -> trajet direct\n  let route = { type: \"direct\", lignes: [], stations: [] };\n  const common = lignesFrom.filter(lf => lignesTo.some(lt => lt.id === lf.id));\n  if (common.length > 0) {\n    const ligne = common[0];\n    route.lignes = [ligne];\n    \/\/ extraire stations entre from->to\n    const seq = ligne.sequence;\n    const i1 = seq.indexOf(fromId);\n    const i2 = seq.indexOf(toId);\n    const slice = i1 < i2 ? seq.slice(i1, i2+1) : seq.slice(i2, i1+1).reverse();\n    route.stations = slice;\n  } else {\n    \/\/ chercher correspondance : trouver station commune entre une ligne contenant 'from' et une autre contenant 'to'\n    let found = false;\n    let via = null;\n    for (const lf of lignesFrom) {\n      for (const lt of lignesTo) {\n        \/\/ chercher intersection\n        const intersect = lf.sequence.filter(s => lt.sequence.includes(s));\n        if (intersect.length > 0) {\n          found = true;\n          via = intersect[0]; \/\/ premi\u00e8re correspondance\n          route = {\n            type: \"avec-correspondance\",\n            lignes: [lf, lt],\n            stations: [fromId, via, toId]\n          };\n          break;\n        }\n      }\n      if (found) break;\n    }\n    \/\/ Si aucune correspondance trouv\u00e9e : sugg\u00e9rer itin\u00e9raire alternatif (simulate simple transfer at nearest hub)\n    if (!found) {\n      \/\/ On propose un itin\u00e9raire via S3 (Pont Sud) par d\u00e9faut si possible\n      const hub = \"S3\";\n      route = {\n        type: \"avec-correspondance\",\n        lignes: [lignesFrom[0] || DATA.lignes[0], lignesTo[0] || DATA.lignes[1]],\n        stations: [fromId, hub, toId]\n      };\n    }\n  }\n\n  \/\/ Estimer temps : somme approximative des segments (simul\u00e9)\n  const estimatedMinutes = estimateTravelTime(route);\n\n  \/\/ Construire r\u00e9sum\u00e9 lisible\n  let summaryHtml = `<div><strong>${FR.tempsEstime}<\/strong> ${estimatedMinutes} min (sans impr\u00e9vus).<\/div>`;\n  const correspondancesText = route.type === \"direct\" ? \"Trajet direct\" : `Correspondance \u00e0 ${route.stations[1] ? findStationById(route.stations[1]).nom : \"\u2014\"}`;\n  summaryHtml += `<div class=\"mt-2\"><strong>${FR.correspondances}<\/strong> ${correspondancesText}<\/div>`;\n  summaryHtml += `<div class=\"mt-2\"><strong>${FR.sortieProche}<\/strong> ${findStationById(route.stations[route.stations.length-1]).sortie}<\/div>`;\n  routeSummaryEl.innerHTML = summaryHtml;\n\n  \/\/ D\u00e9tail \u00e9tapes\n  buildDetails(route, estimatedMinutes);\n\n  \/\/ Animer le SVG pour mettre en avant le trajet\n  highlightRouteOnSvg(route);\n\n  \/\/ G\u00e9rer availability horaires simul\u00e9s\n  simulateHoraires(route, arrivalInput.value, interruptionCheckbox.checked);\n}\n\n\/* Estimer le temps simul\u00e9 :\n   - Pour chaque station travers\u00e9e, compter 3 min entre stations + temps de correspondance 4 min.\n   - Appliquer marge (FR.conseilMarge) affich\u00e9e ailleurs.\n*\/\nfunction estimateTravelTime(route) {\n  let minutes = 0;\n  if (route.type === \"direct\") {\n    minutes += (route.stations.length - 1) * 3;\n  } else {\n    \/\/ from -> via -> to\n    minutes += 0;\n    for (let i = 0; i < route.stations.length - 1; i++) {\n      minutes += 3; \/\/ segment\n      if (i === 0) minutes += 4; \/\/ correspondance au hub\n    }\n  }\n  \/\/ Petite variance pour r\u00e9alisme\n  minutes += Math.floor(Math.random() * 3);\n  return minutes;\n}\n\n\/* Construire d\u00e9tails en liste ordonn\u00e9e (accessible) *\/\nfunction buildDetails(route, estimated) {\n  detailsListEl.innerHTML = \"\";\n  const ol = [];\n  if (route.type === \"direct\") {\n    const ligne = route.lignes[0];\n    ol.push(`Montez \u00e0 ${findStationById(route.stations[0]).nom}. Prenez ${ligne.nom} (${ligne.id}) jusqu'\u00e0 ${findStationById(route.stations[route.stations.length-1]).nom}.`);\n    ol.push(`Temps approximatif : ${estimated} minutes.`);\n    ol.push(`Sortie recommand\u00e9e : ${findStationById(route.stations[route.stations.length-1]).sortie}.`);\n  } else {\n    const lf = route.lignes[0];\n    const lt = route.lignes[1];\n    const viaStation = findStationById(route.stations[1]);\n    ol.push(`Depuis ${findStationById(route.stations[0]).nom}, prenez ${lf.nom} (${lf.id}) jusqu'\u00e0 ${viaStation.nom}.`);\n    ol.push(`Changez pour ${lt.nom} (${lt.id}) \u00e0 ${viaStation.nom} et continuez jusqu'\u00e0 ${findStationById(route.stations[2]).nom}.`);\n    ol.push(`Temps approximatif : ${estimated} minutes (incluant la correspondance).`);\n    ol.push(`Sortie recommand\u00e9e : ${findStationById(route.stations[2]).sortie}.`);\n  }\n  ol.forEach(text => {\n    const li = document.createElement(\"li\");\n    li.textContent = text;\n    detailsListEl.appendChild(li);\n  });\n  detailsPanel.classList.remove(\"hidden\");\n  toggleDetailsBtn.setAttribute(\"aria-expanded\", \"true\");\n}\n\n\/* Mettre en avant visuellement le trajet sur le SVG *\/\nfunction highlightRouteOnSvg(route) {\n  \/\/ Reset styles first\n  Array.from(routeSvg.querySelectorAll(\".station\")).forEach(c => {\n    c.setAttribute(\"r\", 10);\n    c.setAttribute(\"fill\", \"#fff\");\n    c.classList.remove(\"pulse\");\n  });\n  Array.from(routeSvg.querySelectorAll(\".line\")).forEach(l => {\n    l.style.opacity = \"0.25\";\n  });\n\n  \/\/ Highlight stations used in the route\n  route.stations.forEach(id => {\n    const circle = routeSvg.querySelector(`.station[data-station-id=\"${id}\"]`);\n    if (circle) {\n      circle.setAttribute(\"r\", 14);\n      circle.setAttribute(\"fill\", \"#f8fafc\");\n      circle.classList.add(\"pulse\");\n    }\n  });\n\n  \/\/ Highlight lines involved\n  route.lignes.forEach(l => {\n    \/\/ find polyline matching color (weak match)\n    const polys = Array.from(routeSvg.querySelectorAll(\".line\"));\n    polys.forEach(p => {\n      if (p.getAttribute(\"stroke\") === l.couleur) {\n        p.style.opacity = \"1\";\n      }\n    });\n  });\n\n  \/\/ Focus accessible cue\n  const firstStation = route.stations[0];\n  const el = routeSvg.querySelector(`.station[data-station-id=\"${firstStation}\"]`);\n  if (el) {\n    el.focus();\n    annonces.textContent = `Itin\u00e9raire calcul\u00e9 : d\u00e9part ${findStationById(firstStation).nom}.`;\n  }\n}\n\n\/* Simuler horaires (sans API) :\n   - Utilise la fr\u00e9quence des lignes pour calculer prochains passages.\n   - Si interruption simul\u00e9e, afficher message.\n*\/\nfunction simulateHoraires(route, timeValue, interruption) {\n  const lines = route.lignes.map(l => l.id);\n  \/\/ S\u00e9lection simple : prendre la premi\u00e8re ligne pour horaires\n  const lineId = lines[0];\n  if (!lineId || !DATA.horaires[lineId]) {\n    scheduleResultEl.textContent = FR.horaireAucun;\n    return;\n  }\n  const freq = DATA.horaires[lineId].frequence;\n  \/\/ Heure de r\u00e9f\u00e9rence : si timeValue fourni, on l'utilise ; sinon heure actuelle\n  const now = new Date();\n  let base = now;\n  if (timeValue) {\n    const [hh, mm] = timeValue.split(\":\").map(Number);\n    base = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hh, mm);\n  }\n  \/\/ Calculer prochains 3 passages\n  const next = [];\n  const minuteNow = base.getHours() * 60 + base.getMinutes();\n  \/\/ Suppose les v\u00e9hicules tournent depuis min 0\n  const nextMinute = Math.ceil(minuteNow \/ freq) * freq;\n  for (let i = 0; i < 3; i++) {\n    const m = nextMinute + i * freq;\n    const hh = Math.floor(m \/ 60) % 24;\n    const mm = m % 60;\n    next.push(`${String(hh).padStart(2, \"0\")}:${String(mm).padStart(2, \"0\")}`);\n  }\n\n  \/\/ Construire affichage\n  let html = `<div><strong>Prochains passages (${lineId}) :<\/strong> ${next.join(\", \")}.<\/div>`;\n  if (interruption) {\n    html += `<div class=\"mt-2 text-sm text-yellow-700 bg-yellow-50 p-2 rounded\"> ${FR.interruptionActive}<\/div>`;\n  }\n  scheduleResultEl.innerHTML = html;\n}\n\n\/* Interaction station click : afficher info station *\/\nrouteSvg && routeSvg.addEventListener(\"click\", (e) => {\n  const c = e.target.closest(\".station\");\n  if (!c) return;\n  const sid = c.dataset.stationId;\n  const s = findStationById(sid);\n  if (!s) return;\n  annonces.textContent = `${s.nom} \u2014 ${s.sortie}`;\n});\n\n\/* Keyboard activation on SVG stations *\/\nrouteSvg && routeSvg.addEventListener(\"keydown\", (e) => {\n  if (e.key === \"Enter\" || e.key === \" \") {\n    const c = e.target.closest(\".station\");\n    if (!c) return;\n    const sid = c.dataset.stationId;\n    const s = findStationById(sid);\n    if (!s) return;\n    alert(`${s.nom}nSortie recommand\u00e9e : ${s.sortie}nConseil : V\u00e9rifiez la correspondance sur le plan.`);\n  }\n});\n\n\/* ---------- \u00c9v\u00e9nements DOM ---------- *\/\ncomputeBtn.addEventListener(\"click\", () => {\n  computeItineraire(selectFrom.value, selectTo.value);\n});\n\nrandomBtn.addEventListener(\"click\", () => {\n  \/\/ Prendre deux stations al\u00e9atoires distinctes\n  const ids = DATA.stations.map(s => s.id);\n  let a = ids[Math.floor(Math.random() * ids.length)];\n  let b = ids[Math.floor(Math.random() * ids.length)];\n  while (a === b) {\n    b = ids[Math.floor(Math.random() * ids.length)];\n  }\n  selectFrom.value = a;\n  selectTo.value = b;\n  computeItineraire(a, b);\n});\n\ntoggleDetailsBtn.addEventListener(\"click\", () => {\n  const isHidden = detailsPanel.classList.contains(\"hidden\");\n  if (isHidden) {\n    detailsPanel.classList.remove(\"hidden\");\n    toggleDetailsBtn.textContent = FR.cacher;\n    toggleDetailsBtn.setAttribute(\"aria-expanded\", \"true\");\n  } else {\n    detailsPanel.classList.add(\"hidden\");\n    toggleDetailsBtn.textContent = FR.afficherPlus;\n    toggleDetailsBtn.setAttribute(\"aria-expanded\", \"false\");\n  }\n});\n\ninterruptionCheckbox.addEventListener(\"change\", () => {\n  \/\/ Recalculer affichage d'horaires pour le trajet actuel si existant\n  \/\/ Simple safeguard: re-trigger compute with current selects\n  computeItineraire(selectFrom.value, selectTo.value);\n});\n\narrivalInput.addEventListener(\"change\", () => {\n  computeItineraire(selectFrom.value, selectTo.value);\n});\n\n\/* ---------- Initialisation globale ---------- *\/\nfunction init() {\n  margeText.textContent = FR.conseilMarge;\n  initSteps();\n  initStationSelects();\n  drawBaseSvg();\n  \/\/ Initial compute pour montrer un exemple\n  computeItineraire(selectFrom.value, selectTo.value);\n}\n\ninit();\n\n\/* ---------- NOTE SUR LES APIs (aucune externe utilis\u00e9e ici)\n   Si vous souhaitez int\u00e9grer des donn\u00e9es r\u00e9elles (ex : horaires, positions),\n   voici des APIs publiques gratuites possibles (exemples) :\n\n   1) Nominatim OpenStreetMap (g\u00e9ocodage) - pas de cl\u00e9 requise, usage raisonnable\n      URL : https:\/\/nominatim.openstreetmap.org\/search?q=Gare+centrale&format=json\n      Exemple de r\u00e9ponse JSON (abr\u00e9g\u00e9) :\n      [\n        {\n          \"place_id\": 123456,\n          \"licence\": \"Data  OpenStreetMap contributors\",\n          \"boundingbox\": [\"...\", \"...\"],\n          \"lat\": \"48.8566\",\n          \"lon\": \"2.3522\",\n          \"display_name\": \"Gare Centrale, ...\",\n          \"class\": \"railway\",\n          \"type\": \"station\"\n        }\n      ]\n\n   2) Overpass API (pour r\u00e9cup\u00e9rer arr\u00eats et lignes OSM) - pas de cl\u00e9 requise\n      URL : https:\/\/overpass-api.de\/api\/interpreter?data=[out:json];node(around:1000,48.8566,2.3522)[\"public_transport\"];out;\n      Exemple de r\u00e9ponse JSON (abr\u00e9g\u00e9) :\n      {\n        \"elements\": [\n          { \"type\":\"node\", \"id\":111, \"lat\":48.8566, \"lon\":2.3522, \"tags\":{\"name\":\"Gare Centrale\"} },\n          ...\n        ]\n      }\n\n   Remarque : si vous int\u00e9grez ces APIs, veillez \u00e0 respecter leurs conditions d'utilisation et limitations de taux.\n*\/\n\n\/* Fin du script *\/\n<\/script>\n\n<p class=\"wp-block-paragraph\">Insight : une pr\u00e9paration de 2 minutes sur une appli \u00e9vite souvent 15 minutes d&rsquo;attente sur le quai.<\/p>\n\n<h2 class=\"wp-block-heading\">Se rep\u00e9rer sur place : gares, stations et orientation<\/h2>\n\n<p class=\"wp-block-paragraph\">\u00c0 l&rsquo;arriv\u00e9e, localisez d&rsquo;abord la <strong>station de bus<\/strong> ou la gare indiqu\u00e9e sur votre plan, puis la sortie qui donne vers votre destination.<\/p>\n\n<p class=\"wp-block-paragraph\">Points concrets \u00e0 v\u00e9rifier en arrivant :<\/p>\n\n<ul class=\"wp-block-list\"><li>Fl\u00e9chage des sorties et correspondances vers la <strong>ligne de tramway<\/strong> ou le m\u00e9tro.<\/li><li>Panneaux d&rsquo;information avec les <strong>horaires<\/strong> affich\u00e9s et les prochains d\u00e9parts.<\/li><li>Pr\u00e9sence d&rsquo;ascenseur ou d&rsquo;escaliers pour choisir l&rsquo;itin\u00e9raire le plus adapt\u00e9.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">Exemple terrain : Camille, une touriste, a choisi la sortie secondaire d&rsquo;une grande station, pensant gagner du temps. R\u00e9sultat : 12 minutes de marche suppl\u00e9mentaires. Le bon r\u00e9flexe est de rep\u00e9rer la sortie directement orient\u00e9e vers votre rue sur la carte avant de monter les escaliers.<\/p>\n\n<p class=\"wp-block-paragraph\">Insight : rep\u00e9rer la sortie exacte sur la carte \u00e9vite les d\u00e9tours co\u00fbteux en temps et en \u00e9nergie.<\/p>\n\n<h2 class=\"wp-block-heading\">Erreurs fr\u00e9quentes \u00e0 \u00e9viter quand on lit un plan<\/h2>\n\n<p class=\"wp-block-paragraph\">Certaines erreurs reviennent souvent \u2014 les reconna\u00eetre \u00e9vite des retards b\u00eates.<\/p>\n\n<ul class=\"wp-block-list\"><li>Confondre le sens d&rsquo;une ligne : v\u00e9rifier les terminus indiqu\u00e9s aux extr\u00e9mit\u00e9s.<\/li><li>Oublier de regarder la l\u00e9gende et les pictogrammes (correspondances, interruptions).<\/li><li>Se fier uniquement \u00e0 la distance visuelle sur la carte : la topologie n&rsquo;est pas toujours \u00e0 l&rsquo;\u00e9chelle.<\/li><li>Ignorer les <strong>horaires<\/strong> sp\u00e9ciaux les week-ends ou jours f\u00e9ri\u00e9s.<\/li><\/ul>\n\n<p class=\"wp-block-paragraph\">Insight : v\u00e9rifier le sens et les terminus \u00e9limine la plupart des mauvaises directions d\u00e8s le d\u00e9part.<\/p>\n\n<h2 class=\"wp-block-heading\">Adapter la lecture du plan selon votre profil<\/h2>\n\n<h3 class=\"wp-block-heading\">Pour le touriste<\/h3>\n\n<p class=\"wp-block-paragraph\">Privil\u00e9giez une carte simple de la zone touristique et notez deux points de rep\u00e8re. Utilisez une appli qui donne l&rsquo;<strong>itin\u00e9raire<\/strong> porte-\u00e0-porte.<\/p>\n\n<h3 class=\"wp-block-heading\">Pour le navetteur<\/h3>\n\n<p class=\"wp-block-paragraph\">Conservez une habitude : v\u00e9rifier les <strong>horaires<\/strong> matin\/soir et un plan B (ligne de bus alternative). Un carnet ou une capture d&rsquo;\u00e9cran d&rsquo;un itin\u00e9raire fr\u00e9quent \u00e9vite la perte de temps.<\/p>\n\n<h3 class=\"wp-block-heading\">Pour la personne \u00e0 mobilit\u00e9 r\u00e9duite<\/h3>\n\n<p class=\"wp-block-paragraph\">Rep\u00e9rez les ic\u00f4nes d&rsquo;accessibilit\u00e9 sur le plan et l&#8217;emplacement des ascenseurs. Confirmez en appelant le service client du r\u00e9seau si besoin pour conna\u00eetre les contraintes temporaires.<\/p>\n\n<p class=\"wp-block-paragraph\">Insight : adapter sa lecture du plan au profil r\u00e9duit le stress et rend le trajet plus fluide.<\/p>\n\n<h2 class=\"wp-block-heading\">Ressources et outils utiles<\/h2>\n\n<p class=\"wp-block-paragraph\">Pour t\u00e9l\u00e9charger des plans PDF ou consulter les plans officiels, la page des <a href=\"https:\/\/www.iledefrance-mobilites.fr\/le-reseau\/plans\" target=\"_blank\" rel=\"noopener\">plans Ile-de-France Mobilit\u00e9s<\/a> offre des cartes imprimables et \u00e0 jour.<\/p>\n\n<p class=\"wp-block-paragraph\">Pour des itin\u00e9raires d\u00e9taill\u00e9s et interactifs, la page <a href=\"https:\/\/www.ratp.fr\/itineraires\" target=\"_blank\" rel=\"noopener\">Itin\u00e9raires RATP<\/a> propose un calculateur de trajet fiable pour la r\u00e9gion parisienne.<\/p>\n\n<p class=\"wp-block-paragraph\">Pour des exercices pratiques et l&rsquo;entra\u00eenement, il existe des fiches d&rsquo;orientation et des fiches imprimables con\u00e7ues pour apprendre \u00e0 s&rsquo;orienter dans les transports <a href=\"https:\/\/www.exercices-a-imprimer.com\/exercice-sorienter-transports-en-commun\/\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n\n<p class=\"wp-block-paragraph\">Insight : combiner un plan officiel PDF et une appli en temps r\u00e9el donne le meilleur ratio fiabilit\u00e9\/actualit\u00e9.<\/p>\n\n<h2 class=\"wp-block-heading\">Tableau r\u00e9capitulatif : quoi regarder en priorit\u00e9<\/h2>\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u00c9l\u00e9ment<\/th>\n<th>V\u00e9rification rapide<\/th>\n<th>Temps estim\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Correspondance<\/strong><\/td>\n<td>Nombre de stations et direction<\/td>\n<td>4\u201310 min selon distance<\/td>\n<\/tr>\n<tr>\n<td><strong>Sortie<\/strong><\/td>\n<td>Sortie la plus proche de la destination<\/td>\n<td>1\u20133 min pour la rep\u00e9rer<\/td>\n<\/tr>\n<tr>\n<td><strong>Horaires<\/strong><\/td>\n<td>Prochains d\u00e9parts et fr\u00e9quence<\/td>\n<td>30 sec \u00e0 1 min<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n<!-- Quizz interactif (\u00e0 coller dans votre page). Ne contient ni <head> ni <body> complets. -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@tailwindcss\/browser@4\"><\/script>\n\n<div id=\"quiz-transport\" class=\"max-w-3xl mx-auto my-6 p-4 rounded-lg shadow-lg bg-gradient-to-br from-white to-slate-50\"\n     style=\"max-height:850px; overflow:auto;\">\n  <div class=\"flex items-start justify-between mb-3\">\n    <h2 id=\"quiz-title\" class=\"text-2xl font-semibold text-slate-800\">Quizz : Lire un plan de transport en commun<\/h2>\n    <div class=\"text-sm text-slate-600\">Accessibilit\u00e9 &#038; R\u00e9actif \u2022 Fran\u00e7ais<\/div>\n  <\/div>\n\n  <p id=\"quiz-intro\" class=\"text-slate-700 mb-4\">\n    Testez vos connaissances : 1) Trouvez la correspondance la plus rapide entre A et B ; 2) Identifiez la sortie la plus proche de votre h\u00e9bergement ; 3) Calculez une marge de s\u00e9curit\u00e9 de 10 minutes.\n  <\/p>\n\n  <form id=\"quiz-form\" class=\"space-y-5\" aria-labelledby=\"quiz-title\" novalidate>\n    <!-- Question 1: correspondance la plus rapide -->\n    <fieldset class=\"p-3 border rounded-md\" aria-labelledby=\"q1-label\">\n      <legend id=\"q1-label\" class=\"font-medium text-slate-800\">1) Quelle est la correspondance la plus rapide pour aller de A \u00e0 B ?<\/legend>\n      <p class=\"text-sm text-slate-600 mb-2\">D&rsquo;apr\u00e8s le plan, trois itin\u00e9raires sont possibles. Choisissez le plus rapide (dur\u00e9e totale indiqu\u00e9e).<\/p>\n\n      <div role=\"radiogroup\" aria-labelledby=\"q1-label\" class=\"space-y-2\">\n        <label class=\"flex items-center gap-3 p-2 rounded hover:bg-slate-50 cursor-pointer\">\n          <input type=\"radio\" name=\"q1\" value=\"route1\" class=\"q-radio\" \/>\n          <div>\n            <div class=\"font-medium\">Itin\u00e9raire 1 \u2014 Tram + Bus<\/div>\n            <div class=\"text-sm text-slate-600\">Tram 8 (A \u2192 C) 12 min, correspondance 6 min, Bus 42 (C \u2192 B) 18 min \u2192 Total : 36 min<\/div>\n          <\/div>\n        <\/label>\n\n        <label class=\"flex items-center gap-3 p-2 rounded hover:bg-slate-50 cursor-pointer\">\n          <input type=\"radio\" name=\"q1\" value=\"route2\" class=\"q-radio\" \/>\n          <div>\n            <div class=\"font-medium\">Itin\u00e9raire 2 \u2014 M\u00e9tro direct<\/div>\n            <div class=\"text-sm text-slate-600\">M\u00e9tro M2 (A \u2192 B) direct \u2192 Total : 28 min<\/div>\n          <\/div>\n        <\/label>\n\n        <label class=\"flex items-center gap-3 p-2 rounded hover:bg-slate-50 cursor-pointer\">\n          <input type=\"radio\" name=\"q1\" value=\"route3\" class=\"q-radio\" \/>\n          <div>\n            <div class=\"font-medium\">Itin\u00e9raire 3 \u2014 Bus + Tram + marche<\/div>\n            <div class=\"text-sm text-slate-600\">Bus 10 (A\u2192D) 10 min, Tram 4 (D\u2192E) 20 min, marche 15 min \u2192 Total : 45 min<\/div>\n          <\/div>\n        <\/label>\n      <\/div>\n      <div id=\"q1-feedback\" class=\"mt-2 text-sm\" aria-live=\"polite\"><\/div>\n    <\/fieldset>\n\n    <!-- Question 2: sortie la plus proche -->\n    <fieldset class=\"p-3 border rounded-md\" aria-labelledby=\"q2-label\">\n      <legend id=\"q2-label\" class=\"font-medium text-slate-800\">2) Quelle sortie est la plus proche de l&rsquo;h\u00e9bergement ?<\/legend>\n      <p class=\"text-sm text-slate-600 mb-2\">Donn\u00e9es (distance en m\u00e8tres) issues du plan l\u00e9gend\u00e9.<\/p>\n\n      <table class=\"w-full text-sm mb-2\" role=\"table\" aria-label=\"tableau sorties\">\n        <thead class=\"text-left text-slate-700\">\n          <tr><th>Sortie<\/th><th>Direction<\/th><th>Distance<\/th><\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td>Sortie 1<\/td><td>Rue du Parc<\/td><td>~220 m<\/td><\/tr>\n          <tr><td>Sortie 2<\/td><td>Avenue Centrale<\/td><td>~480 m<\/td><\/tr>\n          <tr><td>Sortie 3<\/td><td>Place du March\u00e9<\/td><td>~150 m<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n\n      <label class=\"flex items-center gap-2\">\n        <input type=\"radio\" name=\"q2\" value=\"s1\" class=\"q-radio\" \/>\n        <span>Sortie 1 (Rue du Parc)<\/span>\n      <\/label>\n      <label class=\"flex items-center gap-2\">\n        <input type=\"radio\" name=\"q2\" value=\"s2\" class=\"q-radio\" \/>\n        <span>Sortie 2 (Avenue Centrale)<\/span>\n      <\/label>\n      <label class=\"flex items-center gap-2\">\n        <input type=\"radio\" name=\"q2\" value=\"s3\" class=\"q-radio\" \/>\n        <span>Sortie 3 (Place du March\u00e9)<\/span>\n      <\/label>\n\n      <div id=\"q2-feedback\" class=\"mt-2 text-sm\" aria-live=\"polite\"><\/div>\n    <\/fieldset>\n\n    <!-- Question 3: marge de s\u00e9curit\u00e9 -->\n    <fieldset class=\"p-3 border rounded-md\" aria-labelledby=\"q3-label\">\n      <legend id=\"q3-label\" class=\"font-medium text-slate-800\">3) Calculez la marge de s\u00e9curit\u00e9 (ajoutez 10 minutes)<\/legend>\n      <p class=\"text-sm text-slate-600 mb-2\">Entrez le temps de trajet estim\u00e9 (en minutes). Le syst\u00e8me ajoutera la marge de s\u00e9curit\u00e9 fix\u00e9e \u00e0 10 minutes.<\/p>\n\n      <div class=\"flex gap-2 items-center\">\n        <label for=\"q3-input\" class=\"sr-only\">Temps estim\u00e9 (minutes)<\/label>\n        <input id=\"q3-input\" name=\"q3\" type=\"number\" min=\"1\" placeholder=\"Ex. 35\" class=\"border rounded px-3 py-2 w-32\"\n               aria-describedby=\"q3-help\" \/>\n        <button type=\"button\" id=\"q3-calc\" class=\"px-3 py-2 rounded bg-sky-600 text-white hover:bg-sky-700\">Calculer<\/button>\n      <\/div>\n      <div id=\"q3-feedback\" class=\"mt-2 text-sm\" aria-live=\"polite\"><\/div>\n      <div id=\"q3-help\" class=\"text-xs text-slate-500 mt-1\">Marge ajout\u00e9e : 10 minutes (fixe).<\/div>\n    <\/fieldset>\n\n    <!-- Question 4: symbole interpr\u00e9tation -->\n    <fieldset class=\"p-3 border rounded-md\" aria-labelledby=\"q4-label\">\n      <legend id=\"q4-label\" class=\"font-medium text-slate-800\">4) Que signifie ce symbole sur le plan ?<\/legend>\n      <p class=\"text-sm text-slate-600 mb-2\">Un cercle rempli de couleur indique un arr\u00eat majeur avec correspondances.<\/p>\n\n      <label class=\"flex items-center gap-2\">\n        <input type=\"radio\" name=\"q4\" value=\"a\" class=\"q-radio\" \/>\n        <span>Arr\u00eat r\u00e9gulier sans correspondance<\/span>\n      <\/label>\n      <label class=\"flex items-center gap-2\">\n        <input type=\"radio\" name=\"q4\" value=\"b\" class=\"q-radio\" \/>\n        <span>Arr\u00eat majeur avec correspondances<\/span>\n      <\/label>\n      <label class=\"flex items-center gap-2\">\n        <input type=\"radio\" name=\"q4\" value=\"c\" class=\"q-radio\" \/>\n        <span>Station ferm\u00e9e temporairement<\/span>\n      <\/label>\n\n      <div id=\"q4-feedback\" class=\"mt-2 text-sm\" aria-live=\"polite\"><\/div>\n    <\/fieldset>\n\n    <div class=\"flex gap-3\">\n      <button type=\"button\" id=\"quiz-submit\" class=\"px-4 py-2 rounded bg-emerald-600 text-white hover:bg-emerald-700\">Valider le quizz<\/button>\n      <button type=\"button\" id=\"quiz-reset\" class=\"px-4 py-2 rounded border border-slate-300 text-slate-700 hover:bg-slate-50\">R\u00e9initialiser<\/button>\n      <div id=\"quiz-result\" class=\"ml-auto font-medium text-slate-800 self-center\" aria-live=\"polite\"><\/div>\n    <\/div>\n  <\/form>\n\n  <div id=\"quiz-explanations\" class=\"mt-4 text-sm text-slate-700 hidden\" aria-hidden=\"true\">\n    <h3 class=\"font-semibold mb-1\">Explications<\/h3>\n    <ul class=\"list-disc ml-5\">\n      <li><strong>Question 1 :<\/strong> Choisir l&rsquo;itin\u00e9raire avec le temps total le plus court.<\/li>\n      <li><strong>Question 2 :<\/strong> La distance la plus courte indique l&rsquo;exit la plus proche.<\/li>\n      <li><strong>Question 3 :<\/strong> On additionne la marge fixe de 10 minutes au temps estim\u00e9.<\/li>\n      <li><strong>Question 4 :<\/strong> Les symboles aident \u00e0 rep\u00e9rer les correspondances majeures.<\/li>\n    <\/ul>\n  <\/div>\n<\/div>\n\n<!-- Script JS (bien comment\u00e9, lisible). Toutes les cha\u00eenes en fran\u00e7ais et modifiables au d\u00e9but. -->\n<script>\n\/*\n  Quizz interactif \u2014 JavaScript\n  - Con\u00e7u pour \u00eatre coll\u00e9 dans une page existante.\n  - Pas d'APIs externes n\u00e9cessaires (donn\u00e9es int\u00e9gr\u00e9es localement).\n  - Toutes les cha\u00eenes en fran\u00e7ais dans l'objet `I18N` ci-dessous pour faciliter l'\u00e9dition.\n*\/\n\n(function () {\n  'use strict';\n\n  \/\/ ---- Cha\u00eenes modifiables (internationalisation) ----\n  const I18N = {\n    correct: 'Correct',\n    incorrect: 'Incorrect',\n    submitSuccess: 'R\u00e9sultats :',\n    tryAgain: 'R\u00e9initialis\u00e9. Bonne chance !',\n    explanationsTitle: 'Explications',\n    q1: {\n      correctValue: 'route2',\n      explanation: 'Le m\u00e9tro direct (Itin\u00e9raire 2) prend 28 min, c\u2019est la dur\u00e9e la plus courte.'\n    },\n    q2: {\n      correctValue: 's3',\n      explanation: 'La Sortie 3 est \u00e0 ~150 m, c\u2019est la plus proche.'\n    },\n    q3: {\n      marginMinutes: 10,\n      explanation: function (input, total) {\n        return `Temps estim\u00e9 : ${input} min. Marge : ${this.marginMinutes} min. Temps total recommand\u00e9 : ${total} min.`;\n      }\n    },\n    q4: {\n      correctValue: 'b',\n      explanation: 'Un cercle rempli indique un arr\u00eat important o\u00f9 plusieurs lignes se croisent (correspondances).'\n    }\n  };\n\n  \/\/ ---- S\u00e9lection des \u00e9l\u00e9ments du DOM ----\n  const form = document.getElementById('quiz-form');\n  const submitBtn = document.getElementById('quiz-submit');\n  const resetBtn = document.getElementById('quiz-reset');\n  const resultNode = document.getElementById('quiz-result');\n\n  const q1Feedback = document.getElementById('q1-feedback');\n  const q2Feedback = document.getElementById('q2-feedback');\n  const q3Feedback = document.getElementById('q3-feedback');\n  const q4Feedback = document.getElementById('q4-feedback');\n  const q3Input = document.getElementById('q3-input');\n  const q3Calc = document.getElementById('q3-calc');\n  const explanations = document.getElementById('quiz-explanations');\n\n  \/\/ Accessibility: focus first input on load\n  window.addEventListener('load', function () {\n    const firstInput = form.querySelector('input, button');\n    if (firstInput) firstInput.focus();\n  });\n\n  \/\/ ---- Utilitaires ----\n  function getRadioValue(name) {\n    const el = form.querySelector(`input[name=\"${name}\"]:checked`);\n    return el ? el.value : null;\n  }\n\n  function setFeedback(node, correct, message) {\n    node.textContent = message;\n    node.className = correct ? 'text-emerald-700 font-medium' : 'text-rose-600';\n  }\n\n  \/\/ ---- Calcul de la Q3 (marge) ----\n  q3Calc.addEventListener('click', function () {\n    const raw = q3Input.value.trim();\n    if (!raw || isNaN(raw)) {\n      setFeedback(q3Feedback, false, 'Veuillez saisir un nombre valide pour le temps estim\u00e9 (en minutes).');\n      return;\n    }\n    const minutes = Math.max(0, Math.round(Number(raw)));\n    const total = minutes + I18N.q3.marginMinutes;\n    setFeedback(q3Feedback, true, I18N.q3.explanation(minutes, total));\n    \/\/ stocker la valeur calcul\u00e9e dans un attribut pour validation ult\u00e9rieure\n    q3Input.dataset.calculatedTotal = String(total);\n  });\n\n  \/\/ ---- Validation et notation ----\n  submitBtn.addEventListener('click', function () {\n    \/\/ Validation Q1\n    const q1 = getRadioValue('q1');\n    if (!q1) {\n      setFeedback(q1Feedback, false, 'Veuillez choisir une option pour la question 1.');\n    } else if (q1 === I18N.q1.correctValue) {\n      setFeedback(q1Feedback, true, `${I18N.correct} \u2014 ${I18N.q1.explanation}`);\n    } else {\n      setFeedback(q1Feedback, false, `${I18N.incorrect} \u2014 ${I18N.q1.explanation}`);\n    }\n\n    \/\/ Validation Q2\n    const q2 = getRadioValue('q2');\n    if (!q2) {\n      setFeedback(q2Feedback, false, 'Veuillez choisir une sortie.');\n    } else if (q2 === I18N.q2.correctValue) {\n      setFeedback(q2Feedback, true, `${I18N.correct} \u2014 ${I18N.q2.explanation}`);\n    } else {\n      setFeedback(q2Feedback, false, `${I18N.incorrect} \u2014 ${I18N.q2.explanation}`);\n    }\n\n    \/\/ Validation Q3\n    let q3Msg = '';\n    let q3Correct = false;\n    const q3Provided = q3Input.value.trim();\n    const q3Calculated = q3Input.dataset.calculatedTotal;\n    if (!q3Provided) {\n      q3Msg = 'Veuillez saisir le temps estim\u00e9 et appuyer sur \"Calculer\".';\n    } else if (!q3Calculated) {\n      q3Msg = 'Appuyez sur \"Calculer\" pour obtenir la marge et le temps total.';\n    } else {\n      q3Correct = true;\n      q3Msg = `OK \u2014 ${I18N.q3.explanation(q3Provided, q3Calculated)}`;\n    }\n    setFeedback(q3Feedback, q3Correct, q3Msg);\n\n    \/\/ Validation Q4\n    const q4 = getRadioValue('q4');\n    if (!q4) {\n      setFeedback(q4Feedback, false, 'Veuillez choisir une option pour la question 4.');\n    } else if (q4 === I18N.q4.correctValue) {\n      setFeedback(q4Feedback, true, `${I18N.correct} \u2014 ${I18N.q4.explanation}`);\n    } else {\n      setFeedback(q4Feedback, false, `${I18N.incorrect} \u2014 ${I18N.q4.explanation}`);\n    }\n\n    \/\/ Calcul du score\n    const scoreParts = [\n      (q1 === I18N.q1.correctValue) ? 1 : 0,\n      (q2 === I18N.q2.correctValue) ? 1 : 0,\n      q3Correct ? 1 : 0,\n      (q4 === I18N.q4.correctValue) ? 1 : 0\n    ];\n    const score = scoreParts.reduce((a, b) => a + b, 0);\n    resultNode.textContent = `${I18N.submitSuccess} ${score} \/ 4`;\n\n    \/\/ Afficher explications\n    explanations.classList.remove('hidden');\n    explanations.setAttribute('aria-hidden', 'false');\n\n    \/\/ Scroll l\u00e9ger pour exposer le r\u00e9sultat sur petits \u00e9crans\n    resultNode.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n  });\n\n  \/\/ ---- R\u00e9initialiser le quizz ----\n  resetBtn.addEventListener('click', function () {\n    form.reset();\n    \/\/ nettoyer feedbacks\n    [q1Feedback, q2Feedback, q3Feedback, q4Feedback].forEach(n => {\n      n.textContent = '';\n      n.className = '';\n    });\n    resultNode.textContent = I18N.tryAgain;\n    delete q3Input.dataset.calculatedTotal;\n    explanations.classList.add('hidden');\n    explanations.setAttribute('aria-hidden', 'true');\n    \/\/ focus sur premier \u00e9l\u00e9ment\n    const first = form.querySelector('input, button');\n    if (first) first.focus();\n  });\n\n  \/\/ ---- Keyboard: activer labels au \"Enter\" pour radios (am\u00e9liore l'accessibilit\u00e9) ----\n  form.addEventListener('keydown', function (e) {\n    if (e.key === 'Enter') {\n      \/\/ emp\u00eacher soumission du formulaire natif\n      e.preventDefault();\n    }\n  });\n\n  \/\/ Optional: simple analytics (non-externe) \u2014 compter tentatives locales (performance tr\u00e8s l\u00e9g\u00e8re)\n  try {\n    const key = 'quiz-transport-attempts';\n    const prev = Number(localStorage.getItem(key) || 0);\n    localStorage.setItem(key, String(prev + 1));\n  } catch (err) {\n    \/\/ stockage local non disponible, on ignore silencieusement (respect vie priv\u00e9e)\n  }\n\n})();\n<\/script>\n\n<!--\nNote:\n- Aucun service externe n'est utilis\u00e9 : donn\u00e9es internes simul\u00e9es pour exemples d'itin\u00e9raires et distances.\n- Si vous souhaitez connecter une API publique (par ex. horaires temps r\u00e9el), indiquez laquelle et je fournis l'int\u00e9gration\n  avec l'URL, exemple de r\u00e9ponse JSON et code client gratuit.\n-->\n\n<p class=\"wp-block-paragraph\">Pour compl\u00e9ter votre pratique, l&rsquo;article sur le train Paris\u2013Nancy donne un exemple concret d&rsquo;organisation de trajet interurbain, utile pour les liaisons longue distance <a href=\"https:\/\/www.transports-express-caraibes.fr\/blog\/voyage-train-paris-nancy-2025\/\">voyage en train Paris\u2013Nancy<\/a>. Des retours sur les innovations r\u00e9gionales aident aussi \u00e0 anticiper les changements de r\u00e9seau <a href=\"https:\/\/www.transports-express-caraibes.fr\/blog\/innovations-transport-nouvelle-aquitaine-2025\/\">innovations transport Nouvelle-Aquitaine<\/a>.<\/p>\n\n<p class=\"wp-block-paragraph\">Insight : la th\u00e9orie prend tout son sens quand elle s&rsquo;applique \u00e0 un trajet r\u00e9el.<\/p>\n\n<h2 class=\"wp-block-heading\">R\u00e9capitulatif et passage \u00e0 l\u2019action<\/h2>\n\n<p class=\"wp-block-paragraph\">Pour gagner en autonomie : m\u00e9morisez la <strong>l\u00e9gende<\/strong>, v\u00e9rifiez le <strong>sens des lignes<\/strong>, notez la <strong>sortie<\/strong> et consultez une appli pour les <strong>horaires<\/strong>. En pratique, commencez par planifier un trajet court et r\u00e9p\u00e9tez le processus jusqu&rsquo;\u00e0 ce qu&rsquo;il devienne automatique.<\/p>\n\n<p class=\"wp-block-paragraph\">Insight final : lire un plan de transport est une comp\u00e9tence rapide \u00e0 acqu\u00e9rir qui transforme les d\u00e9placements en gain de temps.<\/p>\n\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Comment savoir quelle sortie prendre en station ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Repu00e9rez sur la carte la sortie indiquu00e9e vers votre rue ou un point de repu00e8re. Les plans du00e9taillu00e9s en gare montrent souvent le nom des rues pour chaque sortie ; si absent, consultez le plan officiel ou une appli pour lu2019itinu00e9raire porte-u00e0-porte.\"}},{\"@type\":\"Question\",\"name\":\"Quelle appli utilise-t-on pour les perturbations en temps ru00e9el ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Plusieurs applications couvrent les perturbations ; lu2019une des plus complu00e8tes propose les alertes ru00e9seau et les horaires en temps ru00e9el. Lu2019usage combinu00e9 du2019un plan PDF officiel et du2019une appli en direct est recommandu00e9.\"}},{\"@type\":\"Question\",\"name\":\"Comment estimer la duru00e9e du2019une correspondance ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Pru00e9voyez gu00e9nu00e9ralement 4 u00e0 8 minutes en station moyenne. Pour de grandes gares ou correspondances entre modes (mu00e9tro u00e0 bus), ajoutez 10 minutes de marge.\"}},{\"@type\":\"Question\",\"name\":\"Que faire si un plan papier manque de du00e9tails ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Tu00e9lu00e9chargez le plan du00e9taillu00e9 du ru00e9seau ou une carte de la zone sur le site officiel de lu2019opu00e9rateur, ou utilisez une appli qui affiche les arru00eats et les sorties de fau00e7on pru00e9cise.\"}}]}\n<\/script>\n<h3>Comment savoir quelle sortie prendre en station ?<\/h3>\n<p>Rep\u00e9rez sur la carte la sortie indiqu\u00e9e vers votre rue ou un point de rep\u00e8re. Les plans d\u00e9taill\u00e9s en gare montrent souvent le nom des rues pour chaque sortie ; si absent, consultez le plan officiel ou une appli pour l\u2019itin\u00e9raire porte-\u00e0-porte.<\/p>\n<h3>Quelle appli utilise-t-on pour les perturbations en temps r\u00e9el ?<\/h3>\n<p>Plusieurs applications couvrent les perturbations ; l\u2019une des plus compl\u00e8tes propose les alertes r\u00e9seau et les horaires en temps r\u00e9el. L\u2019usage combin\u00e9 d\u2019un plan PDF officiel et d\u2019une appli en direct est recommand\u00e9.<\/p>\n<h3>Comment estimer la dur\u00e9e d\u2019une correspondance ?<\/h3>\n<p>Pr\u00e9voyez g\u00e9n\u00e9ralement 4 \u00e0 8 minutes en station moyenne. Pour de grandes gares ou correspondances entre modes (m\u00e9tro \u00e0 bus), ajoutez 10 minutes de marge.<\/p>\n<h3>Que faire si un plan papier manque de d\u00e9tails ?<\/h3>\n<p>T\u00e9l\u00e9chargez le plan d\u00e9taill\u00e9 du r\u00e9seau ou une carte de la zone sur le site officiel de l\u2019op\u00e9rateur, ou utilisez une appli qui affiche les arr\u00eats et les sorties de fa\u00e7on pr\u00e9cise.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>En bref : Lire un plan de transport peut sembler intimidant la premi\u00e8re fois, surtout dans une grande agglom\u00e9ration ou en voyage. Ce texte explique concr\u00e8tement comment d\u00e9chiffrer une carte de m\u00e9tro ou un plan de bus, choisir le bon itin\u00e9raire et s&rsquo;orienter rapidement en gare ou \u00e0 l&rsquo;arr\u00eat. Vous trouverez des rep\u00e8res visuels, une &#8230; <a title=\"Comment lire un plan de transport en commun facilement\" class=\"read-more\" href=\"https:\/\/www.transports-express-caraibes.fr\/blog\/lire-plan-transport-commun\/\" aria-label=\"En savoir plus sur Comment lire un plan de transport en commun facilement\">Lire plus<\/a><\/p>\n","protected":false},"author":3,"featured_media":23526,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[82],"tags":[],"class_list":["post-23527","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-transport"],"views":88,"_links":{"self":[{"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/posts\/23527","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=23527"}],"version-history":[{"count":0,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/posts\/23527\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/media\/23526"}],"wp:attachment":[{"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/media?parent=23527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/categories?post=23527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.transports-express-caraibes.fr\/blog\/wp-json\/wp\/v2\/tags?post=23527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}