templates/base.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html lang="fr">
  3.     <head>
  4.         <meta charset="UTF-8">
  5.         <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.         <title>{% block title %}PaySolution - Gestion des factures d'électricité{% endblock %}</title>
  7.         <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>💡</text></svg>">
  8.         <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
  9.         
  10.         {% block stylesheets %}
  11.             {{ encore_entry_link_tags('app') }}
  12.         {% endblock %}
  13.         {% block javascripts %}
  14.             {{ encore_entry_script_tags('app') }}
  15.             <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
  16.         {% endblock %}
  17.     </head>
  18.     <body class="min-h-screen flex flex-col bg-gray-50" style="font-family: 'Inter', sans-serif;">
  19.         <!-- Navigation -->
  20.         <nav class="bg-white shadow-lg border-b-4 border-primary">
  21.             <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
  22.                 <div class="flex justify-between h-16">
  23.                     <div class="flex items-center">
  24.                         <div class="flex-shrink-0 flex items-center">
  25.                             <div class="flex items-center space-x-2">
  26.                                 <div class="w-10 h-10 bg-gradient-to-br from-primary to-primary-dark rounded-lg flex items-center justify-center">
  27.                                     <svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  28.                                         <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path>
  29.                                     </svg>
  30.                                 </div>
  31.                                 <span class="text-xl font-bold text-gray-900">Pay<span class="text-primary">Solution</span></span>
  32.                             </div>
  33.                         </div>
  34.                         <div class="hidden md:ml-10 md:flex md:space-x-8">
  35.                             {% if app.user %}
  36.                                 <a href="{{ path('app_dashboard') }}" class="text-gray-700 hover:text-primary inline-flex items-center px-1 pt-1 border-b-2 border-transparent hover:border-primary text-sm font-medium transition duration-200">
  37.                                     <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  38.                                         <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path>
  39.                                     </svg>
  40.                                     Tableau de bord
  41.                                 </a>
  42.                                 {% if is_granted('ROLE_ADMIN') %}
  43.                                     <a href="{{ path('admin_users_index') }}" class="text-gray-700 hover:text-primary inline-flex items-center px-1 pt-1 border-b-2 border-transparent hover:border-primary text-sm font-medium transition duration-200">
  44.                                         <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  45.                                             <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"></path>
  46.                                         </svg>
  47.                                         Utilisateurs
  48.                                     </a>
  49.                                     <div class="relative" x-data="{ open: false }">
  50.                                         <button @click="open = !open" class="text-gray-700 hover:text-primary inline-flex items-center px-1 pt-1 border-b-2 border-transparent hover:border-primary text-sm font-medium transition duration-200">
  51.                                             <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  52.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path>
  53.                                             </svg>
  54.                                             Clients
  55.                                             <svg class="w-4 h-4 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  56.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
  57.                                             </svg>
  58.                                         </button>
  59.                                         <div x-show="open" @click.away="open = false" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform scale-95" x-transition:enter-end="opacity-100 transform scale-100" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100 transform scale-100" x-transition:leave-end="opacity-0 transform scale-95" class="absolute left-0 mt-2 w-56 bg-white rounded-lg shadow-xl border border-gray-200 py-2 z-50" style="display: none;">
  60.                                             <a href="{{ path('customers_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  61.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  62.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"></path>
  63.                                                 </svg>
  64.                                                 Liste des clients
  65.                                             </a>
  66.                                             <a href="{{ path('settings_customer_categories_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  67.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  68.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z"></path>
  69.                                                 </svg>
  70.                                                 Catégorie client
  71.                                             </a>
  72.                                             <a href="{{ path('customers_import') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  73.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  74.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"></path>
  75.                                                 </svg>
  76.                                                 Importer Excel
  77.                                             </a>
  78.                                         </div>
  79.                                     </div>
  80.                                     <div class="relative" x-data="{ open: false }">
  81.                                         <button @click="open = !open" class="text-gray-700 hover:text-primary inline-flex items-center px-1 pt-1 border-b-2 border-transparent hover:border-primary text-sm font-medium transition duration-200">
  82.                                             <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  83.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path>
  84.                                             </svg>
  85.                                             Factures
  86.                                             <svg class="w-4 h-4 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  87.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
  88.                                             </svg>
  89.                                         </button>
  90.                                         <div x-show="open" @click.away="open = false" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform scale-95" x-transition:enter-end="opacity-100 transform scale-100" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100 transform scale-100" x-transition:leave-end="opacity-0 transform scale-95" class="absolute left-0 mt-2 w-56 bg-white rounded-lg shadow-xl border border-gray-200 py-2 z-50" style="display: none;">
  91.                                             <a href="{{ path('invoices_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  92.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  93.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path>
  94.                                                 </svg>
  95.                                                 Liste des factures
  96.                                             </a>
  97.                                             <a href="{{ path('invoices_import_form') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  98.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  99.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"></path>
  100.                                                 </svg>
  101.                                                 Importer Excel
  102.                                             </a>
  103.                                             <a href="{{ path('invoices_import_history') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  104.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  105.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
  106.                                                 </svg>
  107.                                                 Historique des Imports
  108.                                             </a>
  109.                                             <a href="{{ path('payment_orders_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  110.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  111.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path>
  112.                                                 </svg>
  113.                                                 Bons de Paiements
  114.                                             </a>
  115.                                             <div class="border-t border-gray-200 my-2"></div>
  116.                                             <a href="{{ path('banks_dashboard') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  117.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  118.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path>
  119.                                                 </svg>
  120.                                                 Dashboard Encaissements
  121.                                             </a>
  122.                                             <a href="{{ path('banks_payments_history') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  123.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  124.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01"></path>
  125.                                                 </svg>
  126.                                                 Historique des Paiements
  127.                                             </a>
  128.                                             <a href="{{ path('banks_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  129.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  130.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 14v3m4-3v3m4-3v3M3 21h18M3 10h18M3 7l9-4 9 4M4 10h16v11H4V10z"></path>
  131.                                                 </svg>
  132.                                                 Partenaires Financiers
  133.                                             </a>
  134.                                         </div>
  135.                                     </div>
  136.                                     <div class="relative" x-data="{ open: false }">
  137.                                         <button @click="open = !open" class="text-gray-700 hover:text-primary inline-flex items-center px-1 pt-1 border-b-2 border-transparent hover:border-primary text-sm font-medium transition duration-200">
  138.                                             <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  139.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path>
  140.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
  141.                                             </svg>
  142.                                             Paramètres
  143.                                             <svg class="w-4 h-4 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  144.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
  145.                                             </svg>
  146.                                         </button>
  147.                                         <div x-show="open" @click.away="open = false" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform scale-95" x-transition:enter-end="opacity-100 transform scale-100" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100 transform scale-100" x-transition:leave-end="opacity-0 transform scale-95" class="absolute left-0 mt-2 w-56 bg-white rounded-lg shadow-xl border border-gray-200 py-2 z-50" style="display: none;">
  148.                                             <a href="{{ path('settings_provinces_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  149.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  150.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"></path>
  151.                                                 </svg>
  152.                                                 Provinces
  153.                                             </a>
  154.                                             <a href="{{ path('settings_territoires_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  155.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  156.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path>
  157.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
  158.                                                 </svg>
  159.                                                 Territoires
  160.                                             </a>
  161.                                             <a href="{{ path('settings_secteurs_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  162.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  163.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"></path>
  164.                                                 </svg>
  165.                                                 Secteurs
  166.                                             </a>
  167.                                             <div class="border-t border-gray-200 my-2"></div>
  168.                                             <a href="{{ path('settings_roles_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  169.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  170.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
  171.                                                 </svg>
  172.                                                 Rôles
  173.                                             </a>
  174.                                             <a href="{{ path('settings_taxes_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  175.                                                 <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  176.                                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
  177.                                                 </svg>
  178.                                                 Taxes
  179.                                             </a>
  180.                                             {% if is_granted('ROLE_SUPERADMIN') %}
  181.                                                 <div class="border-t border-gray-200 my-2"></div>
  182.                                                 <a href="{{ path('payment_gateways_index') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  183.                                                     <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  184.                                                         <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z"></path>
  185.                                                     </svg>
  186.                                                     Moyens de Paiement
  187.                                                 </a>
  188.                                             {% endif %}
  189.                                         </div>
  190.                                     </div>
  191.                                 {% endif %}
  192.                             {% else %}
  193.                                 <a href="{{ path('homepage') }}" class="text-gray-700 hover:text-primary inline-flex items-center px-1 pt-1 border-b-2 border-transparent hover:border-primary text-sm font-medium transition duration-200">
  194.                                     Accueil
  195.                                 </a>
  196.                             {% endif %}
  197.                         </div>
  198.                     </div>
  199.                     <div class="flex items-center space-x-4">
  200.                         {% if app.user %}
  201.                             <div class="flex items-center space-x-3">
  202.                                 <div class="hidden md:block text-right">
  203.                                     <div class="text-sm font-medium text-gray-900">{{ app.user.fullName }}</div>
  204.                                     <div class="text-xs text-gray-500">{{ app.user.email }}</div>
  205.                                 </div>
  206.                                 <div class="relative" x-data="{ open: false }">
  207.                                     <button @click="open = !open" class="flex items-center focus:outline-none">
  208.                                         {% if app.user.avatar %}
  209.                                             <img src="{{ asset('uploads/avatars/' ~ app.user.avatar) }}" alt="Avatar" class="w-10 h-10 rounded-full object-cover shadow-lg cursor-pointer hover:shadow-xl transition duration-200 border-2 border-primary">
  210.                                         {% else %}
  211.                                             <div class="w-10 h-10 rounded-full bg-gradient-to-br from-primary to-primary-dark flex items-center justify-center text-white font-bold shadow-lg cursor-pointer hover:shadow-xl transition duration-200">
  212.                                                 {{ app.user.firstname|first }}{{ app.user.lastname|first }}
  213.                                             </div>
  214.                                         {% endif %}
  215.                                         <svg class="w-4 h-4 ml-1 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  216.                                             <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
  217.                                         </svg>
  218.                                     </button>
  219.                                     
  220.                                     <div x-show="open" @click.away="open = false" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 transform scale-95" x-transition:enter-end="opacity-100 transform scale-100" x-transition:leave="transition ease-in duration-150" x-transition:leave-start="opacity-100 transform scale-100" x-transition:leave-end="opacity-0 transform scale-95" class="absolute right-0 mt-2 w-64 bg-white rounded-lg shadow-xl border border-gray-200 py-2 z-50" style="display: none;">
  221.                                         <div class="px-4 py-3 border-b border-gray-200">
  222.                                             <p class="text-sm font-semibold text-gray-900">{{ app.user.fullName }}</p>
  223.                                             <p class="text-xs text-gray-500 truncate">{{ app.user.email }}</p>
  224.                                         </div>
  225.                                         <a href="{{ path('app_profile') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  226.                                             <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  227.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path>
  228.                                             </svg>
  229.                                             Mon profil
  230.                                         </a>
  231.                                         <a href="{{ path('app_change_password') }}" class="flex items-center px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition duration-150">
  232.                                             <svg class="w-5 h-5 mr-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  233.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"></path>
  234.                                             </svg>
  235.                                             Changer le mot de passe
  236.                                         </a>
  237.                                         <div class="border-t border-gray-200 my-2"></div>
  238.                                         <a href="{{ path('app_logout') }}" class="flex items-center px-4 py-2 text-sm text-red-600 hover:bg-red-50 transition duration-150">
  239.                                             <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  240.                                                 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"></path>
  241.                                             </svg>
  242.                                             Déconnexion
  243.                                         </a>
  244.                                     </div>
  245.                                 </div>
  246.                             </div>
  247.                         {% else %}
  248.                             <a href="{{ path('app_login') }}" class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-primary hover:bg-primary-dark transition duration-200 shadow-sm">
  249.                                 <svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
  250.                                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1"></path>
  251.                                 </svg>
  252.                                 Connexion
  253.                             </a>
  254.                         {% endif %}
  255.                     </div>
  256.                 </div>
  257.             </div>
  258.         </nav>
  259.         <!-- Main Content -->
  260.         <main class="flex-grow">
  261.             {% block body %}{% endblock %}
  262.         </main>
  263.         <!-- Footer -->
  264.         <footer class="bg-gray-800 text-white py-8">
  265.             <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
  266.                 <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
  267.                     <div>
  268.                         <h3 class="text-lg font-semibold mb-4">PaySolution</h3>
  269.                         <p class="text-gray-400">Solution de gestion des factures d'électricité et de paiement en ligne.</p>
  270.                     </div>
  271.                     <div>
  272.                         <h4 class="text-lg font-semibold mb-4">Liens rapides</h4>
  273.                         <ul class="space-y-2">
  274.                             <li><a href="#" class="text-gray-400 hover:text-white">Accueil</a></li>
  275.                             <li><a href="#" class="text-gray-400 hover:text-white">Fonctionnalités</a></li>
  276.                             <li><a href="#" class="text-gray-400 hover:text-white">Tarifs</a></li>
  277.                             <li><a href="#" class="text-gray-400 hover:text-white">Contact</a></li>
  278.                         </ul>
  279.                     </div>
  280.                     <div>
  281.                         <h4 class="text-lg font-semibold mb-4">Contact</h4>
  282.                         <p class="text-gray-400">Email: contact@paysolution.com</p>
  283.                         <p class="text-gray-400">Tél: +33 1 23 45 67 89</p>
  284.                     </div>
  285.                 </div>
  286.                 <div class="mt-8 pt-8 border-t border-gray-700 text-center text-gray-400">
  287.                     <p>&copy; {{ "now"|date("Y") }} PaySolution. Tous droits réservés.</p>
  288.                 </div>
  289.             </div>
  290.         </footer>
  291.     </body>
  292. </html>