{"id":563,"date":"2025-10-29T15:38:50","date_gmt":"2025-10-29T14:38:50","guid":{"rendered":"https:\/\/events.circuitpaulricard.com\/?page_id=563"},"modified":"2026-04-02T09:57:20","modified_gmt":"2026-04-02T07:57:20","slug":"plans-et-traces","status":"publish","type":"page","link":"https:\/\/events.circuitpaulricard.com\/en\/accueil\/piste\/organisateur\/plans-et-traces\/","title":{"rendered":"Site Maps &amp; Track Layouts"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"563\" class=\"elementor elementor-563\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c210343 e-con-full e-flex magic-button-disabled-no wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"c210343\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-2080941 e-con-full e-flex magic-button-disabled-no wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"2080941\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4061929 elementor-widget elementor-widget-heading\" data-id=\"4061929\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Plans &amp; trac\u00e9s<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-81877df e-flex e-con-boxed magic-button-disabled-no wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"81877df\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9a4ef3f elementor-widget elementor-widget-html\" data-id=\"9a4ef3f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@300;400;500;600;700&display=swap');\n\n.cpr-docs * { box-sizing: border-box; margin: 0; padding: 0; }\n.cpr-docs { font-family: 'Montserrat', sans-serif; background: #ffffff; width: 100%; }\n\n\/* ---- TOOLBAR ---- *\/\n.cpr-toolbar {\n  display: flex; align-items: center; justify-content: space-between;\n  gap: 16px; flex-wrap: wrap; margin-bottom: 32px;\n}\n.cpr-toolbar-left { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n.cpr-filter-bar { display: flex; gap: 4px; flex-wrap: wrap; }\n.cpr-f-btn {\n  font-family: 'Montserrat', sans-serif; font-size: 10px; font-weight: 600;\n  letter-spacing: 0.14em; text-transform: uppercase; background: transparent;\n  color: #9A9A92; border: 1px solid #D8D6D0; padding: 10px 20px; cursor: pointer;\n  border-radius: 0; display: flex; align-items: center; gap: 8px; transition: all 0.18s ease;\n}\n.cpr-f-btn:hover { color: #1A1A18; border-color: #1A1A18; }\n.cpr-f-btn.active { background: #1A1A18; color: #ffffff; border-color: #1A1A18; }\n.cpr-f-count {\n  font-size: 9px; font-weight: 500; padding: 1px 6px; border-radius: 10px;\n  background: rgba(26,26,24,0.07); color: #9A9A92; transition: all 0.18s ease;\n}\n.cpr-f-btn.active .cpr-f-count { background: rgba(255,255,255,0.18); color: rgba(255,255,255,0.75); }\n.cpr-f-btn:hover:not(.active) .cpr-f-count { background: rgba(26,26,24,0.1); color: #1A1A18; }\n\n\/* Bouton \u00e9diteur *\/\n.cpr-edit-toggle {\n  font-family: 'Montserrat', sans-serif; font-size: 9px; font-weight: 700;\n  letter-spacing: 0.14em; text-transform: uppercase; background: #C8102E;\n  color: #fff; border: none; padding: 10px 16px; cursor: pointer;\n  display: none; align-items: center; gap: 7px; transition: background 0.2s;\n}\n.cpr-edit-toggle:hover { background: #a50d26; }\n.cpr-edit-toggle.visible { display: flex; }\n\n\/* ---- RECHERCHE ---- *\/\n.cpr-search-wrap { position: relative; flex-shrink: 0; }\n.cpr-search-wrap > svg:first-child {\n  position: absolute !important; left: 13px !important; top: 50% !important;\n  transform: translateY(-50%) !important; pointer-events: none !important;\n  opacity: 0.4 !important; z-index: 2 !important;\n}\n.cpr-search {\n  font-family: 'Montserrat', sans-serif !important; font-size: 10px !important;\n  font-weight: 500 !important; letter-spacing: 0em !important; color: #1A1A18 !important;\n  background: #ffffff !important; border: 1px solid #D8D6D0 !important;\n  padding: 10px 32px 10px 40px !important; width: 220px !important;\n  outline: none !important; border-radius: 0 !important; box-shadow: none !important;\n  -webkit-appearance: none !important; appearance: none !important;\n  transition: border-color 0.18s ease, width 0.25s ease !important;\n}\n.cpr-search::placeholder {\n  color: #B0AEA8 !important; font-weight: 400 !important;\n  text-transform: uppercase !important; letter-spacing: 0.06em !important; opacity: 1 !important;\n}\n.cpr-search:focus { border-color: #1A1A18 !important; width: 260px !important; }\n.cpr-search-clear {\n  position: absolute; right: 10px; top: 50%; transform: translateY(-50%);\n  background: none; border: none; cursor: pointer; padding: 2px;\n  display: none; align-items: center; justify-content: center; opacity: 0.4; transition: opacity 0.15s;\n}\n.cpr-search-clear:hover { opacity: 1; }\n.cpr-search-clear.visible { display: flex; }\n\n\/* ---- GRILLE ---- *\/\n.cpr-docs-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n@media (max-width: 900px) { .cpr-docs-grid { grid-template-columns: repeat(2, 1fr); } }\n@media (max-width: 520px) {\n  .cpr-docs-grid { grid-template-columns: 1fr; }\n  .cpr-toolbar { flex-direction: column; align-items: flex-start; }\n  .cpr-search { width: 100% !important; }\n  .cpr-search:focus { width: 100% !important; }\n  .cpr-search-wrap { width: 100%; }\n}\n\n\/* ---- CARTE ---- *\/\n.cpr-doc-card {\n  background: #ffffff; border: 1px solid #E8E6E0; display: flex;\n  flex-direction: column; cursor: pointer; text-decoration: none;\n  color: inherit; transition: border-color 0.2s ease, box-shadow 0.2s ease; border-radius: 0;\n  position: relative;\n}\n.cpr-doc-card:hover { border-color: #1A1A18; box-shadow: 0 4px 24px rgba(26,26,24,0.08); }\n.cpr-doc-preview {\n  width: 100%; aspect-ratio: 4 \/ 3; overflow: hidden;\n  background: #F2F0EB; position: relative;\n}\n.cpr-doc-preview img {\n  width: 100%; height: 100%; object-fit: cover;\n  transition: transform 0.4s ease; display: block;\n}\n.cpr-doc-card:hover .cpr-doc-preview img { transform: scale(1.04); }\n.cpr-doc-placeholder {\n  width: 100%; height: 100%; display: flex;\n  align-items: center; justify-content: center; background: #F2F0EB;\n}\n.cpr-doc-badge {\n  position: absolute; top: 10px; left: 10px;\n  font-family: 'Montserrat', sans-serif; font-size: 8px; font-weight: 700;\n  letter-spacing: 0.16em; text-transform: uppercase;\n  background: #1A1A18; color: #ffffff; padding: 4px 8px;\n}\n.cpr-doc-badge.search-match { background: #C8102E; }\n.cpr-doc-footer {\n  padding: 14px 16px; display: flex; justify-content: space-between;\n  align-items: center; gap: 10px; border-top: 1px solid #F0EEE8;\n}\n.cpr-doc-name {\n  font-family: 'Montserrat', sans-serif; font-size: 12px; font-weight: 600;\n  text-transform: uppercase; letter-spacing: 0.08em; color: #1A1A18; line-height: 1.3;\n}\n.cpr-doc-name mark {\n  background: rgba(200,16,46,0.12); color: #C8102E;\n  font-weight: 700; border-radius: 2px; padding: 0 2px;\n}\n.cpr-doc-open {\n  flex-shrink: 0; width: 26px; height: 26px; border: 1px solid #D8D6D0;\n  display: flex; align-items: center; justify-content: center;\n  transition: background 0.18s ease, border-color 0.18s ease;\n}\n.cpr-doc-card:hover .cpr-doc-open { background: #1A1A18; border-color: #1A1A18; }\n.cpr-doc-card:hover .cpr-doc-open svg path { stroke: #ffffff; }\n\n\/* Bouton supprimer sur la carte (mode \u00e9diteur) *\/\n.cpr-doc-delete {\n  position: absolute; top: 8px; right: 8px; width: 26px; height: 26px;\n  background: #C8102E; border: none; cursor: pointer; display: none;\n  align-items: center; justify-content: center; z-index: 3;\n  transition: background 0.15s;\n}\n.cpr-doc-delete:hover { background: #a50d26; }\n.cpr-editing .cpr-doc-delete { display: flex; }\n.cpr-editing .cpr-doc-card { cursor: default; }\n\n\/* Bouton modifier sur la carte *\/\n.cpr-doc-edit-btn {\n  position: absolute; bottom: 50px; right: 8px; width: 26px; height: 26px;\n  background: #1A1A18; border: none; cursor: pointer; display: none;\n  align-items: center; justify-content: center; z-index: 3;\n  transition: background 0.15s;\n}\n.cpr-doc-edit-btn:hover { background: #333; }\n.cpr-editing .cpr-doc-edit-btn { display: flex; }\n\n\/* ---- PANNEAU LAT\u00c9RAL ---- *\/\n.cpr-panel-overlay {\n  display: none; position: fixed; inset: 0;\n  background: rgba(26,26,24,0.5); z-index: 9998;\n  backdrop-filter: blur(2px);\n}\n.cpr-panel-overlay.open { display: block; }\n\n.cpr-panel {\n  position: fixed; top: 0; right: -480px; width: 440px; height: 100vh;\n  background: #ffffff; z-index: 9999; overflow-y: auto;\n  transition: right 0.3s cubic-bezier(0.22, 1, 0.36, 1);\n  display: flex; flex-direction: column;\n  box-shadow: -8px 0 40px rgba(26,26,24,0.15);\n}\n.cpr-panel.open { right: 0; }\n\n.cpr-panel-header {\n  padding: 24px 28px 20px; border-bottom: 1px solid #F0EEE8;\n  display: flex; align-items: center; justify-content: space-between;\n  position: sticky; top: 0; background: #fff; z-index: 2;\n}\n.cpr-panel-title {\n  font-size: 11px; font-weight: 700; letter-spacing: 0.16em;\n  text-transform: uppercase; color: #1A1A18;\n}\n.cpr-panel-close {\n  width: 32px; height: 32px; background: none; border: 1px solid #E8E6E0;\n  cursor: pointer; display: flex; align-items: center; justify-content: center;\n  transition: background 0.15s, border-color 0.15s;\n}\n.cpr-panel-close:hover { background: #1A1A18; border-color: #1A1A18; }\n.cpr-panel-close:hover svg line { stroke: #fff; }\n\n.cpr-panel-body { padding: 28px; flex: 1; }\n\n\/* Formulaire *\/\n.cpr-form-group { margin-bottom: 20px; }\n.cpr-form-label {\n  display: block; font-size: 9px; font-weight: 700; letter-spacing: 0.16em;\n  text-transform: uppercase; color: #9A9A92; margin-bottom: 8px;\n}\n.cpr-form-input, .cpr-form-select {\n  font-family: 'Montserrat', sans-serif !important; font-size: 11px !important;\n  font-weight: 400 !important; color: #1A1A18 !important;\n  background: #ffffff !important; border: 1px solid #D8D6D0 !important;\n  padding: 10px 14px !important; width: 100% !important;\n  outline: none !important; border-radius: 0 !important;\n  box-shadow: none !important; -webkit-appearance: none !important;\n  appearance: none !important; transition: border-color 0.18s !important;\n}\n.cpr-form-input:focus, .cpr-form-select:focus { border-color: #1A1A18 !important; }\n.cpr-form-input::placeholder { color: #C0BEB8 !important; font-style: italic !important; }\n\n\/* Preview miniature *\/\n.cpr-preview-thumb {\n  width: 100%; height: 80px; background: #F2F0EB;\n  margin-top: 8px; overflow: hidden; display: none;\n}\n.cpr-preview-thumb img { width: 100%; height: 100%; object-fit: cover; }\n.cpr-preview-thumb.visible { display: block; }\n\n.cpr-form-hint {\n  font-size: 9px; color: #B0AEA8; margin-top: 5px; font-weight: 400; font-style: italic;\n}\n\n\/* Boutons formulaire *\/\n.cpr-form-actions { display: flex; gap: 8px; margin-top: 28px; }\n.cpr-btn-save {\n  font-family: 'Montserrat', sans-serif; font-size: 10px; font-weight: 700;\n  letter-spacing: 0.14em; text-transform: uppercase; background: #1A1A18;\n  color: #fff; border: none; padding: 12px 24px; cursor: pointer; flex: 1;\n  transition: background 0.2s;\n}\n.cpr-btn-save:hover { background: #333; }\n.cpr-btn-cancel {\n  font-family: 'Montserrat', sans-serif; font-size: 10px; font-weight: 600;\n  letter-spacing: 0.12em; text-transform: uppercase; background: transparent;\n  color: #9A9A92; border: 1px solid #D8D6D0; padding: 12px 20px; cursor: pointer;\n  transition: all 0.2s;\n}\n.cpr-btn-cancel:hover { color: #1A1A18; border-color: #1A1A18; }\n\n\/* Message statut *\/\n.cpr-status {\n  font-size: 10px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase;\n  padding: 10px 14px; margin-top: 16px; display: none;\n}\n.cpr-status.success { background: rgba(42,122,74,0.1); color: #2A7A4A; display: block; }\n.cpr-status.error { background: rgba(200,16,46,0.1); color: #C8102E; display: block; }\n\n\/* S\u00e9parateur *\/\n.cpr-panel-sep {\n  border: none; border-top: 1px solid #F0EEE8; margin: 24px 0;\n}\n\n\/* Liste documents dans panneau *\/\n.cpr-panel-list { display: flex; flex-direction: column; gap: 8px; }\n.cpr-panel-item {\n  display: flex; align-items: center; gap: 10px; padding: 10px 12px;\n  border: 1px solid #E8E6E0; transition: border-color 0.15s;\n}\n.cpr-panel-item:hover { border-color: #C0BEB8; }\n.cpr-panel-item-thumb {\n  width: 48px; height: 36px; background: #F2F0EB;\n  overflow: hidden; flex-shrink: 0;\n}\n.cpr-panel-item-thumb img { width: 100%; height: 100%; object-fit: cover; }\n.cpr-panel-item-info { flex: 1; min-width: 0; }\n.cpr-panel-item-name {\n  font-size: 10px; font-weight: 600; text-transform: uppercase;\n  letter-spacing: 0.08em; color: #1A1A18; white-space: nowrap;\n  overflow: hidden; text-overflow: ellipsis;\n}\n.cpr-panel-item-cat {\n  font-size: 8px; font-weight: 500; letter-spacing: 0.12em;\n  text-transform: uppercase; color: #9A9A92; margin-top: 2px;\n}\n.cpr-panel-item-actions { display: flex; gap: 4px; flex-shrink: 0; }\n.cpr-panel-item-btn {\n  width: 26px; height: 26px; border: 1px solid #E8E6E0; background: none;\n  cursor: pointer; display: flex; align-items: center; justify-content: center;\n  transition: all 0.15s;\n}\n.cpr-panel-item-btn:hover { background: #1A1A18; border-color: #1A1A18; }\n.cpr-panel-item-btn:hover svg * { stroke: #fff; fill: #fff; }\n.cpr-panel-item-btn.del:hover { background: #C8102E; border-color: #C8102E; }\n\n\/* Empty *\/\n.cpr-empty {\n  grid-column: 1 \/ -1; padding: 56px 24px; text-align: center;\n  font-size: 11px; font-weight: 500; letter-spacing: 0.1em;\n  text-transform: uppercase; color: #B0AEA8;\n}\n<\/style>\n\n<!-- OVERLAY + PANNEAU -->\n<div class=\"cpr-panel-overlay\" id=\"cpr-overlay\"><\/div>\n<div class=\"cpr-panel\" id=\"cpr-panel\">\n  <div class=\"cpr-panel-header\">\n    <span class=\"cpr-panel-title\" id=\"cpr-panel-title\">Ajouter un document<\/span>\n    <button class=\"cpr-panel-close\" id=\"cpr-panel-close\">\n      <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n        <line x1=\"1\" y1=\"1\" x2=\"11\" y2=\"11\" stroke=\"#1A1A18\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/>\n        <line x1=\"11\" y1=\"1\" x2=\"1\" y2=\"11\" stroke=\"#1A1A18\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/>\n      <\/svg>\n    <\/button>\n  <\/div>\n  <div class=\"cpr-panel-body\">\n\n    <!-- FORMULAIRE -->\n    <div class=\"cpr-form-group\">\n      <label class=\"cpr-form-label\">Nom du document<\/label>\n      <input class=\"cpr-form-input\" id=\"cpr-f-name\" type=\"text\" placeholder=\"ex: Trac\u00e9 1A-V2\"\/>\n    <\/div>\n    <div class=\"cpr-form-group\">\n      <label class=\"cpr-form-label\">Cat\u00e9gorie<\/label>\n      <select class=\"cpr-form-select\" id=\"cpr-f-cat\">\n        <option value=\"trace\">Trac\u00e9<\/option>\n        <option value=\"plan\">Plan<\/option>\n      <\/select>\n    <\/div>\n    <div class=\"cpr-form-group\">\n      <label class=\"cpr-form-label\">URL du PDF<\/label>\n      <input class=\"cpr-form-input\" id=\"cpr-f-pdf\" type=\"url\" placeholder=\"https:\/\/...monsite.com\/...\/fichier.pdf\"\/>\n      <p class=\"cpr-form-hint\">M\u00e9diath\u00e8que WordPress \u2192 clic sur le fichier \u2192 Copier l'URL<\/p>\n    <\/div>\n    <div class=\"cpr-form-group\">\n      <label class=\"cpr-form-label\">URL de l'image preview<\/label>\n      <input class=\"cpr-form-input\" id=\"cpr-f-preview\" type=\"url\" placeholder=\"https:\/\/...monsite.com\/...\/image.jpg\"\/>\n      <p class=\"cpr-form-hint\">Laisser vide pour afficher un placeholder automatique<\/p>\n      <div class=\"cpr-preview-thumb\" id=\"cpr-thumb\">\n        <img decoding=\"async\" id=\"cpr-thumb-img\" src=\"\" alt=\"Preview\"\/>\n      <\/div>\n    <\/div>\n\n    <div class=\"cpr-form-actions\">\n      <button class=\"cpr-btn-save\" id=\"cpr-btn-save\">Enregistrer<\/button>\n      <button class=\"cpr-btn-cancel\" id=\"cpr-btn-cancel\">Annuler<\/button>\n    <\/div>\n    <div class=\"cpr-status\" id=\"cpr-status\"><\/div>\n\n    <hr class=\"cpr-panel-sep\"\/>\n\n    <!-- LISTE EXISTANTE -->\n    <div style=\"font-size:9px;font-weight:700;letter-spacing:0.16em;text-transform:uppercase;color:#9A9A92;margin-bottom:14px;\">\n      Documents existants\n    <\/div>\n    <div class=\"cpr-panel-list\" id=\"cpr-panel-list\"><\/div>\n\n  <\/div>\n<\/div>\n\n<!-- WIDGET PRINCIPAL -->\n<div class=\"cpr-docs\" id=\"cpr-docs-root\">\n  <div class=\"cpr-toolbar\">\n    <div class=\"cpr-toolbar-left\">\n      <div class=\"cpr-filter-bar\" id=\"cpr-filter-bar\">\n        <button class=\"cpr-f-btn active\" data-cat=\"all\">Tous <span class=\"cpr-f-count\" id=\"cpr-cnt-all\">0<\/span><\/button>\n        <button class=\"cpr-f-btn\" data-cat=\"trace\">Trac\u00e9s <span class=\"cpr-f-count\" id=\"cpr-cnt-trace\">0<\/span><\/button>\n        <button class=\"cpr-f-btn\" data-cat=\"plan\">Plans <span class=\"cpr-f-count\" id=\"cpr-cnt-plan\">0<\/span><\/button>\n      <\/div>\n      <button class=\"cpr-edit-toggle\" id=\"cpr-edit-toggle\">\n        <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n          <path d=\"M8.5 1.5 L10.5 3.5 L4 10 L1.5 10.5 L2 8 Z\" stroke=\"#fff\" stroke-width=\"1\" fill=\"none\" stroke-linejoin=\"round\"\/>\n        <\/svg>\n        G\u00e9rer les documents\n      <\/button>\n    <\/div>\n    <div class=\"cpr-search-wrap\">\n      <svg width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\n        <circle cx=\"5.5\" cy=\"5.5\" r=\"4\" stroke=\"#1A1A18\" stroke-width=\"1.2\"\/>\n        <line x1=\"8.5\" y1=\"8.5\" x2=\"12\" y2=\"12\" stroke=\"#1A1A18\" stroke-width=\"1.2\" stroke-linecap=\"round\"\/>\n      <\/svg>\n      <input class=\"cpr-search\" id=\"cpr-search\" type=\"text\" placeholder=\"Rechercher...\" autocomplete=\"off\"\/>\n      <button class=\"cpr-search-clear\" id=\"cpr-search-clear\" aria-label=\"Effacer\">\n        <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n          <line x1=\"1\" y1=\"1\" x2=\"9\" y2=\"9\" stroke=\"#1A1A18\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/>\n          <line x1=\"9\" y1=\"1\" x2=\"1\" y2=\"9\" stroke=\"#1A1A18\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/>\n        <\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n  <div class=\"cpr-docs-grid\" id=\"cpr-docs-grid\"><\/div>\n<\/div>\n\n<script>\n(function () {\n\n  \/* ============================================================\n     CONFIG\n  ============================================================ *\/\n  var API_BASE   = '\/wp-json\/cpr\/v1\/documents';\n  var NONCE_KEY  = 'cpr_nonce'; \/* doit correspondre au nonce WP *\/\n\n  \/* Documents par d\u00e9faut (fallback si API vide) *\/\n  var DEFAULT_DOCS = [\n    { name: \"Trac\u00e9 1A-V2\",        cat: \"trace\", pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/1A-V2.jpg\",                                            preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/1A-V2.jpg\" },\n    { name: \"Trac\u00e9 1C-V2\",        cat: \"trace\", pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/1C-V2.jpg\",                                            preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/1C-V2.jpg\" },\n    { name: \"Trac\u00e9\",              cat: \"trace\", pdf: \"\", preview: \"\" },\n    { name: \"Trac\u00e9 3A\",           cat: \"trace\", pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/3A.jpg\",                                               preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/3A.jpg\" },\n    { name: \"Trac\u00e9 3C\",           cat: \"trace\", pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/3C.jpg\",                                               preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/3C.jpg\" },\n    { name: \"Plan Paddock R\u00e8gles\",cat: \"plan\",  pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/CPR_PLAN_PADDOCK_REGLES.pdf\",                          preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-30-170602.jpg\" },\n    { name: \"Plan Paddock\",       cat: \"plan\",  pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/CPR_PLAN_PADDOCK.pdf\",                                 preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-30-171621.jpg\" },\n    { name: \"Plan BOX P1\",        cat: \"plan\",  pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/CPR_PLAN_BOX_P1.pdf\",                                  preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-30-171429.png\" },\n    { name: \"Plan BOX P2\",        cat: \"plan\",  pdf: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/CPR_PLAN_BOX_P2.pdf\",                                  preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-30-171744.png\" },\n    { name: \"Zones Rouges\",       cat: \"plan\",  pdf: \"\", preview: \"\" },\n    { name: \"Layout\",             cat: \"plan\",  pdf: \"https:\/\/www.circuitpaulricard.com\/images\/pdf\/TEST\/CPR_LAYOUT.pdf\",                                                     preview: \"https:\/\/events.circuitpaulricard.com\/wp-content\/uploads\/2025\/11\/Capture-decran-2025-11-03-104142.png\" },\n  ];\n\n  \/* ============================================================\n     \u00c9TAT\n  ============================================================ *\/\n  var DOCS       = [];\n  var activeCat  = 'all';\n  var searchTerm = '';\n  var editIndex  = -1; \/* -1 = ajout, >=0 = modification *\/\n  var isEditor   = false;\n  var nonce      = '';\n\n  \/* ============================================================\n     \u00c9L\u00c9MENTS DOM\n  ============================================================ *\/\n  var grid        = document.getElementById('cpr-docs-grid');\n  var searchInput = document.getElementById('cpr-search');\n  var clearBtn    = document.getElementById('cpr-search-clear');\n  var editToggle  = document.getElementById('cpr-edit-toggle');\n  var panel       = document.getElementById('cpr-panel');\n  var overlay     = document.getElementById('cpr-overlay');\n  var panelClose  = document.getElementById('cpr-panel-close');\n  var panelTitle  = document.getElementById('cpr-panel-title');\n  var panelList   = document.getElementById('cpr-panel-list');\n  var fName       = document.getElementById('cpr-f-name');\n  var fCat        = document.getElementById('cpr-f-cat');\n  var fPdf        = document.getElementById('cpr-f-pdf');\n  var fPreview    = document.getElementById('cpr-f-preview');\n  var thumb       = document.getElementById('cpr-thumb');\n  var thumbImg    = document.getElementById('cpr-thumb-img');\n  var btnSave     = document.getElementById('cpr-btn-save');\n  var btnCancel   = document.getElementById('cpr-btn-cancel');\n  var status      = document.getElementById('cpr-status');\n  var root        = document.getElementById('cpr-docs-root');\n\n  \/* ============================================================\n     D\u00c9TECTION \u00c9DITEUR (via variable WP inject\u00e9e par PHP snippet)\n  ============================================================ *\/\n function initEditor() {\n  if (window.cprEditorData && window.cprEditorData.isEditor) {\n    isEditor = true;\n    nonce    = window.cprEditorData.nonce;\n    editToggle.classList.add('visible');\n  }\n}\n\n\/\/ Attend que le footer soit charg\u00e9\nif (document.readyState === 'complete') {\n  initEditor();\n} else {\n  window.addEventListener('load', initEditor);\n}\n\n  \/* ============================================================\n     CHARGEMENT INITIAL\n  ============================================================ *\/\n  fetch(API_BASE)\n    .then(function (r) { return r.json(); })\n    .then(function (data) {\n      DOCS = (data && data.length) ? data : DEFAULT_DOCS;\n      updateCounts();\n      render();\n      renderPanelList();\n    })\n    .catch(function () {\n      DOCS = DEFAULT_DOCS;\n      updateCounts();\n      render();\n      renderPanelList();\n    });\n\n  \/* ============================================================\n     COMPTEURS\n  ============================================================ *\/\n  function updateCounts() {\n    var c = { all: DOCS.length, trace: 0, plan: 0 };\n    DOCS.forEach(function (d) { c[d.cat]++; });\n    ['all','trace','plan'].forEach(function (k) {\n      var el = document.getElementById('cpr-cnt-' + k);\n      if (el) el.textContent = c[k];\n    });\n  }\n\n  \/* ============================================================\n     HIGHLIGHT\n  ============================================================ *\/\n  function highlight(text, term) {\n    if (!term) return text;\n    var esc = term.replace(\/[.*+?^${}()|[\\]\\\\]\/g, '\\\\$&');\n    return text.replace(new RegExp('(' + esc + ')', 'gi'), '<mark>$1<\/mark>');\n  }\n\n  \/* ============================================================\n     RENDU GRILLE\n  ============================================================ *\/\n  function render() {\n    grid.innerHTML = '';\n    var list = DOCS.filter(function (d) {\n      var catOk    = activeCat === 'all' || d.cat === activeCat;\n      var searchOk = !searchTerm || d.name.toLowerCase().indexOf(searchTerm) !== -1;\n      return catOk && searchOk;\n    });\n\n    if (!list.length) {\n      grid.innerHTML = '<div class=\"cpr-empty\">Aucun document trouv\u00e9<\/div>';\n      return;\n    }\n\n    list.forEach(function (doc, i) {\n      var realIdx = DOCS.indexOf(doc);\n\n      var a = document.createElement('div');\n      a.className = 'cpr-doc-card';\n\n      \/* Preview *\/\n      var preview = document.createElement('div');\n      preview.className = 'cpr-doc-preview';\n\n      if (doc.preview && doc.preview.indexOf('REMPLACER') === -1 && doc.preview !== '') {\n        var img = document.createElement('img');\n        img.src = doc.preview; img.alt = doc.name; img.loading = 'lazy';\n        preview.appendChild(img);\n      } else {\n        var ph = document.createElement('div');\n        ph.className = 'cpr-doc-placeholder';\n        ph.innerHTML = '<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"><rect x=\"9\" y=\"5\" width=\"26\" height=\"34\" rx=\"1\" stroke=\"#1A1A18\" stroke-width=\"1.2\" opacity=\"0.25\"\/><line x1=\"15\" y1=\"14\" x2=\"29\" y2=\"14\" stroke=\"#1A1A18\" stroke-width=\"0.8\" opacity=\"0.25\"\/><line x1=\"15\" y1=\"20\" x2=\"29\" y2=\"20\" stroke=\"#1A1A18\" stroke-width=\"0.8\" opacity=\"0.25\"\/><line x1=\"15\" y1=\"26\" x2=\"22\" y2=\"26\" stroke=\"#1A1A18\" stroke-width=\"0.8\" opacity=\"0.25\"\/><\/svg>';\n        preview.appendChild(ph);\n      }\n\n      var badge = document.createElement('span');\n      badge.className   = 'cpr-doc-badge' + (searchTerm ? ' search-match' : '');\n      badge.textContent = doc.cat === 'trace' ? 'Trac\u00e9' : 'Plan';\n      preview.appendChild(badge);\n\n      \/* Bouton supprimer (mode \u00e9diteur) *\/\n      if (isEditor) {\n        var delBtn = document.createElement('button');\n        delBtn.className = 'cpr-doc-delete';\n        delBtn.title = 'Supprimer';\n        delBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"><line x1=\"1\" y1=\"1\" x2=\"9\" y2=\"9\" stroke=\"#fff\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/><line x1=\"9\" y1=\"1\" x2=\"1\" y2=\"9\" stroke=\"#fff\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/><\/svg>';\n        delBtn.addEventListener('click', function (e) {\n          e.preventDefault(); e.stopPropagation();\n          if (confirm('Supprimer \"' + doc.name + '\" ?')) {\n            DOCS.splice(realIdx, 1);\n            saveToAPI(function () { updateCounts(); render(); renderPanelList(); });\n          }\n        });\n        preview.appendChild(delBtn);\n\n        \/* Bouton modifier *\/\n        var editBtn = document.createElement('button');\n        editBtn.className = 'cpr-doc-edit-btn';\n        editBtn.title = 'Modifier';\n        editBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M8.5 1.5 L10.5 3.5 L4 10 L1.5 10.5 L2 8 Z\" stroke=\"#fff\" stroke-width=\"1\" fill=\"none\" stroke-linejoin=\"round\"\/><\/svg>';\n        editBtn.addEventListener('click', function (e) {\n          e.preventDefault(); e.stopPropagation();\n          openEdit(realIdx);\n        });\n        preview.appendChild(editBtn);\n      }\n\n      \/* Footer *\/\n      var footer = document.createElement('div');\n      footer.className = 'cpr-doc-footer';\n      footer.innerHTML =\n        '<span class=\"cpr-doc-name\">' + highlight(doc.name, searchTerm) + '<\/span>' +\n        '<span class=\"cpr-doc-open\"><svg width=\"11\" height=\"11\" viewBox=\"0 0 11 11\" fill=\"none\"><path d=\"M1.5 9.5 L9.5 1.5 M9.5 1.5 H4.5 M9.5 1.5 V6.5\" stroke=\"#1A1A18\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/span>';\n\n      \/* Clic \u2192 ouvrir PDF seulement si pas en mode \u00e9dition *\/\n      a.addEventListener('click', function () {\n  if (!root.classList.contains('cpr-editing') && doc.pdf) {\n    var win = window.open(doc.pdf, '_blank');\n    if (win) win.focus();\n  }\n});\n\n      a.appendChild(preview);\n      a.appendChild(footer);\n      grid.appendChild(a);\n\n      \/* Animation *\/\n      a.style.opacity   = '0';\n      a.style.transform = 'translateY(10px)';\n      setTimeout(function () {\n        a.style.transition = 'opacity .22s ease, transform .22s ease, border-color .2s ease, box-shadow .2s ease';\n        a.style.opacity    = '1';\n        a.style.transform  = 'translateY(0)';\n      }, i * 40);\n    });\n  }\n\n  \/* ============================================================\n     RENDU LISTE PANNEAU\n  ============================================================ *\/\n  function renderPanelList() {\n    panelList.innerHTML = '';\n    if (!DOCS.length) {\n      panelList.innerHTML = '<div style=\"font-size:11px;color:#B0AEA8;text-align:center;padding:20px 0;\">Aucun document<\/div>';\n      return;\n    }\n    DOCS.forEach(function (doc, i) {\n      var item = document.createElement('div');\n      item.className = 'cpr-panel-item';\n\n      var thumbDiv = document.createElement('div');\n      thumbDiv.className = 'cpr-panel-item-thumb';\n      if (doc.preview && doc.preview !== '') {\n        var img = document.createElement('img');\n        img.src = doc.preview; img.alt = doc.name;\n        thumbDiv.appendChild(img);\n      }\n\n      var info = document.createElement('div');\n      info.className = 'cpr-panel-item-info';\n      info.innerHTML =\n        '<div class=\"cpr-panel-item-name\">' + doc.name + '<\/div>' +\n        '<div class=\"cpr-panel-item-cat\">' + (doc.cat === 'trace' ? 'Trac\u00e9' : 'Plan') + '<\/div>';\n\n      var actions = document.createElement('div');\n      actions.className = 'cpr-panel-item-actions';\n\n      \/* Modifier *\/\n      var editBtn = document.createElement('button');\n      editBtn.className = 'cpr-panel-item-btn';\n      editBtn.title = 'Modifier';\n      editBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M8.5 1.5 L10.5 3.5 L4 10 L1.5 10.5 L2 8 Z\" stroke=\"#1A1A18\" stroke-width=\"1.2\" fill=\"none\" stroke-linejoin=\"round\"\/><\/svg>';\n      editBtn.addEventListener('click', function () { openEdit(i); });\n\n      \/* Supprimer *\/\n      var delBtn = document.createElement('button');\n      delBtn.className = 'cpr-panel-item-btn del';\n      delBtn.title = 'Supprimer';\n      delBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"><line x1=\"1\" y1=\"1\" x2=\"9\" y2=\"9\" stroke=\"#1A1A18\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/><line x1=\"9\" y1=\"1\" x2=\"1\" y2=\"9\" stroke=\"#1A1A18\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/><\/svg>';\n      delBtn.addEventListener('click', function () {\n        if (confirm('Supprimer \"' + doc.name + '\" ?')) {\n          DOCS.splice(i, 1);\n          saveToAPI(function () { updateCounts(); render(); renderPanelList(); });\n        }\n      });\n\n      actions.appendChild(editBtn);\n      actions.appendChild(delBtn);\n      item.appendChild(thumbDiv);\n      item.appendChild(info);\n      item.appendChild(actions);\n      panelList.appendChild(item);\n    });\n  }\n\n  \/* ============================================================\n     PANNEAU \u2014 OUVERTURE \/ FERMETURE\n  ============================================================ *\/\n  function openPanel() {\n    panel.classList.add('open');\n    overlay.classList.add('open');\n    document.body.style.overflow = 'hidden';\n  }\n  function closePanel() {\n    panel.classList.remove('open');\n    overlay.classList.remove('open');\n    document.body.style.overflow = '';\n    resetForm();\n  }\n\n  function openAdd() {\n    editIndex = -1;\n    panelTitle.textContent = 'Ajouter un document';\n    btnSave.textContent = 'Ajouter';\n    resetForm();\n    openPanel();\n  }\n\n  function openEdit(idx) {\n    editIndex = idx;\n    var doc = DOCS[idx];\n    panelTitle.textContent = 'Modifier le document';\n    btnSave.textContent = 'Enregistrer';\n    fName.value    = doc.name;\n    fCat.value     = doc.cat;\n    fPdf.value     = doc.pdf || '';\n    fPreview.value = doc.preview || '';\n    updateThumb(doc.preview);\n    showStatus('', '');\n    openPanel();\n  }\n\n  function resetForm() {\n    fName.value = ''; fCat.value = 'trace';\n    fPdf.value = ''; fPreview.value = '';\n    thumb.classList.remove('visible');\n    showStatus('', '');\n  }\n\n  \/* ============================================================\n     PREVIEW THUMBNAIL EN TEMPS R\u00c9EL\n  ============================================================ *\/\n  function updateThumb(url) {\n    if (url && url.match(\/\\.(jpg|jpeg|png|gif|webp)(\\?.*)?$\/i)) {\n      thumbImg.src = url;\n      thumb.classList.add('visible');\n    } else {\n      thumb.classList.remove('visible');\n    }\n  }\n  fPreview.addEventListener('input', function () { updateThumb(fPreview.value); });\n\n  \/* ============================================================\n     SAUVEGARDE FORMULAIRE\n  ============================================================ *\/\n  btnSave.addEventListener('click', function () {\n    var name    = fName.value.trim();\n    var cat     = fCat.value;\n    var pdf     = fPdf.value.trim();\n    var preview = fPreview.value.trim();\n\n    if (!name) { showStatus('Le nom est obligatoire.', 'error'); return; }\n\n    var doc = { name: name, cat: cat, pdf: pdf, preview: preview };\n\n    if (editIndex === -1) {\n      DOCS.push(doc);\n    } else {\n      DOCS[editIndex] = doc;\n    }\n\n    saveToAPI(function (ok) {\n      if (ok) {\n        updateCounts(); render(); renderPanelList();\n        showStatus(editIndex === -1 ? 'Document ajout\u00e9 !' : 'Modification enregistr\u00e9e !', 'success');\n        resetForm();\n        editIndex = -1;\n        panelTitle.textContent = 'Ajouter un document';\n        btnSave.textContent = 'Ajouter';\n      } else {\n        showStatus('Erreur lors de la sauvegarde.', 'error');\n      }\n    });\n  });\n\n  btnCancel.addEventListener('click', function () { resetForm(); editIndex = -1; });\n\n  \/* ============================================================\n     API REST\n  ============================================================ *\/\n  function saveToAPI(cb) {\n    fetch(API_BASE, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application\/json',\n        'X-WP-Nonce': nonce\n      },\n      body: JSON.stringify({ documents: DOCS })\n    })\n    .then(function (r) { return r.json(); })\n    .then(function (data) { cb(data && data.success); })\n    .catch(function () { cb(false); });\n  }\n\n  \/* ============================================================\n     STATUT\n  ============================================================ *\/\n  function showStatus(msg, type) {\n    status.textContent = msg;\n    status.className   = 'cpr-status' + (type ? ' ' + type : '');\n  }\n\n  \/* ============================================================\n     \u00c9V\u00c9NEMENTS\n  ============================================================ *\/\n  editToggle.addEventListener('click', function () {\n    root.classList.toggle('cpr-editing');\n    var editing = root.classList.contains('cpr-editing');\n    editToggle.textContent = editing ? '\u2715 Quitter la gestion' : '';\n    if (editing) {\n      editToggle.innerHTML = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 10 10\" fill=\"none\"><line x1=\"1\" y1=\"1\" x2=\"9\" y2=\"9\" stroke=\"#fff\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/><line x1=\"9\" y1=\"1\" x2=\"1\" y2=\"9\" stroke=\"#fff\" stroke-width=\"1.4\" stroke-linecap=\"round\"\/><\/svg> Quitter';\n      openPanel();\n    } else {\n      editToggle.innerHTML = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M8.5 1.5 L10.5 3.5 L4 10 L1.5 10.5 L2 8 Z\" stroke=\"#fff\" stroke-width=\"1\" fill=\"none\" stroke-linejoin=\"round\"\/><\/svg> G\u00e9rer les documents';\n      closePanel();\n    }\n  });\n\n  panelClose.addEventListener('click', closePanel);\n  overlay.addEventListener('click', closePanel);\n\n  \/* Filtre *\/\n  document.getElementById('cpr-filter-bar').addEventListener('click', function (e) {\n    var btn = e.target.closest('.cpr-f-btn');\n    if (!btn) return;\n    document.querySelectorAll('.cpr-f-btn').forEach(function (b) { b.classList.remove('active'); });\n    btn.classList.add('active');\n    activeCat = btn.dataset.cat;\n    render();\n  });\n\n  \/* Recherche *\/\n  searchInput.addEventListener('input', function () {\n    searchTerm = searchInput.value.trim().toLowerCase();\n    clearBtn.classList.toggle('visible', searchTerm.length > 0);\n    render();\n  });\n  clearBtn.addEventListener('click', function () {\n    searchInput.value = ''; searchTerm = '';\n    clearBtn.classList.remove('visible');\n    searchInput.focus(); render();\n  });\n\n}());\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Plans &amp; trac\u00e9s Ajouter un document Nom du document Cat\u00e9gorie Trac\u00e9Plan URL du PDF M\u00e9diath\u00e8que WordPress \u2192 clic sur le fichier \u2192 Copier l&rsquo;URL URL de l&rsquo;image preview Laisser vide pour afficher un placeholder automatique Enregistrer Annuler Documents existants Tous 0 Trac\u00e9s 0 Plans 0 G\u00e9rer les documents<\/p>","protected":false},"author":1,"featured_media":0,"parent":468,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-563","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/pages\/563","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/comments?post=563"}],"version-history":[{"count":91,"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/pages\/563\/revisions"}],"predecessor-version":[{"id":3219,"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/pages\/563\/revisions\/3219"}],"up":[{"embeddable":true,"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/pages\/468"}],"wp:attachment":[{"href":"https:\/\/events.circuitpaulricard.com\/en\/wp-json\/wp\/v2\/media?parent=563"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}