{"id":5691,"date":"2026-08-13T13:25:07","date_gmt":"2026-08-13T11:25:07","guid":{"rendered":"https:\/\/www.cfa-europeen-louis-prioux.fr\/?page_id=5691"},"modified":"2026-08-13T14:06:30","modified_gmt":"2026-08-13T12:06:30","slug":"parcours-de-formation-carrosserie-et-peinture-automobile","status":"publish","type":"page","link":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/parcours-de-formation-carrosserie-et-peinture-automobile\/","title":{"rendered":"Carrosserie et peinture automobile, parcours de formation"},"content":{"rendered":"<div class=\"wp-block-columns eplus-wrapper is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex eplus-styles-uid-500b4a\">\n<div class=\"wp-block-column is-vertically-aligned-center eplus-wrapper is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:80%\">\n<p class=\"eplus-wrapper wp-block-paragraph\">Le carrossier ou le carrossier peintre identifie les \u00e9l\u00e9ments \u00e0 r\u00e9parer ou \u00e0 changer, ou les imperfections \u00e0 gommer. Il remet en \u00e9tat ce qui peut l\u2019\u00eatre ou remplace les \u00e9l\u00e9ments trop endommag\u00e9s. Il effectue \u00e9galement des travaux sur la structure du v\u00e9hicule, r\u00e9alise des contr\u00f4les. Il peut aider \u00e0 la confection de teintes de v\u00e9hicules.<\/p>\n\n\n\n<p class=\"eplus-wrapper wp-block-paragraph\">Voici un sch\u00e9ma repr\u00e9sentant les formations dipl\u00f4mantes de la fili\u00e8re carrosserie au sein du CFA Europ\u00e9en Louis Prioux de Bar-Le-Duc.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column eplus-wrapper is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:20%\">\n<figure class=\" wp-block-image size-full eplus-wrapper\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"586\" src=\"https:\/\/www.cfa-europeen-louis-prioux.fr\/cfalp\/wp-content\/uploads\/2026\/07\/ANFA_logo_CFApilote-600px.png\" alt=\"CFA pilote, r\u00e9seau de l'ANFA\" class=\"wp-image-3773\" srcset=\"https:\/\/www.cfa-europeen-louis-prioux.fr\/cfalp\/wp-content\/uploads\/2026\/07\/ANFA_logo_CFApilote-600px.png 500w, https:\/\/www.cfa-europeen-louis-prioux.fr\/cfalp\/wp-content\/uploads\/2026\/07\/ANFA_logo_CFApilote-600px-256x300.png 256w, https:\/\/www.cfa-europeen-louis-prioux.fr\/cfalp\/wp-content\/uploads\/2026\/07\/ANFA_logo_CFApilote-600px-10x12.png 10w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n<\/div>\n<\/div>\n\n<style>\r\n.cursus-map{\r\n  --cm-acc:#4472C4; --cm-acc-d:#2F5597;\r\n  --cm-band:#EAEAEA; --cm-rail:#EFEFEF; --cm-socle:#808080;\r\n  --cm-signal:#E1352C; --cm-ink:#1B1B1B; --cm-muted:#5A5F66; --cm-line:#D5D9DE;\r\n  --cm-ui:\"Segoe UI\",system-ui,-apple-system,Roboto,Arial,sans-serif;\r\n  font-family:var(--cm-ui); color:var(--cm-ink); background:#fff; line-height:1.45;\r\n  border:1px solid var(--cm-line); max-width:1180px; margin:0 auto; box-sizing:border-box; overflow:hidden;\r\n}\r\n.cursus-map *,.cursus-map *::before,.cursus-map *::after{box-sizing:border-box}\r\n.cursus-map p,.cursus-map h2,.cursus-map h3{margin:0}\r\n\r\n.cm-toolbar{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:baseline;justify-content:space-between;\r\n  padding:12px 26px;border-bottom:1px solid var(--cm-line)}\r\n.cm-hint{font-size:12px;color:var(--cm-muted);max-width:52ch}\r\n.cm-lien{flex:none;background:none;border:0;padding:2px;cursor:pointer;\r\n  font:600 12.5px\/1.3 var(--cm-ui);color:var(--cm-acc-d);text-decoration:underline}\r\n.cm-lien:hover{color:var(--cm-ink)}\r\n.cursus-map :focus-visible{outline:2px solid var(--cm-signal);outline-offset:2px}\r\n\r\n.cm-stage{position:relative;overflow:hidden;background:#fff}\r\n.cm-canvas{position:absolute;top:0;left:0;transform-origin:0 0;will-change:transform}\r\n.cm-edges{position:absolute;top:0;left:0;overflow:visible}\r\n.cm-nodes{position:absolute;top:0;left:0}\r\n\r\n.cm-rail{position:absolute;top:0;left:0;width:96px;height:100%;z-index:3;pointer-events:none;transform-origin:0 0}\r\n.cm-rail-item{position:absolute;left:26px;width:44px;background:var(--cm-rail);\r\n  display:flex;align-items:center;justify-content:center}\r\n.cm-rail-item span{writing-mode:vertical-rl;transform:rotate(180deg);font:700 13px\/1 var(--cm-ui);color:#333}\r\n\r\n.cm-edge{fill:none;stroke-width:1.4;transition:opacity .18s,stroke .18s,stroke-width .18s}\r\n.cm-edge.is-hl{stroke:var(--cm-signal);stroke-width:2.4}\r\n.cm-edge.is-mute{opacity:.14}\r\n\r\n\/* \u2014 Cartes : tout se joue au clic \u2014 *\/\r\n.cm-node{position:absolute;top:0;left:0;width:var(--cm-nodew,232px);cursor:pointer;transition:opacity .18s}\r\n.cm-node__box{position:relative;display:flex;flex-direction:column;gap:4px;align-items:center;justify-content:center;\r\n  min-height:var(--cm-boxh,86px);padding:12px 22px;text-align:center;color:#fff;\r\n  background:var(--cm-acc);border:1px solid var(--cm-acc-d);border-radius:5px;\r\n  transition:background .18s,box-shadow .18s}\r\n.cm-mark{position:absolute;top:5px;right:9px;font:400 16px\/1 var(--cm-ui);opacity:.6}\r\n.cm-mark::before{content:\"+\"}\r\n.cm-node.is-hl .cm-mark{opacity:1}\r\n.cm-node.is-hl .cm-mark::before{content:\"\u00d7\"}\r\n.cm-node:hover .cm-node__box{background:var(--cm-acc-d)}\r\n.cm-sigle{font:700 15px\/1.1 var(--cm-ui)}\r\n.cm-label{font:400 13px\/1.3 var(--cm-ui)}\r\n.cm-duree{display:flex;align-items:center;justify-content:center;height:32px;margin:6px 24px 0;\r\n  background:var(--cm-band);font:700 12.5px\/1 var(--cm-ui);color:#2A2A2A}\r\n.cm-node.is-nolink .cm-node__box{background:#8FA6D4;border-style:dashed}\r\n.cm-node.is-hl{z-index:5}\r\n.cm-node.is-hl .cm-node__box{box-shadow:0 0 0 3px var(--cm-signal)}\r\n.cm-node.is-mute{opacity:.32}\r\n\r\n\/* \u2014 Le lien, r\u00e9v\u00e9l\u00e9 par le clic \u2014 *\/\r\n.cm-open{position:absolute;left:24px;right:24px;top:100%;margin-top:5px;display:none;\r\n  align-items:center;justify-content:center;height:32px;text-decoration:none;\r\n  background:#fff;border:1.5px solid var(--cm-signal);color:var(--cm-signal);\r\n  font:700 11.5px\/1 var(--cm-ui);border-radius:2px}\r\n.cm-open:hover{background:var(--cm-signal);color:#fff}\r\n.cm-open.is-empty{border-color:var(--cm-line);color:var(--cm-muted);font-weight:600;cursor:default}\r\n.cm-open.is-empty:hover{background:#fff;color:var(--cm-muted)}\r\n.cm-node.is-hl .cm-open{display:flex}\r\n\r\n.cm-socle{position:absolute;display:flex;align-items:center;justify-content:center;cursor:pointer;\r\n  background:var(--cm-socle);color:#fff;font:700 12.5px\/1 var(--cm-ui);\r\n  border-radius:2px;transition:box-shadow .18s,opacity .18s,background .18s}\r\n.cm-socle:hover{background:#6B6B6B}\r\n.cm-socle.is-hl{box-shadow:0 0 0 3px var(--cm-signal)}\r\n.cm-socle.is-mute{opacity:.32}\r\n\r\n.cm-legend{display:grid;grid-template-columns:1.15fr 1fr;gap:22px 34px;\r\n  padding:16px 26px 22px;border-top:1px solid var(--cm-line);font-size:12.5px;color:#2A2A2A}\r\n.cm-legend .cm-leg-row{display:flex;align-items:center;gap:12px;margin-bottom:7px}\r\n.cm-legend svg{flex:none}\r\n\r\n\/* \u2014 Vue mobile : le sch\u00e9ma pivot\u00e9 \u00e0 90\u00b0, un niveau par \u00e9cran \u2014 *\/\r\n.cm-mob{position:relative;border-top:1px solid var(--cm-line);overflow:hidden}\r\n.cm-mobnav{display:flex;align-items:center;gap:10px;padding:9px 12px;background:#FAFBFC;\r\n  border-bottom:1px solid var(--cm-line)}\r\n.cm-mobnav button{flex:none;width:40px;height:40px;cursor:pointer;border-radius:2px;\r\n  border:1px solid var(--cm-line);background:#fff;color:var(--cm-ink);font:600 16px\/1 var(--cm-ui)}\r\n.cm-mobnav button:disabled{opacity:.3;cursor:default}\r\n.cm-dots{flex:1;display:flex;align-items:center;justify-content:center;gap:9px}\r\n.cm-dot{width:10px;height:10px;padding:0;border:0;border-radius:50%;background:var(--cm-line);\r\n  cursor:pointer;transition:background .2s,box-shadow .2s}\r\n.cm-dot.is-now{background:var(--cm-acc)}\r\n.cm-dot.is-path{box-shadow:0 0 0 2px var(--cm-signal)}\r\n\r\n.cm-mobsel{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;\r\n  padding:9px 14px;background:#F4F6F8;border-bottom:2px solid var(--cm-signal);font-size:12.5px}\r\n.cm-mobsel b{color:var(--cm-signal)}\r\n.cm-mobsel button{font:600 12px\/1 var(--cm-ui);padding:8px 11px;cursor:pointer;border-radius:2px;\r\n  border:1px solid var(--cm-signal);background:#fff;color:var(--cm-signal)}\r\n\r\n.cm-track{display:flex;align-items:flex-start;touch-action:pan-y;cursor:grab}\r\n.cm-track.is-anim{transition:transform .28s ease-out}\r\n.cm-track.is-drag{cursor:grabbing}\r\n.cm-panel{flex:0 0 100%;min-width:0;padding:16px 16px 24px}\r\n.cm-panel__eyebrow{font:700 10.5px\/1 var(--cm-ui);letter-spacing:.12em;text-transform:uppercase;\r\n  color:var(--cm-muted)}\r\n.cm-panel__h{font:700 19px\/1.15 var(--cm-ui);margin:7px 0 3px !important}\r\n.cm-panel__sub{font-size:12.5px;color:var(--cm-muted);margin-bottom:14px !important}\r\n.cm-plist{display:flex;align-items:stretch}\r\n.cm-conn{flex:none;width:24px;overflow:visible}\r\n.cm-cards{flex:1;min-width:0}\r\n.cm-swipehint{margin-top:12px !important;font:600 12px\/1.4 var(--cm-ui);color:var(--cm-acc-d);\r\n  background:#F4F6F8;border-left:3px solid var(--cm-acc);padding:10px 12px;border-radius:2px}\r\n\r\n.cm-fsocle{border:1px solid var(--cm-line);border-left:4px solid var(--cm-socle);border-radius:3px;\r\n  background:#fff;padding:13px 14px;cursor:pointer;font:700 13.5px\/1.3 var(--cm-ui);\r\n  transition:opacity .2s,box-shadow .2s,border-color .2s}\r\n.cm-fsocle span{display:block;font:400 12.5px\/1.45 var(--cm-ui);color:var(--cm-muted);margin-top:4px}\r\n.cm-fsocle.is-in{border-color:var(--cm-signal);border-left-color:var(--cm-signal)}\r\n.cm-fsocle.is-sel{border-color:var(--cm-signal);border-left-color:var(--cm-signal);\r\n  box-shadow:0 0 0 2px var(--cm-signal)}\r\n.cm-fsocle.is-out{opacity:.4}\r\n\r\n.cm-fcard{position:relative;border:1px solid var(--cm-line);border-left:4px solid var(--cm-acc);\r\n  border-radius:3px;background:#fff;padding:13px 40px 13px 14px;margin-bottom:9px;cursor:pointer;\r\n  transition:opacity .2s,box-shadow .2s,border-color .2s}\r\n.cm-fcard:hover{border-color:var(--cm-acc)}\r\n.cm-fmark{position:absolute;right:14px;top:11px;font:400 17px\/1 var(--cm-ui);color:var(--cm-muted)}\r\n.cm-fmark::before{content:\"+\"}\r\n.cm-fcard.is-sel .cm-fmark::before{content:\"\u00d7\"}\r\n.cm-fcard__top{display:flex;align-items:center;gap:9px;flex-wrap:wrap}\r\n.cm-fsigle{font:700 14px\/1.2 var(--cm-ui);color:var(--cm-acc-d)}\r\n.cm-fdur{font:700 12px\/1 var(--cm-ui);color:var(--cm-muted)}\r\n.cm-fniv{font:600 11px\/1 var(--cm-ui);color:var(--cm-muted);background:#F2F4F7;\r\n  border:1px solid var(--cm-line);border-radius:2px;padding:4px 7px}\r\n.cm-ftitle{font:600 13.5px\/1.35 var(--cm-ui);margin-top:4px !important}\r\n.cm-fdetail{display:none;margin-top:11px}\r\n.cm-fcard.is-sel .cm-fdetail{display:block}\r\n.cm-fbadge{font-size:12.5px;color:var(--cm-muted);padding:7px 10px;margin-bottom:5px;\r\n  background:#F7F8FA;border-left:3px solid var(--cm-acc);border-radius:2px}\r\n.cm-fbadge b{color:var(--cm-ink)}\r\n.cm-fnext{display:block;width:100%;text-align:left;font:600 12.5px\/1.3 var(--cm-ui);color:var(--cm-acc-d);\r\n  background:#fff;border:1px solid var(--cm-line);border-radius:2px;padding:9px 11px;margin-bottom:5px;cursor:pointer}\r\n.cm-fnext:hover{border-color:var(--cm-acc);background:#F3F6FC}\r\n.cm-flink{display:inline-flex;align-items:center;height:38px;padding:0 15px;margin-top:8px;\r\n  text-decoration:none;background:var(--cm-acc);color:#fff;font:700 12px\/1 var(--cm-ui);border-radius:2px}\r\n.cm-flink:hover{background:var(--cm-acc-d)}\r\n.cm-flink.is-empty{background:#F2F2F2;color:var(--cm-muted);pointer-events:none}\r\n\r\n\/* cursus isol\u00e9 : rouge pour toutes les \u00e9tapes, cercl\u00e9 pour le point de d\u00e9part choisi *\/\r\n.cm-fcard.is-in{border-color:var(--cm-signal);border-left-color:var(--cm-signal)}\r\n.cm-fcard.is-sel{border-color:var(--cm-signal);border-left-color:var(--cm-signal);\r\n  box-shadow:0 0 0 2px var(--cm-signal)}\r\n.cm-fcard.is-out{opacity:.4;border-left-color:var(--cm-line)}\r\n.cm-fcard.is-out .cm-ftitle{font-weight:400}\r\n.cm-fcard.is-out .cm-fmark{display:none}\r\n\r\n@media (max-width:720px){\r\n  .cm-toolbar,.cm-legend{padding-left:16px;padding-right:16px}\r\n  .cm-panel{padding:14px 12px 22px}\r\n  .cm-legend{grid-template-columns:1fr}\r\n  .cm-hint{width:100%}\r\n}\r\n@media (prefers-reduced-motion:reduce){.cursus-map *{transition:none !important}}\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  var SQUELETTE = \"  <div class=\\\"cm-toolbar\\\">\\n    <p class=\\\"cm-hint\\\">Cliquez sur un dipl\u00f4me \u2014 ou sur le bandeau Coll\u00e8ge \u2014 pour afficher son parcours et le lien vers sa fiche<\/p>\\n    <button type=\\\"button\\\" class=\\\"cm-lien\\\" id=\\\"cm-toggle\\\" aria-pressed=\\\"false\\\">Vue \u00e9tape par \u00e9tape<\/button>\\n  <\/div>\\n\\n  <div class=\\\"cm-stage\\\" id=\\\"cm-stage\\\">\\n    <div class=\\\"cm-rail\\\" id=\\\"cm-rail\\\" aria-hidden=\\\"true\\\"><\/div>\\n    <div class=\\\"cm-canvas\\\" id=\\\"cm-canvas\\\">\\n      <svg class=\\\"cm-edges\\\" id=\\\"cm-svg\\\" aria-hidden=\\\"true\\\"><\/svg>\\n      <div class=\\\"cm-nodes\\\" id=\\\"cm-nodes\\\"><\/div>\\n    <\/div>\\n  <\/div>\\n\\n  <div class=\\\"cm-legend\\\" id=\\\"cm-legend\\\"><\/div>\\n  <div class=\\\"cm-mob\\\" id=\\\"cm-flow\\\" hidden><\/div>\";\r\n\r\n  function construire(root, inst){\r\n    var brut = root.querySelector('script[type=\"application\/json\"]');\r\n    if(!brut) return;\r\n    var DATA;\r\n    try { DATA = JSON.parse(brut.textContent); }\r\n    catch(e){ console.error(\"Carte des cursus : JSON invalide\", e); return; }\r\n\r\n    \/* lien par d\u00e9faut : tout dipl\u00f4me sans url propre y renvoie *\/\r\n    (DATA.diplomes||[]).forEach(function(d){\r\n      if(!d.url && DATA.lienParDefaut) d.url = DATA.lienParDefaut;\r\n    });\r\n\r\n    root.innerHTML = SQUELETTE;\r\n\r\n  \/* =====================================================================\r\n     2) LE MOTEUR \u2014 rien \u00e0 modifier en dessous\r\n     ===================================================================== *\/\r\n  var LAY=DATA.layout||{};\r\n  var NW=LAY.nodeW||232, BOXH=LAY.boxH||86, DUREE=38, NH=BOXH+DUREE, PITCH=NW+42,\r\n      SUBH=NH+80, ROWMIN=NH+98, RAIL=96, PADX=34, PADY=26, SOCLE=34, SGAP=56;\r\n\r\n  var TH=DATA.theme||{};\r\n  var SIGNAL=TH.signal||\"#E1352C\";\r\n  root.style.setProperty(\"--cm-signal\",SIGNAL);\r\n  if(TH.acc)  root.style.setProperty(\"--cm-acc\",TH.acc);\r\n  if(TH.accD) root.style.setProperty(\"--cm-acc-d\",TH.accD);\r\n  root.style.setProperty(\"--cm-nodew\",NW+\"px\");\r\n  root.style.setProperty(\"--cm-boxh\",BOXH+\"px\");\r\n\r\n  function TY(k){                    \/* configuration d'un type de liaison *\/\r\n    var t=(DATA.types&&DATA.types[k])||{};\r\n    return {label:t.label||k, couleur:t.couleur||TH.acc||\"#4472C4\", trait:t.trait||\"\",\r\n            fleche:t.fleche!==false, symetrique:!!t.symetrique};\r\n  }\r\n  var stage=root.querySelector(\"#cm-stage\"), canvas=root.querySelector(\"#cm-canvas\"),\r\n      svg=root.querySelector(\"#cm-svg\"), layer=root.querySelector(\"#cm-nodes\"),\r\n      rail=root.querySelector(\"#cm-rail\"), NS=\"http:\/\/www.w3.org\/2000\/svg\";\r\n\r\n  function esc(s){return String(s).replace(\/[&<>\"]\/g,function(c){\r\n    return {\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"}[c];});}\r\n  function nom(n){return n.sigle+\" \"+n.label.split(\"<br>\")[0];}\r\n\r\n  var byId={}, nodes=DATA.diplomes, up={}, down={}, side={}, els={}, paths=[];\r\n  nodes.forEach(function(n){byId[n.id]=n;});\r\n\r\n  var bands={}, cy=PADY, maxCol=0;\r\n  DATA.niveaux.slice().reverse().forEach(function(niv){\r\n    var list=nodes.filter(function(n){return n.niveau===niv.id;}), rows=1;\r\n    list.forEach(function(n){ rows=Math.max(rows,(n.rang||0)+1); });\r\n    var h=Math.max(ROWMIN, rows*SUBH);\r\n    bands[niv.id]={top:cy,h:h,rows:rows};\r\n    cy+=h;\r\n  });\r\n  var socleY=cy+SGAP, H=socleY+SOCLE+PADY;\r\n\r\n  nodes.forEach(function(n){\r\n    var b=bands[n.niveau], off=(b.h-b.rows*SUBH)\/2, sub=b.rows-1-(n.rang||0);\r\n    maxCol=Math.max(maxCol,n.col||0);\r\n    n._x=RAIL+PADX+(n.col||0)*PITCH;\r\n    n._y=b.top+off+sub*SUBH+(SUBH-NH)\/2;\r\n    n._cx=n._x+NW\/2; n._cy=n._y+BOXH\/2; n._by=n._y+NH;\r\n  });\r\n  var W=RAIL+PADX*2+(maxCol+1)*PITCH-42;\r\n\r\n  svg.setAttribute(\"width\",W); svg.setAttribute(\"height\",H);\r\n  var defs=document.createElementNS(NS,\"defs\");\r\n  svg.appendChild(defs);\r\n  var mkCache={}, mkN=0;\r\n  function marker(col){\r\n    if(mkCache[col]) return mkCache[col];\r\n    var id=\"cm-ar-\"+inst+\"-\"+(mkN++), m=document.createElementNS(NS,\"marker\"),\r\n        pa=document.createElementNS(NS,\"path\");\r\n    m.setAttribute(\"id\",id); m.setAttribute(\"viewBox\",\"0 0 10 10\");\r\n    m.setAttribute(\"refX\",\"9\"); m.setAttribute(\"refY\",\"5\");\r\n    m.setAttribute(\"markerWidth\",\"7\"); m.setAttribute(\"markerHeight\",\"7\");\r\n    m.setAttribute(\"orient\",\"auto\");\r\n    pa.setAttribute(\"d\",\"M0,0 L10,5 L0,10 z\"); pa.setAttribute(\"fill\",col);\r\n    m.appendChild(pa); defs.appendChild(m);\r\n    mkCache[col]=id; return id;\r\n  }\r\n  var MKHL=marker(SIGNAL);\r\n\r\n  DATA.niveaux.forEach(function(niv){\r\n    var b=bands[niv.id], it=document.createElement(\"div\");\r\n    it.className=\"cm-rail-item\";\r\n    it.style.top=(b.top+18)+\"px\"; it.style.height=(b.h-36)+\"px\";\r\n    it.innerHTML='<span>'+esc(niv.label)+'<\/span>';\r\n    rail.appendChild(it);\r\n  });\r\n\r\n  var socleEl=null;\r\n  if(DATA.socle){\r\n    socleEl=document.createElement(\"div\");\r\n    socleEl.className=\"cm-socle\";\r\n    socleEl.style.left=(RAIL+PADX-8)+\"px\"; socleEl.style.top=socleY+\"px\";\r\n    socleEl.style.width=(W-RAIL-PADX*2+16)+\"px\"; socleEl.style.height=SOCLE+\"px\";\r\n    socleEl.textContent=DATA.socle;\r\n    socleEl.tabIndex=0; socleEl.setAttribute(\"role\",\"button\");\r\n    socleEl.setAttribute(\"aria-pressed\",\"false\");\r\n    socleEl.title=\"Formations accessibles directement apr\u00e8s la 3e\";\r\n    layer.appendChild(socleEl);\r\n  }\r\n\r\n  \/* \u2014 trac\u00e9s \u2014 *\/\r\n  var outN={}, outI={};\r\n  DATA.liens.forEach(function(l){\r\n    if(l.de!==\"socle\" && !TY(l.type).symetrique) outN[l.de]=(outN[l.de]||0)+1;\r\n  });\r\n\r\n  function trace(l){\r\n    var b=byId[l.vers]; if(!b) return;\r\n    var p=document.createElementNS(NS,\"path\"), d, ty=TY(l.type);\r\n    if(l.de===\"socle\"){\r\n      var bloque=false;\r\n      nodes.forEach(function(o){\r\n        if(o!==b && Math.abs(o._cx-b._cx)<NW\/2 && o._y>b._y) bloque=true;\r\n      });\r\n      if(!bloque){\r\n        d=\"M\"+b._cx+\",\"+socleY+\" L\"+b._cx+\",\"+(b._by+2);\r\n      } else {                    \/* une carte occupe la colonne : on passe par la goutti\u00e8re *\/\r\n        var droite=(b.col||0)<maxCol, gx=droite?(b._x+NW+21):(b._x-21);\r\n        d=\"M\"+gx+\",\"+socleY+\" L\"+gx+\",\"+b._cy+\" L\"+(droite?(b._x+NW+2):(b._x-2))+\",\"+b._cy;\r\n      }\r\n    } else {\r\n      var a=byId[l.de]; if(!a) return;\r\n      var sxp=a._cx;\r\n      if(!ty.symetrique){\r\n        var i=(outI[l.de]=(outI[l.de]||0)); outI[l.de]++;\r\n        sxp=a._cx+(i-((outN[l.de]||1)-1)\/2)*34;\r\n      }\r\n      if(Math.abs(a._cy-b._cy)<6){\r\n        var s=(b._cx>a._cx)?1:-1;\r\n        d=\"M\"+(a._cx+s*NW\/2)+\",\"+a._cy+\" L\"+(b._cx-s*NW\/2)+\",\"+b._cy;\r\n      } else if(Math.abs(sxp-b._cx)<26){\r\n        d=\"M\"+sxp+\",\"+a._y+\" L\"+sxp+\",\"+(b._y+BOXH+2);\r\n      } else {\r\n        d=\"M\"+sxp+\",\"+a._y+\" L\"+sxp+\",\"+b._cy+\" L\"+((sxp<b._cx)?b._x-2:b._x+NW+2)+\",\"+b._cy;\r\n      }\r\n    }\r\n    p.setAttribute(\"d\",d);\r\n    p.setAttribute(\"class\",\"cm-edge\");\r\n    p.setAttribute(\"stroke\",ty.couleur);\r\n    if(ty.trait) p.setAttribute(\"stroke-dasharray\",ty.trait);\r\n    p._key=l.de+\">\"+l.vers; p._to=l.vers; p._from=l.de; p._mk=null;\r\n    if(ty.fleche){ p._mk=marker(ty.couleur); p.setAttribute(\"marker-end\",\"url(#\"+p._mk+\")\"); }\r\n    svg.appendChild(p); paths.push(p);\r\n  }\r\n  DATA.liens.forEach(function(l){\r\n    if(l.de!==\"socle\"){\r\n      if(TY(l.type).symetrique){        \/* \u00e9quivalence lat\u00e9rale, pas une progression *\/\r\n        (side[l.de]=side[l.de]||[]).push(l.vers);\r\n        (side[l.vers]=side[l.vers]||[]).push(l.de);\r\n      } else {\r\n        (down[l.de]=down[l.de]||[]).push(l.vers);\r\n        (up[l.vers]=up[l.vers]||[]).push(l.de);\r\n      }\r\n    }\r\n    trace(l);\r\n  });\r\n\r\n  \/* \u2014 cartes \u2014 *\/\r\n  nodes.forEach(function(n){\r\n    var el=document.createElement(\"div\");\r\n    el.className=\"cm-node\"+(n.url?\"\":\" is-nolink\");\r\n    el.style.transform=\"translate(\"+n._x+\"px,\"+n._y+\"px)\";\r\n    el.tabIndex=0; el.setAttribute(\"role\",\"button\"); el.setAttribute(\"aria-pressed\",\"false\");\r\n    el.innerHTML='<div class=\"cm-node__box\"><span class=\"cm-mark\" aria-hidden=\"true\"><\/span>'+\r\n      '<span class=\"cm-sigle\">'+esc(n.sigle)+'<\/span>'+\r\n      '<span class=\"cm-label\">'+n.label+'<\/span><\/div>'+\r\n      '<div class=\"cm-duree\">'+esc(n.duree||\"\")+'<\/div>'+\r\n      (n.url ? '<a class=\"cm-open\" href=\"'+esc(n.url)+'\" target=\"_blank\" rel=\"noopener\">Voir la fiche \u2197<\/a>'\r\n             : '<span class=\"cm-open is-empty\">Lien \u00e0 ajouter<\/span>');\r\n    layer.appendChild(el);\r\n    els[n.id]=el;\r\n  });\r\n\r\n  \/* \u2014 parcours \u2014 *\/\r\n  function pathOf(id){\r\n    if(id===\"socle\"){\r\n      var Ns={}, Es={};\r\n      DATA.liens.forEach(function(l){ if(l.de===\"socle\"){ Ns[l.vers]=1; Es[\"socle>\"+l.vers]=1; } });\r\n      return {n:Ns,e:Es};\r\n    }\r\n    var N={}, E={}; N[id]=1;\r\n    function walk(map,fwd){\r\n      var st=[id];\r\n      while(st.length){ var c=st.pop();\r\n        (map[c]||[]).forEach(function(x){\r\n          E[fwd?c+\">\"+x:x+\">\"+c]=1;\r\n          if(!N[x]){N[x]=1;st.push(x);}\r\n        });\r\n      }\r\n    }\r\n    walk(up,false); walk(down,true);\r\n    (side[id]||[]).forEach(function(x){ N[x]=1; E[id+\">\"+x]=1; E[x+\">\"+id]=1; });\r\n    return {n:N,e:E};\r\n  }\r\n\r\n  var sel=null, fEls={}, fSocle=null, fBar=null, fBarTxt=null, fSteps=[], fDots=[];\r\n  function refresh(){\r\n    var hl=sel?pathOf(sel):null;\r\n    nodes.forEach(function(n){\r\n      var el=els[n.id], on=!!(hl&&hl.n[n.id]);\r\n      el.classList.toggle(\"is-hl\", on);\r\n      el.classList.toggle(\"is-mute\", !!(hl&&!on));\r\n      el.setAttribute(\"aria-pressed\", String(sel===n.id));\r\n    });\r\n    var socleOn=false;\r\n    paths.forEach(function(p){\r\n      var on=!!(hl && (hl.e[p._key] || (p._from===\"socle\" && hl.n[p._to])));\r\n      if(on && p._from===\"socle\") socleOn=true;\r\n      p.classList.toggle(\"is-hl\",on);\r\n      p.classList.toggle(\"is-mute\", !!(hl&&!on));\r\n      if(p._mk) p.setAttribute(\"marker-end\",\"url(#\"+(on?MKHL:p._mk)+\")\");\r\n    });\r\n    if(socleEl){\r\n      socleEl.classList.toggle(\"is-hl\",socleOn);\r\n      socleEl.classList.toggle(\"is-mute\", !!(hl&&!socleOn));\r\n      socleEl.setAttribute(\"aria-pressed\", String(sel===\"socle\"));\r\n    }\r\n    \/* \u2014 m\u00eame s\u00e9lection r\u00e9percut\u00e9e dans la vue niveaux \u2014 *\/\r\n    nodes.forEach(function(n){\r\n      var fe=fEls[n.id]; if(!fe) return;\r\n      var on=!!(hl&&hl.n[n.id]);\r\n      fe.classList.toggle(\"is-in\", on);\r\n      fe.classList.toggle(\"is-out\", !!(hl&&!on));\r\n      fe.classList.toggle(\"is-sel\", sel===n.id);\r\n      fe.setAttribute(\"aria-pressed\", String(sel===n.id));\r\n    });\r\n    if(fSocle){\r\n      fSocle.classList.toggle(\"is-in\", !!(hl && (socleOn||sel===\"socle\")));\r\n      fSocle.classList.toggle(\"is-out\", !!(hl && !socleOn && sel!==\"socle\"));\r\n      fSocle.classList.toggle(\"is-sel\", sel===\"socle\");\r\n      fSocle.setAttribute(\"aria-pressed\", String(sel===\"socle\"));\r\n    }\r\n    if(fBar){\r\n      if(sel){\r\n        fBar.removeAttribute(\"hidden\");\r\n        fBarTxt.innerHTML=\"Parcours affich\u00e9 \u00e0 partir de <b>\"+\r\n          (sel===\"socle\" ? esc(DATA.socle) : esc(nom(byId[sel])))+\"<\/b>\";\r\n      } else { fBar.setAttribute(\"hidden\",\"\"); }\r\n    }\r\n    fDots.forEach(function(d,i){          \/* les niveaux qui contiennent une \u00e9tape du cursus *\/\r\n      var st=fSteps[i], onp=false;\r\n      if(hl){\r\n        if(st.key===\"socle\") onp=(socleOn||sel===\"socle\");\r\n        else st.items.forEach(function(n){ if(hl.n[n.id]) onp=true; });\r\n      }\r\n      d.classList.toggle(\"is-path\",onp);\r\n    });\r\n    connecteurs();\r\n  }\r\n\r\n  function bind(el,id){\r\n    el.addEventListener(\"click\",function(e){\r\n      if(e.target.closest(\"a\")) return;          \/* le bouton \u00ab Voir la fiche \u00bb fait son travail *\/\r\n      sel=(sel===id)?null:id; refresh();\r\n    });\r\n    el.addEventListener(\"keydown\",function(e){\r\n      if(e.key===\"Enter\"||e.key===\" \"){ e.preventDefault(); sel=(sel===id)?null:id; refresh(); }\r\n    });\r\n  }\r\n  nodes.forEach(function(n){ bind(els[n.id],n.id); });\r\n  if(socleEl) bind(socleEl,\"socle\");\r\n\r\n  \/* \u2014 zoom, d\u00e9placement, pincement \u2014 *\/\r\n  var k=1,tx=0,ty=0;\r\n  function apply(){\r\n    canvas.style.transform=\"translate(\"+tx+\"px,\"+ty+\"px) scale(\"+k+\")\";\r\n    rail.style.transform=\"translate(0px,\"+ty+\"px) scale(\"+k+\")\";\r\n  }\r\n  function fit(){                     \/* le sch\u00e9ma s'inscrit toujours dans la largeur *\/\r\n    var r=stage.getBoundingClientRect();\r\n    if(r.width<10) return;\r\n    k=Math.min(1,(r.width-20)\/W);\r\n    tx=Math.max(0,(r.width-W*k)\/2); ty=10;\r\n    stage.style.height=Math.round(H*k+20)+\"px\";\r\n    apply();\r\n  }\r\n  stage.addEventListener(\"click\",function(e){      \/* clic dans le vide : on referme *\/\r\n    if(!sel) return;\r\n    if(e.target.closest(\".cm-node, .cm-socle\")) return;\r\n    sel=null; refresh();\r\n  });\r\n\r\n  \/* \u2014 l\u00e9gende : uniquement les types de liaison et les sigles employ\u00e9s \u2014 *\/\r\n  function sample(stroke,dash,arrow){\r\n    return '<svg width=\"80\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"'+(arrow?66:76)+'\" y2=\"5\" stroke=\"'+stroke+\r\n      '\" stroke-width=\"1.4\"'+(dash?' stroke-dasharray=\"'+dash+'\"':'')+'\/>'+\r\n      (arrow?'<path d=\"M66,1 L76,5 L66,9 z\" fill=\"'+stroke+'\"\/>':'')+'<\/svg>';\r\n  }\r\n  root.querySelector(\"#cm-legend\").innerHTML=\r\n    '<div>'+\r\n      Object.keys(DATA.types||{}).filter(function(k){\r\n        return (DATA.liens||[]).some(function(l){ return l.type===k; });\r\n      }).map(function(k){\r\n        var t=TY(k);\r\n        return '<div class=\"cm-leg-row\">'+sample(t.couleur,t.trait,t.fleche)+t.label+'<\/div>';\r\n      }).join(\"\")+\r\n    '<\/div><div>'+\r\n      Object.keys(DATA.abrev||{}).filter(function(sig){\r\n        return nodes.some(function(n){ return n.sigle===sig; });\r\n      }).map(function(sig){\r\n        return '<div class=\"cm-leg-row\"><b>'+esc(sig)+'<\/b> : '+esc(DATA.abrev[sig])+'<\/div>';\r\n      }).join(\"\")+\r\n    '<\/div>';\r\n\r\n  \/* \u2014 vue mobile : le sch\u00e9ma pivot\u00e9, un niveau par \u00e9cran \u2014 *\/\r\n  var flowEl=root.querySelector(\"#cm-flow\");\r\n\r\n  function conditions(id){                       \/* ce que la formation demande \u00e0 l'entr\u00e9e *\/\r\n    var g={};\r\n    DATA.liens.forEach(function(l){\r\n      var t=TY(l.type), other=null;\r\n      if(l.vers===id) other=l.de;\r\n      else if(t.symetrique && l.de===id) other=l.vers;\r\n      else return;\r\n      (g[l.type]=g[l.type]||[]).push(other);\r\n    });\r\n    return Object.keys(g).map(function(k){\r\n      var t=TY(k), viaSocle=false, noms=[];\r\n      g[k].forEach(function(x){\r\n        if(x===\"socle\") viaSocle=true; else if(byId[x]) noms.push(nom(byId[x]));\r\n      });\r\n      return {b:t.label, couleur:t.couleur, trait:t.trait,\r\n        x: noms.length ? (t.symetrique?\"avec \":\"depuis \")+noms.join(\" ou \")\r\n         : (viaSocle ? \"\u00e0 la sortie du \"+String(DATA.socle||\"\").toLowerCase() : \"\")};\r\n    });\r\n  }\r\n\r\n  \/* les \u00e9crans : uniquement de l'avant vers l'apr\u00e8s.\r\n     La profondeur d'une formation = le plus long chemin qui y m\u00e8ne. *\/\r\n  var nivIdx={}, nivLbl={};\r\n  DATA.niveaux.forEach(function(v,i){ nivIdx[v.id]=i; nivLbl[v.id]=v.label; });\r\n\r\n  var prof={}, ancre={};\r\n  DATA.liens.forEach(function(l){ if(l.de===\"socle\") ancre[l.vers]=1; });\r\n  nodes.forEach(function(n){ prof[n.id]=1; });\r\n  for(var pass=0; pass<=nodes.length; pass++){\r\n    var chg=false;\r\n    nodes.forEach(function(n){\r\n      if(ancre[n.id]) return;          \/* accessible d\u00e8s la sortie du coll\u00e8ge *\/\r\n      (up[n.id]||[]).forEach(function(p){\r\n        if(prof[p]+1>prof[n.id]){ prof[n.id]=prof[p]+1; chg=true; }\r\n      });\r\n    });\r\n    if(!chg) break;\r\n  }\r\n\r\n  if(DATA.socle) fSteps.push({key:\"socle\",label:DATA.socle,sub:\"Point de d\u00e9part du parcours\",items:[]});\r\n  var maxProf=1;\r\n  nodes.forEach(function(n){ maxProf=Math.max(maxProf,prof[n.id]); });\r\n  for(var d=1; d<=maxProf; d++){\r\n    var items=nodes.filter(function(n){ return prof[n.id]===d; })\r\n      .sort(function(a,b){\r\n        return (nivIdx[a.niveau]-nivIdx[b.niveau]) || ((a.rang||0)-(b.rang||0)) || (a.col-b.col);\r\n      });\r\n    if(!items.length) continue;\r\n    fSteps.push({\r\n      key:\"d\"+d, items:items,\r\n      label: d===1 ? \"Formations 1\u00e8re ann\u00e9e\" : \"Suites de parcours\",\r\n      sub: items.length+(items.length>1?\" formations accessibles\":\" formation accessible\")+\r\n           (d===1?\" directement\":\" apr\u00e8s une formation de l'\u00e9tape pr\u00e9c\u00e9dente\")\r\n    });\r\n  }\r\n  var stepDe={};\r\n  fSteps.forEach(function(st,i){\r\n    if(st.key===\"socle\") stepDe[\"socle\"]=i;\r\n    st.items.forEach(function(n){ stepDe[n.id]=i; });\r\n  });\r\n\r\n  function stepOf(id){\r\n    for(var i=0;i<fSteps.length;i++){\r\n      if(fSteps[i].key===\"socle\"){ if(id===\"socle\") return i; continue; }\r\n      for(var j=0;j<fSteps[i].items.length;j++) if(fSteps[i].items[j].id===id) return i;\r\n    }\r\n    return 0;\r\n  }\r\n\r\n  var fhtml='<div class=\"cm-mobnav\">'+\r\n      '<button type=\"button\" id=\"cm-prev\" aria-label=\"Niveau pr\u00e9c\u00e9dent\">\u2039<\/button>'+\r\n      '<span class=\"cm-dots\" id=\"cm-dots\"><\/span>'+\r\n      '<button type=\"button\" id=\"cm-next\" aria-label=\"Niveau suivant\">\u203a<\/button><\/div>'+\r\n    '<div class=\"cm-mobsel\" id=\"cm-fbar\" hidden><span id=\"cm-fbar-t\"><\/span>'+\r\n      '<button type=\"button\" id=\"cm-fbar-r\">Tout afficher<\/button><\/div>'+\r\n    '<div class=\"cm-track is-anim\" id=\"cm-track\">';\r\n\r\n  fSteps.forEach(function(st,i){\r\n    fhtml+='<section class=\"cm-panel\">'+\r\n      '<p class=\"cm-panel__eyebrow\">\u00c9tape '+(i+1)+' sur '+fSteps.length+'<\/p>'+\r\n      '<h3 class=\"cm-panel__h\">'+esc(st.label)+'<\/h3>';\r\n    if(st.key===\"socle\"){\r\n      var direct=DATA.liens.filter(function(l){return l.de===\"socle\";})\r\n                           .map(function(l){return byId[l.vers];}).filter(Boolean);\r\n      fhtml+='<p class=\"cm-panel__sub\">Point de d\u00e9part du parcours<\/p>'+\r\n        '<div class=\"cm-plist\"><svg class=\"cm-conn\" data-side=\"l\"><\/svg><div class=\"cm-cards\">'+\r\n        '<div class=\"cm-fsocle\" id=\"cm-f-socle\" role=\"button\" tabindex=\"0\" aria-pressed=\"false\">'+\r\n        esc(DATA.socle)+'<span>Accessible directement apr\u00e8s la 3<sup>e<\/sup> : '+\r\n        esc(direct.map(nom).join(\", \"))+'. Touchez pour isoler ce parcours.<\/span>'+\r\n        '<\/div><\/div><svg class=\"cm-conn\" data-side=\"r\"><\/svg><\/div>';\r\n    } else {\r\n      fhtml+='<p class=\"cm-panel__sub\">'+esc(st.sub)+'<\/p>'+\r\n        '<div class=\"cm-plist\"><svg class=\"cm-conn\" data-side=\"l\"><\/svg><div class=\"cm-cards\">';\r\n      st.items.forEach(function(n){\r\n        var suites=DATA.liens.filter(function(l){\r\n          return l.de===n.id && !TY(l.type).symetrique; });\r\n        fhtml+='<div class=\"cm-fcard\" id=\"cm-f-'+esc(n.id)+'\" role=\"button\" tabindex=\"0\" aria-pressed=\"false\">'+\r\n          '<span class=\"cm-fmark\" aria-hidden=\"true\"><\/span>'+\r\n          '<div class=\"cm-fcard__top\"><span class=\"cm-fsigle\">'+esc(n.sigle)+'<\/span>'+\r\n          '<span class=\"cm-fdur\">'+esc(n.duree||\"\")+'<\/span>'+\r\n          '<span class=\"cm-fniv\">'+esc(nivLbl[n.niveau]||\"\")+'<\/span><\/div>'+\r\n          '<p class=\"cm-ftitle\">'+n.label.replace(\/<br>\/g,\" \u2014 \")+'<\/p>'+\r\n          '<div class=\"cm-fdetail\">'+\r\n            conditions(n.id).map(function(c){\r\n              return '<p class=\"cm-fbadge\" style=\"border-left-color:'+c.couleur+\r\n                     ';border-left-style:'+(c.trait?\"dashed\":\"solid\")+'\"><b>'+c.b+'<\/b> '+c.x+'<\/p>';}).join(\"\")+\r\n            suites.map(function(l){\r\n              var o=byId[l.vers]; if(!o) return \"\";\r\n              return '<button type=\"button\" class=\"cm-fnext\" data-go=\"'+esc(o.id)+'\">Ensuite : '+\r\n                     esc(nom(o))+' \u203a<\/button>';}).join(\"\")+\r\n            (n.url ? '<a class=\"cm-flink\" href=\"'+esc(n.url)+'\" target=\"_blank\" rel=\"noopener\">Voir la fiche \u2197<\/a>'\r\n                   : '<span class=\"cm-flink is-empty\">Lien \u00e0 ajouter<\/span>')+\r\n          '<\/div><\/div>';\r\n      });\r\n      fhtml+='<\/div><svg class=\"cm-conn\" data-side=\"r\"><\/svg><\/div>';\r\n    }\r\n    if(i===0) fhtml+='<p class=\"cm-swipehint\">La suite du parcours de la fili\u00e8re est \u00e0 droite \u2192<\/p>';\r\n    fhtml+='<\/section>';\r\n  });\r\n  fhtml+='<\/div>';\r\n  flowEl.innerHTML=fhtml;\r\n\r\n  var panneaux=flowEl.querySelectorAll(\".cm-panel\");\r\n  fSteps.forEach(function(st,i){\r\n    st.cards=panneaux[i].querySelector(\".cm-cards\");\r\n    st.svgL =panneaux[i].querySelector('.cm-conn[data-side=\"l\"]');\r\n    st.svgR =panneaux[i].querySelector('.cm-conn[data-side=\"r\"]');\r\n  });\r\n  nodes.forEach(function(n){ fEls[n.id]=flowEl.querySelector('[id=\"cm-f-'+n.id+'\"]'); });\r\n  fSocle=flowEl.querySelector(\"#cm-f-socle\");\r\n  fBar=flowEl.querySelector(\"#cm-fbar\");\r\n  fBarTxt=flowEl.querySelector(\"#cm-fbar-t\");\r\n\r\n  var track=flowEl.querySelector(\"#cm-track\"), dotsBox=flowEl.querySelector(\"#cm-dots\"),\r\n      prevB=flowEl.querySelector(\"#cm-prev\"), nextB=flowEl.querySelector(\"#cm-next\"), idx=0;\r\n  fSteps.forEach(function(st,i){\r\n    var d=document.createElement(\"button\");\r\n    d.type=\"button\"; d.className=\"cm-dot\"; d.setAttribute(\"aria-label\",st.label);\r\n    d.addEventListener(\"click\",function(){ goTo(i); });\r\n    dotsBox.appendChild(d); fDots.push(d);\r\n  });\r\n  function place(dx){\r\n    track.style.transform=\"translateX(calc(\"+(-idx*100)+\"% + \"+(dx||0)+\"px))\";\r\n  }\r\n  function goTo(i){\r\n    idx=Math.max(0,Math.min(fSteps.length-1,i));\r\n    track.classList.add(\"is-anim\"); place(0);\r\n    prevB.disabled=(idx===0); nextB.disabled=(idx===fSteps.length-1);\r\n    fDots.forEach(function(d,j){ d.classList.toggle(\"is-now\",j===idx); });\r\n  }\r\n  prevB.addEventListener(\"click\",function(){ goTo(idx-1); });\r\n  nextB.addEventListener(\"click\",function(){ goTo(idx+1); });\r\n\r\n  \/* balayage horizontal, avec le m\u00eame seuil que le sch\u00e9ma pour ne pas manger les clics *\/\r\n  var t0=null, tdx=0, tmoved=false;\r\n  track.addEventListener(\"pointerdown\",function(e){\r\n    if(e.button!==0) return;\r\n    t0={x:e.clientX,y:e.clientY,id:e.pointerId}; tdx=0; tmoved=false;\r\n    track.classList.remove(\"is-anim\");\r\n  });\r\n  track.addEventListener(\"pointermove\",function(e){\r\n    if(!t0||e.pointerId!==t0.id) return;\r\n    var dx=e.clientX-t0.x, dy=e.clientY-t0.y;\r\n    if(!tmoved){\r\n      if(Math.abs(dx)<8 || Math.abs(dx)<Math.abs(dy)) return;   \/* d\u00e9filement vertical prioritaire *\/\r\n      tmoved=true; track.classList.add(\"is-drag\");\r\n      try{ track.setPointerCapture(e.pointerId); }catch(err){}\r\n    }\r\n    tdx=dx; place(dx);\r\n  });\r\n  [\"pointerup\",\"pointercancel\"].forEach(function(ev){\r\n    track.addEventListener(ev,function(e){\r\n      if(!t0||e.pointerId!==t0.id) return;\r\n      var w=track.getBoundingClientRect().width||1;\r\n      track.classList.remove(\"is-drag\");\r\n      if(tmoved && Math.abs(tdx)>Math.min(70,w*0.18)) goTo(idx+(tdx<0?1:-1));\r\n      else goTo(idx);\r\n      t0=null; setTimeout(function(){ tmoved=false; },0);\r\n    });\r\n  });\r\n\r\n  var GUT=24;\r\n  function connecteurs(){\r\n    if(!fSteps.length || !fSteps[0].cards || flowEl.hasAttribute(\"hidden\")) return;\r\n    var hl=sel?pathOf(sel):null;\r\n\r\n    function couleur(a,b){\r\n      if(!hl) return TH.acc||\"#4472C4\";\r\n      var ok=(a===\"socle\") ? !!hl.n[b] : !!(hl.n[a]&&hl.n[b]);\r\n      return ok?SIGNAL:\"#CBD3DB\";\r\n    }\r\n    function trait(sv,dd,col){\r\n      var q=document.createElementNS(NS,\"path\");\r\n      q.setAttribute(\"d\",dd); q.setAttribute(\"fill\",\"none\");\r\n      q.setAttribute(\"stroke\",col); q.setAttribute(\"stroke-width\",\"1.6\");\r\n      sv.appendChild(q);\r\n    }\r\n    function pointe(sv,x,y,col){\r\n      var q=document.createElementNS(NS,\"path\");\r\n      q.setAttribute(\"d\",\"M\"+(x-6)+\",\"+(y-4)+\" L\"+x+\",\"+y+\" L\"+(x-6)+\",\"+(y+4)+\" z\");\r\n      q.setAttribute(\"fill\",col); sv.appendChild(q);\r\n    }\r\n\r\n    fSteps.forEach(function(st,i){\r\n      var box=st.cards.getBoundingClientRect();\r\n      [st.svgL,st.svgR].forEach(function(sv){\r\n        while(sv.firstChild) sv.removeChild(sv.firstChild);\r\n        sv.setAttribute(\"width\",GUT); sv.setAttribute(\"height\",Math.round(box.height));\r\n        sv.setAttribute(\"viewBox\",\"0 0 \"+GUT+\" \"+Math.round(box.height));\r\n      });\r\n      if(!box.height) return;\r\n\r\n      function milieu(id){\r\n        var el=(id===\"socle\")?fSocle:fEls[id];\r\n        if(!el) return null;\r\n        var r=el.getBoundingClientRect();\r\n        return r.height ? (r.top-box.top+r.height\/2) : null;\r\n      }\r\n      var ids = (st.key===\"socle\") ? [\"socle\"] : st.items.map(function(n){return n.id;});\r\n\r\n      \/* \u00e0 droite : une fl\u00e8che par formation atteignable \u00e0 l'\u00e9tape suivante *\/\r\n      ids.forEach(function(id){\r\n        var suites=(id===\"socle\")\r\n          ? DATA.liens.filter(function(l){return l.de===\"socle\";}).map(function(l){return l.vers;})\r\n          : (down[id]||[]).filter(function(t){ return stepDe[t]>i; });\r\n        var y=milieu(id);\r\n        if(!suites.length || y==null) return;\r\n        trait(st.svgR,\"M0,\"+y+\" H\"+(GUT*0.45),couleur(id,suites[0]));\r\n        suites.forEach(function(t,j){\r\n          var yy=y+(j-(suites.length-1)\/2)*8, col=couleur(id,t);\r\n          trait(st.svgR,\"M\"+(GUT*0.45)+\",\"+y+\" L\"+(GUT-7)+\",\"+yy,col);\r\n          pointe(st.svgR,GUT-1,yy,col);\r\n        });\r\n      });\r\n\r\n      \/* \u00e0 gauche : les arriv\u00e9es d'une m\u00eame origine sont r\u00e9unies en une fl\u00e8che *\/\r\n      if(i>0){\r\n        var groupes={};\r\n        ids.forEach(function(id){\r\n          var srcs=(up[id]||[]).filter(function(s){ return stepDe[s]<i; });\r\n          if(ancre[id] && stepDe[\"socle\"]!==undefined && stepDe[\"socle\"]<i) srcs.push(\"socle\");\r\n          srcs.forEach(function(s){ (groupes[s]=groupes[s]||[]).push(id); });\r\n        });\r\n        Object.keys(groupes).forEach(function(s){\r\n          var ys=[];\r\n          groupes[s].forEach(function(id){ var y=milieu(id); if(y!=null) ys.push(y); });\r\n          if(!ys.length) return;\r\n          var mn=Math.min.apply(null,ys), mx=Math.max.apply(null,ys),\r\n              col=couleur(s,groupes[s][0]);\r\n          trait(st.svgL,\"M0,\"+((mn+mx)\/2)+\" H\"+(GUT*0.5),col);\r\n          if(mx-mn>1) trait(st.svgL,\"M\"+(GUT*0.5)+\",\"+mn+\" V\"+mx,col);\r\n          ys.forEach(function(y){\r\n            trait(st.svgL,\"M\"+(GUT*0.5)+\",\"+y+\" H\"+(GUT-7),col);\r\n            pointe(st.svgL,GUT-1,y,col);\r\n          });\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  function fbind(el,id){\r\n    if(!el) return;\r\n    el.addEventListener(\"click\",function(e){\r\n      if(tmoved) return;                      \/* c'\u00e9tait un balayage *\/\r\n      if(e.target.closest(\"a\")) return;\r\n      var go=e.target.closest(\"[data-go]\");\r\n      if(go){ var t=go.getAttribute(\"data-go\"); sel=t; refresh(); goTo(stepOf(t)); return; }\r\n      sel=(sel===id)?null:id; refresh();\r\n    });\r\n    el.addEventListener(\"keydown\",function(e){\r\n      if(e.key===\"Enter\"||e.key===\" \"){ e.preventDefault(); sel=(sel===id)?null:id; refresh(); }\r\n    });\r\n  }\r\n  nodes.forEach(function(n){ fbind(fEls[n.id],n.id); });\r\n  fbind(fSocle,\"socle\");\r\n  flowEl.querySelector(\"#cm-fbar-r\").addEventListener(\"click\",function(){ sel=null; refresh(); });\r\n  goTo(0);\r\n\r\n  \/* \u2014 bascule sch\u00e9ma \/ niveaux \u2014 *\/\r\n  var tg=root.querySelector(\"#cm-toggle\"), hintEl=root.querySelector(\".cm-hint\");\r\n  function setMode(isFlow){\r\n    stage.style.display=isFlow?\"none\":\"\";\r\n    if(isFlow){ flowEl.removeAttribute(\"hidden\"); } else { flowEl.setAttribute(\"hidden\",\"\"); }\r\n    tg.textContent=isFlow?\"Vue sch\u00e9ma\":\"Vue \u00e9tape par \u00e9tape\";\r\n    tg.setAttribute(\"aria-pressed\",String(isFlow));\r\n    hintEl.textContent=isFlow\r\n      ? \"Balayez pour changer d'\u00e9tape \u00b7 touchez une formation pour isoler son cursus\"\r\n      : \"Cliquez sur un dipl\u00f4me, ou sur le bandeau Coll\u00e8ge, pour afficher son cursus et le lien vers sa fiche\";\r\n    if(!isFlow) fit(); else connecteurs();\r\n  }\r\n  tg.addEventListener(\"click\",function(){ setMode(flowEl.hasAttribute(\"hidden\")); });\r\n\r\n  setMode(window.innerWidth<=760);      \/* sur petit \u00e9cran, les niveaux d'abord *\/\r\n  refresh();\r\n  window.addEventListener(\"resize\",function(){\r\n    if(stage.style.display!==\"none\") fit(); else connecteurs();\r\n  });\r\n  }\r\n\r\n  function demarrer(){\r\n    var blocs = document.querySelectorAll(\".cursus-map\");\r\n    for(var i=0; i<blocs.length; i++){\r\n      if(blocs[i].getAttribute(\"data-pret\")) continue;\r\n      blocs[i].setAttribute(\"data-pret\",\"1\");\r\n      try { construire(blocs[i], i); }\r\n      catch(e){ console.error(\"Carte des cursus :\", e); }\r\n    }\r\n  }\r\n  if(document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", demarrer);\r\n  else demarrer();\r\n})();\r\n<\/script><div class=\"cursus-map\"><script type=\"application\/json\">{\r\n  \"theme\": {\r\n    \"acc\": \"#4472C4\",\r\n    \"accD\": \"#2F5597\"\r\n  },\r\n  \"socle\": \"Coll\u00e8ge\",\r\n  \"niveaux\": [\r\n    {\r\n      \"id\": \"n3\",\r\n      \"label\": \"Niveau 3\"\r\n    },\r\n    {\r\n      \"id\": \"n4\",\r\n      \"label\": \"Niveau 4\"\r\n    }\r\n  ],\r\n  \"types\": {\r\n    \"direct\": {\r\n      \"label\": \"Acc\u00e8s direct\",\r\n      \"couleur\": \"#4472C4\",\r\n      \"trait\": \"2 3\"\r\n    },\r\n    \"passerelle\": {\r\n      \"label\": \"Passerelle (la formation passe \u00e0 1 an)\",\r\n      \"couleur\": \"#1B1B1B\",\r\n      \"trait\": \"8 6\",\r\n      \"fleche\": false,\r\n      \"symetrique\": true\r\n    }\r\n  },\r\n  \"diplomes\": [\r\n    {\r\n      \"id\": \"cap-carrossier\",\r\n      \"sigle\": \"CAP\",\r\n      \"label\": \"Carrossier automobile\",\r\n      \"niveau\": \"n3\",\r\n      \"col\": 0,\r\n      \"rang\": 0,\r\n      \"duree\": \"2 ans\",\r\n      \"url\": \"\/cap-reparation-des-carrosseries\/\"\r\n    },\r\n    {\r\n      \"id\": \"cap-peintre\",\r\n      \"sigle\": \"CAP\",\r\n      \"label\": \"Peintre automobile\",\r\n      \"niveau\": \"n3\",\r\n      \"col\": 2,\r\n      \"rang\": 0,\r\n      \"duree\": \"2 ans\",\r\n      \"url\": \"\/cap-peinture-en-carrosserie\/\"\r\n    },\r\n    {\r\n      \"id\": \"tfp-carr-peint\",\r\n      \"sigle\": \"TFP\",\r\n      \"label\": \"Carrossier peintre\",\r\n      \"niveau\": \"n4\",\r\n      \"col\": 1,\r\n      \"rang\": 0,\r\n      \"duree\": \"2 ans\",\r\n      \"url\": \"\/titre-professionnel-carrossier-peintre\/\"\r\n    }\r\n  ],\r\n  \"liens\": [\r\n    {\r\n      \"de\": \"socle\",\r\n      \"vers\": \"cap-carrossier\",\r\n      \"type\": \"direct\"\r\n    },\r\n    {\r\n      \"de\": \"socle\",\r\n      \"vers\": \"cap-peintre\",\r\n      \"type\": \"direct\"\r\n    },\r\n    {\r\n      \"de\": \"cap-carrossier\",\r\n      \"vers\": \"tfp-carr-peint\",\r\n      \"type\": \"direct\"\r\n    },\r\n    {\r\n      \"de\": \"cap-peintre\",\r\n      \"vers\": \"tfp-carr-peint\",\r\n      \"type\": \"direct\"\r\n    },\r\n    {\r\n      \"de\": \"cap-carrossier\",\r\n      \"vers\": \"cap-peintre\",\r\n      \"type\": \"passerelle\"\r\n    }\r\n  ],\r\n  \"abrev\": {\r\n    \"CAP\": \"Certificat d'Aptitude Professionnelle\",\r\n    \"BP\": \"Brevet Professionnel\",\r\n    \"BAC PRO\": \"Baccalaur\u00e9at Professionnel\",\r\n    \"CS\": \"Certificat de sp\u00e9cialisation\",\r\n    \"TFP\": \"Titre \u00e0 Finalit\u00e9 Professionnelle\",\r\n    \"CQP\": \"Certificat de Qualification Professionnelle\",\r\n    \"BTM\": \"Brevet Technique des M\u00e9tiers\",\r\n    \"BTS\": \"Brevet de Technicien Sup\u00e9rieur\"\r\n  }\r\n}<\/script><\/div>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Le carrossier ou le carrossier peintre identifie les \u00e9l\u00e9ments \u00e0 r\u00e9parer ou \u00e0 changer, ou les imperfections \u00e0 gommer. Il remet en \u00e9tat ce qui peut l\u2019\u00eatre ou remplace les \u00e9l\u00e9ments trop endommag\u00e9s. Il effectue \u00e9galement des travaux sur la structure du v\u00e9hicule, r\u00e9alise des contr\u00f4les. Il peut aider \u00e0 la confection de teintes de&hellip;&nbsp;<a href=\"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/parcours-de-formation-carrosserie-et-peinture-automobile\/\" rel=\"bookmark\">Read More &raquo;<span class=\"screen-reader-text\">Carrosserie et peinture automobile, parcours de formation<\/span><\/a><\/p>","protected":false},"author":8,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"editor_plus_copied_stylings":"{}","neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","neve_meta_reading_time":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-5691","page","type-page","status-publish","hentry"],"featured_image_urls_v2":{"full":"","thumbnail":"","medium":"","medium_large":"","large":"","1536x1536":"","2048x2048":"","trp-custom-language-flag":"","neve-blog":"","woocommerce_thumbnail":"","woocommerce_single":"","woocommerce_gallery_thumbnail":"","awb_sm":"","awb_md":"","awb_lg":"","awb_xl":""},"post_excerpt_stackable_v2":"<p>Le carrossier ou le carrossier peintre identifie les \u00e9l\u00e9ments \u00e0 r\u00e9parer ou \u00e0 changer, ou les imperfections \u00e0 gommer. Il remet en \u00e9tat ce qui peut l\u2019\u00eatre ou remplace les \u00e9l\u00e9ments trop endommag\u00e9s. Il effectue \u00e9galement des travaux sur la structure du v\u00e9hicule, r\u00e9alise des contr\u00f4les. Il peut aider \u00e0 la confection de teintes de v\u00e9hicules. Voici un sch\u00e9ma repr\u00e9sentant les formations dipl\u00f4mantes de la fili\u00e8re carrosserie au sein du CFA Europ\u00e9en Louis Prioux de Bar-Le-Duc.<\/p>\n","category_list_v2":"","author_info_v2":{"name":"Benjamin CORDIER","url":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/author\/admin_site_2\/"},"comments_num_v2":"0 comments","_links":{"self":[{"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/pages\/5691","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/comments?post=5691"}],"version-history":[{"count":2,"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/pages\/5691\/revisions"}],"predecessor-version":[{"id":5715,"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/pages\/5691\/revisions\/5715"}],"wp:attachment":[{"href":"https:\/\/www.cfa-europeen-louis-prioux.fr\/en\/wp-json\/wp\/v2\/media?parent=5691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}