templates/Accueil/PageAccueil.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <!--
  3. Template name: Nova
  4. Template author: FreeBootstrap.net
  5. Author website: https://freebootstrap.net/
  6. License: https://freebootstrap.net/license
  7. -->
  8. <html lang="fr">
  9.   <head>
  10.     <meta charset="utf-8">
  11.     <meta name="viewport" content="width=device-width, initial-scale=1">
  12. <title>5sur5Séjour — Créer un séjour scolaire en ligne (données hébergées en France)</title>
  13. <meta name="description" content="Partagez photos, vidéos et messages vocaux avec les familles. Gratuit pour les écoles publiques (hors option voix). Démo 15–30 min pour partenaires.">
  14. <!-- Open Graph / Twitter -->
  15. <meta property="og:title" content="Créer un séjour scolaire en ligne — 5sur5Séjour">
  16. <meta property="og:description" content="Plateforme familles & écoles. Données en France. Démo 15–30 min.">
  17. <meta property="og:type" content="website">
  18. <meta property="og:url" content="https://5sur5sejour.fr/">
  19. <meta property="og:image" content="https://5sur5sejour.fr/static/og/landing.jpg">
  20. <meta name="twitter:card" content="summary_large_image">
  21. <!-- Robots -->
  22. <meta name="robots" content="index,follow,max-image-preview:large">
  23. <!-- Preload police/logo (si utilisés) -->
  24. <link rel="preload" href="/assets/fonts/inter-var.woff2" as="font" type="font/woff2" crossorigin>
  25. <link rel="preload" href="/static/og/creer-sejour.jpg" as="image">    <title>5sur5séjour - Plateforme de partage de photos, vidéos et messages vocaux</title>
  26.      
  27.     <!-- ======= Google Font =======-->
  28.     <link rel="preconnect" href="https://fonts.googleapis.com">
  29.     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  30.     <link href="https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap" rel="stylesheet">
  31.     <!-- End Google Font-->
  32.     
  33.     <!-- ======= Styles =======-->
  34.     <link href="{{ asset('Accueil/vendors/bootstrap/bootstrap.min.css') }}" rel="stylesheet">
  35.     <link href="{{ asset('Accueil/vendors/bootstrap-icons/font/bootstrap-icons.min.css') }}" rel="stylesheet">
  36.     <link href="{{ asset('Accueil/vendors/glightbox/glightbox.min.css') }}" rel="stylesheet">
  37.     <link href="{{ asset('Accueil/vendors/swiper/swiper-bundle.min.css') }}" rel="stylesheet">
  38.     <link href="{{ asset('Accueil/vendors/aos/aos.css') }}" rel="stylesheet">
  39.     <!-- End Styles-->
  40.     
  41.     <!-- ======= Theme Style =======-->
  42.     <link href="{{ asset('Accueil/css/style_nova.css') }}?v={{ "now"|date("Y-m-d-H-i-s") }}" rel="stylesheet">
  43.     <!-- End Theme Style-->
  44.     
  45.     
  46.     <!-- ======= Apply theme =======-->
  47.     <script>
  48.       // Apply the theme as early as possible to avoid flicker
  49.       (function() {
  50.         const storedTheme = localStorage.getItem('theme') || 'light';
  51.         document.documentElement.setAttribute('data-bs-theme', storedTheme);
  52.       })();
  53.     </script>
  54.   </head>
  55.   <body>
  56.     
  57. <!-- MODALE -->
  58. <div class="modal fade" id="demoModal" tabindex="-1" aria-hidden="true">
  59.   <div class="modal-dialog modal-lg modal-dialog-centered">
  60.     <div class="modal-content">
  61.       <div class="modal-header">
  62.         <h5 id="demoTitle" class="modal-title">Demander une démo guidée</h5>
  63.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  64.       </div>
  65.       <div class="modal-body">
  66.         <ul class="nav nav-tabs" id="demoTabs" role="tablist">
  67.           <li class="nav-item" role="presentation">
  68.             <button class="nav-link active" id="tab-calendar" data-bs-toggle="tab" data-bs-target="#pane-calendar" type="button" role="tab">
  69.               Réserver un créneau
  70.             </button>
  71.           </li>
  72.           <li class="nav-item" role="presentation">
  73.             <button class="nav-link" id="tab-callback" data-bs-toggle="tab" data-bs-target="#pane-callback" type="button" role="tab">
  74.               Être rappelé
  75.             </button>
  76.           </li>
  77.         </ul>
  78.         <div class="tab-content pt-3">
  79.           <!-- Calendrier -->
  80.           <div class="tab-pane fade show active" id="pane-calendar" role="tabpanel">
  81.             <div class="text-center mb-3">
  82.               <h6 class="mb-2">Réservez votre créneau de démonstration</h6>
  83.               <p class="text-muted small">Choisissez un créneau qui vous convient pour une démo personnalisée</p>
  84.             </div>
  85.             <div class="ratio ratio-16x9 border rounded">
  86.               <iframe src="https://calendly.com/5sur5sejour/demo" title="Calendrier de réservation" loading="lazy" frameborder="0"></iframe>
  87.             </div>
  88.             <p class="small text-muted mt-2 mb-0">
  89.               <i class="bi bi-clock me-1"></i> Créneau visio 15–30 min · 
  90.               <i class="bi bi-check-circle me-1"></i> Confirmation instantanée ·
  91.               <i class="bi bi-shield-check me-1"></i> 100% gratuit
  92.             </p>
  93.           </div>
  94.           <!-- Formulaire callback -->
  95.           <div class="tab-pane fade" id="pane-callback" role="tabpanel">
  96.             <div class="text-center mb-3">
  97.               <h6 class="mb-2">Être rappelé par un expert</h6>
  98.               <p class="text-muted small">Laissez-nous vos coordonnées et nous vous rappelons sous 24h</p>
  99.             </div>
  100.             <form id="contactForm" class="needs-validation" method="post" action="{{ path('app_contact') }}" novalidate>
  101.               <input type="hidden" name="topic" id="topic" value="demo">
  102.               <input type="hidden" name="pack"  id="pack"  value="">
  103.               <input type="hidden" name="objet" id="objet" value="demo">
  104.               <input type="text" name="website" class="visually-hidden" tabindex="-1" autocomplete="off">
  105.               <div class="row g-3">
  106.                 <div class="col-md-6">
  107.                   <label class="form-label">Nom & prénom</label>
  108.                   <input type="text" class="form-control" name="name" required 
  109.                          placeholder="Votre nom complet">
  110.                   <div class="invalid-feedback">Veuillez saisir votre nom et prénom.</div>
  111.                 </div>
  112.                 <div class="col-md-6">
  113.                   <label class="form-label">Établissement</label>
  114.                   <input type="text" class="form-control" name="organization" required 
  115.                          placeholder="Nom de votre établissement">
  116.                   <div class="invalid-feedback">Veuillez saisir le nom de votre établissement.</div>
  117.                 </div>
  118.                 <div class="col-md-6">
  119.                   <label class="form-label">Email pro</label>
  120.                   <input type="email" class="form-control" name="email" required 
  121.                          placeholder="votre.email@etablissement.fr">
  122.                   <div class="invalid-feedback">Veuillez saisir une adresse email valide.</div>
  123.                 </div>
  124.                 <div class="col-md-6">
  125.                   <label class="form-label">Téléphone</label>
  126.                   <input type="tel" class="form-control" name="telephone" required 
  127.                          placeholder="06 12 34 56 78" pattern="[0-9\s\+\-\(\)]{10,}">
  128.                   <div class="invalid-feedback">Veuillez saisir un numéro de téléphone valide.</div>
  129.                 </div>
  130.                 <div class="col-md-6">
  131.                   <label class="form-label">Nb. de séjours / an</label>
  132.                   <select class="form-select" name="sejours_count" required>
  133.                     <option value="" selected>Choisir…</option>
  134.                     <option value="1-3">1–3</option>
  135.                     <option value="4-10">4–10</option>
  136.                     <option value="11-30">11–30</option>
  137.                     <option value="30+">30+</option>
  138.                   </select>
  139.                   <div class="invalid-feedback">Veuillez sélectionner le nombre de séjours.</div>
  140.                 </div>
  141.                 <div class="col-12">
  142.                   <label class="form-label">Message (optionnel)</label>
  143.                   <textarea class="form-control" name="message" rows="3"
  144.                     placeholder="Décrivez brièvement vos besoins : type de séjours, nombre d'enfants, questions spécifiques..."></textarea>
  145.                 </div>
  146.                 <div class="col-12">
  147.                   <div class="form-check">
  148.                     <input class="form-check-input" type="checkbox" value="1" id="consent" name="consent" required>
  149.                     <label class="form-check-label" for="consent">J'accepte d'être contacté (RGPD).</label>
  150.                     <div class="invalid-feedback">Vous devez accepter d'être contacté pour continuer.</div>
  151.                   </div>
  152.                 </div>
  153.                 <div class="col-12 d-grid d-sm-flex gap-2">
  154.                   <button id="submitBtn" class="btn btn-primary px-4" type="submit">
  155.                     <i class="bi bi-telephone me-2"></i>Être rappelé sous 24h
  156.                   </button>
  157.                   <a class="btn btn-outline-secondary px-4" href="mailto:contact@5sur5sejour.fr">
  158.                     <i class="bi bi-envelope me-2"></i>Nous écrire
  159.                   </a>
  160.                 </div>
  161.               </div>
  162.               <p class="small text-muted mt-2 mb-0">
  163.                 Si la structure ne prend pas en charge <strong>Parent Premium</strong>, les familles peuvent l'activer (2,90 € / parent / séjour) pour l'accès complet, boîte vocale illimitée incluse. <span class="text-primary-emphasis">Recommandé : prise en charge par la structure.</span>
  164.               </p>
  165.             </form>
  166.           </div>
  167.         </div>
  168.       </div>
  169.       <div class="modal-footer">
  170.         <p class="small text-muted mb-0">Sans engagement · Données hébergées en France</p>
  171.       </div>
  172.     </div>
  173.   </div>
  174. </div>
  175. <!-- MODALE CRÉER MON SÉJOUR -->
  176. <div class="modal fade" id="createSejourModal" tabindex="-1" aria-labelledby="createSejourTitle" aria-hidden="true">
  177.   <div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable">
  178.     <div class="modal-content">
  179.       <div class="modal-header border-bottom-0">
  180.         <div class="w-100">
  181.           <h5 id="createSejourTitle" class="modal-title mb-2">Créer mon espace séjour</h5>
  182.           <div class="d-flex align-items-center gap-2">
  183.             <span id="stepLabel" class="badge bg-primary">Étape 1/2</span>
  184.             <small class="text-muted" id="stepDescription">Choisissez votre profil</small>
  185.           </div>
  186.         </div>
  187.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  188.       </div>
  189.       <div class="modal-body px-4">
  190.         <!-- ÉTAPE 1 : Choix du profil -->
  191.         <div id="step1" class="step-content">
  192.           <p class="lead text-center mb-4">Sélectionnez le type d'espace séjour que vous souhaitez créer :</p>
  193.           
  194.           <div class="row g-3">
  195.             <!-- École publique -->
  196.             <div class="col-md-4">
  197.               <a class="card h-100 border-2 hover-shadow text-decoration-none" href="{{ path('app_ecoles_publiques_creer') }}">
  198.                 <div class="card-body text-center p-4">
  199.                   <div class="fs-1 mb-3">🏫</div>
  200.                   <h6 class="card-title fw-bold mb-2">École publique</h6>
  201.                   <p class="card-text small text-muted mb-3">
  202.                     Accès gratuit (hors option boîte vocale).
  203.                   </p>
  204.                   <span class="badge bg-success">✅ Gratuit</span>
  205.                 </div>
  206.               </a>
  207.             </div>
  208.             <!-- Partenaire -->
  209.             <div class="col-md-4 d-none">
  210.               <div class="card h-100 select-role border-2 hover-shadow"  role="button" tabindex="0">
  211.                 <div class="card-body text-center p-4">
  212.                   <div class="fs-1 mb-3">🤝</div>
  213.                   <h6 class="card-title fw-bold mb-2">Partenaire / Organisme</h6>
  214.                   <p class="card-text small text-muted mb-3">
  215.                     Association, centre, école privée… Démo + contrat.
  216.                   </p>
  217.                   <span class="badge bg-purple">🚀 Partenariat</span>
  218.                 </div>
  219.               </div>
  220.             </div>
  221.  <div class="col-md-4">
  222.               <a class="card h-100 border-2 hover-shadow text-decoration-none" href="{{ path('pack_annuel_partenaires') }}">
  223.                 <div class="card-body text-center p-4">
  224.                   <div class="fs-1 mb-3">🤝</div>
  225.                   <h6 class="card-title fw-bold mb-2">Partenaire</h6>
  226.                   <p class="card-text small text-muted mb-3">
  227.                    Association, centre, école privée… Démo + contrat.
  228.                   </p>
  229.                   <span class="badge bg-purple">🚀 Partenariat</span>
  230.                 </div>
  231.               </a>
  232.             </div>
  233.             <!-- Création simple -->
  234.             <div class="col-md-4">
  235.               <a class="card h-100 border-2 hover-shadow text-decoration-none" href="{{ path('app_creation_simple_creer') }}">
  236.                 <div class="card-body text-center p-4">
  237.                   <div class="fs-1 mb-3">✨</div>
  238.                   <h6 class="card-title fw-bold mb-2">Création simple</h6>
  239.                   <p class="card-text small text-muted mb-3">
  240.                     Créer un espace séjour. Paiement par les parents ou par la structure.
  241.                   </p>
  242.                   <span class="badge bg-primary">🎯 Flexible</span>
  243.                 </div>
  244.               </a>
  245.             </div>
  246.           </div>
  247.         </div>
  248.         <!-- ÉTAPE 2 : Formulaires selon le profil -->
  249.         <div id="step2" class="step-content d-none">
  250.           <!-- Panneau Partenaire -->
  251.           <div id="pane-partenaire" class="role-pane d-none">
  252.             <div class="alert alert-info mb-4">
  253.               <strong>🤝 Partenaire / Organisme</strong><br>
  254.               <small>Démo 15–30 min · Accompagnement contrat & onboarding.</small>
  255.             </div>
  256.             <ul class="nav nav-tabs mb-3" id="partenaireTabsNav" role="tablist">
  257.               <li class="nav-item" role="presentation">
  258.                 <button class="nav-link active" id="tab-partenaire-demo" data-bs-toggle="tab" data-bs-target="#pane-partenaire-demo" type="button" role="tab">
  259.                   Réserver une démo
  260.                 </button>
  261.               </li>
  262.               <li class="nav-item" role="presentation">
  263.                 <button class="nav-link" id="tab-partenaire-callback" data-bs-toggle="tab" data-bs-target="#pane-partenaire-callback" type="button" role="tab">
  264.                   Être rappelé
  265.                 </button>
  266.               </li>
  267.             </ul>
  268.             <div class="tab-content">
  269.               <!-- Calendly pour démo partenaire -->
  270.               <div class="tab-pane fade show active" id="pane-partenaire-demo" role="tabpanel">
  271.                 <div class="text-center mb-3">
  272.                   <p class="text-muted small mb-2">Choisissez un créneau pour une démo personnalisée</p>
  273.                 </div>
  274.                 <div class="ratio ratio-16x9 border rounded">
  275.                   <iframe data-src="https://calendly.com/5sur5sejour/demo" title="Calendrier de réservation partenaire" loading="lazy" frameborder="0"></iframe>
  276.                 </div>
  277.                 <p class="small text-muted mt-2 mb-0">
  278.                   <i class="bi bi-clock me-1"></i> Créneau visio 15–30 min · 
  279.                   <i class="bi bi-check-circle me-1"></i> Accompagnement contrat ·
  280.                   <i class="bi bi-shield-check me-1"></i> 100% gratuit
  281.                 </p>
  282.               </div>
  283.               <!-- Formulaire rappel partenaire -->
  284.               <div class="tab-pane fade" id="pane-partenaire-callback" role="tabpanel">
  285.                 <form id="formPartenaire" method="post" action="/contact/partenaire" class="needs-validation" novalidate>
  286.                   <input type="text" name="website" class="visually-hidden" tabindex="-1" autocomplete="off">
  287.                   
  288.                   <div class="row g-3">
  289.                     <div class="col-md-6">
  290.                       <label class="form-label">Nom & prénom <span class="text-danger">*</span></label>
  291.                       <input type="text" class="form-control" name="name" required 
  292.                              placeholder="Votre nom complet">
  293.                       <div class="invalid-feedback">Veuillez saisir votre nom et prénom.</div>
  294.                     </div>
  295.                     <div class="col-md-6">
  296.                       <label class="form-label">Structure <span class="text-danger">*</span></label>
  297.                       <input type="text" class="form-control" name="organization" required 
  298.                              placeholder="Nom de votre structure">
  299.                       <div class="invalid-feedback">Veuillez saisir le nom de votre structure.</div>
  300.                     </div>
  301.                     <div class="col-md-6">
  302.                       <label class="form-label">Email pro <span class="text-danger">*</span></label>
  303.                       <input type="email" class="form-control" name="email" required 
  304.                              placeholder="votre.email@structure.fr">
  305.                       <div class="invalid-feedback">Veuillez saisir une adresse email valide.</div>
  306.                     </div>
  307.                     <div class="col-md-6">
  308.                       <label class="form-label">Téléphone (optionnel)</label>
  309.                       <input type="tel" class="form-control" name="telephone" 
  310.                              placeholder="06 12 34 56 78">
  311.                     </div>
  312.                     <div class="col-12">
  313.                       <label class="form-label">Message (optionnel)</label>
  314.                       <textarea class="form-control" name="message" rows="3"
  315.                         placeholder="Décrivez brièvement vos besoins..."></textarea>
  316.                     </div>
  317.                     <div class="col-12">
  318.                       <div class="form-check">
  319.                         <input class="form-check-input" type="checkbox" value="1" id="consent_partenaire" name="consent" required>
  320.                         <label class="form-check-label" for="consent_partenaire">
  321.                           J'accepte d'être contacté (RGPD) <span class="text-danger">*</span>
  322.                         </label>
  323.                         <div class="invalid-feedback">Vous devez accepter d'être contacté.</div>
  324.                       </div>
  325.                     </div>
  326.                     <div class="col-12 d-flex gap-2">
  327.                       <button type="submit" class="btn btn-primary px-4">
  328.                         <i class="bi bi-telephone me-2"></i>Être rappelé sous 24 h
  329.                       </button>
  330.                       <a class="btn btn-outline-secondary px-4" href="mailto:contact@5sur5sejour.fr">
  331.                         Nous écrire
  332.                       </a>
  333.                     </div>
  334.                   </div>
  335.                 </form>
  336.               </div>
  337.             </div>
  338.           </div>
  339.           <!-- Panneau Création simple -->
  340.           <div id="pane-autre" class="role-pane d-none">
  341.             <div class="alert alert-primary mb-4">
  342.               <strong>✨ Créer un espace séjour</strong><br>
  343.               <small>Type PP (Partenaire Payant) - Les familles peuvent activer Parent Premium (2,90 € / parent / séjour).</small>
  344.             </div>
  345.             <form id="formAutre" method="post" action="/Accompagnateur/register" class="needs-validation" novalidate>
  346.               <input type="text" name="website" class="visually-hidden" tabindex="-1" autocomplete="off">
  347.               <input type="hidden" name="type_user" value="PP">
  348.               <input type="hidden" name="connpay" value="1">
  349.               
  350.               <div class="row g-3">
  351.                 <div class="col-md-6">
  352.                   <label class="form-label">Nom <span class="text-danger">*</span></label>
  353.                   <input type="text" class="form-control" name="nom_acc" required 
  354.                          placeholder="Votre nom">
  355.                   <div class="invalid-feedback">Veuillez saisir votre nom.</div>
  356.                 </div>
  357.                 <div class="col-md-6">
  358.                   <label class="form-label">Prénom <span class="text-danger">*</span></label>
  359.                   <input type="text" class="form-control" name="prenom_acc" required 
  360.                          placeholder="Votre prénom">
  361.                   <div class="invalid-feedback">Veuillez saisir votre prénom.</div>
  362.                 </div>
  363.                 <div class="col-md-12">
  364.                   <label class="form-label">Fonction <span class="text-danger">*</span></label>
  365.                   <select class="form-select" name="fonction" required>
  366.                     <option value="">Choisir votre fonction</option>
  367.                     <option value="1">Enseignant(e)</option>
  368.                     <option value="2">Principal(e)</option>
  369.                     <option value="3">Professeur(e)</option>
  370.                     <option value="4">CPE</option>
  371.                     <option value="5">Directeur(trice) d'école</option>
  372.                     <option value="6">Animateur(trice)</option>
  373.                     <option value="7">Directeur(trice) séjour</option>
  374.                     <option value="8">Directeur(trice) centre de loisirs / ALSH</option>
  375.                     <option value="9">Coordinateur(trice) enfance jeunesse</option>
  376.                     <option value="10">Educateur(trice)</option>
  377.                     <option value="11">Président(e)</option>
  378.                     <option value="12">Autre</option>
  379.                   </select>
  380.                   <div class="invalid-feedback">Veuillez sélectionner votre fonction.</div>
  381.                 </div>
  382.                 <div class="col-md-12">
  383.                   <label class="form-label">Structure / Organisme <span class="text-danger">*</span></label>
  384.                   <input type="text" class="form-control" name="etablisment" required 
  385.                          placeholder="Nom de votre structure ou organisation">
  386.                   <div class="invalid-feedback">Veuillez saisir le nom de votre structure.</div>
  387.                 </div>
  388.                 <div class="col-md-12">
  389.                   <label class="form-label">Adresse structure</label>
  390.                   <input type="text" class="form-control" name="adressetablisment" 
  391.                          placeholder="Adresse de votre structure">
  392.                 </div>
  393.                 <div class="col-md-6">
  394.                   <label class="form-label">Code postal</label>
  395.                   <input type="text" class="form-control" name="CODEpOSTALetablisment" 
  396.                          placeholder="Code postal" maxlength="5">
  397.                 </div>
  398.                 <div class="col-md-6">
  399.                   <label class="form-label">Ville</label>
  400.                   <input type="text" class="form-control" name="villeetablisment" 
  401.                          placeholder="Ville de votre structure">
  402.                 </div>
  403.                 <div class="col-md-6">
  404.                   <label class="form-label">N° de Téléphone mobile <span class="text-danger">*</span></label>
  405.                   <input type="tel" class="form-control" name="phone_acc" required 
  406.                          placeholder="06 12 34 56 78" pattern="[0-9\s\+\-\(\)]{10,}">
  407.                   <div class="invalid-feedback">Veuillez saisir un numéro de téléphone valide.</div>
  408.                 </div>
  409.                 <div class="col-md-6">
  410.                   <label class="form-label">Email <span class="text-danger">*</span></label>
  411.                   <input type="email" class="form-control" name="email" required 
  412.                          placeholder="votre.email@structure.fr">
  413.                   <div class="invalid-feedback">Veuillez saisir une adresse email valide.</div>
  414.                 </div>
  415.                 <!-- Informations du séjour -->
  416.                 <div class="col-12 mt-4">
  417.                   <h6 class="text-primary">📍 Informations du séjour</h6>
  418.                   <hr>
  419.                 </div>
  420.                 <div class="col-md-12">
  421.                   <label class="form-label">Thème du séjour <span class="text-danger">*</span></label>
  422.                   <input type="text" class="form-control" name="theme_sejour" required 
  423.                          placeholder="Ex: Séjour ski, Camp d'été...">
  424.                   <div class="invalid-feedback">Veuillez saisir le thème du séjour.</div>
  425.                 </div>
  426.                 <div class="col-md-12">
  427.                   <label class="form-label">Adresse du séjour</label>
  428.                   <input type="text" class="form-control" name="adress_sejour" 
  429.                          placeholder="Adresse du lieu de séjour">
  430.                 </div>
  431.                 <div class="col-md-6">
  432.                   <label class="form-label">Code postal</label>
  433.                   <input type="text" class="form-control" name="codePostal" 
  434.                          placeholder="Code postal" maxlength="5">
  435.                 </div>
  436.                 <div class="col-md-6">
  437.                   <label class="form-label">Pays <span class="text-danger">*</span></label>
  438.                   <select class="form-select" name="pays" required>
  439.                     <option value="">Choisir un pays</option>
  440.                     <option value="France" selected>France</option>
  441.                     <option value="Belgique">Belgique</option>
  442.                     <option value="Suisse">Suisse</option>
  443.                     <option value="Espagne">Espagne</option>
  444.                     <option value="Italie">Italie</option>
  445.                     <option value="Allemagne">Allemagne</option>
  446.                     <option value="Royaume-Uni">Royaume-Uni</option>
  447.                     <option value="Autre">Autre</option>
  448.                   </select>
  449.                   <div class="invalid-feedback">Veuillez sélectionner un pays.</div>
  450.                 </div>
  451.                 <div class="col-md-6">
  452.                   <label class="form-label">Ville du séjour</label>
  453.                   <input type="text" class="form-control" name="ville" 
  454.                          placeholder="Ville du séjour">
  455.                 </div>
  456.                 <div class="col-md-6">
  457.                   <label class="form-label">Nombre de participants</label>
  458.                   <input type="number" class="form-control" name="NbEnfant" min="1" 
  459.                          placeholder="Nombre d'enfants">
  460.                 </div>
  461.                 <div class="col-md-6">
  462.                   <label class="form-label">Date début séjour <span class="text-danger">*</span></label>
  463.                   <input type="date" class="form-control" name="date_debut_sejour" required>
  464.                   <div class="invalid-feedback">Veuillez saisir la date de début.</div>
  465.                 </div>
  466.                 <div class="col-md-6">
  467.                   <label class="form-label">Date fin séjour <span class="text-danger">*</span></label>
  468.                   <input type="date" class="form-control" name="date_fin_sejour" required>
  469.                   <div class="invalid-feedback">Veuillez saisir la date de fin.</div>
  470.                 </div>
  471.                 <div class="col-12 d-flex gap-2 mt-4">
  472.                   <button type="submit" class="btn btn-primary px-4">
  473.                     <i class="bi bi-rocket me-2"></i>Créer mon espace séjour (Type PP)
  474.                   </button>
  475.                   <a href="#" class="btn btn-outline-secondary" data-action="cta_demo">
  476.                     Besoin d'aide ? Démo
  477.                   </a>
  478.                 </div>
  479.               </div>
  480.             </form>
  481.           </div>
  482.           <button type="button" id="backToStep1" class="btn btn-link mt-3">
  483.             <i class="bi bi-arrow-left me-1"></i> Retour au choix du profil
  484.           </button>
  485.         </div>
  486.       </div>
  487.       <div class="modal-footer border-top-0">
  488.         <p class="small text-muted mb-0">Sans engagement · Données hébergées en France 🇫🇷</p>
  489.       </div>
  490.     </div>
  491.   </div>
  492. </div>
  493. <style>
  494. .select-role {
  495.   cursor: pointer;
  496.   transition: all 0.3s ease;
  497. }
  498. .select-role:hover,
  499. .select-role:focus {
  500.   transform: translateY(-5px);
  501.   box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  502.   border-color: var(--bs-primary) !important;
  503. }
  504. .select-role:active {
  505.   transform: translateY(-2px);
  506. }
  507. .hover-shadow {
  508.   transition: box-shadow 0.3s ease;
  509. }
  510. .bg-purple {
  511.   background-color: #6f42c1 !important;
  512. }
  513. </style>
  514. <script>
  515.   // Protection contre les erreurs de la toolbar Symfony
  516.   (function() {
  517.     // Désactiver complètement Sfjs
  518.     window.Sfjs = {
  519.       loadToolbar: function() { console.log('Sfjs.loadToolbar désactivé'); },
  520.       showToolbar: function() { console.log('Sfjs.showToolbar désactivé'); },
  521.       hideToolbar: function() { console.log('Sfjs.hideToolbar désactivé'); },
  522.       initToolbar: function() { console.log('Sfjs.initToolbar désactivé'); }
  523.     };
  524.     
  525.     // Désactiver les requêtes vers _wdt si elles échouent
  526.     const originalFetch = window.fetch;
  527.     window.fetch = function(...args) {
  528.       const url = args[0];
  529.       if (typeof url === 'string' && url.includes('/_wdt/')) {
  530.         console.warn('Requête vers _wdt bloquée:', url);
  531.         return Promise.reject(new Error('Toolbar Symfony désactivée'));
  532.       }
  533.       return originalFetch.apply(this, args);
  534.     };
  535.     
  536.     // Désactiver XMLHttpRequest vers _wdt
  537.     const originalXHROpen = XMLHttpRequest.prototype.open;
  538.     const originalXHRSend = XMLHttpRequest.prototype.send;
  539.     
  540.     XMLHttpRequest.prototype.open = function(method, url, ...args) {
  541.       this._url = url; // Stocker l'URL pour vérification dans send
  542.       if (typeof url === 'string' && url.includes('/_wdt/')) {
  543.         console.warn('Requête XHR vers _wdt bloquée:', url);
  544.         this._blocked = true;
  545.         return;
  546.       }
  547.       this._blocked = false;
  548.       return originalXHROpen.apply(this, [method, url, ...args]);
  549.     };
  550.     
  551.     XMLHttpRequest.prototype.send = function(payload) {
  552.       if (this._blocked) {
  553.         console.warn('Envoi XHR bloqué pour:', this._url);
  554.         return; // Ne pas envoyer si bloqué
  555.       }
  556.       return originalXHRSend.apply(this, arguments);
  557.     };
  558.   })();
  559.   // Supprimer complètement la toolbar Symfony du DOM
  560.   function removeSymfonyToolbar() {
  561.     const toolbar = document.querySelector('.sf-toolbar');
  562.     if (toolbar) {
  563.       toolbar.remove();
  564.       console.log('Toolbar Symfony supprimée du DOM');
  565.     }
  566.     
  567.     const clearer = document.querySelector('.sf-toolbar-clearer');
  568.     if (clearer) {
  569.       clearer.remove();
  570.     }
  571.     
  572.     const minitoolbar = document.querySelector('.sf-minitoolbar');
  573.     if (minitoolbar) {
  574.       minitoolbar.remove();
  575.     }
  576.   }
  577.   
  578.   // Supprimer immédiatement
  579.   removeSymfonyToolbar();
  580.   
  581.   // Observer pour supprimer la toolbar dès qu'elle apparaît
  582.   const observer = new MutationObserver(function(mutations) {
  583.     mutations.forEach(function(mutation) {
  584.       if (mutation.type === 'childList') {
  585.         mutation.addedNodes.forEach(function(node) {
  586.           if (node.nodeType === 1) { // Element node
  587.             if (node.classList && (node.classList.contains('sf-toolbar') || node.classList.contains('sf-minitoolbar'))) {
  588.               node.remove();
  589.               console.log('Toolbar Symfony supprimée par l\'observer');
  590.             }
  591.             // Vérifier aussi les enfants
  592.             const toolbars = node.querySelectorAll && node.querySelectorAll('.sf-toolbar, .sf-minitoolbar, .sf-toolbar-clearer');
  593.             if (toolbars) {
  594.               toolbars.forEach(tb => tb.remove());
  595.             }
  596.           }
  597.         });
  598.       }
  599.     });
  600.   });
  601.   
  602.   observer.observe(document.body, {
  603.     childList: true,
  604.     subtree: true
  605.   });
  606.   
  607.   // Ajouter du CSS pour masquer la toolbar Symfony
  608.   const style = document.createElement('style');
  609.   style.textContent = `
  610.     .sf-toolbar, .sf-toolbar-clearer, .sf-minitoolbar { 
  611.       display: none !important; 
  612.       visibility: hidden !important;
  613.       opacity: 0 !important;
  614.       height: 0 !important;
  615.       width: 0 !important;
  616.       overflow: hidden !important;
  617.     }
  618.   `;
  619.   document.head.appendChild(style);
  620.   // Masquer la toolbar Symfony si elle cause des problèmes
  621.   document.addEventListener('DOMContentLoaded', function() {
  622.     // Masquer la toolbar Symfony après 2 secondes si elle n'est pas chargée
  623.     setTimeout(() => {
  624.       const toolbar = document.querySelector('.sf-toolbar');
  625.       if (toolbar && toolbar.classList.contains('sf-display-none')) {
  626.         toolbar.style.display = 'none';
  627.         console.log('Toolbar Symfony masquée pour éviter les erreurs 404');
  628.       }
  629.     }, 2000);
  630.     // Ouvre la modale avec l'onglet adapté + pré-remplissage
  631.     document.addEventListener('click', (e) => {
  632.     // Éviter les conflits avec la toolbar Symfony
  633.     if (e.target.closest('.sf-toolbar') || e.target.closest('[id^="sf"]')) {
  634.       return;
  635.     }
  636.     
  637.     const a = e.target.closest('a[data-action="cta_demo"], a[data-action="cta_expert"]');
  638.     if (!a) return;
  639.     e.preventDefault();
  640.     const isExpert = a.dataset.action === 'cta_expert';
  641.     const pack = a.dataset.pack || '';
  642.     document.getElementById('demoTitle').textContent = isExpert ? 'Parler à un expert' : 'Demander une démo guidée';
  643.     document.getElementById('objet').value = isExpert ? 'expert' : 'demo';
  644.     document.getElementById('topic').value = isExpert ? 'expert' : 'demo';
  645.     document.getElementById('pack').value  = pack;
  646.     // Onglet par défaut : expert => rappel / demo => calendrier
  647.     const triggerId = isExpert ? 'tab-callback' : 'tab-calendar';
  648.     const tabElement = document.getElementById(triggerId);
  649.     
  650.     if (tabElement) {
  651.       // Désactiver tous les onglets
  652.       document.querySelectorAll('#demoTabs .nav-link').forEach(tab => {
  653.         tab.classList.remove('active');
  654.         tab.setAttribute('aria-selected', 'false');
  655.       });
  656.       
  657.       // Désactiver tous les panneaux
  658.       document.querySelectorAll('.tab-pane').forEach(pane => {
  659.         pane.classList.remove('show', 'active');
  660.       });
  661.       
  662.       // Activer l'onglet sélectionné
  663.       tabElement.classList.add('active');
  664.       tabElement.setAttribute('aria-selected', 'true');
  665.       
  666.       // Activer le panneau correspondant
  667.       const targetPane = document.querySelector(tabElement.getAttribute('data-bs-target'));
  668.       if (targetPane) {
  669.         targetPane.classList.add('show', 'active');
  670.       }
  671.     }
  672.     const modal = bootstrap.Modal.getOrCreateInstance(document.getElementById('demoModal'));
  673.     modal.show();
  674.   });
  675.   // Validation form + anti double-submit pour le formulaire de démo
  676.   (function () {
  677.     const form = document.getElementById('contactForm');
  678.     const btn  = document.getElementById('submitBtn');
  679.     if (!form || !btn) return;
  680.     // Protection contre les soumissions multiples
  681.     let isSubmitting = false;
  682.     
  683.     // Nettoyer les classes d'erreur quand l'utilisateur tape
  684.     form.addEventListener('input', function(e) {
  685.       if (e.target.classList.contains('is-invalid')) {
  686.         e.target.classList.remove('is-invalid');
  687.       }
  688.     });
  689.     
  690.     form.addEventListener('submit', function(e){
  691.       e.preventDefault(); // Toujours empêcher la soumission normale
  692.       
  693.       // Éviter les soumissions multiples
  694.       if (isSubmitting) return;
  695.       isSubmitting = true;
  696.       
  697.       // Nettoyer les messages précédents
  698.       const existingAlerts = form.parentNode.querySelectorAll('.alert');
  699.       existingAlerts.forEach(alert => alert.remove());
  700.       
  701.       if (!form.checkValidity()) {
  702.         e.stopPropagation();
  703.         form.classList.add('was-validated');
  704.         
  705.         // Afficher les messages d'erreur pour chaque champ invalide
  706.         const invalidFields = form.querySelectorAll(':invalid');
  707.         invalidFields.forEach(field => {
  708.           field.classList.add('is-invalid');
  709.         });
  710.         
  711.         // Afficher un message d'erreur général
  712.         const errorAlert = document.createElement('div');
  713.         errorAlert.className = 'alert alert-warning mt-3';
  714.         errorAlert.innerHTML = `
  715.           <div class="d-flex align-items-center">
  716.             <i class="bi bi-exclamation-triangle-fill me-2"></i>
  717.             <div>
  718.               <strong>Veuillez corriger les erreurs :</strong><br>
  719.               Tous les champs marqués d'un astérisque (*) sont obligatoires.
  720.             </div>
  721.           </div>
  722.         `;
  723.         form.parentNode.insertBefore(errorAlert, form.nextSibling);
  724.         
  725.         // Supprimer le message après 5 secondes
  726.         setTimeout(() => {
  727.           if (errorAlert.parentNode) {
  728.             errorAlert.parentNode.removeChild(errorAlert);
  729.           }
  730.         }, 5000);
  731.         
  732.         isSubmitting = false;
  733.         return;
  734.       } 
  735.       // Désactiver le bouton pendant l'envoi
  736.       btn.disabled = true; 
  737.       const originalText = btn.textContent;
  738.       btn.textContent = 'Envoi en cours…';
  739.       // Récupérer les données du formulaire
  740.       const formData = new FormData(form);
  741.       
  742.       // Debug : afficher les données envoyées
  743.       console.log('=== DEBUG FORMULAIRE ===');
  744.       console.log('Données du formulaire :');
  745.       const formDataObj = {};
  746.       for (let [key, value] of formData.entries()) {
  747.         console.log(key + ': "' + value + '"');
  748.         formDataObj[key] = value;
  749.       }
  750.       console.log('Objet complet:', formDataObj);
  751.       
  752.       // Vérifier les champs obligatoires
  753.       const requiredFields = ['name', 'organization', 'email', 'telephone', 'sejours_count', 'consent'];
  754.       const missingFields = [];
  755.       requiredFields.forEach(field => {
  756.         if (!formDataObj[field] || formDataObj[field].trim() === '') {
  757.           missingFields.push(field);
  758.         }
  759.       });
  760.       
  761.       if (missingFields.length > 0) {
  762.         console.error('Champs manquants:', missingFields);
  763.         alert('Champs manquants: ' + missingFields.join(', '));
  764.         isSubmitting = false;
  765.         return;
  766.       }
  767.       
  768.       console.log('Tous les champs obligatoires sont remplis ✅');
  769.       // Envoyer la requête AJAX
  770.       fetch(form.action, {
  771.         method: 'POST',
  772.         body: formData,
  773.         headers: {
  774.           'X-Requested-With': 'XMLHttpRequest'
  775.         }
  776.       })
  777.       .then(response => response.json())
  778.       .then(data => {
  779.         if (data.success) {
  780.           // Afficher le message de succès
  781.           const successAlert = document.createElement('div');
  782.           successAlert.className = 'alert alert-success mt-3';
  783.           successAlert.innerHTML = `
  784.             <div class="d-flex align-items-center">
  785.               <i class="bi bi-check-circle-fill me-2"></i>
  786.               <div>
  787.                 <strong>Demande envoyée !</strong><br>
  788.                 ${data.message}
  789.               </div>
  790.             </div>
  791.           `;
  792.           form.parentNode.insertBefore(successAlert, form.nextSibling);
  793.           
  794.           // Réinitialiser le formulaire
  795.           form.reset();
  796.           form.classList.remove('was-validated');
  797.           
  798.           // Fermer le modal après 3 secondes
  799.           setTimeout(() => {
  800.             const modal = bootstrap.Modal.getInstance(document.getElementById('demoModal'));
  801.             if (modal) modal.hide();
  802.           }, 3000);
  803.         } else {
  804.           // Afficher le message d'erreur
  805.           const errorAlert = document.createElement('div');
  806.           errorAlert.className = 'alert alert-danger mt-3';
  807.           errorAlert.innerHTML = `
  808.             <div class="d-flex align-items-center">
  809.               <i class="bi bi-exclamation-triangle-fill me-2"></i>
  810.               <div>
  811.                 <strong>Erreur :</strong><br>
  812.                 ${data.message}
  813.               </div>
  814.             </div>
  815.           `;
  816.           form.parentNode.insertBefore(errorAlert, form.nextSibling);
  817.           
  818.           // Supprimer le message d'erreur après 8 secondes
  819.           setTimeout(() => {
  820.             if (errorAlert.parentNode) {
  821.               errorAlert.parentNode.removeChild(errorAlert);
  822.             }
  823.           }, 8000);
  824.         }
  825.       })
  826.       .catch(error => {
  827.         console.error('Erreur:', error);
  828.         const errorAlert = document.createElement('div');
  829.         errorAlert.className = 'alert alert-danger mt-3';
  830.         errorAlert.innerHTML = `
  831.           <div class="d-flex align-items-center">
  832.             <i class="bi bi-exclamation-triangle-fill me-2"></i>
  833.             <div>
  834.               <strong>Erreur technique :</strong><br>
  835.               Une erreur est survenue lors de l'envoi. Veuillez réessayer plus tard.
  836.             </div>
  837.           </div>
  838.         `;
  839.         form.parentNode.insertBefore(errorAlert, form.nextSibling);
  840.         
  841.         // Supprimer le message d'erreur après 10 secondes
  842.         setTimeout(() => {
  843.           if (errorAlert.parentNode) {
  844.             errorAlert.parentNode.removeChild(errorAlert);
  845.           }
  846.         }, 10000);
  847.       })
  848.       .finally(() => {
  849.         // Réactiver le bouton et le flag de soumission
  850.         btn.disabled = false;
  851.         btn.textContent = originalText;
  852.         isSubmitting = false;
  853.         
  854.         // Supprimer les anciennes alertes après 5 secondes
  855.         setTimeout(() => {
  856.           const alerts = form.parentNode.querySelectorAll('.alert');
  857.           alerts.forEach(alert => alert.remove());
  858.         }, 5000);
  859.       });
  860.     });
  861.   })();
  862.   // ===== GESTION MODALE "CRÉER MON SÉJOUR" =====
  863.   const createSejourModal = document.getElementById('createSejourModal');
  864.   const step1 = document.getElementById('step1');
  865.   const step2 = document.getElementById('step2');
  866.   const stepLabel = document.getElementById('stepLabel');
  867.   const stepDescription = document.getElementById('stepDescription');
  868.   const backToStep1Btn = document.getElementById('backToStep1');
  869.   
  870.   let currentRole = null;
  871.   let isSubmittingCreate = false;
  872.   // Fonction helper pour le tracking GA4
  873.   function trackEvent(eventName, params = {}) {
  874.     if (typeof gtag === 'function') {
  875.       gtag('event', eventName, params);
  876.       console.log('📊 GA4 Event:', eventName, params);
  877.     }
  878.   }
  879.   // Reset de la modale à l'ouverture
  880.   createSejourModal.addEventListener('show.bs.modal', function () {
  881.     // Reset aux valeurs initiales
  882.     step1.classList.remove('d-none');
  883.     step2.classList.add('d-none');
  884.     stepLabel.textContent = 'Étape 1/2';
  885.     stepDescription.textContent = 'Choisissez votre profil';
  886.     currentRole = null;
  887.     
  888.     // Masquer tous les panneaux de formulaire
  889.     document.querySelectorAll('.role-pane').forEach(pane => pane.classList.add('d-none'));
  890.     
  891.     // Reset de tous les formulaires
  892.     ['formEcole', 'formPartenaire', 'formAutre'].forEach(formId => {
  893.       const form = document.getElementById(formId);
  894.       if (form) {
  895.         form.reset();
  896.         form.classList.remove('was-validated');
  897.       }
  898.     });
  899.     // Focus sur le titre de la modale
  900.     setTimeout(() => {
  901.       document.getElementById('createSejourTitle').focus();
  902.     }, 300);
  903.   });
  904.   // Gestion du clic sur les cartes de sélection de rôle
  905.   document.querySelectorAll('.select-role').forEach(card => {
  906.     card.addEventListener('click', function() {
  907.       const role = this.dataset.role;
  908.       selectRole(role);
  909.     });
  910.     
  911.     // Support du clavier
  912.     card.addEventListener('keypress', function(e) {
  913.       if (e.key === 'Enter' || e.key === ' ') {
  914.         e.preventDefault();
  915.         const role = this.dataset.role;
  916.         selectRole(role);
  917.       }
  918.     });
  919.   });
  920.   function selectRole(role) {
  921.     currentRole = role;
  922.     
  923.     // Track event GA4
  924.     trackEvent('step_select_role', { role: role });
  925.     
  926.     // Si école publique → Redirection directe vers /Accompagnateur/login avec type EF
  927.     if (role === 'ecole_publique') {
  928.       // Fermer la modale
  929.       bootstrap.Modal.getInstance(createSejourModal)?.hide();
  930.       
  931.       // Rediriger vers la page de login avec le paramètre type EF et source
  932.       window.location.href = '/Accompagnateur/login?type=EF&from=modal';
  933.       return;
  934.     }
  935.     
  936.     // Passage à l'étape 2 pour les autres profils
  937.     step1.classList.add('d-none');
  938.     step2.classList.remove('d-none');
  939.     stepLabel.textContent = 'Étape 2/2';
  940.     
  941.     // Afficher le panneau correspondant
  942.     document.querySelectorAll('.role-pane').forEach(pane => pane.classList.add('d-none'));
  943.     
  944.     let roleLabel = '';
  945.     if (role === 'partenaire') {
  946.       document.getElementById('pane-partenaire').classList.remove('d-none');
  947.       roleLabel = 'Partenaire / Organisme';
  948.       // Lazy load Calendly pour le partenaire
  949.       lazyLoadCalendlyIfNeeded('#pane-partenaire-demo iframe');
  950.     } else if (role === 'autre') {
  951.       document.getElementById('pane-autre').classList.remove('d-none');
  952.       roleLabel = 'Création simple';
  953.       setTimeout(() => document.querySelector('#pane-autre input')?.focus(), 300);
  954.     }
  955.     
  956.     stepDescription.textContent = roleLabel;
  957.   }
  958.   // Retour à l'étape 1
  959.   backToStep1Btn.addEventListener('click', function() {
  960.     step1.classList.remove('d-none');
  961.     step2.classList.add('d-none');
  962.     stepLabel.textContent = 'Étape 1/2';
  963.     stepDescription.textContent = 'Choisissez votre profil';
  964.     currentRole = null;
  965.   });
  966.   // Lazy load Calendly
  967.   function lazyLoadCalendlyIfNeeded(selector) {
  968.     const iframe = document.querySelector(selector);
  969.     if (iframe && iframe.hasAttribute('data-src') && !iframe.src) {
  970.       iframe.src = iframe.getAttribute('data-src');
  971.       console.log('📅 Calendly chargé:', iframe.src);
  972.     }
  973.   }
  974.   // Lazy load Calendly pour modale démo (onglet calendrier)
  975.   const tabCalendar = document.getElementById('tab-calendar');
  976.   if (tabCalendar) {
  977.     tabCalendar.addEventListener('shown.bs.tab', function() {
  978.       lazyLoadCalendlyIfNeeded('#pane-calendar iframe');
  979.     });
  980.   }
  981.   // Lazy load Calendly pour modale créer séjour (onglet demo partenaire)
  982.   const tabPartenaireDemo = document.getElementById('tab-partenaire-demo');
  983.   if (tabPartenaireDemo) {
  984.     tabPartenaireDemo.addEventListener('shown.bs.tab', function() {
  985.       lazyLoadCalendlyIfNeeded('#pane-partenaire-demo iframe');
  986.     });
  987.   }
  988.   // Gestion des radios "qui paie" avec tracking
  989.   document.querySelectorAll('input[name="payer"]').forEach(radio => {
  990.     radio.addEventListener('change', function() {
  991.       trackEvent('toggle_payer', { who_pays: this.value });
  992.     });
  993.   });
  994.   // Fonction générique de soumission de formulaire avec AJAX
  995.   function setupFormSubmission(formId, onSuccess) {
  996.     const form = document.getElementById(formId);
  997.     if (!form) return;
  998.     form.addEventListener('submit', function(e) {
  999.       e.preventDefault();
  1000.       // Éviter les doubles soumissions
  1001.       if (isSubmittingCreate) {
  1002.         return;
  1003.       }
  1004.       // Valider le formulaire
  1005.       if (!form.checkValidity()) {
  1006.         form.classList.add('was-validated');
  1007.         
  1008.         // Afficher un message d'avertissement
  1009.         const warningAlert = document.createElement('div');
  1010.         warningAlert.className = 'alert alert-warning mt-3';
  1011.         warningAlert.innerHTML = `
  1012.           <div class="d-flex align-items-center">
  1013.             <i class="bi bi-exclamation-triangle-fill me-2"></i>
  1014.             <div>
  1015.               <strong>Veuillez corriger les erreurs :</strong><br>
  1016.               Tous les champs marqués d'un astérisque (*) sont obligatoires.
  1017.             </div>
  1018.           </div>
  1019.         `;
  1020.         form.parentNode.insertBefore(warningAlert, form.nextSibling);
  1021.         setTimeout(() => warningAlert.remove(), 5000);
  1022.         return;
  1023.       }
  1024.       isSubmittingCreate = true;
  1025.       // Track event GA4
  1026.       trackEvent('form_submit', { form_id: formId });
  1027.       // Désactiver le bouton
  1028.       const btn = form.querySelector('button[type="submit"]');
  1029.       btn.disabled = true;
  1030.       const originalText = btn.textContent;
  1031.       btn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Envoi en cours…';
  1032.       // Soumettre via fetch
  1033.       const formData = new FormData(form);
  1034.       fetch(form.action, {
  1035.         method: 'POST',
  1036.         body: formData,
  1037.         headers: {
  1038.           'X-Requested-With': 'XMLHttpRequest'
  1039.         }
  1040.       })
  1041.       .then(response => response.json())
  1042.       .then(data => {
  1043.         if (data.idSejour) {
  1044.           // Succès ! Le séjour a été créé
  1045.           
  1046.           // Track event GA4 de succès
  1047.           trackEvent('create_sejour_success', {
  1048.             role: currentRole,
  1049.             sejour_id: data.idSejour,
  1050.             code_sejour: data.codeSejour || 'N/A'
  1051.           });
  1052.           // Afficher le message de succès
  1053.           const successAlert = document.createElement('div');
  1054.           successAlert.className = 'alert alert-success mt-3';
  1055.           successAlert.innerHTML = `
  1056.             <div class="d-flex align-items-center">
  1057.               <i class="bi bi-check-circle-fill me-2"></i>
  1058.               <div>
  1059.                 <strong>✅ Séjour créé avec succès !</strong><br>
  1060.                 ${data.codeSejour ? 'Code séjour : <strong>' + data.codeSejour + '</strong><br>' : ''}
  1061.                 Vous allez être redirigé vers votre espace...
  1062.               </div>
  1063.             </div>
  1064.           `;
  1065.           form.parentNode.insertBefore(successAlert, form.nextSibling);
  1066.           // Reset le formulaire
  1067.           form.reset();
  1068.           form.classList.remove('was-validated');
  1069.           // Rediriger après 2 secondes vers l'espace accompagnateur
  1070.           setTimeout(() => {
  1071.        
  1072.           }, 2000);
  1073.           // Callback optionnel
  1074.           if (onSuccess) onSuccess(data);
  1075.         } else if (data.success === false) {
  1076.           // Erreur métier
  1077.           const errorAlert = document.createElement('div');
  1078.           errorAlert.className = 'alert alert-danger mt-3';
  1079.           errorAlert.innerHTML = `
  1080.             <div class="d-flex align-items-center">
  1081.               <i class="bi bi-x-circle-fill me-2"></i>
  1082.               <div>
  1083.                 <strong>Erreur :</strong><br>
  1084.                 ${data.message || 'Une erreur est survenue lors de la création du séjour.'}
  1085.               </div>
  1086.             </div>
  1087.           `;
  1088.           form.parentNode.insertBefore(errorAlert, form.nextSibling);
  1089.           setTimeout(() => errorAlert.remove(), 7000);
  1090.         } else {
  1091.           // Réponse inattendue
  1092.           console.warn('Réponse inattendue:', data);
  1093.           const warningAlert = document.createElement('div');
  1094.           warningAlert.className = 'alert alert-warning mt-3';
  1095.           warningAlert.innerHTML = `
  1096.             <div class="d-flex align-items-center">
  1097.               <i class="bi bi-exclamation-triangle-fill me-2"></i>
  1098.               <div>
  1099.                 <strong>Attention :</strong><br>
  1100.                 La création du séjour a peut-être réussi. Vérifiez votre espace.
  1101.               </div>
  1102.             </div>
  1103.           `;
  1104.           form.parentNode.insertBefore(warningAlert, form.nextSibling);
  1105.           setTimeout(() => {
  1106.             window.location.href = '/Accompagnateur/login';
  1107.           }, 3000);
  1108.         }
  1109.       })
  1110.       .catch(error => {
  1111.         console.error('Erreur:', error);
  1112.         const errorAlert = document.createElement('div');
  1113.         errorAlert.className = 'alert alert-danger mt-3';
  1114.         errorAlert.innerHTML = `
  1115.           <div class="d-flex align-items-center">
  1116.             <i class="bi bi-x-circle-fill me-2"></i>
  1117.             <div>
  1118.               <strong>Erreur technique :</strong><br>
  1119.               Une erreur réseau est survenue. Veuillez réessayer plus tard.
  1120.             </div>
  1121.           </div>
  1122.         `;
  1123.         form.parentNode.insertBefore(errorAlert, form.nextSibling);
  1124.         setTimeout(() => errorAlert.remove(), 7000);
  1125.       })
  1126.       .finally(() => {
  1127.         btn.disabled = false;
  1128.         btn.innerHTML = originalText;
  1129.         isSubmittingCreate = false;
  1130.       });
  1131.     });
  1132.   }
  1133.   // Setup tous les formulaires de la modale "Créer mon séjour"
  1134.   // formEcole supprimé car redirection directe vers /Accompagnateur/login
  1135.   setupFormSubmission('formPartenaire');
  1136.   setupFormSubmission('formAutre');
  1137.   // Délégation d'événements pour tous les CTA avec data-action
  1138.   document.addEventListener('click', function(e) {
  1139.     // Éviter les conflits avec la toolbar Symfony
  1140.     if (e.target.closest('.sf-toolbar') || e.target.closest('[id^="sf"]')) {
  1141.       return;
  1142.     }
  1143.     const target = e.target.closest('[data-action]');
  1144.     if (!target) return;
  1145.     const action = target.dataset.action;
  1146.     const pack = target.dataset.pack || '';
  1147.     // Track event GA4
  1148.     trackEvent('cta_open_modal', { action: action, pack: pack });
  1149.     if (action === 'cta_create') {
  1150.       // Ouvrir la modale "Créer mon séjour"
  1151.       e.preventDefault();
  1152.       const modal = new bootstrap.Modal(createSejourModal);
  1153.       modal.show();
  1154.     } else if (action === 'cta_demo' || action === 'cta_expert') {
  1155.       // Ouvrir la modale demo/expert existante
  1156.       e.preventDefault();
  1157.       const demoModal = document.getElementById('demoModal');
  1158.       const modal = new bootstrap.Modal(demoModal);
  1159.       
  1160.       const isExpert = action === 'cta_expert';
  1161.       
  1162.       // Changer le titre
  1163.       document.getElementById('demoTitle').textContent = isExpert ? 'Parler à un expert' : 'Demander une démo guidée';
  1164.       
  1165.       // Pré-remplir les champs cachés
  1166.       document.getElementById('objet').value = isExpert ? 'expert' : 'demo';
  1167.       document.getElementById('topic').value = isExpert ? 'expert' : 'demo';
  1168.       document.getElementById('pack').value = pack;
  1169.       
  1170.       // Activer le bon onglet
  1171.       const tabCalendar = document.getElementById('tab-calendar');
  1172.       const tabCallback = document.getElementById('tab-callback');
  1173.       const paneCalendar = document.getElementById('pane-calendar');
  1174.       const paneCallback = document.getElementById('pane-callback');
  1175.       
  1176.       if (isExpert) {
  1177.         // Expert → Onglet "Être rappelé"
  1178.         tabCalendar.classList.remove('active');
  1179.         tabCallback.classList.add('active');
  1180.         paneCalendar.classList.remove('show', 'active');
  1181.         paneCallback.classList.add('show', 'active');
  1182.       } else {
  1183.         // Démo → Onglet "Réserver un créneau"
  1184.         tabCallback.classList.remove('active');
  1185.         tabCalendar.classList.add('active');
  1186.         paneCallback.classList.remove('show', 'active');
  1187.         paneCalendar.classList.add('show', 'active');
  1188.         
  1189.         // Lazy load Calendly
  1190.         lazyLoadCalendlyIfNeeded('#pane-calendar iframe');
  1191.       }
  1192.       
  1193.       modal.show();
  1194.     }
  1195.   });
  1196.   }); // Fin du DOMContentLoaded
  1197. </script>
  1198.     <!-- ======= Site Wrap =======-->
  1199.     <div class="site-wrap">
  1200.       
  1201.       <!-- ======= Header =======-->
  1202.       <header class="fbs__net-navbar navbar navbar-expand-lg dark" aria-label="freebootstrap.net navbar">
  1203.         <div class="container d-flex align-items-center justify-content-between">
  1204.           
  1205.           <!-- Start Logo-->
  1206.           <a class="navbar-brand w-auto" href="#">
  1207.             <img class="logo dark img-fluid" src="{{ asset('Accueil/imagesAccueil/logoHeader.png') }}" alt="5sur5séjour logo" style="height: 65px;">
  1208.           </a>
  1209.           <!-- End Logo-->
  1210.           
  1211.           <!-- Start offcanvas-->
  1212.           <div class="offcanvas offcanvas-start w-75" id="fbs__net-navbars" tabindex="-1" aria-labelledby="fbs__net-navbarsLabel">
  1213.             
  1214.             <div class="offcanvas-header">
  1215.               <div class="offcanvas-header-logo">
  1216.                 <a class="logo-link" id="fbs__net-navbarsLabel" href="#">
  1217.                   <img class="logo light img-fluid" src="{{ asset('Accueil/imagesAccueil/logoHeader.png') }}" alt="5sur5séjour logo" style="height: 60px;">
  1218.                 </a>
  1219.               </div>
  1220.               <button class="btn-close btn-close-black" type="button" data-bs-dismiss="offcanvas" aria-label="Close"></button>
  1221.             </div>
  1222.             
  1223.             <div class="offcanvas-body align-items-lg-center">
  1224.               
  1225.               <ul class="navbar-nav nav me-auto ps-lg-5 mb-2 mb-lg-0">
  1226.                 <li class="nav-item"><a class="nav-link scroll-link" href="#about">A propos</a></li>
  1227.                 <li class="nav-item"><a class="nav-link scroll-link" href="#how-it-works">Comment ça marche</a></li>
  1228.                 <li class="nav-item"><a class="nav-link scroll-link" href="#pricing">Nos offres</a></li>
  1229.                 <li class="nav-item"><a class="nav-link scroll-link" href="#contact">Contact</a></li>
  1230.                 <li class="nav-item dropdown">
  1231.                   <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false">Nos produits <i class="bi bi-chevron-down"></i></a>
  1232.                   <ul class="dropdown-menu">
  1233.                     <li class="nav-item"><a class="nav-link" href="{{ path('pack_annuel_partenaires') }}">Pack Annuel Partenaires</a></li>
  1234.                     <li><hr class="dropdown-divider"></li>
  1235.                                                 {% for produit in produit %}
  1236.                                                     {% if produit.labeleType!="Connexion" %}
  1237.                                        <li class="nav-item"><a class="nav-link scroll-link" href="{{path('album',{'id':produit.labeleType})}}"> {{produit.labeleType}}</a></li>
  1238.                                                     {% endif %}
  1239.                                                 {% endfor %}
  1240.                    
  1241.                   </ul>
  1242.                 </li>
  1243.               </ul>
  1244.               
  1245.             </div>
  1246.           </div>
  1247.           <!-- End offcanvas-->
  1248.           
  1249.           <div class="ms-auto w-auto">
  1250.             
  1251.             <div class="header-social d-flex align-items-center gap-1">
  1252.               <a class="btn btn-primary py-2" href="#jemeconnecte">Je me connecte</a>
  1253.               
  1254.               <button class="fbs__net-navbar-toggler justify-content-center align-items-center ms-auto" data-bs-toggle="offcanvas" data-bs-target="#fbs__net-navbars" aria-controls="fbs__net-navbars" aria-label="Toggle navigation" aria-expanded="false">
  1255.                 <svg class="fbs__net-icon-menu" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  1256.                   <line x1="21" x2="3" y1="6" y2="6"></line>
  1257.                   <line x1="15" x2="3" y1="12" y2="12"></line>
  1258.                   <line x1="17" x2="3" y1="18" y2="18"></line>
  1259.                 </svg>
  1260.                 <svg class="fbs__net-icon-close" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  1261.                   <path d="M18 6 6 18"></path>
  1262.                   <path d="m6 6 12 12"></path>
  1263.                 </svg>
  1264.               </button>
  1265.               
  1266.             </div>
  1267.             
  1268.           </div>
  1269.         </div>
  1270.       </header>
  1271.       <!-- End Header-->
  1272.       
  1273.       <!-- ======= Main =======-->
  1274.       <main>
  1275.        
  1276.            <!-- ======= Hero =======-->
  1277.         <section class="hero__v6 section" id="home">
  1278.           <div class="container">
  1279.             <div class="row">
  1280.               <div class="col-lg-6 mb-4 mb-lg-0">
  1281.                 <div class="row">
  1282.                   <div class="col-lg-11">
  1283.                     <span class="hero-subtitle text-uppercase" data-aos="fade-up" data-aos-delay="0">La solution sécurisée qui rassure les familles et libère vos équipes</span>
  1284.                     <h1 class="hero-title mb-3" data-aos="fade-up" data-aos-delay="100"> Avec 5sur5Séjour, transformez chaque séjour en une expérience sereine et valorisante.</h1>
  1285.                     <p class="hero-description mb-4 mb-lg-5" data-aos="fade-up" data-aos-delay="200">🤝 Un accompagnement humain dédié| 📞 Des appels vocaux automatiques aux familles | 🔒 100% conforme RGPD & hébergé en France</p>
  1286.                     <a  class="btn btn-lg btn-primary px-4 w-100 w-sm-auto" style="background:color-mix(in srgb, var(--bs-secondary), transparent 70%);color:#41a2aa"
  1287.               href="{{ path('pack_annuel_partenaires') }}">
  1288.             Devenir partenaire
  1289.             <svg class="ms-2" xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
  1290.               <path d="M7 7h10v10"></path><path d="M7 17 17 7"></path>
  1291.             </svg>
  1292.           </a>
  1293.                   </div>
  1294.                 </div>
  1295.               </div>
  1296.               <div class="col-lg-6">
  1297.                 <div class="hero-img">
  1298.                   <img class="img-card img-fluid" style="background: radial-gradient(gray, transparent);border-radius: 30px;" src="{{ asset('Accueil/imagesAccueil/demo1.png') }}" alt="Image card" data-aos="fade-down" data-aos-delay="600">
  1299.                   <img class="img-main img-fluid rounded-4" src="{{ asset('images/smiling_5sur5.svg') }}" alt="Hero Image" data-aos="fade-in" data-aos-delay="500">
  1300.                 </div>
  1301.                   <!-- Bouton CTA -->
  1302.                     <!-- CTAs -->
  1303.         <div class="d-flex flex-wrap gap-3 align-items-center mb-2" data-aos="fade-up" data-aos-delay="250"  style="margin-top:15%">
  1304.           <a class="btn btn-lg btn-primary px-4 w-100 w-sm-auto" href="#" data-action="cta_create" data-pack="creation">
  1305.             Créer mon espace séjour 
  1306.             <svg class="ms-2" xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
  1307.               <path d="M7 7h10v10"></path><path d="M7 17 17 7"></path>
  1308.             </svg>
  1309.           </a>
  1310.         
  1311.         </div>
  1312.     
  1313.         <!-- Preuve sociale courte -->
  1314.         <div class="logos mt-4" data-aos="fade-up" data-aos-delay="350">
  1315.         <p class="text-primary-emphasis text-uppercase small mt-4 mb-0">
  1316.   Déjà adopté par <strong>1 500+</strong> écoles, centres de loisirs et associations en France
  1317. </p>
  1318.         </div>
  1319.               </div>
  1320.     
  1321.             </div>
  1322.           </div>
  1323.           <!-- End Hero-->
  1324.         </section>
  1325.         <!-- End Hero-->
  1326.         
  1327.         <!-- ======= Vignettes Section =======-->
  1328.         <section class="about_wrap_area aboutWrapper mb-5">
  1329.           <div class="container" id="jemeconnecte">
  1330.             <div class="row">
  1331.               <div class="col-xl-4 col-md-4 col-lg-4">
  1332.                 <div class="single_service_wrap text-center vignetteContent" data-aos="fade-up" data-aos-delay="0">
  1333.                   <img class="imageParent" src="{{ asset('Accueil/imagesAccueil/son_sejour.svg') }}" alt="Parent">
  1334.                   <h3 class="titreVignette">Vous êtes parent</h3>
  1335.                   <p class="txtVignette">Consultez les photos et vidéos à tout moment, <b>et soyez appelé dès qu'un nouveau message vocal est déposé — restez connectés au séjour, où que vous soyez.</b> </p>
  1336.                   <a href="{{ path('app_back_Parent') }}" class="btn btn-primary py-2">Je me connecte</a>
  1337.                 </div>
  1338.               </div>
  1339.               <div class="col-xl-4 col-md-4 col-lg-4">
  1340.                 <div class="single_service_wrap text-center vignetteContent" data-aos="fade-up" data-aos-delay="200">
  1341.                   <img class="imageAcc" src="{{ asset('Accueil/imagesAccueil/espceAcc.svg') }}" alt="Accompagnateur">
  1342.                   <h3 class="titreVignette titreAcc">Vous êtes accompagnateur</h3>
  1343.                   <p class="txtVignette txtAcc">Partagez facilement photos et messages pour rassurer les familles — créez et gérez vos séjours en toute simplicité. </p>
  1344.                   <a  data-bs-toggle="modal" data-bs-target="#loginModal"  class="btn btn-primary py-2">Je me connecte</a>
  1345.                 </div>
  1346.               </div>
  1347.               <div class="col-xl-4 col-md-4 col-lg-4">
  1348.                 <div class="single_service_wrap text-center vignetteContent" data-aos="fade-up" data-aos-delay="400">
  1349.                   <img class="imagePartenaire" src="{{ asset('Accueil/imagesAccueil/espcPart.svg') }}" alt="Partenaire">
  1350.                   <h3 class="titreVignette titrePartenaire">Vous êtes partenaire</br></h3>
  1351.                   <p class="txtVignette txtPartenaire">
  1352.                     <br/>Créez et gérez tous vos séjours depuis un espace dédié, avec un service client sur mesure et des outils pensés pour vous.</p>
  1353.                   <a data-bs-toggle="modal" data-bs-target="#partnerLoginModal" class="btn btn-primary py-2">Je me connecte</a>
  1354.                 </div>
  1355.               </div>
  1356.             </div>
  1357.           </div>
  1358.         </section>
  1359.         <!-- End Vignettes -->
  1360.         
  1361.     
  1362.         <!-- ======= Pourquoi nous choisir =======-->
  1363.         <section class="section features__v2" id="about">
  1364.           <div class="container">
  1365.             <div class="row">
  1366.               <div class="col-12">
  1367.                 <div class="d-lg-flex p-5 rounded-4 content" data-aos="fade-in" data-aos-delay="0">
  1368.                   <div class="row">
  1369.                     <div class="col-lg-5 mb-5 mb-lg-0" data-aos="fade-up" data-aos-delay="0">
  1370.                       <div class="row"> 
  1371.                         <div class="col-lg-11">
  1372.                           <div class="h-100 flex-column justify-content-between d-flex">
  1373.                             <div>
  1374.                               <h2 class="mb-4">Pourquoi nous choisir pour vos séjours</h2>
  1375.                               <p class="mb-5">5sur5séjour n'est pas qu'un outil pour les animateurs.
  1376. C'est une solution complète pour les professionnels qui veulent gagner du temps, rassurer les familles, et moderniser leur image.</p>
  1377.                             </div>
  1378.                             <div class="align-self-start">
  1379.                               <a class="btn btn-play d-inline-flex align-items-center gap-2" href="#" data-action="cta_create" data-pack="video">
  1380.                                 <i class="bi bi-play-fill"></i> Créer mon espace séjour maintenant
  1381.                               </a>
  1382.                             </div>
  1383.                           </div>
  1384.                         </div>
  1385.                       </div>
  1386.                     </div>
  1387.                     <div class="col-lg-7">
  1388.                       <div class="row justify-content-end">
  1389.                         <div class="col-lg-11">
  1390.                           <div class="row">
  1391.                             <div class="col-sm-6" data-aos="fade-up" data-aos-delay="0">
  1392.                               <div class="icon text-center mb-4"><i class="bi bi-person-check fs-4"></i></div>
  1393.                               <h3 class="fs-6 fw-bold mb-3">Partage sécurisé</h3>
  1394.                               <p>Galerie privée photos/vidéos, droits par groupes/classes, consentements intégrés..</p>
  1395.                             </div>
  1396.                             <div class="col-sm-6" data-aos="fade-up" data-aos-delay="100">
  1397.                               <div class="icon text-center mb-4"><i class="bi bi-graph-up fs-4"></i></div>
  1398.                               <h3 class="fs-6 fw-bold mb-3">Boîte vocale automatique  </h3>
  1399.                               <p>Chaque message déclenche un appel aux parents, même sans internet..</p>
  1400.                             </div>
  1401.                             <div class="col-sm-6" data-aos="fade-up" data-aos-delay="200">
  1402.                               <div class="icon text-center mb-4"><i class="bi bi-headset fs-4"></i></div>
  1403.                               <h3 class="fs-6 fw-bold mb-3">Temps gagné</h3>
  1404.                               <p>Publication en 2 clics, appels envoyés pour vous..</p>
  1405.                             </div>
  1406.                             <div class="col-sm-6" data-aos="fade-up" data-aos-delay="300">
  1407.                               <div class="icon text-center mb-4"><i class="bi bi-gift fs-4"></i></div>
  1408.                               <h3 class="fs-6 fw-bold mb-3">Support humain</h3>
  1409.                               <p>Onboarding, modèles prêts à l'emploi, assistance pendant les séjours..</p>
  1410.                             </div>
  1411.                           </div>
  1412.                         </div>
  1413.                       </div>
  1414.                     </div>
  1415.                   </div>
  1416.                 </div>
  1417.               </div>
  1418.             </div>
  1419.           </div>
  1420.         </section>
  1421.         <!-- End Features-->
  1422.           <!-- ======= About =======-->
  1423.         <section class="about__v4 section" id="about">
  1424.           <div class="container">
  1425.             <div class="row">
  1426.               <div class="col-md-6 order-md-2">
  1427.                 <div class="row justify-content-end">
  1428.                   <div class="col-md-11 mb-4 mb-md-0">
  1429.                     <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Service unique en France</span>
  1430.                     <h2 class="mb-4" data-aos="fade-up" data-aos-delay="100">La boîte vocale 5sur5 : vos messages, écoutés tout de suite</h2>
  1431.                     <div data-aos="fade-up" data-aos-delay="200">
  1432.                       <p>Chaque message publié déclenche automatiquement un appel aux parents — zéro rappel manuel, zéro oubli.</p>
  1433.                     </div>
  1434.                     <h4 class="small fw-bold mt-4 mb-3" data-aos="fade-up" data-aos-delay="300">La voix est bien plus consultée qu'un SMS/mail.</h4>
  1435.                     <ul class="d-flex flex-row flex-wrap list-unstyled gap-3 features" data-aos="fade-up" data-aos-delay="400">
  1436.                       <li class="d-flex align-items-center gap-2"><span class="icon rounded-circle text-center"><i class="bi bi-check"></i></span><span class="text">Impact x2–3</span></li>
  1437.                       <li class="d-flex align-items-center gap-2"><span class="icon rounded-circle text-center"><i class="bi bi-check"></i></span><span class="text">Illimitée & asynchrone</span></li>
  1438.                       <li class="d-flex align-items-center gap-2"><span class="icon rounded-circle text-center"><i class="bi bi-check"></i></span><span class="text">Traçable & conforme</span></li>
  1439.                       <li class="d-flex align-items-center gap-2"><span class="icon rounded-circle text-center"><i class="bi bi-check"></i></span><span class="text">Transparente</span></li>
  1440.                       <li class="d-flex align-items-center gap-2"><span class="icon rounded-circle text-center"><i class="bi bi-check"></i></span><span class="text">24h/24</span></li>
  1441.                     </ul>
  1442.                   </div>
  1443.                 </div>
  1444.               </div>
  1445.               <div class="col-md-6"> 
  1446.                 <div class="img-wrap position-relative">
  1447.                   <img class="img-fluid rounded-4" src="{{ asset('Accueil/imagesAccueil/feature.png') }}" alt="Sécurité 5sur5séjour" data-aos="fade-up" data-aos-delay="0" style="width: 100%; height: 300px; object-fit: cover;">
  1448.                   <div class="mission-statement p-4 rounded-4 d-flex gap-4" data-aos="fade-up" data-aos-delay="100">
  1449.                     <div class="mission-icon text-center rounded-circle"><i class="bi bi-lightbulb fs-4"></i></div>
  1450.                     <div>
  1451.                       <h3 class="text-uppercase fw-bold">Notre mission</h3>
  1452.                       <p class="fs-5 mb-0">Notre mission est de vous offrir une solution simple, fiable et professionnelle pour partager le séjour avec les familles.</p>
  1453.                     </div>
  1454.                   </div>
  1455.                 </div>
  1456.               </div>
  1457.             </div>
  1458.           </div>
  1459.         </section>
  1460.         <!-- End About-->
  1461.         <!-- ======= How it works =======-->
  1462.         <section class="section howitworks__v1" id="how-it-works">
  1463.           <div class="container">
  1464.             <div class="row mb-5">
  1465.               <div class="col-md-6 text-center mx-auto">
  1466.                 <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Comment ça marche</span>
  1467.                 <h2 data-aos="fade-up" data-aos-delay="100">Comment ça marche</h2>
  1468.                 <p data-aos="fade-up" data-aos-delay="200">Une plateforme complète qui centralise contenus et communications, pour partager le séjour avec les familles en toute simplicité, sans surcharge pour les équipes.</p>
  1469.               </div>
  1470.             </div>
  1471.             <div class="row g-md-5">
  1472.               <div class="col-md-6 col-lg-3">
  1473.                 <div class="step-card text-center h-100 d-flex flex-column justify-content-start position-relative" data-aos="fade-up" data-aos-delay="0">
  1474.                   <div data-aos="fade-right" data-aos-delay="500">
  1475.                     <img class="arch-line" src="{{ asset('Accueil/imagesAccueil/arch-line.png') }}" alt="Flèche animation">
  1476.                   </div>
  1477.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">1</span>
  1478.                   <div>
  1479.                     <h3 class="fs-5 mb-4">Créez l'espace séjour</h3>
  1480.                     <p>Créez votre séjour en quelques clics… ou confiez-nous l'import de plusieurs séjours, on s'occupe de tout..</p>
  1481.                   </div>
  1482.                 </div>
  1483.               </div>
  1484.               <div class="col-md-6 col-lg-3" data-aos="fade-up" data-aos-delay="600">
  1485.                 <div class="step-card reverse text-center h-100 d-flex flex-column justify-content-start position-relative">
  1486.                   <div data-aos="fade-right" data-aos-delay="1100">
  1487.                     <img class="arch-line reverse" src="{{ asset('Accueil/imagesAccueil/arch-line-reverse.png') }}" alt="Flèche animation">
  1488.                   </div>
  1489.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">2</span>
  1490.                   <h3 class="fs-5 mb-4">Invitez les familles</h3>
  1491.                   <p>Envoyez le code de séjour aux familles pour qu'ils rejoignent l'espace séjour. </p>
  1492.                 </div>
  1493.               </div>
  1494.               <div class="col-md-6 col-lg-3" data-aos="fade-up" data-aos-delay="1200">
  1495.                 <div class="step-card text-center h-100 d-flex flex-column justify-content-start position-relative">
  1496.                   <div data-aos="fade-right" data-aos-delay="1700">
  1497.                     <img class="arch-line" src="{{ asset('Accueil/imagesAccueil/arch-line.png') }}" alt="Flèche animation">
  1498.                   </div>
  1499.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">3</span>
  1500.                   <h3 class="fs-5 mb-4">Publiez en 2 clics</h3>
  1501.                   <p>Diffusez vos photos, vidéos et messages vocaux en toute simplicité.</p>
  1502.                 </div>
  1503.               </div>
  1504.               <div class="col-md-6 col-lg-3" data-aos="fade-up" data-aos-delay="1800">
  1505.                 <div class="step-card last text-center h-100 d-flex flex-column justify-content-start position-relative">
  1506.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">4</span>
  1507.                   <div>
  1508.                     <h3 class="fs-5 mb-4">Bilan & archive</h3>
  1509.                     <p>À la fin du séjour, accédez à un bilan complet avec statistiques, et proposez aux familles un album souvenir personnalisé.</p>
  1510.                   </div>
  1511.                 </div>
  1512.               </div>
  1513.             </div>
  1514.           </div>
  1515.         </section>
  1516.         <!-- End How it works-->
  1517.         
  1518.         <!-- ======= Pricing =======-->
  1519.         <section class="section pricing__v2" id="">
  1520.           <div class="container">
  1521.             <div class="row mb-5">
  1522.               <div class="col-md-5 mx-auto text-center">
  1523.                 <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Packs Partenaires</span>
  1524.                 <h2 class="mb-3" data-aos="fade-up" data-aos-delay="100">Plateforme premium & boîte vocale automatique</h2>
  1525.                 <p data-aos="fade-up" data-aos-delay="200">Des tarifs simples, pensés pour les écoles, centres et associations. Sans engagement, mise en place en 24 h..</p>
  1526.               </div>
  1527.             </div>
  1528.             <section class="section py-6" id="packs">
  1529.   <div class="container">
  1530.     <!-- Titre + micro-preuve + offre écoles publiques -->
  1531.    
  1532.  <section class="section py-6" id="pricing">
  1533.   <div class="container">
  1534.     <div class="text-center mb-4">
  1535.       <h2 class="mb-2">Packs Partenaires — plateforme premium & boîte vocale automatique</h2>
  1536.       <p class="text-muted mb-2">Des tarifs simples, pensés pour les écoles, centres et associations. Sans engagement, mise en place en 24 h.</p>
  1537.       <div class="small text-primary-emphasis">🎓 <strong>Écoles publiques :</strong> accès plateforme gratuit (hors options familles)</div>
  1538.                 </div>
  1539.     <div class="row g-4">
  1540.       <!-- Accès -->
  1541.       <div class="col-md-4" data-aos="fade-up" data-aos-delay="100">
  1542.         <div class="p-5 rounded-4 price-table h-100 shadow-sm">
  1543.           <div class="small text-muted mb-1">Pour démarrer</div>
  1544.           <h3 class="mb-1">Accès (Plateforme)</h3>
  1545.           <div class="display-6 fw-semibold">290 € <span class="fs-6 fw-normal">/ an / structure</span></div>
  1546.           <ul class="mt-3 mb-4">
  1547.             <li>Galerie privée <strong>photos & vidéos</strong> (groupes/classes)</li>
  1548.             <li>Consentements & <strong>RGPD</strong> (hébergé en France)</li>
  1549.             <li>Rôles & droits (direction, accompagnateurs, collectivités)</li>
  1550.             <li><strong>Boîte vocale web incluse</strong> (enregistrement + écoute web)</li>
  1551.           </ul>
  1552.           <div class="text-muted small mb-2">Bénéfice : jusqu'à <strong>–50%</strong> d'appels entrants</div>
  1553.           <button type="button" class="btn btn-outline-primary w-100" data-bs-toggle="modal" data-bs-target="#checkoutChoiceModal" data-pack="access" data-pack-price="290">Choisir ce pack</button>
  1554.                            <a class="special-link d-inline-flex gap-2 align-items-center text-decoration-none my-4" href="#"><span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"> </i></span><span>En savoir plus</span></a>
  1555.               </div>
  1556.                       </div>
  1557.       <!-- Sérénité -->
  1558.       <div class="col-md-4" data-aos="fade-up" data-aos-delay="200">
  1559.         <div class="p-5 rounded-4 price-table popular h-100 shadow-lg position-relative border border-primary">
  1560.           <span class="position-absolute top-0 start-50 translate-middle badge rounded-pill bg-primary">Le plus utilisé</span>
  1561.           <div class="small text-muted mb-1 mt-3">Voix activable</div>
  1562.           <h3 class="mb-1">Sérénité</h3>
  1563.           <div class="display-6 fw-semibold">390 € <span class="fs-6 fw-normal">/ an / structure</span></div>
  1564.           <div class="text-muted mb-2">
  1565.             + <strong>0,90 €</strong> / parent / séjour
  1566.             <span class="d-block small">appliqué uniquement si la voix est activée — <strong>appels illimités</strong></span>
  1567.                     </div>
  1568.           <ul class="mt-2 mb-4">
  1569.             <li>Tout <strong>Accès</strong></li>
  1570.             <li><strong>Appels téléphoniques automatiques</strong> à chaque message</li>
  1571.             <li><strong>Statistiques d'écoute</strong> & journal d'émission</li>
  1572.             <li><strong>Assistance prioritaire</strong> pendant les séjours</li>
  1573.             <li><strong>Onboarding live 1 h</strong> + création express du 1er séjour</li>
  1574.                       </ul>
  1575.           <div class="text-muted small mb-2">Bénéfice : <strong>–70 à –80%</strong> d'appels ; <strong>>90%</strong> messages écoutés</div>
  1576.           <button type="button" class="btn btn-primary w-100" style="background:white;color:var(--bs-primary)" data-bs-toggle="modal" data-bs-target="#checkoutChoiceModal" data-pack="serenite" data-pack-price="390">Choisir ce pack</button>
  1577.                                         <a style="color:white"class="special-link d-inline-flex gap-2 align-items-center text-decoration-none my-4" href="#"><span class="icons"><i style="color:white"class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"> </i></span><span>En savoir plus</span></a>
  1578.     
  1579.                     </div>
  1580.                   </div>
  1581.       <!-- Pro Illimité -->
  1582.       <div class="col-md-4" data-aos="fade-up" data-aos-delay="300">
  1583.         <div class="p-5 rounded-4 price-table h-100 shadow-sm border" style="border-color:#E7C873">
  1584.           <div class="small text-muted mb-1">Pour réseaux & multi-sites</div>
  1585.           <h3 class="mb-1">Pro Illimité ✨</h3>
  1586.           <div class="display-6 fw-semibold">990 € <span class="fs-6 fw-normal">/ an / structure</span></div>
  1587.           <div class="text-muted mb-2"><strong>Aucun +0,90 €</strong> — appels téléphoniques illimités <strong>inclus</strong> toute l'année</div>
  1588.           <ul class="mt-2 mb-4">
  1589.             <li>Tout <strong>Sérénité</strong></li>
  1590.             <li><strong>Création des séjours par notre équipe</strong> (quota annuel inclus)</li>
  1591.             <li><strong>Pilotage multi-séjours</strong> + rapport mensuel synthétique</li>
  1592.             <li><strong>Partage des bénéfices</strong> sur achats familles (albums, options)</li>
  1593.           </ul>
  1594.           <div class="text-muted small mb-2">Bénéfice : déploiement rapide ; jusqu'à <strong>–90%</strong> d'appels</div>
  1595.           <button type="button" class="btn btn-primary w-100" data-bs-toggle="modal" data-bs-target="#checkoutChoiceModal" data-pack="pro_illimite" data-pack-price="990">Choisir ce pack</button>
  1596.                                      <a  class="special-link d-inline-flex gap-2 align-items-center text-decoration-none my-4" href="#"><span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"> </i></span><span>En savoir plus</span></a>
  1597.                 </div>
  1598.               </div>
  1599.             </div>
  1600.   
  1601.     <!-- Options familles — affichage discret -->
  1602. <hr class="my-4">
  1603. <div class="options-inline d-flex flex-wrap justify-content-center align-items-center gap-2 gap-md-3">
  1604.   <span class="pill d-inline-flex align-items-center gap-2 px-3 py-2 rounded-pill">
  1605.     <span aria-hidden="true">🎁</span>
  1606.     <span class="fw-semibold">Achat groupé</span>
  1607.     <span class="text-muted">— tarif réduit garenti</span>
  1608.   </span>
  1609.   <span class="vr d-none d-md-inline mx-1" style="opacity:.25;"></span>
  1610.   <span class="pill d-inline-flex align-items-center gap-2 px-3 py-2 rounded-pill">
  1611.     <span aria-hidden="true">⭐</span>
  1612.     <span class="fw-semibold">Parent Premium</span>
  1613.     <span class="text-muted">— 2,90 € / parent / séjour</span>
  1614.   </span>
  1615.   <span class="vr d-none d-md-inline mx-1" style="opacity:.25;"></span>
  1616.   <a href="{{ path('pack_annuel_partenaires') }}" class="pill d-inline-flex align-items-center gap-2 px-3 py-2 rounded-pill text-decoration-none" style="background: linear-gradient(135deg, #2fa7a3, #1e7e7a); color: white;">
  1617.     <span aria-hidden="true">🎯</span>
  1618.     <span class="fw-semibold">Pack Annuel</span>
  1619.     <span class="opacity-75">— 990 € / an, tout inclus</span>
  1620.   </a>
  1621. </div>
  1622. <!-- Micro-notes claires & "nudge" partenaire -->
  1623. <p class="text-center small text-muted mt-2 mb-0">
  1624.   <i class="bi bi-info-circle me-1" aria-hidden="true"></i>
  1625.   <span class="fw-semibold">Si la structure ne prend pas en charge l'option Parent Premium</span>, les accompagnateurs(trices) peuvent l'activer eux-mêmes
  1626.   (2,90 € / parent / séjour) pour accéder à la plateforme complète, <strong>boîte vocale illimitée incluse</strong>.
  1627. </p>
  1628. <p class="text-center small mt-1 mb-0 text-primary-emphasis">
  1629.   Recommandé : <span class="fw-semibold">prise en charge par la structure</span> → 100% de familles informées, expérience sans friction.
  1630. </p>
  1631.   </div>
  1632. </section>
  1633.   </div>
  1634. </section>
  1635.           </div>
  1636.         </section>
  1637.         <!-- End Pricing-->
  1638.         
  1639.         <!-- ======= Stats =======-->
  1640.         <section class="stats__v3 section">
  1641.           <div class="container">
  1642.             <div class="row">
  1643.               <div class="col-12">
  1644.                 <div class="d-flex flex-wrap content rounded-4" data-aos="fade-up" data-aos-delay="0">
  1645.                   <div class="rounded-borders">
  1646.                     <div class="rounded-border-1"></div>
  1647.                     <div class="rounded-border-2"></div>
  1648.                     <div class="rounded-border-3"></div>
  1649.                   </div>
  1650.                   <div class="col-12 col-sm-6 col-md-4 mb-4 mb-md-0 text-center" data-aos="fade-up" data-aos-delay="80">
  1651.                     <div class="stat-item">
  1652.                       <h3 class="fs-1 fw-bold">+<span class="purecounter" data-purecounter-start="0" data-purecounter-end="90" data-purecounter-duration="2">0</span><span>%</span></h3>
  1653.                       <p class="mb-0">des familles connectées dès J1
  1654. Invitation simple, lien sécurisé</p>
  1655.                     </div>
  1656.                   </div>
  1657.                   <div class="col-12 col-sm-6 col-md-4 mb-4 mb-md-0 text-center" data-aos="fade-up" data-aos-delay="200">
  1658.                     <div class="stat-item">
  1659.                       <h3 class="fs-1 fw-bold"> > <span class="purecounter" data-purecounter-start="0" data-purecounter-end="370" data-purecounter-duration="2">0</span><span>k+</span></h3>
  1660.                       <p class="mb-0">enfants suivis
  1661. Confiance des établissements & associations</p>
  1662.                     </div>
  1663.                   </div>
  1664.                   <div class="col-12 col-sm-6 col-md-4 mb-4 mb-md-0 text-center" data-aos="fade-up" data-aos-delay="300">
  1665.                     <div class="stat-item">
  1666.                       <h3 class="fs-1 fw-bold"><span class="purecounter" data-purecounter-start="0" data-purecounter-end="20" data-purecounter-duration="2">0</span><span>K+</span></h3>
  1667.                       <p class="mb-0">séjours accompagnés
  1668. Partout en France et à l'étranger</p>
  1669.                     </div>
  1670.                   </div>
  1671.                 </div>
  1672.               </div>
  1673.             </div>
  1674.           </div>
  1675.         </section>
  1676.         <!-- End Stats-->
  1677.         
  1678.         <!-- ======= Services =======-->
  1679.        <section class="section services__v3" id="souvenirs">
  1680.           <div class="container">
  1681.             <div class="row mb-5">
  1682.               <div class="col-md-8 mx-auto text-center">
  1683.         <span class="subtitle text-uppercase mb-2" data-aos="fade-up" data-aos-delay="0">Produits 5sur5</span>
  1684.         <h2 class="mb-2" data-aos="fade-up" data-aos-delay="100">
  1685.           Souvenirs premium, <span class="whitespace-nowrap">fabriqués en France</span> — livraison gratuite
  1686.         </h2>
  1687.         <p class="text-muted" data-aos="fade-up" data-aos-delay="150">
  1688.           Offrez aux familles un souvenir durable du séjour. Qualité premium, expédition rapide, et
  1689.           possibilité d'<strong>achat groupé –20%</strong> pour les établissements.
  1690.         </p>
  1691.               </div>
  1692.             </div>
  1693.             <div class="row g-4">
  1694.       <!-- Carte 1 : Albums -->
  1695.               <div class="col-md-6 col-lg-4" data-aos="fade-up" data-aos-delay="0">
  1696.                 <div class="service-card p-4 rounded-4 h-100 d-flex flex-column justify-content-between gap-5">
  1697.                   <div>
  1698.             <figure class="product-visual" style=""  width: 100%;
  1699.   height: 200px;                /* hauteur demandée */
  1700.   display: flex;
  1701.   align-items: center;
  1702.   justify-content: center;      /* image centrée */
  1703.   background: rgba(47,167,163,.06);
  1704.   border-radius: 16px;
  1705.   overflow: hidden;
  1706.   margin-bottom: 16px;>
  1707.         <img style=" max-width: 100%;
  1708.   max-height: 100%;
  1709.   object-fit: contain;          /* garde le ratio, pas de crop */
  1710.   display: block;"
  1711.           src="https://5sur5sejour.com/images/produit/LivreSouvenir5sur5-1.jpg"
  1712.           alt="Album photo premium 5sur5"
  1713.           width="400" height="300" loading="lazy" decoding="async"
  1714.           sizes="(min-width:992px) 330px, 90vw">
  1715.       </figure>
  1716.             
  1717.             <h3 class="fs-5 mb-3">Album photo premium</h3>
  1718.             <p class="mb-4">
  1719.               Le souvenir incontournable du séjour. Qualité soignée, fabrication locale en France et
  1720.               <strong>livraison gratuite</strong> pour les familles.
  1721.             </p>
  1722.                   </div>
  1723.           <a class="special-link d-inline-flex gap-2 align-items-center text-decoration-none" href="https://futur.5sur5sejour.fr/Accueil5sur5/album/Album%20photos" target="_blank">
  1724.                     <span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"></i></span>
  1725.             <span>Voir les modèles d'albums</span>
  1726.                   </a>
  1727.                 </div>
  1728.               </div>
  1729.       <!-- Carte 2 : Tirages & souvenirs -->
  1730.               <div class="col-md-6 col-lg-4" data-aos="fade-up" data-aos-delay="200">
  1731.                 <div class="service-card p-4 rounded-4 h-100 d-flex flex-column justify-content-between gap-5">
  1732.                   <div>
  1733.            <figure class="product-visual" style=""  width: 100%;
  1734.   height: 200px;                /* hauteur demandée */
  1735.   display: flex;
  1736.   align-items: center;
  1737.   justify-content: center;      /* image centrée */
  1738.   background: rgba(47,167,163,.06);
  1739.   border-radius: 16px;
  1740.   overflow: hidden;
  1741.   margin-bottom: 16px;>
  1742.         <img style=" max-width: 100%;
  1743.   max-height: 100%;
  1744.   object-fit: contain;          /* garde le ratio, pas de crop */
  1745.   display: block;"
  1746.           src="https://5sur5sejour.com/images/produit/PochettePhoto5sur5-2.jpg"
  1747.           alt="Album photo premium 5sur5"
  1748.           width="400" height="300" loading="lazy" decoding="async"
  1749.           sizes="(min-width:992px) 330px, 90vw">
  1750.       </figure>
  1751.             
  1752.            
  1753.             <h3 class="fs-5 mb-3">Tirages & produits souvenirs</h3>
  1754.             <p class="mb-4">
  1755.               Tirages photo et articles souvenirs 5sur5 pour prolonger l'expérience du séjour.
  1756.               Qualité premium, <strong>livraison gratuite</strong>.
  1757.             </p>
  1758.                   </div>
  1759.           <a class="special-link d-inline-flex gap-2 align-items-center text-decoration-none" href="{{ path('boutique5sur5_Souvenir') }}">
  1760.                     <span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"></i></span>
  1761.             <span>Découvrir les souvenirs</span>
  1762.                   </a>
  1763.                 </div>
  1764.               </div>
  1765.       <!-- Carte 3 : Achat groupé -20% -->
  1766.               <div class="col-md-6 col-lg-4" data-aos="fade-up" data-aos-delay="300">
  1767.                 <div class="service-card p-4 rounded-4 h-100 d-flex flex-column justify-content-between gap-5">
  1768.                   <div>
  1769.                <figure class="product-visual" style=""  width: 100%;
  1770.   height: 200px;                /* hauteur demandée */
  1771.   display: flex;
  1772.   align-items: center;
  1773.   justify-content: center;      /* image centrée */
  1774.   background: rgba(47,167,163,.06);
  1775.   border-radius: 16px;
  1776.   overflow: hidden;
  1777.   margin-bottom: 16px;>
  1778.         <img style=" max-width: 100%;
  1779.   max-height: 100%;
  1780.   object-fit: contain;          /* garde le ratio, pas de crop */
  1781.   display: block;"
  1782.           src="https://5sur5sejour.com/images/produit/Album5sur5-3.jpg"
  1783.           alt="Album photo premium 5sur5"
  1784.           width="400" height="300" loading="lazy" decoding="async"
  1785.           sizes="(min-width:992px) 330px, 90vw">
  1786.       </figure>
  1787.            
  1788.             <h3 class="fs-5 mb-3">Achat groupé établissement –20%</h3>
  1789.             <p class="mb-4">
  1790.               Activez l'option "achat groupé" pour la classe/le séjour et bénéficiez de
  1791.               <strong>–20% de réduction</strong> avec <strong>livraison gratuite</strong>. Simple à organiser, apprécié des familles.
  1792.             </p>
  1793.                   </div>
  1794.           <a  data-bs-toggle="modal"
  1795.    data-bs-target="#groupBuyLite"
  1796.    data-action="group_buy_open" class="special-link d-inline-flex gap-2 align-items-center text-decoration-none" href="#achat-groupe">
  1797.                     <span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"></i></span>
  1798.             <span>Activer l'achat groupé</span>
  1799.                   </a>
  1800.                 </div>
  1801.               </div>
  1802.             </div>
  1803.     <!-- Micro-barre de réassurance (discrète) -->
  1804.     <div class="text-center text-muted small mt-4">
  1805.       Fabriqué en France · Livraison gratuite · Qualité premium 5sur5 · Possibilité de <strong>partage des bénéfices</strong> pour les partenaires
  1806.     </div>
  1807.   </div>
  1808. </section>
  1809.       
  1810.         <!-- ======= Contact =======-->
  1811.         <section class="section contact__v2" id="contact">
  1812.           <div class="container">
  1813.             <div class="row mb-5">
  1814.               <div class="col-md-6 col-lg-7 mx-auto text-center">
  1815.                 <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Contact</span>
  1816.                 <h2 class="h2 fw-bold mb-3" data-aos="fade-up" data-aos-delay="0">Nous contacter</h2>
  1817.                 <p data-aos="fade-up" data-aos-delay="100">Nous sommes à votre écoute pour répondre à vos questions et vous aider à mieux comprendre nos services.</p>
  1818.               </div>
  1819.             </div>
  1820.             <div class="row">
  1821.               <div class="col-md-6">
  1822.                 <div class="d-flex gap-5 flex-column">
  1823.                   <div class="d-flex align-items-start gap-3" data-aos="fade-up" data-aos-delay="0">
  1824.                     <div class="icon d-block"><i class="bi bi-telephone"></i></div>
  1825.                     <span>
  1826.                       <span class="d-block">Téléphone</span>
  1827.                       <strong>05 36 28 29 30</strong>
  1828.                     </span>
  1829.                   </div>
  1830.                   <div class="d-flex align-items-start gap-3" data-aos="fade-up" data-aos-delay="100">
  1831.                     <div class="icon d-block"><i class="bi bi-send"></i></div>
  1832.                     <span>
  1833.                       <span class="d-block">Email</span>
  1834.                       <strong>contact@5sur5sejour.com</strong>
  1835.                     </span>
  1836.                   </div>
  1837.                   <div class="d-flex align-items-start gap-3" data-aos="fade-up" data-aos-delay="200">
  1838.                     <div class="icon d-block"><i class="bi bi-geo-alt"></i></div>
  1839.                     <span>
  1840.                       <span class="d-block">Adresse</span>
  1841.                       <address class="fw-bold">5sur5séjour<br>France</address>
  1842.                     </span>
  1843.                   </div>
  1844.                 </div>
  1845.               </div>
  1846.               <div class="col-md-6">
  1847.                 <div class="form-wrapper" data-aos="fade-up" data-aos-delay="300">
  1848.                   <div class="text-center mb-4">
  1849.                     <a href="#" class="btn btn-primary btn-lg" data-action="cta_expert" data-pack="contact">
  1850.                       Parler à un expert maintenant
  1851.                     </a>
  1852.                     <p class="text-muted mt-3 mb-0">Ou utilisez le formulaire ci-dessous pour nous laisser un message</p>
  1853.                   </div>
  1854.                   <form id="contactFormSection" action="{{ path('app_contact') }}" method="POST">
  1855.                     <div class="row gap-3 mb-3">
  1856.                       <div class="col-md-12">
  1857.                         <label class="mb-2" for="name">Nom</label>
  1858.                         <input class="form-control" id="name" type="text" name="name" required="">
  1859.                       </div>
  1860.                       <div class="col-md-12">
  1861.                         <label class="mb-2" for="email">Email</label>
  1862.                         <input class="form-control" id="email" type="email" name="email" required="">
  1863.                       </div>
  1864.                     </div>
  1865.                     <div class="row gap-3 mb-3">
  1866.                       <div class="col-md-12">
  1867.                         <label class="mb-2" for="subject">Sujet</label>
  1868.                         <input class="form-control" id="subject" type="text" name="subject">
  1869.                       </div>
  1870.                     </div>
  1871.                     <div class="row gap-3 gap-md-0 mb-3">
  1872.                       <div class="col-md-12">
  1873.                         <label class="mb-2" for="message">Message</label>
  1874.                         <textarea class="form-control" id="message" name="message" rows="5" required=""></textarea>
  1875.                       </div>
  1876.                     </div>
  1877.                     <button class="btn btn-primary fw-semibold" type="submit">Envoyer le message</button>
  1878.                   </form>
  1879.                   <div class="mt-3 d-none alert alert-success" id="successMessageSection">Message envoyé avec succès !</div>
  1880.                   <div class="mt-3 d-none alert alert-danger" id="errorMessageSection">Échec de l'envoi du message. Veuillez réessayer plus tard.</div>
  1881.                 </div>
  1882.               </div>
  1883.             </div>
  1884.           </div>
  1885.         </section>
  1886.         <!-- End Contact-->
  1887.         
  1888.         <!-- ======= Footer =======-->
  1889.         <footer class="footer pt-5 pb-5">
  1890.           <div class="container">
  1891.             <div class="row mb-5 pb-4">
  1892.               <div class="col-md-7">
  1893.                 <h2 class="fs-5">Rejoignez notre newsletter</h2>
  1894.                 <p>Restez informé de nos dernières actualités et offres — rejoignez notre newsletter aujourd'hui !</p>
  1895.               </div>
  1896.               <div class="col-md-5">
  1897.                 <form class="d-flex gap-2">
  1898.                   <input class="form-control" type="email" placeholder="Votre email" required="">
  1899.                   <button class="btn btn-primary fs-6" type="submit">S'abonner</button>
  1900.                 </form>
  1901.               </div>
  1902.             </div>
  1903.             <div class="row justify-content-between mb-5 g-xl-5">
  1904.               <div class="col-md-4 mb-5 mb-lg-0">
  1905.                 <h3 class="mb-3">À propos</h3>
  1906.                 <p class="mb-4">5sur5séjour est la plateforme de référence pour les séjours scolaires et les colonies de vacances, permettant aux familles de suivre leur enfant tout au long du séjour.</p>
  1907.               </div>
  1908.               <div class="col-md-7">
  1909.                 <div class="row g-2">
  1910.                   <div class="col-md-6 col-lg-4 mb-4 mb-lg-0">
  1911.                     <h3 class="mb-3">Entreprise</h3>
  1912.                     <ul class="list-unstyled">
  1913.                       <li><a href="{{path('sur5')}}">À propos</a></li>
  1914.                       <li><a  href = "{{path('Mentions_legales')}}" >Mentions légales</a></li>
  1915.                       <li><a  href = "{{path('Conditons_generales')}}" >Conditions générales</a></li>
  1916.                       <li><a  href = "{{path('Politique')}}" >Politique de confidentialité</a></li>
  1917.                     </ul>
  1918.                   </div>
  1919.                   <div class="col-md-6 col-lg-4 mb-4 mb-lg-0">
  1920.                     <h3 class="mb-3">Comptes</h3>
  1921.                     <ul class="list-unstyled">
  1922.                       <li><a href="#jemeconnecte">S'inscrire</a></li>
  1923.                       <li><a href="#jemeconnecte">Se connecter</a></li>
  1924.                      
  1925.                     </ul>
  1926.                   </div>
  1927.                   <div class="col-md-6 col-lg-4 mb-4 mb-lg-0 quick-contact">
  1928.                     <h3 class="mb-3">Contact</h3>
  1929.                     <p class="d-flex mb-3"><i class="bi bi-geo-alt-fill me-3"></i><span>5sur5séjour<br>France</span></p>
  1930.                     <a class="d-flex mb-3" href="mailto:contact@5sur5sejour.com"><i class="bi bi-envelope-fill me-3"></i><span>contact@5sur5sejour.com</span></a>
  1931.                     <a class="d-flex mb-3" href="tel://05 36 28 29 30"><i class="bi bi-telephone-fill me-3"></i><span>05 36 28 29 30</span></a>
  1932.                     <a class="d-flex mb-3" href="https://5sur5sejour.com"><i class="bi bi-globe me-3"></i><span>5sur5sejour.com</span></a>
  1933.                   </div>
  1934.                 </div>
  1935.               </div>
  1936.             </div>
  1937.             <div class="row credits pt-3">
  1938.               <div class="col-xl-8 text-center text-xl-start mb-3 mb-xl-0">
  1939.                 &copy;
  1940.                 <script>document.write(new Date().getFullYear());</script> 5sur5séjour. 
  1941.                 Tous droits réservés.
  1942.               </div>
  1943.             </div>
  1944.           </div>
  1945.         </footer>
  1946.         <!-- End Footer-->
  1947.         
  1948.       </main>
  1949.     </div>
  1950.     
  1951.     <!-- ======= Back to Top =======-->
  1952.     <button id="back-to-top"><i class="bi bi-arrow-up-short"></i></button>
  1953.     <!-- End Back to top-->
  1954.     
  1955.     <!-- ======= Javascripts =======-->
  1956.     <script src="{{ asset('Accueil/vendors/bootstrap/bootstrap.bundle.min.js') }}"></script>
  1957.     <script src="{{ asset('Accueil/vendors/gsap/gsap.min.js') }}"></script>
  1958.     <script src="{{ asset('Accueil/vendors/imagesloaded/imagesloaded.pkgd.min.js') }}"></script>
  1959.     <script src="{{ asset('Accueil/vendors/isotope/isotope.pkgd.min.js') }}"></script>
  1960.     <script src="{{ asset('Accueil/vendors/glightbox/glightbox.min.js') }}"></script>
  1961.     <script src="{{ asset('Accueil/vendors/swiper/swiper-bundle.min.js') }}"></script>
  1962.     <script src="{{ asset('Accueil/vendors/aos/aos.js') }}"></script>
  1963.     <script src="{{ asset('Accueil/vendors/purecounter/purecounter.js') }}"></script>
  1964.     <script src="{{ asset('Accueil/js/js_nova.js') }}"></script>
  1965.     <script src="{{ asset('Accueil/js/test-animations.js') }}"></script>
  1966.     
  1967.     <!-- Initialize AOS -->
  1968.     <script>
  1969.       document.addEventListener('DOMContentLoaded', function() {
  1970.         console.log('DOM loaded, initializing AOS...');
  1971.         
  1972.         // Initialize AOS
  1973.         AOS.init({
  1974.           duration: 1000,
  1975.           easing: 'ease-in-out',
  1976.           once: true,
  1977.           mirror: false
  1978.         });
  1979.         
  1980.         console.log('AOS initialized');
  1981.         
  1982.         // Initialize PureCounter
  1983.         new PureCounter();
  1984.         
  1985.         // Initialize GLightbox
  1986.         const lightbox = GLightbox({
  1987.           selector: '.glightbox'
  1988.         });
  1989.         
  1990.         // Debug: Check if arch-line images are loaded
  1991.         const archLines = document.querySelectorAll('.arch-line');
  1992.         console.log('Found arch-line elements:', archLines.length);
  1993.         archLines.forEach((line, index) => {
  1994.           console.log(`Arch-line ${index + 1}:`, line.src, line.complete ? 'loaded' : 'loading...');
  1995.         });
  1996.         
  1997.         // Smooth scrolling for anchor links
  1998.         document.querySelectorAll('a[href^="#"]').forEach(anchor => {
  1999.           anchor.addEventListener('click', function (e) {
  2000.             e.preventDefault();
  2001.             const target = document.querySelector(this.getAttribute('href'));
  2002.             if (target) {
  2003.               target.scrollIntoView({
  2004.                 behavior: 'smooth',
  2005.                 block: 'start'
  2006.               });
  2007.             }
  2008.           });
  2009.         });
  2010.         
  2011.         // Back to top button
  2012.         const backToTop = document.getElementById('back-to-top');
  2013.         if (backToTop) {
  2014.           window.addEventListener('scroll', function() {
  2015.             if (window.pageYOffset > 100) {
  2016.               backToTop.style.display = 'block';
  2017.             } else {
  2018.               backToTop.style.display = 'none';
  2019.             }
  2020.           });
  2021.           
  2022.           backToTop.addEventListener('click', function() {
  2023.             window.scrollTo({
  2024.               top: 0,
  2025.               behavior: 'smooth'
  2026.             });
  2027.           });
  2028.         }
  2029.         
  2030.         // Animation des flèches pour l'ancienne section
  2031.         function startArrowAnimation() {
  2032.           const arrowImg = document.querySelector('.MyImgFirstPosition');
  2033.           const lineImg = document.querySelector('.MyLineFirstPosition');
  2034.           
  2035.           if (arrowImg && lineImg) {
  2036.             // Démarrer l'animation après 1 seconde
  2037.             setTimeout(() => {
  2038.               arrowImg.classList.add('Myimg');
  2039.               lineImg.classList.add('MyLine');
  2040.             }, 1000);
  2041.           }
  2042.         }
  2043.         
  2044.         // Démarrer l'animation des flèches
  2045.         startArrowAnimation();
  2046.         
  2047.         // Slider simple (sans Owl Carousel pour l'instant)
  2048.         let currentSlide = 0;
  2049.         const slides = document.querySelectorAll('.single_slider');
  2050.         
  2051.         function showSlide(index) {
  2052.           slides.forEach((slide, i) => {
  2053.             slide.style.display = i === index ? 'flex' : 'none';
  2054.           });
  2055.         }
  2056.         
  2057.         function nextSlide() {
  2058.           currentSlide = (currentSlide + 1) % slides.length;
  2059.           showSlide(currentSlide);
  2060.         }
  2061.         
  2062.         // Initialiser le slider
  2063.         if (slides.length > 0) {
  2064.           showSlide(0);
  2065.           // Changer de slide toutes les 5 secondes
  2066.           setInterval(nextSlide, 5000);
  2067.         }
  2068.         
  2069.         // Nouveau slider functionality
  2070.         let currentHeroSlide = 0;
  2071.         const heroSlides = [
  2072.           {
  2073.             title: "Révolutionnez la Communication",
  2074.             description: "Partagez vos aventures avec les familles en toute sécurité grâce à notre plateforme, agrémentée de photos, de vidéos et messages.",
  2075.             image: "{{ asset('Accueil/imagesAccueil/slider/child-laughing.jpg') }}"
  2076.           },
  2077.           {
  2078.             title: "La plateforme qui rassure les familles",
  2079.             description: "Partagez vos souvenirs en toute sécurité avec des photos, vidéos et messages vocaux.",
  2080.             image: "{{ asset('Accueil/imagesAccueil/secure.jpg') }}"
  2081.           },
  2082.           {
  2083.             title: "Messages vocaux et photos",
  2084.             description: "Restez connecté avec votre enfant tout au long du séjour grâce à notre technologie sécurisée.",
  2085.             image: "{{ asset('Accueil/imagesAccueil/slider/bg-slider.svg') }}"
  2086.           }
  2087.         ];
  2088.         
  2089.         function changeSlide(direction) {
  2090.           currentHeroSlide = (currentHeroSlide + direction + heroSlides.length) % heroSlides.length;
  2091.           updateHeroSlider();
  2092.         }
  2093.         
  2094.         function updateHeroSlider() {
  2095.           const titleElement = document.querySelector('.hero-slider-title');
  2096.           const descriptionElement = document.querySelector('.hero-slider-description');
  2097.           const imageElement = document.querySelector('.hero-slider-image img');
  2098.           
  2099.           if (titleElement && descriptionElement && imageElement) {
  2100.             // Animation de transition
  2101.             titleElement.style.opacity = '0';
  2102.             descriptionElement.style.opacity = '0';
  2103.             
  2104.             setTimeout(() => {
  2105.               titleElement.textContent = heroSlides[currentHeroSlide].title;
  2106.               descriptionElement.textContent = heroSlides[currentHeroSlide].description;
  2107.               imageElement.src = heroSlides[currentHeroSlide].image;
  2108.               
  2109.               titleElement.style.opacity = '1';
  2110.               descriptionElement.style.opacity = '1';
  2111.             }, 300);
  2112.           }
  2113.         }
  2114.         
  2115.         // Auto-play pour le nouveau slider
  2116.         setInterval(() => {
  2117.           changeSlide(1);
  2118.         }, 6000);
  2119.         
  2120.         // Gestion du formulaire de contact de la section contact
  2121.         const contactFormSection = document.getElementById('contactFormSection');
  2122.         const successMessageSection = document.getElementById('successMessageSection');
  2123.         const errorMessageSection = document.getElementById('errorMessageSection');
  2124.         
  2125.         if (contactFormSection) {
  2126.           contactFormSection.addEventListener('submit', function(e) {
  2127.             e.preventDefault();
  2128.             
  2129.             // Masquer les messages précédents
  2130.             successMessageSection.classList.add('d-none');
  2131.             errorMessageSection.classList.add('d-none');
  2132.             
  2133.             // Désactiver le bouton pendant l'envoi
  2134.             const submitButton = contactFormSection.querySelector('button[type="submit"]');
  2135.             const originalText = submitButton.textContent;
  2136.             submitButton.textContent = 'Envoi en cours...';
  2137.             submitButton.disabled = true;
  2138.             
  2139.             // Récupérer les données du formulaire
  2140.             const formData = new FormData(contactFormSection);
  2141.             
  2142.             // Envoyer la requête AJAX
  2143.             fetch(contactFormSection.action, {
  2144.               method: 'POST',
  2145.               body: formData,
  2146.               headers: {
  2147.                 'X-Requested-With': 'XMLHttpRequest'
  2148.               }
  2149.             })
  2150.             .then(response => response.json())
  2151.             .then(data => {
  2152.               if (data.success) {
  2153.                 // Afficher le message de succès
  2154.                 successMessageSection.textContent = data.message;
  2155.                 successMessageSection.classList.remove('d-none');
  2156.                 
  2157.                 // Réinitialiser le formulaire
  2158.                 contactFormSection.reset();
  2159.               } else {
  2160.                 // Afficher le message d'erreur
  2161.                 errorMessageSection.textContent = data.message;
  2162.                 errorMessageSection.classList.remove('d-none');
  2163.               }
  2164.             })
  2165.             .catch(error => {
  2166.               console.error('Erreur:', error);
  2167.               errorMessageSection.textContent = 'Une erreur est survenue lors de l\'envoi du message. Veuillez réessayer plus tard.';
  2168.               errorMessageSection.classList.remove('d-none');
  2169.             })
  2170.             .finally(() => {
  2171.               // Réactiver le bouton
  2172.               submitButton.textContent = originalText;
  2173.               submitButton.disabled = false;
  2174.             });
  2175.           });
  2176.         }
  2177.         
  2178.       });
  2179.     </script>
  2180.     <!-- End JavaScripts-->
  2181. <!-- MODAL CONNEXION -->
  2182. <div class="modal fade" id="loginModal" tabindex="-1" aria-hidden="true">
  2183.   <div class="modal-dialog modal-dialog-centered modal-lg">
  2184.     <div class="modal-content rounded-4">
  2185.       <div class="modal-header border-0">
  2186.         <h5 class="modal-title fw-bold">Accéder à mon espace de séjour </h5>
  2187.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  2188.       </div>
  2189.       <div class="modal-body p-4">
  2190.         <div class="row g-4 align-items-center">
  2191.           <div class="col-lg-5 text-center border-end">
  2192.             <img src="/images/Accompagnateur/LogoEspaceAccom.svg" alt="Espace accompagnateur" class="img-fluid mb-3" style="max-height: 120px;">
  2193.             <p class="small text-muted mb-0">
  2194.               Retrouvez votre séjour, publiez vos contenus et rassurez les familles en temps réel.
  2195.             </p>
  2196.           </div>
  2197.           <div class="col-lg-7">
  2198.             <div class="titleAutre mb-3">Vous êtes accompagnateur et disposez déjà d'un identifiant et d'un mot de passe.</div>
  2199.             <form method="post" class="fomru" action="{{ path('app_back_Acommpa') }}">
  2200.               <div class="form-group d-grid gap-3">
  2201.                 <input type="text" value="" name="email" id="modalInputEmail" class="form-control" placeholder=" Code séjour de l'accompagnateur * ">
  2202.                 <input type="password" name="password" id="modalInputPassword" class="form-control" placeholder="mot de passe fourni à l'organisme * ">
  2203.                 <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
  2204.                 <div class="description"><a href="#" data-bs-toggle="modal" data-bs-target="#mdpoblier" style="color:#f09e7a;">Vous avez oublié votre mot de passe</a></div>
  2205.               </div>
  2206.               <div class="d-grid mt-4">
  2207.                 <button class="btn btn-primary rounded-3" type="submit">Je me connecte</button>
  2208.               </div>
  2209.             </form>
  2210.           </div>
  2211.         </div>
  2212.       </div>
  2213.     </div>
  2214.   </div>
  2215. </div>
  2216. <!-- MODAL MOT DE PASSE OUBLIÉ -->
  2217. <div class="modal fade" id="mdpoblier" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  2218.   <div class="modal-dialog" role="document">
  2219.     <div class="modal-content" style="border-radius: 0px;top: 50px;width: 55%;margin: auto;min-width: 270px;">
  2220.       <div class="modal-header">
  2221.         <button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
  2222.           <img src="{{ asset('images/Groupe_526.svg')}}">
  2223.         </button>
  2224.       </div>
  2225.       <div class="modal-body" style="text-align:center">
  2226.         <h5 class="modal-title" id="exampleModalLabel" style="margin-left:15px; margin-bottom: 15px">
  2227.           <img class="imageLogo2" style="width: 58% !important;" src="{{ asset('Accueil/imagesAccueil/logoHeader.svg')}}">
  2228.         </h5>
  2229.         <div class="row no-margin" style="padding-bottom: 40px;">
  2230.           <div class="col-md-12 col-sm-12 col-xs-12 descTitre">
  2231.             <strong>Vous avez oublié votre mot de passe ? Contactez notre équipe 5sur5sejour au 05 36 28 29 30.</strong>
  2232.           </div>
  2233.         </div>
  2234.       </div>
  2235.     </div>
  2236.   </div>
  2237. </div>
  2238. <!-- MODAL CONNEXION PARTENAIRE -->
  2239. <div class="modal fade" id="partnerLoginModal" tabindex="-1" aria-hidden="true">
  2240.   <div class="modal-dialog modal-dialog-centered modal-lg">
  2241.     <div class="modal-content rounded-4">
  2242.       <div class="modal-header border-0">
  2243.         <h5 class="modal-title fw-bold">Espace Partenaire - Connexion</h5>
  2244.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  2245.       </div>
  2246.       <div class="modal-body p-4">
  2247.         <div class="row g-4 align-items-center">
  2248.           <div class="col-lg-5 text-center border-end">
  2249.             <img src="{{ asset('Accueil/imagesAccueil/espcPart.svg') }}" alt="Espace partenaire" class="img-fluid mb-3" style="max-height: 120px;">
  2250.             <p class="small text-muted mb-0">
  2251.               Créez et gérez tous vos séjours depuis un espace dédié, avec un service client sur mesure et des outils pensés pour vous.
  2252.             </p>
  2253.           </div>
  2254.           <div class="col-lg-7">
  2255.             <div class="titleAutre mb-3">Vous êtes partenaire</div>
  2256.             <div class="sous-titrecnx mb-3">Bienvenue dans votre espace 5 sur 5 séjour</div>
  2257.             <div class="descriptioncnx mb-4">Entrez votre identifiant et votre mot de passe afin d'entrer dans votre plateforme d'administration</div>
  2258.             
  2259.             <form method="post" action="{{ path('app_login_back_Partenaire') }}">
  2260.               <div class="form-group d-grid gap-3">
  2261.                 <input type="text" name="email" id="partnerInputEmail" class="form-control" placeholder="Mail partenaire" value="">
  2262.                 <input type="password" name="password" id="partnerInputPassword" class="form-control" placeholder="Mot de passe">
  2263.                 <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
  2264.                 <div class="description">
  2265.                   <a href="/forgotPasspatenaire" style="color:#f09e7a;">Vous avez oublié votre mot de passe</a>
  2266.                 </div>
  2267.               </div>
  2268.               <div class="d-grid mt-4">
  2269.                 <button class="btn btn-primary rounded-3" type="submit">Je me connecte</button>
  2270.               </div>
  2271.             </form>
  2272.           </div>
  2273.         </div>
  2274.       </div>
  2275.     </div>
  2276.   </div>
  2277. </div>
  2278. <!-- Modale ultra-légère -->
  2279. <div class="modal fade" id="groupBuyLite" tabindex="-1" aria-hidden="true">
  2280.   <div class="modal-dialog modal-dialog-centered">
  2281.     <div class="modal-content rounded-4">
  2282.       <div class="modal-header">
  2283.         <h5 class="modal-title">Achat groupé — jusqu’à −20%</h5>
  2284.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  2285.       </div>
  2286.       <div class="modal-body">
  2287.         <ul class="small text-muted ps-3">
  2288.           <li>Remise automatique selon le volume (ex. −10% dès 5, −15% dès 10, −20% dès 20).</li>
  2289.           <li>Applicable sur albums, tirages et packs.</li>
  2290.           <li>La structure peut prendre en charge Parent Premium (tarif préférentiel, voix illimitée incluse).</li>
  2291.         </ul>
  2292.         <div class="alert alert-info small mb-0">
  2293.           <i class="bi bi-info-circle me-1"></i>
  2294.           La remise sera affichée sur la boutique. Munissez-vous du <strong>code séjour</strong> si demandé.
  2295.         </div>
  2296.       </div>
  2297.       <div class="modal-footer d-block">
  2298.         <div class="d-grid d-sm-flex gap-2">
  2299.           <!-- Redirection directe (aucun champ) -->
  2300.           <a class="btn btn-primary"
  2301.              href="/boutique?groupbuy=1&utm_source=site&utm_medium=modal&utm_campaign=group_buy"
  2302.              data-action="group_buy_continue">
  2303.             Aller à la boutique
  2304.           </a>
  2305.           <button class="btn btn-outline-secondary" data-bs-dismiss="modal">Plus tard</button>
  2306.         </div>
  2307.         <p class="small text-muted mt-2 mb-0">
  2308.           Besoin d’aide ? <a href="#" data-action="cta_expert">Parler à un expert</a>
  2309.         </p>
  2310.       </div>
  2311.     </div>
  2312.   </div>
  2313. </div>
  2314. <!-- MODALE CHOIX DE PAIEMENT -->
  2315. <div class="modal fade" id="checkoutChoiceModal" tabindex="-1" aria-labelledby="checkoutChoiceModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
  2316.     <div class="modal-dialog modal-lg modal-dialog-centered">
  2317.         <div class="modal-content">
  2318.             <div class="modal-header border-0 pb-0">
  2319.                 <h5 class="modal-title w-100 text-center" id="checkoutChoiceModalLabel">
  2320.                     <i class="bi bi-credit-card-2-front me-2"></i>
  2321.                     Comment souhaitez-vous procéder ?
  2322.                 </h5>
  2323.                 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  2324.             </div>
  2325.             <div class="modal-body px-5 py-4">
  2326.                 <!-- Récapitulatif du pack sélectionné -->
  2327.                 <div class="alert alert-primary border-primary mb-4 d-flex align-items-center justify-content-between" role="alert" id="packSummary" style="display: none !important;">
  2328.                     <div class="d-flex align-items-center gap-3">
  2329.                         <i class="bi bi-box-seam fs-3"></i>
  2330.                         <div>
  2331.                             <div class="fw-bold mb-1">Pack sélectionné</div>
  2332.                             <div class="h5 mb-0" id="packName">—</div>
  2333.                         </div>
  2334.                     </div>
  2335.                     <div class="text-end">
  2336.                         <div class="text-muted small">Montant annuel</div>
  2337.                         <div class="h4 mb-0 fw-bold" id="packPrice">—</div>
  2338.                     </div>
  2339.                 </div>
  2340.                 
  2341.                 <p class="text-center text-muted mb-4">Choisissez le mode de souscription adapté à votre structure</p>
  2342.                 
  2343.                 <div class="row g-4">
  2344.                     <!-- Card 1 — Souscription en ligne -->
  2345.                     <div class="col-lg-4 col-md-6">
  2346.                         <div class="card h-100 border-2 checkout-choice-card" data-choice="online" tabindex="0" role="button">
  2347.                             <div class="card-body d-flex flex-column">
  2348.                                 <div class="mb-3">
  2349.                                     <span class="badge bg-success text-white mb-2">Recommandé</span>
  2350.                                     <h4 class="card-title mb-2">Souscrire en ligne</h4>
  2351.                                     <p class="text-muted small">CB / SEPA — activation en 24 h. Facturation annuelle.</p>
  2352.                                 </div>
  2353.                                 <ul class="list-unstyled mb-4 flex-grow-1">
  2354.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i>Stripe Checkout sécurisé</li>
  2355.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i>Facture et mandat SEPA automatiques</li>
  2356.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i>Planifier l'onboarding (30 min)</li>
  2357.                                 </ul>
  2358.                                 <button class="btn btn-primary w-100" data-cta="checkout_online" data-loc="modal">
  2359.                                     <i class="bi bi-credit-card me-2"></i>Payer & activer
  2360.                                 </button>
  2361.                             </div>
  2362.                         </div>
  2363.                     </div>
  2364.                     <!-- Card 2 — Virement bancaire -->
  2365.                     <div class="col-lg-4 col-md-6">
  2366.                         <div class="card h-100 border-2 checkout-choice-card" data-choice="bank_transfer" tabindex="0" role="button">
  2367.                             <div class="card-body d-flex flex-column">
  2368.                                 <div class="mb-3">
  2369.                                     <span class="badge bg-info text-white mb-2">Économique</span>
  2370.                                     <h4 class="card-title mb-2">Virement bancaire</h4>
  2371.                                     <p class="text-muted small">Paiement par virement — activation sous 48h après réception.</p>
  2372.                                 </div>
  2373.                                 <ul class="list-unstyled mb-4 flex-grow-1">
  2374.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-info me-2"></i>RIB fourni automatiquement</li>
  2375.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-info me-2"></i>Facture proforma envoyée</li>
  2376.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-info me-2"></i>Activation après réception</li>
  2377.                                 </ul>
  2378.                                 <button type="button" class="btn btn-outline-info w-100" data-bs-toggle="modal" data-bs-target="#bankTransferModal" data-bs-dismiss="modal">
  2379.                                     <i class="bi bi-bank me-2"></i>Demander le RIB
  2380.                                 </button>
  2381.                             </div>
  2382.                         </div>
  2383.                     </div>
  2384.                     <!-- Card 3 — Devis / Bon de commande -->
  2385.                     <div class="col-lg-4 col-md-6">
  2386.                         <div class="card h-100 border-2 checkout-choice-card" data-choice="quote" tabindex="0" role="button">
  2387.                             <div class="card-body d-flex flex-column">
  2388.                                 <div class="mb-3">
  2389.                                     <h4 class="card-title mb-2 mt-4">Demander un devis / BC</h4>
  2390.                                     <p class="text-muted small">Adapté écoles publiques, collectivités, associations.</p>
  2391.                                 </div>
  2392.                                 <ul class="list-unstyled mb-4 flex-grow-1">
  2393.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-primary me-2"></i>Devis PDF instantané</li>
  2394.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-primary me-2"></i>DPA/RGPD, RIB, CGV joints</li>
  2395.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-primary me-2"></i>E‑signature & upload du BC</li>
  2396.                                 </ul>
  2397.                                 <button class="btn btn-outline-primary w-100" data-cta="checkout_quote" data-loc="modal">
  2398.                                     <i class="bi bi-file-earmark-text me-2"></i>Recevoir le devis
  2399.                                 </button>
  2400.                             </div>
  2401.                         </div>
  2402.                     </div>
  2403.                 </div>
  2404.             </div>
  2405.             <div class="modal-footer border-0 pt-0">
  2406.                 <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Retour</button>
  2407.             </div>
  2408.         </div>
  2409.     </div>
  2410. </div>
  2411. <!-- MODALE VIREMENT BANCAIRE (RIB) -->
  2412. <div class="modal fade" id="bankTransferModal" tabindex="-1" aria-labelledby="bankTransferModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
  2413.     <div class="modal-dialog modal-xl modal-dialog-centered">
  2414.         <div class="modal-content">
  2415.             <div class="modal-header border-0 pb-2">
  2416.                 <h5 class="modal-title w-100 text-center" id="bankTransferModalLabel">
  2417.                     <i class="bi bi-bank2 me-2 text-info"></i>
  2418.                     Virement bancaire — RIB instantané
  2419.                 </h5>
  2420.                 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  2421.             </div>
  2422.             <div class="modal-body p-4">
  2423.                 <div class="row">
  2424.                     <!-- Colonne formulaire -->
  2425.                     <div class="col-lg-5">
  2426.                         <div class="card border-0 bg-light h-100">
  2427.                             <div class="card-body p-4">
  2428.                                 <h6 class="text-info mb-3">
  2429.                                     <i class="bi bi-person-circle me-2"></i>Vos informations
  2430.                                 </h6>
  2431.                                 <p class="text-muted small mb-4">Nous vous enverrons le RIB et la facture proforma par email</p>
  2432.                                 
  2433.                                 <form id="rib-form" method="post" action="{{ path('bank_transfer_request') }}" data-event="rib_request_submit">
  2434.                                     <div class="mb-4">
  2435.                                         <label for="rib_fullname" class="form-label fw-semibold">
  2436.                                             <i class="bi bi-person me-1"></i>Nom & prénom *
  2437.                                         </label>
  2438.                                         <input id="rib_fullname" name="full_name" class="form-control form-control-lg" required 
  2439.                                                placeholder="Ex: Marie Dupont" autocomplete="name">
  2440.                                     </div>
  2441.                                     
  2442.                                     <div class="mb-4">
  2443.                                         <label for="rib_email" class="form-label fw-semibold">
  2444.                                             <i class="bi bi-envelope me-1"></i>Email de facturation *
  2445.                                         </label>
  2446.                                         <input id="rib_email" name="billing_email" type="email" class="form-control form-control-lg" required 
  2447.                                                placeholder="Ex: comptabilite@ecole.fr" autocomplete="email">
  2448.                                     </div>
  2449.                                     <div class="mb-4">
  2450.                                         <label for="rib_company" class="form-label fw-semibold">
  2451.                                             <i class="bi bi-building me-1"></i>Nom de la structure
  2452.                                         </label>
  2453.                                         <input id="rib_company" name="company" class="form-control form-control-lg" 
  2454.                                                placeholder="Ex: École Primaire Jean Moulin" autocomplete="organization">
  2455.                                     </div>
  2456.                                     <!-- Contexte pack (sera rempli dynamiquement) -->
  2457.                                     <input type="hidden" name="pack_id" id="rib_pack_id" value="">
  2458.                                     <div class="d-grid">
  2459.                                         <button class="btn btn-info btn-lg py-3" id="rib-submit" type="submit" data-cta="rib_request" data-loc="wire">
  2460.                                             <i class="bi bi-bank me-2"></i>Obtenir le RIB instantanément
  2461.                                         </button>
  2462.                                     </div>
  2463.                                     
  2464.                                     <p class="text-muted text-center small mt-3 mb-0">
  2465.                                         <i class="bi bi-shield-check me-1"></i>
  2466.                                         Sécurisé • Données hébergées en France • Conforme RGPD
  2467.                                     </p>
  2468.                                 </form>
  2469.                             </div>
  2470.                         </div>
  2471.                     </div>
  2472.                     <!-- Colonne RIB -->
  2473.                     <div class="col-lg-7">
  2474.                         <div id="rib-panel" class="card border-info" style="display: none;">
  2475.                             <div class="card-header bg-info text-white">
  2476.                                 <h6 class="mb-0">
  2477.                                     <i class="bi bi-bank me-2"></i>Coordonnées bancaires 5sur5séjour
  2478.                                 </h6>
  2479.                             </div>
  2480.                             <div class="card-body p-4">
  2481.                                 <div class="row g-4">
  2482.                                     <div class="col-md-6">
  2483.                                         <div class="border-bottom pb-2 mb-2">
  2484.                                             <div class="text-muted small text-uppercase fw-bold">Titulaire du compte</div>
  2485.                                             <div class="h6 mb-0">S.A.S. TRUST CONSEILS</div>
  2486.                                         </div>
  2487.                                     </div>
  2488.                                     <div class="col-md-6">
  2489.                                         <div class="border-bottom pb-2 mb-2">
  2490.                                             <div class="text-muted small text-uppercase fw-bold">Banque</div>
  2491.                                             <div class="h6 mb-0">CR CENTRE EST</div>
  2492.                                         </div>
  2493.                                     </div>
  2494.                                     <div class="col-12">
  2495.                                         <div class="border-bottom pb-2 mb-2">
  2496.                                             <div class="text-muted small text-uppercase fw-bold">IBAN</div>
  2497.                                             <div class="d-flex align-items-center gap-3">
  2498.                                                 <code id="iban-text" class="user-select-all h6 mb-0 text-primary">FR76 1780 6009 6304 1603 4748 776</code>
  2499.                                                 <button type="button" class="btn btn-outline-primary" data-cta="copy_iban" aria-label="Copier l'IBAN" onclick="copyToClipboard('iban-text', this)">
  2500.                                                     <i class="bi bi-clipboard me-1"></i>Copier
  2501.                                                 </button>
  2502.                                             </div>
  2503.                                         </div>
  2504.                                     </div>
  2505.                                     <div class="col-md-6">
  2506.                                         <div class="border-bottom pb-2 mb-2">
  2507.                                             <div class="text-muted small text-uppercase fw-bold">Code BIC</div>
  2508.                                             <div class="d-flex align-items-center gap-3">
  2509.                                                 <code id="bic-text" class="user-select-all h6 mb-0 text-primary">AGRIFRPP878</code>
  2510.                                                 <button type="button" class="btn btn-outline-primary btn-sm" data-cta="copy_bic" aria-label="Copier le BIC" onclick="copyToClipboard('bic-text', this)">
  2511.                                                     <i class="bi bi-clipboard"></i>
  2512.                                                 </button>
  2513.                                             </div>
  2514.                                         </div>
  2515.                                     </div>
  2516.                                     <div class="col-md-6">
  2517.                                         <div class="border-bottom pb-2 mb-2">
  2518.                                             <div class="text-muted small text-uppercase fw-bold">Référence à indiquer</div>
  2519.                                             <div class="h6 mb-0 text-success">PACK-PRO-<span id="rib-ref-date"></span></div>
  2520.                                         </div>
  2521.                                     </div>
  2522.                                 </div>
  2523.                                 <div class="alert alert-success mt-4" role="alert">
  2524.                                     <i class="bi bi-check-circle me-2"></i>
  2525.                                     <strong>Email envoyé !</strong> Vous recevrez le RIB et la facture proforma à <span id="rib-email-echo" class="fw-bold">votre adresse</span>.
  2526.                                 </div>
  2527.                                 <div class="d-flex flex-wrap gap-3 mt-4">
  2528.                                     <a class="btn btn-primary" href="#" id="proforma-download-link" data-cta="download_proforma">
  2529.                                         <i class="bi bi-download me-2"></i>Télécharger la facture proforma
  2530.                                     </a>
  2531.                                     <a class="btn btn-outline-secondary" href="https://calendly.com/5sur5sejour/demo" target="_blank" data-cta="book_call">
  2532.                                         <i class="bi bi-telephone me-2"></i>Planifier un appel
  2533.                                     </a>
  2534.                                 </div>
  2535.                                 <div class="text-muted small mt-3">
  2536.                                     <i class="bi bi-info-circle me-1"></i>
  2537.                                     Activation de votre compte sous 48h après réception du virement.
  2538.                                 </div>
  2539.                             </div>
  2540.                         </div>
  2541.                         <!-- Message d'attente -->
  2542.                         <div id="rib-waiting" class="text-center p-5">
  2543.                             <i class="bi bi-bank2 text-muted" style="font-size: 4rem;"></i>
  2544.                             <h5 class="text-muted mt-3">Remplissez le formulaire pour obtenir le RIB</h5>
  2545.                             <p class="text-muted">Vos coordonnées bancaires apparaîtront ici instantanément</p>
  2546.                         </div>
  2547.                     </div>
  2548.                 </div>
  2549.             </div>
  2550.         </div>
  2551.     </div>
  2552. </div>
  2553. <script>
  2554. document.addEventListener('DOMContentLoaded', function() {
  2555.     console.log('✅ Page Accueil - Modale checkout initialisée');
  2556.     
  2557.     // Mapping des packs
  2558.     const packLabels = {
  2559.         'access': 'Pack Accès',
  2560.         'serenite': 'Pack Sérénité',
  2561.         'pro_illimite': 'Pack Pro Illimité ✨'
  2562.     };
  2563.     
  2564.     // Récupérer le pack sélectionné lors de l'ouverture de la modale
  2565.     const checkoutModal = document.getElementById('checkoutChoiceModal');
  2566.     const bankTransferModal = document.getElementById('bankTransferModal');
  2567.     let selectedPack = null;
  2568.     let selectedPackPrice = null;
  2569.     
  2570.     if (checkoutModal) {
  2571.         checkoutModal.addEventListener('show.bs.modal', function(event) {
  2572.             const button = event.relatedTarget;
  2573.             selectedPack = button.getAttribute('data-pack');
  2574.             selectedPackPrice = button.getAttribute('data-pack-price');
  2575.             console.log('📦 Pack sélectionné:', selectedPack, '- Prix:', selectedPackPrice + '€');
  2576.             
  2577.             // Afficher le récapitulatif du pack
  2578.             const packSummary = document.getElementById('packSummary');
  2579.             const packName = document.getElementById('packName');
  2580.             const packPrice = document.getElementById('packPrice');
  2581.             
  2582.             if (packSummary && packName && packPrice) {
  2583.                 packName.textContent = packLabels[selectedPack] || selectedPack;
  2584.                 packPrice.textContent = selectedPackPrice + ' € / an';
  2585.                 packSummary.style.display = 'flex';
  2586.             }
  2587.         });
  2588.     }
  2589.     
  2590.     // Transférer le pack sélectionné au modal RIB
  2591.     if (bankTransferModal) {
  2592.         bankTransferModal.addEventListener('show.bs.modal', function(event) {
  2593.             console.log('📦 Ouverture modal RIB avec pack:', selectedPack);
  2594.             // Remplir le champ caché avec le pack sélectionné
  2595.             const ribPackIdField = document.getElementById('rib_pack_id');
  2596.             if (ribPackIdField && selectedPack) {
  2597.                 ribPackIdField.value = selectedPack;
  2598.             }
  2599.         });
  2600.     }
  2601.     
  2602.     // =========================
  2603.     // GESTION DU FORMULAIRE RIB
  2604.     // =========================
  2605.     const ribForm = document.getElementById('rib-form');
  2606.     const ribSubmit = document.getElementById('rib-submit');
  2607.     const ribPanel = document.getElementById('rib-panel');
  2608.     const ribWaiting = document.getElementById('rib-waiting');
  2609.     const ribEmailEcho = document.getElementById('rib-email-echo');
  2610.     const ribRefDate = document.getElementById('rib-ref-date');
  2611.     const proformaDownloadLink = document.getElementById('proforma-download-link');
  2612.     
  2613.     if (ribForm && ribSubmit) {
  2614.         // Set current date for reference
  2615.         if (ribRefDate) {
  2616.             const now = new Date();
  2617.             const dateStr = now.getFullYear().toString().slice(-2) + 
  2618.                            (now.getMonth() + 1).toString().padStart(2, '0') + 
  2619.                            now.getDate().toString().padStart(2, '0');
  2620.             ribRefDate.textContent = dateStr;
  2621.         }
  2622.         
  2623.         ribForm.addEventListener('submit', function(e) {
  2624.             e.preventDefault();
  2625.             
  2626.             // Get form data
  2627.             const formData = new FormData(ribForm);
  2628.             const fullName = formData.get('full_name');
  2629.             const billingEmail = formData.get('billing_email');
  2630.             const company = formData.get('company');
  2631.             const packId = formData.get('pack_id');
  2632.             
  2633.             // Validation
  2634.             if (!fullName || fullName.trim().length < 2) {
  2635.                 showFieldError('rib_fullname', 'Veuillez saisir votre nom complet');
  2636.                 return;
  2637.             }
  2638.             
  2639.             if (!billingEmail || !isValidEmail(billingEmail)) {
  2640.                 showFieldError('rib_email', 'Veuillez saisir une adresse email valide');
  2641.                 return;
  2642.             }
  2643.             
  2644.             // Clear any previous errors
  2645.             clearFieldErrors();
  2646.             
  2647.             // Show loading state
  2648.             ribSubmit.disabled = true;
  2649.             ribSubmit.innerHTML = '<i class="bi bi-hourglass-split me-2"></i>Envoi en cours...';
  2650.             
  2651.             // Send to backend
  2652.             fetch('{{ path("bank_transfer_request") }}', {
  2653.                 method: 'POST',
  2654.                 body: formData
  2655.             })
  2656.             .then(res => res.json())
  2657.             .then(data => {
  2658.                 if (data.success) {
  2659.                     showRibSuccess(billingEmail, fullName, company, data.requestNumber);
  2660.                 } else {
  2661.                     throw new Error(data.message || 'Erreur lors de l\'envoi');
  2662.                 }
  2663.             })
  2664.             .catch(err => {
  2665.                 alert('❌ Erreur : ' + err.message);
  2666.                 ribSubmit.disabled = false;
  2667.                 ribSubmit.innerHTML = '<i class="bi bi-bank me-2"></i>Obtenir le RIB instantanément';
  2668.             });
  2669.         });
  2670.     }
  2671.     
  2672.     function showFieldError(fieldId, message) {
  2673.         const field = document.getElementById(fieldId);
  2674.         if (field) {
  2675.             field.classList.add('is-invalid');
  2676.             
  2677.             // Remove existing error message
  2678.             const existingError = field.parentNode.querySelector('.invalid-feedback');
  2679.             if (existingError) {
  2680.                 existingError.remove();
  2681.             }
  2682.             
  2683.             // Add new error message
  2684.             const errorDiv = document.createElement('div');
  2685.             errorDiv.className = 'invalid-feedback';
  2686.             errorDiv.textContent = message;
  2687.             field.parentNode.appendChild(errorDiv);
  2688.         }
  2689.     }
  2690.     
  2691.     function clearFieldErrors() {
  2692.         const invalidFields = document.querySelectorAll('.is-invalid');
  2693.         invalidFields.forEach(field => {
  2694.             field.classList.remove('is-invalid');
  2695.         });
  2696.         
  2697.         const errorMessages = document.querySelectorAll('.invalid-feedback');
  2698.         errorMessages.forEach(error => {
  2699.             error.remove();
  2700.         });
  2701.     }
  2702.     
  2703.     function showRibSuccess(email, name, company, requestNumber) {
  2704.         // Hide waiting message
  2705.         if (ribWaiting) {
  2706.             ribWaiting.style.display = 'none';
  2707.         }
  2708.         
  2709.         // Show RIB panel
  2710.         if (ribPanel) {
  2711.             ribPanel.style.display = 'block';
  2712.         }
  2713.         
  2714.         // Update email echo
  2715.         if (ribEmailEcho) {
  2716.             ribEmailEcho.textContent = email;
  2717.         }
  2718.         
  2719.         // Generate proforma download link
  2720.         if (proformaDownloadLink && requestNumber) {
  2721.             proformaDownloadLink.href = '/proforma-download/' + requestNumber;
  2722.         }
  2723.         
  2724.         // Scroll to RIB panel
  2725.         if (ribPanel) {
  2726.             ribPanel.scrollIntoView({ behavior: 'smooth', block: 'start' });
  2727.         }
  2728.         
  2729.         // Reset button
  2730.         if (ribSubmit) {
  2731.             ribSubmit.disabled = false;
  2732.             ribSubmit.innerHTML = '<i class="bi bi-bank me-2"></i>Obtenir le RIB instantanément';
  2733.         }
  2734.         
  2735.         console.log('✅ RIB request submitted:', { name, email, company });
  2736.     }
  2737.     
  2738.     function isValidEmail(email) {
  2739.         const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  2740.         return emailRegex.test(email);
  2741.     }
  2742.     
  2743.     // Gérer le clic sur "Payer & activer" (Stripe)
  2744.     document.querySelector('[data-cta="checkout_online"]')?.addEventListener('click', function() {
  2745.         alert('Paiement Stripe en cours de développement\n\nPack : ' + selectedPack + '\nPrix : ' + selectedPackPrice + '€');
  2746.     });
  2747.     
  2748.     // Gérer le clic sur "Recevoir le devis"
  2749.     document.querySelector('[data-cta="checkout_quote"]')?.addEventListener('click', function() {
  2750.         alert('Génération de devis en cours de développement\n\nPack : ' + selectedPack + '\nPrix : ' + selectedPackPrice + '€');
  2751.     });
  2752. });
  2753. // Copy to clipboard function
  2754. function copyToClipboard(elementId, button) {
  2755.     const element = document.getElementById(elementId);
  2756.     if (element) {
  2757.         const text = element.textContent;
  2758.         navigator.clipboard.writeText(text).then(() => {
  2759.             // Show success feedback
  2760.             const originalText = button.innerHTML;
  2761.             button.innerHTML = '<i class="bi bi-check"></i> Copié !';
  2762.             button.classList.remove('btn-outline-primary');
  2763.             button.classList.add('btn-success');
  2764.             
  2765.             setTimeout(() => {
  2766.                 button.innerHTML = originalText;
  2767.                 button.classList.remove('btn-success');
  2768.                 button.classList.add('btn-outline-primary');
  2769.             }, 2000);
  2770.         }).catch(err => {
  2771.             console.error('Erreur copie:', err);
  2772.             alert('Impossible de copier. Copiez manuellement : ' + text);
  2773.         });
  2774.     }
  2775. }
  2776. </script>
  2777.   </body>
  2778. </html>