{"id":3008,"date":"2022-10-23T14:28:22","date_gmt":"2022-10-23T12:28:22","guid":{"rendered":"https:\/\/cadetsgendarmerie01.fr\/?page_id=3008"},"modified":"2026-10-17T17:57:17","modified_gmt":"2026-10-17T15:57:17","slug":"vie-promotions","status":"publish","type":"page","link":"https:\/\/cadetsgendarmerie01.fr\/index.php\/vie-promotions\/","title":{"rendered":"La vie des Promotions"},"content":{"rendered":"<div data-colibri-id=\"3008-c1\" class=\"style-4360 style-local-3008-c1 position-relative\">\n  <!---->\n  <div data-colibri-component=\"section\" data-colibri-id=\"3008-c2\" id=\"initial-content\" class=\"h-section h-section-global-spacing d-flex align-items-lg-center align-items-md-center align-items-center style-4361 style-local-3008-c2 position-relative\">\n    <!---->\n    <!---->\n    <div class=\"h-section-grid-container h-section-boxed-container\">\n      <!---->\n      <div data-colibri-id=\"3008-c3\" class=\"h-row-container gutters-row-lg-2 gutters-row-md-2 gutters-row-0 gutters-row-v-lg-2 gutters-row-v-md-2 gutters-row-v-2 style-4365 style-local-3008-c3 position-relative\">\n        <!---->\n        <div class=\"h-row justify-content-lg-center justify-content-md-center justify-content-center align-items-lg-stretch align-items-md-stretch align-items-stretch gutters-col-lg-2 gutters-col-md-2 gutters-col-0 gutters-col-v-lg-2 gutters-col-v-md-2 gutters-col-v-2\">\n          <!---->\n          <div class=\"h-column h-column-container d-flex h-col-lg-auto h-col-md-auto h-col-auto style-4366-outer style-local-3008-c4-outer\">\n            <div data-colibri-id=\"3008-c4\" class=\"d-flex h-flex-basis h-column__inner h-px-lg-2 h-px-md-2 h-px-2 v-inner-lg-2 v-inner-md-2 v-inner-2 style-4366 style-local-3008-c4 position-relative\">\n              <!---->\n              <!---->\n              <div class=\"w-100 h-y-container h-column__content h-column__v-align flex-basis-100 align-self-lg-start align-self-md-start align-self-start\">\n                <!---->\n                <div data-colibri-id=\"3008-c5\" class=\"style-4367 style-local-3008-c5 position-relative h-element\">\n                  <!---->\n                  <div class=\"\">\n                    <section class=\"promos-a1\">\n\n                      <header class=\"head\">\n                        <h1>La vie des promotions<\/h1>\n                      <\/header>\n\n                      <!-- Carte frise -->\n                      <div class=\"timeline-card\" aria-label=\"Frise des promotions\">\n                        <button class=\"nav prev\" aria-label=\"Promotion pr\u00e9c\u00e9dente\" disabled=\"\">\u2039<\/button>\n\n                        <div class=\"timeline\">\n                          <!-- HORIZONTAL (desktop) -->\n                          <div class=\"rail rail--h\"><\/div>\n                          <div class=\"progress progress--h\"><\/div>\n\n                          <!-- NODES -->\n                          <div class=\"nodes\" role=\"tablist\" aria-orientation=\"horizontal\">\n                            <!-- 2021\/2022 -->\n                            <button class=\"node\" role=\"tab\" aria-selected=\"false\" data-id=\"2021-2022\" data-year=\"2021\" data-title=\"Promotion 2021\/2022 \u00ab ROUSSET Roger \u00bb\" data-link=\"https:\/\/cadetsgendarmerie01.fr\/index.php\/promo-rr\/\" data-img=\"https:\/\/cadetsgendarmerie01.fr\/wp-content\/uploads\/2022\/02\/Roger-ROUSSET.png\">\n                              <span class=\"dot\" aria-hidden=\"true\"><i><\/i><\/span>\n                              <div class=\"pill\">\n                                <span class=\"name\">ROUSSET Roger<\/span>\n                                <span class=\"badge yr\">2021<\/span>\n                              <\/div>\n                              <div class=\"detail-inline\" aria-hidden=\"true\"><\/div>\n                            <\/button>\n\n                            <!-- 2022\/2023 -->\n                            <button class=\"node\" role=\"tab\" aria-selected=\"false\" data-id=\"2022-2023\" data-year=\"2022\" data-title=\"Promotion 2022\/2023 \u00ab GUY Jean-Marie \u00bb\" data-link=\"https:\/\/cadetsgendarmerie01.fr\/index.php\/promo-gjm\/\" data-img=\"https:\/\/cadetsgendarmerie01.fr\/wp-content\/uploads\/2022\/10\/Portrait-GUY-Jean-Marie.png\">\n                              <span class=\"dot\" aria-hidden=\"true\"><i><\/i><\/span>\n                              <div class=\"pill\">\n                                <span class=\"name\">GUY Jean-Marie<\/span>\n                                <span class=\"badge yr\">2022<\/span>\n                              <\/div>\n                              <div class=\"detail-inline\" aria-hidden=\"true\"><\/div>\n                            <\/button>\n\n                            <!-- 2023\/2024 -->\n                            <button class=\"node\" role=\"tab\" aria-selected=\"false\" data-id=\"2023-2024\" data-year=\"2023\" data-title=\"Promotion 2023\/2024 \u00ab BERTRAND Beno\u00eet \u00bb\" data-link=\"https:\/\/cadetsgendarmerie01.fr\/index.php\/promo-bb\/\" data-img=\"https:\/\/cadetsgendarmerie01.fr\/wp-content\/uploads\/2023\/08\/Adjudant-BERTRAND-Benoit.png\">\n                              <span class=\"dot\" aria-hidden=\"true\"><i><\/i><\/span>\n                              <div class=\"pill\">\n                                <span class=\"name\">BERTRAND Beno\u00eet<\/span>\n                                <span class=\"badge yr\">2023<\/span>\n                              <\/div>\n                              <div class=\"detail-inline\" aria-hidden=\"true\"><\/div>\n                            <\/button>\n\n                            <!-- 2024\/2025 -->\n                            <button class=\"node\" role=\"tab\" aria-selected=\"false\" data-id=\"2024-2025\" data-year=\"2024\" data-title=\"Promotion 2024\/2025 \u00ab LEMESRE Marcel \u00bb\" data-link=\"https:\/\/cadetsgendarmerie01.fr\/index.php\/promo-lm\/\" data-img=\"https:\/\/cadetsgendarmerie01.fr\/wp-content\/uploads\/2024\/10\/Image-GEND-Marcel-LEMESRE.png\">\n                              <span class=\"dot\" aria-hidden=\"true\"><i><\/i><\/span>\n                              <div class=\"pill\">\n                                <span class=\"name\">LEMESRE Marcel<\/span>\n                                <span class=\"badge yr\">2024<\/span>\n                              <\/div>\n                              <div class=\"detail-inline\" aria-hidden=\"true\"><\/div>\n                            <\/button>\n\n                            <!-- 2025\/2026 -->\n                            <button class=\"node\" role=\"tab\" aria-selected=\"false\" data-id=\"2025-2026\" data-year=\"2025\" data-title=\"Promotion 2025\/2026 \u00ab ROLLOT Andr\u00e9 \u00bb\" data-link=\"https:\/\/cadetsgendarmerie01.fr\/index.php\/promo-ra\/\" data-img=\"https:\/\/cadetsgendarmerie01.fr\/wp-content\/uploads\/2025\/08\/cropped-Portrait-gendarme-Andre-ROLLOT.png\">\n                              <span class=\"dot\" aria-hidden=\"true\"><i><\/i><\/span>\n                              <div class=\"pill\">\n                                <span class=\"name\">ROLLOT Andr\u00e9<\/span>\n                                <span class=\"badge yr\">2025<\/span>\n                              <\/div>\n                              <div class=\"detail-inline\" aria-hidden=\"true\"><\/div>\n                            <\/button>\n\n                            <!-- 2026\/2027 -->\n                            <button class=\"node\" role=\"tab\" aria-selected=\"false\" data-id=\"2026-2027\" data-year=\"2026\" data-title=\"Promotion 2026\/2027 \u00ab APPRIOU Marcel \u00bb\" data-link=\"https:\/\/cadetsgendarmerie01.fr\/index.php\/promo-am\/\" data-img=\"https:\/\/cadetsgendarmerie01.fr\/wp-content\/uploads\/2026\/10\/GEND-Marcel-APPRIOU-logo-cadets.png\">\n                              <span class=\"dot\" aria-hidden=\"true\"><i><\/i><\/span>\n                              <div class=\"pill\">\n                                <span class=\"name\">APPRIOU Marcel<\/span>\n                                <span class=\"badge yr\">2026<\/span>\n                              <\/div>\n                              <div class=\"detail-inline\" aria-hidden=\"true\"><\/div>\n                            <\/button>\n                          <\/div>\n                        <\/div>\n\n                        <button class=\"nav next\" aria-label=\"Promotion suivante\">\u203a<\/button>\n                      <\/div>\n\n                      <!-- D\u00e9tail (desktop) -->\n                      <div class=\"detail\" aria-live=\"polite\">\n                        <div class=\"fallback\">S\u00e9lectionnez une promotion pour voir le d\u00e9tail.<\/div>\n                      <\/div>\n\n                    <\/section>\n\n                    <style>\n                      :root {\n                        --blue: #0B2B55;\n                        --red: #FF0000;\n                        --ink: #0f172a;\n                        --rail: #dbe3ee;\n                        --card: #ffffff;\n                        --bg: #f6f9fc;\n                        --radius: 16px;\n                        --shadow: 0 18px 40px rgba(13, 38, 76, .10);\n                      }\n\n                      .promos-a1 {\n                        color: var(--ink);\n                        font-size: 18px;\n                        line-height: 1.6;\n                        background: linear-gradient(180deg, #fff, var(--bg));\n                        padding-bottom: 8px;\n                      }\n\n                      .head {\n                        text-align: center;\n                        max-width: 980px;\n                        margin: 0 auto 14px;\n                        padding: 0 12px;\n                      }\n\n                      .head h1 {\n                        margin: 0 0 6px;\n                        color: var(--blue);\n                        font-size: clamp(28px, 4vw, 44px);\n                        font-weight: 800;\n                      }\n\n                      \/* ====== FRise \u2013 carte ====== *\/\n\n                      .timeline-card {\n                        max-width: 1180px;\n                        margin: 8px auto 22px;\n                        padding: 24px 18px;\n                        background: var(--card);\n                        border: 1px solid #edf2f7;\n                        border-radius: var(--radius);\n                        box-shadow: var(--shadow);\n                        display: grid;\n                        grid-template-columns: 48px 1fr 48px;\n                        align-items: center;\n                        gap: 6px;\n                      }\n\n                      .nav {\n                        width: 44px;\n                        height: 44px;\n                        border-radius: 999px;\n                        border: 1px solid #e7eef6;\n                        background: #fff;\n                        display: grid;\n                        place-items: center;\n                        font-size: 22px;\n                        font-weight: 900;\n                        color: var(--blue);\n                        box-shadow: 0 10px 24px rgba(0, 0, 0, .08);\n                        cursor: pointer;\n                        transition: transform .15s ease, box-shadow .2s ease, opacity .2s ease;\n                      }\n\n                      .nav[disabled] {\n                        opacity: .35;\n                        cursor: not-allowed;\n                        box-shadow: none;\n                      }\n\n                      .nav:hover:not([disabled]) {\n                        transform: translateY(-1px);\n                        box-shadow: 0 12px 28px rgba(0, 0, 0, .12);\n                      }\n\n                      \/* ====== Desktop: horizontal ====== *\/\n\n                      .timeline {\n                        position: relative;\n                      }\n\n                      .rail--h {\n                        position: absolute;\n                        left: 0;\n                        right: 0;\n                        top: 54px;\n                        height: 3px;\n                        background: var(--rail);\n                        border-radius: 2px;\n                        z-index: 0;\n                      }\n\n                      .progress--h {\n                        position: absolute;\n                        left: 0;\n                        top: 54px;\n                        height: 3px;\n                        width: 0px;\n                        background: var(--blue);\n                        border-radius: 2px;\n                        z-index: 1;\n                      }\n\n                      .nodes {\n                        position: relative;\n                        z-index: 2;\n                        display: flex;\n                        justify-content: space-between;\n                        align-items: flex-start;\n                        gap: 24px;\n                        padding: 0 6px;\n                      }\n\n                      .node {\n                        position: relative;\n                        background: none;\n                        border: 0;\n                        padding: 0;\n                        cursor: pointer;\n                        font: inherit;\n                        text-align: left;\n                      }\n\n                      .node:focus-visible {\n                        outline: 3px solid #cfe3ff;\n                        outline-offset: 6px;\n                        border-radius: 8px;\n                      }\n\n                      \/* Desktop look (chips flottantes) *\/\n\n                      .pill {\n                        display: none;\n                      }\n\n                      \/* on n\u2019affiche pas les pills en desktop *\/\n\n                      .node .dot {\n                        position: relative;\n                        margin-top: 43px;\n                        width: 22px;\n                        height: 22px;\n                        border-radius: 50%;\n                        background: #fff;\n                        border: 3px solid var(--blue);\n                        box-shadow: 0 0 0 3px #fff;\n                        display: grid;\n                        place-items: center;\n                        transition: transform .25s, border-color .2s, background .2s;\n                      }\n\n                      .dot i {\n                        width: 8px;\n                        height: 8px;\n                        border-radius: 50%;\n                        background: transparent;\n                        transition: background .2s, transform .2s;\n                        display: block;\n                      }\n\n                      .node.is-done .dot i {\n                        background: var(--blue);\n                        transform: scale(1.05);\n                      }\n\n                      .node.is-active .dot {\n                        border-color: var(--red);\n                        background: #fff;\n                        transform: scale(1.12);\n                      }\n\n                      .node.is-active .dot i {\n                        background: var(--red);\n                      }\n\n                      \/* D\u00e9tail (desktop) *\/\n\n                      .detail {\n                        max-width: 1180px;\n                        margin: 12px auto 28px;\n                        padding: 0 8px;\n                      }\n\n                      .card {\n                        display: grid;\n                        grid-template-columns: 1.25fr 2fr;\n                        gap: 18px;\n                        background: var(--card);\n                        border: 1px solid #edf2f7;\n                        border-radius: var(--radius);\n                        box-shadow: var(--shadow);\n                        padding: 18px;\n                      }\n\n                      .card .media {\n                        width: 100%;\n                        background: #fff;\n                        border: 1px solid #edf2f7;\n                        border-radius: 14px;\n                        padding: 10px;\n                        display: grid;\n                        place-items: center;\n                      }\n\n                      .card .media img {\n                        width: 100%;\n                        height: clamp(240px, 26vw, 360px);\n                        object-fit: contain;\n                        border-radius: 10px;\n                        background: #fff;\n                      }\n\n                      .card h2 {\n                        margin: 2px 0 4px;\n                        color: var(--blue);\n                        font-size: clamp(22px, 3.2vw, 32px);\n                        font-weight: 800;\n                      }\n\n                      .actions {\n                        margin-top: 14px;\n                        display: flex;\n                        gap: 12px;\n                        flex-wrap: wrap;\n                      }\n\n                      .btn {\n                        display: inline-flex;\n                        align-items: center;\n                        gap: 10px;\n                        background: var(--blue);\n                        color: #fff;\n                        text-decoration: none;\n                        font-weight: 900;\n                        padding: 12px 20px;\n                        border-radius: 999px;\n                        border: 2px solid transparent;\n                        box-shadow: 0 12px 28px rgba(11, 43, 85, .18);\n                        transition: transform .15s ease, background .15s ease;\n                      }\n\n                      .btn:hover {\n                        background: #143a6b;\n                        transform: translateY(-1px);\n                      }\n\n                      .tag {\n                        display: inline-flex;\n                        align-items: center;\n                        background: #fff5f5;\n                        color: var(--red);\n                        border: 1px solid #ffd7d7;\n                        border-radius: 999px;\n                        padding: 8px 12px;\n                        font-weight: 800;\n                      }\n\n                      \/* ====== Mobile: vertical \u00e9l\u00e9gant ====== *\/\n\n                      @media (max-width:820px) {\n                        .rail--h,\n                        .progress--h {\n                          display: none;\n                        }\n                        .timeline-card {\n                          grid-template-columns: 40px 1fr 40px;\n                          padding: 18px 12px;\n                        }\n                        .nodes {\n                          display: block;\n                          padding: 4px 8px 4px 24px;\n                          \/* marge pour la ligne *\/\n                        }\n                        \/* Ligne verticale *\/\n                        .nodes::before {\n                          content: \"\";\n                          position: absolute;\n                          left: 30px;\n                          top: 10px;\n                          bottom: 10px;\n                          width: 3px;\n                          background: var(--rail);\n                          border-radius: 2px;\n                        }\n                        .node {\n                          display: grid;\n                          grid-template-columns: 52px 1fr;\n                          gap: 10px;\n                          align-items: center;\n                          padding: 6px 2px 14px 0;\n                          width: 100%;\n                        }\n                        .node+.node {\n                          margin-top: 10px;\n                        }\n                        \/* Pastille align\u00e9e sur la ligne *\/\n                        .node .dot {\n                          grid-column: 1;\n                          justify-self: center;\n                          width: 22px;\n                          height: 22px;\n                          margin: 0;\n                          border-radius: 50%;\n                          background: #fff;\n                          border: 3px solid var(--blue);\n                          box-shadow: 0 0 0 3px #fff;\n                        }\n                        .node.is-done .dot i {\n                          background: var(--blue);\n                          transform: scale(1.05);\n                        }\n                        .node.is-active .dot {\n                          border-color: var(--red);\n                        }\n                        .node.is-active .dot i {\n                          background: var(--red);\n                        }\n                        \/* PILL propre : nom + badge ann\u00e9e *\/\n                        .pill {\n                          grid-column: 2;\n                          position: relative;\n                          display: flex;\n                          align-items: center;\n                          justify-content: space-between;\n                          gap: 12px;\n                          width: 100%;\n                          background: #fff;\n                          border: 1px solid #e6edf7;\n                          border-radius: 999px;\n                          padding: 12px 16px;\n                          box-shadow: 0 6px 18px rgba(13, 38, 76, .08);\n                        }\n                        .pill .name {\n                          font-weight: 900;\n                          color: var(--blue);\n                          letter-spacing: .2px;\n                        }\n                        .pill .badge {\n                          display: inline-block;\n                          font-weight: 800;\n                          font-size: 13px;\n                          padding: 6px 10px;\n                          border-radius: 999px;\n                          background: #eef3ff;\n                          color: var(--blue);\n                          border: 1px solid #d9e4ff;\n                        }\n                        .node.is-active .pill {\n                          background: var(--red);\n                          border-color: #ffbcbc;\n                          box-shadow: 0 10px 24px rgba(255, 0, 0, .18);\n                        }\n                        .node.is-active .pill .name {\n                          color: #fff;\n                        }\n                        .node.is-active .pill .badge {\n                          background: #fff;\n                          color: var(--red);\n                          border-color: #ffe1e1;\n                        }\n                        \/* D\u00e9tail inline sous l\u2019item actif *\/\n                        .detail {\n                          display: none;\n                        }\n                        \/* on n\u2019utilise plus la zone globale en mobile *\/\n                        .detail-inline {\n                          grid-column: 2;\n                          display: none;\n                          margin-top: 10px;\n                        }\n                        .detail-inline .card {\n                          grid-template-columns: 1fr;\n                        }\n                        .detail-inline .media img {\n                          height: clamp(220px, 52vw, 420px);\n                        }\n                      }\n\n                      \/* Petits t\u00e9l\u00e9phones : un peu plus d\u2019air *\/\n\n                      @media (max-width:520px) {\n                        .node {\n                          grid-template-columns: 56px 1fr;\n                        }\n                        .pill {\n                          padding: 14px 18px;\n                        }\n                        .pill .name {\n                          font-size: 16px;\n                        }\n                      }\n\n                      @media (prefers-reduced-motion: reduce) {\n                        .nav,\n                        .btn,\n                        .pill,\n                        .dot {\n                          transition: none !important;\n                        }\n                      }\n                    <\/style>\n\n                    <script>\n                      (function() {\n                        function onReady(fn) {\n                          if (document.readyState !== 'loading') fn();\n                          else document.addEventListener('DOMContentLoaded', fn);\n                        }\n                        onReady(function() {\n                          var root = document.querySelector('.promos-a1');\n                          if (!root) return;\n\n                          var nodesWrap = root.querySelector('.nodes');\n                          var nodeList = nodesWrap.querySelectorAll('.node');\n                          if (!nodeList.length) return;\n                          var nodes = Array.prototype.slice.call(nodeList);\n\n                          \/\/ Tri par ann\u00e9e croissante\n                          nodes.sort(function(a, b) {\n                            return (parseInt(a.getAttribute('data-year')) || 0) - (parseInt(b.getAttribute('data-year')) || 0);\n                          }).forEach(function(n) {\n                            nodesWrap.appendChild(n);\n                          });\n\n                          var progressH = root.querySelector('.progress--h');\n                          var railH = root.querySelector('.rail--h');\n                          var btnPrev = root.querySelector('.prev');\n                          var btnNext = root.querySelector('.next');\n                          var detailGlobal = root.querySelector('.detail');\n                          var fallbackImg = \"https:\/\/cadetsgendarmerie01.fr\/wp-content\/uploads\/2021\/11\/cropped-3EME-JOUR-DU-STAGE-35-scaled-1.jpg\";\n\n                          function renderCard(node) {\n                            var id = node.getAttribute('data-id');\n                            var title = node.getAttribute('data-title') || ('Promotion ' + id);\n                            var link = node.getAttribute('data-link') || '#';\n                            var img = node.getAttribute('data-img') || '';\n                            if (!img.trim()) img = fallbackImg;\n\n                            return '' +\n                              '<article id=\"panel-' + id + '\" class=\"card\" role=\"tabpanel\" tabindex=\"-1\">' +\n                              '<div class=\"media\"><img decoding=\"async\" src=\"' + img + '\" alt=\"\"><\/div>' +\n                              '<div>' +\n                              '<h2>' + title + '<\/h2>' +\n                              '<div class=\"actions\">' +\n                              '<a class=\"btn\" href=\"' + link + '\">Voir la promotion <span aria-hidden=\"true\">\u203a<\/span><\/a>' +\n                              '<span class=\"tag\">Promo ' + id + '<\/span>' +\n                              '<\/div>' +\n                              '<\/div>' +\n                              '<\/article>';\n                          }\n\n                          \/\/ Desktop: progression centre->centre\n                          function updateProgressH(i) {\n                            if (!progressH || !railH) return;\n                            if (window.innerWidth <= 820) {\n                              progressH.style.width = '0px';\n                              return;\n                            }\n                            var railRect = railH.getBoundingClientRect();\n                            var firstRect = nodes[0].querySelector('.dot').getBoundingClientRect();\n                            var actRect = nodes[i].querySelector('.dot').getBoundingClientRect();\n                            var firstCx = firstRect.left + firstRect.width \/ 2;\n                            var actCx = actRect.left + actRect.width \/ 2;\n                            var leftPx = Math.max(0, Math.round(firstCx - railRect.left));\n                            var widthPx = Math.max(0, Math.round(actCx - firstCx));\n                            progressH.style.left = leftPx + 'px';\n                            progressH.style.width = widthPx + 'px';\n                          }\n\n                          function currentIndex() {\n                            for (var k = 0; k < nodes.length; k++) {\n                              if (nodes[k].getAttribute('aria-selected') === 'true') return k;\n                            }\n                            return -1;\n                          }\n\n                          function setNavDisabled(i) {\n                            if (btnPrev) btnPrev.disabled = (i <= 0);\n                            if (btnNext) btnNext.disabled = (i >= nodes.length - 1);\n                          }\n\n                          function selectIndex(i, pushHash) {\n                            if (i < 0) i = 0;\n                            if (i > nodes.length - 1) i = nodes.length - 1;\n\n                            \/\/ Reset d\u00e9tails inline\n                            nodes.forEach(function(n) {\n                              var di = n.querySelector('.detail-inline');\n                              if (di) {\n                                di.style.display = 'none';\n                                di.innerHTML = '';\n                                di.setAttribute('aria-hidden', 'true');\n                              }\n                            });\n\n                            \/\/ \u00c9tats\n                            for (var k = 0; k < nodes.length; k++) {\n                              var n = nodes[k];\n                              n.setAttribute('aria-selected', k === i ? 'true' : 'false');\n                              if (k <= i) n.classList.add('is-done');\n                              else n.classList.remove('is-done');\n                              if (k === i) n.classList.add('is-active');\n                              else n.classList.remove('is-active');\n                            }\n\n                            var prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n                            if (window.innerWidth > 820) {\n                              \/\/ Desktop : d\u00e9tail global\n                              detailGlobal.innerHTML = renderCard(nodes[i]);\n                              try {\n                                nodes[i].scrollIntoView({\n                                  inline: 'center',\n                                  block: 'nearest',\n                                  behavior: prefersReduced ? 'auto' : 'smooth'\n                                });\n                              } catch (e) {}\n                              updateProgressH(i);\n                            } else {\n                              \/\/ Mobile : d\u00e9tail inline\n                              var di = nodes[i].querySelector('.detail-inline');\n                              if (di) {\n                                di.innerHTML = renderCard(nodes[i]);\n                                di.style.display = 'block';\n                                di.setAttribute('aria-hidden', 'false');\n                                setTimeout(function() {\n                                  try {\n                                    di.scrollIntoView({\n                                      block: 'start',\n                                      behavior: prefersReduced ? 'auto' : 'smooth'\n                                    });\n                                  } catch (e) {}\n                                }, 20);\n                              }\n                            }\n\n                            setNavDisabled(i);\n                            if (pushHash) {\n                              try {\n                                history.replaceState(null, '', '#promo-' + nodes[i].getAttribute('data-id'));\n                              } catch (e) {}\n                            }\n                          }\n\n                          \/\/ Clic \/ clavier\n                          if (btnPrev) btnPrev.addEventListener('click', function() {\n                            selectIndex(currentIndex() - 1, true);\n                          });\n                          if (btnNext) btnNext.addEventListener('click', function() {\n                            selectIndex(currentIndex() + 1, true);\n                          });\n                          nodes.forEach(function(n, i) {\n                            n.addEventListener('click', function(e) {\n                              \/\/ \u00e9viter que le clic dans le d\u00e9tail-inline replie tout\n                              if (e.target.closest('.detail-inline')) return;\n                              selectIndex(i, true);\n                            });\n                            n.addEventListener('keydown', function(e) {\n                              var key = e.key || e.keyCode;\n                              if (key === 'ArrowRight' || key === 39) {\n                                e.preventDefault();\n                                selectIndex(i + 1, true);\n                              }\n                              if (key === 'ArrowLeft' || key === 37) {\n                                e.preventDefault();\n                                selectIndex(i - 1, true);\n                              }\n                              if (key === 'Enter' || key === ' ' || key === 13 || key === 32) {\n                                e.preventDefault();\n                                selectIndex(i, true);\n                              }\n                            });\n                          });\n\n                          \/\/ Swipe (mobile) \u2013 sur la carte frise\n                          (function enableSwipe() {\n                            var zone = root.querySelector('.timeline-card');\n                            var startX = null,\n                              startY = null,\n                              swiping = false,\n                              thresh = 40;\n                            zone.addEventListener('touchstart', function(e) {\n                              if (!e.touches || !e.touches[0]) return;\n                              startX = e.touches[0].clientX;\n                              startY = e.touches[0].clientY;\n                              swiping = true;\n                            }, {\n                              passive: true\n                            });\n                            zone.addEventListener('touchend', function(e) {\n                              if (!swiping || !e.changedTouches) return;\n                              var dx = e.changedTouches[0].clientX - startX;\n                              if (Math.abs(dx) > thresh) {\n                                dx < 0 ? selectIndex(currentIndex() + 1, true) : selectIndex(currentIndex() - 1, true);\n                              }\n                              swiping = false;\n                            }, {\n                              passive: true\n                            });\n                          })();\n\n                          \/\/ Init\n                          var hash = (location.hash || '').replace('#promo-', '');\n                          var start = -1;\n                          if (hash) {\n                            for (var j = 0; j < nodes.length; j++) {\n                              if (nodes[j].getAttribute('data-id') === hash) {\n                                start = j;\n                                break;\n                              }\n                            }\n                          }\n                          if (start < 0) {\n                            start = nodes.length - 1;\n                          }\n                          selectIndex(start, !!hash);\n\n                          \/\/ Recalibrage\n                          window.addEventListener('resize', function() {\n                            updateProgressH(currentIndex());\n                          });\n                          nodesWrap.addEventListener('scroll', function() {\n                            updateProgressH(currentIndex());\n                          }, {\n                            passive: true\n                          });\n                        });\n                      })();\n                    <\/script>\n                  <\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>La vie des promotions \u2039 ROUSSET Roger 2021 GUY Jean-Marie 2022 BERTRAND Beno\u00eet 2023 LEMESRE Marcel 2024 ROLLOT Andr\u00e9 2025 APPRIOU Marcel 2026 \u203a S\u00e9lectionnez une promotion pour voir le d\u00e9tail.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/full-width-page.php","meta":{"footnotes":""},"class_list":["post-3008","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/pages\/3008","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/comments?post=3008"}],"version-history":[{"count":9,"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/pages\/3008\/revisions"}],"predecessor-version":[{"id":7147,"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/pages\/3008\/revisions\/7147"}],"wp:attachment":[{"href":"https:\/\/cadetsgendarmerie01.fr\/index.php\/wp-json\/wp\/v2\/media?parent=3008"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}