templates/Accueil/PageAccueil.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <!--
  3. Template name: Nova
  4. Template author: FreeBootstrap.net
  5. Author website: https://freebootstrap.net/
  6. License: https://freebootstrap.net/license
  7. -->
  8. <html lang="fr">
  9.   <head>
  10.     <meta charset="utf-8">
  11.     <meta name="viewport" content="width=device-width, initial-scale=1">
  12. <title>5sur5Séjour — Créer un séjour scolaire en ligne (données hébergées en France)</title>
  13. <meta name="description" content="Partagez photos, vidéos et messages vocaux avec les familles. Gratuit pour les écoles publiques (hors option voix). Démo 15–30 min pour partenaires.">
  14. <!-- Open Graph / Twitter -->
  15. <meta property="og:title" content="Créer un séjour scolaire en ligne — 5sur5Séjour">
  16. <meta property="og:description" content="Plateforme familles & écoles. Données en France. Démo 15–30 min.">
  17. <meta property="og:type" content="website">
  18. <meta property="og:url" content="https://5sur5sejour.fr/">
  19. <meta property="og:image" content="https://5sur5sejour.fr/static/og/landing.jpg">
  20. <meta name="twitter:card" content="summary_large_image">
  21. <!-- Robots -->
  22. <meta name="robots" content="index,follow,max-image-preview:large">
  23. <!-- Preload police/logo (si utilisés) -->
  24. <link rel="preload" href="/assets/fonts/inter-var.woff2" as="font" type="font/woff2" crossorigin>
  25. <link rel="preload" href="/static/og/creer-sejour.jpg" as="image">    <title>5sur5séjour - Plateforme de partage de photos, vidéos et messages vocaux</title>
  26.      
  27.     <!-- ======= 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.     /* Custom width utility */
  51.     .w-35 {
  52.         width: 35% !important;
  53.     }
  54.     
  55.     @media (min-width: 576px) {
  56.         .w-sm-auto {
  57.             width: auto !important;
  58.         }
  59.     }
  60.     
  61.     /* Section padding */
  62. .py-6 { padding: 4rem 0; }
  63. /* Card style premium */
  64. .pricing-card {
  65.     background: #ffffff;
  66.     border-radius: 20px;
  67.     border: 1px solid #eef2f4;
  68.     transition: 0.25s;
  69. }
  70. .pricing-card:hover {
  71.     transform: translateY(-6px);
  72.     box-shadow: 0 20px 40px rgba(0,0,0,0.06);
  73. }
  74. /* Highlight card */
  75. .pricing-card.highlight {
  76.     border: 2px solid #52c0b4;
  77.     background: #f4fdfb;
  78. }
  79. .highlight-text {
  80.     color: #1ea594;
  81.     font-weight: 800;
  82. }
  83. /* Prices */
  84. .amount {
  85.     font-size: 2.4rem;
  86.     font-weight: 700;
  87.     color: #1d2d35;
  88. }
  89. .subtitle {
  90.     font-size: 0.9rem;
  91. }
  92. /* Badges */
  93. .badge-5sur5 {
  94.     position: absolute;
  95.     top: -12px;
  96.     left: 50%;
  97.     transform: translateX(-50%);
  98.     background: #1ea594;
  99.     padding: 6px 14px;
  100.     border-radius: 30px;
  101.     color: #fff;
  102.     font-size: 0.75rem;
  103.     font-weight: 600;
  104. }
  105. /* Buttons - Styles personnalisés conservés pour les cartes de pricing */
  106. .btn-5sur5 {
  107.     background: #1ea594;
  108.     color: #fff;
  109.     border-radius: 30px;
  110.     padding: 12px 22px;
  111.     font-weight: 600;
  112. }
  113. .btn-5sur5:hover {
  114.     background: #178a7d;
  115.     color: #fff;
  116. }
  117. .btn-5sur5-highlight {
  118.     background: #169e8f;
  119.     color: #fff;
  120.     border-radius: 30px;
  121.     padding: 12px 22px;
  122.     font-weight: 600;
  123. }
  124. .btn-5sur5-highlight:hover {
  125.     background: #127d72;
  126.     color: #fff;
  127. }
  128. .btn-outline-5sur5 {
  129.     border: 2px solid #1ea594;
  130.     color: #1ea594;
  131.     border-radius: 30px;
  132.     padding: 12px 22px;
  133.     font-weight: 600;
  134. }
  135. .btn-outline-5sur5:hover {
  136.     background: #1ea594;
  137.     color: #fff;
  138. }
  139. /* Styles différenciés pour les boutons CTA */
  140. .cta-section .btn-outline-primary {
  141.     border: 2px solid #41a2aa;
  142.     color: #41a2aa;
  143.     background: transparent;
  144.     font-weight: 600;
  145.     transition: all 0.3s ease;
  146. }
  147. .cta-section .btn-outline-primary:hover {
  148.     background: #41a2aa;
  149.     color: #fff;
  150.     border-color: #41a2aa;
  151.     transform: translateY(-2px);
  152.     box-shadow: 0 4px 12px rgba(65, 162, 170, 0.3);
  153. }
  154. .cta-section .btn-secondary {
  155.     font-weight: 600;
  156.     transition: all 0.3s ease;
  157. }
  158. .cta-section .btn-secondary:hover {
  159.     background-color: #e67e4a !important;
  160.     border-color: #e67e4a !important;
  161.     transform: translateY(-2px);
  162.     box-shadow: 0 4px 12px rgba(240, 158, 122, 0.3);
  163. }
  164. .cta-section .btn-primary {
  165.     font-weight: 600;
  166.     transition: all 0.3s ease;
  167.     background-color: #41a2aa;
  168.     border-color: #41a2aa;
  169. }
  170. .cta-section .btn-primary:hover {
  171.     background-color: #358a92;
  172.     border-color: #358a92;
  173.     transform: translateY(-2px);
  174.     box-shadow: 0 4px 12px rgba(65, 162, 170, 0.3);
  175. }
  176. /* ========== RESPONSIVE STYLES - iPad & Phone ========== */
  177. /* iPad (768px - 1024px) */
  178. @media (max-width: 1024px) {
  179.     .py-6 {
  180.         padding: 3rem 0;
  181.     }
  182.     
  183.     .amount {
  184.         font-size: 2rem;
  185.     }
  186.     
  187.     .pricing-card {
  188.         margin-bottom: 1.5rem;
  189.     }
  190.     
  191.     /* Modales */
  192.     .modal-xl {
  193.         max-width: 90%;
  194.     }
  195.     
  196.     .modal-lg {
  197.         max-width: 85%;
  198.     }
  199.     
  200.     /* Sections */
  201.     section {
  202.         padding-left: 1.5rem;
  203.         padding-right: 1.5rem;
  204.     }
  205.     
  206.     /* Hero section */
  207.     .hero-section h1 {
  208.         font-size: 2.5rem;
  209.     }
  210.     
  211.     .hero-section p {
  212.         font-size: 1.1rem;
  213.     }
  214. }
  215. /* Tablettes et petits écrans (576px - 768px) */
  216. @media (max-width: 768px) {
  217.     .py-6 {
  218.         padding: 2.5rem 0;
  219.     }
  220.     
  221.     /* Typography */
  222.     h1 {
  223.         font-size: 2rem !important;
  224.     }
  225.     
  226.     h2 {
  227.         font-size: 1.75rem !important;
  228.     }
  229.     
  230.     h3 {
  231.         font-size: 1.5rem !important;
  232.     }
  233.     
  234.     .amount {
  235.         font-size: 1.8rem;
  236.     }
  237.     
  238.     /* Cards */
  239.     .pricing-card {
  240.         margin-bottom: 1.5rem;
  241.         padding: 1.5rem;
  242.     }
  243.     
  244.     /* Modales */
  245.     .modal-xl {
  246.         max-width: 95%;
  247.         margin: 0.5rem;
  248.     }
  249.     
  250.     .modal-lg {
  251.         max-width: 95%;
  252.         margin: 0.5rem;
  253.     }
  254.     
  255.     .modal-dialog {
  256.         margin: 0.5rem;
  257.     }
  258.     
  259.     .modal-content {
  260.         border-radius: 16px;
  261.     }
  262.     
  263.     .modal-body {
  264.         padding: 1.5rem;
  265.     }
  266.     
  267.     .modal-header {
  268.         padding: 1.25rem 1.5rem;
  269.     }
  270.     
  271.     /* Forms */
  272.     .row.g-3 > [class*="col-md-"] {
  273.         margin-bottom: 1rem;
  274.     }
  275.     
  276.     /* Buttons */
  277.     .btn {
  278.         padding: 10px 20px;
  279.         font-size: 0.95rem;
  280.     }
  281.     
  282.     .btn-5sur5,
  283.     .btn-5sur5-highlight,
  284.     .btn-outline-5sur5 {
  285.         padding: 10px 18px;
  286.         font-size: 0.9rem;
  287.     }
  288.     
  289.     /* Grid columns - force single column on mobile */
  290.     .col-md-4,
  291.     .col-md-6 {
  292.         flex: 0 0 100%;
  293.         max-width: 100%;
  294.     }
  295.     
  296.     /* Sections */
  297.     section {
  298.         padding-left: 1rem;
  299.         padding-right: 1rem;
  300.     }
  301.     
  302.     /* Hero section */
  303.     .hero-section {
  304.         padding: 3rem 1rem;
  305.     }
  306.     
  307.     .hero-section h1 {
  308.         font-size: 2rem;
  309.         line-height: 1.2;
  310.     }
  311.     
  312.     .hero-section p {
  313.         font-size: 1rem;
  314.     }
  315.     
  316.     /* Badges */
  317.     .badge-5sur5 {
  318.         font-size: 0.7rem;
  319.         padding: 5px 12px;
  320.     }
  321.     
  322.     /* Nav tabs in modals */
  323.     .nav-tabs {
  324.         flex-wrap: wrap;
  325.     }
  326.     
  327.     .nav-tabs .nav-link {
  328.         font-size: 0.9rem;
  329.         padding: 0.5rem 1rem;
  330.     }
  331.     
  332.     /* Calendly iframe */
  333.     .ratio-16x9 {
  334.         min-height: 400px;
  335.     }
  336.     
  337.     /* Text alignment */
  338.     .text-center-mobile {
  339.         text-align: center;
  340.     }
  341.     
  342.     /* Spacing adjustments */
  343.     .mb-4 {
  344.         margin-bottom: 1.5rem !important;
  345.     }
  346.     
  347.     .mb-5 {
  348.         margin-bottom: 2rem !important;
  349.     }
  350.     
  351.     .mt-4 {
  352.         margin-top: 1.5rem !important;
  353.     }
  354.     
  355.     .mt-5 {
  356.         margin-top: 2rem !important;
  357.     }
  358. }
  359. /* Téléphones (jusqu'à 576px) */
  360. @media (max-width: 576px) {
  361.     .py-6 {
  362.         padding: 2rem 0;
  363.     }
  364.     
  365.     /* Typography */
  366.     h1 {
  367.         font-size: 1.75rem !important;
  368.     }
  369.     
  370.     h2 {
  371.         font-size: 1.5rem !important;
  372.     }
  373.     
  374.     h3 {
  375.         font-size: 1.25rem !important;
  376.     }
  377.     
  378.     .lead {
  379.         font-size: 1rem;
  380.     }
  381.     
  382.     .amount {
  383.         font-size: 1.6rem;
  384.     }
  385.     
  386.     /* Cards */
  387.     .pricing-card {
  388.         padding: 1.25rem;
  389.         margin-bottom: 1.25rem;
  390.     }
  391.     
  392.     /* Modales - Full width on mobile */
  393.     .modal-xl,
  394.     .modal-lg,
  395.     .modal-dialog {
  396.         max-width: 100%;
  397.         margin: 0;
  398.         height: 100vh;
  399.     }
  400.     
  401.     .modal-content {
  402.         border-radius: 0;
  403.         height: 100vh;
  404.         display: flex;
  405.         flex-direction: column;
  406.     }
  407.     
  408.     .modal-body {
  409.         padding: 1rem;
  410.         overflow-y: auto;
  411.         flex: 1;
  412.     }
  413.     
  414.     .modal-header {
  415.         padding: 1rem;
  416.         flex-shrink: 0;
  417.     }
  418.     
  419.     .modal-footer {
  420.         padding: 1rem;
  421.         flex-shrink: 0;
  422.     }
  423.     
  424.     /* Forms */
  425.     .form-label {
  426.         font-size: 0.9rem;
  427.         margin-bottom: 0.5rem;
  428.     }
  429.     
  430.     .form-control,
  431.     .form-select {
  432.         font-size: 0.95rem;
  433.         padding: 0.6rem 0.75rem;
  434.     }
  435.     
  436.     textarea.form-control {
  437.         min-height: 80px;
  438.     }
  439.     
  440.     /* Buttons - Full width on mobile */
  441.     .btn {
  442.         width: 100%;
  443.         padding: 12px 20px;
  444.         font-size: 0.95rem;
  445.         margin-bottom: 0.5rem;
  446.     }
  447.     
  448.     .btn-5sur5,
  449.     .btn-5sur5-highlight,
  450.     .btn-outline-5sur5 {
  451.         width: 100%;
  452.         padding: 12px 20px;
  453.     }
  454.     
  455.     .d-grid.d-sm-flex {
  456.         display: flex !important;
  457.         flex-direction: column;
  458.     }
  459.     
  460.     .d-grid.d-sm-flex .btn {
  461.         width: 100%;
  462.     }
  463.     
  464.     /* Grid - Single column */
  465.     .row.g-3 {
  466.         margin-left: 0;
  467.         margin-right: 0;
  468.     }
  469.     
  470.     .row.g-3 > * {
  471.         padding-left: 0;
  472.         padding-right: 0;
  473.     }
  474.     
  475.     /* Sections */
  476.     section {
  477.         padding-left: 0.75rem;
  478.         padding-right: 0.75rem;
  479.     }
  480.     
  481.     /* Hero section */
  482.     .hero-section {
  483.         padding: 2rem 0.75rem;
  484.     }
  485.     
  486.     .hero-section h1 {
  487.         font-size: 1.75rem;
  488.     }
  489.     
  490.     .hero-section p {
  491.         font-size: 0.95rem;
  492.     }
  493.     
  494.     /* Badges */
  495.     .badge-5sur5 {
  496.         font-size: 0.65rem;
  497.         padding: 4px 10px;
  498.     }
  499.     
  500.     /* Nav tabs */
  501.     .nav-tabs {
  502.         border-bottom: 1px solid #dee2e6;
  503.     }
  504.     
  505.     .nav-tabs .nav-item {
  506.         flex: 1;
  507.     }
  508.     
  509.     .nav-tabs .nav-link {
  510.         font-size: 0.85rem;
  511.         padding: 0.5rem 0.75rem;
  512.         text-align: center;
  513.     }
  514.     
  515.     /* Calendly iframe */
  516.     .ratio-16x9 {
  517.         min-height: 350px;
  518.     }
  519.     
  520.     /* Text sizes */
  521.     .small {
  522.         font-size: 0.8rem;
  523.     }
  524.     
  525.     /* Spacing */
  526.     .mb-4 {
  527.         margin-bottom: 1.25rem !important;
  528.     }
  529.     
  530.     .mb-5 {
  531.         margin-bottom: 1.5rem !important;
  532.     }
  533.     
  534.     .mt-4 {
  535.         margin-top: 1.25rem !important;
  536.     }
  537.     
  538.     .mt-5 {
  539.         margin-top: 1.5rem !important;
  540.     }
  541.     
  542.     .px-4 {
  543.         padding-left: 1rem !important;
  544.         padding-right: 1rem !important;
  545.     }
  546.     
  547.     .py-4 {
  548.         padding-top: 1.5rem !important;
  549.         padding-bottom: 1.5rem !important;
  550.     }
  551.     
  552.     /* Step labels */
  553.     #stepLabel {
  554.         font-size: 0.75rem;
  555.         padding: 0.25rem 0.5rem;
  556.     }
  557.     
  558.     #stepDescription {
  559.         font-size: 0.8rem;
  560.     }
  561.     
  562.     /* Modal title */
  563.     .modal-title {
  564.         font-size: 1.25rem;
  565.     }
  566.     
  567.     /* Icons in buttons */
  568.     .btn i {
  569.         font-size: 0.9rem;
  570.     }
  571. }
  572. /* Très petits écrans (jusqu'à 375px) */
  573. @media (max-width: 375px) {
  574.     h1 {
  575.         font-size: 1.5rem !important;
  576.     }
  577.     
  578.     h2 {
  579.         font-size: 1.35rem !important;
  580.     }
  581.     
  582.     .amount {
  583.         font-size: 1.4rem;
  584.     }
  585.     
  586.     .btn {
  587.         font-size: 0.9rem;
  588.         padding: 10px 16px;
  589.     }
  590.     
  591.     .modal-title {
  592.         font-size: 1.1rem;
  593.     }
  594.     
  595.     .form-control,
  596.     .form-select {
  597.         font-size: 0.9rem;
  598.     }
  599. }
  600. /* Orientation landscape sur mobile */
  601. @media (max-width: 768px) and (orientation: landscape) {
  602.     .modal-content {
  603.         max-height: 90vh;
  604.     }
  605.     
  606.     .modal-body {
  607.         max-height: calc(90vh - 120px);
  608.         overflow-y: auto;
  609.     }
  610.     
  611.     .hero-section {
  612.         padding: 2rem 1rem;
  613.     }
  614. }
  615. /* Images responsive */
  616. img {
  617.     max-width: 100%;
  618.     height: auto;
  619. }
  620. /* Hero image - Réduire la taille et repositionner */
  621. .hero-img {
  622.     position: relative;
  623.     display: flex;
  624.     align-items: flex-start;
  625.     justify-content: flex-end;
  626.     gap: 1rem;
  627. }
  628. .img-card {
  629.     max-width: 300px !important;
  630.     width: 300px !important;
  631.     height: auto !important;
  632.     object-fit: contain;
  633.     position: relative;
  634.     z-index: 2;
  635.     box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
  636.     transition: transform 0.3s ease;
  637. }
  638. .img-card:hover {
  639.     transform: scale(1.05);
  640. }
  641. .img-main {
  642.     max-width: 100%;
  643.     height: auto;
  644. }
  645. /* Sur mobile, image plus petite et en haut */
  646. @media (max-width: 768px) {
  647.     .hero-img {
  648.         flex-direction: column;
  649.         align-items: center;
  650.         justify-content: flex-start;
  651.     }
  652.     
  653.     .img-card {
  654.         max-width: 250px !important;
  655.         width: 250px !important;
  656.         margin-bottom: 1rem;
  657.         order: -1; /* Mettre l'image en premier (en haut) */
  658.     }
  659. }
  660. @media (max-width: 576px) {
  661.     .img-card {
  662.         max-width: 200px !important;
  663.         width: 200px !important;
  664.     }
  665. }
  666. /* Sur desktop, image à droite en haut */
  667. @media (min-width: 769px) {
  668.     .hero-img {
  669.         flex-direction: row;
  670.         align-items: flex-start;
  671.         justify-content: flex-end;
  672.         position: relative;
  673.         min-height: 400px;
  674.     }
  675.     
  676.     .img-card {
  677.         position: absolute;
  678.         top: 0;
  679.         right: 0;
  680.         max-width: 280px !important;
  681.         width: 280px !important;
  682.         z-index: 10;
  683.     }
  684.     
  685.     .img-main {
  686.         position: relative;
  687.         z-index: 1;
  688.         max-width: 100%;
  689.     }
  690. }
  691. /* Sur iPad, image plus petite à droite */
  692. @media (min-width: 769px) and (max-width: 1024px) {
  693.     .img-card {
  694.         max-width: 240px !important;
  695.         width: 240px !important;
  696.     }
  697. }
  698. /* Containers responsive */
  699. .container,
  700. .container-fluid {
  701.     padding-left: 1rem;
  702.     padding-right: 1rem;
  703. }
  704. @media (max-width: 576px) {
  705.     .container,
  706.     .container-fluid {
  707.         padding-left: 0.75rem;
  708.         padding-right: 0.75rem;
  709.     }
  710. }
  711. /* Tables responsive */
  712. @media (max-width: 768px) {
  713.     table {
  714.         font-size: 0.9rem;
  715.     }
  716.     
  717.     .table-responsive {
  718.         overflow-x: auto;
  719.         -webkit-overflow-scrolling: touch;
  720.     }
  721. }
  722. /* Cards grid responsive */
  723. @media (max-width: 992px) {
  724.     .row > [class*="col-lg-"] {
  725.         margin-bottom: 1.5rem;
  726.     }
  727. }
  728. @media (max-width: 768px) {
  729.     .row > [class*="col-md-"] {
  730.         margin-bottom: 1.25rem;
  731.     }
  732. }
  733. /* Text overflow */
  734. @media (max-width: 576px) {
  735.     .text-truncate {
  736.         max-width: 100%;
  737.     }
  738.     
  739.     /* Force text wrapping */
  740.     h1, h2, h3, h4, h5, h6,
  741.     .lead, p {
  742.         word-wrap: break-word;
  743.         overflow-wrap: break-word;
  744.     }
  745. }
  746. /* Fix for fixed width elements */
  747. @media (max-width: 768px) {
  748.     [style*="width:"] {
  749.         max-width: 100% !important;
  750.     }
  751.     
  752.     [style*="min-width:"] {
  753.         min-width: auto !important;
  754.     }
  755. }
  756. /* Fix modal width issues */
  757. @media (max-width: 576px) {
  758.     .modal-dialog[style*="width"],
  759.     .responsive-modal-content {
  760.         width: 100% !important;
  761.         max-width: 100% !important;
  762.         margin: 0 !important;
  763.         top: 0 !important;
  764.     }
  765. }
  766. @media (max-width: 768px) {
  767.     .responsive-modal-content {
  768.         width: 90% !important;
  769.         max-width: 90% !important;
  770.     }
  771. }
  772. /* Ensure proper scrolling */
  773. @media (max-width: 576px) {
  774.     body {
  775.         overflow-x: hidden;
  776.     }
  777.     
  778.     .modal-body {
  779.         -webkit-overflow-scrolling: touch;
  780.     }
  781.     
  782.     /* Responsive containers */
  783.     .responsive-text-container,
  784.     .responsive-container {
  785.         max-width: 100% !important;
  786.         padding-left: 1rem;
  787.         padding-right: 1rem;
  788.     }
  789. }
  790. @media (max-width: 768px) {
  791.     .responsive-text-container {
  792.         max-width: 100% !important;
  793.     }
  794.     
  795.     .responsive-container {
  796.         max-width: 95% !important;
  797.         padding: 1.5rem !important;
  798.     }
  799. }
  800. /* ========== BOUTON DE CONNEXION HEADER ========== */
  801. .login-cta {
  802.     display: flex;
  803.     flex-direction: column;
  804.     align-items: flex-end;
  805.     justify-content: center;
  806.     gap: .25rem;
  807. }
  808. .btn-login2 {
  809.     border-radius: 12px;
  810.     padding: .6rem 1rem;
  811.     min-height: 46px;
  812.     font-weight: 700;
  813. }
  814. .login-cta__meta {
  815.     font-size: .78rem;
  816.     color: rgba(11, 31, 35, .65);
  817.     font-weight: 600;
  818.     white-space: nowrap;
  819. }
  820. /* Garantir la visibilité du bouton "Je me connecte" en mobile */
  821. .header-social {
  822.     display: flex !important;
  823. }
  824. .header-social .btn {
  825.     display: block !important;
  826. }
  827. @media (max-width: 991px) {
  828.     .ms-auto.w-auto {
  829.         display: flex !important;
  830.     }
  831.     
  832.     .header-social {
  833.         display: flex !important;
  834.         flex-wrap: nowrap;
  835.         gap: 0.5rem;
  836.     }
  837.     
  838.     .header-social .btn {
  839.         display: block !important;
  840.         white-space: nowrap;
  841.         font-size: 0.9rem;
  842.         padding: 0.5rem 1rem;
  843.     }
  844. }
  845. /* ========== SECTION POUR QUI ========== */
  846. .pourqui__v1 .subtitle {
  847.     background-color: rgba(var(--bs-secondary-rgb), 0.2);
  848.     color: var(--bs-primary);
  849.     display: inline-block;
  850.     padding: 5px 12px;
  851.     border-radius: 7px;
  852. }
  853. .pourqui-card {
  854.     transition: all 0.3s ease;
  855. }
  856. .pourqui-card:hover {
  857.     box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08) !important;
  858.     transform: translateY(-3px);
  859. }
  860. /* ========== MODALE DE CONNEXION ========== */
  861. .login-modal-card {
  862.     display: block;
  863.     cursor: pointer;
  864.     transition: all 0.3s ease;
  865. }
  866. .login-modal-card-inner {
  867.     background: #ffffff;
  868.     border: 1px solid #e5e7eb;
  869.     border-radius: 12px;
  870.     transition: all 0.3s ease;
  871.     height: 100%;
  872. }
  873. .login-modal-card:hover .login-modal-card-inner {
  874.     border-color: #41a2aa;
  875.     box-shadow: 0 4px 12px rgba(65, 162, 170, 0.15);
  876.     transform: translateY(-2px);
  877. }
  878. .login-modal-img {
  879.     max-width: 120px;
  880.     height: auto;
  881.     display: block;
  882.     margin-left: auto;
  883.     margin-right: auto;
  884. }
  885. .login-modal-title {
  886.     color: #1d2d35;
  887.     font-weight: 600;
  888.     font-size: 1.1rem;
  889.     margin: 0;
  890. }
  891. .login-modal-card:hover .login-modal-title {
  892.     color: #41a2aa;
  893. }
  894. #modal-login .modal-header {
  895.     padding: 1.5rem 1.5rem 0.5rem;
  896. }
  897. #modal-login .modal-title {
  898.     font-size: 1.5rem;
  899.     font-weight: 600;
  900.     color: #1d2d35;
  901. }
  902. /* Responsive - Mobile */
  903. @media (max-width: 991px) {
  904.     #modal-login .modal-dialog {
  905.         margin: 0.5rem;
  906.         max-width: calc(100% - 1rem);
  907.     }
  908.     
  909.     #modal-login .modal-content {
  910.         border-radius: 16px;
  911.     }
  912.     
  913.     #modal-login .modal-header {
  914.         padding: 1.25rem 1rem 0.75rem;
  915.         position: relative;
  916.     }
  917.     
  918.     #modal-login .modal-header .w-100 {
  919.         margin-top: 50px;
  920.     }
  921.     
  922.     #modal-login .modal-header .btn-close {
  923.         position: absolute;
  924.         top: 0.75rem;
  925.         right: 0.75rem;
  926.         padding: 0.5rem;
  927.         margin: 0;
  928.     }
  929.     
  930.     #modal-login .modal-title {
  931.         font-size: 1.25rem;
  932.         margin-bottom: 0.25rem;
  933.     }
  934.     
  935.     #modal-login .modal-header p {
  936.         font-size: 0.85rem;
  937.         margin-bottom: 0;
  938.     }
  939.     
  940.     #modal-login .modal-body {
  941.         padding: 1rem;
  942.     }
  943.     
  944.     .login-modal-card-inner {
  945.         padding: 1.5rem 1rem !important;
  946.         min-height: auto;
  947.     }
  948.     
  949.     .login-modal-img {
  950.         max-width: 90px;
  951.         margin-bottom: 1rem !important;
  952.     }
  953.     
  954.     .login-modal-title {
  955.         font-size: 1rem;
  956.         font-weight: 600;
  957.     }
  958.     
  959.     .row.g-3 > * {
  960.         margin-bottom: 0.75rem;
  961.     }
  962.     
  963.     .row.g-3 > *:last-child {
  964.         margin-bottom: 0;
  965.     }
  966. }
  967. @media (max-width: 576px) {
  968.     #modal-login .modal-dialog {
  969.         margin: 0.25rem;
  970.         max-width: calc(100% - 0.5rem);
  971.     }
  972.     
  973.     #modal-login .modal-header {
  974.         padding: 1rem 0.75rem 0.5rem;
  975.     }
  976.     
  977.     #modal-login .modal-header .w-100 {
  978.         margin-top: 50px;
  979.     }
  980.     
  981.     #modal-login .modal-header .btn-close {
  982.         top: 0.5rem;
  983.         right: 0.5rem;
  984.         padding: 0.375rem;
  985.     }
  986.     
  987.     #modal-login .modal-title {
  988.         font-size: 1.1rem;
  989.         padding-right: 2rem;
  990.     }
  991.     
  992.     #modal-login .modal-header p {
  993.         font-size: 0.8rem;
  994.         padding-right: 2rem;
  995.     }
  996.     
  997.     #modal-login .modal-body {
  998.         padding: 0.75rem;
  999.     }
  1000.     
  1001.     .login-modal-card-inner {
  1002.         padding: 1.25rem 0.75rem !important;
  1003.     }
  1004.     
  1005.     .login-modal-img {
  1006.         max-width: 80px;
  1007.         margin-bottom: 0.75rem !important;
  1008.     }
  1009.     
  1010.     .login-modal-title {
  1011.         font-size: 0.95rem;
  1012.     }
  1013. }
  1014.     
  1015.     </style>
  1016.     
  1017.     <!-- ======= Apply theme =======-->
  1018.     <script>
  1019.       // Apply the theme as early as possible to avoid flicker
  1020.       (function() {
  1021.         const storedTheme = localStorage.getItem('theme') || 'light';
  1022.         document.documentElement.setAttribute('data-bs-theme', storedTheme);
  1023.       })();
  1024.     </script>
  1025.   </head>
  1026.   <body>
  1027.     
  1028. <!-- MODALE -->
  1029. <div class="modal fade" id="demoModal" tabindex="-1" aria-hidden="true">
  1030.   <div class="modal-dialog modal-lg modal-dialog-centered">
  1031.     <div class="modal-content">
  1032.       <div class="modal-header">
  1033.         <h5 id="demoTitle" class="modal-title">Demander une démo guidée</h5>
  1034.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  1035.       </div>
  1036.       <div class="modal-body">
  1037.         <ul class="nav nav-tabs" id="demoTabs" role="tablist">
  1038.           <li class="nav-item" role="presentation">
  1039.             <button class="nav-link active" id="tab-calendar" data-bs-toggle="tab" data-bs-target="#pane-calendar" type="button" role="tab">
  1040.               Réserver un créneau
  1041.             </button>
  1042.           </li>
  1043.           <li class="nav-item" role="presentation">
  1044.             <button class="nav-link" id="tab-callback" data-bs-toggle="tab" data-bs-target="#pane-callback" type="button" role="tab">
  1045.               Être rappelé
  1046.             </button>
  1047.           </li>
  1048.         </ul>
  1049.         <div class="tab-content pt-3">
  1050.           <!-- Calendrier -->
  1051.           <div class="tab-pane fade show active" id="pane-calendar" role="tabpanel">
  1052.             <div class="text-center mb-3">
  1053.               <h6 class="mb-2">Réservez votre créneau de démonstration</h6>
  1054.               <p class="text-muted small">Choisissez un créneau qui vous convient pour une démo personnalisée</p>
  1055.             </div>
  1056.             <div class="ratio ratio-16x9 border rounded">
  1057.               <iframe src="https://calendly.com/5sur5sejour/demo" title="Calendrier de réservation" loading="lazy" frameborder="0"></iframe>
  1058.             </div>
  1059.             <p class="small text-muted mt-2 mb-0">
  1060.               <i class="bi bi-clock me-1"></i> Créneau visio 15–30 min · 
  1061.               <i class="bi bi-check-circle me-1"></i> Confirmation instantanée ·
  1062.               <i class="bi bi-shield-check me-1"></i> 100% gratuit
  1063.             </p>
  1064.           </div>
  1065.           <!-- Formulaire callback -->
  1066.           <div class="tab-pane fade" id="pane-callback" role="tabpanel">
  1067.             <div class="text-center mb-3">
  1068.               <h6 class="mb-2">Être rappelé par un expert</h6>
  1069.               <p class="text-muted small">Laissez-nous vos coordonnées et nous vous rappelons sous 24h</p>
  1070.             </div>
  1071.             <form id="contactForm" class="needs-validation" method="post" action="{{ path('app_contact') }}" novalidate>
  1072.               <input type="hidden" name="topic" id="topic" value="demo">
  1073.               <input type="hidden" name="pack"  id="pack"  value="">
  1074.               <input type="hidden" name="objet" id="objet" value="demo">
  1075.               <input type="text" name="website" class="visually-hidden" tabindex="-1" autocomplete="off">
  1076.               <div class="row g-3">
  1077.                 <div class="col-md-6">
  1078.                   <label class="form-label">Nom & prénom</label>
  1079.                   <input type="text" class="form-control" name="name" required 
  1080.                          placeholder="Votre nom complet">
  1081.                   <div class="invalid-feedback">Veuillez saisir votre nom et prénom.</div>
  1082.                 </div>
  1083.                 <div class="col-md-6">
  1084.                   <label class="form-label">Établissement</label>
  1085.                   <input type="text" class="form-control" name="organization" required 
  1086.                          placeholder="Nom de votre établissement">
  1087.                   <div class="invalid-feedback">Veuillez saisir le nom de votre établissement.</div>
  1088.                 </div>
  1089.                 <div class="col-md-6">
  1090.                   <label class="form-label">Email pro</label>
  1091.                   <input type="email" class="form-control" name="email" required 
  1092.                          placeholder="votre.email@etablissement.fr">
  1093.                   <div class="invalid-feedback">Veuillez saisir une adresse email valide.</div>
  1094.                 </div>
  1095.                 <div class="col-md-6">
  1096.                   <label class="form-label">Téléphone</label>
  1097.                   <input type="tel" class="form-control" name="telephone" required 
  1098.                          placeholder="06 12 34 56 78" pattern="[0-9\s\+\-\(\)]{10,}">
  1099.                   <div class="invalid-feedback">Veuillez saisir un numéro de téléphone valide.</div>
  1100.                 </div>
  1101.                 <div class="col-md-6">
  1102.                   <label class="form-label">Nb. de séjours / an</label>
  1103.                   <select class="form-select" name="sejours_count" required>
  1104.                     <option value="" selected>Choisir…</option>
  1105.                     <option value="1-3">1–3</option>
  1106.                     <option value="4-10">4–10</option>
  1107.                     <option value="11-30">11–30</option>
  1108.                     <option value="30+">30+</option>
  1109.                   </select>
  1110.                   <div class="invalid-feedback">Veuillez sélectionner le nombre de séjours.</div>
  1111.                 </div>
  1112.                 <div class="col-12">
  1113.                   <label class="form-label">Message (optionnel)</label>
  1114.                   <textarea class="form-control" name="message" rows="3"
  1115.                     placeholder="Décrivez brièvement vos besoins : type de séjours, nombre d'enfants, questions spécifiques..."></textarea>
  1116.                 </div>
  1117.                 <div class="col-12">
  1118.                   <div class="form-check">
  1119.                     <input class="form-check-input" type="checkbox" value="1" id="consent" name="consent" required>
  1120.                     <label class="form-check-label" for="consent">J'accepte d'être contacté (RGPD).</label>
  1121.                     <div class="invalid-feedback">Vous devez accepter d'être contacté pour continuer.</div>
  1122.                   </div>
  1123.                 </div>
  1124.                 <div class="col-12 d-grid d-sm-flex gap-2">
  1125.                   <button id="submitBtn" class="btn btn-primary px-4" type="submit">
  1126.                     <i class="bi bi-telephone me-2"></i>Être rappelé sous 24h
  1127.                   </button>
  1128.                   <a class="btn btn-outline-secondary px-4" href="mailto:contact@5sur5sejour.fr">
  1129.                     <i class="bi bi-envelope me-2"></i>Nous écrire
  1130.                   </a>
  1131.                 </div>
  1132.               </div>
  1133.               <p class="small text-muted mt-2 mb-0">
  1134.                 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>
  1135.               </p>
  1136.             </form>
  1137.           </div>
  1138.         </div>
  1139.       </div>
  1140.       <div class="modal-footer">
  1141.         <p class="small text-muted mb-0">Sans engagement · Données hébergées en France</p>
  1142.       </div>
  1143.     </div>
  1144.   </div>
  1145. </div>
  1146. <!-- MODALE CRÉER MON SÉJOUR -->
  1147. <div class="modal fade" id="createSejourModal" tabindex="-1" aria-labelledby="createSejourTitle" aria-hidden="true">
  1148.   <div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable">
  1149.     <div class="modal-content">
  1150.       <div class="modal-header border-bottom-0">
  1151.         <div class="w-100">
  1152.           <h5 id="createSejourTitle" class="modal-title mb-2">Créer mon espace séjour</h5>
  1153.           <div class="d-flex align-items-center gap-2">
  1154.             <span id="stepLabel" class="badge bg-primary">Étape 1/2</span>
  1155.             <small class="text-muted" id="stepDescription">Choisissez votre profil</small>
  1156.           </div>
  1157.         </div>
  1158.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  1159.       </div>
  1160.       <div class="modal-body px-4">
  1161.         <!-- ÉTAPE 1 : Choix du profil -->
  1162.         <div id="step1" class="step-content">
  1163.           <p class="lead text-center mb-4">Sélectionnez l'option qui correspond à votre situation :</p>
  1164.           
  1165.           <div class="row g-3 mb-3">
  1166.             <!-- Création simple -->
  1167.             <div class="col-md-4">
  1168.               <a class="card h-100 border-2 hover-shadow text-decoration-none" href="{{ path('app_creation_simple_creer') }}">
  1169.                 <div class="card-body text-center p-4">
  1170.                   <div class="fs-1 mb-3">✨</div>
  1171.                   <h6 class="card-title fw-bold mb-2">Créer un  espace séjour</h6>
  1172.                   <p class="card-text small text-muted mb-3">
  1173.                     Créez un séjour unique. Paiement flexible : par les parents ou par la structure. Prix unique de 39€ par séjour.
  1174.                   </p>
  1175.                   <span class="badge bg-primary">🎯 Flexible</span>
  1176.                 </div>
  1177.               </a>
  1178.             </div>
  1179.             <!-- Pack Annuel - 25 séjours -->
  1180.  <div class="col-md-4">
  1181.               <a class="card h-100 border-2 hover-shadow text-decoration-none" href="{{ path('pack_annuel_partenaires') }}">
  1182.                 <div class="card-body text-center p-4">
  1183.                   <div class="fs-1 mb-3">📅</div>
  1184.                   <h6 class="card-title fw-bold mb-2">En moyenne 25 séjours par an</h6>
  1185.                   <p class="card-text small text-muted mb-3">
  1186.                     Pack Annuel idéal pour les structures organisant plusieurs séjours. Jusqu'à 25 séjours inclus, accompagnateurs illimités, support premium.
  1187.                   </p>
  1188.                   <span class="badge bg-info">💼 Pack Annuel</span>
  1189.                 </div>
  1190.               </a>
  1191.             </div>
  1192.             <!-- Plus de 25 séjours - Partenaire -->
  1193.             <div class="col-md-4">
  1194.               <a class="card h-100 border-2 hover-shadow text-decoration-none" href="{{ path('nosPartenaires') }}">
  1195.                 <div class="card-body text-center p-4">
  1196.                   <div class="fs-1 mb-3">🚀</div>
  1197.                   <h6 class="card-title fw-bold mb-2">Plus de 25 séjours par an</h6>
  1198.                   <p class="card-text small text-muted mb-3">
  1199.                     Devenez partenaire 5sur5 Séjour et bénéficiez d'une offre sur mesure avec tarif dégressif, accompagnement dédié et avantages exclusifs.
  1200.                   </p>
  1201.                   <span class="badge bg-purple">🤝 Partenariat</span>
  1202.                 </div>
  1203.               </a>
  1204.             </div>
  1205.           </div>
  1206.           <!-- École publique - Plus discret -->
  1207.           <div class="text-center mt-4 pt-3 border-top">
  1208.             <p class="small text-muted mb-2">Vous êtes une école publique ?</p>
  1209.             <p class="small text-muted mb-2">5sur5séjour offre son accès aux écoles publiques en France</p>
  1210.             <a href="{{ path('app_ecoles_publiques_creer') }}" class="text-decoration-none d-inline-flex align-items-center gap-2 small fw-semibold text-primary">
  1211.               <span>Accès gratuit à la plateforme</span>
  1212.               <span class="badge bg-success">✅ Gratuit</span>
  1213.               <i class="bi bi-arrow-right"></i>
  1214.             </a>
  1215.           </div>
  1216.         </div>
  1217.         <!-- ÉTAPE 2 : Formulaires selon le profil -->
  1218.         <div id="step2" class="step-content d-none">
  1219.           <!-- Panneau Partenaire -->
  1220.           <div id="pane-partenaire" class="role-pane d-none">
  1221.             <div class="alert alert-info mb-4">
  1222.               <strong>🤝 Partenaire / Organisme</strong><br>
  1223.               <small>Démo 15–30 min · Accompagnement contrat & onboarding.</small>
  1224.             </div>
  1225.             <ul class="nav nav-tabs mb-3" id="partenaireTabsNav" role="tablist">
  1226.               <li class="nav-item" role="presentation">
  1227.                 <button class="nav-link active" id="tab-partenaire-demo" data-bs-toggle="tab" data-bs-target="#pane-partenaire-demo" type="button" role="tab">
  1228.                   Réserver une démo
  1229.                 </button>
  1230.               </li>
  1231.               <li class="nav-item" role="presentation">
  1232.                 <button class="nav-link" id="tab-partenaire-callback" data-bs-toggle="tab" data-bs-target="#pane-partenaire-callback" type="button" role="tab">
  1233.                   Être rappelé
  1234.                 </button>
  1235.               </li>
  1236.             </ul>
  1237.             <div class="tab-content">
  1238.               <!-- Calendly pour démo partenaire -->
  1239.               <div class="tab-pane fade show active" id="pane-partenaire-demo" role="tabpanel">
  1240.                 <div class="text-center mb-3">
  1241.                   <p class="text-muted small mb-2">Choisissez un créneau pour une démo personnalisée</p>
  1242.                 </div>
  1243.                 <div class="ratio ratio-16x9 border rounded">
  1244.                   <iframe data-src="https://calendly.com/5sur5sejour/demo" title="Calendrier de réservation partenaire" loading="lazy" frameborder="0"></iframe>
  1245.                 </div>
  1246.                 <p class="small text-muted mt-2 mb-0">
  1247.                   <i class="bi bi-clock me-1"></i> Créneau visio 15–30 min · 
  1248.                   <i class="bi bi-check-circle me-1"></i> Accompagnement contrat ·
  1249.                   <i class="bi bi-shield-check me-1"></i> 100% gratuit
  1250.                 </p>
  1251.               </div>
  1252.               <!-- Formulaire rappel partenaire -->
  1253.               <div class="tab-pane fade" id="pane-partenaire-callback" role="tabpanel">
  1254.                 <form id="formPartenaire" method="post" action="/contact/partenaire" class="needs-validation" novalidate>
  1255.                   <input type="text" name="website" class="visually-hidden" tabindex="-1" autocomplete="off">
  1256.                   
  1257.                   <div class="row g-3">
  1258.                     <div class="col-md-6">
  1259.                       <label class="form-label">Nom & prénom <span class="text-danger">*</span></label>
  1260.                       <input type="text" class="form-control" name="name" required 
  1261.                              placeholder="Votre nom complet">
  1262.                       <div class="invalid-feedback">Veuillez saisir votre nom et prénom.</div>
  1263.                     </div>
  1264.                     <div class="col-md-6">
  1265.                       <label class="form-label">Structure <span class="text-danger">*</span></label>
  1266.                       <input type="text" class="form-control" name="organization" required 
  1267.                              placeholder="Nom de votre structure">
  1268.                       <div class="invalid-feedback">Veuillez saisir le nom de votre structure.</div>
  1269.                     </div>
  1270.                     <div class="col-md-6">
  1271.                       <label class="form-label">Email pro <span class="text-danger">*</span></label>
  1272.                       <input type="email" class="form-control" name="email" required 
  1273.                              placeholder="votre.email@structure.fr">
  1274.                       <div class="invalid-feedback">Veuillez saisir une adresse email valide.</div>
  1275.                     </div>
  1276.                     <div class="col-md-6">
  1277.                       <label class="form-label">Téléphone (optionnel)</label>
  1278.                       <input type="tel" class="form-control" name="telephone" 
  1279.                              placeholder="06 12 34 56 78">
  1280.                     </div>
  1281.                     <div class="col-12">
  1282.                       <label class="form-label">Message (optionnel)</label>
  1283.                       <textarea class="form-control" name="message" rows="3"
  1284.                         placeholder="Décrivez brièvement vos besoins..."></textarea>
  1285.                     </div>
  1286.                     <div class="col-12">
  1287.                       <div class="form-check">
  1288.                         <input class="form-check-input" type="checkbox" value="1" id="consent_partenaire" name="consent" required>
  1289.                         <label class="form-check-label" for="consent_partenaire">
  1290.                           J'accepte d'être contacté (RGPD) <span class="text-danger">*</span>
  1291.                         </label>
  1292.                         <div class="invalid-feedback">Vous devez accepter d'être contacté.</div>
  1293.                       </div>
  1294.                     </div>
  1295.                     <div class="col-12 d-flex gap-2">
  1296.                       <button type="submit" class="btn btn-primary px-4">
  1297.                         <i class="bi bi-telephone me-2"></i>Être rappelé sous 24 h
  1298.                       </button>
  1299.                       <a class="btn btn-outline-secondary px-4" href="mailto:contact@5sur5sejour.fr">
  1300.                         Nous écrire
  1301.                       </a>
  1302.                     </div>
  1303.                   </div>
  1304.                 </form>
  1305.               </div>
  1306.             </div>
  1307.           </div>
  1308.           <!-- Panneau Création simple -->
  1309.           <div id="pane-autre" class="role-pane d-none">
  1310.             <div class="alert alert-primary mb-4">
  1311.               <strong>✨ Créer un espace séjour</strong><br>
  1312.               <small>Type PP (Partenaire Payant) - Les familles peuvent activer Parent Premium (2,90 € / parent / séjour).</small>
  1313.             </div>
  1314.             <form id="formAutre" method="post" action="/Accompagnateur/register" class="needs-validation" novalidate>
  1315.               <input type="text" name="website" class="visually-hidden" tabindex="-1" autocomplete="off">
  1316.               <input type="hidden" name="type_user" value="PP">
  1317.               <input type="hidden" name="connpay" value="1">
  1318.               
  1319.               <div class="row g-3">
  1320.                 <div class="col-md-6">
  1321.                   <label class="form-label">Nom <span class="text-danger">*</span></label>
  1322.                   <input type="text" class="form-control" name="nom_acc" required 
  1323.                          placeholder="Votre nom">
  1324.                   <div class="invalid-feedback">Veuillez saisir votre nom.</div>
  1325.                 </div>
  1326.                 <div class="col-md-6">
  1327.                   <label class="form-label">Prénom <span class="text-danger">*</span></label>
  1328.                   <input type="text" class="form-control" name="prenom_acc" required 
  1329.                          placeholder="Votre prénom">
  1330.                   <div class="invalid-feedback">Veuillez saisir votre prénom.</div>
  1331.                 </div>
  1332.                 <div class="col-md-12">
  1333.                   <label class="form-label">Fonction <span class="text-danger">*</span></label>
  1334.                   <select class="form-select" name="fonction" required>
  1335.                     <option value="">Choisir votre fonction</option>
  1336.                     <option value="1">Enseignant(e)</option>
  1337.                     <option value="2">Principal(e)</option>
  1338.                     <option value="3">Professeur(e)</option>
  1339.                     <option value="4">CPE</option>
  1340.                     <option value="5">Directeur(trice) d'école</option>
  1341.                     <option value="6">Animateur(trice)</option>
  1342.                     <option value="7">Directeur(trice) séjour</option>
  1343.                     <option value="8">Directeur(trice) centre de loisirs / ALSH</option>
  1344.                     <option value="9">Coordinateur(trice) enfance jeunesse</option>
  1345.                     <option value="10">Educateur(trice)</option>
  1346.                     <option value="11">Président(e)</option>
  1347.                     <option value="12">Autre</option>
  1348.                   </select>
  1349.                   <div class="invalid-feedback">Veuillez sélectionner votre fonction.</div>
  1350.                 </div>
  1351.                 <div class="col-md-12">
  1352.                   <label class="form-label">Structure / Organisme <span class="text-danger">*</span></label>
  1353.                   <input type="text" class="form-control" name="etablisment" required 
  1354.                          placeholder="Nom de votre structure ou organisation">
  1355.                   <div class="invalid-feedback">Veuillez saisir le nom de votre structure.</div>
  1356.                 </div>
  1357.                 <div class="col-md-12">
  1358.                   <label class="form-label">Adresse structure</label>
  1359.                   <input type="text" class="form-control" name="adressetablisment" 
  1360.                          placeholder="Adresse de votre structure">
  1361.                 </div>
  1362.                 <div class="col-md-6">
  1363.                   <label class="form-label">Code postal</label>
  1364.                   <input type="text" class="form-control" name="CODEpOSTALetablisment" 
  1365.                          placeholder="Code postal" maxlength="5">
  1366.                 </div>
  1367.                 <div class="col-md-6">
  1368.                   <label class="form-label">Ville</label>
  1369.                   <input type="text" class="form-control" name="villeetablisment" 
  1370.                          placeholder="Ville de votre structure">
  1371.                 </div>
  1372.                 <div class="col-md-6">
  1373.                   <label class="form-label">N° de Téléphone mobile <span class="text-danger">*</span></label>
  1374.                   <input type="tel" class="form-control" name="phone_acc" required 
  1375.                          placeholder="06 12 34 56 78" pattern="[0-9\s\+\-\(\)]{10,}">
  1376.                   <div class="invalid-feedback">Veuillez saisir un numéro de téléphone valide.</div>
  1377.                 </div>
  1378.                 <div class="col-md-6">
  1379.                   <label class="form-label">Email <span class="text-danger">*</span></label>
  1380.                   <input type="email" class="form-control" name="email" required 
  1381.                          placeholder="votre.email@structure.fr">
  1382.                   <div class="invalid-feedback">Veuillez saisir une adresse email valide.</div>
  1383.                 </div>
  1384.                 <!-- Informations du séjour -->
  1385.                 <div class="col-12 mt-4">
  1386.                   <h6 class="text-primary">📍 Informations du séjour</h6>
  1387.                   <hr>
  1388.                 </div>
  1389.                 <div class="col-md-12">
  1390.                   <label class="form-label">Thème du séjour <span class="text-danger">*</span></label>
  1391.                   <input type="text" class="form-control" name="theme_sejour" required 
  1392.                          placeholder="Ex: Séjour ski, Camp d'été...">
  1393.                   <div class="invalid-feedback">Veuillez saisir le thème du séjour.</div>
  1394.                 </div>
  1395.                 <div class="col-md-12">
  1396.                   <label class="form-label">Adresse du séjour</label>
  1397.                   <input type="text" class="form-control" name="adress_sejour" 
  1398.                          placeholder="Adresse du lieu de séjour">
  1399.                 </div>
  1400.                 <div class="col-md-6">
  1401.                   <label class="form-label">Code postal</label>
  1402.                   <input type="text" class="form-control" name="codePostal" 
  1403.                          placeholder="Code postal" maxlength="5">
  1404.                 </div>
  1405.                 <div class="col-md-6">
  1406.                   <label class="form-label">Pays <span class="text-danger">*</span></label>
  1407.                   <select class="form-select" name="pays" required>
  1408.                     <option value="">Choisir un pays</option>
  1409.                     <option value="France" selected>France</option>
  1410.                     <option value="Belgique">Belgique</option>
  1411.                     <option value="Suisse">Suisse</option>
  1412.                     <option value="Espagne">Espagne</option>
  1413.                     <option value="Italie">Italie</option>
  1414.                     <option value="Allemagne">Allemagne</option>
  1415.                     <option value="Royaume-Uni">Royaume-Uni</option>
  1416.                     <option value="Autre">Autre</option>
  1417.                   </select>
  1418.                   <div class="invalid-feedback">Veuillez sélectionner un pays.</div>
  1419.                 </div>
  1420.                 <div class="col-md-6">
  1421.                   <label class="form-label">Ville du séjour</label>
  1422.                   <input type="text" class="form-control" name="ville" 
  1423.                          placeholder="Ville du séjour">
  1424.                 </div>
  1425.                 <div class="col-md-6">
  1426.                   <label class="form-label">Nombre de participants</label>
  1427.                   <input type="number" class="form-control" name="NbEnfant" min="1" 
  1428.                          placeholder="Nombre d'enfants">
  1429.                 </div>
  1430.                 <div class="col-md-6">
  1431.                   <label class="form-label">Date début séjour <span class="text-danger">*</span></label>
  1432.                   <input type="date" class="form-control" name="date_debut_sejour" required>
  1433.                   <div class="invalid-feedback">Veuillez saisir la date de début.</div>
  1434.                 </div>
  1435.                 <div class="col-md-6">
  1436.                   <label class="form-label">Date fin séjour <span class="text-danger">*</span></label>
  1437.                   <input type="date" class="form-control" name="date_fin_sejour" required>
  1438.                   <div class="invalid-feedback">Veuillez saisir la date de fin.</div>
  1439.                 </div>
  1440.                 <div class="col-12 d-flex gap-2 mt-4">
  1441.                   <button type="submit" class="btn btn-primary px-4">
  1442.                     <i class="bi bi-rocket me-2"></i>Créer mon espace séjour (Type PP)
  1443.                   </button>
  1444.                   <a href="#" class="btn btn-outline-secondary" data-action="cta_demo">
  1445.                     Besoin d'aide ? Démo
  1446.                   </a>
  1447.                 </div>
  1448.               </div>
  1449.             </form>
  1450.           </div>
  1451.           <button type="button" id="backToStep1" class="btn btn-link mt-3">
  1452.             <i class="bi bi-arrow-left me-1"></i> Retour au choix du profil
  1453.           </button>
  1454.         </div>
  1455.       </div>
  1456.       <div class="modal-footer border-top-0">
  1457.         <p class="small text-muted mb-0">Sans engagement · Données hébergées en France 🇫🇷</p>
  1458.       </div>
  1459.     </div>
  1460.   </div>
  1461. </div>
  1462. <style>
  1463. .select-role {
  1464.   cursor: pointer;
  1465.   transition: all 0.3s ease;
  1466. }
  1467. .select-role:hover,
  1468. .select-role:focus {
  1469.   transform: translateY(-5px);
  1470.   box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  1471.   border-color: var(--bs-primary) !important;
  1472. }
  1473. .select-role:active {
  1474.   transform: translateY(-2px);
  1475. }
  1476. .hover-shadow {
  1477.   transition: box-shadow 0.3s ease;
  1478. }
  1479. .bg-purple {
  1480.   background-color: #6f42c1 !important;
  1481. }
  1482. </style>
  1483. <script>
  1484.   // Protection contre les erreurs de la toolbar Symfony
  1485.   (function() {
  1486.     // Désactiver complètement Sfjs
  1487.     window.Sfjs = {
  1488.       loadToolbar: function() { console.log('Sfjs.loadToolbar désactivé'); },
  1489.       showToolbar: function() { console.log('Sfjs.showToolbar désactivé'); },
  1490.       hideToolbar: function() { console.log('Sfjs.hideToolbar désactivé'); },
  1491.       initToolbar: function() { console.log('Sfjs.initToolbar désactivé'); }
  1492.     };
  1493.     
  1494.     // Désactiver les requêtes vers _wdt si elles échouent
  1495.     const originalFetch = window.fetch;
  1496.     window.fetch = function(...args) {
  1497.       const url = args[0];
  1498.       if (typeof url === 'string' && url.includes('/_wdt/')) {
  1499.         console.warn('Requête vers _wdt bloquée:', url);
  1500.         return Promise.reject(new Error('Toolbar Symfony désactivée'));
  1501.       }
  1502.       return originalFetch.apply(this, args);
  1503.     };
  1504.     
  1505.     // Désactiver XMLHttpRequest vers _wdt
  1506.     const originalXHROpen = XMLHttpRequest.prototype.open;
  1507.     const originalXHRSend = XMLHttpRequest.prototype.send;
  1508.     
  1509.     XMLHttpRequest.prototype.open = function(method, url, ...args) {
  1510.       this._url = url; // Stocker l'URL pour vérification dans send
  1511.       if (typeof url === 'string' && url.includes('/_wdt/')) {
  1512.         console.warn('Requête XHR vers _wdt bloquée:', url);
  1513.         this._blocked = true;
  1514.         return;
  1515.       }
  1516.       this._blocked = false;
  1517.       return originalXHROpen.apply(this, [method, url, ...args]);
  1518.     };
  1519.     
  1520.     XMLHttpRequest.prototype.send = function(payload) {
  1521.       if (this._blocked) {
  1522.         console.warn('Envoi XHR bloqué pour:', this._url);
  1523.         return; // Ne pas envoyer si bloqué
  1524.       }
  1525.       return originalXHRSend.apply(this, arguments);
  1526.     };
  1527.   })();
  1528.   // Supprimer complètement la toolbar Symfony du DOM
  1529.   function removeSymfonyToolbar() {
  1530.     const toolbar = document.querySelector('.sf-toolbar');
  1531.     if (toolbar) {
  1532.       toolbar.remove();
  1533.       console.log('Toolbar Symfony supprimée du DOM');
  1534.     }
  1535.     
  1536.     const clearer = document.querySelector('.sf-toolbar-clearer');
  1537.     if (clearer) {
  1538.       clearer.remove();
  1539.     }
  1540.     
  1541.     const minitoolbar = document.querySelector('.sf-minitoolbar');
  1542.     if (minitoolbar) {
  1543.       minitoolbar.remove();
  1544.     }
  1545.   }
  1546.   
  1547.   // Supprimer immédiatement
  1548.   removeSymfonyToolbar();
  1549.   
  1550.   // Observer pour supprimer la toolbar dès qu'elle apparaît
  1551.   const observer = new MutationObserver(function(mutations) {
  1552.     mutations.forEach(function(mutation) {
  1553.       if (mutation.type === 'childList') {
  1554.         mutation.addedNodes.forEach(function(node) {
  1555.           if (node.nodeType === 1) { // Element node
  1556.             if (node.classList && (node.classList.contains('sf-toolbar') || node.classList.contains('sf-minitoolbar'))) {
  1557.               node.remove();
  1558.               console.log('Toolbar Symfony supprimée par l\'observer');
  1559.             }
  1560.             // Vérifier aussi les enfants
  1561.             const toolbars = node.querySelectorAll && node.querySelectorAll('.sf-toolbar, .sf-minitoolbar, .sf-toolbar-clearer');
  1562.             if (toolbars) {
  1563.               toolbars.forEach(tb => tb.remove());
  1564.             }
  1565.           }
  1566.         });
  1567.       }
  1568.     });
  1569.   });
  1570.   
  1571.   observer.observe(document.body, {
  1572.     childList: true,
  1573.     subtree: true
  1574.   });
  1575.   
  1576.   // Ajouter du CSS pour masquer la toolbar Symfony
  1577.   const style = document.createElement('style');
  1578.   style.textContent = `
  1579.     .sf-toolbar, .sf-toolbar-clearer, .sf-minitoolbar { 
  1580.       display: none !important; 
  1581.       visibility: hidden !important;
  1582.       opacity: 0 !important;
  1583.       height: 0 !important;
  1584.       width: 0 !important;
  1585.       overflow: hidden !important;
  1586.     }
  1587.   `;
  1588.   document.head.appendChild(style);
  1589.   // Masquer la toolbar Symfony si elle cause des problèmes
  1590.   document.addEventListener('DOMContentLoaded', function() {
  1591.     // Masquer la toolbar Symfony après 2 secondes si elle n'est pas chargée
  1592.     setTimeout(() => {
  1593.       const toolbar = document.querySelector('.sf-toolbar');
  1594.       if (toolbar && toolbar.classList.contains('sf-display-none')) {
  1595.         toolbar.style.display = 'none';
  1596.         console.log('Toolbar Symfony masquée pour éviter les erreurs 404');
  1597.       }
  1598.     }, 2000);
  1599.     // Ouvre la modale avec l'onglet adapté + pré-remplissage
  1600.     document.addEventListener('click', (e) => {
  1601.     // Éviter les conflits avec la toolbar Symfony
  1602.     if (e.target.closest('.sf-toolbar') || e.target.closest('[id^="sf"]')) {
  1603.       return;
  1604.     }
  1605.     
  1606.     const a = e.target.closest('a[data-action="cta_demo"], a[data-action="cta_expert"]');
  1607.     if (!a) return;
  1608.     e.preventDefault();
  1609.     const isExpert = a.dataset.action === 'cta_expert';
  1610.     const pack = a.dataset.pack || '';
  1611.     document.getElementById('demoTitle').textContent = isExpert ? 'Parler à un expert' : 'Demander une démo guidée';
  1612.     document.getElementById('objet').value = isExpert ? 'expert' : 'demo';
  1613.     document.getElementById('topic').value = isExpert ? 'expert' : 'demo';
  1614.     document.getElementById('pack').value  = pack;
  1615.     // Onglet par défaut : expert => rappel / demo => calendrier
  1616.     const triggerId = isExpert ? 'tab-callback' : 'tab-calendar';
  1617.     const tabElement = document.getElementById(triggerId);
  1618.     
  1619.     if (tabElement) {
  1620.       // Désactiver tous les onglets
  1621.       document.querySelectorAll('#demoTabs .nav-link').forEach(tab => {
  1622.         tab.classList.remove('active');
  1623.         tab.setAttribute('aria-selected', 'false');
  1624.       });
  1625.       
  1626.       // Désactiver tous les panneaux
  1627.       document.querySelectorAll('.tab-pane').forEach(pane => {
  1628.         pane.classList.remove('show', 'active');
  1629.       });
  1630.       
  1631.       // Activer l'onglet sélectionné
  1632.       tabElement.classList.add('active');
  1633.       tabElement.setAttribute('aria-selected', 'true');
  1634.       
  1635.       // Activer le panneau correspondant
  1636.       const targetPane = document.querySelector(tabElement.getAttribute('data-bs-target'));
  1637.       if (targetPane) {
  1638.         targetPane.classList.add('show', 'active');
  1639.       }
  1640.     }
  1641.     const modal = bootstrap.Modal.getOrCreateInstance(document.getElementById('demoModal'));
  1642.     modal.show();
  1643.   });
  1644.   // Validation form + anti double-submit pour le formulaire de démo
  1645.   (function () {
  1646.     const form = document.getElementById('contactForm');
  1647.     const btn  = document.getElementById('submitBtn');
  1648.     if (!form || !btn) return;
  1649.     // Protection contre les soumissions multiples
  1650.     let isSubmitting = false;
  1651.     
  1652.     // Nettoyer les classes d'erreur quand l'utilisateur tape
  1653.     form.addEventListener('input', function(e) {
  1654.       if (e.target.classList.contains('is-invalid')) {
  1655.         e.target.classList.remove('is-invalid');
  1656.       }
  1657.     });
  1658.     
  1659.     form.addEventListener('submit', function(e){
  1660.       e.preventDefault(); // Toujours empêcher la soumission normale
  1661.       
  1662.       // Éviter les soumissions multiples
  1663.       if (isSubmitting) return;
  1664.       isSubmitting = true;
  1665.       
  1666.       // Nettoyer les messages précédents
  1667.       const existingAlerts = form.parentNode.querySelectorAll('.alert');
  1668.       existingAlerts.forEach(alert => alert.remove());
  1669.       
  1670.       if (!form.checkValidity()) {
  1671.         e.stopPropagation();
  1672.         form.classList.add('was-validated');
  1673.         
  1674.         // Afficher les messages d'erreur pour chaque champ invalide
  1675.         const invalidFields = form.querySelectorAll(':invalid');
  1676.         invalidFields.forEach(field => {
  1677.           field.classList.add('is-invalid');
  1678.         });
  1679.         
  1680.         // Afficher un message d'erreur général
  1681.         const errorAlert = document.createElement('div');
  1682.         errorAlert.className = 'alert alert-warning mt-3';
  1683.         errorAlert.innerHTML = `
  1684.           <div class="d-flex align-items-center">
  1685.             <i class="bi bi-exclamation-triangle-fill me-2"></i>
  1686.             <div>
  1687.               <strong>Veuillez corriger les erreurs :</strong><br>
  1688.               Tous les champs marqués d'un astérisque (*) sont obligatoires.
  1689.             </div>
  1690.           </div>
  1691.         `;
  1692.         form.parentNode.insertBefore(errorAlert, form.nextSibling);
  1693.         
  1694.         // Supprimer le message après 5 secondes
  1695.         setTimeout(() => {
  1696.           if (errorAlert.parentNode) {
  1697.             errorAlert.parentNode.removeChild(errorAlert);
  1698.           }
  1699.         }, 5000);
  1700.         
  1701.         isSubmitting = false;
  1702.         return;
  1703.       } 
  1704.       // Désactiver le bouton pendant l'envoi
  1705.       btn.disabled = true; 
  1706.       const originalText = btn.textContent;
  1707.       btn.textContent = 'Envoi en cours…';
  1708.       // Récupérer les données du formulaire
  1709.       const formData = new FormData(form);
  1710.       
  1711.       // Debug : afficher les données envoyées
  1712.       console.log('=== DEBUG FORMULAIRE ===');
  1713.       console.log('Données du formulaire :');
  1714.       const formDataObj = {};
  1715.       for (let [key, value] of formData.entries()) {
  1716.         console.log(key + ': "' + value + '"');
  1717.         formDataObj[key] = value;
  1718.       }
  1719.       console.log('Objet complet:', formDataObj);
  1720.       
  1721.       // Vérifier les champs obligatoires
  1722.       const requiredFields = ['name', 'organization', 'email', 'telephone', 'sejours_count', 'consent'];
  1723.       const missingFields = [];
  1724.       requiredFields.forEach(field => {
  1725.         if (!formDataObj[field] || formDataObj[field].trim() === '') {
  1726.           missingFields.push(field);
  1727.         }
  1728.       });
  1729.       
  1730.       if (missingFields.length > 0) {
  1731.         console.error('Champs manquants:', missingFields);
  1732.         alert('Champs manquants: ' + missingFields.join(', '));
  1733.         isSubmitting = false;
  1734.         return;
  1735.       }
  1736.       
  1737.       console.log('Tous les champs obligatoires sont remplis ✅');
  1738.       // Envoyer la requête AJAX
  1739.       fetch(form.action, {
  1740.         method: 'POST',
  1741.         body: formData,
  1742.         headers: {
  1743.           'X-Requested-With': 'XMLHttpRequest'
  1744.         }
  1745.       })
  1746.       .then(response => response.json())
  1747.       .then(data => {
  1748.         if (data.success) {
  1749.           // Afficher le message de succès
  1750.           const successAlert = document.createElement('div');
  1751.           successAlert.className = 'alert alert-success mt-3';
  1752.           successAlert.innerHTML = `
  1753.             <div class="d-flex align-items-center">
  1754.               <i class="bi bi-check-circle-fill me-2"></i>
  1755.               <div>
  1756.                 <strong>Demande envoyée !</strong><br>
  1757.                 ${data.message}
  1758.               </div>
  1759.             </div>
  1760.           `;
  1761.           form.parentNode.insertBefore(successAlert, form.nextSibling);
  1762.           
  1763.           // Réinitialiser le formulaire
  1764.           form.reset();
  1765.           form.classList.remove('was-validated');
  1766.           
  1767.           // Fermer le modal après 3 secondes
  1768.           setTimeout(() => {
  1769.             const modal = bootstrap.Modal.getInstance(document.getElementById('demoModal'));
  1770.             if (modal) modal.hide();
  1771.           }, 3000);
  1772.         } else {
  1773.           // Afficher le message d'erreur
  1774.           const errorAlert = document.createElement('div');
  1775.           errorAlert.className = 'alert alert-danger mt-3';
  1776.           errorAlert.innerHTML = `
  1777.             <div class="d-flex align-items-center">
  1778.               <i class="bi bi-exclamation-triangle-fill me-2"></i>
  1779.               <div>
  1780.                 <strong>Erreur :</strong><br>
  1781.                 ${data.message}
  1782.               </div>
  1783.             </div>
  1784.           `;
  1785.           form.parentNode.insertBefore(errorAlert, form.nextSibling);
  1786.           
  1787.           // Supprimer le message d'erreur après 8 secondes
  1788.           setTimeout(() => {
  1789.             if (errorAlert.parentNode) {
  1790.               errorAlert.parentNode.removeChild(errorAlert);
  1791.             }
  1792.           }, 8000);
  1793.         }
  1794.       })
  1795.       .catch(error => {
  1796.         console.error('Erreur:', error);
  1797.         const errorAlert = document.createElement('div');
  1798.         errorAlert.className = 'alert alert-danger mt-3';
  1799.         errorAlert.innerHTML = `
  1800.           <div class="d-flex align-items-center">
  1801.             <i class="bi bi-exclamation-triangle-fill me-2"></i>
  1802.             <div>
  1803.               <strong>Erreur technique :</strong><br>
  1804.               Une erreur est survenue lors de l'envoi. Veuillez réessayer plus tard.
  1805.             </div>
  1806.           </div>
  1807.         `;
  1808.         form.parentNode.insertBefore(errorAlert, form.nextSibling);
  1809.         
  1810.         // Supprimer le message d'erreur après 10 secondes
  1811.         setTimeout(() => {
  1812.           if (errorAlert.parentNode) {
  1813.             errorAlert.parentNode.removeChild(errorAlert);
  1814.           }
  1815.         }, 10000);
  1816.       })
  1817.       .finally(() => {
  1818.         // Réactiver le bouton et le flag de soumission
  1819.         btn.disabled = false;
  1820.         btn.textContent = originalText;
  1821.         isSubmitting = false;
  1822.         
  1823.         // Supprimer les anciennes alertes après 5 secondes
  1824.         setTimeout(() => {
  1825.           const alerts = form.parentNode.querySelectorAll('.alert');
  1826.           alerts.forEach(alert => alert.remove());
  1827.         }, 5000);
  1828.       });
  1829.     });
  1830.   })();
  1831.   // ===== GESTION MODALE "CRÉER MON SÉJOUR" =====
  1832.   const createSejourModal = document.getElementById('createSejourModal');
  1833.   const step1 = document.getElementById('step1');
  1834.   const step2 = document.getElementById('step2');
  1835.   const stepLabel = document.getElementById('stepLabel');
  1836.   const stepDescription = document.getElementById('stepDescription');
  1837.   const backToStep1Btn = document.getElementById('backToStep1');
  1838.   
  1839.   let currentRole = null;
  1840.   let isSubmittingCreate = false;
  1841.   // Fonction helper pour le tracking GA4
  1842.   function trackEvent(eventName, params = {}) {
  1843.     if (typeof gtag === 'function') {
  1844.       gtag('event', eventName, params);
  1845.       console.log('📊 GA4 Event:', eventName, params);
  1846.     }
  1847.   }
  1848.   // Reset de la modale à l'ouverture
  1849.   createSejourModal.addEventListener('show.bs.modal', function () {
  1850.     // Reset aux valeurs initiales
  1851.     step1.classList.remove('d-none');
  1852.     step2.classList.add('d-none');
  1853.     stepLabel.textContent = 'Étape 1/2';
  1854.     stepDescription.textContent = 'Choisissez votre profil';
  1855.     currentRole = null;
  1856.     
  1857.     // Masquer tous les panneaux de formulaire
  1858.     document.querySelectorAll('.role-pane').forEach(pane => pane.classList.add('d-none'));
  1859.     
  1860.     // Reset de tous les formulaires
  1861.     ['formEcole', 'formPartenaire', 'formAutre'].forEach(formId => {
  1862.       const form = document.getElementById(formId);
  1863.       if (form) {
  1864.         form.reset();
  1865.         form.classList.remove('was-validated');
  1866.       }
  1867.     });
  1868.     // Focus sur le titre de la modale
  1869.     setTimeout(() => {
  1870.       document.getElementById('createSejourTitle').focus();
  1871.     }, 300);
  1872.   });
  1873.   // Gestion du clic sur les cartes de sélection de rôle
  1874.   document.querySelectorAll('.select-role').forEach(card => {
  1875.     card.addEventListener('click', function() {
  1876.       const role = this.dataset.role;
  1877.       selectRole(role);
  1878.     });
  1879.     
  1880.     // Support du clavier
  1881.     card.addEventListener('keypress', function(e) {
  1882.       if (e.key === 'Enter' || e.key === ' ') {
  1883.         e.preventDefault();
  1884.         const role = this.dataset.role;
  1885.         selectRole(role);
  1886.       }
  1887.     });
  1888.   });
  1889.   function selectRole(role) {
  1890.     currentRole = role;
  1891.     
  1892.     // Track event GA4
  1893.     trackEvent('step_select_role', { role: role });
  1894.     
  1895.     // Si école publique → Redirection directe vers /Accompagnateur/login avec type EF
  1896.     if (role === 'ecole_publique') {
  1897.       // Fermer la modale
  1898.       bootstrap.Modal.getInstance(createSejourModal)?.hide();
  1899.       
  1900.       // Rediriger vers la page de login avec le paramètre type EF et source
  1901.       window.location.href = '/Accompagnateur/login?type=EF&from=modal';
  1902.       return;
  1903.     }
  1904.     
  1905.     // Passage à l'étape 2 pour les autres profils
  1906.     step1.classList.add('d-none');
  1907.     step2.classList.remove('d-none');
  1908.     stepLabel.textContent = 'Étape 2/2';
  1909.     
  1910.     // Afficher le panneau correspondant
  1911.     document.querySelectorAll('.role-pane').forEach(pane => pane.classList.add('d-none'));
  1912.     
  1913.     let roleLabel = '';
  1914.     if (role === 'partenaire') {
  1915.       document.getElementById('pane-partenaire').classList.remove('d-none');
  1916.       roleLabel = 'Partenaire / Organisme';
  1917.       // Lazy load Calendly pour le partenaire
  1918.       lazyLoadCalendlyIfNeeded('#pane-partenaire-demo iframe');
  1919.     } else if (role === 'autre') {
  1920.       document.getElementById('pane-autre').classList.remove('d-none');
  1921.       roleLabel = 'Création simple';
  1922.       setTimeout(() => document.querySelector('#pane-autre input')?.focus(), 300);
  1923.     }
  1924.     
  1925.     stepDescription.textContent = roleLabel;
  1926.   }
  1927.   // Retour à l'étape 1
  1928.   backToStep1Btn.addEventListener('click', function() {
  1929.     step1.classList.remove('d-none');
  1930.     step2.classList.add('d-none');
  1931.     stepLabel.textContent = 'Étape 1/2';
  1932.     stepDescription.textContent = 'Choisissez votre profil';
  1933.     currentRole = null;
  1934.   });
  1935.   // Lazy load Calendly
  1936.   function lazyLoadCalendlyIfNeeded(selector) {
  1937.     const iframe = document.querySelector(selector);
  1938.     if (iframe && iframe.hasAttribute('data-src') && !iframe.src) {
  1939.       iframe.src = iframe.getAttribute('data-src');
  1940.       console.log('📅 Calendly chargé:', iframe.src);
  1941.     }
  1942.   }
  1943.   // Lazy load Calendly pour modale démo (onglet calendrier)
  1944.   const tabCalendar = document.getElementById('tab-calendar');
  1945.   if (tabCalendar) {
  1946.     tabCalendar.addEventListener('shown.bs.tab', function() {
  1947.       lazyLoadCalendlyIfNeeded('#pane-calendar iframe');
  1948.     });
  1949.   }
  1950.   // Lazy load Calendly pour modale créer séjour (onglet demo partenaire)
  1951.   const tabPartenaireDemo = document.getElementById('tab-partenaire-demo');
  1952.   if (tabPartenaireDemo) {
  1953.     tabPartenaireDemo.addEventListener('shown.bs.tab', function() {
  1954.       lazyLoadCalendlyIfNeeded('#pane-partenaire-demo iframe');
  1955.     });
  1956.   }
  1957.   // Gestion des radios "qui paie" avec tracking
  1958.   document.querySelectorAll('input[name="payer"]').forEach(radio => {
  1959.     radio.addEventListener('change', function() {
  1960.       trackEvent('toggle_payer', { who_pays: this.value });
  1961.     });
  1962.   });
  1963.   // Fonction générique de soumission de formulaire avec AJAX
  1964.   function setupFormSubmission(formId, onSuccess) {
  1965.     const form = document.getElementById(formId);
  1966.     if (!form) return;
  1967.     form.addEventListener('submit', function(e) {
  1968.       e.preventDefault();
  1969.       // Éviter les doubles soumissions
  1970.       if (isSubmittingCreate) {
  1971.         return;
  1972.       }
  1973.       // Valider le formulaire
  1974.       if (!form.checkValidity()) {
  1975.         form.classList.add('was-validated');
  1976.         
  1977.         // Afficher un message d'avertissement
  1978.         const warningAlert = document.createElement('div');
  1979.         warningAlert.className = 'alert alert-warning mt-3';
  1980.         warningAlert.innerHTML = `
  1981.           <div class="d-flex align-items-center">
  1982.             <i class="bi bi-exclamation-triangle-fill me-2"></i>
  1983.             <div>
  1984.               <strong>Veuillez corriger les erreurs :</strong><br>
  1985.               Tous les champs marqués d'un astérisque (*) sont obligatoires.
  1986.             </div>
  1987.           </div>
  1988.         `;
  1989.         form.parentNode.insertBefore(warningAlert, form.nextSibling);
  1990.         setTimeout(() => warningAlert.remove(), 5000);
  1991.         return;
  1992.       }
  1993.       isSubmittingCreate = true;
  1994.       // Track event GA4
  1995.       trackEvent('form_submit', { form_id: formId });
  1996.       // Désactiver le bouton
  1997.       const btn = form.querySelector('button[type="submit"]');
  1998.       btn.disabled = true;
  1999.       const originalText = btn.textContent;
  2000.       btn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Envoi en cours…';
  2001.       // Soumettre via fetch
  2002.       const formData = new FormData(form);
  2003.       fetch(form.action, {
  2004.         method: 'POST',
  2005.         body: formData,
  2006.         headers: {
  2007.           'X-Requested-With': 'XMLHttpRequest'
  2008.         }
  2009.       })
  2010.       .then(response => response.json())
  2011.       .then(data => {
  2012.         if (data.idSejour) {
  2013.           // Succès ! Le séjour a été créé
  2014.           
  2015.           // Track event GA4 de succès
  2016.           trackEvent('create_sejour_success', {
  2017.             role: currentRole,
  2018.             sejour_id: data.idSejour,
  2019.             code_sejour: data.codeSejour || 'N/A'
  2020.           });
  2021.           // Afficher le message de succès
  2022.           const successAlert = document.createElement('div');
  2023.           successAlert.className = 'alert alert-success mt-3';
  2024.           successAlert.innerHTML = `
  2025.             <div class="d-flex align-items-center">
  2026.               <i class="bi bi-check-circle-fill me-2"></i>
  2027.               <div>
  2028.                 <strong>✅ Séjour créé avec succès !</strong><br>
  2029.                 ${data.codeSejour ? 'Code séjour : <strong>' + data.codeSejour + '</strong><br>' : ''}
  2030.                 Vous allez être redirigé vers votre espace...
  2031.               </div>
  2032.             </div>
  2033.           `;
  2034.           form.parentNode.insertBefore(successAlert, form.nextSibling);
  2035.           // Reset le formulaire
  2036.           form.reset();
  2037.           form.classList.remove('was-validated');
  2038.           // Rediriger après 2 secondes vers l'espace accompagnateur
  2039.           setTimeout(() => {
  2040.        
  2041.           }, 2000);
  2042.           // Callback optionnel
  2043.           if (onSuccess) onSuccess(data);
  2044.         } else if (data.success === false) {
  2045.           // Erreur métier
  2046.           const errorAlert = document.createElement('div');
  2047.           errorAlert.className = 'alert alert-danger mt-3';
  2048.           errorAlert.innerHTML = `
  2049.             <div class="d-flex align-items-center">
  2050.               <i class="bi bi-x-circle-fill me-2"></i>
  2051.               <div>
  2052.                 <strong>Erreur :</strong><br>
  2053.                 ${data.message || 'Une erreur est survenue lors de la création du séjour.'}
  2054.               </div>
  2055.             </div>
  2056.           `;
  2057.           form.parentNode.insertBefore(errorAlert, form.nextSibling);
  2058.           setTimeout(() => errorAlert.remove(), 7000);
  2059.         } else {
  2060.           // Réponse inattendue
  2061.           console.warn('Réponse inattendue:', data);
  2062.           const warningAlert = document.createElement('div');
  2063.           warningAlert.className = 'alert alert-warning mt-3';
  2064.           warningAlert.innerHTML = `
  2065.             <div class="d-flex align-items-center">
  2066.               <i class="bi bi-exclamation-triangle-fill me-2"></i>
  2067.               <div>
  2068.                 <strong>Attention :</strong><br>
  2069.                 La création du séjour a peut-être réussi. Vérifiez votre espace.
  2070.               </div>
  2071.             </div>
  2072.           `;
  2073.           form.parentNode.insertBefore(warningAlert, form.nextSibling);
  2074.           setTimeout(() => {
  2075.             window.location.href = '/Accompagnateur/login';
  2076.           }, 3000);
  2077.         }
  2078.       })
  2079.       .catch(error => {
  2080.         console.error('Erreur:', error);
  2081.         const errorAlert = document.createElement('div');
  2082.         errorAlert.className = 'alert alert-danger mt-3';
  2083.         errorAlert.innerHTML = `
  2084.           <div class="d-flex align-items-center">
  2085.             <i class="bi bi-x-circle-fill me-2"></i>
  2086.             <div>
  2087.               <strong>Erreur technique :</strong><br>
  2088.               Une erreur réseau est survenue. Veuillez réessayer plus tard.
  2089.             </div>
  2090.           </div>
  2091.         `;
  2092.         form.parentNode.insertBefore(errorAlert, form.nextSibling);
  2093.         setTimeout(() => errorAlert.remove(), 7000);
  2094.       })
  2095.       .finally(() => {
  2096.         btn.disabled = false;
  2097.         btn.innerHTML = originalText;
  2098.         isSubmittingCreate = false;
  2099.       });
  2100.     });
  2101.   }
  2102.   // Setup tous les formulaires de la modale "Créer mon séjour"
  2103.   // formEcole supprimé car redirection directe vers /Accompagnateur/login
  2104.   setupFormSubmission('formPartenaire');
  2105.   setupFormSubmission('formAutre');
  2106.   // Délégation d'événements pour tous les CTA avec data-action
  2107.   document.addEventListener('click', function(e) {
  2108.     // Éviter les conflits avec la toolbar Symfony
  2109.     if (e.target.closest('.sf-toolbar') || e.target.closest('[id^="sf"]')) {
  2110.       return;
  2111.     }
  2112.     const target = e.target.closest('[data-action]');
  2113.     if (!target) return;
  2114.     const action = target.dataset.action;
  2115.     const pack = target.dataset.pack || '';
  2116.     // Track event GA4
  2117.     trackEvent('cta_open_modal', { action: action, pack: pack });
  2118.     if (action === 'cta_create') {
  2119.       // Ouvrir le drawer "Créer mon séjour"
  2120.       e.preventDefault();
  2121.       if (typeof openSejourDrawer === 'function') {
  2122.         openSejourDrawer();
  2123.       } else {
  2124.         // Fallback: ancien modal si drawer pas chargé
  2125.         const modal = new bootstrap.Modal(createSejourModal);
  2126.         modal.show();
  2127.       }
  2128.     } else if (action === 'cta_demo' || action === 'cta_expert') {
  2129.       // Ouvrir la modale demo/expert existante
  2130.       e.preventDefault();
  2131.       const demoModal = document.getElementById('demoModal');
  2132.       const modal = new bootstrap.Modal(demoModal);
  2133.       
  2134.       const isExpert = action === 'cta_expert';
  2135.       
  2136.       // Changer le titre
  2137.       document.getElementById('demoTitle').textContent = isExpert ? 'Parler à un expert' : 'Demander une démo guidée';
  2138.       
  2139.       // Pré-remplir les champs cachés
  2140.       document.getElementById('objet').value = isExpert ? 'expert' : 'demo';
  2141.       document.getElementById('topic').value = isExpert ? 'expert' : 'demo';
  2142.       document.getElementById('pack').value = pack;
  2143.       
  2144.       // Activer le bon onglet
  2145.       const tabCalendar = document.getElementById('tab-calendar');
  2146.       const tabCallback = document.getElementById('tab-callback');
  2147.       const paneCalendar = document.getElementById('pane-calendar');
  2148.       const paneCallback = document.getElementById('pane-callback');
  2149.       
  2150.       if (isExpert) {
  2151.         // Expert → Onglet "Être rappelé"
  2152.         tabCalendar.classList.remove('active');
  2153.         tabCallback.classList.add('active');
  2154.         paneCalendar.classList.remove('show', 'active');
  2155.         paneCallback.classList.add('show', 'active');
  2156.       } else {
  2157.         // Démo → Onglet "Réserver un créneau"
  2158.         tabCallback.classList.remove('active');
  2159.         tabCalendar.classList.add('active');
  2160.         paneCallback.classList.remove('show', 'active');
  2161.         paneCalendar.classList.add('show', 'active');
  2162.         
  2163.         // Lazy load Calendly
  2164.         lazyLoadCalendlyIfNeeded('#pane-calendar iframe');
  2165.       }
  2166.       
  2167.       modal.show();
  2168.     }
  2169.   });
  2170.   }); // Fin du DOMContentLoaded
  2171. </script>
  2172.     <!-- ======= Site Wrap =======-->
  2173.     <div class="site-wrap">
  2174.       
  2175.       <!-- ======= Header =======-->
  2176.       <header class="fbs__net-navbar navbar navbar-expand-lg dark" aria-label="freebootstrap.net navbar">
  2177.         <div class="container d-flex align-items-center justify-content-between">
  2178.           
  2179.           <!-- Start Logo-->
  2180.           <a class="navbar-brand w-auto" href="#">
  2181.             <img class="logo dark img-fluid" src="{{ asset('Accueil/imagesAccueil/logoHeader.png') }}" alt="5sur5séjour logo" style="height: 65px;">
  2182.           </a>
  2183.           <!-- End Logo-->
  2184.           
  2185.           <!-- Start offcanvas-->
  2186.           <div class="offcanvas offcanvas-start w-75" id="fbs__net-navbars" tabindex="-1" aria-labelledby="fbs__net-navbarsLabel">
  2187.             
  2188.             <div class="offcanvas-header">
  2189.               <div class="offcanvas-header-logo">
  2190.                 <a class="logo-link" id="fbs__net-navbarsLabel" href="#">
  2191.                   <img class="logo light img-fluid" src="{{ asset('Accueil/imagesAccueil/logoHeader.png') }}" alt="5sur5séjour logo" style="height: 60px;">
  2192.                 </a>
  2193.               </div>
  2194.               <button class="btn-close btn-close-black" type="button" data-bs-dismiss="offcanvas" aria-label="Close"></button>
  2195.             </div>
  2196.             
  2197.             <div class="offcanvas-body align-items-lg-center">
  2198.               
  2199.               <ul class="navbar-nav nav me-auto ps-lg-5 mb-2 mb-lg-0">
  2200.                 <li class="nav-item"><a class="nav-link scroll-link" href="#about"> À propos</a></li>
  2201.                 <li class="nav-item"><a class="nav-link scroll-link" href="#how-it-works">Comment ça marche</a></li>
  2202.                 <li class="nav-item"><a class="nav-link scroll-link" href="#pricing">Nos offres</a></li>
  2203.                 <li class="nav-item"><a class="nav-link scroll-link" href="#contact">Contact</a></li>
  2204.                 <li class="nav-item dropdown">
  2205.                   <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false">Nos produits <i class="bi bi-chevron-down"></i></a>
  2206.                   <ul class="dropdown-menu">
  2207.                     <li class="nav-item"><a class="nav-link scroll-link" href="#" data-action="cta_create" data-pack="creation">Espace Séjour</a></li>
  2208.                     <li class="nav-item"><a class="nav-link" href="{{ path('boite_vocale') }}">Boîte vocale parents <span class="badge bg-success">nouveau</span></a></li>
  2209.                     <li class="nav-item"><a class="nav-link" href="{{ path('boutique5sur5_Souvenir') }}">Souvenirs imprimés</a></li>
  2210.                   </ul>
  2211.                 </li>
  2212.               </ul>
  2213.               
  2214.             </div>
  2215.           </div>
  2216.           <!-- End offcanvas-->
  2217.           
  2218.           <div class="ms-auto w-auto d-flex">
  2219.             
  2220.             <div class="header-social d-flex align-items-center gap-1">
  2221.              
  2222.                             <a class="btn py-2 d-block"  href="#" data-bs-toggle="modal" data-bs-target="#modal-login" aria-label="Connexion - Parents, Accompagnateurs, Structures" style="background-color: #0f7c82; border-color: #0f7c82; color: white;">Je me connecte</a>
  2223.               <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">
  2224.                 <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">
  2225.                   <line x1="21" x2="3" y1="6" y2="6"></line>
  2226.                   <line x1="15" x2="3" y1="12" y2="12"></line>
  2227.                   <line x1="17" x2="3" y1="18" y2="18"></line>
  2228.                 </svg>
  2229.                 <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">
  2230.                   <path d="M18 6 6 18"></path>
  2231.                   <path d="m6 6 12 12"></path>
  2232.                 </svg>
  2233.               </button>
  2234.               
  2235.             </div>
  2236.             
  2237.           </div>
  2238.         </div>
  2239.       </header>
  2240.       <!-- End Header-->
  2241.       
  2242.       <!-- ======= Modale de sélection de connexion ======= -->
  2243.       <div class="modal fade" id="modal-login" tabindex="-1" aria-labelledby="modal-login-title" aria-hidden="true">
  2244.         <div class="modal-dialog modal-dialog-centered modal-lg">
  2245.           <div class="modal-content">
  2246.             <div class="modal-header border-0 pb-0">
  2247.               <div class="w-100 py-10 text-center" style="margin-top: 50px;">
  2248.                 <h5 class="modal-title" id="modal-login-title">Accès à votre espace</h5>
  2249.                 <p class="text-muted small mb-0">Sélectionnez votre profil pour vous connecter</p>
  2250.               </div>
  2251.               <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  2252.             </div>
  2253.             <div class="modal-body p-3 p-md-4">
  2254.               <div class="row g-3 g-md-4">
  2255.                 
  2256.                 <!-- Parent -->
  2257.                 <div class="col-12 col-md-4">
  2258.                   <a href="{{ path('app_back_Parent') }}" class="login-modal-card text-decoration-none">
  2259.                     <div class="login-modal-card-inner text-center p-4">
  2260.                       <img src="{{ asset('Accueil/imagesAccueil/son_sejour.svg') }}" alt="Parent" class="login-modal-img mb-3">
  2261.                       <h6 class="login-modal-title">Parent</h6>
  2262.                     </div>
  2263.                   </a>
  2264.                 </div>
  2265.                 
  2266.                 <!-- Accompagnateur -->
  2267.                 <div class="col-12 col-md-4">
  2268.                   <a href="#" data-bs-toggle="modal" data-bs-target="#loginModal" data-bs-dismiss="modal" class="login-modal-card text-decoration-none">
  2269.                     <div class="login-modal-card-inner text-center p-4">
  2270.                       <img src="{{ asset('Accueil/imagesAccueil/espceAcc.svg') }}" alt="Accompagnateur" class="login-modal-img mb-3">
  2271.                       <h6 class="login-modal-title">Accompagnateur</h6>
  2272.                     </div>
  2273.                   </a>
  2274.                 </div>
  2275.                 
  2276.                 <!-- Structure / Partenaire -->
  2277.                 <div class="col-12 col-md-4">
  2278.                   <a href="#" data-bs-toggle="modal" data-bs-target="#partnerLoginModal" data-bs-dismiss="modal" class="login-modal-card text-decoration-none">
  2279.                     <div class="login-modal-card-inner text-center p-4">
  2280.                       <img src="{{ asset('Accueil/imagesAccueil/espcPart.svg') }}" alt="Structure" class="login-modal-img mb-3">
  2281.                       <h6 class="login-modal-title">Structure / Partenaire</h6>
  2282.                     </div>
  2283.                   </a>
  2284.                 </div>
  2285.                 
  2286.               </div>
  2287.             </div>
  2288.           </div>
  2289.         </div>
  2290.       </div>
  2291.       <!-- End Modale de sélection -->
  2292.       
  2293.       <!-- ======= Main =======-->
  2294.       <main>
  2295.        
  2296.            <!-- ======= Hero =======-->
  2297.         <section class="hero__v6 section" id="home">
  2298.           <div class="container">
  2299.             <div class="row">
  2300.               <div class="col-lg-6 mb-4 mb-lg-0">
  2301.                 <div class="row">
  2302.                   <div class="col-lg-11">
  2303.                     <span class="badge bg-light text-primary mb-3 px-3 py-2" data-aos="fade-up" data-aos-delay="0" style="font-size: 0.75rem; font-weight: 600; letter-spacing: 0.5px;">Plus de 25 ans d'expérience</span>
  2304.                     <h1 class="hero-title mb-3" data-aos="fade-up" data-aos-delay="100">Gagnez du temps, rassurez les familles, modernisez votre image</h1>
  2305.                     <p class="hero-description mb-3" data-aos="fade-up" data-aos-delay="200">5sur5 Séjour accompagne les écoles, centres de loisirs et organisateurs de séjours pour partager facilement photos, vidéos et messages vocaux avec les familles, sans surcharge pour les équipes.</p>
  2306.                   
  2307.                     <a class="btn btn-lg btn-primary  px-4 w-100 w-sm-auto mb-3" href="#" data-action="cta_create" data-pack="creation" >
  2308.                       Créer mon espace séjour
  2309.                       <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">
  2310.                         <path d="M7 7h10v10"></path><path d="M7 17 17 7"></path>
  2311.                       </svg>
  2312.                     </a>
  2313.                     <p class="small text-muted mb-0" data-aos="fade-up" data-aos-delay="300">Sans engagement • Données hébergées en France • Accompagnement inclus</p>
  2314.                   </div>
  2315.                 </div>
  2316.               </div>
  2317.               <div class="col-lg-6">
  2318.                 <div class="hero-img">
  2319.                   <img class="img-card img-fluid" style="background: radial-gradient(gray, transparent);border-radius: 30px;" src="{{ asset('images/9.png') }}" alt="Image card" data-aos="fade-down" data-aos-delay="600">
  2320.                   <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" style="max-width: 100%; height: auto;">
  2321.                 </div>
  2322.                   <!-- Bouton CTA -->
  2323.                     <!-- CTAs -->
  2324.     
  2325.         <!-- Preuve sociale courte -->
  2326.         <div class="logos mt-4" data-aos="fade-up" data-aos-delay="350">
  2327.         <p class="text-primary-emphasis text-uppercase small mt-4 mb-0">
  2328.   Déjà adopté par <strong>1 500+</strong> écoles, centres de loisirs et associations en France
  2329. </p>
  2330.         </div>
  2331.               </div>
  2332.     
  2333.             </div>
  2334.           </div>
  2335.           <!-- End Hero-->
  2336.         </section>
  2337.         <!-- End Hero-->
  2338.         
  2339.         <!-- ======= Section Pour Qui =======-->
  2340.         <section class="section pourqui__v1 about_wrap_area mb-5" id="pour-qui">
  2341.           <div class="container">
  2342.             
  2343.             <!-- Header de section -->
  2344.             <div class="row mb-5">
  2345.               <div class="col-md-7 text-center mx-auto">
  2346.                 <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Pour qui</span>
  2347.                 <h2 data-aos="fade-up" data-aos-delay="100">À qui s'adresse 5sur5 Séjour ?</h2>
  2348.                 <p data-aos="fade-up" data-aos-delay="200">Une plateforme pensée pour les réalités de terrain : peu de temps, beaucoup d'enfants, des familles en attente de nouvelles.</p>
  2349.               </div>
  2350.             </div>
  2351.             <!-- 3 cartes avec barre accent + phrase clé + liste -->
  2352.             <div class="row g-3 g-md-4">
  2353.               
  2354.               <!-- Carte 1 : Écoles & collèges -->
  2355.               <div class="col-md-4">
  2356.                 <div class="h-100 bg-white rounded-4 p-3 p-md-4 shadow-sm pourqui-card" style="border-top: 3px solid #41a2aa;">
  2357.                   <div class="mb-3">
  2358.                     <span class="badge rounded-pill px-3 py-2" style="background: rgba(65,162,170,0.1); color: #1f5e64;">Écoles &amp; collèges</span>
  2359.                   </div>
  2360.                   <h3 class="h6 mb-2" style="font-weight: 600;">Classes découvertes &amp; voyages scolaires</h3>
  2361.                   <p class="mb-3" style="font-size: 0.95rem;"><strong>Moins de sollicitations, plus de sérénité pour les équipes.</strong></p>
  2362.                   <p class="small text-muted mb-3">
  2363.                     Pour que les parents vivent le séjour avec leur enfant, sans encombrer le cahier de texte
  2364.                     ni solliciter le secrétariat.
  2365.                   </p>
  2366.                   <ul class="small text-muted ps-3 mb-0">
  2367.                     <li>Communication simple pour les enseignants</li>
  2368.                     <li>Accès sécurisé pour chaque parent</li>
  2369.                     <li>Souvenirs accessibles après le retour</li>
  2370.                   </ul>
  2371.                 </div>
  2372.               </div>
  2373.               <!-- Carte 2 : Centres de loisirs & colos -->
  2374.               <div class="col-md-4">
  2375.                 <div class="h-100 bg-white rounded-4 p-3 p-md-4 shadow-sm pourqui-card" style="border-top: 3px solid #f56040;">
  2376.                   <div class="mb-3">
  2377.                     <span class="badge rounded-pill px-3 py-2" style="background: rgba(245,96,64,0.08); color: #c44423;">Centres de loisirs &amp; colos</span>
  2378.                   </div>
  2379.                   <h3 class="h6 mb-2" style="font-weight: 600;">Séjours courts ou saisons complètes</h3>
  2380.                   <p class="mb-3" style="font-size: 0.95rem;"><strong>Valorisez votre équipe, rassurez les familles.</strong></p>
  2381.                   <p class="small text-muted mb-3">
  2382.                     Pour montrer le sérieux de votre structure, valoriser l'équipe d'animation
  2383.                     et rassurer les parents, même à distance.
  2384.                   </p>
  2385.                   <ul class="small text-muted ps-3 mb-0">
  2386.                     <li>Outil unique pour toutes les sessions</li>
  2387.                     <li>Valorisation de vos projets éducatifs</li>
  2388.                     <li>Image moderne et professionnelle</li>
  2389.                   </ul>
  2390.                 </div>
  2391.               </div>
  2392.               <!-- Carte 3 : Collectivités & associations -->
  2393.               <div class="col-md-4">
  2394.                 <div class="h-100 bg-white rounded-4 p-3 p-md-4 shadow-sm pourqui-card" style="border-top: 3px solid #163c3f;">
  2395.                   <div class="mb-3">
  2396.                     <span class="badge rounded-pill px-3 py-2" style="background: rgba(22,60,63,0.06); color: #163c3f;">Collectivités &amp; associations</span>
  2397.                   </div>
  2398.                   <h3 class="h6 mb-2" style="font-weight: 600;">Mairies, associations, organisateurs</h3>
  2399.                   <p class="mb-3" style="font-size: 0.95rem;"><strong>Centralisez, maîtrisez, facilitez le terrain.</strong></p>
  2400.                   <p class="small text-muted mb-3">
  2401.                     Pour centraliser la communication, maîtriser l'image de vos séjours et faciliter
  2402.                     le travail des équipes de terrain.
  2403.                   </p>
  2404.                   <ul class="small text-muted ps-3 mb-0">
  2405.                     <li>Charte graphique respectée</li>
  2406.                     <li>Paramétrage adapté à vos besoins</li>
  2407.                     <li>Support réactif en français</li>
  2408.                   </ul>
  2409.                 </div>
  2410.               </div>
  2411.               
  2412.             </div>
  2413.             
  2414.             <!-- CTA global -->
  2415.             <div class="row mt-4">
  2416.               <div class="col-12 text-center">
  2417.               <a href="#pricing" class="btn btn-lg btn-primary  px-4 w-50 w-sm-auto" style="background:#F09E7A">    
  2418.          Découvrir nos offres
  2419.             
  2420.           </a>
  2421.               </div>
  2422.             </div>
  2423.             
  2424.           </div>
  2425.         </section>
  2426.         <!-- End Pour Qui -->
  2427.         
  2428.     
  2429.         <!-- ======= Pourquoi nous choisir =======-->
  2430.         <section class="section features__v2 aboutWrapper" id="about">
  2431.           <div class="container">
  2432.             <div class="row">
  2433.               <div class="col-12">
  2434.                 <div class="d-lg-flex p-5 rounded-4 content" data-aos="fade-in" data-aos-delay="0" style="background:white">
  2435.                   <div class="row">
  2436.                     <div class="col-lg-5 mb-5 mb-lg-0" data-aos="fade-up" data-aos-delay="0">
  2437.                       <div class="row"> 
  2438.                         <div class="col-lg-11">
  2439.                           <div class="h-100 flex-column justify-content-between d-flex">
  2440.                             <div>
  2441.                               <h2 class="mb-4">La solution choisie par les organisateurs de séjours.</h2>
  2442.                               <p class="mb-4">
  2443.                              Moins de sollicitations, moins de charge mentale, <strong>une communication fiable avec les familles et un cadre clair (sécurité & RGPD)</strong>.
  2444.                               </p>
  2445.                             
  2446.                               <!-- Encadré "clé en main" (recentré sur setup/support/formation) -->
  2447.                               <div class="alert alert-light border-primary mb-4"
  2448.                                    style="background: linear-gradient(135deg, rgba(65, 162, 170, 0.05), rgba(65, 162, 170, 0.02)); border-left: 3px solid #41a2aa !important;margin-top:50px">
  2449.                                 <h6 class="fw-bold mb-3 text-primary">Mise en place clé en main</h6>
  2450.                                 <ul class="mb-0 ps-0" style="list-style: none;">
  2451.                                   <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i><strong>Setup</strong> : création/import des séjours si besoin</li>
  2452.                                   <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i><strong>Support dédié</strong> pendant vos séjours</li>
  2453.                                   <li class="mb-0"><i class="bi bi-check-circle-fill text-success me-2"></i><strong>Formation</strong> : prise en main + bonnes pratiques équipe</li>
  2454.                                 </ul>
  2455.                               </div>
  2456.                             </div>
  2457.                           
  2458.                           </div>
  2459.                         </div>
  2460.                       </div>
  2461.                     </div>
  2462.                     <div class="col-lg-7">
  2463.                       <div class="row justify-content-end">
  2464.                         <div class="col-lg-11">
  2465.                           <div class="row">
  2466.                            <div class="col-sm-6" data-aos="fade-up" data-aos-delay="200">
  2467.                               <div class="icon text-center mb-4"><i class="bi bi-clock fs-4"></i></div>
  2468.                               <h3 class="fs-6 fw-bold mb-3">Gain de temps</h3>
  2469.                               <p>moins d'appels / messages entrants, infos centralisées pour les familles.</p>
  2470.                             </div>
  2471.                               <div class="col-sm-6" data-aos="fade-up" data-aos-delay="300">
  2472.                               <div class="icon text-center mb-4"><i class="bi bi-emoji-smile fs-4"></i></div>
  2473.                               <h3 class="fs-6 fw-bold mb-3">Charge mentale réduite</h3>
  2474.                               <p> publication simple, suivi fluide, moins d'imprévus "communication"</p>
  2475.                             </div>
  2476.                             <div class="col-sm-6" data-aos="fade-up" data-aos-delay="0">
  2477.                               <div class="icon text-center mb-4"><i class="bi bi-shield-lock fs-4"></i></div>
  2478.                               <h3 class="fs-6 fw-bold mb-3"> Sécurité & conformité</h3>
  2479.                               <p>accès encadré, gestion des droits, bonnes pratiques RGPD.</p>
  2480.                             </div>
  2481.                             <div class="col-sm-6" data-aos="fade-up" data-aos-delay="100">
  2482.                               <div class="icon text-center mb-4"><i class="bi bi-lightning-charge-fill fs-4"></i></div>
  2483.                               <h3 class="fs-6 fw-bold mb-3"> Image professionnelle   </h3>
  2484.                               <p> une expérience moderne qui rassure et valorise votre organisation.</p>
  2485.                             </div>
  2486.         <a href="#pricing" class="btn btn-lg btn-primary  px-4 w-100 w-sm-auto" style="background:#F09E7A">    
  2487.          Découvrir nos offres
  2488.             
  2489.           </a>
  2490.                            
  2491.                           </div>
  2492.                         </div>
  2493.                       </div>
  2494.                     </div>
  2495.                   </div>
  2496.                 </div>
  2497.               </div>
  2498.             </div>
  2499.           
  2500.           </div>
  2501.         </section>
  2502.            <!-- ======= Stats =======-->
  2503.         <section class="stats__v3 section">
  2504.           <div class="container">
  2505.             <div class="row">
  2506.               <div class="col-12">
  2507.                 <div class="d-flex flex-wrap content rounded-4" data-aos="fade-up" data-aos-delay="0">
  2508.                   <div class="rounded-borders">
  2509.                     <div class="rounded-border-1"></div>
  2510.                     <div class="rounded-border-2"></div>
  2511.                     <div class="rounded-border-3"></div>
  2512.                   </div>
  2513.                   <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">
  2514.                     <div class="stat-item">
  2515.                       <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>
  2516.                       <p class="mb-0">des familles connectées dès J1
  2517. Invitation simple, lien sécurisé</p>
  2518.                     </div>
  2519.                   </div>
  2520.                   <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">
  2521.                     <div class="stat-item">
  2522.                       <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>
  2523.                       <p class="mb-0">enfants suivis
  2524. Confiance des établissements & associations</p>
  2525.                     </div>
  2526.                   </div>
  2527.                   <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">
  2528.                     <div class="stat-item">
  2529.                       <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>
  2530.                       <p class="mb-0">séjours accompagnés
  2531. Partout en France et à l'étranger</p>
  2532.                     </div>
  2533.                   </div>
  2534.                 </div>
  2535.               </div>
  2536.             </div>
  2537.           </div>
  2538.         </section>
  2539.         <!-- End Stats-->
  2540.           <!-- ======= How it works =======-->
  2541.         <section class="section howitworks__v1" id="how-it-works">
  2542.           <div class="container">
  2543.             <div class="row mb-5">
  2544.               <div class="col-md-7 text-center mx-auto">
  2545.                 <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Comment ça marche</span>
  2546.                 <h2 data-aos="fade-up" data-aos-delay="100">Simple pour vous, magique pour les familles</h2>
  2547.                 <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>
  2548.                 <p class="text-primary-emphasis fw-semibold mt-3" data-aos="fade-up" data-aos-delay="250" style="font-size: 0.95rem;">
  2549.                   <strong>Aucun frais d'activation pour votre structure.</strong> Vous pouvez proposer aux familles un accès complet au journal du séjour (photos, vidéos, messages vocaux), en service optionnel. Vous pouvez aussi choisir d'inclure cet accès dans vos séjours et de l'offrir aux familles (prise en charge par votre structure).
  2550.                 </p>
  2551.               </div>
  2552.             </div>
  2553.             <div class="row g-md-5">
  2554.               <div class="col-md-6 col-lg-3">
  2555.                 <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">
  2556.                   <div data-aos="fade-right" data-aos-delay="500">
  2557.                     <img class="arch-line" src="{{ asset('Accueil/imagesAccueil/arch-line.png') }}" alt="Flèche animation">
  2558.                   </div>
  2559.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">1</span>
  2560.                   <div>
  2561.                     <h3 class="fs-5 mb-4">Créez l'espace séjour</h3>
  2562.                     <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>
  2563.                   </div>
  2564.                 </div>
  2565.               </div>
  2566.               <div class="col-md-6 col-lg-3" data-aos="fade-up" data-aos-delay="600">
  2567.                 <div class="step-card reverse text-center h-100 d-flex flex-column justify-content-start position-relative">
  2568.                   <div data-aos="fade-right" data-aos-delay="1100">
  2569.                     <img class="arch-line reverse" src="{{ asset('Accueil/imagesAccueil/arch-line-reverse.png') }}" alt="Flèche animation">
  2570.                   </div>
  2571.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">2</span>
  2572.                   <h3 class="fs-5 mb-4">Invitez les familles</h3>
  2573.                   <p>Envoyez le code de séjour aux familles pour qu'ils rejoignent l'espace séjour. </p>
  2574.                 </div>
  2575.               </div>
  2576.               <div class="col-md-6 col-lg-3" data-aos="fade-up" data-aos-delay="1200">
  2577.                 <div class="step-card text-center h-100 d-flex flex-column justify-content-start position-relative">
  2578.                   <div data-aos="fade-right" data-aos-delay="1700">
  2579.                     <img class="arch-line" src="{{ asset('Accueil/imagesAccueil/arch-line.png') }}" alt="Flèche animation">
  2580.                   </div>
  2581.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">3</span>
  2582.                   <h3 class="fs-5 mb-4">Publiez en 2 clics</h3>
  2583.                   <p>Diffusez vos photos, vidéos et messages vocaux <strong>en toute simplicité.</strong></p>
  2584.                 </div>
  2585.               </div>
  2586.               <div class="col-md-6 col-lg-3" data-aos="fade-up" data-aos-delay="1800">
  2587.                 <div class="step-card last text-center h-100 d-flex flex-column justify-content-start position-relative">
  2588.                   <span class="step-number rounded-circle text-center fw-bold mb-5 mx-auto">4</span>
  2589.                   <div>
  2590.                     <h3 class="fs-5 mb-4">Bilan & archive</h3>
  2591.                     <p>À la fin du séjour, accédez à un bilan complet avec statistiques, et proposez aux familles des produits souvenir personnalisés.</p>
  2592.                   </div>
  2593.                 </div>
  2594.               </div>
  2595.             </div>
  2596.           </div>
  2597.         </section>
  2598.         <!-- End How it works-->
  2599.         <!-- End Features-->
  2600.           <!-- ======= About =======-->
  2601.         <section class="about__v4 section" id="about" style="padding: 100px 0;padding-bottom:0px;
  2602.     scroll-margin-top: 100px;">
  2603.         <div class="container">
  2604.     <div class="text-center mb-4">
  2605.       <span class="subtitle text-uppercase mb-3 text-center tagSection" data-aos="fade-up" data-aos-delay="0">
  2606. Et si vous retrouviez l’un des services historiques de 5sur5, repensé pour 2025 ?    </span>
  2607.       <h2 class="mb-2" data-aos="fade-up" data-aos-delay="50">
  2608.  La Boîte Vocale revient, plus simple, plus puissante, et entièrement intégrée à vos séjours    </h2>
  2609.       <p class="text-muted mb-3" data-aos="fade-up" data-aos-delay="100">
  2610. 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.
  2611.    <br>  </p>
  2612.       
  2613.           <div class="container my-5">
  2614.             <div class="row">
  2615.             
  2616.               <div class="col-md-6 order-md-2">
  2617.                   <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Service unique en France</span>
  2618.                     <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>
  2619.        
  2620.                 <div class="row justify-content-end">
  2621.                   <div class="col-md-11 mb-4 mb-md-0">
  2622.                              <div data-aos="fade-up" data-aos-delay="200">
  2623.                       <p>
  2624.                       
  2625.                      La Boîte Vocale 5sur5 fonctionne immédiatement : nous prenons en charge toute l’installation, la configuration et le support. 
  2626. Chaque message vocal déclenche automatiquement un appel aux parents créant un lien direct  sans perturbation .
  2627.  Aucune action ni intervention n’est requise de votre part.  </p>
  2628.                     </div>
  2629.                     <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>
  2630.                     <ul class="d-flex flex-row flex-wrap list-unstyled gap-3 features" data-aos="fade-up" data-aos-delay="400">
  2631.                       <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>
  2632.                       <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>
  2633.                       <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>
  2634.                       <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>
  2635.                     </ul>
  2636.                         <a  class="btn btn-lg btn-primary px-4 w-100 w-sm-auto" style="background:#F09E7A ;color:white"
  2637.                href="{{ path('boite_vocale') }}">
  2638.             Commander une boite vocale
  2639.             <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">
  2640.               <path d="M7 7h10v10"></path><path d="M7 17 17 7"></path>
  2641.             </svg>
  2642.           </a>
  2643.                   </div>
  2644.                 </div>
  2645.               </div>
  2646.               <div class="col-md-6"> 
  2647.                 <div class="img-wrap position-relative">
  2648.                   <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;">
  2649.                   <div class="mission-statement p-4 rounded-4 d-flex gap-4" data-aos="fade-up" data-aos-delay="100">
  2650.                     <div class="mission-icon text-center rounded-circle"><i class="bi bi-send-check-fill fs-4"></i></div>
  2651.                     <div>
  2652.                       <h3 class="text-uppercase fw-bold">Notre mission</h3>
  2653.                       <p class="fs-5 mb-0">Éliminer l’angoisse des parents et la pression sur les équipes en garantissant que chaque message important soit réellement entendu, immédiatement, sans gestion manuelle ni appels répétés</p>
  2654.                     </div>
  2655.                   </div>
  2656.                 </div>
  2657.               </div>
  2658.             </div>
  2659.           </div>
  2660.         
  2661.         </section>
  2662.         <!-- End About-->
  2663.       
  2664.          
  2665. <!-- BANDEAU CTA FINAL -->
  2666. <section class="py-0 d-none" style="margin-bottom:5%">
  2667.   <div class="container">
  2668.     <div class="cta-section p-4 p-md-5 text-center" data-aos="fade-up">
  2669.       <h3 class="fw-bold mb-2">Prêt à gagner du temps et rassurer 100&nbsp;% des familles&nbsp;?</h3>
  2670.       <p class="text-muted mb-3">Choisissez votre pack — on vous met en place en 24&nbsp;h, et on vous accompagne pas à pas.</p>
  2671.       <p class="text-primary-emphasis fw-semibold mb-4" style="font-size: 0.95rem;">
  2672.         <strong>Activation sans frais pour votre structure.</strong> Vous pouvez proposer aux familles un accès complet au journal du séjour (photos, vidéos, messages vocaux), en service optionnel. Vous pouvez aussi choisir d'inclure cet accès dans vos séjours et de l'offrir aux familles (prise en charge par votre structure).
  2673.       </p>
  2674.       <div class="d-flex flex-wrap justify-content-center gap-3">
  2675.                      
  2676.         <a  href="#" data-action="cta_create" data-pack="creation"
  2677.            class="btn btn-outline-primary btn-lg px-4">
  2678.           <i class="bi bi-plus-circle me-2"></i>Créer mon espace séjour 
  2679.         </a>
  2680.         <a href="{{ path('boite_vocale') }}"
  2681.            class="btn btn-secondary btn-lg px-4" >
  2682.           <i class="bi bi-telephone me-2"></i>Commander boîte vocale
  2683.         </a>
  2684.       
  2685.       </div>
  2686.       <div class="mt-3 small ">
  2687.         <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 • <i class="bi bi-info-circle ms-1 me-1"></i>Aucun frais d'activation
  2688.       </div>
  2689.     </div>
  2690.   </div>
  2691. </section>
  2692.         <!-- ======= Pricing =======-->
  2693.         <section class="section py-6 pro-offers" id="pricing">
  2694.           <div class="container position-relative" style="margin-top:5%">
  2695.             <div class="text-center mb-5">
  2696.               <span class="subtitle text-uppercase mb-2 tagSection d-inline-flex align-items-center gap-2" data-aos="fade-up">
  2697.                 <i class="bi bi-stars text-warning"></i> Options pour structures régulières
  2698.               </span>
  2699.               <h2 class="mb-3" data-aos="fade-up" data-aos-delay="50">
  2700.                 Des options simples pour les structures qui utilisent 5sur5 régulièrement
  2701.               </h2>
  2702.               <p class="text-muted mb-4" data-aos="fade-up" data-aos-delay="100">
  2703.                 La création de vos séjours reste gratuite. Ces formules s'adressent aux structures qui souhaitent un cadre tarifaire annuel ou des options avancées.
  2704.               </p>
  2705.               <p class="text-primary-emphasis fw-semibold mb-0" data-aos="fade-up" data-aos-delay="150" style="font-size: 0.95rem;">
  2706.                 Plateforme photo & audio sécurisée, boîte vocale web intégrée, support humain basé en France.
  2707.               </p>
  2708.             </div>
  2709.             <div class="row g-4 align-items-stretch">
  2710.               <!-- Séjour unique -->
  2711.               <div class="col-lg-4" data-aos="fade-up" data-aos-delay="0">
  2712.                 <div class="pro-card h-100">
  2713.                   <div class="pro-card__badge text-secondary"><i class="bi bi-calendar4-week me-2"></i>Séjour ponctuel</div>
  2714.                   <h3>Séjour Unique</h3>
  2715.                   <p class="pro-card__subtitle">Pour un séjour occasionnel ou pour tester la plateforme</p>
  2716.                   <div class="pro-card__price">
  2717.                     <span style="font-size: 1.8rem;">39€</span>
  2718.                     <small>/ séjour</small>
  2719.                   </div>
  2720.                   <ul>
  2721.                     <li><i class="bi bi-check-circle-fill"></i>Galerie photo + messages vocaux</li>
  2722.                     <li><i class="bi bi-check-circle-fill"></i>Espace sécurisé pendant 60 jours</li>
  2723.                     <li><i class="bi bi-check-circle-fill"></i>Création gratuite pour votre structure</li>
  2724.                     <li><i class="bi bi-check-circle-fill"></i>Support pour l'accompagnateur</li>
  2725.                   </ul>
  2726.                   <a href="{{ path('app_creation_simple_creer') }}" class="btn btn-outline-primary w-100">
  2727.                     <i class="bi bi-plus-circle me-2"></i>Créer mon espace séjour
  2728.                   </a>
  2729.                 </div>
  2730.               </div>
  2731.               <!-- Pack annuel -->
  2732.               <div class="col-lg-4" data-aos="fade-up" data-aos-delay="150">
  2733.                 <div class="pro-card pro-card--featured h-100 position-relative overflow-hidden">
  2734.                   <span class="pro-card__badge pro-card__badge--featured"><i class="bi bi-star-fill me-2"></i>Le plus courant</span>
  2735.                   <h3>Pack Annuel – 25 séjours</h3>
  2736.                   <p class="pro-card__subtitle">Pour les structures qui organisent plusieurs séjours par an</p>
  2737.                   <div class="pro-card__price">
  2738.                     <span style="font-size: 1.8rem;">490€</span>
  2739.                     <small>HT / an</small>
  2740.                   </div>
  2741.                   <ul>
  2742.                     <li><i class="bi bi-check-circle-fill"></i>Jusqu'à 25 séjours inclus</li>
  2743.                     <li><i class="bi bi-check-circle-fill"></i>Accompagnateurs & parents illimités</li>
  2744.                     <li><i class="bi bi-check-circle-fill"></i>Mise en place en 24h + onboarding</li>
  2745.                     <li><i class="bi bi-check-circle-fill"></i>Boîte vocale web intégrée</li>
  2746.                   </ul>
  2747.                   <a href="{{ path('pack_annuel_partenaires') }}" class="btn btn-primary w-100">
  2748.                     <i class="bi bi-info-circle me-2"></i>En savoir plus
  2749.                   </a>
  2750.                 </div>
  2751.               </div>
  2752.               <!-- Offres sur mesure -->
  2753.               <div class="col-lg-4" data-aos="fade-up" data-aos-delay="300">
  2754.                 <div class="pro-card h-100">
  2755.                   <div class="pro-card__badge text-secondary"><i class="bi bi-building-up me-2"></i>Grandes structures</div>
  2756.                   <h3>+25 séjours / an</h3>
  2757.                   <p class="pro-card__subtitle">Partenariat sur mesure & tarifs dégressifs</p>
  2758.                   <div class="pro-card__price pro-card__price--quote">
  2759.                     <span>Sur devis</span>
  2760.                  
  2761.                   </div>
  2762.                   <ul>
  2763.                     <li><i class="bi bi-check-circle-fill"></i>Déploiement multi-sites & multi-équipes</li>
  2764.                     <li><i class="bi bi-check-circle-fill"></i>Tableau de bord groupe</li>
  2765.                     <li><i class="bi bi-check-circle-fill"></i>Contrat cadre + facturation centralisée</li>
  2766.                     <li><i class="bi bi-check-circle-fill"></i>Support prioritaire 7j/7</li>
  2767.                   </ul>
  2768.                   <button type="button" class="btn btn-outline-primary w-100" data-bs-toggle="modal" data-bs-target="#grandVolumeModal">
  2769.                     <i class="bi bi-envelope-open me-2"></i>Parler à un expert
  2770.                   </button>
  2771.                 </div>
  2772.               </div>
  2773.             </div>
  2774.             <div class="pro-offers__foot text-center mt-5" data-aos="fade-up">
  2775.               <p class="mb-2">🎓 <strong>Écoles publiques :</strong> Pour les écoles publiques en France, la mise en service est gratuite. L'accès familles est également pris en charge dans le cadre de l'offre 5sur5Séjour.</p>
  2776.               <p class="text-muted small mb-0">Données hébergées en France &nbsp;•&nbsp; Activation en 24h &nbsp;•&nbsp; Aucun frais d'activation pour votre structure</p>
  2777.             </div>
  2778.           </div>
  2779.         </section>
  2780.         <style>
  2781.           .pro-offers {
  2782.             background: #f8f9fa;
  2783.             border-top: 1px solid rgba(65,162,170,0.1);
  2784.             border-bottom: 1px solid rgba(65,162,170,0.1);
  2785.           }
  2786.           .pro-card {
  2787.             background: #fff;
  2788.             border-radius: 24px;
  2789.             padding: 32px;
  2790.             box-shadow: 0 25px 60px rgba(15, 40, 77, 0.08);
  2791.             transition: transform 0.3s ease, box-shadow 0.3s ease;
  2792.             height: 100%;
  2793.           }
  2794.           .pro-card:hover {
  2795.             transform: translateY(-6px);
  2796.             box-shadow: 0 30px 70px rgba(15, 40, 77, 0.16);
  2797.           }
  2798.           .pro-card h3 {
  2799.             font-weight: 700;
  2800.             color: #1f2b3a;
  2801.           }
  2802.           .pro-card__subtitle {
  2803.             color: #6b7b8d;
  2804.             margin-bottom: 1rem;
  2805.           }
  2806.           .pro-card__price {
  2807.             display: flex;
  2808.             align-items: baseline;
  2809.             gap: 8px;
  2810.             font-weight: 700;
  2811.             color: #1f2b3a;
  2812.             margin-bottom: 1.25rem;
  2813.           }
  2814.           .pro-card__price span {
  2815.             font-size: 2.4rem;
  2816.             color: #41a2aa;
  2817.           }
  2818.           .pro-card__price--quote span {
  2819.             font-size: 1.8rem;
  2820.           }
  2821.           .pro-card ul {
  2822.             list-style: none;
  2823.             padding: 0;
  2824.             margin: 0 0 1.5rem 0;
  2825.             color: #4b596b;
  2826.             font-size: 0.95rem;
  2827.           }
  2828.           .pro-card ul li {
  2829.             display: flex;
  2830.             gap: 10px;
  2831.             align-items: center;
  2832.             margin-bottom: 0.6rem;
  2833.           }
  2834.           .pro-card ul li i {
  2835.             color: #41a2aa;
  2836.           }
  2837.           .pro-card__badge {
  2838.             font-size: 0.75rem;
  2839.             text-transform: uppercase;
  2840.             letter-spacing: 0.08em;
  2841.             font-weight: 700;
  2842.             margin-bottom: 1rem;
  2843.             display: inline-flex;
  2844.             align-items: center;
  2845.             gap: 4px;
  2846.           }
  2847.           .pro-card--featured {
  2848.             border: 2px solid rgba(65,162,170,0.2);
  2849.             background: linear-gradient(135deg, #ffffff 0%, #f8fbff 100%);
  2850.           }
  2851.           .pro-card__badge--featured {
  2852.             background: #fde2d6;
  2853.             color: #c15f29;
  2854.             padding: 0.35rem 0.9rem;
  2855.             border-radius: 999px;
  2856.           }
  2857.           .pro-offers__foot {
  2858.             font-size: 0.95rem;
  2859.             color: #4b596b;
  2860.             font-weight: 500;
  2861.           }
  2862.         </style>
  2863.         <section class="py-5 bg-light d-none" data-aos="fade-up" data-aos-delay="50">
  2864.   <div class="container text-center" style="display:none">
  2865.     <span class="subtitle text-uppercase mb-2 text-center tagSection">Séjour ponctuel</span>
  2866.     <h2 class="mb-3">Un séjour simple, tout compris</h2>
  2867.     <p class="text-muted mb-4 mx-auto" style="max-width: 700px;">
  2868.       Vous organisez un seul séjour dans l’année ?  
  2869.       5sur5Séjour vous permet de partager photos, vidéos et messages vocaux avec les familles  
  2870.       sans abonnement ni engagement.
  2871.     </p>
  2872.     <div class="p-5 bg-white shadow-sm rounded-4 mx-auto responsive-container" style="max-width: 600px;">
  2873.       <div class="display-6 fw-semibold mb-1" style="color: #41a2aa;">
  2874.         <i class="bi bi-building-check"></i> Prise en charge par la structure
  2875.       </div>
  2876.       <div class="text-muted mb-3 small">
  2877.         Boîte vocale incluse · Tarif préférentiel partenaire
  2878.       </div>
  2879.       <ul class="list-unstyled text-start d-inline-block mb-4">
  2880.         <li>✅ Accès complet à la plateforme pendant 60 jours</li>
  2881.         <li>✅ Galerie <strong>photos & vidéos</strong> sécurisée</li>
  2882.        
  2883.         <li>✅ Consentements <strong>RGPD</strong> hébergés en France</li>
  2884.         <li>➡️ Ajouter la Boîte Vocale pour appeler automatiquement les parents après chaque message <li>
  2885.       </ul>
  2886.       <a href="{{ path('app_creation_simple_creer') }}" class="btn btn-primary px-4 py-2">
  2887.         <i class="bi bi-calculator"></i> Obtenir un devis
  2888.       </a>
  2889.       <p class="text-muted small mt-3">Idéal pour un premier usage ou un séjour unique.</p>
  2890.     </div>
  2891.   </div>
  2892. </section>
  2893.  
  2894.     
  2895.        
  2896.         
  2897.         <!-- ======= Services =======-->
  2898.        <section class="section services__v3" id="souvenirs">
  2899.           <div class="container">
  2900.             <div class="row mb-5">
  2901.               <div class="col-md-8 mx-auto text-center">
  2902.         <span class="subtitle text-uppercase mb-2" data-aos="fade-up" data-aos-delay="0">Produits 5sur5</span>
  2903.         <h2 class="mb-2" data-aos="fade-up" data-aos-delay="100">
  2904.           Souvenirs & commande groupée</span> 
  2905.         </h2>
  2906.         <p class="text-muted" data-aos="fade-up" data-aos-delay="150">
  2907.           Offrez aux familles un souvenir durable du séjour. Qualité premium, expédition rapide, et
  2908.           possibilité d'<strong>achat groupé –20%</strong> pour les établissements.
  2909.         </p>
  2910.               </div>
  2911.             </div>
  2912.             <div class="row g-4">
  2913.       <!-- Carte 1 : Albums -->
  2914.               <div class="col-md-6 col-lg-4" data-aos="fade-up" data-aos-delay="0">
  2915.                 <div class="service-card p-4 rounded-4 h-100 d-flex flex-column justify-content-between gap-5">
  2916.                   <div>
  2917.             <figure class="product-visual" style=""  width: 100%;
  2918.   height: 200px;                /* hauteur demandée */
  2919.   display: flex;
  2920.   align-items: center;
  2921.   justify-content: center;      /* image centrée */
  2922.   background: rgba(47,167,163,.06);
  2923.   border-radius: 16px;
  2924.   overflow: hidden;
  2925.   margin-bottom: 16px;>
  2926.         <img style=" max-width: 100%;
  2927.   max-height: 100%;
  2928.   object-fit: contain;          /* garde le ratio, pas de crop */
  2929.   display: block;"
  2930.           src="https://5sur5sejour.com/images/produit/LivreSouvenir5sur5-1.jpg"
  2931.           alt="Album photo premium 5sur5"
  2932.           width="400" height="300" loading="lazy" decoding="async"
  2933.           sizes="(min-width:992px) 330px, 90vw">
  2934.       </figure>
  2935.             
  2936.             <h3 class="fs-5 mb-3">Album photo premium</h3>
  2937.             <p class="mb-4">
  2938.               Le souvenir incontournable du séjour. Qualité soignée, fabrication locale en France et
  2939.               <strong>livraison gratuite</strong> pour les familles.
  2940.             </p>
  2941.                   </div>
  2942.           <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">
  2943.                     <span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"></i></span>
  2944.             <span>Voir les modèles d'albums</span>
  2945.                   </a>
  2946.                 </div>
  2947.               </div>
  2948.       <!-- Carte 2 : Tirages & souvenirs -->
  2949.               <div class="col-md-6 col-lg-4" data-aos="fade-up" data-aos-delay="200">
  2950.                 <div class="service-card p-4 rounded-4 h-100 d-flex flex-column justify-content-between gap-5">
  2951.                   <div>
  2952.            <figure class="product-visual" style=""  width: 100%;
  2953.   height: 200px;                /* hauteur demandée */
  2954.   display: flex;
  2955.   align-items: center;
  2956.   justify-content: center;      /* image centrée */
  2957.   background: rgba(47,167,163,.06);
  2958.   border-radius: 16px;
  2959.   overflow: hidden;
  2960.   margin-bottom: 16px;>
  2961.         <img style=" max-width: 100%;
  2962.   max-height: 100%;
  2963.   object-fit: contain;          /* garde le ratio, pas de crop */
  2964.   display: block;"
  2965.           src="https://5sur5sejour.com/images/produit/PochettePhoto5sur5-2.jpg"
  2966.           alt="Album photo premium 5sur5"
  2967.           width="400" height="300" loading="lazy" decoding="async"
  2968.           sizes="(min-width:992px) 330px, 90vw">
  2969.       </figure>
  2970.             
  2971.            
  2972.             <h3 class="fs-5 mb-3">Tirages & produits souvenirs</h3>
  2973.             <p class="mb-4">
  2974.               Tirages photo et articles souvenirs 5sur5 pour prolonger l'expérience du séjour.
  2975.               Qualité premium, <strong>fabriqués en France</strong>.
  2976.             </p>
  2977.                   </div>
  2978.           <a class="special-link d-inline-flex gap-2 align-items-center text-decoration-none" href="{{ path('boutique5sur5_Souvenir') }}">
  2979.                     <span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"></i></span>
  2980.             <span>Découvrir les souvenirs</span>
  2981.                   </a>
  2982.                 </div>
  2983.               </div>
  2984.       <!-- Carte 3 : Achat groupé -20% -->
  2985.               <div class="col-md-6 col-lg-4" data-aos="fade-up" data-aos-delay="300">
  2986.                 <div class="service-card p-4 rounded-4 h-100 d-flex flex-column justify-content-between gap-5">
  2987.                   <div>
  2988.                <figure class="product-visual" style=""  width: 100%;
  2989.   height: 200px;                /* hauteur demandée */
  2990.   display: flex;
  2991.   align-items: center;
  2992.   justify-content: center;      /* image centrée */
  2993.   background: rgba(47,167,163,.06);
  2994.   border-radius: 16px;
  2995.   overflow: hidden;
  2996.   margin-bottom: 16px;>
  2997.         <img style=" max-width: 100%;
  2998.   max-height: 100%;
  2999.   object-fit: contain;          /* garde le ratio, pas de crop */
  3000.   display: block;"
  3001.           src="https://5sur5sejour.com/images/produit/Album5sur5-3.jpg"
  3002.           alt="Album photo premium 5sur5"
  3003.           width="400" height="300" loading="lazy" decoding="async"
  3004.           sizes="(min-width:992px) 330px, 90vw">
  3005.       </figure>
  3006.            
  3007.             <h3 class="fs-5 mb-3">Achat groupé établissement –20%</h3>
  3008.             <p class="mb-4">
  3009.               Activez l'option "achat groupé" pour la classe/le séjour et bénéficiez de
  3010.               <strong>–20% de réduction</strong> avec <strong>livraison gratuite</strong>. Simple à organiser, apprécié des familles.
  3011.             </p>
  3012.                   </div>
  3013.           <a  data-bs-toggle="modal"
  3014.    data-bs-target="#groupBuyLite"
  3015.    data-action="group_buy_open" class="special-link d-inline-flex gap-2 align-items-center text-decoration-none" href="#achat-groupe">
  3016.                     <span class="icons"><i class="icon-1 bi bi-arrow-right-short"></i><i class="icon-2 bi bi-arrow-right-short"></i></span>
  3017.             <span>Activer l'achat groupé</span>
  3018.                   </a>
  3019.                 </div>
  3020.               </div>
  3021.             </div>
  3022.     <!-- Micro-barre de réassurance (discrète) -->
  3023.     <div class="text-center text-muted small mt-4">
  3024.       Fabriqué en France · Livraison gratuite · Qualité premium 5sur5 · Possibilité de <strong>partage des bénéfices</strong> pour les partenaires
  3025.     </div>
  3026.   </div>
  3027. </section>
  3028.       
  3029.         <!-- ======= Contact =======-->
  3030.         <section class="section contact__v2" id="contact">
  3031.           <div class="container">
  3032.             <div class="row mb-5">
  3033.               <div class="col-md-6 col-lg-7 mx-auto text-center">
  3034.                 <span class="subtitle text-uppercase mb-3" data-aos="fade-up" data-aos-delay="0">Contact</span>
  3035.                 <h2 class="h2 fw-bold mb-3" data-aos="fade-up" data-aos-delay="0">Nous contacter</h2>
  3036.                 <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>
  3037.               </div>
  3038.             </div>
  3039.             <div class="row">
  3040.               <div class="col-md-6">
  3041.                 <div class="d-flex gap-5 flex-column">
  3042.                   <div class="d-flex align-items-start gap-3" data-aos="fade-up" data-aos-delay="0">
  3043.                     <div class="icon d-block"><i class="bi bi-telephone"></i></div>
  3044.                     <span>
  3045.                       <span class="d-block">Téléphone</span>
  3046.                       <strong>05 36 28 29 30</strong>
  3047.                     </span>
  3048.                   </div>
  3049.                   <div class="d-flex align-items-start gap-3" data-aos="fade-up" data-aos-delay="100">
  3050.                     <div class="icon d-block"><i class="bi bi-send"></i></div>
  3051.                     <span>
  3052.                       <span class="d-block">Email</span>
  3053.                       <strong>contact@5sur5sejour.com</strong>
  3054.                     </span>
  3055.                   </div>
  3056.                   <div class="d-flex align-items-start gap-3" data-aos="fade-up" data-aos-delay="200">
  3057.                     <div class="icon d-block"><i class="bi bi-geo-alt"></i></div>
  3058.                     <span>
  3059.                       <span class="d-block">Adresse</span>
  3060.                       <address class="fw-bold">5sur5séjour<br>France</address>
  3061.                     </span>
  3062.                   </div>
  3063.                 </div>
  3064.               </div>
  3065.               <div class="col-md-6">
  3066.                 <div class="form-wrapper" data-aos="fade-up" data-aos-delay="300">
  3067.                   <div class="text-center mb-4">
  3068.                     <a href="#" class="btn btn-primary btn-lg" data-action="cta_expert" data-pack="contact">
  3069.                       Parler à un expert maintenant
  3070.                     </a>
  3071.                     <p class="text-muted mt-3 mb-0">Ou utilisez le formulaire ci-dessous pour nous laisser un message</p>
  3072.                   </div>
  3073.                   <form id="contactFormSection" action="{{ path('app_contact') }}" method="POST">
  3074.                     <div class="row gap-3 mb-3">
  3075.                       <div class="col-md-12">
  3076.                         <label class="mb-2" for="name">Nom</label>
  3077.                         <input class="form-control" id="name" type="text" name="name" required="">
  3078.                       </div>
  3079.                       <div class="col-md-12">
  3080.                         <label class="mb-2" for="email">Email</label>
  3081.                         <input class="form-control" id="email" type="email" name="email" required="">
  3082.                       </div>
  3083.                     </div>
  3084.                     <div class="row gap-3 mb-3">
  3085.                       <div class="col-md-12">
  3086.                         <label class="mb-2" for="subject">Sujet</label>
  3087.                         <input class="form-control" id="subject" type="text" name="subject">
  3088.                       </div>
  3089.                     </div>
  3090.                     <div class="row gap-3 gap-md-0 mb-3">
  3091.                       <div class="col-md-12">
  3092.                         <label class="mb-2" for="message">Message</label>
  3093.                         <textarea class="form-control" id="message" name="message" rows="5" required=""></textarea>
  3094.                       </div>
  3095.                     </div>
  3096.                     <button class="btn btn-primary fw-semibold" type="submit">Envoyer le message</button>
  3097.                   </form>
  3098.                   <div class="mt-3 d-none alert alert-success" id="successMessageSection">Message envoyé avec succès !</div>
  3099.                   <div class="mt-3 d-none alert alert-danger" id="errorMessageSection">Échec de l'envoi du message. Veuillez réessayer plus tard.</div>
  3100.                 </div>
  3101.               </div>
  3102.             </div>
  3103.           </div>
  3104.         </section>
  3105.         <!-- End Contact-->
  3106.         
  3107.         <!-- ======= Footer =======-->
  3108.         {% include 'Accueil/_footer_premium.html.twig' %}
  3109.         <!-- End Footer-->
  3110.         
  3111.       </main>
  3112.     </div>
  3113.     
  3114.     <!-- ======= Back to Top =======-->
  3115.     <button id="back-to-top"><i class="bi bi-arrow-up-short"></i></button>
  3116.     <!-- End Back to top-->
  3117.     
  3118.     <!-- ======= Javascripts =======-->
  3119.     <script src="{{ asset('Accueil/vendors/bootstrap/bootstrap.bundle.min.js') }}"></script>
  3120.     <script src="{{ asset('Accueil/vendors/gsap/gsap.min.js') }}"></script>
  3121.     <script src="{{ asset('Accueil/vendors/imagesloaded/imagesloaded.pkgd.min.js') }}"></script>
  3122.     <script src="{{ asset('Accueil/vendors/isotope/isotope.pkgd.min.js') }}"></script>
  3123.     <script src="{{ asset('Accueil/vendors/glightbox/glightbox.min.js') }}"></script>
  3124.     <script src="{{ asset('Accueil/vendors/swiper/swiper-bundle.min.js') }}"></script>
  3125.     <script src="{{ asset('Accueil/vendors/aos/aos.js') }}"></script>
  3126.     <script src="{{ asset('Accueil/vendors/purecounter/purecounter.js') }}"></script>
  3127.     <script src="{{ asset('Accueil/js/js_nova.js') }}"></script>
  3128.     <script src="{{ asset('Accueil/js/test-animations.js') }}"></script>
  3129.     
  3130.     <!-- Initialize AOS -->
  3131.     <script>
  3132.       document.addEventListener('DOMContentLoaded', function() {
  3133.         console.log('DOM loaded, initializing AOS...');
  3134.         
  3135.         // Initialize AOS
  3136.         AOS.init({
  3137.           duration: 1000,
  3138.           easing: 'ease-in-out',
  3139.           once: true,
  3140.           mirror: false
  3141.         });
  3142.         
  3143.         console.log('AOS initialized');
  3144.         
  3145.         // Initialize PureCounter
  3146.         new PureCounter();
  3147.         
  3148.         // Initialize GLightbox
  3149.         const lightbox = GLightbox({
  3150.           selector: '.glightbox'
  3151.         });
  3152.         
  3153.         // Debug: Check if arch-line images are loaded
  3154.         const archLines = document.querySelectorAll('.arch-line');
  3155.         console.log('Found arch-line elements:', archLines.length);
  3156.         archLines.forEach((line, index) => {
  3157.           console.log(`Arch-line ${index + 1}:`, line.src, line.complete ? 'loaded' : 'loading...');
  3158.         });
  3159.         
  3160.         // Smooth scrolling for anchor links
  3161.         document.querySelectorAll('a[href^="#"]').forEach(anchor => {
  3162.           anchor.addEventListener('click', function (e) {
  3163.             e.preventDefault();
  3164.             const target = document.querySelector(this.getAttribute('href'));
  3165.             if (target) {
  3166.               target.scrollIntoView({
  3167.                 behavior: 'smooth',
  3168.                 block: 'start'
  3169.               });
  3170.             }
  3171.           });
  3172.         });
  3173.         
  3174.         // Back to top button
  3175.         const backToTop = document.getElementById('back-to-top');
  3176.         if (backToTop) {
  3177.           window.addEventListener('scroll', function() {
  3178.             if (window.pageYOffset > 100) {
  3179.               backToTop.style.display = 'block';
  3180.             } else {
  3181.               backToTop.style.display = 'none';
  3182.             }
  3183.           });
  3184.           
  3185.           backToTop.addEventListener('click', function() {
  3186.             window.scrollTo({
  3187.               top: 0,
  3188.               behavior: 'smooth'
  3189.             });
  3190.           });
  3191.         }
  3192.         
  3193.         // Animation des flèches pour l'ancienne section
  3194.         function startArrowAnimation() {
  3195.           const arrowImg = document.querySelector('.MyImgFirstPosition');
  3196.           const lineImg = document.querySelector('.MyLineFirstPosition');
  3197.           
  3198.           if (arrowImg && lineImg) {
  3199.             // Démarrer l'animation après 1 seconde
  3200.             setTimeout(() => {
  3201.               arrowImg.classList.add('Myimg');
  3202.               lineImg.classList.add('MyLine');
  3203.             }, 1000);
  3204.           }
  3205.         }
  3206.         
  3207.         // Démarrer l'animation des flèches
  3208.         startArrowAnimation();
  3209.         
  3210.         // Slider simple (sans Owl Carousel pour l'instant)
  3211.         let currentSlide = 0;
  3212.         const slides = document.querySelectorAll('.single_slider');
  3213.         
  3214.         function showSlide(index) {
  3215.           slides.forEach((slide, i) => {
  3216.             slide.style.display = i === index ? 'flex' : 'none';
  3217.           });
  3218.         }
  3219.         
  3220.         function nextSlide() {
  3221.           currentSlide = (currentSlide + 1) % slides.length;
  3222.           showSlide(currentSlide);
  3223.         }
  3224.         
  3225.         // Initialiser le slider
  3226.         if (slides.length > 0) {
  3227.           showSlide(0);
  3228.           // Changer de slide toutes les 5 secondes
  3229.           setInterval(nextSlide, 5000);
  3230.         }
  3231.         
  3232.         // Nouveau slider functionality
  3233.         let currentHeroSlide = 0;
  3234.         const heroSlides = [
  3235.           {
  3236.             title: "Révolutionnez la Communication",
  3237.             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.",
  3238.             image: "{{ asset('Accueil/imagesAccueil/slider/child-laughing.jpg') }}"
  3239.           },
  3240.           {
  3241.             title: "La plateforme qui rassure les familles",
  3242.             description: "Partagez vos souvenirs en toute sécurité avec des photos, vidéos et messages vocaux.",
  3243.             image: "{{ asset('Accueil/imagesAccueil/secure.jpg') }}"
  3244.           },
  3245.           {
  3246.             title: "Messages vocaux et photos",
  3247.             description: "Restez connecté avec votre enfant tout au long du séjour grâce à notre technologie sécurisée.",
  3248.             image: "{{ asset('Accueil/imagesAccueil/slider/bg-slider.svg') }}"
  3249.           }
  3250.         ];
  3251.         
  3252.         function changeSlide(direction) {
  3253.           currentHeroSlide = (currentHeroSlide + direction + heroSlides.length) % heroSlides.length;
  3254.           updateHeroSlider();
  3255.         }
  3256.         
  3257.         function updateHeroSlider() {
  3258.           const titleElement = document.querySelector('.hero-slider-title');
  3259.           const descriptionElement = document.querySelector('.hero-slider-description');
  3260.           const imageElement = document.querySelector('.hero-slider-image img');
  3261.           
  3262.           if (titleElement && descriptionElement && imageElement) {
  3263.             // Animation de transition
  3264.             titleElement.style.opacity = '0';
  3265.             descriptionElement.style.opacity = '0';
  3266.             
  3267.             setTimeout(() => {
  3268.               titleElement.textContent = heroSlides[currentHeroSlide].title;
  3269.               descriptionElement.textContent = heroSlides[currentHeroSlide].description;
  3270.               imageElement.src = heroSlides[currentHeroSlide].image;
  3271.               
  3272.               titleElement.style.opacity = '1';
  3273.               descriptionElement.style.opacity = '1';
  3274.             }, 300);
  3275.           }
  3276.         }
  3277.         
  3278.         // Auto-play pour le nouveau slider
  3279.         setInterval(() => {
  3280.           changeSlide(1);
  3281.         }, 6000);
  3282.         
  3283.         // Gestion du formulaire de contact de la section contact
  3284.         const contactFormSection = document.getElementById('contactFormSection');
  3285.         const successMessageSection = document.getElementById('successMessageSection');
  3286.         const errorMessageSection = document.getElementById('errorMessageSection');
  3287.         
  3288.         if (contactFormSection) {
  3289.           contactFormSection.addEventListener('submit', function(e) {
  3290.             e.preventDefault();
  3291.             
  3292.             // Masquer les messages précédents
  3293.             successMessageSection.classList.add('d-none');
  3294.             errorMessageSection.classList.add('d-none');
  3295.             
  3296.             // Désactiver le bouton pendant l'envoi
  3297.             const submitButton = contactFormSection.querySelector('button[type="submit"]');
  3298.             const originalText = submitButton.textContent;
  3299.             submitButton.textContent = 'Envoi en cours...';
  3300.             submitButton.disabled = true;
  3301.             
  3302.             // Récupérer les données du formulaire
  3303.             const formData = new FormData(contactFormSection);
  3304.             
  3305.             // Envoyer la requête AJAX
  3306.             fetch(contactFormSection.action, {
  3307.               method: 'POST',
  3308.               body: formData,
  3309.               headers: {
  3310.                 'X-Requested-With': 'XMLHttpRequest'
  3311.               }
  3312.             })
  3313.             .then(response => response.json())
  3314.             .then(data => {
  3315.               if (data.success) {
  3316.                 // Afficher le message de succès
  3317.                 successMessageSection.textContent = data.message;
  3318.                 successMessageSection.classList.remove('d-none');
  3319.                 
  3320.                 // Réinitialiser le formulaire
  3321.                 contactFormSection.reset();
  3322.               } else {
  3323.                 // Afficher le message d'erreur
  3324.                 errorMessageSection.textContent = data.message;
  3325.                 errorMessageSection.classList.remove('d-none');
  3326.               }
  3327.             })
  3328.             .catch(error => {
  3329.               console.error('Erreur:', error);
  3330.               errorMessageSection.textContent = 'Une erreur est survenue lors de l\'envoi du message. Veuillez réessayer plus tard.';
  3331.               errorMessageSection.classList.remove('d-none');
  3332.             })
  3333.             .finally(() => {
  3334.               // Réactiver le bouton
  3335.               submitButton.textContent = originalText;
  3336.               submitButton.disabled = false;
  3337.             });
  3338.           });
  3339.         }
  3340.         
  3341.       });
  3342.     </script>
  3343.     <!-- End JavaScripts-->
  3344. <!-- MODAL CONNEXION -->
  3345. <div class="modal fade" id="loginModal" tabindex="-1" aria-hidden="true">
  3346.   <div class="modal-dialog modal-dialog-centered modal-lg">
  3347.     <div class="modal-content rounded-4">
  3348.       <div class="modal-header border-0">
  3349.         <h5 class="modal-title fw-bold">Accéder à mon espace de séjour </h5>
  3350.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  3351.       </div>
  3352.       <div class="modal-body p-4">
  3353.         <div class="row g-4 align-items-center">
  3354.           <div class="col-lg-5 text-center border-end">
  3355.             <img src="/images/Accompagnateur/LogoEspaceAccom.svg" alt="Espace accompagnateur" class="img-fluid mb-3" style="max-height: 120px;">
  3356.             <p class="small text-muted mb-0">
  3357.               Retrouvez votre séjour, publiez vos contenus et rassurez les familles en temps réel.
  3358.             </p>
  3359.           </div>
  3360.           <div class="col-lg-7">
  3361.             <div class="titleAutre mb-3">Vous êtes accompagnateur et disposez déjà d'un identifiant et d'un mot de passe.</div>
  3362.             <form method="post" class="fomru" action="{{ path('app_back_Acommpa') }}">
  3363.               <div class="form-group d-grid gap-3">
  3364.                 <input type="text" value="" name="email" id="modalInputEmail" class="form-control" placeholder=" Code séjour de l'accompagnateur * ">
  3365.                 <input type="password" name="password" id="modalInputPassword" class="form-control" placeholder="mot de passe fourni à l'organisme * ">
  3366.                 <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
  3367.                 <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>
  3368.               </div>
  3369.               <div class="d-grid mt-4">
  3370.                 <button class="btn btn-primary rounded-3" type="submit">Je me connecte</button>
  3371.               </div>
  3372.               <div class="text-center mt-3">
  3373.                 <span class="text-muted small">Pas encore de compte ?</span>
  3374.                 <a href="https://5sur5sejour.com/Accompagnateur/login" class="fw-semibold" style="color:#f09e7a; text-decoration:none;"> S'inscrire</a>
  3375.               </div>
  3376.             </form>
  3377.           </div>
  3378.         </div>
  3379.       </div>
  3380.     </div>
  3381.   </div>
  3382. </div>
  3383. <!-- MODAL MOT DE PASSE OUBLIÉ -->
  3384. <div class="modal fade" id="mdpoblier" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  3385.   <div class="modal-dialog" role="document">
  3386.     <div class="modal-content" style="border-radius: 0px;top: 50px;width: 55%;margin: auto;min-width: 270px;" class="responsive-modal-content">
  3387.       <div class="modal-header">
  3388.         <button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
  3389.           <img src="{{ asset('images/Groupe_526.svg')}}">
  3390.         </button>
  3391.       </div>
  3392.       <div class="modal-body" style="text-align:center">
  3393.         <h5 class="modal-title" id="exampleModalLabel" style="margin-left:15px; margin-bottom: 15px">
  3394.           <img class="imageLogo2" style="width: 58% !important;" src="{{ asset('Accueil/imagesAccueil/logoHeader.svg')}}">
  3395.         </h5>
  3396.         <div class="row no-margin" style="padding-bottom: 40px;">
  3397.           <div class="col-md-12 col-sm-12 col-xs-12 descTitre">
  3398.             <strong>Vous avez oublié votre mot de passe ? Contactez notre équipe 5sur5sejour au 05 36 28 29 30.</strong>
  3399.           </div>
  3400.         </div>
  3401.       </div>
  3402.     </div>
  3403.   </div>
  3404. </div>
  3405. <!-- MODAL CONNEXION PARTENAIRE -->
  3406. <div class="modal fade" id="partnerLoginModal" tabindex="-1" aria-hidden="true">
  3407.   <div class="modal-dialog modal-dialog-centered modal-lg">
  3408.     <div class="modal-content rounded-4">
  3409.       <div class="modal-header border-0">
  3410.         <h5 class="modal-title fw-bold">Espace Partenaire - Connexion</h5>
  3411.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  3412.       </div>
  3413.       <div class="modal-body p-4">
  3414.         <div class="row g-4 align-items-center">
  3415.           <div class="col-lg-5 text-center border-end">
  3416.             <img src="{{ asset('Accueil/imagesAccueil/espcPart.svg') }}" alt="Espace partenaire" class="img-fluid mb-3" style="max-height: 120px;">
  3417.             <p class="small text-muted mb-0">
  3418.               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.
  3419.             </p>
  3420.           </div>
  3421.           <div class="col-lg-7">
  3422.             <div class="titleAutre mb-3">Vous êtes partenaire</div>
  3423.             <div class="sous-titrecnx mb-3">Bienvenue dans votre espace 5 sur 5 séjour</div>
  3424.             <div class="descriptioncnx mb-4">Entrez votre identifiant et votre mot de passe afin d'entrer dans votre plateforme d'administration</div>
  3425.             
  3426.             <form method="post" action="{{ path('app_login_back_Partenaire') }}">
  3427.               <div class="form-group d-grid gap-3">
  3428.                 <input type="text" name="email" id="partnerInputEmail" class="form-control" placeholder="Mail partenaire" value="">
  3429.                 <input type="password" name="password" id="partnerInputPassword" class="form-control" placeholder="Mot de passe">
  3430.                 <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
  3431.                 <div class="description">
  3432.                   <a href="/forgotPasspatenaire" style="color:#f09e7a;">Vous avez oublié votre mot de passe</a>
  3433.                 </div>
  3434.               </div>
  3435.               <div class="d-grid mt-4">
  3436.                 <button class="btn btn-primary rounded-3" type="submit">Je me connecte</button>
  3437.               </div>
  3438.             </form>
  3439.           </div>
  3440.         </div>
  3441.       </div>
  3442.     </div>
  3443.   </div>
  3444. </div>
  3445. <!-- Modale ultra-légère -->
  3446. <div class="modal fade" id="groupBuyLite" tabindex="-1" aria-hidden="true">
  3447.   <div class="modal-dialog modal-dialog-centered">
  3448.     <div class="modal-content rounded-4">
  3449.       <div class="modal-header">
  3450.         <h5 class="modal-title">Achat groupé — jusqu’à −20%</h5>
  3451.         <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  3452.       </div>
  3453.       <div class="modal-body">
  3454.         <ul class="small text-muted ps-3">
  3455.           <li>Remise automatique selon le volume (ex. −10% dès 5, −15% dès 10, −20% dès 20).</li>
  3456.           <li>Applicable sur albums, tirages et packs.</li>
  3457.           <li>La structure peut prendre en charge Parent Premium (tarif préférentiel, voix illimitée incluse).</li>
  3458.         </ul>
  3459.         <div class="alert alert-info small mb-0">
  3460.           <i class="bi bi-info-circle me-1"></i>
  3461.           La remise sera affichée sur la boutique. Munissez-vous du <strong>code séjour</strong> si demandé.
  3462.         </div>
  3463.       </div>
  3464.       <div class="modal-footer d-block">
  3465.         <div class="d-grid d-sm-flex gap-2">
  3466.           <!-- Redirection directe (aucun champ) -->
  3467.           <a class="btn btn-primary"
  3468.              href="/boutique?groupbuy=1&utm_source=site&utm_medium=modal&utm_campaign=group_buy"
  3469.              data-action="group_buy_continue">
  3470.             Aller à la boutique
  3471.           </a>
  3472.           <button class="btn btn-outline-secondary" data-bs-dismiss="modal">Plus tard</button>
  3473.         </div>
  3474.         <p class="small text-muted mt-2 mb-0">
  3475.           Besoin d’aide ? <a href="#" data-action="cta_expert">Parler à un expert</a>
  3476.         </p>
  3477.       </div>
  3478.     </div>
  3479.   </div>
  3480. </div>
  3481. <!-- MODALE CHOIX DE PAIEMENT -->
  3482. <div class="modal fade" id="checkoutChoiceModal" tabindex="-1" aria-labelledby="checkoutChoiceModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
  3483.     <div class="modal-dialog modal-lg modal-dialog-centered">
  3484.         <div class="modal-content">
  3485.             <div class="modal-header border-0 pb-0">
  3486.                 <h5 class="modal-title w-100 text-center" id="checkoutChoiceModalLabel">
  3487.                     <i class="bi bi-credit-card-2-front me-2"></i>
  3488.                     Comment souhaitez-vous procéder ?
  3489.                 </h5>
  3490.                 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  3491.             </div>
  3492.             <div class="modal-body px-5 py-4">
  3493.                 <!-- Récapitulatif du pack sélectionné -->
  3494.                 <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;">
  3495.                     <div class="d-flex align-items-center gap-3">
  3496.                         <i class="bi bi-box-seam fs-3"></i>
  3497.                         <div>
  3498.                             <div class="fw-bold mb-1">Pack sélectionné</div>
  3499.                             <div class="h5 mb-0" id="packName">—</div>
  3500.                         </div>
  3501.                     </div>
  3502.                     <div class="text-end">
  3503.                         <div class="text-muted small">Montant annuel</div>
  3504.                         <div class="h4 mb-0 fw-bold" id="packPrice">—</div>
  3505.                     </div>
  3506.                 </div>
  3507.                 
  3508.                 <p class="text-center text-muted mb-4">Choisissez le mode de souscription adapté à votre structure</p>
  3509.                 
  3510.                 <div class="row g-4">
  3511.                     <!-- Card 1 — Souscription en ligne -->
  3512.                     <div class="col-lg-4 col-md-6">
  3513.                         <div class="card h-100 border-2 checkout-choice-card" data-choice="online" tabindex="0" role="button">
  3514.                             <div class="card-body d-flex flex-column">
  3515.                                 <div class="mb-3">
  3516.                                     <span class="badge bg-success text-white mb-2">Recommandé</span>
  3517.                                     <h4 class="card-title mb-2">Souscrire en ligne</h4>
  3518.                                     <p class="text-muted small">CB / SEPA — activation en 24 h. Facturation annuelle.</p>
  3519.                                 </div>
  3520.                                 <ul class="list-unstyled mb-4 flex-grow-1">
  3521.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i>Stripe Checkout sécurisé</li>
  3522.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i>Facture et mandat SEPA automatiques</li>
  3523.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-success me-2"></i>Planifier l'onboarding (30 min)</li>
  3524.                                 </ul>
  3525.                                 <button class="btn btn-primary w-100" data-cta="checkout_online" data-loc="modal">
  3526.                                     <i class="bi bi-credit-card me-2"></i>Payer & activer
  3527.                                 </button>
  3528.                             </div>
  3529.                         </div>
  3530.                     </div>
  3531.                     <!-- Card 2 — Virement bancaire -->
  3532.                     <div class="col-lg-4 col-md-6">
  3533.                         <div class="card h-100 border-2 checkout-choice-card" data-choice="bank_transfer" tabindex="0" role="button">
  3534.                             <div class="card-body d-flex flex-column">
  3535.                                 <div class="mb-3">
  3536.                                     <span class="badge bg-info text-white mb-2">Économique</span>
  3537.                                     <h4 class="card-title mb-2">Virement bancaire</h4>
  3538.                                     <p class="text-muted small">Paiement par virement — activation sous 48h après réception.</p>
  3539.                                 </div>
  3540.                                 <ul class="list-unstyled mb-4 flex-grow-1">
  3541.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-info me-2"></i>RIB fourni automatiquement</li>
  3542.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-info me-2"></i>Facture proforma envoyée</li>
  3543.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-info me-2"></i>Activation après réception</li>
  3544.                                 </ul>
  3545.                                 <button type="button" class="btn btn-outline-info w-100" data-bs-toggle="modal" data-bs-target="#bankTransferModal" data-bs-dismiss="modal">
  3546.                                     <i class="bi bi-bank me-2"></i>Demander le RIB
  3547.                                 </button>
  3548.                             </div>
  3549.                         </div>
  3550.                     </div>
  3551.                     <!-- Card 3 — Devis / Bon de commande -->
  3552.                     <div class="col-lg-4 col-md-6">
  3553.                         <div class="card h-100 border-2 checkout-choice-card" data-choice="quote" tabindex="0" role="button">
  3554.                             <div class="card-body d-flex flex-column">
  3555.                                 <div class="mb-3">
  3556.                                     <h4 class="card-title mb-2 mt-4">Demander un devis / BC</h4>
  3557.                                     <p class="text-muted small">Adapté écoles publiques, collectivités, associations.</p>
  3558.                                 </div>
  3559.                                 <ul class="list-unstyled mb-4 flex-grow-1">
  3560.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-primary me-2"></i>Devis PDF instantané</li>
  3561.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-primary me-2"></i>DPA/RGPD, RIB, CGV joints</li>
  3562.                                     <li class="mb-2"><i class="bi bi-check-circle-fill text-primary me-2"></i>E‑signature & upload du BC</li>
  3563.                                 </ul>
  3564.                                 <button class="btn btn-outline-primary w-100" data-cta="checkout_quote" data-loc="modal">
  3565.                                     <i class="bi bi-file-earmark-text me-2"></i>Recevoir le devis
  3566.                                 </button>
  3567.                             </div>
  3568.                         </div>
  3569.                     </div>
  3570.                 </div>
  3571.             </div>
  3572.             <div class="modal-footer border-0 pt-0">
  3573.                 <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Retour</button>
  3574.             </div>
  3575.         </div>
  3576.     </div>
  3577. </div>
  3578. <!-- MODALE VIREMENT BANCAIRE (RIB) -->
  3579. <div class="modal fade" id="bankTransferModal" tabindex="-1" aria-labelledby="bankTransferModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
  3580.     <div class="modal-dialog modal-xl modal-dialog-centered">
  3581.         <div class="modal-content">
  3582.             <div class="modal-header border-0 pb-2">
  3583.                 <h5 class="modal-title w-100 text-center" id="bankTransferModalLabel">
  3584.                     <i class="bi bi-bank2 me-2 text-info"></i>
  3585.                     Virement bancaire — RIB instantané
  3586.                 </h5>
  3587.                 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  3588.             </div>
  3589.             <div class="modal-body p-4">
  3590.                 <div class="row">
  3591.                     <!-- Colonne formulaire -->
  3592.                     <div class="col-lg-5">
  3593.                         <div class="card border-0 bg-light h-100">
  3594.                             <div class="card-body p-4">
  3595.                                 <h6 class="text-info mb-3">
  3596.                                     <i class="bi bi-person-circle me-2"></i>Vos informations
  3597.                                 </h6>
  3598.                                 <p class="text-muted small mb-4">Nous vous enverrons le RIB et la facture proforma par email</p>
  3599.                                 
  3600.                                 <form id="rib-form" method="post" action="{{ path('bank_transfer_request') }}" data-event="rib_request_submit">
  3601.                                     <div class="mb-4">
  3602.                                         <label for="rib_fullname" class="form-label fw-semibold">
  3603.                                             <i class="bi bi-person me-1"></i>Nom & prénom *
  3604.                                         </label>
  3605.                                         <input id="rib_fullname" name="full_name" class="form-control form-control-lg" required 
  3606.                                                placeholder="Ex: Marie Dupont" autocomplete="name">
  3607.                                     </div>
  3608.                                     
  3609.                                     <div class="mb-4">
  3610.                                         <label for="rib_email" class="form-label fw-semibold">
  3611.                                             <i class="bi bi-envelope me-1"></i>Email de facturation *
  3612.                                         </label>
  3613.                                         <input id="rib_email" name="billing_email" type="email" class="form-control form-control-lg" required 
  3614.                                                placeholder="Ex: comptabilite@ecole.fr" autocomplete="email">
  3615.                                     </div>
  3616.                                     <div class="mb-4">
  3617.                                         <label for="rib_company" class="form-label fw-semibold">
  3618.                                             <i class="bi bi-building me-1"></i>Nom de la structure
  3619.                                         </label>
  3620.                                         <input id="rib_company" name="company" class="form-control form-control-lg" 
  3621.                                                placeholder="Ex: École Primaire Jean Moulin" autocomplete="organization">
  3622.                                     </div>
  3623.                                     <!-- Contexte pack (sera rempli dynamiquement) -->
  3624.                                     <input type="hidden" name="pack_id" id="rib_pack_id" value="">
  3625.                                     <!-- reCAPTCHA v3 token -->
  3626.                                     <input type="hidden" name="recaptcha_token" id="rib_recaptcha_token" value="">
  3627.                                     <div class="d-grid">
  3628.                                         <button class="btn btn-info btn-lg py-3" id="rib-submit" type="submit" data-cta="rib_request" data-loc="wire">
  3629.                                             <i class="bi bi-bank me-2"></i>Obtenir le RIB instantanément
  3630.                                         </button>
  3631.                                     </div>
  3632.                                     
  3633.                                     <p class="text-muted text-center small mt-3 mb-0">
  3634.                                         <i class="bi bi-shield-check me-1"></i>
  3635.                                         Sécurisé • Données hébergées en France • Conforme RGPD
  3636.                                     </p>
  3637.                                 </form>
  3638.                             </div>
  3639.                         </div>
  3640.                     </div>
  3641.                     <!-- Colonne RIB -->
  3642.                     <div class="col-lg-7">
  3643.                         <div id="rib-panel" class="card border-info" style="display: none;">
  3644.                             <div class="card-header bg-info text-white">
  3645.                                 <h6 class="mb-0">
  3646.                                     <i class="bi bi-bank me-2"></i>Coordonnées bancaires 5sur5séjour
  3647.                                 </h6>
  3648.                             </div>
  3649.                             <div class="card-body p-4">
  3650.                                 <div class="row g-4">
  3651.                                     <div class="col-md-6">
  3652.                                         <div class="border-bottom pb-2 mb-2">
  3653.                                             <div class="text-muted small text-uppercase fw-bold">Titulaire du compte</div>
  3654.                                             <div class="h6 mb-0">S.A.S. TRUST CONSEILS</div>
  3655.                                         </div>
  3656.                                     </div>
  3657.                                     <div class="col-md-6">
  3658.                                         <div class="border-bottom pb-2 mb-2">
  3659.                                             <div class="text-muted small text-uppercase fw-bold">Banque</div>
  3660.                                             <div class="h6 mb-0">CR CENTRE EST</div>
  3661.                                         </div>
  3662.                                     </div>
  3663.                                     <div class="col-12">
  3664.                                         <div class="border-bottom pb-2 mb-2">
  3665.                                             <div class="text-muted small text-uppercase fw-bold">IBAN</div>
  3666.                                             <div class="d-flex align-items-center gap-3">
  3667.                                                 <code id="iban-text" class="user-select-all h6 mb-0 text-primary">FR76 1780 6009 6304 1603 4748 776</code>
  3668.                                                 <button type="button" class="btn btn-outline-primary" data-cta="copy_iban" aria-label="Copier l'IBAN" onclick="copyToClipboard('iban-text', this)">
  3669.                                                     <i class="bi bi-clipboard me-1"></i>Copier
  3670.                                                 </button>
  3671.                                             </div>
  3672.                                         </div>
  3673.                                     </div>
  3674.                                     <div class="col-md-6">
  3675.                                         <div class="border-bottom pb-2 mb-2">
  3676.                                             <div class="text-muted small text-uppercase fw-bold">Code BIC</div>
  3677.                                             <div class="d-flex align-items-center gap-3">
  3678.                                                 <code id="bic-text" class="user-select-all h6 mb-0 text-primary">AGRIFRPP878</code>
  3679.                                                 <button type="button" class="btn btn-outline-primary btn-sm" data-cta="copy_bic" aria-label="Copier le BIC" onclick="copyToClipboard('bic-text', this)">
  3680.                                                     <i class="bi bi-clipboard"></i>
  3681.                                                 </button>
  3682.                                             </div>
  3683.                                         </div>
  3684.                                     </div>
  3685.                                     <div class="col-md-6">
  3686.                                         <div class="border-bottom pb-2 mb-2">
  3687.                                             <div class="text-muted small text-uppercase fw-bold">Référence à indiquer</div>
  3688.                                             <div class="h6 mb-0 text-success">PACK-PRO-<span id="rib-ref-date"></span></div>
  3689.                                         </div>
  3690.                                     </div>
  3691.                                 </div>
  3692.                                 <div class="alert alert-success mt-4" role="alert">
  3693.                                     <i class="bi bi-check-circle me-2"></i>
  3694.                                     <strong>Email envoyé !</strong> Vous recevrez le RIB et la facture proforma à <span id="rib-email-echo" class="fw-bold">votre adresse</span>.
  3695.                                 </div>
  3696.                                 <div class="d-flex flex-wrap gap-3 mt-4">
  3697.                                     <a class="btn btn-primary" href="#" id="proforma-download-link" data-cta="download_proforma">
  3698.                                         <i class="bi bi-download me-2"></i>Télécharger la facture proforma
  3699.                                     </a>
  3700.                                     <a class="btn btn-outline-secondary" href="https://calendly.com/5sur5sejour/demo" target="_blank" data-cta="book_call">
  3701.                                         <i class="bi bi-telephone me-2"></i>Planifier un appel
  3702.                                     </a>
  3703.                                 </div>
  3704.                                 <div class="text-muted small mt-3">
  3705.                                     <i class="bi bi-info-circle me-1"></i>
  3706.                                     Activation de votre compte sous 48h après réception du virement.
  3707.                                 </div>
  3708.                             </div>
  3709.                         </div>
  3710.                         <!-- Message d'attente -->
  3711.                         <div id="rib-waiting" class="text-center p-5">
  3712.                             <i class="bi bi-bank2 text-muted" style="font-size: 4rem;"></i>
  3713.                             <h5 class="text-muted mt-3">Remplissez le formulaire pour obtenir le RIB</h5>
  3714.                             <p class="text-muted">Vos coordonnées bancaires apparaîtront ici instantanément</p>
  3715.                         </div>
  3716.                     </div>
  3717.                 </div>
  3718.             </div>
  3719.         </div>
  3720.     </div>
  3721. </div>
  3722. <script>
  3723. document.addEventListener('DOMContentLoaded', function() {
  3724.     console.log('✅ Page Accueil - Modale checkout initialisée');
  3725.     
  3726.     // Mapping des packs
  3727.     const packLabels = {
  3728.         'access': 'Pack Accès',
  3729.         'serenite': 'Pack Sérénité',
  3730.         'pro_illimite': 'Partenariat à la performance ✨'
  3731.     };
  3732.     
  3733.     // Récupérer le pack sélectionné lors de l'ouverture de la modale
  3734.     const checkoutModal = document.getElementById('checkoutChoiceModal');
  3735.     const bankTransferModal = document.getElementById('bankTransferModal');
  3736.     let selectedPack = null;
  3737.     let selectedPackPrice = null;
  3738.     
  3739.     if (checkoutModal) {
  3740.         checkoutModal.addEventListener('show.bs.modal', function(event) {
  3741.             const button = event.relatedTarget;
  3742.             selectedPack = button.getAttribute('data-pack');
  3743.             selectedPackPrice = button.getAttribute('data-pack-price');
  3744.             console.log('📦 Pack sélectionné:', selectedPack, '- Prix:', selectedPackPrice + '€');
  3745.             
  3746.             // Afficher le récapitulatif du pack
  3747.             const packSummary = document.getElementById('packSummary');
  3748.             const packName = document.getElementById('packName');
  3749.             const packPrice = document.getElementById('packPrice');
  3750.             
  3751.             if (packSummary && packName && packPrice) {
  3752.                 packName.textContent = packLabels[selectedPack] || selectedPack;
  3753.                 packPrice.textContent = selectedPackPrice + ' € / an';
  3754.                 packSummary.style.display = 'flex';
  3755.             }
  3756.         });
  3757.     }
  3758.     
  3759.     // Transférer le pack sélectionné au modal RIB
  3760.     if (bankTransferModal) {
  3761.         bankTransferModal.addEventListener('show.bs.modal', function(event) {
  3762.             console.log('📦 Ouverture modal RIB avec pack:', selectedPack);
  3763.             // Remplir le champ caché avec le pack sélectionné
  3764.             const ribPackIdField = document.getElementById('rib_pack_id');
  3765.             if (ribPackIdField) {
  3766.                 ribPackIdField.value = selectedPack || '';
  3767.                 console.log('✅ Pack ID défini dans le formulaire:', ribPackIdField.value);
  3768.                 
  3769.                 // ALERTE SI PAS DE PACK SÉLECTIONNÉ
  3770.                 if (!selectedPack) {
  3771.                     console.warn('⚠️ ATTENTION: Aucun pack sélectionné ! La commande ne sera pas créée.');
  3772.                     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.');
  3773.                 }
  3774.             }
  3775.         });
  3776.     }
  3777.     
  3778.     // =========================
  3779.     // GESTION DU FORMULAIRE RIB
  3780.     // =========================
  3781.     const ribForm = document.getElementById('rib-form');
  3782.     const ribSubmit = document.getElementById('rib-submit');
  3783.     const ribPanel = document.getElementById('rib-panel');
  3784.     const ribWaiting = document.getElementById('rib-waiting');
  3785.     const ribEmailEcho = document.getElementById('rib-email-echo');
  3786.     const ribRefDate = document.getElementById('rib-ref-date');
  3787.     const proformaDownloadLink = document.getElementById('proforma-download-link');
  3788.     
  3789.     if (ribForm && ribSubmit) {
  3790.         // Set current date for reference
  3791.         if (ribRefDate) {
  3792.             const now = new Date();
  3793.             const dateStr = now.getFullYear().toString().slice(-2) + 
  3794.                            (now.getMonth() + 1).toString().padStart(2, '0') + 
  3795.                            now.getDate().toString().padStart(2, '0');
  3796.             ribRefDate.textContent = dateStr;
  3797.         }
  3798.         
  3799.         ribForm.addEventListener('submit', function(e) {
  3800.             e.preventDefault();
  3801.             
  3802.             // Get form data
  3803.             const formData = new FormData(ribForm);
  3804.             const fullName = formData.get('full_name');
  3805.             const billingEmail = formData.get('billing_email');
  3806.             const company = formData.get('company');
  3807.             const packId = formData.get('pack_id');
  3808.             
  3809.             // Validation
  3810.             if (!fullName || fullName.trim().length < 2) {
  3811.                 showFieldError('rib_fullname', 'Veuillez saisir votre nom complet');
  3812.                 return;
  3813.             }
  3814.             
  3815.             if (!billingEmail || !isValidEmail(billingEmail)) {
  3816.                 showFieldError('rib_email', 'Veuillez saisir une adresse email valide');
  3817.                 return;
  3818.             }
  3819.             
  3820.             // Clear any previous errors
  3821.             clearFieldErrors();
  3822.             
  3823.             // Show loading state
  3824.             ribSubmit.disabled = true;
  3825.             ribSubmit.innerHTML = '<i class="bi bi-hourglass-split me-2"></i>Envoi en cours...';
  3826.             
  3827.             // Fonction pour envoyer le formulaire
  3828.             const submitForm = function(recaptchaToken) {
  3829.                 if (recaptchaToken) {
  3830.                     formData.set('recaptcha_token', recaptchaToken);
  3831.                     document.getElementById('rib_recaptcha_token').value = recaptchaToken;
  3832.                 }
  3833.                 
  3834.             fetch('{{ path("bank_transfer_request") }}', {
  3835.                 method: 'POST',
  3836.                 body: formData
  3837.             })
  3838.             .then(res => res.json())
  3839.             .then(data => {
  3840.                 if (data.success) {
  3841.                     showRibSuccess(billingEmail, fullName, company, data.requestNumber);
  3842.                 } else {
  3843.                     throw new Error(data.message || 'Erreur lors de l\'envoi');
  3844.                 }
  3845.             })
  3846.             .catch(err => {
  3847.                 alert('❌ Erreur : ' + err.message);
  3848.                 ribSubmit.disabled = false;
  3849.                 ribSubmit.innerHTML = '<i class="bi bi-bank me-2"></i>Obtenir le RIB instantanément';
  3850.             });
  3851.             };
  3852.             
  3853.             // Obtenir le token reCAPTCHA v3 si disponible
  3854.             {% if recaptcha_site_key is defined and recaptcha_site_key %}
  3855.             if (typeof grecaptcha !== 'undefined') {
  3856.                 grecaptcha.ready(function() {
  3857.                     grecaptcha.execute('{{ recaptcha_site_key }}', {action: 'rib_request'}).then(function(token) {
  3858.                         submitForm(token);
  3859.                     }).catch(function(err) {
  3860.                         console.warn('reCAPTCHA error:', err);
  3861.                         submitForm(null); // Envoyer sans token en cas d'erreur
  3862.                     });
  3863.                 });
  3864.             } else {
  3865.                 submitForm(null);
  3866.             }
  3867.             {% else %}
  3868.             submitForm(null);
  3869.             {% endif %}
  3870.         });
  3871.     }
  3872.     
  3873.     function showFieldError(fieldId, message) {
  3874.         const field = document.getElementById(fieldId);
  3875.         if (field) {
  3876.             field.classList.add('is-invalid');
  3877.             
  3878.             // Remove existing error message
  3879.             const existingError = field.parentNode.querySelector('.invalid-feedback');
  3880.             if (existingError) {
  3881.                 existingError.remove();
  3882.             }
  3883.             
  3884.             // Add new error message
  3885.             const errorDiv = document.createElement('div');
  3886.             errorDiv.className = 'invalid-feedback';
  3887.             errorDiv.textContent = message;
  3888.             field.parentNode.appendChild(errorDiv);
  3889.         }
  3890.     }
  3891.     
  3892.     function clearFieldErrors() {
  3893.         const invalidFields = document.querySelectorAll('.is-invalid');
  3894.         invalidFields.forEach(field => {
  3895.             field.classList.remove('is-invalid');
  3896.         });
  3897.         
  3898.         const errorMessages = document.querySelectorAll('.invalid-feedback');
  3899.         errorMessages.forEach(error => {
  3900.             error.remove();
  3901.         });
  3902.     }
  3903.     
  3904.     function showRibSuccess(email, name, company, requestNumber) {
  3905.         // Hide waiting message
  3906.         if (ribWaiting) {
  3907.             ribWaiting.style.display = 'none';
  3908.         }
  3909.         
  3910.         // Show RIB panel
  3911.         if (ribPanel) {
  3912.             ribPanel.style.display = 'block';
  3913.         }
  3914.         
  3915.         // Update email echo
  3916.         if (ribEmailEcho) {
  3917.             ribEmailEcho.textContent = email;
  3918.         }
  3919.         
  3920.         // Generate proforma download link
  3921.         if (proformaDownloadLink && requestNumber) {
  3922.             proformaDownloadLink.href = '/proforma-download/' + requestNumber;
  3923.         }
  3924.         
  3925.         // Scroll to RIB panel
  3926.         if (ribPanel) {
  3927.             ribPanel.scrollIntoView({ behavior: 'smooth', block: 'start' });
  3928.         }
  3929.         
  3930.         // Reset button
  3931.         if (ribSubmit) {
  3932.             ribSubmit.disabled = false;
  3933.             ribSubmit.innerHTML = '<i class="bi bi-bank me-2"></i>Obtenir le RIB instantanément';
  3934.         }
  3935.         
  3936.         console.log('✅ RIB request submitted:', { name, email, company });
  3937.     }
  3938.     
  3939.     function isValidEmail(email) {
  3940.         const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  3941.         return emailRegex.test(email);
  3942.     }
  3943.     
  3944.     // Gérer le clic sur "Payer & activer" (Stripe)
  3945.     document.querySelector('[data-cta="checkout_online"]')?.addEventListener('click', function() {
  3946.         alert('Paiement Stripe en cours de développement\n\nPack : ' + selectedPack + '\nPrix : ' + selectedPackPrice + '€');
  3947.     });
  3948.     
  3949.     // Gérer le clic sur "Recevoir le devis"
  3950.     document.querySelector('[data-cta="checkout_quote"]')?.addEventListener('click', function() {
  3951.         alert('Génération de devis en cours de développement\n\nPack : ' + selectedPack + '\nPrix : ' + selectedPackPrice + '€');
  3952.     });
  3953. });
  3954. // Copy to clipboard function
  3955. function copyToClipboard(elementId, button) {
  3956.     const element = document.getElementById(elementId);
  3957.     if (element) {
  3958.         const text = element.textContent;
  3959.         navigator.clipboard.writeText(text).then(() => {
  3960.             // Show success feedback
  3961.             const originalText = button.innerHTML;
  3962.             button.innerHTML = '<i class="bi bi-check"></i> Copié !';
  3963.             button.classList.remove('btn-outline-primary');
  3964.             button.classList.add('btn-success');
  3965.             
  3966.             setTimeout(() => {
  3967.                 button.innerHTML = originalText;
  3968.                 button.classList.remove('btn-success');
  3969.                 button.classList.add('btn-outline-primary');
  3970.             }, 2000);
  3971.         }).catch(err => {
  3972.             console.error('Erreur copie:', err);
  3973.             alert('Impossible de copier. Copiez manuellement : ' + text);
  3974.         });
  3975.     }
  3976. }
  3977. // Gestion du formulaire grand volume
  3978. const grandVolumeForm = document.getElementById('grandVolumeForm');
  3979. const formMessage = document.getElementById('formMessage');
  3980. if (grandVolumeForm) {
  3981.   grandVolumeForm.addEventListener('submit', function(e) {
  3982.     e.preventDefault();
  3983.     
  3984.     // Désactiver le bouton pendant l'envoi
  3985.     const submitBtn = grandVolumeForm.querySelector('button[type="submit"]');
  3986.     const originalText = submitBtn.innerHTML;
  3987.     submitBtn.disabled = true;
  3988.     submitBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-2"></span>Envoi en cours...';
  3989.     
  3990.     // Masquer les messages précédents
  3991.     formMessage.innerHTML = '';
  3992.     formMessage.className = 'mt-3';
  3993.     
  3994.     // Récupérer les données du formulaire
  3995.     const formData = new FormData(grandVolumeForm);
  3996.     
  3997.     // Envoyer la requête
  3998.     fetch('/contact/grand-volume', {
  3999.       method: 'POST',
  4000.       body: formData,
  4001.       headers: {
  4002.         'X-Requested-With': 'XMLHttpRequest'
  4003.       }
  4004.     })
  4005.     .then(response => response.json())
  4006.     .then(data => {
  4007.       if (data.success) {
  4008.         // Fermer le modal du formulaire
  4009.         const formModal = bootstrap.Modal.getInstance(document.getElementById('grandVolumeModal'));
  4010.         if (formModal) formModal.hide();
  4011.         
  4012.         // Réinitialiser le formulaire
  4013.         grandVolumeForm.reset();
  4014.         
  4015.         // Afficher le modal de succès
  4016.         const successModal = new bootstrap.Modal(document.getElementById('grandVolumeSuccessModal'));
  4017.         successModal.show();
  4018.       } else {
  4019.         formMessage.className = 'mt-3 alert alert-danger';
  4020.         formMessage.innerHTML = `
  4021.           <div class="d-flex align-items-center">
  4022.             <i class="bi bi-exclamation-triangle-fill me-2 fs-5"></i>
  4023.             <div>
  4024.               <strong>Erreur :</strong><br>
  4025.               ${data.message || 'Une erreur est survenue. Veuillez réessayer.'}
  4026.             </div>
  4027.           </div>
  4028.         `;
  4029.       }
  4030.     })
  4031.     .catch(error => {
  4032.       console.error('Erreur:', error);
  4033.       formMessage.className = 'mt-3 alert alert-danger';
  4034.       formMessage.innerHTML = `
  4035.         <div class="d-flex align-items-center">
  4036.           <i class="bi bi-exclamation-triangle-fill me-2 fs-5"></i>
  4037.           <div>
  4038.             <strong>Erreur :</strong><br>
  4039.             Une erreur est survenue lors de l'envoi. Veuillez réessayer plus tard.
  4040.           </div>
  4041.         </div>
  4042.       `;
  4043.     })
  4044.     .finally(() => {
  4045.       submitBtn.disabled = false;
  4046.       submitBtn.innerHTML = originalText;
  4047.     });
  4048.   });
  4049. }
  4050. </script>
  4051. <!-- MODAL FORMULAIRE GRAND VOLUME -->
  4052.   <!-- MODAL FORMULAIRE GRAND VOLUME -->
  4053.   <div class="modal fade" id="grandVolumeModal" tabindex="-1" aria-labelledby="grandVolumeModalLabel" aria-hidden="true">
  4054.     <div class="modal-dialog modal-dialog-centered modal-lg">
  4055.       <div class="modal-content">
  4056.         <div class="modal-header border-0 pb-0">
  4057.           <h5 class="modal-title w-100 text-center" id="grandVolumeModalLabel">
  4058.             <i class="bi bi-envelope me-2"></i>Demande de devis - Grand volume (+25 séjours/an)
  4059.           </h5>
  4060.           <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  4061.         </div>
  4062.         <div class="modal-body px-4 py-4">
  4063.           <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>
  4064.           
  4065.           <form id="grandVolumeForm" method="post" action="/contact/grand-volume">
  4066.             <div class="row g-3">
  4067.               <div class="col-md-6">
  4068.                 <label for="nom_structure" class="form-label">Nom de la structure <span class="text-danger">*</span></label>
  4069.                 <input type="text" class="form-control" id="nom_structure" name="nom_structure" required>
  4070.               </div>
  4071.               <div class="col-md-6">
  4072.                 <label for="type_structure" class="form-label">Type de structure <span class="text-danger">*</span></label>
  4073.                 <select class="form-select" id="type_structure" name="type_structure" required>
  4074.                   <option value="">Sélectionnez...</option>
  4075.                   <option value="ecole">École</option>
  4076.                   <option value="centre_loisirs">Centre de loisirs</option>
  4077.                   <option value="association">Association</option>
  4078.                   <option value="voyagiste">Voyagiste</option>
  4079.                   <option value="autre">Autre</option>
  4080.                 </select>
  4081.               </div>
  4082.               <div class="col-md-6">
  4083.                 <label for="nombre_sejours" class="form-label">Nombre de séjours par an <span class="text-danger">*</span></label>
  4084.                 <input type="number" class="form-control" id="nombre_sejours" name="nombre_sejours" min="26" required placeholder="Ex: 30, 50, 100...">
  4085.                 <div class="form-text">Minimum 26 séjours par an</div>
  4086.               </div>
  4087.               <div class="col-md-6">
  4088.                 <label for="contact_email" class="form-label">Email <span class="text-danger">*</span></label>
  4089.                 <input type="email" class="form-control" id="contact_email" name="contact_email" required>
  4090.               </div>
  4091.               <div class="col-md-6">
  4092.                 <label for="contact_telephone" class="form-label">Téléphone <span class="text-danger">*</span></label>
  4093.                 <input type="tel" class="form-control" id="contact_telephone" name="contact_telephone" required>
  4094.               </div>
  4095.               <div class="col-12">
  4096.                 <label for="message" class="form-label">Message (optionnel)</label>
  4097.                 <textarea class="form-control" id="message" name="message" rows="4" placeholder="Décrivez vos besoins spécifiques, vos contraintes, vos questions..."></textarea>
  4098.               </div>
  4099.               <div class="col-12">
  4100.                 <div class="form-check">
  4101.                   <input class="form-check-input" type="checkbox" id="accept_rgpd" name="accept_rgpd" required>
  4102.                   <label class="form-check-label" for="accept_rgpd">
  4103.                     J'accepte que mes données soient utilisées pour me recontacter concernant cette demande de devis. <span class="text-danger">*</span>
  4104.                   </label>
  4105.                 </div>
  4106.               </div>
  4107.             </div>
  4108.             <div id="formMessage" class="mt-3"></div>
  4109.             <div class="d-grid gap-2 mt-4">
  4110.               <button type="submit" class="btn btn-primary btn-lg">
  4111.                 <i class="bi bi-send me-2"></i>Envoyer la demande
  4112.               </button>
  4113.               <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Annuler</button>
  4114.             </div>
  4115.           </form>
  4116.         </div>
  4117.       </div>
  4118.     </div>
  4119.   </div>
  4120.   {# Drawer Création Séjour #}
  4121.   {% include 'components/drawer-sejour.html.twig' %}
  4122.   {# Google reCAPTCHA v3 #}
  4123.   {% if recaptcha_site_key is defined and recaptcha_site_key %}
  4124.   <script src="https://www.google.com/recaptcha/api.js?render={{ recaptcha_site_key }}"></script>
  4125.   {% endif %}
  4126.   </body>
  4127. </html>