templates/privatisation/tunnel.html.twig line 1

Open in your IDE?
  1. {% extends 'vitrine/base.html.twig' %}
  2. {% import 'vitrine/macros/svg_illustration_macros.twig' as svg %}
  3. {% block title "Réserver" %}
  4. {% block description %}{% trans %}Réservez votre moment de détente{% endtrans %}{% endblock %}
  5. {% block stylesheets %}
  6.     {{ parent() }}
  7.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
  8.     {{ encore_entry_link_tags('tunnel') }}
  9. {% endblock %}
  10. {% block javascripts %}
  11.     {{ parent() }}
  12.     {{ encore_entry_script_tags('tunnel') }}
  13.     <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
  14.     <script type="text/javascript" src="https://api.payplug.com/js/1/form.latest.js"></script>
  15.     <script src="https://js.hcaptcha.com/1/api.js" async defer></script>
  16.     <script async defer src="https://api.mapbox.com/mapbox-assembly/v1.5.1/assembly.js"></script>
  17.     <script id="search-js" defer="" src="https://api.mapbox.com/search-js/v1.0.0-beta.21/web.js"></script>
  18.     <script>
  19.         const ACCESS_TOKEN = '{{ mapbox_access_token }}';
  20.         const COUNTRIES = '{{ mapbox_countries  }}'.split(',');
  21.         const script = document.getElementById('search-js');
  22.         script.onload = () => {
  23.             const collection = mapboxsearch.autofill({
  24.                 accessToken: ACCESS_TOKEN,
  25.                 options: { COUNTRIES }
  26.             });
  27.         };
  28.     </script>
  29.     {% include 'form/components/js-translations.html.twig' %}
  30. {% endblock %}
  31. {% block main %}
  32.     <div id="background-override">
  33.         <video data-step="start" class="background-video" src="https://i.gyazo.com/d9d0bd5636691cfdf72d4db0a4132c09.mp4" muted playsinline autoplay loop></video>
  34.         <img data-step="second-step" class="background-image tunnel-hidden" src="https://i.gyazo.com/b7d32e07063d6a51fc24bfe3b70da6ca.jpg">
  35.         <img data-step="third-step" class="background-image tunnel-hidden" src="https://i.gyazo.com/84c7b90fc6ff6c31478eae19f38bd03d.jpg">
  36.     </div>
  37.     {% form_theme form 'form/theme_tunnel.html.twig' %}
  38.     {{ form_start(form, { 'attr': { 'class': 'to-submit w-full' }}) }}
  39.     <div class="not-animate-childs pt-32 justify-items-center">
  40.         <div id="progress-bar" class="progress-bar-container tunnel-hidden" style="{{ code is defined ? "display: none" : "" }}">
  41.             <p class="progress-bar-steps">
  42.                 Étape <span id="step-count">1</span> sur 5
  43.             </p>
  44.             <div class="progress-bar">
  45.                 <div class="progress-bar-fill"></div>
  46.             </div>
  47.         </div>
  48.         <section id="start" class="tunnel-hidden content-column-center-48">
  49.             <h2 class="title text-center mt-24 text-4xl">
  50.                 La bulle {% trans %}(privatisation){% endtrans %}
  51.             </h2>
  52.             <p class="text-opacity-70 text-center">
  53.                 {% trans %}Séduit par notre concept atypique ?<br><br>
  54.                 Privatisez-le pour une expérience exclusive ! Que ce soit pour célébrer un anniversaire, un EVJ, ou simplement partager un moment spécial en famille, remplissez le formulaire ci-dessous. <br><br>
  55.                 Nos équipes seront à vos côtés pour planifier soigneusement votre moment de détente inoubliable avec vos proches.{% endtrans %}
  56.             </p>
  57.             <div class="tunnel-footer m-auto">
  58.                 {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Commencer' } %}
  59.             </div>
  60.         </section>
  61.         <section id="first-step" class="tunnel-hidden ">
  62.             <div class="content-column-center-48 ">
  63.                 <div class="content-column-8-center">
  64.                     <h2 class="title text-center">
  65.                         {% trans %}Combien serez-vous ?{% endtrans %}
  66.                     </h2>
  67.                     <p class="text-opacity-70 text-center">
  68.                         {% trans %}En fonction du nombre de participants, notre parcours en 3 étapes s'adapte à vos besoins :<br><br>{% endtrans %}
  69.                         {% trans %}Avec 4 baignoires duo dans le même espace, 4 à 8 participants, suivez le parcours classique : sauna, bain de bière, relaxation.<br><br>{% endtrans %}
  70.                         {% trans %}Pour des groupes de plus de 8, le parcours alterne entre les membres, offrant à chacun un confort optimal.{% endtrans %}
  71.                         {% trans %}Pendant qu'un groupe profite du sauna, l'autre déguste une bière en toute détente.{% endtrans %}
  72.                         {% trans %}Les espaces sont entièrement dédiés, permettant à tous de savourer chaque étape à leur rythme. <br><br>{% endtrans %}
  73.                         {% trans %}Transformez votre expérience en la personnalisant davantage. Optez pour des planchettes de dégustation ou ajoutez une touche spécial avec une décoration adaptée à votre événement. Partagez vos souhaits en remplissant les étapes suivantes, nous vous garantissons une réponse dans les 24 heures.{% endtrans %}
  74.                     </p>
  75.                 </div>
  76.                 <div class="my-6">
  77.                     {{ form_widget(form.nbParticipants) }}
  78.                 </div>
  79.                 <div class="tunnel-footer">
  80. {#                    <div class="infoContainer w-full text-center" style="display: none">#}
  81. {#                        <p class="stepInfo">#}
  82. {#                        </p>#}
  83. {#                    </div>#}
  84.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  85. {#                    {% include "tunnel/components/secondary-button.html.twig" with {'action': 'goToPrivatisation', 'label': "Privatiser le spa"} %}#}
  86.                 </div>
  87.             </div>
  88.         </section>
  89.         <section id="second-step" class="tunnel-hidden">
  90.             <div class="content-column-center-48">
  91.                 <h2 class="title text-center">
  92.                     {% trans %}Pour quelle durée souhaitez-vous privatiser le spa ?{% endtrans %}
  93.                 </h2>
  94.                 <div class="w-full">
  95.                     {{ form_widget(form.offer) }}
  96.                 </div>
  97.                 <div class="tunnel-footer">
  98.                     <div class="totalContainer w-full flex-between" style="display: none">
  99.                         <p class="small-text-opacity-70">
  100.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  101.                         </p>
  102.                         <p>
  103.                             <b class="totalPrice"></b>
  104.                         </p>
  105.                     </div>
  106.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  107.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': "Précédent" } %}
  108.                 </div>
  109.             </div>
  110.         </section>
  111.         <section id="third-step" class="tunnel-hidden">
  112.             <div class="content-column-center-48 ">
  113.                 <div class="content-column-8">
  114.                     <h2 class="title text-center">
  115.                         {% trans %}Un petit plaisir à ajouter ?{% endtrans %}
  116.                     </h2>
  117.                 </div>
  118.                 <div class="extra-container max-w-400">
  119.                     {{ form_row(form.extraReservations) }}
  120.                 </div>
  121.                 <div class="tunnel-footer">
  122.                     <div class="totalDifferencePriceContainer w-full flex-between" style="display: none">
  123.                         <p class="small-text-opacity-70">
  124.                             {% trans %}Supplément à régler{% endtrans %}
  125.                         </p>
  126.                         <p>
  127.                             <b>+</b><b class="totalDifferencePrice"></b>
  128.                         </p>
  129.                     </div>
  130.                     <div class="totalContainer w-full flex-between" style="display: none">
  131.                         <p class="small-text-opacity-70">
  132.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  133.                         </p>
  134.                         <p>
  135.                             <b class="totalPrice"></b>
  136.                         </p>
  137.                     </div>
  138.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  139.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': "Précédent" } %}
  140.                 </div>
  141.             </div>
  142.         </section>
  143.         <section id="fourth-step" class="tunnel-hidden">
  144.             <div class="content-column-center-48 ">
  145.                 <div class="content-column-8">
  146.                     <h2 class="title text-center">
  147.                         {% trans %}Choisissez une date{% endtrans %}
  148.                     </h2>
  149.                 </div>
  150.                 <div class="date-container max-w-400 content-column-16">
  151.                     {{ form_widget(form.date) }}
  152.                 </div>
  153.                 <div class="tunnel-footer">
  154.                     <div class="totalDifferencePriceContainer w-full flex-between" style="display: none">
  155.                         <p class="small-text-opacity-70">
  156.                             {% trans %}Supplément à régler{% endtrans %}
  157.                         </p>
  158.                         <p>
  159.                             <b>+</b><b class="totalDifferencePrice"></b>
  160.                         </p>
  161.                     </div>
  162.                     <div class="totalContainer w-full flex-between" style="display: none">
  163.                         <p class="small-text-opacity-70">
  164.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  165.                         </p>
  166.                         <p>
  167.                             <b class="totalPrice"></b>
  168.                         </p>
  169.                     </div>
  170.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  171.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': "Précédent" } %}
  172.                 </div>
  173.             </div>
  174.         </section>
  175.         <section id="fifth-step" class="tunnel-hidden">
  176.             <div class="content-column-center-48">
  177.                 <div class="content-column-8-center">
  178.                     <h2 class="title text-center">
  179.                         {% trans %}Récapitulons{% endtrans %}
  180.                     </h2>
  181.                 </div>
  182.                 <div class="content-row-48-center max-w-1200">
  183.                     <div class="gsap-sticky">
  184.                         {% include "tunnel/components/recapitulatif.html.twig" %}
  185.                     </div>
  186.                     <div class="contact-container wrapper-form-right flex-1">
  187.                         <div class="content-column-16">
  188.                             <h2 class="p-16-0">
  189.                                 {% trans %}Contact{% endtrans %}
  190.                             </h2>
  191.                             <div class="content-column-16">
  192.                                 <div class="input-wrapper">
  193.                                     <label class="content-column-8">
  194.                                         {% trans %}Prénom{% endtrans %} *
  195.                                         {{ form_widget(form.contactData.firstname) }}
  196.                                     </label>
  197.                                     <hr>
  198.                                     <label class="content-column-8">
  199.                                         {% trans %}Nom{% endtrans %} *
  200.                                         {{ form_widget(form.contactData.lastname) }}
  201.                                     </label>
  202.                                 </div>
  203.                                 <div class="input-wrapper">
  204.                                     <label class="content-column-8">
  205.                                         {% trans %}Email{% endtrans %} *
  206.                                         {{ form_widget(form.contactData.email) }}
  207.                                     </label>
  208.                                 </div>
  209.                                 <div class="input-wrapper">
  210.                                     <label class="content-column-8">
  211.                                         {% trans %}Entreprise{% endtrans %}
  212.                                         {{ form_widget(form.contactData.company) }}
  213.                                     </label>
  214.                                 </div>
  215.                                 <div class="input-wrapper">
  216.                                     <label class="content-column-8">
  217.                                         {% trans %}Téléphone{% endtrans %} *
  218.                                         {{ form_widget(form.contactData.phoneNumber) }}
  219.                                     </label>
  220.                                 </div>
  221.                                 <div class="input-wrapper">
  222.                                     <label class="content-column-8">
  223.                                         {% trans %}Adresse{% endtrans %} *
  224.                                         {{ form_widget(form.contactData.address) }}
  225.                                     </label>
  226.                                 </div>
  227.                                 <div class="input-wrapper">
  228.                                     <label class="content-column-8">
  229.                                         {% trans %}Ville{% endtrans %} *
  230.                                         {{ form_widget(form.contactData.city) }}
  231.                                     </label>
  232.                                     <hr>
  233.                                     <label class="content-column-8">
  234.                                         {% trans %}Code postal{% endtrans %} *
  235.                                         {{ form_widget(form.contactData.postalCode) }}
  236.                                     </label>
  237.                                 </div>
  238.                                 <div class="input-wrapper">
  239.                                     <label class="content-column-8">
  240.                                         {% trans %}Pays{% endtrans %} *
  241.                                         {{ form_widget(form.contactData.country) }}
  242.                                     </label>
  243.                                 </div>
  244.                             </div>
  245.                             <h2 class="p-16-0">
  246.                                 {% trans %}Demande d'information{% endtrans %}
  247.                             </h2>
  248.                             <div class="content-column-16">
  249.                                 <div class="input-wrapper">
  250.                                     <label class="content-column-8">
  251.                                         {% trans %}Commentaire{% endtrans %}
  252.                                         {{ form_widget(form.clientCommentary) }}
  253.                                     </label>
  254.                                 </div>
  255.                                 <div class="input-wrapper">
  256.                                     <label class="content-row-8">
  257.                                         {{ form_widget(form.checkedAcceptPromotion) }}
  258.                                         <p>{% trans %}Vous acceptez d'être contacté pour recevoir des offres promotionnelles{% endtrans %}</p>
  259.                                     </label>
  260.                                 </div>
  261.                                 <div class="input-wrapper">
  262.                                     <label class="content-row-8">
  263.                                         {{ form_widget(form.checkedCGV) }}
  264.                                         <p>{% trans %}Vous acceptez notre{% endtrans %} <a href="#" onclick='window.open("{{ path('privacy-policy') }}");return false;' href="#">{% trans %}politique de confidentialité{% endtrans %}</a> {% trans %}et nos{% endtrans %} <a onclick='window.open("{{ path('cgv') }}");return false;' href="#">{% trans %}conditions générales{% endtrans %}</a> *</p>
  265.                                     </label>
  266.                                 </div>
  267.                             </div>
  268.                             <p style="font-size: 14px;">
  269.                                 (*) {% trans %}Champs obligatoires{% endtrans %}
  270.                             </p>
  271.                         </div>
  272.                     </div>
  273.                 </div>
  274.                 <div class="tunnel-footer">
  275.                     <div class="infoContainer w-full text-center">
  276.                         <p class="stepInfo" style="margin-bottom: 8px;">
  277.                             {% trans %}Veuillez noter qu'une demande de formulaire ne constitue pas une confirmation de réservation.{% endtrans %}
  278.                         </p>
  279.                         <p class="stepInfo">
  280.                             {% trans %}La disponibilité de la date demandée peut varier. Nos équipes vous répondront rapidement pour assurer une organisation optimale de votre événement privatif.{% endtrans %}
  281.                         </p>
  282.                     </div>
  283.                     {% include 'form/components/rgpd.html.twig' with {'sujet': 'demande'} %}
  284.                     
  285.                     <div class="h-captcha-container text-center my-4">
  286.                         <div class="h-captcha" 
  287.                              data-sitekey="{{ siteKeyHcaptcha }}" 
  288.                              data-callback="onCaptchaSuccess" 
  289.                              data-expired-callback="onCaptchaExpired"></div>
  290.                         <div id="captcha-error" class="text-red-500 mt-2" style="display: none;">
  291.                             {% trans %}Veuillez valider le captcha avant de soumettre le formulaire{% endtrans %}
  292.                         </div>
  293.                     </div>
  294.                     
  295.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'submit', 'label': 'Envoyer ma demande' } %}
  296.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'goToFirstStep', 'label': 'Modifier' } %}
  297.                 </div>
  298.             </div>
  299.         </section>
  300.     </div>
  301.     {{ form_end(form) }}
  302.     <script src="{{ asset('js/tunnel.js') }}"></script>
  303.     <script>
  304.         const oldPrice = {{ priceOffered|default(0) }};
  305.         const usingCode = {{ code is defined ? "true" : "false" }};
  306.         // hCaptcha callback when challenge is successfully completed
  307.         function onCaptchaSuccess() {
  308.             document.getElementById('captcha-error').style.display = 'none';
  309.             const submitBtn = document.querySelector('.submit-btn');
  310.             if (submitBtn) {
  311.                 submitBtn.removeAttribute('disabled');
  312.             }
  313.         }
  314.         // hCaptcha callback when verification expires
  315.         function onCaptchaExpired() {
  316.             const submitBtn = document.querySelector('.submit-btn');
  317.             if (submitBtn) {
  318.                 submitBtn.setAttribute('disabled', 'disabled');
  319.             }
  320.         }
  321.         // on dom ready
  322.         document.addEventListener('DOMContentLoaded', function() {
  323.             if (usingCode){
  324.                 updateUI(5);
  325.             }
  326.             
  327.             // Initially disable submit button
  328.             const submitBtn = document.querySelector('.submit-btn');
  329.             if (submitBtn) {
  330.                 submitBtn.setAttribute('disabled', 'disabled');
  331.             }
  332.             
  333.             // Add submit event listener to form
  334.             const form = document.querySelector('form.to-submit');
  335.             form.addEventListener('submit', function(event) {
  336.                 // Check if hCaptcha is completed
  337.                 const hcaptchaResponse = document.querySelector('textarea[name="h-captcha-response"]');
  338.                 if (!hcaptchaResponse || !hcaptchaResponse.value) {
  339.                     event.preventDefault();
  340.                     document.getElementById('captcha-error').style.display = 'block';
  341.                     // Scroll to captcha error
  342.                     document.querySelector('.h-captcha-container').scrollIntoView({
  343.                         behavior: 'smooth',
  344.                         block: 'center'
  345.                     });
  346.                     return false;
  347.                 }
  348.                 // If hCaptcha is completed, hide error message and continue submission
  349.                 document.getElementById('captcha-error').style.display = 'none';
  350.                 return true;
  351.             });
  352.         });
  353.         function openCarteCadeauModal() {
  354.             const tokenValue = prompt("Please enter your token:");
  355.             // Check if the user provided a value
  356.             if (tokenValue) {
  357.                 const baseUrl = "{{ path('reservation_carte_cadeau_tunnel') }}";
  358.                 window.location.href = `${baseUrl}?code=${encodeURIComponent(tokenValue)}`;
  359.             }
  360.         }
  361.         function createPayment() {
  362.             console.log("Nop");
  363.         }
  364.     </script>
  365. {% endblock %}