templates/components/nav_landing.html.twig line 1

  1. <nav class="sticky bg-white w-full fixed z-[9999] top-0 left-0 border-b border-gray-200">
  2.     <div class="flex items-center justify-between px-4 py-2 container mx-auto">
  3.         <!-- Logo -->
  4.         <a href="{{ path('home') }}" class="flex items-center">
  5.             <img src="{{ asset('images/site/logo.png') }}" class="h-12 mr-3 sm:h-16" alt="Roomlers Logo">
  6.             <span class="self-center text-xl font-semibold uppercase whitespace-nowrap">Roomlers</span>
  7.         </a>
  8.         <!-- Bouton Burger pour mobile/tablette -->
  9.         <button id="mobileMenuButton" class="lg:hidden p-2 rounded-md text-gray-700 hover:text-gray-900 hover:bg-gray-100 focus:outline-none">
  10.             <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
  11.                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
  12.             </svg>
  13.         </button>
  14.         <!-- Conteneur pour les éléments alignés à droite (version desktop) -->
  15.         <div class="nav-links hidden lg:flex items-center space-x-4">
  16.             <!-- Onglet "Pré-réservation de logement" -->
  17.             <a href="{{ path('attestation') }}" class="px-4 py-2 text-black rounded-lg font-semibold hover:underline">
  18.                 {{ 'nav_landing.accommodation_prereservation'|trans }}
  19.             </a>
  20.             <!-- Liste déroulante pour la langue -->
  21.             <div class="relative">
  22.                 <button class="language-dropdown flex items-center px-4 py-2 text-black rounded-lg font-semibold hover:underline">
  23.                     <img src="{{ asset('images/flagfr.png') }}" class="w-6 h-4 mr-2" alt="France Flag">
  24.                     <svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
  25.                         <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
  26.                     </svg>
  27.                 </button>
  28.                 <div class="language-menu hidden absolute right-0 mt-2 w-40 bg-white border border-gray-200 rounded-lg shadow-lg">
  29.     <a href="#" data-language="fr" class="flex items-center px-4 py-2 hover:bg-gray-100">
  30.         <img src="{{ asset('images/flagfr.png') }}" class="w-6 h-4 mr-3" alt="France Flag"> French
  31.     </a>
  32.     <a href="#" data-language="en" class="flex items-center px-4 py-2 hover:bg-gray-100">
  33.         <img src="{{ asset('images/flagen.png') }}" class="w-6 h-4 mr-3" alt="UK Flag"> English
  34.     </a>
  35. </div>
  36.             </div>
  37.             <!-- Icône de coeur -->
  38.             <button id="openModalLink1" class="px-4 py-2 text-black rounded-lg font-semibold hover:underline">
  39.                 <svg class="w-6 h-6" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
  40.                     <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"
  41.                       fill="white" stroke="black" stroke-width="2"/>
  42.                 </svg>
  43.             </button>
  44.             <!-- Dropdown utilisateur -->
  45.             <div class="relative">
  46.                 <button class="user-dropdown px-4 py-2 text-black rounded-lg font-semibold hover:underline" type="button">
  47.                     <i class="fa-solid fa-user"></i>
  48.                 </button>
  49.                 <div class="user-dropdown-menu hidden absolute right-0 mt-2 w-48 bg-white border border-gray-200 rounded-lg shadow-lg">
  50.                     <a class="block px-4 py-2 hover:bg-gray-100" href="{{ path('app_register') }}">{{ 'nav_landing.register'|trans }}</a>
  51.                     <a class="block px-4 py-2 hover:bg-gray-100" href="{{ path('app_login_site') }}">{{ 'nav_landing.login'|trans }}</a>
  52.                     <a class="block px-4 py-2 hover:bg-gray-100" href="{{ path('attestation') }}">{{ 'nav_landing.accommodation_prereservation'|trans }}</a>
  53.                     <a class="block px-4 py-2 hover:bg-gray-100" href="{{ path('userFormOwner') }}">{{ 'nav_landing.add_accommodation'|trans }}</a>
  54.                 </div>
  55.             </div>
  56.         </div>
  57.     </div>
  58.     <!-- Menu mobile (caché par défaut) -->
  59.     <div id="mobileMenu" class="hidden lg:hidden bg-white border-t border-gray-200">
  60.         <div class="px-2 pt-2 pb-3 space-y-1">
  61.             <a href="{{ path('attestation') }}" class="block px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100">
  62.                 {{ 'nav_landing.accommodation_prereservation'|trans }}
  63.             </a>
  64.             <!-- Dropdown langue mobile -->
  65.             <div class="relative">
  66.                 <button class="language-dropdown flex items-center px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100">
  67.                     <img src="{{ asset('images/flagfr.png') }}" class="w-6 h-4 mr-2" alt="France Flag">
  68.                     <svg class="w-4 h-4" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
  69.                         <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
  70.                     </svg>
  71.                 </button>
  72.                 <div class="language-menu hidden pl-4">
  73.                     <a href="#" data-language="fr" class="flex items-center px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100">
  74.                         <img src="{{ asset('images/flagfr.png') }}" class="w-6 h-4 mr-2" alt="France Flag">
  75.                     </a>
  76.                     <a href="#" data-language="en" class="flex items-center px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100">
  77.                         <img src="{{ asset('images/flagen.png') }}" class="w-6 h-4 mr-2" alt="UK Flag">
  78.                     </a>
  79.                 </div>
  80.             </div>
  81.             <!-- Bouton coeur mobile -->
  82.             <button id="openModalLinkMobile" class="w-full text-left px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100 flex items-center">
  83.                 <svg class="w-6 h-6 mr-2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
  84.                     <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"
  85.                       fill="white" stroke="black" stroke-width="2"/>
  86.                 </svg>
  87.                 {{ 'nav_landing.favorites'|trans }}
  88.             </button>
  89.             <!-- Dropdown utilisateur mobile -->
  90.             <div class="relative">
  91.                 <button class="user-dropdown w-full text-left px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100 flex items-center">
  92.                     <i class="fa-solid fa-user mr-2"></i>
  93.                     {{ 'nav_landing.my_account'|trans }}
  94.                 </button>
  95.                 <div class="user-dropdown-menu hidden pl-4">
  96.                     <a class="block px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100" href="{{ path('app_register') }}">{{ 'nav_landing.register'|trans }}</a>
  97.                     <a class="block px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100" href="{{ path('app_login_site') }}">{{ 'nav_landing.login'|trans }}</a>
  98.                     <a class="block px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100" href="{{ path('attestation') }}">{{ 'nav_landing.accommodation_prereservation'|trans }}</a>
  99.                     <a class="block px-3 py-2 text-black rounded-lg font-semibold hover:bg-gray-100" href="{{ path('userFormOwner') }}">{{ 'nav_landing.add_accommodation'|trans }}</a>
  100.                 </div>
  101.             </div>
  102.         </div>
  103.     </div>
  104. </nav>
  105. <!-- Modal de connexion/inscription -->
  106. <div id="connectModal" class="fixed inset-0 bg-gray-500 bg-opacity-50 flex justify-center items-center hidden z-50">
  107.     <div class="bg-white p-6 rounded-lg shadow-lg max-w-sm w-full text-center">
  108.         <p class="text-lg font-semibold mb-4">{{ 'nav_landing.choose_option'|trans }}</p>
  109.         <button onclick="window.location.href='{{ path('app_login_site') }}'" class="bg-yellow-400 text-black px-4 py-2 rounded-lg font-semibold hover:bg-yellow-500 transition mb-2 w-full">
  110.             {{ 'nav_landing.login'|trans }}
  111.         </button>
  112.         <button onclick="window.location.href='{{ path('app_register') }}'" class="bg-yellow-400 text-black px-4 py-2 rounded-lg font-semibold hover:bg-yellow-500 transition w-full">
  113.             {{ 'nav_landing.register'|trans }}
  114.         </button>
  115.     </div>
  116. </div>
  117. <script>
  118.     document.addEventListener('DOMContentLoaded', function () {
  119.         // Fonction pour afficher le bon drapeau selon l'URL
  120.         function updateCurrentFlag() {
  121.             const lang = window.location.pathname.startsWith('/en') ? 'en' : 'fr';
  122.             const flagSrc = lang === 'en' ? "{{ asset('images/flagen.png') }}" : "{{ asset('images/flagfr.png') }}";
  123.             document.querySelectorAll('.language-dropdown img').forEach(flag => {
  124.                 flag.src = flagSrc;
  125.             });
  126.         }
  127.         updateCurrentFlag();
  128.         // Gestion du changement de langue
  129.         document.querySelectorAll('[data-language]').forEach(link => {
  130.             link.addEventListener('click', function (event) {
  131.                 event.preventDefault();
  132.                 const language = this.getAttribute('data-language');
  133.                 const currentPath = window.location.pathname;
  134.                 const searchParams = window.location.search;
  135.                 // Supprimer le préfixe de langue actuel s'il existe
  136.                 const pathWithoutLang = currentPath.replace(/^\/[a-z]{2}\//, '/');
  137.                 // Construire le nouvel URL avec le préfixe de langue
  138.                 const newPath = language === 'en' ? `/en${pathWithoutLang}` : pathWithoutLang;
  139.                 // Recharger la page avec le nouvel URL
  140.                 window.location.href = newPath + searchParams;
  141.             });
  142.         });
  143.         // Gestion des dropdowns (langue & utilisateur)
  144.         function setupDropdown(triggerSelector, menuSelector) {
  145.             const triggers = document.querySelectorAll(triggerSelector);
  146.             const menus = document.querySelectorAll(menuSelector);
  147.             triggers.forEach((trigger, index) => {
  148.                 trigger.addEventListener('click', function (event) {
  149.                     event.stopPropagation();
  150.                     menus[index].classList.toggle('hidden');
  151.                 });
  152.             });
  153.             document.addEventListener('click', function (event) {
  154.                 menus.forEach(menu => {
  155.                     if (!menu.contains(event.target)) {
  156.                         menu.classList.add('hidden');
  157.                     }
  158.                 });
  159.             });
  160.         }
  161.         setupDropdown('.language-dropdown', '.language-menu');
  162.         setupDropdown('.user-dropdown', '.user-dropdown-menu');
  163.         // Gestion du menu mobile
  164.         const mobileMenuButton = document.getElementById('mobileMenuButton');
  165.         const mobileMenu = document.getElementById('mobileMenu');
  166.         let menuOpen = false;
  167.         if (mobileMenuButton && mobileMenu) {
  168.             mobileMenuButton.addEventListener('click', function (e) {
  169.                 e.preventDefault();
  170.                 e.stopPropagation();
  171.                 menuOpen = !menuOpen;
  172.                 mobileMenu.classList.toggle('hidden', !menuOpen);
  173.             });
  174.             document.addEventListener('click', function (e) {
  175.                 if (menuOpen && !mobileMenu.contains(e.target) && !mobileMenuButton.contains(e.target)) {
  176.                     menuOpen = false;
  177.                     mobileMenu.classList.add('hidden');
  178.                 }
  179.             });
  180.             mobileMenu.addEventListener('click', function (e) {
  181.                 e.stopPropagation();
  182.             });
  183.         }
  184.         // Gestion de la modal de connexion
  185.         const openModalElements = document.querySelectorAll('#openModalLink1, #openModalLinkMobile');
  186.         const connectModal = document.getElementById('connectModal');
  187.         if (openModalElements.length > 0 && connectModal) {
  188.             openModalElements.forEach(element => {
  189.                 element.addEventListener('click', function (event) {
  190.                     event.preventDefault();
  191.                     connectModal.classList.remove('hidden');
  192.                 });
  193.             });
  194.             connectModal.addEventListener('click', function (event) {
  195.                 if (event.target === connectModal) {
  196.                     connectModal.classList.add('hidden');
  197.                 }
  198.             });
  199.             connectModal.querySelector('.bg-white').addEventListener('click', function (event) {
  200.                 event.stopPropagation();
  201.             });
  202.         }
  203.     });
  204. </script>