templates/Accueil/PageAccueil.html.twig line 2265

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