templates/vitrine/pages/faq.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 "FAQ" %}
  4. {% block description %}{% trans %}Découvrez tout l'univers du spa à la bière{% endtrans %}{% endblock %}
  5. {% block main %}
  6.     <section class="max-w-none relative h-max pt-28 overflow-hidden -z-50">
  7.         <div class="w-full h-[70vh] md:top-28 top-24 inset-0 z-0">
  8.             <img src="{{asset('/vitrine/images/heros/faq.jpg')}}" class="w-full h-full object-cover">
  9.             <div class="absolute w-full h-full top-0 pt-28 left-0 flex justify-center items-end">
  10.                 <div class="h-full p-4 mb-3 flex justify-center items-center flex-col gap-8">
  11.                     <p class="font-semibold text-7xl text-white">
  12.                         FAQ
  13.                     </p>
  14.                 </div>
  15.             </div>
  16.         </div>
  17.     </section>
  18.     
  19.     <div class="w-full flexcol items-center z-10 relative ">
  20.         {# Section FAQ #}
  21.         <section class="w-screen overflow-visible flexcol gap-10 md:gap-20 md:mt-0 mt-8">
  22.             <div class="flexcol">
  23.                 <h2>
  24.                     FAQ
  25.                 </h2>
  26.                 <h1 class="h-max md:text-6xl text-4xl font-thin font-openSans text-vitrineWhiteOpacity">
  27.                     {% trans %}Foire aux <span class="font-bold">questions</span>{% endtrans %}
  28.                 </h1>
  29.             </div>
  30.             <div class="w-full hidden md:flex justify-end relative">
  31.                 <input class="search bg-vitrineBlackOpacity border-none outline-none focus:outline-none px-4 py-4 w-[calc(50%-8px)]" type="text" placeholder="{% trans %}Écrivez votre question ici...{% endtrans %}">
  32.                 <svg class="absolute right-4 top-1/2 -translate-y-1/2 w-5 h-5 text-vitrineWhiteOpacity" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16">
  33.                     <path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0"/>
  34.                 </svg>
  35.             </div>
  36.             <div class="flex flex-col md:flex-row gap-10 md:gap-4">
  37.                 <div class="flexcol md:w-1/2">
  38.                     <div class="h-full relative">
  39.                         <div class="sticky top-32">
  40.                             <ul class="flexcol text-2xl pl-10 relative">
  41.                                 {% for category, items in faqData %}
  42.                                     <li class="flex items-center gap-4 relative">
  43.                                         <img class="ul-bulle hidden absolute top-1/2 -translate-y-1/2 -left-10 transition duration-700" src="{{asset('vitrine/images/bulles/moyenne-bulle.svg')}}" alt="Illustration bulle" aria-hidden="true">
  44.                                         <a href="#" class="category-link" data-category="{{ category | lower | replace({' ': '-'}) }}">
  45.                                             {{ category|trans }}
  46.                                         </a>
  47.                                     </li>
  48.                                 {% endfor %}
  49.                             </ul>
  50.                             <div class="h-[70dvh] md:block hidden -z-10 relative overflow-hidden">
  51.                                 {{ svg.illustration('faq', true) }}
  52.                             </div>
  53.                         </div>
  54.                     </div>
  55.                 </div>
  56.                 <div class="w-full md:hidden flex justify-end relative">
  57.                     <input class="search bg-vitrineBlackOpacity border-none outline-none focus:outline-none px-4 py-4 w-full" type="text" placeholder="{% trans %}Écrivez votre question ici...{% endtrans %}">
  58.                     <svg class="absolute right-4 top-1/2 -translate-y-1/2 w-5 h-5 text-vitrineWhiteOpacity" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16">
  59.                         <path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0"/>
  60.                     </svg>
  61.                 </div>
  62.                 <div class="flexcol gap-8 md:w-1/2 flexcol">
  63.                     {% for category, items in faqData %}
  64.                         <div id="{{ category | lower | replace({' ': '-'}) }}" class="faq-category flexcol">
  65.                             {% for item in items %}
  66.                                 <div class="flexcol toggle-response cursor-pointer bg-vitrineBlackOpacity p-4 pr-10 relative">
  67.                                     <svg class="toggle-response-svg  absolute top-4 right-4 w-5 h-5 text-vitrineOrange rotate-45 z-20 transition duration-200" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-x-lg" viewBox="0 0 16 16">
  68.                                         <path d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z"/>
  69.                                     </svg>
  70.                                     <h3 class="text-wrap">
  71.                                         {{ item.question|trans }}
  72.                                     </h3>
  73.                                     <p class="hidden response">
  74.                                         {{ item.response|trans }}
  75.                                     </p>
  76.                                 </div>
  77.                             {% endfor %}
  78.                         </div>
  79.                     {% endfor %}
  80.                 </div>
  81.             </div>
  82.         </section>
  83.         {% include "vitrine/layout/footer.html.twig" %}
  84.         
  85.     </div>
  86.     <script>
  87.         document.addEventListener("DOMContentLoaded", function() {
  88.             const categories = document.querySelectorAll('.faq-category');
  89.             const links = document.querySelectorAll('.category-link');
  90.             const bulleImages = document.querySelectorAll('.ul-bulle');
  91.             const searchInputs = document.querySelectorAll('.search'); // Sélectionne toutes les barres de recherche
  92.         
  93.             // Afficher les catégories
  94.             function displayCategories(selectedCategory) {
  95.                 links.forEach((link, linkIndex) => {
  96.                     link.classList.remove('text-vitrineOrange');
  97.                     link.classList.remove('font-semibold');
  98.                     bulleImages[linkIndex].classList.add('hidden'); // Initialise toutes les bulles à hidden
  99.                 });
  100.         
  101.                 categories.forEach(category => category.style.display = 'none'); // Cache toutes les catégories
  102.         
  103.                 if (selectedCategory === 'tout') {
  104.                     categories.forEach(category => {
  105.                         category.style.display = 'flex';
  106.                         if (category.id === 'tout') {
  107.                             category.style.display = 'none'; // Cache la catégorie "tout" dans tout les cas opur éciter un décalage dans l'affichage
  108.                         }
  109.                     });
  110.                 } else {
  111.                     document.getElementById(selectedCategory).style.display = 'flex'; // Affiche la catégorie sélectionnée
  112.                 }
  113.         
  114.                 const activeLink = document.querySelector(`[data-category="${selectedCategory}"]`); // Récupère le lien actif
  115.                 const activeLinkIndex = Array.from(links).indexOf(activeLink);  // Récupère l'index du lien actif
  116.         
  117.                 activeLink.classList.add('text-vitrineOrange');
  118.                 activeLink.classList.add('font-semibold');
  119.                 bulleImages[activeLinkIndex].classList.remove('hidden'); // Affiche la bulle pour la catégorie sélectionnée
  120.             }
  121.         
  122.             // Recherche
  123.             searchInputs.forEach(input => {
  124.                 input.addEventListener('input', function() {
  125.                     const searchValue = this.value.toLowerCase();
  126.         
  127.                     categories.forEach(category => {
  128.                         const questions = category.querySelectorAll('h3');
  129.                         const responses = category.querySelectorAll('.response');
  130.                         let categoryHasMatch = false; // Vérifie si la catégorie a une correspondance
  131.         
  132.                         questions.forEach((question, questionIndex) => {
  133.                             const questionText = question.textContent.toLowerCase();
  134.                             const responseText = responses[questionIndex].textContent.toLowerCase();
  135.                             if (questionText.includes(searchValue) || responseText.includes(searchValue)) { // Vérifie si la question ou la réponse contient la recherche
  136.                                 question.parentElement.style.display = 'flex';
  137.                                 categoryHasMatch = true; // La catégorie a une correspondance
  138.                             } else {
  139.                                 question.parentElement.style.display = 'none';
  140.                             }
  141.                         });
  142.         
  143.                         if (searchValue === '') {
  144.                             category.style.display = 'flex';
  145.                             questions.forEach(question => {
  146.                                 question.parentElement.style.display = 'flex';
  147.                             });
  148.                         } else {
  149.                             category.style.display = categoryHasMatch ? 'flex' : 'none'; // Affiche la catégorie si elle a une correspondance
  150.                         }
  151.                     });
  152.                 });
  153.             });
  154.         
  155.             // Affiche la catégorie par défaut
  156.             const initialCategory = 'tout'; // Categorie par default
  157.             displayCategories(initialCategory);
  158.         
  159.             // L'événement click sur les liens
  160.             links.forEach(link => {
  161.                 link.addEventListener('click', function(event) {
  162.                     event.preventDefault();
  163.                     const selectedCategory = this.getAttribute('data-category');
  164.                     displayCategories(selectedCategory);
  165.                 });
  166.             });
  167.         
  168.             // Toggle response
  169.             const toggleResponseContainers = document.querySelectorAll('.toggle-response');
  170.         
  171.             toggleResponseContainers.forEach(responseContainer => {
  172.                 responseContainer.addEventListener('click', function() {
  173.                     const response = this.querySelector('.response');
  174.                     const svg = this.querySelector('.toggle-response-svg');
  175.                     response.classList.toggle('hidden');
  176.         
  177.                     svg.classList.toggle('rotate-0');
  178.                     svg.classList.toggle('text-vitrineWhiteOpacity');
  179.                 });
  180.             });
  181.         });
  182.     </script>
  183. {% endblock %}