var/cache/dev/twig/6a/6a7baae960e0115eda1cae29fd7db45e.php line 825

Open in your IDE?
  1. <?php
  2. use Twig\Environment;
  3. use Twig\Error\LoaderError;
  4. use Twig\Error\RuntimeError;
  5. use Twig\Extension\CoreExtension;
  6. use Twig\Extension\SandboxExtension;
  7. use Twig\Markup;
  8. use Twig\Sandbox\SecurityError;
  9. use Twig\Sandbox\SecurityNotAllowedTagError;
  10. use Twig\Sandbox\SecurityNotAllowedFilterError;
  11. use Twig\Sandbox\SecurityNotAllowedFunctionError;
  12. use Twig\Source;
  13. use Twig\Template;
  14. use Twig\TemplateWrapper;
  15. /* base_home.html.twig */
  16. class __TwigTemplate_90b41beb24c02f5a72f80f659d5bffef extends Template
  17. {
  18.     private Source $source;
  19.     /**
  20.      * @var array<string, Template>
  21.      */
  22.     private array $macros = [];
  23.     public function __construct(Environment $env)
  24.     {
  25.         parent::__construct($env);
  26.         $this->source $this->getSourceContext();
  27.         $this->parent false;
  28.         $this->blocks = [
  29.             'title' => [$this'block_title'],
  30.             'stylesheets' => [$this'block_stylesheets'],
  31.             'body' => [$this'block_body'],
  32.             'javascripts' => [$this'block_javascripts'],
  33.         ];
  34.     }
  35.     protected function doDisplay(array $context, array $blocks = []): iterable
  36.     {
  37.         $macros $this->macros;
  38.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  39.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""base_home.html.twig"));
  40.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  41.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""base_home.html.twig"));
  42.         // line 1
  43.         yield "<!DOCTYPE html>
  44. <html lang=\"fr\" class=\"no-js\" data-theme=\"light\" data-bs-theme=\"light\">
  45. <head>
  46.     <!-- Mobile Specific Meta -->
  47.     <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no\">
  48.     <meta name=\"mobile-web-app-capable\" content=\"yes\">
  49.     <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">
  50.     <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">
  51.     <meta name=\"apple-mobile-web-app-title\" content=\"MaketOu\">
  52.     <meta name=\"theme-color\" content=\"#ffa200\">
  53.     <meta name=\"msapplication-TileColor\" content=\"#ffa200\">
  54.     <meta name=\"msapplication-config\" content=\"";
  55.         // line 13
  56.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/browserconfig.xml"), "html"nulltrue);
  57.         yield "\">
  58.     
  59.     <!-- Favicon-->
  60.     <link rel=\"shortcut icon\" href=\"";
  61.         // line 16
  62.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/favicon-16x16.png"), "html"nulltrue);
  63.         yield "\">
  64.     <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"";
  65.         // line 17
  66.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/apple-touch-icon.png"), "html"nulltrue);
  67.         yield "\">
  68.     <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"";
  69.         // line 18
  70.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/favicon-32x32.png"), "html"nulltrue);
  71.         yield "\">
  72.     <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"";
  73.         // line 19
  74.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/favicon-16x16.png"), "html"nulltrue);
  75.         yield "\">
  76.     
  77.     <!-- PWA Manifest -->
  78.     <link rel=\"manifest\" href=\"";
  79.         // line 22
  80.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("manifest.json"), "html"nulltrue);
  81.         yield "\">
  82.     <!-- Author Meta -->
  83.     <meta name=\"author\" content=\"Foulgor Tech\">
  84.     <!-- Meta Description -->
  85.     <meta name=\"description\" content=\"\">
  86.     <!-- Meta Keyword -->
  87.     <meta name=\"keywords\" content=\"\">
  88.     <!-- meta character set -->
  89.     <meta charset=\"UTF-8\">
  90.     <!-- Site Title -->
  91.     <title>";
  92.         // line 32
  93.         yield from $this->unwrap()->yieldBlock('title'$context$blocks);
  94.         yield "</title>
  95.     <script>
  96.         (function () {
  97.             try {
  98.                 var storageKey = 'maketou-theme';
  99.                 var savedTheme = window.localStorage.getItem(storageKey);
  100.                 var theme = savedTheme === 'dark' || savedTheme === 'light'
  101.                     ? savedTheme
  102.                     : (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
  103.                 document.documentElement.setAttribute('data-theme', theme);
  104.                 document.documentElement.setAttribute('data-bs-theme', theme);
  105.                 document.documentElement.classList.toggle('dark-mode', theme === 'dark');
  106.             } catch (error) {
  107.                 document.documentElement.setAttribute('data-theme', 'light');
  108.                 document.documentElement.setAttribute('data-bs-theme', 'light');
  109.             }
  110.         })();
  111.     </script>
  112.     <!--
  113.         CSS
  114.         ============================================= -->
  115.     <link rel=\"stylesheet\" href=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.css\" />
  116.     <link rel=\"stylesheet\" href=\"";
  117.         // line 54
  118.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/linearicons.css"), "html"nulltrue);
  119.         yield "\">
  120.     <link rel=\"stylesheet\" href=\"";
  121.         // line 55
  122.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/font-awesome.min.css"), "html"nulltrue);
  123.         yield "\">
  124.     <link rel=\"stylesheet\" href=\"";
  125.         // line 56
  126.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/themify-icons.css"), "html"nulltrue);
  127.         yield "\">
  128.     <link rel=\"stylesheet\" href=\"";
  129.         // line 57
  130.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/bootstrap.css"), "html"nulltrue);
  131.         yield "\">
  132.     <link rel=\"stylesheet\" href=\"";
  133.         // line 58
  134.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/owl.carousel.css"), "html"nulltrue);
  135.         yield "\">
  136.     <link rel=\"stylesheet\" href=\"";
  137.         // line 59
  138.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/nice-select.css"), "html"nulltrue);
  139.         yield "\">
  140.     <link rel=\"stylesheet\" href=\"";
  141.         // line 60
  142.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/nouislider.min.css"), "html"nulltrue);
  143.         yield "\">
  144.     <link rel=\"stylesheet\" href=\"";
  145.         // line 61
  146.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/ion.rangeSlider.css"), "html"nulltrue);
  147.         yield "\"/>
  148.     <link rel=\"stylesheet\" href=\"";
  149.         // line 62
  150.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/ion.rangeSlider.skinFlat.css"), "html"nulltrue);
  151.         yield "\"/>
  152.     <link rel=\"stylesheet\" href=\"";
  153.         // line 63
  154.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/magnific-popup.css"), "html"nulltrue);
  155.         yield "\">
  156.     <link rel=\"stylesheet\" href=\"";
  157.         // line 64
  158.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/main.css"), "html"nulltrue);
  159.         yield "\">
  160.     <link rel=\"stylesheet\" href=\"";
  161.         // line 65
  162.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/buttons-unified.css"), "html"nulltrue);
  163.         yield "\">
  164.     <link rel=\"stylesheet\" href=\"";
  165.         // line 66
  166.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/theme-public.css"), "html"nulltrue);
  167.         yield "\">
  168.     <meta charset=\"UTF-8\">
  169.     ";
  170.         // line 69
  171.         yield "
  172.     <style>
  173.         /* Styles pour l'icône de notification */
  174.         .notification-icon {
  175.             position: relative;
  176.             display: inline-block;
  177.             color: #333;
  178.             text-decoration: none;
  179.             transition: color 0.3s ease;
  180.         }
  181.         
  182.         .notification-icon:hover {
  183.             color: #007bff;
  184.         }
  185.         
  186.         .notification-badge {
  187.             position: absolute;
  188.             top: -4px;
  189.             right: -2px;
  190.             background: #dc3545 !important;
  191.             color: white !important;
  192.             border-radius: 50%;
  193.             width: 18px;
  194.             height: 18px;
  195.             font-size: 8px !important;
  196.             display: flex !important;
  197.             align-items: center !important;
  198.             justify-content: center !important;
  199.             font-weight: bold !important;
  200.             animation: pulse 2s infinite;
  201.             z-index: 10;
  202.             line-height: 1 !important;
  203.         }
  204.         
  205.         /* Forcer le texte en blanc pour tous les éléments du badge - avec spécificité maximale */
  206.         .notification-badge,
  207.         .notification-badge.text-white,
  208.         .notification-badge *,
  209.         #notificationBadge,
  210.         #notificationBadge.text-white,
  211.         #notificationBadge *,
  212.         span.notification-badge,
  213.         span.notification-badge.text-white,
  214.         span#notificationBadge,
  215.         span#notificationBadge.text-white {
  216.             color: white !important;
  217.             text-color: white !important;
  218.             -webkit-text-fill-color: white !important;
  219.         }
  220.         
  221.         /* S'assurer que le contenu texte est bien en blanc */
  222.         .notification-badge::before,
  223.         .notification-badge::after {
  224.             color: white !important;
  225.         }
  226.         
  227.         /* Forcer la couleur pour tous les sélecteurs possibles avec spécificité maximale */
  228.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge,
  229.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge.text-white,
  230.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span.notification-badge,
  231.         .notification-icon .notification-badge,
  232.         .notification-icon .notification-badge.text-white,
  233.         .notification-icon span.notification-badge,
  234.         a.notification-icon .notification-badge,
  235.         a.notification-icon span.notification-badge {
  236.             color: white !important;
  237.             text-color: white !important;
  238.             -webkit-text-fill-color: white !important;
  239.         }
  240.         
  241.         /* Forcer la couleur pour tous les enfants directs */
  242.         .notification-icon > .notification-badge,
  243.         .notification-icon > span.notification-badge {
  244.             color: white !important;
  245.         }
  246.         
  247.         @keyframes pulse {
  248.             0% { transform: scale(1); }
  249.             50% { transform: scale(1.1); }
  250.             100% { transform: scale(1); }
  251.         }
  252.         
  253.         .notification-icon:hover .notification-badge {
  254.             animation: none;
  255.         }
  256.         
  257.         /* Container pour les icônes - toujours alignées horizontalement */
  258.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
  259.             display: flex !important;
  260.             flex-direction: row !important;
  261.             align-items: center !important;
  262.             justify-content: center !important;
  263.             gap: 15px !important;
  264.             list-style: none !important;
  265.             margin: 0 !important;
  266.             padding: 0 !important;
  267.             width: auto !important;
  268.         }
  269.         
  270.         /* Surcharger les styles existants pour les li contenant le wrapper */
  271.         .header_area .navbar .nav.navbar-nav.navbar-right li:has(.navbar-icons-wrapper) {
  272.             margin-left: 0 !important;
  273.             margin-right: 0 !important;
  274.             display: flex !important;
  275.             align-items: center !important;
  276.             justify-content: center !important;
  277.         }
  278.         
  279.         /* Styles pour les icônes */
  280.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart,
  281.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon,
  282.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
  283.             display: flex !important;
  284.             align-items: center !important;
  285.             justify-content: center !important;
  286.             width: 40px !important;
  287.             height: 40px !important;
  288.             min-width: 40px !important;
  289.             min-height: 40px !important;
  290.             color: #333 !important;
  291.             text-decoration: none !important;
  292.             transition: all 0.3s ease !important;
  293.             border-radius: 50% !important;
  294.             position: relative !important;
  295.             margin: 0 !important;
  296.             padding: 0 !important;
  297.         }
  298.         
  299.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart:hover,
  300.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon:hover,
  301.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search:hover {
  302.             background-color: #f0f0f0 !important;
  303.             color: #ffa200 !important;
  304.             transform: scale(1.1) !important;
  305.         }
  306.         
  307.         /* Surcharger le line-height de main.css */
  308.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart span,
  309.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span,
  310.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search span {
  311.             font-size: 18px !important;
  312.             line-height: 1 !important;
  313.             display: flex !important;
  314.             align-items: center !important;
  315.             justify-content: center !important;
  316.             color: inherit !important;
  317.             font-weight: normal !important;
  318.         }
  319.         
  320.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
  321.             background: transparent !important;
  322.             border: 0 !important;
  323.             cursor: pointer !important;
  324.             padding: 0 !important;
  325.         }
  326.         
  327.         /* Alignement des icônes navbar sur mobile */
  328.         @media (max-width: 991.98px) {
  329.             /* Container navbar-right en colonne sur mobile */
  330.             .header_area .navbar .nav.navbar-nav.navbar-right {
  331.                 display: flex !important;
  332.                 flex-direction: column !important;
  333.                 align-items: center !important;
  334.                 justify-content: center !important;
  335.                 width: 100% !important;
  336.                 gap: 0 !important;
  337.                 margin: 0 !important;
  338.                 padding: 10px 0 !important;
  339.             }
  340.             
  341.             /* Le container d'icônes reste horizontal */
  342.             .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
  343.                 width: 100% !important;
  344.                 justify-content: center !important;
  345.                 display: flex !important;
  346.                 flex-direction: row !important;
  347.             }
  348.             
  349.             /* Le bouton compte en bas - pleine largeur */
  350.             .header_area .navbar .nav.navbar-nav.navbar-right li:last-child {
  351.                 width: 100% !important;
  352.                 display: flex !important;
  353.                 justify-content: center !important;
  354.                 margin-top: 12px !important;
  355.                 padding-top: 12px !important;
  356.                 border-top: 1px solid #e0e0e0 !important;
  357.             }
  358.             
  359.             /* Bouton compte responsive */
  360.             .header_area .navbar .nav.navbar-nav.navbar-right .btn-account {
  361.                 width: 100%;
  362.                 max-width: 200px;
  363.                 padding: 10px 20px;
  364.                 font-size: 14px;
  365.             }
  366.         }
  367.         
  368.         /* Styles pour les messages flash - Design moderne */
  369.         .flash-message {
  370.             animation: slideInDownFlash 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  371.             position: relative;
  372.             overflow: visible !important;
  373.             border: none !important;
  374.             padding: 16px 20px !important;
  375.             border-radius: 12px !important;
  376.             box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
  377.             display: flex !important;
  378.             align-items: center;
  379.             gap: 12px;
  380.             margin-bottom: 15px;
  381.             backdrop-filter: blur(10px);
  382.             transition: all 0.3s ease;
  383.         }
  384.         
  385.         /* S'assurer que les icônes Font Awesome sont visibles */
  386.         .flash-message i.fa {
  387.             display: inline-block !important;
  388.             visibility: visible !important;
  389.             opacity: 1 !important;
  390.             width: auto !important;
  391.             height: auto !important;
  392.             font-family: \"FontAwesome\" !important;
  393.             font-style: normal !important;
  394.             font-weight: normal !important;
  395.             text-rendering: auto !important;
  396.             -webkit-font-smoothing: antialiased !important;
  397.             -moz-osx-font-smoothing: grayscale !important;
  398.             line-height: 1 !important;
  399.             flex-shrink: 0 !important;
  400.         }
  401.         
  402.         /* Forcer l'affichage des pseudo-éléments Font Awesome */
  403.         .flash-message i.fa::before {
  404.             display: inline-block !important;
  405.             visibility: visible !important;
  406.             opacity: 1 !important;
  407.             content: attr(data-icon) !important;
  408.         }
  409.         
  410.         /* Styles spécifiques pour chaque icône */
  411.         .flash-message i.fa-check-circle::before {
  412.             content: \"\\f058\" !important;
  413.         }
  414.         
  415.         .flash-message i.fa-exclamation-circle::before {
  416.             content: \"\\f06a\" !important;
  417.         }
  418.         
  419.         .flash-message i.fa-exclamation-triangle::before {
  420.             content: \"\\f071\" !important;
  421.         }
  422.         
  423.         .flash-message i.fa-info-circle::before {
  424.             content: \"\\f05a\" !important;
  425.         }
  426.         
  427.         .flash-message:hover {
  428.             box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2) !important;
  429.             transform: translateY(-2px);
  430.         }
  431.         
  432.         .flash-message::before {
  433.             content: '';
  434.             position: absolute;
  435.             left: 0;
  436.             top: 0;
  437.             bottom: 0;
  438.             width: 5px;
  439.             background: linear-gradient(180deg, currentColor 0%, rgba(255,255,255,0.3) 100%);
  440.             border-radius: 12px 0 0 12px;
  441.         }
  442.         
  443.         .flash-message.alert-success {
  444.             background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%) !important;
  445.             color: #155724 !important;
  446.             border-left: 5px solid #28a745 !important;
  447.         }
  448.         
  449.         .flash-message.alert-success i.fa {
  450.             color: #28a745 !important;
  451.             font-size: 1.3rem !important;
  452.             display: inline-block !important;
  453.             margin-right: 8px;
  454.             vertical-align: middle;
  455.         }
  456.         
  457.         .flash-message.alert-danger {
  458.             background: linear-gradient(135deg, #f8d7da 0%, #f5c6cb 100%) !important;
  459.             color: #721c24 !important;
  460.             border-left: 5px solid #dc3545 !important;
  461.         }
  462.         
  463.         .flash-message.alert-danger i.fa {
  464.             color: #dc3545 !important;
  465.             font-size: 1.3rem !important;
  466.             display: inline-block !important;
  467.             margin-right: 8px;
  468.             vertical-align: middle;
  469.         }
  470.         
  471.         .flash-message.alert-warning {
  472.             background: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%) !important;
  473.             color: #856404 !important;
  474.             border-left: 5px solid #ffc107 !important;
  475.         }
  476.         
  477.         .flash-message.alert-warning i.fa {
  478.             color: #ffa200 !important;
  479.             font-size: 1.3rem !important;
  480.             display: inline-block !important;
  481.             margin-right: 8px;
  482.             vertical-align: middle;
  483.         }
  484.         
  485.         .flash-message.alert-info {
  486.             background: linear-gradient(135deg, #d1ecf1 0%, #bee5eb 100%) !important;
  487.             color: #0c5460 !important;
  488.             border-left: 5px solid #17a2b8 !important;
  489.         }
  490.         
  491.         .flash-message.alert-info i.fa {
  492.             color: #17a2b8 !important;
  493.             font-size: 1.3rem !important;
  494.             display: inline-block !important;
  495.             margin-right: 8px;
  496.             vertical-align: middle;
  497.         }
  498.         
  499.         .flash-message strong {
  500.             flex: 1;
  501.             font-weight: 600;
  502.             font-size: 0.95rem;
  503.             line-height: 1.5;
  504.         }
  505.         
  506.         .flash-message .btn-close {
  507.             opacity: 0.7;
  508.             padding: 8px !important;
  509.             margin: -8px -8px -8px auto !important;
  510.             transition: all 0.2s ease;
  511.             border-radius: 50% !important;
  512.             background: rgba(0, 0, 0, 0.05) !important;
  513.             width: 32px !important;
  514.             height: 32px !important;
  515.             display: flex !important;
  516.             align-items: center !important;
  517.             justify-content: center !important;
  518.             border: none !important;
  519.             cursor: pointer !important;
  520.             position: relative !important;
  521.         }
  522.         
  523.         /* Ajouter une icône X visible dans le bouton */
  524.         .flash-message .btn-close::before {
  525.             content: '×' !important;
  526.             font-size: 24px !important;
  527.             line-height: 1 !important;
  528.             color: currentColor !important;
  529.             font-weight: bold !important;
  530.             display: block !important;
  531.             position: absolute !important;
  532.             top: 50% !important;
  533.             left: 50% !important;
  534.             transform: translate(-50%, -50%) !important;
  535.         }
  536.         
  537.         .flash-message .btn-close:hover {
  538.             opacity: 1 !important;
  539.             background: rgba(0, 0, 0, 0.15) !important;
  540.             transform: rotate(90deg) !important;
  541.         }
  542.         
  543.         .flash-message .btn-close:hover::before {
  544.             transform: translate(-50%, -50%) rotate(-90deg) !important;
  545.         }
  546.         
  547.         @keyframes slideInDownFlash {
  548.             from {
  549.                 opacity: 0;
  550.                 transform: translateY(-30px) scale(0.95);
  551.             }
  552.             to {
  553.                 opacity: 1;
  554.                 transform: translateY(0) scale(1);
  555.             }
  556.         }
  557.         
  558.         #flash-messages-container {
  559.             margin-top: 20px;
  560.             margin-bottom: 0;
  561.         }
  562.         
  563.         @media (max-width: 768px) {
  564.             .flash-message {
  565.                 padding: 14px 16px !important;
  566.                 font-size: 0.9rem;
  567.             }
  568.             
  569.             .flash-message i {
  570.                 font-size: 1.2rem !important;
  571.             }
  572.         }
  573.         
  574.         /* Styles pour l'icône de comparaison */
  575.         .comparison-icon {
  576.             position: relative;
  577.             display: inline-block;
  578.             color: #333;
  579.             text-decoration: none;
  580.             transition: color 0.3s ease;
  581.         }
  582.         
  583.         .comparison-icon:hover {
  584.             color: #ffa200;
  585.         }
  586.         
  587.         .comparison-badge {
  588.             position: absolute;
  589.             top: 17px;
  590.             left: 12px;
  591.             background: #ffa200;
  592.             color: white;
  593.             border-radius: 50%;
  594.             width: 18px;
  595.             height: 18px;
  596.             font-size: 10px;
  597.             display: flex;
  598.             align-items: center;
  599.             justify-content: center;
  600.             font-weight: bold;
  601.             animation: pulse 2s infinite;
  602.         }
  603.         
  604.         .comparison-icon:hover .comparison-badge {
  605.             animation: none;
  606.         }
  607.         
  608.         /* Styles pour les mega-menus - style comme la barre de recherche */
  609.         .mega-menu {
  610.             width: 100%;
  611.             max-width: 1200px;
  612.             left: 50%;
  613.             transform: translateX(-50%);
  614.             padding: 25px;
  615.             border-radius: 12px;
  616.             box-shadow: 0 8px 30px rgba(0,0,0,0.12);
  617.             border: none;
  618.             background: white;
  619.             display: none;
  620.             position: absolute;
  621.             top: 100%;
  622.             z-index: 9999 !important;
  623.             margin-top: 10px;
  624.             opacity: 0;
  625.             visibility: hidden;
  626.             transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;
  627.         }
  628.         
  629.         .mega-menu.active {
  630.             display: block;
  631.             opacity: 1;
  632.             visibility: visible;
  633.             transform: translateX(-50%) translateY(0);
  634.         }
  635.         
  636.         .nav-item.dropdown {
  637.             position: relative !important;
  638.         }
  639.         
  640.         @media (min-width: 768px) {
  641.             .nav-item.dropdown {
  642.                 position: relative !important;
  643.             }
  644.             
  645.             .mega-menu {
  646.                 position: absolute !important;
  647.                 left: 50% !important;
  648.                 transform: translateX(-50%) !important;
  649.                 width: auto !important;
  650.                 min-width: 600px !important;
  651.             }
  652.         }
  653.         
  654.         /* Correction supplémentaire pour l'affichage sur la page d'accueil */
  655.         body.home .nav-item.dropdown,
  656.         .nav-item.dropdown {
  657.             position: relative !important;
  658.         }
  659.         
  660.         body.home .mega-menu,
  661.         .mega-menu {
  662.             position: absolute !important;
  663.             left: 50% !important;
  664.             transform: translateX(-50%) translateY(0) !important;
  665.             width: auto !important;
  666.             min-width: 600px !important;
  667.             max-width: 90% !important;
  668.             top: 100% !important;
  669.             margin-top: 10px !important;
  670.         }
  671.         
  672.         /* Assurer que les mega-menus sont toujours visibles au survol */
  673.         .nav-item.dropdown:hover .mega-menu {
  674.             opacity: 1 !important;
  675.             visibility: visible !important;
  676.             display: block !important;
  677.             transform: translateX(-50%) translateY(0) !important;
  678.         }
  679.         
  680.         .mega-menu .dropdown-item {
  681.             padding: 0;
  682.             border: none;
  683.         }
  684.         
  685.         .mega-menu .dropdown-header {
  686.             font-weight: 700;
  687.             color: #2c3e50;
  688.             margin-bottom: 18px;
  689.             padding-bottom: 10px;
  690.             border-bottom: 3px solid #3498db;
  691.             font-size: 16px;
  692.             text-transform: uppercase;
  693.             letter-spacing: 0.5px;
  694.         }
  695.         
  696.         .mega-menu .dropdown-item a {
  697.             display: block;
  698.             padding: 10px 15px;
  699.             color: #555;
  700.             text-decoration: none;
  701.             border-radius: 6px;
  702.             transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  703.             position: relative;
  704.             overflow: hidden;
  705.         }
  706.         
  707.         .mega-menu .dropdown-item a::before {
  708.             content: '';
  709.             position: absolute;
  710.             top: 0;
  711.             left: -100%;
  712.             width: 100%;
  713.             height: 100%;
  714.             background: linear-gradient(90deg, transparent, rgba(52, 152, 219, 0.1), transparent);
  715.             transition: left 0.5s;
  716.         }
  717.         
  718.         .mega-menu .dropdown-item a:hover::before {
  719.             left: 100%;
  720.         }
  721.         
  722.         .mega-menu .dropdown-item a:hover {
  723.             background: linear-gradient(135deg, #f8f9fa, #e3f2fd);
  724.             color: #2980b9;
  725.             transform: translateX(8px);
  726.             box-shadow: 0 2px 8px rgba(52, 152, 219, 0.2);
  727.         }
  728.         
  729.         .mega-menu .dropdown-item a i {
  730.             width: 22px;
  731.             text-align: center;
  732.             margin-right: 8px;
  733.             color: #3498db;
  734.             transition: color 0.3s ease;
  735.         }
  736.         
  737.         .mega-menu .dropdown-item a:hover i {
  738.             color: #2980b9;
  739.         }
  740.         
  741.         /* Animation d'apparition améliorée */
  742.         @keyframes slideInDown {
  743.             from {
  744.                 opacity: 0;
  745.                 transform: translateY(-20px);
  746.             }
  747.             to {
  748.                 opacity: 1;
  749.                 transform: translateY(0);
  750.             }
  751.         }
  752.         
  753.         .mega-menu {
  754.             animation: slideInDown 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  755.         }
  756.         
  757.         /* Effet de survol sur le lien principal */
  758.         .nav-item.dropdown .nav-link {
  759.             position: relative;
  760.             transition: all 0.3s ease;
  761.         }
  762.         
  763.         .nav-item.dropdown .nav-link::after {
  764.             content: '';
  765.             position: absolute;
  766.             bottom: -2px;
  767.             left: 50%;
  768.             width: 0;
  769.             height: 2px;
  770.             background: linear-gradient(90deg, #3498db, #2980b9);
  771.             transition: all 0.3s ease;
  772.             transform: translateX(-50%);
  773.         }
  774.         
  775.         .nav-item.dropdown:hover .nav-link::after {
  776.             width: 100%;
  777.         }
  778.         
  779.         .nav-item.dropdown:hover .nav-link {
  780.             color: #2980b9;
  781.         }
  782.         
  783.         @keyframes fadeInDown {
  784.             from {
  785.                 opacity: 0;
  786.                 transform: translateY(-10px);
  787.             }
  788.             to {
  789.                 opacity: 1;
  790.                 transform: translateY(0);
  791.             }
  792.         }
  793.         
  794.         /* Responsive */
  795.         @media (max-width: 768px) {
  796.             .mega-menu {
  797.                 width: 100%;
  798.                 left: 0;
  799.                 padding: 15px;
  800.             }
  801.             
  802.             .mega-menu .row {
  803.                 margin: 0;
  804.             }
  805.             
  806.             .mega-menu .col-md-3 {
  807.                 margin-bottom: 20px;
  808.             }
  809.         }
  810.     </style>
  811.     
  812.     
  813.     ";
  814.         // line 711
  815.         yield from $this->unwrap()->yieldBlock('stylesheets'$context$blocks);
  816.         // line 714
  817.         yield "    
  818.     <!-- Script pour forcer l'application des styles CSS après chargement -->
  819.     <script>
  820.         document.addEventListener('DOMContentLoaded', function() {
  821.             // Forcer le masquage du toggle sur grands écrans
  822.             if (window.innerWidth >= 992) {
  823.                 const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
  824.                 togglers.forEach(function(toggler) {
  825.                     if (toggler) {
  826.                         toggler.style.display = 'none';
  827.                         toggler.style.visibility = 'hidden';
  828.                         toggler.style.opacity = '0';
  829.                         toggler.style.width = '0';
  830.                         toggler.style.height = '0';
  831.                         toggler.style.padding = '0';
  832.                         toggler.style.margin = '0';
  833.                         toggler.style.border = 'none';
  834.                         toggler.style.position = 'absolute';
  835.                         toggler.style.left = '-9999px';
  836.                     }
  837.                 });
  838.                 
  839.                 const iconBars = document.querySelectorAll('.navbar-toggler .icon-bar, .header_area .navbar .navbar-toggler .icon-bar, .navbar-toggler-icon');
  840.                 iconBars.forEach(function(bar) {
  841.                     if (bar) {
  842.                         bar.style.display = 'none';
  843.                         bar.style.visibility = 'hidden';
  844.                     }
  845.                 });
  846.             }
  847.             
  848.             // Alignement des icônes navbar sur mobile
  849.             const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
  850.             navbarRight.forEach(function(nav) {
  851.                 if (nav && window.innerWidth <= 991.98) {
  852.                     // Mobile: colonne avec icônes alignées horizontalement
  853.                     nav.style.display = 'flex';
  854.                     nav.style.flexDirection = 'column';
  855.                     nav.style.alignItems = 'center';
  856.                     nav.style.textAlign = 'center';
  857.                     
  858.                     // Le container d'icônes reste horizontal
  859.                     const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
  860.                     if (iconsContainer) {
  861.                         iconsContainer.style.display = 'flex';
  862.                         iconsContainer.style.flexDirection = 'row';
  863.                         iconsContainer.style.justifyContent = 'center';
  864.                     }
  865.                     
  866.                     // Le bouton compte en bas
  867.                     const accountBtn = nav.querySelector('li:last-child');
  868.                     if (accountBtn) {
  869.                         accountBtn.style.width = '100%';
  870.                         accountBtn.style.display = 'flex';
  871.                         accountBtn.style.justifyContent = 'center';
  872.                         accountBtn.style.marginTop = '12px';
  873.                         accountBtn.style.paddingTop = '12px';
  874.                         accountBtn.style.borderTop = '1px solid #e0e0e0';
  875.                     }
  876.                 } else if (nav && window.innerWidth > 991.98) {
  877.                     // Desktop: alignement horizontal normal
  878.                     nav.style.display = 'flex';
  879.                     nav.style.flexDirection = 'row';
  880.                     nav.style.alignItems = 'center';
  881.                     nav.style.justifyContent = 'flex-end';
  882.                 }
  883.             });
  884.         });
  885.         
  886.         // Réappliquer lors du redimensionnement
  887.         window.addEventListener('resize', function() {
  888.             if (window.innerWidth >= 992) {
  889.                 const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
  890.                 togglers.forEach(function(toggler) {
  891.                     if (toggler) {
  892.                         toggler.style.display = 'none';
  893.                         toggler.style.visibility = 'hidden';
  894.                     }
  895.                 });
  896.             }
  897.             
  898.             // Réappliquer l'alignement des icônes navbar
  899.             const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
  900.             navbarRight.forEach(function(nav) {
  901.                 if (nav && window.innerWidth <= 991.98) {
  902.                     // Mobile: colonne avec icônes alignées horizontalement
  903.                     nav.style.display = 'flex';
  904.                     nav.style.flexDirection = 'column';
  905.                     nav.style.alignItems = 'center';
  906.                     nav.style.textAlign = 'center';
  907.                     
  908.                     // Le container d'icônes reste horizontal
  909.                     const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
  910.                     if (iconsContainer) {
  911.                         iconsContainer.style.display = 'flex';
  912.                         iconsContainer.style.flexDirection = 'row';
  913.                         iconsContainer.style.justifyContent = 'center';
  914.                     }
  915.                     
  916.                     const accountBtn = nav.querySelector('li:last-child');
  917.                     if (accountBtn) {
  918.                         accountBtn.style.width = '100%';
  919.                         accountBtn.style.display = 'flex';
  920.                         accountBtn.style.justifyContent = 'center';
  921.                         accountBtn.style.marginTop = '12px';
  922.                         accountBtn.style.paddingTop = '12px';
  923.                         accountBtn.style.borderTop = '1px solid #e0e0e0';
  924.                     }
  925.                 } else if (nav && window.innerWidth > 991.98) {
  926.                     // Desktop: alignement horizontal normal
  927.                     nav.style.display = 'flex';
  928.                     nav.style.flexDirection = 'row';
  929.                     nav.style.alignItems = 'center';
  930.                     nav.style.justifyContent = 'flex-end';
  931.                 }
  932.             });
  933.         });
  934.         
  935.     </script>
  936.     ";
  937.         // line 834
  938.         $context["current_route"] = CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "request", [], "any"falsefalsefalse834), "attributes", [], "any"falsefalsefalse834), "get", ["_route"], "method"falsefalsefalse834);
  939.         // line 835
  940.         yield "    ";
  941.         $context["is_account_route"] = ((is_string($_v0 = ($context["current_route"] ?? null)) && is_string($_v1 "ui_account_") && str_starts_with($_v0$_v1)) || (($context["current_route"] ?? null) == "notifications_list"));
  942.         // line 836
  943.         yield "    <style>
  944.         /* Shared dark-mode fixes for the public account area. */
  945.         @media (prefers-color-scheme: dark) {
  946.             body.account-theme-scope {
  947.                 background-color: #111827;
  948.                 color: #e5e7eb;
  949.             }
  950.             body.account-theme-scope .card,
  951.             body.account-theme-scope .notification-item,
  952.             body.account-theme-scope .list-group-item,
  953.             body.account-theme-scope .modal-content,
  954.             body.account-theme-scope .dropdown-menu,
  955.             body.account-theme-scope .form-control,
  956.             body.account-theme-scope .form-select,
  957.             body.account-theme-scope .input-group-text,
  958.             body.account-theme-scope .accordion-item,
  959.             body.account-theme-scope .table,
  960.             body.account-theme-scope .table td,
  961.             body.account-theme-scope .table th {
  962.                 background-color: #1f2937 !important;
  963.                 border-color: #374151 !important;
  964.                 color: #e5e7eb !important;
  965.             }
  966.             body.account-theme-scope .card-header,
  967.             body.account-theme-scope .card-header.bg-white,
  968.             body.account-theme-scope .bg-white,
  969.             body.account-theme-scope .account-menu-list .menu-main {
  970.                 background-color: #182131 !important;
  971.                 border-color: #374151 !important;
  972.             }
  973.             body.account-theme-scope .text-muted,
  974.             body.account-theme-scope .form-text,
  975.             body.account-theme-scope .form-label,
  976.             body.account-theme-scope small,
  977.             body.account-theme-scope .small,
  978.             body.account-theme-scope .btn-outline-secondary,
  979.             body.account-theme-scope .btn-outline-secondary i {
  980.                 color: #aeb8c7 !important;
  981.             }
  982.             body.account-theme-scope h1,
  983.             body.account-theme-scope h2,
  984.             body.account-theme-scope h3,
  985.             body.account-theme-scope h4,
  986.             body.account-theme-scope h5,
  987.             body.account-theme-scope h6,
  988.             body.account-theme-scope .list-group-item,
  989.             body.account-theme-scope .card-title,
  990.             body.account-theme-scope .card-text,
  991.             body.account-theme-scope .notification-title,
  992.             body.account-theme-scope .notification-message,
  993.             body.account-theme-scope .notification-meta,
  994.             body.account-theme-scope .table,
  995.             body.account-theme-scope .table td,
  996.             body.account-theme-scope .table th,
  997.             body.account-theme-scope .table strong,
  998.             body.account-theme-scope .table a:not(.btn),
  999.             body.account-theme-scope .breadcrumb-banner,
  1000.             body.account-theme-scope .breadcrumb-banner a,
  1001.             body.account-theme-scope .breadcrumb-banner h1,
  1002.             body.account-theme-scope .empty-state-title,
  1003.             body.account-theme-scope .empty-state-text {
  1004.                 color: #e5e7eb !important;
  1005.             }
  1006.             body.account-theme-scope .account-menu-list .list-group-item:hover:not(.menu-action-active):not(.menu-main) {
  1007.                 background-color: #243041 !important;
  1008.             }
  1009.             body.account-theme-scope .notification-item.unread {
  1010.                 background-color: #172554 !important;
  1011.                 border-left-color: #60a5fa !important;
  1012.             }
  1013.             body.account-theme-scope .notification-item.archived {
  1014.                 opacity: 0.85;
  1015.             }
  1016.             body.account-theme-scope .btn-outline-primary,
  1017.             body.account-theme-scope .btn-outline-secondary,
  1018.             body.account-theme-scope .btn-outline-warning,
  1019.             body.account-theme-scope .btn-outline-danger {
  1020.                 background-color: transparent !important;
  1021.             }
  1022.             body.account-theme-scope .empty-state-icon {
  1023.                 color: #6b7280 !important;
  1024.             }
  1025.             body.account-theme-scope .profile-picture-container .profile-picture,
  1026.             body.account-theme-scope .profile-picture-mobile,
  1027.             body.account-theme-scope .profile-picture-edit-icon,
  1028.             body.account-theme-scope .profile-picture-edit-icon-mobile {
  1029.                 border-color: #111827 !important;
  1030.             }
  1031.         }
  1032.         html.dark-mode body.account-theme-scope,
  1033.         body.dark-mode.account-theme-scope,
  1034.         html[data-theme=\"dark\"] body.account-theme-scope,
  1035.         body[data-theme=\"dark\"].account-theme-scope,
  1036.         html[data-bs-theme=\"dark\"] body.account-theme-scope,
  1037.         body[data-bs-theme=\"dark\"].account-theme-scope {
  1038.             background-color: #111827;
  1039.             color: #e5e7eb;
  1040.         }
  1041.         html.dark-mode body.account-theme-scope .card,
  1042.         html.dark-mode body.account-theme-scope .notification-item,
  1043.         html.dark-mode body.account-theme-scope .list-group-item,
  1044.         html.dark-mode body.account-theme-scope .modal-content,
  1045.         html.dark-mode body.account-theme-scope .dropdown-menu,
  1046.         html.dark-mode body.account-theme-scope .form-control,
  1047.         html.dark-mode body.account-theme-scope .form-select,
  1048.         html.dark-mode body.account-theme-scope .input-group-text,
  1049.         html.dark-mode body.account-theme-scope .accordion-item,
  1050.         html.dark-mode body.account-theme-scope .table,
  1051.         html.dark-mode body.account-theme-scope .table td,
  1052.         html.dark-mode body.account-theme-scope .table th,
  1053.         body.dark-mode.account-theme-scope .card,
  1054.         body.dark-mode.account-theme-scope .notification-item,
  1055.         body.dark-mode.account-theme-scope .list-group-item,
  1056.         body.dark-mode.account-theme-scope .modal-content,
  1057.         body.dark-mode.account-theme-scope .dropdown-menu,
  1058.         body.dark-mode.account-theme-scope .form-control,
  1059.         body.dark-mode.account-theme-scope .form-select,
  1060.         body.dark-mode.account-theme-scope .input-group-text,
  1061.         body.dark-mode.account-theme-scope .accordion-item,
  1062.         body.dark-mode.account-theme-scope .table,
  1063.         body.dark-mode.account-theme-scope .table td,
  1064.         body.dark-mode.account-theme-scope .table th,
  1065.         html[data-theme=\"dark\"] body.account-theme-scope .card,
  1066.         html[data-theme=\"dark\"] body.account-theme-scope .notification-item,
  1067.         html[data-theme=\"dark\"] body.account-theme-scope .list-group-item,
  1068.         html[data-theme=\"dark\"] body.account-theme-scope .modal-content,
  1069.         html[data-theme=\"dark\"] body.account-theme-scope .dropdown-menu,
  1070.         html[data-theme=\"dark\"] body.account-theme-scope .form-control,
  1071.         html[data-theme=\"dark\"] body.account-theme-scope .form-select,
  1072.         html[data-theme=\"dark\"] body.account-theme-scope .input-group-text,
  1073.         html[data-theme=\"dark\"] body.account-theme-scope .accordion-item,
  1074.         html[data-theme=\"dark\"] body.account-theme-scope .table,
  1075.         html[data-theme=\"dark\"] body.account-theme-scope .table td,
  1076.         html[data-theme=\"dark\"] body.account-theme-scope .table th,
  1077.         body[data-theme=\"dark\"].account-theme-scope .card,
  1078.         body[data-theme=\"dark\"].account-theme-scope .notification-item,
  1079.         body[data-theme=\"dark\"].account-theme-scope .list-group-item,
  1080.         body[data-theme=\"dark\"].account-theme-scope .modal-content,
  1081.         body[data-theme=\"dark\"].account-theme-scope .dropdown-menu,
  1082.         body[data-theme=\"dark\"].account-theme-scope .form-control,
  1083.         body[data-theme=\"dark\"].account-theme-scope .form-select,
  1084.         body[data-theme=\"dark\"].account-theme-scope .input-group-text,
  1085.         body[data-theme=\"dark\"].account-theme-scope .accordion-item,
  1086.         body[data-theme=\"dark\"].account-theme-scope .table,
  1087.         body[data-theme=\"dark\"].account-theme-scope .table td,
  1088.         body[data-theme=\"dark\"].account-theme-scope .table th,
  1089.         html[data-bs-theme=\"dark\"] body.account-theme-scope .card,
  1090.         html[data-bs-theme=\"dark\"] body.account-theme-scope .notification-item,
  1091.         html[data-bs-theme=\"dark\"] body.account-theme-scope .list-group-item,
  1092.         html[data-bs-theme=\"dark\"] body.account-theme-scope .modal-content,
  1093.         html[data-bs-theme=\"dark\"] body.account-theme-scope .dropdown-menu,
  1094.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-control,
  1095.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-select,
  1096.         html[data-bs-theme=\"dark\"] body.account-theme-scope .input-group-text,
  1097.         html[data-bs-theme=\"dark\"] body.account-theme-scope .accordion-item,
  1098.         html[data-bs-theme=\"dark\"] body.account-theme-scope .table,
  1099.         html[data-bs-theme=\"dark\"] body.account-theme-scope .table td,
  1100.         html[data-bs-theme=\"dark\"] body.account-theme-scope .table th,
  1101.         body[data-bs-theme=\"dark\"].account-theme-scope .card,
  1102.         body[data-bs-theme=\"dark\"].account-theme-scope .notification-item,
  1103.         body[data-bs-theme=\"dark\"].account-theme-scope .list-group-item,
  1104.         body[data-bs-theme=\"dark\"].account-theme-scope .modal-content,
  1105.         body[data-bs-theme=\"dark\"].account-theme-scope .dropdown-menu,
  1106.         body[data-bs-theme=\"dark\"].account-theme-scope .form-control,
  1107.         body[data-bs-theme=\"dark\"].account-theme-scope .form-select,
  1108.         body[data-bs-theme=\"dark\"].account-theme-scope .input-group-text,
  1109.         body[data-bs-theme=\"dark\"].account-theme-scope .accordion-item,
  1110.         body[data-bs-theme=\"dark\"].account-theme-scope .table,
  1111.         body[data-bs-theme=\"dark\"].account-theme-scope .table td,
  1112.         body[data-bs-theme=\"dark\"].account-theme-scope .table th {
  1113.             background-color: #1f2937 !important;
  1114.             border-color: #374151 !important;
  1115.             color: #e5e7eb !important;
  1116.         }
  1117.         html.dark-mode body.account-theme-scope .card-header,
  1118.         html.dark-mode body.account-theme-scope .card-header.bg-white,
  1119.         html.dark-mode body.account-theme-scope .bg-white,
  1120.         html.dark-mode body.account-theme-scope .account-menu-list .menu-main,
  1121.         body.dark-mode.account-theme-scope .card-header,
  1122.         body.dark-mode.account-theme-scope .card-header.bg-white,
  1123.         body.dark-mode.account-theme-scope .bg-white,
  1124.         body.dark-mode.account-theme-scope .account-menu-list .menu-main,
  1125.         html[data-theme=\"dark\"] body.account-theme-scope .card-header,
  1126.         html[data-theme=\"dark\"] body.account-theme-scope .card-header.bg-white,
  1127.         html[data-theme=\"dark\"] body.account-theme-scope .bg-white,
  1128.         html[data-theme=\"dark\"] body.account-theme-scope .account-menu-list .menu-main,
  1129.         body[data-theme=\"dark\"].account-theme-scope .card-header,
  1130.         body[data-theme=\"dark\"].account-theme-scope .card-header.bg-white,
  1131.         body[data-theme=\"dark\"].account-theme-scope .bg-white,
  1132.         body[data-theme=\"dark\"].account-theme-scope .account-menu-list .menu-main,
  1133.         html[data-bs-theme=\"dark\"] body.account-theme-scope .card-header,
  1134.         html[data-bs-theme=\"dark\"] body.account-theme-scope .card-header.bg-white,
  1135.         html[data-bs-theme=\"dark\"] body.account-theme-scope .bg-white,
  1136.         html[data-bs-theme=\"dark\"] body.account-theme-scope .account-menu-list .menu-main,
  1137.         body[data-bs-theme=\"dark\"].account-theme-scope .card-header,
  1138.         body[data-bs-theme=\"dark\"].account-theme-scope .card-header.bg-white,
  1139.         body[data-bs-theme=\"dark\"].account-theme-scope .bg-white,
  1140.         body[data-bs-theme=\"dark\"].account-theme-scope .account-menu-list .menu-main {
  1141.             background-color: #182131 !important;
  1142.             border-color: #374151 !important;
  1143.         }
  1144.         html.dark-mode body.account-theme-scope .text-muted,
  1145.         html.dark-mode body.account-theme-scope .form-text,
  1146.         html.dark-mode body.account-theme-scope .form-label,
  1147.         html.dark-mode body.account-theme-scope small,
  1148.         html.dark-mode body.account-theme-scope .small,
  1149.         html.dark-mode body.account-theme-scope .btn-outline-secondary,
  1150.         html.dark-mode body.account-theme-scope .btn-outline-secondary i,
  1151.         body.dark-mode.account-theme-scope .text-muted,
  1152.         body.dark-mode.account-theme-scope .form-text,
  1153.         body.dark-mode.account-theme-scope .form-label,
  1154.         body.dark-mode.account-theme-scope small,
  1155.         body.dark-mode.account-theme-scope .small,
  1156.         body.dark-mode.account-theme-scope .btn-outline-secondary,
  1157.         body.dark-mode.account-theme-scope .btn-outline-secondary i,
  1158.         html[data-theme=\"dark\"] body.account-theme-scope .text-muted,
  1159.         html[data-theme=\"dark\"] body.account-theme-scope .form-text,
  1160.         html[data-theme=\"dark\"] body.account-theme-scope .form-label,
  1161.         html[data-theme=\"dark\"] body.account-theme-scope small,
  1162.         html[data-theme=\"dark\"] body.account-theme-scope .small,
  1163.         html[data-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary,
  1164.         html[data-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary i,
  1165.         body[data-theme=\"dark\"].account-theme-scope .text-muted,
  1166.         body[data-theme=\"dark\"].account-theme-scope .form-text,
  1167.         body[data-theme=\"dark\"].account-theme-scope .form-label,
  1168.         body[data-theme=\"dark\"].account-theme-scope small,
  1169.         body[data-theme=\"dark\"].account-theme-scope .small,
  1170.         body[data-theme=\"dark\"].account-theme-scope .btn-outline-secondary,
  1171.         body[data-theme=\"dark\"].account-theme-scope .btn-outline-secondary i,
  1172.         html[data-bs-theme=\"dark\"] body.account-theme-scope .text-muted,
  1173.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-text,
  1174.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-label,
  1175.         html[data-bs-theme=\"dark\"] body.account-theme-scope small,
  1176.         html[data-bs-theme=\"dark\"] body.account-theme-scope .small,
  1177.         html[data-bs-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary,
  1178.         html[data-bs-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary i,
  1179.         body[data-bs-theme=\"dark\"].account-theme-scope .text-muted,
  1180.         body[data-bs-theme=\"dark\"].account-theme-scope .form-text,
  1181.         body[data-bs-theme=\"dark\"].account-theme-scope .form-label,
  1182.         body[data-bs-theme=\"dark\"].account-theme-scope small,
  1183.         body[data-bs-theme=\"dark\"].account-theme-scope .small,
  1184.         body[data-bs-theme=\"dark\"].account-theme-scope .btn-outline-secondary,
  1185.         body[data-bs-theme=\"dark\"].account-theme-scope .btn-outline-secondary i {
  1186.             color: #aeb8c7 !important;
  1187.         }
  1188.         html.dark-mode body.account-theme-scope .empty-state-icon,
  1189.         body.dark-mode.account-theme-scope .empty-state-icon,
  1190.         html[data-theme=\"dark\"] body.account-theme-scope .empty-state-icon,
  1191.         body[data-theme=\"dark\"].account-theme-scope .empty-state-icon,
  1192.         html[data-bs-theme=\"dark\"] body.account-theme-scope .empty-state-icon,
  1193.         body[data-bs-theme=\"dark\"].account-theme-scope .empty-state-icon {
  1194.             color: #6b7280 !important;
  1195.         }
  1196.     </style>
  1197. </head>
  1198. <body ";
  1199.         // line 1106
  1200.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "listing"))) {
  1201.             yield "id=\"category\"";
  1202.         }
  1203.         yield " class=\"";
  1204.         if ((($tmp = ($context["is_account_route"] ?? null)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1205.             yield "account-theme-scope";
  1206.         }
  1207.         yield "\">
  1208. <!-- Start Header Area -->
  1209. <header class=\"header_area sticky-header\">
  1210.     <div class=\"main_menu\">
  1211.         <nav class=\"navbar navbar-expand-lg navbar-light main_box\">
  1212.             <div class=\"container\">
  1213.                 <!-- Brand and toggle get grouped for better mobile display -->
  1214.                 <a class=\"navbar-brand logo_h\" href=\"";
  1215.         // line 1114
  1216.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_home");
  1217.         yield "\"><img style=\"width: auto;height: 60px\" src=\"";
  1218.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("logo.png"), "html"nulltrue);
  1219.         yield "\" alt=\"\"></a>
  1220.                 <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\"
  1221.                         aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">
  1222.                     <span class=\"icon-bar\"></span>
  1223.                     <span class=\"icon-bar\"></span>
  1224.                     <span class=\"icon-bar\"></span>
  1225.                 </button>
  1226.                 <!-- Collect the nav links, forms, and other content for toggling -->
  1227.                 <div class=\"collapse navbar-collapse offset\" id=\"navbarSupportedContent\">
  1228.                     <ul class=\"nav navbar-nav menu_nav ml-auto\">
  1229.                         <li class=\"nav-item ";
  1230.         // line 1124
  1231.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "home"))) {
  1232.             yield "active";
  1233.         }
  1234.         yield "\">
  1235.                             <a class=\"nav-link\" href=\"";
  1236.         // line 1125
  1237.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_home");
  1238.         yield "\">Accueil</a>
  1239.                         </li>
  1240.                         <li class=\"nav-item ";
  1241.         // line 1127
  1242.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "shops"))) {
  1243.             yield "active";
  1244.         }
  1245.         yield "\">
  1246.                             <a class=\"nav-link\" href=\"";
  1247.         // line 1128
  1248.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shops_list");
  1249.         yield "\">Boutiques</a>
  1250.                         </li>
  1251.                         <li class=\"nav-item ";
  1252.         // line 1130
  1253.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "listing"))) {
  1254.             yield "active";
  1255.         }
  1256.         yield "\">
  1257.                             <a class=\"nav-link\" href=\"";
  1258.         // line 1131
  1259.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
  1260.         yield "\">Produits</a>
  1261.                         </li>
  1262.                         <li class=\"nav-item ";
  1263.         // line 1133
  1264.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "blog"))) {
  1265.             yield "active";
  1266.         }
  1267.         yield "\">
  1268.                             <a class=\"nav-link\" href=\"";
  1269.         // line 1134
  1270.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_blog");
  1271.         yield "\">Blog</a>
  1272.                         </li>
  1273.                         <li class=\"nav-item ";
  1274.         // line 1136
  1275.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "contact"))) {
  1276.             yield "active";
  1277.         }
  1278.         yield "\">
  1279.                             <a class=\"nav-link\" href=\"";
  1280.         // line 1137
  1281.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_contact");
  1282.         yield "\">Contact</a>
  1283.                         </li>
  1284.                     </ul>
  1285.                     <ul class=\"nav navbar-nav navbar-right\">
  1286.                         <li class=\"nav-item header-icons-item\">
  1287.                             <div class=\"navbar-icons-wrapper\">
  1288.                                 <a href=\"";
  1289.         // line 1143
  1290.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_cart");
  1291.         yield "\" class=\"cart ";
  1292.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "cart"))) {
  1293.             yield "active";
  1294.         }
  1295.         yield "\" aria-label=\"Panier\">
  1296.                                     <span class=\"ti-bag\"></span>
  1297.                                 </a>
  1298.                                 <a href=\"";
  1299.         // line 1146
  1300.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_comparison");
  1301.         yield "\" class=\"comparison-icon ";
  1302.         if ((array_key_exists("current_menu"$context) && (($context["current_menu"] ?? null) == "comparison"))) {
  1303.             yield "active";
  1304.         }
  1305.         yield "\" title=\"Comparaison premium\" aria-label=\"Comparaison premium\">
  1306.                                     <span class=\"lnr lnr-sync\"></span>
  1307.                                     <span class=\"comparison-badge\" id=\"comparisonBadge\" data-comparison-badge style=\"display: none;\">0</span>
  1308.                                 </a>
  1309.                                 ";
  1310.         // line 1150
  1311.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse1150)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1312.             // line 1151
  1313.             yield "                                <a href=\"";
  1314.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("notifications_list");
  1315.             yield "\" class=\"notification-icon\" title=\"Notifications\" aria-label=\"Notifications\">
  1316.                                     <span class=\"ti-bell\"></span>
  1317.                                     <span class=\"notification-badge text-white\" id=\"notificationBadge\" style=\"display: none;color: white;\">0</span>
  1318.                                 </a>
  1319.                                 ";
  1320.         }
  1321.         // line 1156
  1322.         yield "                                <button class=\"theme-toggle-btn\" type=\"button\" data-theme-toggle aria-label=\"Passer au mode sombre\" title=\"Passer au mode sombre\">
  1323.                                     <span class=\"ti-moon\" data-theme-icon></span>
  1324.                                 </button>
  1325.                                 <button class=\"search\" type=\"button\" aria-label=\"Recherche\">
  1326.                                     <span class=\"lnr lnr-magnifier\" id=\"search\"></span>
  1327.                                 </button>
  1328.                             </div>
  1329.                         </li>
  1330.                         <li class=\"nav-item header-account-item\">
  1331.                             ";
  1332.         // line 1165
  1333.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse1165)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1334.             // line 1166
  1335.             yield "                                <a class=\"btn btn-primary btn-account header-account-link text-white\" href=\"";
  1336.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_account_index");
  1337.             yield "\">
  1338.                                     <i class=\"ti-user\"></i> Mon compte
  1339.                                 </a>
  1340.                             ";
  1341.         } else {
  1342.             // line 1170
  1343.             yield "                                <a class=\"btn btn-primary btn-account header-account-link text-white\" href=\"";
  1344.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  1345.             yield "\">
  1346.                                     <i class=\"ti-lock\"></i>Se connecter
  1347.                                 </a>
  1348.                             ";
  1349.         }
  1350.         // line 1174
  1351.         yield "                        </li>
  1352.                     </ul>
  1353.                 </div>
  1354.             </div>
  1355.         </nav>
  1356.     </div>
  1357.     <div class=\"search_input\" id=\"search_input_box\">
  1358.         <div class=\"container\">
  1359.             <form class=\"d-flex justify-content-between\">
  1360.                 <input type=\"text\" class=\"form-control\" id=\"search_input\" placeholder=\"Search Here\">
  1361.                 <button type=\"submit\" class=\"btn\"></button>
  1362.                 <span class=\"lnr lnr-cross\" id=\"close_search\" title=\"Close Search\"></span>
  1363.             </form>
  1364.         </div>
  1365.     </div>
  1366. </header>
  1367. <!-- End Header Area -->
  1368. <!-- Flash Messages -->
  1369. <div class=\"container mt-3\" id=\"flash-messages-container\" style=\"position: relative; z-index: 1050;\">
  1370.     <div class=\"row\">
  1371.         <div class=\"col-12\">
  1372.             ";
  1373.         // line 1196
  1374.         $context['_parent'] = $context;
  1375.         $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "flashes", ["success"], "method"falsefalsefalse1196));
  1376.         foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
  1377.             // line 1197
  1378.             yield "                <div class=\"alert alert-success alert-dismissible fade show flash-message\" role=\"alert\">
  1379.                     <i class=\"fa fa-check-circle\"></i>
  1380.                     <strong>";
  1381.             // line 1199
  1382.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html"nulltrue);
  1383.             yield "</strong>
  1384.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  1385.                 </div>
  1386.             ";
  1387.         }
  1388.         $_parent $context['_parent'];
  1389.         unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
  1390.         $context array_intersect_key($context$_parent) + $_parent;
  1391.         // line 1203
  1392.         yield "            
  1393.             ";
  1394.         // line 1204
  1395.         $context['_parent'] = $context;
  1396.         $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "flashes", ["error"], "method"falsefalsefalse1204));
  1397.         foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
  1398.             // line 1205
  1399.             yield "                <div class=\"alert alert-danger alert-dismissible fade show flash-message\" role=\"alert\">
  1400.                     <i class=\"fa fa-exclamation-circle\"></i>
  1401.                     <strong>";
  1402.             // line 1207
  1403.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html"nulltrue);
  1404.             yield "</strong>
  1405.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  1406.                 </div>
  1407.             ";
  1408.         }
  1409.         $_parent $context['_parent'];
  1410.         unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
  1411.         $context array_intersect_key($context$_parent) + $_parent;
  1412.         // line 1211
  1413.         yield "            
  1414.             ";
  1415.         // line 1212
  1416.         $context['_parent'] = $context;
  1417.         $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "flashes", ["warning"], "method"falsefalsefalse1212));
  1418.         foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
  1419.             // line 1213
  1420.             yield "                <div class=\"alert alert-warning alert-dismissible fade show flash-message\" role=\"alert\">
  1421.                     <i class=\"fa fa-exclamation-triangle\"></i>
  1422.                     <strong>";
  1423.             // line 1215
  1424.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html"nulltrue);
  1425.             yield "</strong>
  1426.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  1427.                 </div>
  1428.             ";
  1429.         }
  1430.         $_parent $context['_parent'];
  1431.         unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
  1432.         $context array_intersect_key($context$_parent) + $_parent;
  1433.         // line 1219
  1434.         yield "            
  1435.             ";
  1436.         // line 1220
  1437.         $context['_parent'] = $context;
  1438.         $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "flashes", ["info"], "method"falsefalsefalse1220));
  1439.         foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
  1440.             // line 1221
  1441.             yield "                <div class=\"alert alert-info alert-dismissible fade show flash-message\" role=\"alert\">
  1442.                     <i class=\"fa fa-info-circle\"></i>
  1443.                     <strong>";
  1444.             // line 1223
  1445.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html"nulltrue);
  1446.             yield "</strong>
  1447.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  1448.                 </div>
  1449.             ";
  1450.         }
  1451.         $_parent $context['_parent'];
  1452.         unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
  1453.         $context array_intersect_key($context$_parent) + $_parent;
  1454.         // line 1227
  1455.         yield "        </div>
  1456.     </div>
  1457. </div>
  1458. <div id=\"comparisonTray\" class=\"comparison-tray\" aria-live=\"polite\">
  1459.     <div class=\"comparison-tray__header\">
  1460.         <div>
  1461.             <p class=\"comparison-tray__title\">Comparaison premium</p>
  1462.             <p class=\"comparison-tray__meta\" id=\"comparisonTrayMeta\">Aucun produit en comparaison</p>
  1463.         </div>
  1464.         <a href=\"";
  1465.         // line 1237
  1466.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_comparison");
  1467.         yield "\" class=\"comparison-tray__go\">Ouvrir</a>
  1468.     </div>
  1469.     <div class=\"comparison-tray__items\" id=\"comparisonTrayItems\"></div>
  1470.     <p class=\"comparison-tray__empty\" id=\"comparisonTrayEmpty\">Ajoute des produits d'une meme categorie pour obtenir une comparaison ultra pertinente.</p>
  1471.     <div class=\"comparison-tray__actions\">
  1472.         <a href=\"";
  1473.         // line 1242
  1474.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_comparison");
  1475.         yield "\" class=\"comparison-tray__go\">Comparer maintenant</a>
  1476.         <button type=\"button\" class=\"comparison-tray__clear\" id=\"comparisonTrayClear\">Vider</button>
  1477.     </div>
  1478. </div>
  1479. ";
  1480.         // line 1247
  1481.         yield from $this->unwrap()->yieldBlock('body'$context$blocks);
  1482.         // line 1248
  1483.         yield "
  1484. <!-- start footer Area -->
  1485. <footer class=\"footer-area section_gap\">
  1486.     <div class=\"footer-pattern\"></div>
  1487.     <div class=\"container\">
  1488.         <div class=\"row\">
  1489.             <div class=\"col-lg-3 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  1490.                 <div class=\"single-footer-widget\">
  1491.                     <div class=\"footer-logo mb-3\">
  1492.                         <h4 class=\"footer-brand\">MaketOu</h4>
  1493.                     </div>
  1494.                     <p class=\"footer-description\">
  1495.                         MaketOu est la première marketplace haïtienne qui connecte les acheteurs et les vendeurs. 
  1496.                         Nous offrons une plateforme sécurisée et moderne pour le commerce en ligne en Haïti.
  1497.                     </p>
  1498.                     <div class=\"footer-social mt-3\">
  1499.                         <h6 class=\"mb-2\">Suivez-nous</h6>
  1500.                         <div class=\"footer-social-icons\">
  1501.                             <a href=\"#\" class=\"social-icon\" aria-label=\"Facebook\" title=\"Facebook\">
  1502.                                 <i class=\"fa fa-facebook\"></i>
  1503.                             </a>
  1504.                             <a href=\"#\" class=\"social-icon\" aria-label=\"Twitter\" title=\"Twitter\">
  1505.                                 <i class=\"fa fa-twitter\"></i>
  1506.                             </a>
  1507.                             <a href=\"#\" class=\"social-icon\" aria-label=\"Instagram\" title=\"Instagram\">
  1508.                                 <i class=\"fa fa-instagram\"></i>
  1509.                             </a>
  1510.                             <a href=\"#\" class=\"social-icon\" aria-label=\"LinkedIn\" title=\"LinkedIn\">
  1511.                                 <i class=\"fa fa-linkedin\"></i>
  1512.                             </a>
  1513.                         </div>
  1514.                     </div>
  1515.                 </div>
  1516.             </div>
  1517.             <div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  1518.                 <div class=\"single-footer-widget\">
  1519.                     <h6 class=\"footer-widget-title\">Liens rapides</h6>
  1520.                     <ul class=\"footer-list\">
  1521.                         <li><a href=\"";
  1522.         // line 1286
  1523.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_home");
  1524.         yield "\"><i class=\"fa fa-angle-right me-2\"></i>Accueil</a></li>
  1525.                         <li><a href=\"";
  1526.         // line 1287
  1527.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
  1528.         yield "\"><i class=\"fa fa-angle-right me-2\"></i>Produits</a></li>
  1529.                         <li><a href=\"";
  1530.         // line 1288
  1531.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shops_list");
  1532.         yield "\"><i class=\"fa fa-angle-right me-2\"></i>Boutiques</a></li>
  1533.                         ";
  1534.         // line 1289
  1535.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse1289)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1536.             // line 1290
  1537.             yield "                            <li><a href=\"";
  1538.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_account_index");
  1539.             yield "\"><i class=\"fa fa-angle-right me-2\"></i>Mon compte</a></li>
  1540.                         ";
  1541.         } else {
  1542.             // line 1292
  1543.             yield "                            <li><a href=\"";
  1544.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  1545.             yield "\"><i class=\"fa fa-angle-right me-2\"></i>Se connecter</a></li>
  1546.                             <li><a href=\"";
  1547.             // line 1293
  1548.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_register");
  1549.             yield "\"><i class=\"fa fa-angle-right me-2\"></i>S'inscrire</a></li>
  1550.                         ";
  1551.         }
  1552.         // line 1295
  1553.         yield "                    </ul>
  1554.                 </div>
  1555.             </div>
  1556.             <div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  1557.                 <div class=\"single-footer-widget\">
  1558.                     <h6 class=\"footer-widget-title\">Pour les vendeurs</h6>
  1559.                     <ul class=\"footer-list\">
  1560.                         <li><a href=\"";
  1561.         // line 1302
  1562.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_index");
  1563.         yield "\"><i class=\"fa fa-angle-right me-2\"></i>Ouvrir une boutique</a></li>
  1564.                         <li><a href=\"";
  1565.         // line 1303
  1566.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_help_how_to_sell");
  1567.         yield "\"><i class=\"fa fa-angle-right me-2\"></i>Comment vendre</a></li>
  1568.                         <li><a href=\"";
  1569.         // line 1304
  1570.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_help_pricing");
  1571.         yield "\"><i class=\"fa fa-angle-right me-2\"></i>Tarifs</a></li>
  1572.                         <li><a href=\"";
  1573.         // line 1305
  1574.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_help_support");
  1575.         yield "\"><i class=\"fa fa-angle-right me-2\"></i>Support vendeur</a></li>
  1576.                     </ul>
  1577.                 </div>
  1578.             </div>
  1579.             <div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  1580.                 <div class=\"single-footer-widget\">
  1581.                     <h6 class=\"footer-widget-title\">Support</h6>
  1582.                     <ul class=\"footer-list\">
  1583.                         <li><a href=\"";
  1584.         // line 1313
  1585.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_help");
  1586.         yield "\"><i class=\"fa fa-angle-right me-2\"></i> Centre d'Aide</a></li>
  1587.                         <li><a href=\"";
  1588.         // line 1314
  1589.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_contact");
  1590.         yield "\"><i class=\"fa fa-angle-right me-2\"></i> Contactez-nous</a></li>
  1591.                         <li><a href=\"";
  1592.         // line 1315
  1593.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_faq");
  1594.         yield "\"><i class=\"fa fa-angle-right me-2\"></i> FAQ</a></li>
  1595.                         <li><a href=\"";
  1596.         // line 1316
  1597.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_privacy");
  1598.         yield "\"><i class=\"fa fa-angle-right me-2\"></i> Politique de Confidentialité</a></li>
  1599.                         <li><a href=\"";
  1600.         // line 1317
  1601.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_terms");
  1602.         yield "\"><i class=\"fa fa-angle-right me-2\"></i> Conditions d'Utilisation</a></li>
  1603.                     </ul>
  1604.                 </div>
  1605.             </div>
  1606.             <div class=\"col-lg-3 col-md-6 col-sm-6\">
  1607.                 <div class=\"single-footer-widget\">
  1608.                     <h6 class=\"footer-widget-title\">Newsletter</h6>
  1609.                     <p class=\"footer-newsletter-text\">Restez informé des dernières nouveautés</p>
  1610.                     <div class=\"footer-newsletter-wrapper\" id=\"mc_embed_signup\">
  1611.                         <form action=\"";
  1612.         // line 1326
  1613.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_newsletter_subscribe");
  1614.         yield "\" method=\"post\" class=\"footer-newsletter-form\">
  1615.                             <div class=\"newsletter-input-group\">
  1616.                                 <i class=\"fa fa-envelope newsletter-icon\"></i>
  1617.                                 <input class=\"form-control newsletter-input\" name=\"email\" placeholder=\"Votre email\" required type=\"email\">
  1618.                                 <button type=\"submit\" class=\"newsletter-btn\" aria-label=\"S'abonner\">
  1619.                                     <span class=\"newsletter-btn-icon\">
  1620.                                         <i class=\"fa fa-paper-plane\" aria-hidden=\"true\"></i>
  1621.                                     </span>
  1622.                                     <span class=\"newsletter-btn-loader\" style=\"display: none;\">
  1623.                                         <i class=\"fa fa-spinner fa-spin\" aria-hidden=\"true\"></i>
  1624.                                     </span>
  1625.                                 </button>
  1626.                             </div>
  1627.                         </form>
  1628.                     </div>
  1629.                     <div class=\"footer-trust-badges mt-3\">
  1630.                         <div class=\"trust-item\">
  1631.                             <i class=\"fa fa-shield\"></i>
  1632.                             <span>Paiement sécurisé</span>
  1633.                         </div>
  1634.                         <div class=\"trust-item\">
  1635.                             <i class=\"fa fa-truck\"></i>
  1636.                             <span>Livraison rapide</span>
  1637.                         </div>
  1638.                     </div>
  1639.                 </div>
  1640.             </div>
  1641.         </div>
  1642.         <div class=\"footer-divider\"></div>
  1643.         <div class=\"footer-bottom d-flex justify-content-center align-items-center flex-wrap\">
  1644.             <p class=\"footer-text m-0\">
  1645.                 Copyright &copy;<script>document.write(new Date().getFullYear());</script>
  1646.                 Tous droits réservés | Ce site a été fait avec <i class=\"fa fa-heart-o\" aria-hidden=\"true\" style=\"color: #dc3545;\"></i> par <a
  1647.                         href=\"https://tech.foulgor.com\" target=\"_blank\" style=\"color: #ffa200;\">Foulgor Tech</a>
  1648.             </p>
  1649.         </div>
  1650.     </div>
  1651. </footer>
  1652. <style>
  1653. /* ============================================
  1654.    FOOTER MODERNE - Design amélioré
  1655.    ============================================ */
  1656. .footer-area {
  1657.     background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
  1658.     position: relative;
  1659.     overflow: hidden;
  1660.     padding: 50px 0 20px;
  1661. }
  1662. .footer-pattern {
  1663.     position: absolute;
  1664.     top: 0;
  1665.     left: 0;
  1666.     right: 0;
  1667.     bottom: 0;
  1668.     background-image: 
  1669.         radial-gradient(circle at 20% 50%, rgba(255, 162, 0, 0.1) 0%, transparent 50%),
  1670.         radial-gradient(circle at 80% 80%, rgba(255, 162, 0, 0.08) 0%, transparent 50%);
  1671.     pointer-events: none;
  1672. }
  1673. .footer-area .container {
  1674.     position: relative;
  1675.     z-index: 1;
  1676. }
  1677. /* Widgets */
  1678. .single-footer-widget {
  1679.     color: rgba(255, 255, 255, 0.9);
  1680. }
  1681. .footer-brand {
  1682.     font-size: 1.6rem;
  1683.     font-weight: 700;
  1684.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1685.     -webkit-background-clip: text;
  1686.     -webkit-text-fill-color: transparent;
  1687.     background-clip: text;
  1688.     margin-bottom: 12px;
  1689.     display: inline-block;
  1690. }
  1691. .footer-widget-title {
  1692.     color: #fff;
  1693.     font-size: 1rem;
  1694.     font-weight: 600;
  1695.     margin-bottom: 18px;
  1696.     position: relative;
  1697.     padding-bottom: 8px;
  1698. }
  1699. .footer-widget-title::after {
  1700.     content: '';
  1701.     position: absolute;
  1702.     bottom: 0;
  1703.     left: 0;
  1704.     width: 40px;
  1705.     height: 3px;
  1706.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1707.     border-radius: 2px;
  1708. }
  1709. .footer-description {
  1710.     color: rgba(255, 255, 255, 0.7);
  1711.     line-height: 1.6;
  1712.     font-size: 0.9rem;
  1713.     margin-bottom: 0;
  1714. }
  1715. /* Liste de liens */
  1716. .footer-list {
  1717.     list-style: none;
  1718.     padding: 0;
  1719.     margin: 0;
  1720. }
  1721. .footer-list li {
  1722.     margin-bottom: 10px;
  1723. }
  1724. .footer-list li a {
  1725.     color: rgba(255, 255, 255, 0.7);
  1726.     text-decoration: none;
  1727.     transition: all 0.3s ease;
  1728.     font-size: 0.9rem;
  1729.     display: inline-flex;
  1730.     align-items: center;
  1731. }
  1732. .footer-list li a i {
  1733.     font-size: 0.8rem;
  1734.     opacity: 0.6;
  1735.     transition: all 0.3s ease;
  1736. }
  1737. .footer-list li a:hover {
  1738.     color: #ffa200;
  1739.     transform: translateX(5px);
  1740. }
  1741. .footer-list li a:hover i {
  1742.     opacity: 1;
  1743.     color: #ffa200;
  1744. }
  1745. /* Newsletter */
  1746. .footer-newsletter-text {
  1747.     color: rgba(255, 255, 255, 0.7);
  1748.     font-size: 0.85rem;
  1749.     margin-bottom: 15px;
  1750.     line-height: 1.5;
  1751. }
  1752. .footer-newsletter-wrapper {
  1753.     margin-bottom: 15px;
  1754. }
  1755. .newsletter-input-group {
  1756.     display: flex;
  1757.     align-items: center;
  1758.     background: rgba(255, 255, 255, 0.08);
  1759.     border-radius: 30px;
  1760.     padding: 4px 4px 4px 15px;
  1761.     backdrop-filter: blur(10px);
  1762.     border: 1px solid rgba(255, 255, 255, 0.15);
  1763.     transition: all 0.3s ease;
  1764.     gap: 8px;
  1765. }
  1766. .newsletter-input-group:focus-within {
  1767.     background: rgba(255, 255, 255, 0.12);
  1768.     border-color: rgba(255, 162, 0, 0.6);
  1769.     box-shadow: 0 0 0 2px rgba(255, 162, 0, 0.15);
  1770. }
  1771. .newsletter-icon {
  1772.     color: rgba(255, 255, 255, 0.5);
  1773.     font-size: 0.9rem;
  1774.     flex-shrink: 0;
  1775. }
  1776. .newsletter-input-group:focus-within .newsletter-icon {
  1777.     color: #ffa200;
  1778. }
  1779. .newsletter-input {
  1780.     flex: 1;
  1781.     background: transparent;
  1782.     border: none;
  1783.     color: #fff;
  1784.     padding: 10px 8px;
  1785.     font-size: 0.9rem;
  1786.     min-width: 0;
  1787. }
  1788. .newsletter-input::placeholder {
  1789.     color: rgba(255, 255, 255, 0.4);
  1790.     font-size: 0.85rem;
  1791. }
  1792. .newsletter-input:focus {
  1793.     outline: none;
  1794.     box-shadow: none;
  1795. }
  1796. .newsletter-btn {
  1797.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1798.     border: none;
  1799.     color: white;
  1800.     width: 42px;
  1801.     height: 42px;
  1802.     min-width: 42px;
  1803.     min-height: 42px;
  1804.     border-radius: 50%;
  1805.     display: flex;
  1806.     align-items: center;
  1807.     justify-content: center;
  1808.     cursor: pointer;
  1809.     transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  1810.     flex-shrink: 0;
  1811.     box-shadow: 0 4px 15px rgba(255, 162, 0, 0.4), 
  1812.                 0 0 0 0 rgba(255, 162, 0, 0.4);
  1813.     font-size: 0.9rem;
  1814.     position: relative;
  1815.     overflow: hidden;
  1816. }
  1817. .newsletter-btn::before {
  1818.     content: '';
  1819.     position: absolute;
  1820.     top: 50%;
  1821.     left: 50%;
  1822.     width: 0;
  1823.     height: 0;
  1824.     border-radius: 50%;
  1825.     background: rgba(255, 255, 255, 0.3);
  1826.     transform: translate(-50%, -50%);
  1827.     transition: width 0.6s ease, height 0.6s ease;
  1828. }
  1829. .newsletter-btn:hover::before {
  1830.     width: 100%;
  1831.     height: 100%;
  1832. }
  1833. .newsletter-btn:hover {
  1834.     transform: translateX(3px) scale(1.05);
  1835.     box-shadow: 0 6px 20px rgba(255, 162, 0, 0.5),
  1836.                 0 0 0 8px rgba(255, 162, 0, 0.1);
  1837.     background: linear-gradient(135deg, #e8910a 0%, #ffa200 100%);
  1838. }
  1839. .newsletter-btn:active {
  1840.     transform: translateX(3px) scale(0.98);
  1841.     box-shadow: 0 3px 10px rgba(255, 162, 0, 0.4);
  1842. }
  1843. .newsletter-btn:focus {
  1844.     outline: none;
  1845.     box-shadow: 0 4px 15px rgba(255, 162, 0, 0.4),
  1846.                 0 0 0 3px rgba(255, 162, 0, 0.3);
  1847. }
  1848. .newsletter-btn-icon,
  1849. .newsletter-btn-loader {
  1850.     position: relative;
  1851.     z-index: 2;
  1852.     display: flex;
  1853.     align-items: center;
  1854.     justify-content: center;
  1855.     transition: all 0.3s ease;
  1856. }
  1857. .newsletter-btn:hover .newsletter-btn-icon {
  1858.     transform: translateX(2px) rotate(-10deg);
  1859. }
  1860. .newsletter-btn.loading .newsletter-btn-icon {
  1861.     opacity: 0;
  1862.     transform: scale(0);
  1863. }
  1864. .newsletter-btn.loading .newsletter-btn-loader {
  1865.     display: flex !important;
  1866. }
  1867. .newsletter-btn.success {
  1868.     background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  1869.     box-shadow: 0 4px 15px rgba(40, 167, 69, 0.4);
  1870. }
  1871. .newsletter-btn.success .newsletter-btn-icon i::before {
  1872.     content: \"\\f00c\";
  1873. }
  1874. /* Trust badges */
  1875. .footer-trust-badges {
  1876.     display: flex;
  1877.     flex-direction: row;
  1878.     gap: 15px;
  1879.     flex-wrap: wrap;
  1880. }
  1881. .trust-item {
  1882.     display: flex;
  1883.     align-items: center;
  1884.     gap: 6px;
  1885.     color: rgba(255, 255, 255, 0.6);
  1886.     font-size: 0.8rem;
  1887. }
  1888. .trust-item i {
  1889.     color: #ffa200;
  1890.     font-size: 0.9rem;
  1891. }
  1892. /* Social icons */
  1893. .footer-social {
  1894.     margin-top: 0 !important;
  1895.     position: relative !important;
  1896.     width: 100% !important;
  1897.     clear: both !important;
  1898.     float: none !important;
  1899. }
  1900. .footer-social h6 {
  1901.     color: #fff;
  1902.     font-size: 0.95rem;
  1903.     font-weight: 600;
  1904.     margin-bottom: 12px !important;
  1905.     display: block !important;
  1906.     width: 100% !important;
  1907.     position: relative !important;
  1908.     clear: both !important;
  1909.     float: none !important;
  1910. }
  1911. .footer-social-icons {
  1912.     display: flex !important;
  1913.     gap: 12px !important;
  1914.     flex-wrap: wrap !important;
  1915.     align-items: center !important;
  1916.     justify-content: flex-start !important;
  1917.     width: 100% !important;
  1918.     position: relative !important;
  1919.     clear: both !important;
  1920.     float: none !important;
  1921.     margin: 0 !important;
  1922.     padding: 0 !important;
  1923. }
  1924. .social-icon {
  1925.     width: 38px !important;
  1926.     height: 38px !important;
  1927.     min-width: 38px !important;
  1928.     min-height: 38px !important;
  1929.     display: inline-flex !important;
  1930.     align-items: center !important;
  1931.     justify-content: center !important;
  1932.     background: rgba(255, 255, 255, 0.1) !important;
  1933.     border-radius: 50% !important;
  1934.     color: rgba(255, 255, 255, 0.8) !important;
  1935.     text-decoration: none !important;
  1936.     transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
  1937.     font-size: 16px !important;
  1938.     line-height: 1 !important;
  1939.     backdrop-filter: blur(10px) !important;
  1940.     border: 1px solid rgba(255, 255, 255, 0.1) !important;
  1941.     flex-shrink: 0 !important;
  1942.     position: relative !important;
  1943.     float: none !important;
  1944.     margin: 0 !important;
  1945.     padding: 0 !important;
  1946.     vertical-align: middle !important;
  1947. }
  1948. .social-icon i {
  1949.     font-size: 16px !important;
  1950.     line-height: 1 !important;
  1951.     display: inline-block !important;
  1952.     transition: transform 0.3s ease !important;
  1953.     position: relative !important;
  1954.     z-index: 1 !important;
  1955.     margin: 0 !important;
  1956.     padding: 0 !important;
  1957. }
  1958. .social-icon:hover {
  1959.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%) !important;
  1960.     transform: translateY(-5px) scale(1.1) !important;
  1961.     color: white !important;
  1962.     border-color: transparent !important;
  1963.     box-shadow: 0 8px 20px rgba(255, 162, 0, 0.4) !important;
  1964. }
  1965. .social-icon:hover i {
  1966.     transform: scale(1.1) !important;
  1967. }
  1968. /* Footer divider */
  1969. .footer-divider {
  1970.     height: 1px;
  1971.     background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
  1972.     margin: 30px 0 20px;
  1973. }
  1974. /* Footer bottom */
  1975. .footer-bottom {
  1976.     padding-top: 15px;
  1977. }
  1978. .footer-text {
  1979.     color: rgba(255, 255, 255, 0.6);
  1980.     font-size: 0.9rem;
  1981.     margin: 0;
  1982.     text-align: center;
  1983. }
  1984. /* Responsive */
  1985. @media(max-width: 991.98px) {
  1986.     .footer-area {
  1987.         padding: 40px 0 20px;
  1988.     }
  1989.     
  1990.     .single-footer-widget {
  1991.         margin-bottom: 30px;
  1992.     }
  1993.     
  1994.     .footer-social {
  1995.         margin-top: 15px;
  1996.     }
  1997. }
  1998. @media(max-width: 767.98px) {
  1999.     .footer-area {
  2000.         padding: 35px 0 18px;
  2001.     }
  2002.     
  2003.     .footer-brand {
  2004.         font-size: 1.4rem;
  2005.     }
  2006.     
  2007.     .footer-widget-title {
  2008.         font-size: 0.95rem;
  2009.     }
  2010.     
  2011.     
  2012.     .newsletter-input-group {
  2013.         padding: 3px 3px 3px 12px;
  2014.     }
  2015.     
  2016.     .newsletter-input {
  2017.         padding: 8px 6px;
  2018.         font-size: 0.85rem;
  2019.     }
  2020.     
  2021.     .newsletter-btn {
  2022.         width: 38px;
  2023.         height: 38px;
  2024.         min-width: 38px;
  2025.         min-height: 38px;
  2026.         font-size: 0.85rem;
  2027.     }
  2028.     
  2029.     .footer-trust-badges {
  2030.         flex-direction: row;
  2031.         flex-wrap: wrap;
  2032.         justify-content: flex-start;
  2033.         gap: 12px;
  2034.     }
  2035. }
  2036. @media(max-width: 575.98px) {
  2037.     .footer-area {
  2038.         padding: 40px 0 20px;
  2039.     }
  2040.     
  2041.     .footer-brand {
  2042.         font-size: 1.3rem;
  2043.     }
  2044.     
  2045.     .social-icon {
  2046.         width: 38px;
  2047.         height: 38px;
  2048.         font-size: 16px;
  2049.     }
  2050.     
  2051.     .social-icon i {
  2052.         font-size: 16px;
  2053.     }
  2054. }
  2055. </style>
  2056. <script>
  2057. // Debounced autocomplete for header search
  2058. (function(){
  2059.   const input = document.getElementById('search_input');
  2060.   const box = document.getElementById('search_suggestions');
  2061.   if (!input || !box) return;
  2062.   let t = null;
  2063.   input.addEventListener('input', function(){
  2064.     const q = input.value.trim();
  2065.     clearTimeout(t);
  2066.     if (q.length === 0) { box.style.display = 'none'; box.innerHTML=''; return; }
  2067.     t = setTimeout(() => fetchSuggestions(q), 200);
  2068.   });
  2069.   function fetchSuggestions(q){
  2070.     const url = '";
  2071.         // line 1837
  2072.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_search_suggest");
  2073.         yield "' + '?q=' + encodeURIComponent(q);
  2074.     fetch(url).then(r => r.json()).then(data => {
  2075.       if (!data.success) { box.style.display='none'; return; }
  2076.       renderSuggestions(data.results || []);
  2077.     }).catch(() => { box.style.display='none'; });
  2078.   }
  2079.   function renderSuggestions(items){
  2080.     if (!items.length) { box.style.display='none'; box.innerHTML=''; return; }
  2081.     box.innerHTML = items.map(it => suggestionItem(it)).join('');
  2082.     box.style.display = 'block';
  2083.   }
  2084.   function suggestionItem(it){
  2085.     const icon = it.type === 'product' ? 'ti-package' : (it.type === 'shop' ? 'ti-briefcase' : (it.type === 'category' ? 'ti-layers' : 'ti-tag'));
  2086.     return '<a href=\"' + it.url + '\" class=\"list-group-item list-group-item-action d-flex align-items-center\">'
  2087.          + '<i class=\"' + icon + ' me-4\"></i>'
  2088.          + '<span class=\"ml-2\">' + escapeHtml(it.label) + '</span>'
  2089.          + '<span class=\"badge bg-light text-dark ms-auto\">' + it.type + '</span>'
  2090.          + '</a>';
  2091.   }
  2092.   function escapeHtml(s){
  2093.     return s.replace(/[&<>\"]+/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));
  2094.   }
  2095.   document.addEventListener('click', function(e){
  2096.     if (!box.contains(e.target) && e.target !== input) {
  2097.       box.style.display='none';
  2098.     }
  2099.   });
  2100.   window.handleSearchSubmit = function(e){
  2101.     if (e) e.preventDefault();
  2102.     const first = box.querySelector('a');
  2103.     if (first) { window.location.href = first.getAttribute('href'); return false; }
  2104.     // fallback to listing page search by name
  2105.     const q = input.value.trim();
  2106.     if (q.length) {
  2107.       window.location.href = '";
  2108.         // line 1876
  2109.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
  2110.         yield "' + '?q=' + encodeURIComponent(q);
  2111.     }
  2112.     return false;
  2113.   }
  2114. })();
  2115. // Gestion des mega-menus avec clic (comme la barre de recherche)
  2116. document.addEventListener('DOMContentLoaded', function() {
  2117.     const dropdownItems = document.querySelectorAll('.nav-item.dropdown');
  2118.     
  2119.     dropdownItems.forEach(function(item) {
  2120.         const dropdownToggle = item.querySelector('.dropdown-toggle');
  2121.         const dropdownMenu = item.querySelector('.mega-menu');
  2122.         
  2123.         if (!dropdownToggle || !dropdownMenu) return;
  2124.         
  2125.         // Fermer les autres menus quand on ouvre un nouveau
  2126.         function closeAllMenus() {
  2127.             dropdownItems.forEach(function(otherItem) {
  2128.                 const otherMenu = otherItem.querySelector('.mega-menu');
  2129.                 if (otherMenu && otherMenu !== dropdownMenu) {
  2130.                     \$(otherMenu).slideUp(300);
  2131.                     otherMenu.classList.remove('active');
  2132.                 }
  2133.             });
  2134.         }
  2135.         
  2136.         // Toggle au clic (comme la barre de recherche)
  2137.         dropdownToggle.addEventListener('click', function(e) {
  2138.             e.preventDefault();
  2139.             e.stopPropagation();
  2140.             
  2141.             closeAllMenus();
  2142.             
  2143.             if (dropdownMenu.classList.contains('active')) {
  2144.                 // Fermer le menu
  2145.                 dropdownMenu.style.opacity = '0';
  2146.                 dropdownMenu.style.visibility = 'hidden';
  2147.                 dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
  2148.                 setTimeout(() => {
  2149.                     dropdownMenu.classList.remove('active');
  2150.                     dropdownMenu.style.display = 'none';
  2151.                 }, 300);
  2152.             } else {
  2153.                 // Ouvrir le menu
  2154.                 dropdownMenu.style.display = 'block';
  2155.                 setTimeout(() => {
  2156.                     dropdownMenu.classList.add('active');
  2157.             dropdownMenu.style.opacity = '1';
  2158.             dropdownMenu.style.visibility = 'visible';
  2159.                     dropdownMenu.style.transform = 'translateX(-50%) translateY(0)';
  2160.                 }, 10);
  2161.             }
  2162.         });
  2163.         
  2164.         // Fermer au clic en dehors
  2165.         document.addEventListener('click', function(e) {
  2166.             if (!item.contains(e.target) && dropdownMenu.classList.contains('active')) {
  2167.                 dropdownMenu.style.opacity = '0';
  2168.                 dropdownMenu.style.visibility = 'hidden';
  2169.                 dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
  2170.                 setTimeout(() => {
  2171.                     dropdownMenu.classList.remove('active');
  2172.                     dropdownMenu.style.display = 'none';
  2173.                 }, 300);
  2174.             }
  2175.         });
  2176.         
  2177.         // Animation des éléments du menu
  2178.         const menuItems = dropdownMenu.querySelectorAll('.dropdown-item a');
  2179.         menuItems.forEach(function(menuItem, index) {
  2180.             menuItem.style.animationDelay = (index * 0.05) + 's';
  2181.         });
  2182.     });
  2183.     
  2184.     // Gestion des clics sur mobile
  2185.     if (window.innerWidth <= 768) {
  2186.         dropdownItems.forEach(function(item) {
  2187.             const dropdownToggle = item.querySelector('.dropdown-toggle');
  2188.             const dropdownMenu = item.querySelector('.mega-menu');
  2189.             
  2190.             dropdownToggle.addEventListener('click', function(e) {
  2191.                 e.preventDefault();
  2192.                 
  2193.                 // Fermer tous les autres menus
  2194.                 dropdownItems.forEach(function(otherItem) {
  2195.                     if (otherItem !== item) {
  2196.                         const otherMenu = otherItem.querySelector('.mega-menu');
  2197.                         otherMenu.style.opacity = '0';
  2198.                         otherMenu.style.visibility = 'hidden';
  2199.                         otherMenu.style.transform = 'translateY(-10px)';
  2200.                     }
  2201.                 });
  2202.                 
  2203.                 // Toggle le menu actuel
  2204.                 if (dropdownMenu.style.opacity === '1') {
  2205.                     dropdownMenu.style.opacity = '0';
  2206.                     dropdownMenu.style.visibility = 'hidden';
  2207.                     dropdownMenu.style.transform = 'translateY(-10px)';
  2208.                 } else {
  2209.                     dropdownMenu.style.opacity = '1';
  2210.                     dropdownMenu.style.visibility = 'visible';
  2211.                     dropdownMenu.style.transform = 'translateY(0)';
  2212.                 }
  2213.             });
  2214.         });
  2215.     }
  2216.     
  2217.     // Fermer les menus quand on clique ailleurs
  2218.     document.addEventListener('click', function(e) {
  2219.         if (!e.target.closest('.nav-item.dropdown')) {
  2220.             dropdownItems.forEach(function(item) {
  2221.                 const dropdownMenu = item.querySelector('.mega-menu');
  2222.                 dropdownMenu.style.opacity = '0';
  2223.                 dropdownMenu.style.visibility = 'hidden';
  2224.                 dropdownMenu.style.transform = 'translateY(-10px)';
  2225.             });
  2226.         }
  2227.     });
  2228. });
  2229. </script>
  2230. <!-- End footer Area -->
  2231. <script src=\"";
  2232.         // line 1999
  2233.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/vendor/jquery-2.2.4.min.js"), "html"nulltrue);
  2234.         yield "\"></script>
  2235. <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>
  2236. <script>
  2237.     // Initialiser le collapse Bootstrap 5 pour le menu hamburger après chargement de Bootstrap
  2238.     document.addEventListener('DOMContentLoaded', function() {
  2239.         // Attendre que Bootstrap soit complètement chargé
  2240.         if (typeof bootstrap !== 'undefined') {
  2241.             const navbarToggler = document.querySelector('.navbar-toggler');
  2242.             const navbarCollapse = document.getElementById('navbarSupportedContent');
  2243.             
  2244.             if (navbarToggler && navbarCollapse) {
  2245.                 // Bootstrap 5 devrait gérer automatiquement avec data-bs-toggle
  2246.                 // Mais on s'assure que ça fonctionne en écoutant les événements
  2247.                 navbarCollapse.addEventListener('show.bs.collapse', function() {
  2248.                     navbarToggler.setAttribute('aria-expanded', 'true');
  2249.                     navbarToggler.classList.add('active');
  2250.                 });
  2251.                 
  2252.                 navbarCollapse.addEventListener('hide.bs.collapse', function() {
  2253.                     navbarToggler.setAttribute('aria-expanded', 'false');
  2254.                     navbarToggler.classList.remove('active');
  2255.                 });
  2256.             }
  2257.         }
  2258.     });
  2259. </script>
  2260. <script src=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.js\"></script>
  2261. <script src=\"";
  2262.         // line 2026
  2263.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.ajaxchimp.min.js"), "html"nulltrue);
  2264.         yield "\"></script>
  2265. <script src=\"";
  2266.         // line 2027
  2267.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.nice-select.min.js"), "html"nulltrue);
  2268.         yield "\"></script>
  2269. <script src=\"";
  2270.         // line 2028
  2271.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.sticky.js"), "html"nulltrue);
  2272.         yield "\"></script>
  2273. <script src=\"";
  2274.         // line 2029
  2275.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/nouislider.min.js"), "html"nulltrue);
  2276.         yield "\"></script>
  2277. <script src=\"";
  2278.         // line 2030
  2279.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/countdown.js"), "html"nulltrue);
  2280.         yield "\"></script>
  2281. <script src=\"";
  2282.         // line 2031
  2283.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.magnific-popup.min.js"), "html"nulltrue);
  2284.         yield "\"></script>
  2285. <script src=\"";
  2286.         // line 2032
  2287.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/owl.carousel.min.js"), "html"nulltrue);
  2288.         yield "\"></script>
  2289. <script src=\"https://maps.googleapis.com/maps/api/js?key=AIzaSyCjCGmQ0Uq4exrzdcL6rvxywDDOvfAu6eE\"></script>
  2290. <script src=\"";
  2291.         // line 2034
  2292.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/gmaps.min.js"), "html"nulltrue);
  2293.         yield "\"></script>
  2294. <script src=\"";
  2295.         // line 2035
  2296.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/main.js"), "html"nulltrue);
  2297.         yield "\"></script>
  2298. <script>
  2299.     window.maketouConfig = {
  2300.         themeStorageKey: 'maketou-theme',
  2301.         comparison: {
  2302.             assetBase: '";
  2303.         // line 2040
  2304.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(""), "js"), "html"nulltrue);
  2305.         yield "',
  2306.             addUrlTemplate: '";
  2307.         // line 2041
  2308.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_comparison_add", ["id" => "__ID__"]), "js"), "html"nulltrue);
  2309.         yield "',
  2310.             removeUrlTemplate: '";
  2311.         // line 2042
  2312.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_comparison_remove", ["id" => "__ID__"]), "js"), "html"nulltrue);
  2313.         yield "',
  2314.             clearUrl: '";
  2315.         // line 2043
  2316.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_comparison_clear"), "js"), "html"nulltrue);
  2317.         yield "',
  2318.             countUrl: '";
  2319.         // line 2044
  2320.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_comparison_count"), "js"), "html"nulltrue);
  2321.         yield "',
  2322.             dataUrl: '";
  2323.         // line 2045
  2324.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_comparison_data"), "js"), "html"nulltrue);
  2325.         yield "',
  2326.             pageUrl: '";
  2327.         // line 2046
  2328.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_comparison"), "js"), "html"nulltrue);
  2329.         yield "'
  2330.         }
  2331.     };
  2332. </script>
  2333. <script src=\"";
  2334.         // line 2050
  2335.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/theme-public.js"), "html"nulltrue);
  2336.         yield "\"></script>
  2337. <script src=\"";
  2338.         // line 2051
  2339.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/comparison-v2.js"), "html"nulltrue);
  2340.         yield "\"></script>
  2341.     ";
  2342.         // line 2053
  2343.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getFunction('encore_entry_script_tags')->getCallable()("app"), "html"nulltrue);
  2344.         yield "
  2345.     
  2346.     <!-- PWA Service Worker Registration -->
  2347.     <script>
  2348.         // Enregistrement du Service Worker
  2349.         if ('serviceWorker' in navigator) {
  2350.             window.addEventListener('load', () => {
  2351.                 navigator.serviceWorker.register('";
  2352.         // line 2060
  2353.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("sw.js"), "html"nulltrue);
  2354.         yield "')
  2355.                     .then((registration) => {
  2356.                         console.log('Service Worker enregistré avec succès:', registration.scope);
  2357.                         
  2358.                         // Vérifie les mises à jour du service worker
  2359.                         registration.addEventListener('updatefound', () => {
  2360.                             const newWorker = registration.installing;
  2361.                             newWorker.addEventListener('statechange', () => {
  2362.                                 if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
  2363.                                     // Nouveau service worker disponible
  2364.                                     if (confirm('Une nouvelle version de MaketOu est disponible. Voulez-vous l\\'installer maintenant ?')) {
  2365.                                         newWorker.postMessage({ type: 'SKIP_WAITING' });
  2366.                                         window.location.reload();
  2367.                                     }
  2368.                                 }
  2369.                             });
  2370.                         });
  2371.                     })
  2372.                     .catch((error) => {
  2373.                         console.log('Échec de l\\'enregistrement du Service Worker:', error);
  2374.                     });
  2375.                 
  2376.                 // Écoute les messages du service worker
  2377.                 navigator.serviceWorker.addEventListener('message', (event) => {
  2378.                     console.log('Message du Service Worker:', event.data);
  2379.                 });
  2380.             });
  2381.         }
  2382.     </script>
  2383.     
  2384.     <!-- PWA Install Script -->
  2385.     <script src=\"";
  2386.         // line 2091
  2387.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("js/pwa-install.js"), "html"nulltrue);
  2388.         yield "\"></script>
  2389.     
  2390.     <script>
  2391.     // Charger les compteurs au chargement de la page
  2392.     document.addEventListener('DOMContentLoaded', function() {
  2393.         ";
  2394.         // line 2096
  2395.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2096)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2396.             // line 2097
  2397.             yield "            loadNotificationCount();
  2398.             // Délai pour s'assurer que la session est bien établie après connexion
  2399.             setTimeout(function() {
  2400.                 loadComparisonCount();
  2401.             }, 500);
  2402.         ";
  2403.         }
  2404.         // line 2103
  2405.         yield "        
  2406.         // Gérer le bouton de recherche mobile
  2407.         const searchMobileBtn = document.getElementById('searchMobileBtn');
  2408.         if (searchMobileBtn) {
  2409.             searchMobileBtn.addEventListener('click', function(e) {
  2410.                 e.preventDefault();
  2411.                 // Utiliser le même comportement que le bouton desktop
  2412.                 const searchBox = document.getElementById('search_input_box');
  2413.                 if (searchBox) {
  2414.                     searchBox.style.display = 'block';
  2415.                     const searchInput = document.getElementById('search_input');
  2416.                     if (searchInput) {
  2417.                         setTimeout(() => searchInput.focus(), 100);
  2418.                     }
  2419.                 }
  2420.             });
  2421.         }
  2422.     });
  2423.     
  2424.     function loadNotificationCount() {
  2425.         ";
  2426.         // line 2123
  2427.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2123)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2428.             // line 2124
  2429.             yield "        fetch('";
  2430.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("api_notifications_count");
  2431.             yield "')
  2432.             .then(response => {
  2433.                 if (!response.ok) {
  2434.                     throw new Error('Erreur HTTP: ' + response.status);
  2435.                 }
  2436.                 return response.json();
  2437.             })
  2438.             .then(data => {
  2439.                 const count = data.count || 0;
  2440.                 
  2441.                 // Mettre à jour tous les badges de notification
  2442.                 const badges = [
  2443.                     document.getElementById('notificationBadge'),
  2444.                     document.getElementById('notificationBadgeMobile'),
  2445.                     document.querySelector('.notification-badge')
  2446.                 ].filter(badge => badge !== null);
  2447.                 
  2448.                 badges.forEach(badge => {
  2449.                     if (count > 0) {
  2450.                         badge.textContent = count;
  2451.                         badge.style.display = 'flex';
  2452.                         badge.style.color = 'white';
  2453.                         badge.style.backgroundColor = '#dc3545';
  2454.                     } else {
  2455.                         badge.style.display = 'none';
  2456.                     }
  2457.                 });
  2458.                 
  2459.                 // Si on est sur la page des notifications, mettre à jour aussi le contenu de la page
  2460.                 if (typeof updateNotificationPageContent === 'function') {
  2461.                     updateNotificationPageContent(count);
  2462.                 }
  2463.             })
  2464.             .catch(error => {
  2465.                 console.error('Erreur lors du chargement du compteur de notifications:', error);
  2466.             });
  2467.         ";
  2468.         }
  2469.         // line 2161
  2470.         yield "    }
  2471.     
  2472.     // Exposer la fonction globalement pour qu'elle puisse être appelée depuis d'autres pages
  2473.     window.loadNotificationCount = loadNotificationCount;
  2474.     
  2475.     // Recharger le compteur toutes les 30 secondes pour garder les données à jour
  2476.     ";
  2477.         // line 2167
  2478.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2167)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2479.             // line 2168
  2480.             yield "    setInterval(function() {
  2481.         loadNotificationCount();
  2482.     }, 30000);
  2483.     ";
  2484.         }
  2485.         // line 2172
  2486.         yield "    
  2487.     function loadComparisonCount() {
  2488.         // Ne pas appeler l'API si on est sur une page d'erreur ou de redirection
  2489.         if (window.location.pathname.includes('/api/') || window.location.pathname.includes('/login')) {
  2490.             return;
  2491.         }
  2492.         
  2493.         // Utiliser un try-catch pour éviter toute redirection
  2494.         try {
  2495.             fetch('";
  2496.         // line 2181
  2497.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_comparison_count");
  2498.         yield "', {
  2499.                 method: 'GET',
  2500.                 headers: {
  2501.                     'X-Requested-With': 'XMLHttpRequest',
  2502.                     'Accept': 'application/json'
  2503.                 },
  2504.                 credentials: 'same-origin',
  2505.                 redirect: 'error' // Empêcher les redirections automatiques
  2506.             })
  2507.             .then(response => {
  2508.                 // Vérifier si la réponse est OK
  2509.                 if (!response.ok) {
  2510.                     // Si c'est une redirection (301, 302, etc.) ou une erreur d'authentification, ignorer silencieusement
  2511.                     if (response.status >= 300 && response.status < 400) {
  2512.                         console.warn('Redirection détectée, arrêt de la requête');
  2513.                         return null;
  2514.                     }
  2515.                     if (response.status === 401 || response.status === 403) {
  2516.                         console.warn('Utilisateur non authentifié pour la comparaison');
  2517.                         return null;
  2518.                     }
  2519.                     // Pour les autres erreurs, throw pour être capturé par catch
  2520.                     throw new Error('Erreur HTTP: ' + response.status);
  2521.                 }
  2522.                 
  2523.                 // Vérifier que c'est bien du JSON
  2524.                 const contentType = response.headers.get('content-type');
  2525.                 if (!contentType || !contentType.includes('application/json')) {
  2526.                     // Si ce n'est pas du JSON, c'est probablement une redirection HTML
  2527.                     console.warn('La réponse n\\'est pas du JSON, probable redirection');
  2528.                     return null;
  2529.                 }
  2530.                 
  2531.                 return response.json();
  2532.             })
  2533.             .then(data => {
  2534.                 // Si data est null (redirection ou erreur), ne rien faire
  2535.                 if (!data || typeof data.count === 'undefined') {
  2536.                     return;
  2537.                 }
  2538.                 
  2539.                 // Mettre à jour les badges desktop et mobile
  2540.                 const badges = [
  2541.                     document.getElementById('comparisonBadge'),
  2542.                     document.getElementById('comparisonBadgeMobile')
  2543.                 ];
  2544.                 badges.forEach(badge => {
  2545.                     if (badge) {
  2546.                         if (data.count > 0) {
  2547.                             badge.textContent = data.count;
  2548.                             badge.style.display = 'flex';
  2549.                         } else {
  2550.                             badge.style.display = 'none';
  2551.                         }
  2552.                     }
  2553.                 });
  2554.             })
  2555.             .catch(error => {
  2556.                 // Ne pas afficher d'erreur si c'est juste une absence d'authentification ou une redirection
  2557.                 if (error.message && !error.message.includes('401') && !error.message.includes('403') && !error.message.includes('redirect')) {
  2558.                     console.error('Erreur lors du chargement du compteur de comparaison:', error);
  2559.                 }
  2560.                 // Empêcher toute redirection vers l'URL de l'API
  2561.                 return false;
  2562.             });
  2563.         } catch (e) {
  2564.             // Capturer toute erreur qui pourrait causer une redirection
  2565.             console.warn('Erreur lors de l\\'appel à l\\'API de comparaison:', e);
  2566.         }
  2567.     }
  2568.     
  2569.     // Fonction globale pour gérer la comparaison
  2570.     function toggleComparison(productId, element) {
  2571.         if (!element) {
  2572.             element = document.querySelector(`.comparison-btn[data-product-id=\"\${productId}\"]`);
  2573.         }
  2574.         
  2575.         if (!element) {
  2576.             console.error('Bouton de comparaison non trouvé pour le produit', productId);
  2577.             return;
  2578.         }
  2579.         
  2580.         const originalHtml = element.innerHTML;
  2581.         // Désactiver le bouton/lien
  2582.         if (element.tagName === 'BUTTON') {
  2583.             element.disabled = true;
  2584.         } else {
  2585.             element.style.pointerEvents = 'none';
  2586.             element.style.opacity = '0.6';
  2587.         }
  2588.         element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
  2589.         
  2590.         // Vérifier d'abord si le produit est déjà en comparaison
  2591.         let isInComparison = false;
  2592.         fetch(`/api/comparison/status/\${productId}`)
  2593.             .then(response => {
  2594.                 const contentType = response.headers.get('content-type');
  2595.                 if (contentType && contentType.includes('text/html')) {
  2596.                     window.location.href = '";
  2597.         // line 2279
  2598.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  2599.         yield "';
  2600.                     throw new Error('Not authenticated');
  2601.                 }
  2602.                 return response.json();
  2603.             })
  2604.             .then(data => {
  2605.                 isInComparison = data.inComparison;
  2606.                 const url = isInComparison ? `/api/comparison/remove/\${productId}` : `/api/comparison/add/\${productId}`;
  2607.                 
  2608.                 return fetch(url, {
  2609.                     method: 'POST',
  2610.                     headers: {
  2611.                         'Content-Type': 'application/json',
  2612.                         'X-Requested-With': 'XMLHttpRequest'
  2613.                     }
  2614.                 });
  2615.             })
  2616.             .then(response => {
  2617.                 const contentType = response.headers.get('content-type');
  2618.                 if (contentType && contentType.includes('text/html')) {
  2619.                     window.location.href = '";
  2620.         // line 2299
  2621.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  2622.         yield "';
  2623.                     throw new Error('Not authenticated');
  2624.                 }
  2625.                 return response.json();
  2626.             })
  2627.             .then(data => {
  2628.                 if (data.success) {
  2629.                     // Mettre à jour le compteur
  2630.                     loadComparisonCount();
  2631.                     
  2632.                     // Mettre à jour l'apparence du bouton
  2633.                     if (element) {
  2634.                         // Inverser l'état (car on vient de le changer)
  2635.                         const newState = !isInComparison;
  2636.                         
  2637.                         // Restaurer le HTML original puis mettre à jour
  2638.                         element.innerHTML = originalHtml;
  2639.                         
  2640.                         if (newState) {
  2641.                             element.classList.add('active');
  2642.                             // Mettre à jour le texte pour les deux types de boutons
  2643.                             const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
  2644.                             if (textEl) textEl.textContent = 'En comparaison';
  2645.                             // Mettre à jour l'icône si nécessaire (chercher dans span ou i)
  2646.                             const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
  2647.                             if (iconEl) {
  2648.                                 iconEl.style.color = '#28a745';
  2649.                                 iconEl.classList.add('active');
  2650.                             }
  2651.                         } else {
  2652.                             element.classList.remove('active');
  2653.                             const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
  2654.                             if (textEl) textEl.textContent = 'Comparer';
  2655.                             // Restaurer la couleur de l'icône
  2656.                             const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
  2657.                             if (iconEl) {
  2658.                                 iconEl.style.color = '';
  2659.                                 iconEl.classList.remove('active');
  2660.                             }
  2661.                         }
  2662.                     }
  2663.                     
  2664.                     // Afficher une notification
  2665.                     showNotification(data.message, 'success');
  2666.                 } else {
  2667.                     showNotification(data.message, 'error');
  2668.                     if (element) {
  2669.                         element.innerHTML = originalHtml;
  2670.                     }
  2671.                 }
  2672.             })
  2673.             .catch(error => {
  2674.                 console.error('Erreur:', error);
  2675.                 showNotification('Une erreur est survenue', 'error');
  2676.                 if (element) {
  2677.                     element.innerHTML = originalHtml;
  2678.                 }
  2679.             })
  2680.             .finally(() => {
  2681.                 if (element) {
  2682.                     if (element.tagName === 'BUTTON') {
  2683.                         element.disabled = false;
  2684.                     } else {
  2685.                         element.style.pointerEvents = '';
  2686.                         element.style.opacity = '';
  2687.                     }
  2688.                 }
  2689.             });
  2690.     }
  2691.     
  2692.     // Fonction globale pour gérer les favoris
  2693.     function toggleWishlist(productId, element) {
  2694.         if (!element) {
  2695.             element = document.querySelector(`.wishlist-btn[data-product-id=\"\${productId}\"]`);
  2696.         }
  2697.         
  2698.         if (!element) {
  2699.             console.error('Bouton de wishlist non trouvé pour le produit', productId);
  2700.             return;
  2701.         }
  2702.         
  2703.         const originalHtml = element.innerHTML;
  2704.         // Désactiver le bouton/lien
  2705.         if (element.tagName === 'BUTTON') {
  2706.             element.disabled = true;
  2707.         } else {
  2708.             element.style.pointerEvents = 'none';
  2709.             element.style.opacity = '0.6';
  2710.         }
  2711.         element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
  2712.         
  2713.         // Vérifier d'abord si le produit est déjà en favoris
  2714.         let isInWishlist = false;
  2715.         fetch(`/api/wishlist/status/\${productId}`)
  2716.             .then(response => {
  2717.                 const contentType = response.headers.get('content-type');
  2718.                 if (contentType && contentType.includes('text/html')) {
  2719.                     window.location.href = '";
  2720.         // line 2396
  2721.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  2722.         yield "';
  2723.                     throw new Error('Not authenticated');
  2724.                 }
  2725.                 return response.json();
  2726.             })
  2727.             .then(data => {
  2728.                 isInWishlist = data.inWishlist;
  2729.                 const url = isInWishlist ? `/api/wishlist/remove/\${productId}` : `/api/wishlist/add/\${productId}`;
  2730.                 
  2731.                 return fetch(url, {
  2732.                     method: 'POST',
  2733.                     headers: {
  2734.                         'Content-Type': 'application/json',
  2735.                         'X-Requested-With': 'XMLHttpRequest'
  2736.                     }
  2737.                 });
  2738.             })
  2739.             .then(response => {
  2740.                 const contentType = response.headers.get('content-type');
  2741.                 if (contentType && contentType.includes('text/html')) {
  2742.                     window.location.href = '";
  2743.         // line 2416
  2744.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  2745.         yield "';
  2746.                     throw new Error('Not authenticated');
  2747.                 }
  2748.                 return response.json();
  2749.             })
  2750.             .then(data => {
  2751.                 if (data.success) {
  2752.                     // Mettre à jour l'apparence du bouton
  2753.                     if (element) {
  2754.                         // Inverser l'état (car on vient de le changer)
  2755.                         const newState = !isInWishlist;
  2756.                         
  2757.                         // Restaurer le HTML original puis mettre à jour
  2758.                         element.innerHTML = originalHtml;
  2759.                         
  2760.                         // Chercher l'icône dans span ou i
  2761.                         const icon = element.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
  2762.                         const text = element.querySelector('.wishlist-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
  2763.                         
  2764.                         if (newState) {
  2765.                             if (icon) {
  2766.                                 // Pour les icônes linr, on change la classe
  2767.                                 if (icon.classList.contains('lnr-heart')) {
  2768.                                     icon.classList.remove('lnr-heart');
  2769.                                 }
  2770.                                 if (!icon.classList.contains('lnr-heart-filled')) {
  2771.                                     icon.classList.add('lnr-heart-filled');
  2772.                                 }
  2773.                                 icon.style.color = '#dc3545';
  2774.                             }
  2775.                             element.classList.add('active');
  2776.                             if (text) text.textContent = 'Dans favoris';
  2777.                         } else {
  2778.                             if (icon) {
  2779.                                 // Restaurer l'icône originale
  2780.                                 if (icon.classList.contains('lnr-heart-filled')) {
  2781.                                     icon.classList.remove('lnr-heart-filled');
  2782.                                 }
  2783.                                 if (!icon.classList.contains('lnr-heart')) {
  2784.                                     icon.classList.add('lnr-heart');
  2785.                                 }
  2786.                                 icon.style.color = '';
  2787.                             }
  2788.                             element.classList.remove('active');
  2789.                             if (text) text.textContent = 'Favoris';
  2790.                         }
  2791.                     }
  2792.                     
  2793.                     // Afficher une notification
  2794.                     showNotification(data.message, 'success');
  2795.                     
  2796.                     // Si on est sur la page wishlist, recharger la page
  2797.                     if (window.location.pathname.includes('/account/wishlist')) {
  2798.                         setTimeout(() => location.reload(), 1000);
  2799.                     }
  2800.                 } else {
  2801.                     showNotification(data.message, 'error');
  2802.                     if (element) {
  2803.                         element.innerHTML = originalHtml;
  2804.                     }
  2805.                 }
  2806.             })
  2807.             .catch(error => {
  2808.                 console.error('Erreur:', error);
  2809.                 showNotification('Une erreur est survenue', 'error');
  2810.                 if (element) {
  2811.                     element.innerHTML = originalHtml;
  2812.                 }
  2813.             })
  2814.             .finally(() => {
  2815.                 if (element) {
  2816.                     if (element.tagName === 'BUTTON') {
  2817.                         element.disabled = false;
  2818.                     } else {
  2819.                         element.style.pointerEvents = '';
  2820.                         element.style.opacity = '';
  2821.                     }
  2822.                 }
  2823.             });
  2824.     }
  2825.     
  2826.     // Fonction pour afficher des notifications
  2827.     function showNotification(message, type = 'success') {
  2828.         // Créer l'élément de notification
  2829.         const notification = document.createElement('div');
  2830.         notification.className = `alert alert-\${type === 'success' ? 'success' : 'danger'} alert-dismissible fade show position-fixed`;
  2831.         notification.style.cssText = 'top: 20px; right: 20px; z-index: 9999; min-width: 300px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);';
  2832.         notification.innerHTML = `
  2833.             \${message}
  2834.             <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\"></button>
  2835.         `;
  2836.         
  2837.         document.body.appendChild(notification);
  2838.         
  2839.         // Supprimer automatiquement après 3 secondes
  2840.         setTimeout(() => {
  2841.             notification.remove();
  2842.         }, 3000);
  2843.     }
  2844.     
  2845.     // Initialiser les alertes Bootstrap 5 pour la fermeture
  2846.     document.addEventListener('DOMContentLoaded', function() {
  2847.         // S'assurer que les alertes peuvent être fermées
  2848.         const alertCloseButtons = document.querySelectorAll('.flash-message .btn-close');
  2849.         alertCloseButtons.forEach(function(button) {
  2850.             button.addEventListener('click', function() {
  2851.                 const alert = this.closest('.alert');
  2852.                 if (alert) {
  2853.                     alert.classList.remove('show');
  2854.                     setTimeout(function() {
  2855.                         alert.remove();
  2856.                     }, 150);
  2857.                 }
  2858.             });
  2859.         });
  2860.         
  2861.         // Charger les statuts initiaux des produits
  2862.         ";
  2863.         // line 2533
  2864.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2533)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2865.             // line 2534
  2866.             yield "        // Charger les statuts de comparaison pour tous les produits visibles
  2867.         document.querySelectorAll('.comparison-btn[data-product-id]').forEach(btn => {
  2868.             const productId = btn.dataset.productId;
  2869.             fetch(`/api/comparison/status/\${productId}`)
  2870.                 .then(response => response.json())
  2871.                 .then(data => {
  2872.                     if (data.inComparison) {
  2873.                         btn.classList.add('active');
  2874.                         // Mettre à jour le texte pour les deux types de boutons
  2875.                         const textEl = btn.querySelector('.comparison-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
  2876.                         if (textEl) textEl.textContent = 'En comparaison';
  2877.                         // Mettre à jour l'icône si nécessaire
  2878.                         const iconEl = btn.querySelector('.lnr-sync, [class*=\"sync\"]');
  2879.                         if (iconEl) iconEl.style.color = '#28a745';
  2880.                     }
  2881.                 })
  2882.                 .catch(() => {});
  2883.         });
  2884.         
  2885.         // Charger les statuts de wishlist pour tous les produits visibles
  2886.         document.querySelectorAll('.wishlist-btn[data-product-id]').forEach(btn => {
  2887.             const productId = btn.dataset.productId;
  2888.             fetch(`/api/wishlist/status/\${productId}`)
  2889.                 .then(response => response.json())
  2890.                 .then(data => {
  2891.                     if (data.inWishlist) {
  2892.                         btn.classList.add('active');
  2893.                         // Chercher l'icône dans span ou i
  2894.                         const icon = btn.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
  2895.                         if (icon) {
  2896.                             icon.classList.remove('lnr-heart');
  2897.                             icon.classList.add('lnr-heart-filled');
  2898.                             icon.style.color = '#dc3545';
  2899.                         }
  2900.                         // Mettre à jour le texte pour les deux types de boutons
  2901.                         const textEl = btn.querySelector('.wishlist-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
  2902.                         if (textEl) textEl.textContent = 'Dans favoris';
  2903.                     }
  2904.                 })
  2905.                 .catch(() => {});
  2906.         });
  2907.         
  2908.         // Charger le compteur de comparaison
  2909.         loadComparisonCount();
  2910.         ";
  2911.         }
  2912.         // line 2579
  2913.         yield "    });
  2914.     </script>
  2915. <script>
  2916. // Loader global pour tous les boutons de formulaire
  2917. document.addEventListener('DOMContentLoaded', function() {
  2918.     // Intercepter tous les formulaires
  2919.     const forms = document.querySelectorAll('form');
  2920.     
  2921.     forms.forEach(function(form) {
  2922.         form.addEventListener('submit', function(e) {
  2923.             const submitButtons = form.querySelectorAll('button[type=\"submit\"], input[type=\"submit\"], button:not([type])');
  2924.             
  2925.             submitButtons.forEach(function(button) {
  2926.                 // Vérifier si le bouton n'est pas déjà désactivé
  2927.                 if (!button.disabled && !button.classList.contains('loading')) {
  2928.                     button.classList.add('loading');
  2929.                     button.disabled = true;
  2930.                     
  2931.                     // Sauvegarder le texte original
  2932.                     const originalText = button.innerHTML;
  2933.                     button.setAttribute('data-original-text', originalText);
  2934.                     
  2935.                     // Ajouter le loader
  2936.                     button.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Envoi...';
  2937.                     
  2938.                     // Si le formulaire n'est pas valide, réactiver le bouton après 1 seconde
  2939.                     setTimeout(function() {
  2940.                         if (!form.checkValidity()) {
  2941.                             button.classList.remove('loading');
  2942.                             button.disabled = false;
  2943.                             button.innerHTML = originalText;
  2944.                         }
  2945.                     }, 1000);
  2946.                 }
  2947.             });
  2948.         });
  2949.     });
  2950.     
  2951.     // Pour les boutons qui déclenchent des actions AJAX
  2952.     const ajaxButtons = document.querySelectorAll('[data-ajax], .ajax-submit, button[data-submit]');
  2953.     
  2954.     ajaxButtons.forEach(function(button) {
  2955.         button.addEventListener('click', function(e) {
  2956.             if (this.disabled || this.classList.contains('loading')) {
  2957.                 e.preventDefault();
  2958.                 return false;
  2959.             }
  2960.             
  2961.             this.classList.add('loading');
  2962.             this.disabled = true;
  2963.             
  2964.             const originalText = this.innerHTML;
  2965.             this.setAttribute('data-original-text', originalText);
  2966.             
  2967.             this.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Chargement...';
  2968.         });
  2969.     });
  2970.     
  2971.     // Gestionnaire spécifique pour le formulaire de newsletter
  2972.     const newsletterForm = document.querySelector('.footer-newsletter-form');
  2973.     if (newsletterForm) {
  2974.         newsletterForm.addEventListener('submit', function(e) {
  2975.             const submitBtn = this.querySelector('.newsletter-btn');
  2976.             if (submitBtn && !submitBtn.disabled) {
  2977.                 submitBtn.classList.add('loading');
  2978.                 submitBtn.disabled = true;
  2979.                 
  2980.                 // Afficher le loader et masquer l'icône
  2981.                 const icon = submitBtn.querySelector('.newsletter-btn-icon');
  2982.                 const loader = submitBtn.querySelector('.newsletter-btn-loader');
  2983.                 if (icon) icon.style.display = 'none';
  2984.                 if (loader) loader.style.display = 'flex';
  2985.                 
  2986.                 // Réactiver le bouton après 5 secondes au cas où la requête échoue silencieusement
  2987.                 setTimeout(function() {
  2988.                     if (submitBtn.classList.contains('loading')) {
  2989.                         submitBtn.classList.remove('loading');
  2990.                         submitBtn.disabled = false;
  2991.                         if (icon) icon.style.display = 'flex';
  2992.                         if (loader) loader.style.display = 'none';
  2993.                     }
  2994.                 }, 5000);
  2995.             }
  2996.         });
  2997.         
  2998.         // Gérer la réponse du formulaire (si AJAX)
  2999.         newsletterForm.addEventListener('submit', function(e) {
  3000.             // Si le formulaire est soumis normalement (non-AJAX), le navigateur gère la réponse
  3001.             // Sinon, on peut intercepter pour gérer la réponse AJAX ici
  3002.         });
  3003.     }
  3004. });
  3005. // CSS pour le spinner
  3006. const style = document.createElement('style');
  3007. style.textContent = `
  3008.     .spinner-border-sm {
  3009.         width: 1rem;
  3010.         height: 1rem;
  3011.         border-width: 0.15em;
  3012.     }
  3013.     .spinner-border {
  3014.         display: inline-block;
  3015.         width: 1rem;
  3016.         height: 1rem;
  3017.         vertical-align: text-bottom;
  3018.         border: 0.15em solid currentColor;
  3019.         border-right-color: transparent;
  3020.         border-radius: 50%;
  3021.         animation: spinner-border 0.75s linear infinite;
  3022.     }
  3023.     @keyframes spinner-border {
  3024.         to { transform: rotate(360deg); }
  3025.     }
  3026.     button.loading {
  3027.         opacity: 0.7;
  3028.         cursor: not-allowed !important;
  3029.     }
  3030. `;
  3031. document.head.appendChild(style);
  3032. </script>
  3033. \t<!-- Modal Global Custom Alert -->
  3034. \t<div class=\"modal fade custom-alert-modal\" id=\"customAlertModal\" tabindex=\"-1\" aria-labelledby=\"customAlertModalLabel\" aria-hidden=\"true\">
  3035. \t\t<div class=\"modal-dialog modal-dialog-centered\">
  3036. \t\t\t<div class=\"modal-content\">
  3037. \t\t\t\t<div class=\"modal-header\">
  3038. \t\t\t\t\t<h5 class=\"modal-title text-white\" id=\"customAlertModalLabel\">Notification</h5>
  3039. \t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
  3040. \t\t\t\t</div>
  3041. \t\t\t\t<div class=\"modal-body\">
  3042. \t\t\t\t\t<div class=\"alert-icon\" id=\"alertIcon\">
  3043. \t\t\t\t\t\t<i class=\"lnr lnr-info-circle\"></i>
  3044. \t\t\t\t\t</div>
  3045. \t\t\t\t\t<p class=\"alert-message\" id=\"alertMessage\"></p>
  3046. \t\t\t\t</div>
  3047. \t\t\t\t<div class=\"modal-footer\">
  3048. \t\t\t\t\t<button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\">OK</button>
  3049. \t\t\t\t</div>
  3050. \t\t\t</div>
  3051. \t\t</div>
  3052. \t</div>
  3053. \t<script>
  3054. \t\t// Fonction globale pour remplacer alert() ou afficher des messages
  3055. \t\tfunction showCustomAlert(message, type = 'info') {
  3056. \t\t\tconst modalEl = document.getElementById('customAlertModal');
  3057. \t\t\tif (!modalEl) {
  3058. \t\t\t\t// Fallback sur showNotification
  3059. \t\t\t\tlet notifyType = type === 'error' || type === 'danger' ? 'error' : (type === 'success' ? 'success' : 'warning');
  3060. \t\t\t\tif (typeof showNotification === 'function') {
  3061. \t\t\t\t\tshowNotification(message, notifyType);
  3062. \t\t\t\t} else {
  3063. \t\t\t\t\talert(message);
  3064. \t\t\t\t}
  3065. \t\t\t\treturn;
  3066. \t\t\t}
  3067. \t\t\t
  3068. \t\t\tconst modal = new bootstrap.Modal(modalEl);
  3069. \t\t\tconst alertMessage = document.getElementById('alertMessage');
  3070. \t\t\tconst alertIcon = document.getElementById('alertIcon');
  3071. \t\t\tconst modalTitle = document.getElementById('customAlertModalLabel');
  3072. \t\t\talertMessage.textContent = message;
  3073. \t\t\t// Définir l'icône et le titre selon le type
  3074. \t\t\tlet iconClass = 'lnr lnr-info-circle';
  3075. \t\t\tlet title = 'Information';
  3076. \t\t\tswitch (type) {
  3077. \t\t\t\tcase 'success': 
  3078. \t\t\t\t\ticonClass = 'lnr lnr-checkmark-circle';
  3079. \t\t\t\t\ttitle = 'Succès';
  3080. \t\t\t\t\talertIcon.className = 'alert-icon success';
  3081. \t\t\t\t\tbreak;
  3082. \t\t\t\tcase 'error':
  3083. \t\t\t\tcase 'danger': 
  3084. \t\t\t\t\ticonClass = 'lnr lnr-warning';
  3085. \t\t\t\t\ttitle = 'Erreur';
  3086. \t\t\t\t\talertIcon.className = 'alert-icon error';
  3087. \t\t\t\t\tbreak;
  3088. \t\t\t\tcase 'warning': 
  3089. \t\t\t\t\ticonClass = 'lnr lnr-warning';
  3090. \t\t\t\t\ttitle = 'Attention';
  3091. \t\t\t\t\talertIcon.className = 'alert-icon warning';
  3092. \t\t\t\t\tbreak;
  3093. \t\t\t\tdefault: 
  3094. \t\t\t\t\ticonClass = 'lnr lnr-info-circle';
  3095. \t\t\t\t\ttitle = 'Information';
  3096. \t\t\t\t\talertIcon.className = 'alert-icon info';
  3097. \t\t\t}
  3098. \t\t\talertIcon.innerHTML = `<i class=\"\${iconClass}\"></i>`;
  3099. \t\t\tmodalTitle.textContent = title;
  3100. \t\t\tmodal.show();
  3101. \t\t};
  3102. \t</script>
  3103. ";
  3104.         // line 2779
  3105.         yield from $this->unwrap()->yieldBlock('javascripts'$context$blocks);
  3106.         // line 2781
  3107.         yield "</body>
  3108. </html>
  3109. ";
  3110.         
  3111.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3112.         
  3113.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3114.         yield from [];
  3115.     }
  3116.     // line 32
  3117.     /**
  3118.      * @return iterable<null|scalar|\Stringable>
  3119.      */
  3120.     public function block_title(array $context, array $blocks = []): iterable
  3121.     {
  3122.         $macros $this->macros;
  3123.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  3124.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  3125.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  3126.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  3127.         yield "MaketOu";
  3128.         
  3129.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3130.         
  3131.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3132.         yield from [];
  3133.     }
  3134.     // line 711
  3135.     /**
  3136.      * @return iterable<null|scalar|\Stringable>
  3137.      */
  3138.     public function block_stylesheets(array $context, array $blocks = []): iterable
  3139.     {
  3140.         $macros $this->macros;
  3141.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  3142.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  3143.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  3144.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  3145.         // line 712
  3146.         yield "        ";
  3147.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getFunction('encore_entry_link_tags')->getCallable()("app"), "html"nulltrue);
  3148.         yield "
  3149.     ";
  3150.         
  3151.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3152.         
  3153.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3154.         yield from [];
  3155.     }
  3156.     // line 1247
  3157.     /**
  3158.      * @return iterable<null|scalar|\Stringable>
  3159.      */
  3160.     public function block_body(array $context, array $blocks = []): iterable
  3161.     {
  3162.         $macros $this->macros;
  3163.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  3164.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  3165.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  3166.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  3167.         
  3168.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3169.         
  3170.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3171.         yield from [];
  3172.     }
  3173.     // line 2779
  3174.     /**
  3175.      * @return iterable<null|scalar|\Stringable>
  3176.      */
  3177.     public function block_javascripts(array $context, array $blocks = []): iterable
  3178.     {
  3179.         $macros $this->macros;
  3180.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  3181.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascripts"));
  3182.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  3183.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascripts"));
  3184.         
  3185.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3186.         
  3187.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3188.         yield from [];
  3189.     }
  3190.     /**
  3191.      * @codeCoverageIgnore
  3192.      */
  3193.     public function getTemplateName(): string
  3194.     {
  3195.         return "base_home.html.twig";
  3196.     }
  3197.     /**
  3198.      * @codeCoverageIgnore
  3199.      */
  3200.     public function isTraitable(): bool
  3201.     {
  3202.         return false;
  3203.     }
  3204.     /**
  3205.      * @codeCoverageIgnore
  3206.      */
  3207.     public function getDebugInfo(): array
  3208.     {
  3209.         return array (  3295 => 2779,  3273 => 1247,  3259 => 712,  3246 => 711,  3223 => 32,  3210 => 2781,  3208 => 2779,  3006 => 2579,  2959 => 2534,  2957 => 2533,  2837 => 2416,  2814 => 2396,  2714 => 2299,  2691 => 2279,  2590 => 2181,  2579 => 2172,  2573 => 2168,  2571 => 2167,  2563 => 2161,  2522 => 2124,  2520 => 2123,  2498 => 2103,  2490 => 2097,  2488 => 2096,  2480 => 2091,  2446 => 2060,  2436 => 2053,  2431 => 2051,  2427 => 2050,  2420 => 2046,  2416 => 2045,  2412 => 2044,  2408 => 2043,  2404 => 2042,  2400 => 2041,  2396 => 2040,  2388 => 2035,  2384 => 2034,  2379 => 2032,  2375 => 2031,  2371 => 2030,  2367 => 2029,  2363 => 2028,  2359 => 2027,  2355 => 2026,  2325 => 1999,  2199 => 1876,  2157 => 1837,  1643 => 1326,  1631 => 1317,  1627 => 1316,  1623 => 1315,  1619 => 1314,  1615 => 1313,  1604 => 1305,  1600 => 1304,  1596 => 1303,  1592 => 1302,  1583 => 1295,  1578 => 1293,  1573 => 1292,  1567 => 1290,  1565 => 1289,  1561 => 1288,  1557 => 1287,  1553 => 1286,  1513 => 1248,  1511 => 1247,  1503 => 1242,  1495 => 1237,  1483 => 1227,  1473 => 1223,  1469 => 1221,  1465 => 1220,  1462 => 1219,  1452 => 1215,  1448 => 1213,  1444 => 1212,  1441 => 1211,  1431 => 1207,  1427 => 1205,  1423 => 1204,  1420 => 1203,  1410 => 1199,  1406 => 1197,  1402 => 1196,  1378 => 1174,  1370 => 1170,  1362 => 1166,  1360 => 1165,  1349 => 1156,  1340 => 1151,  1338 => 1150,  1327 => 1146,  1317 => 1143,  1308 => 1137,  1302 => 1136,  1297 => 1134,  1291 => 1133,  1286 => 1131,  1280 => 1130,  1275 => 1128,  1269 => 1127,  1264 => 1125,  1258 => 1124,  1243 => 1114,  1226 => 1106,  954 => 836,  951 => 835,  949 => 834,  827 => 714,  825 => 711,  181 => 69,  176 => 66,  172 => 65,  168 => 64,  164 => 63,  160 => 62,  156 => 61,  152 => 60,  148 => 59,  144 => 58,  140 => 57,  136 => 56,  132 => 55,  128 => 54,  103 => 32,  90 => 22,  84 => 19,  80 => 18,  76 => 17,  72 => 16,  66 => 13,  52 => 1,);
  3210.     }
  3211.     public function getSourceContext(): Source
  3212.     {
  3213.         return new Source("<!DOCTYPE html>
  3214. <html lang=\"fr\" class=\"no-js\" data-theme=\"light\" data-bs-theme=\"light\">
  3215. <head>
  3216.     <!-- Mobile Specific Meta -->
  3217.     <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no\">
  3218.     <meta name=\"mobile-web-app-capable\" content=\"yes\">
  3219.     <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">
  3220.     <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">
  3221.     <meta name=\"apple-mobile-web-app-title\" content=\"MaketOu\">
  3222.     <meta name=\"theme-color\" content=\"#ffa200\">
  3223.     <meta name=\"msapplication-TileColor\" content=\"#ffa200\">
  3224.     <meta name=\"msapplication-config\" content=\"{{ asset('favicon/browserconfig.xml') }}\">
  3225.     
  3226.     <!-- Favicon-->
  3227.     <link rel=\"shortcut icon\" href=\"{{ asset('favicon/favicon-16x16.png') }}\">
  3228.     <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"{{ asset('favicon/apple-touch-icon.png') }}\">
  3229.     <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"{{ asset('favicon/favicon-32x32.png') }}\">
  3230.     <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"{{ asset('favicon/favicon-16x16.png') }}\">
  3231.     
  3232.     <!-- PWA Manifest -->
  3233.     <link rel=\"manifest\" href=\"{{ asset('manifest.json') }}\">
  3234.     <!-- Author Meta -->
  3235.     <meta name=\"author\" content=\"Foulgor Tech\">
  3236.     <!-- Meta Description -->
  3237.     <meta name=\"description\" content=\"\">
  3238.     <!-- Meta Keyword -->
  3239.     <meta name=\"keywords\" content=\"\">
  3240.     <!-- meta character set -->
  3241.     <meta charset=\"UTF-8\">
  3242.     <!-- Site Title -->
  3243.     <title>{% block title %}MaketOu{% endblock %}</title>
  3244.     <script>
  3245.         (function () {
  3246.             try {
  3247.                 var storageKey = 'maketou-theme';
  3248.                 var savedTheme = window.localStorage.getItem(storageKey);
  3249.                 var theme = savedTheme === 'dark' || savedTheme === 'light'
  3250.                     ? savedTheme
  3251.                     : (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
  3252.                 document.documentElement.setAttribute('data-theme', theme);
  3253.                 document.documentElement.setAttribute('data-bs-theme', theme);
  3254.                 document.documentElement.classList.toggle('dark-mode', theme === 'dark');
  3255.             } catch (error) {
  3256.                 document.documentElement.setAttribute('data-theme', 'light');
  3257.                 document.documentElement.setAttribute('data-bs-theme', 'light');
  3258.             }
  3259.         })();
  3260.     </script>
  3261.     <!--
  3262.         CSS
  3263.         ============================================= -->
  3264.     <link rel=\"stylesheet\" href=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.css\" />
  3265.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/linearicons.css') }}\">
  3266.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/font-awesome.min.css') }}\">
  3267.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/themify-icons.css') }}\">
  3268.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/bootstrap.css') }}\">
  3269.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/owl.carousel.css') }}\">
  3270.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/nice-select.css') }}\">
  3271.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/nouislider.min.css') }}\">
  3272.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/ion.rangeSlider.css') }}\"/>
  3273.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/ion.rangeSlider.skinFlat.css') }}\"/>
  3274.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/magnific-popup.css') }}\">
  3275.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/main.css') }}\">
  3276.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/buttons-unified.css') }}\">
  3277.     <link rel=\"stylesheet\" href=\"{{ asset('ui/css/theme-public.css') }}\">
  3278.     <meta charset=\"UTF-8\">
  3279.     {# Run `composer require symfony/webpack-encore-bundle` to start using Symfony UX #}
  3280.     <style>
  3281.         /* Styles pour l'icône de notification */
  3282.         .notification-icon {
  3283.             position: relative;
  3284.             display: inline-block;
  3285.             color: #333;
  3286.             text-decoration: none;
  3287.             transition: color 0.3s ease;
  3288.         }
  3289.         
  3290.         .notification-icon:hover {
  3291.             color: #007bff;
  3292.         }
  3293.         
  3294.         .notification-badge {
  3295.             position: absolute;
  3296.             top: -4px;
  3297.             right: -2px;
  3298.             background: #dc3545 !important;
  3299.             color: white !important;
  3300.             border-radius: 50%;
  3301.             width: 18px;
  3302.             height: 18px;
  3303.             font-size: 8px !important;
  3304.             display: flex !important;
  3305.             align-items: center !important;
  3306.             justify-content: center !important;
  3307.             font-weight: bold !important;
  3308.             animation: pulse 2s infinite;
  3309.             z-index: 10;
  3310.             line-height: 1 !important;
  3311.         }
  3312.         
  3313.         /* Forcer le texte en blanc pour tous les éléments du badge - avec spécificité maximale */
  3314.         .notification-badge,
  3315.         .notification-badge.text-white,
  3316.         .notification-badge *,
  3317.         #notificationBadge,
  3318.         #notificationBadge.text-white,
  3319.         #notificationBadge *,
  3320.         span.notification-badge,
  3321.         span.notification-badge.text-white,
  3322.         span#notificationBadge,
  3323.         span#notificationBadge.text-white {
  3324.             color: white !important;
  3325.             text-color: white !important;
  3326.             -webkit-text-fill-color: white !important;
  3327.         }
  3328.         
  3329.         /* S'assurer que le contenu texte est bien en blanc */
  3330.         .notification-badge::before,
  3331.         .notification-badge::after {
  3332.             color: white !important;
  3333.         }
  3334.         
  3335.         /* Forcer la couleur pour tous les sélecteurs possibles avec spécificité maximale */
  3336.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge,
  3337.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge.text-white,
  3338.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span.notification-badge,
  3339.         .notification-icon .notification-badge,
  3340.         .notification-icon .notification-badge.text-white,
  3341.         .notification-icon span.notification-badge,
  3342.         a.notification-icon .notification-badge,
  3343.         a.notification-icon span.notification-badge {
  3344.             color: white !important;
  3345.             text-color: white !important;
  3346.             -webkit-text-fill-color: white !important;
  3347.         }
  3348.         
  3349.         /* Forcer la couleur pour tous les enfants directs */
  3350.         .notification-icon > .notification-badge,
  3351.         .notification-icon > span.notification-badge {
  3352.             color: white !important;
  3353.         }
  3354.         
  3355.         @keyframes pulse {
  3356.             0% { transform: scale(1); }
  3357.             50% { transform: scale(1.1); }
  3358.             100% { transform: scale(1); }
  3359.         }
  3360.         
  3361.         .notification-icon:hover .notification-badge {
  3362.             animation: none;
  3363.         }
  3364.         
  3365.         /* Container pour les icônes - toujours alignées horizontalement */
  3366.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
  3367.             display: flex !important;
  3368.             flex-direction: row !important;
  3369.             align-items: center !important;
  3370.             justify-content: center !important;
  3371.             gap: 15px !important;
  3372.             list-style: none !important;
  3373.             margin: 0 !important;
  3374.             padding: 0 !important;
  3375.             width: auto !important;
  3376.         }
  3377.         
  3378.         /* Surcharger les styles existants pour les li contenant le wrapper */
  3379.         .header_area .navbar .nav.navbar-nav.navbar-right li:has(.navbar-icons-wrapper) {
  3380.             margin-left: 0 !important;
  3381.             margin-right: 0 !important;
  3382.             display: flex !important;
  3383.             align-items: center !important;
  3384.             justify-content: center !important;
  3385.         }
  3386.         
  3387.         /* Styles pour les icônes */
  3388.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart,
  3389.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon,
  3390.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
  3391.             display: flex !important;
  3392.             align-items: center !important;
  3393.             justify-content: center !important;
  3394.             width: 40px !important;
  3395.             height: 40px !important;
  3396.             min-width: 40px !important;
  3397.             min-height: 40px !important;
  3398.             color: #333 !important;
  3399.             text-decoration: none !important;
  3400.             transition: all 0.3s ease !important;
  3401.             border-radius: 50% !important;
  3402.             position: relative !important;
  3403.             margin: 0 !important;
  3404.             padding: 0 !important;
  3405.         }
  3406.         
  3407.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart:hover,
  3408.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon:hover,
  3409.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search:hover {
  3410.             background-color: #f0f0f0 !important;
  3411.             color: #ffa200 !important;
  3412.             transform: scale(1.1) !important;
  3413.         }
  3414.         
  3415.         /* Surcharger le line-height de main.css */
  3416.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart span,
  3417.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span,
  3418.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search span {
  3419.             font-size: 18px !important;
  3420.             line-height: 1 !important;
  3421.             display: flex !important;
  3422.             align-items: center !important;
  3423.             justify-content: center !important;
  3424.             color: inherit !important;
  3425.             font-weight: normal !important;
  3426.         }
  3427.         
  3428.         .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
  3429.             background: transparent !important;
  3430.             border: 0 !important;
  3431.             cursor: pointer !important;
  3432.             padding: 0 !important;
  3433.         }
  3434.         
  3435.         /* Alignement des icônes navbar sur mobile */
  3436.         @media (max-width: 991.98px) {
  3437.             /* Container navbar-right en colonne sur mobile */
  3438.             .header_area .navbar .nav.navbar-nav.navbar-right {
  3439.                 display: flex !important;
  3440.                 flex-direction: column !important;
  3441.                 align-items: center !important;
  3442.                 justify-content: center !important;
  3443.                 width: 100% !important;
  3444.                 gap: 0 !important;
  3445.                 margin: 0 !important;
  3446.                 padding: 10px 0 !important;
  3447.             }
  3448.             
  3449.             /* Le container d'icônes reste horizontal */
  3450.             .header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
  3451.                 width: 100% !important;
  3452.                 justify-content: center !important;
  3453.                 display: flex !important;
  3454.                 flex-direction: row !important;
  3455.             }
  3456.             
  3457.             /* Le bouton compte en bas - pleine largeur */
  3458.             .header_area .navbar .nav.navbar-nav.navbar-right li:last-child {
  3459.                 width: 100% !important;
  3460.                 display: flex !important;
  3461.                 justify-content: center !important;
  3462.                 margin-top: 12px !important;
  3463.                 padding-top: 12px !important;
  3464.                 border-top: 1px solid #e0e0e0 !important;
  3465.             }
  3466.             
  3467.             /* Bouton compte responsive */
  3468.             .header_area .navbar .nav.navbar-nav.navbar-right .btn-account {
  3469.                 width: 100%;
  3470.                 max-width: 200px;
  3471.                 padding: 10px 20px;
  3472.                 font-size: 14px;
  3473.             }
  3474.         }
  3475.         
  3476.         /* Styles pour les messages flash - Design moderne */
  3477.         .flash-message {
  3478.             animation: slideInDownFlash 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  3479.             position: relative;
  3480.             overflow: visible !important;
  3481.             border: none !important;
  3482.             padding: 16px 20px !important;
  3483.             border-radius: 12px !important;
  3484.             box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
  3485.             display: flex !important;
  3486.             align-items: center;
  3487.             gap: 12px;
  3488.             margin-bottom: 15px;
  3489.             backdrop-filter: blur(10px);
  3490.             transition: all 0.3s ease;
  3491.         }
  3492.         
  3493.         /* S'assurer que les icônes Font Awesome sont visibles */
  3494.         .flash-message i.fa {
  3495.             display: inline-block !important;
  3496.             visibility: visible !important;
  3497.             opacity: 1 !important;
  3498.             width: auto !important;
  3499.             height: auto !important;
  3500.             font-family: \"FontAwesome\" !important;
  3501.             font-style: normal !important;
  3502.             font-weight: normal !important;
  3503.             text-rendering: auto !important;
  3504.             -webkit-font-smoothing: antialiased !important;
  3505.             -moz-osx-font-smoothing: grayscale !important;
  3506.             line-height: 1 !important;
  3507.             flex-shrink: 0 !important;
  3508.         }
  3509.         
  3510.         /* Forcer l'affichage des pseudo-éléments Font Awesome */
  3511.         .flash-message i.fa::before {
  3512.             display: inline-block !important;
  3513.             visibility: visible !important;
  3514.             opacity: 1 !important;
  3515.             content: attr(data-icon) !important;
  3516.         }
  3517.         
  3518.         /* Styles spécifiques pour chaque icône */
  3519.         .flash-message i.fa-check-circle::before {
  3520.             content: \"\\f058\" !important;
  3521.         }
  3522.         
  3523.         .flash-message i.fa-exclamation-circle::before {
  3524.             content: \"\\f06a\" !important;
  3525.         }
  3526.         
  3527.         .flash-message i.fa-exclamation-triangle::before {
  3528.             content: \"\\f071\" !important;
  3529.         }
  3530.         
  3531.         .flash-message i.fa-info-circle::before {
  3532.             content: \"\\f05a\" !important;
  3533.         }
  3534.         
  3535.         .flash-message:hover {
  3536.             box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2) !important;
  3537.             transform: translateY(-2px);
  3538.         }
  3539.         
  3540.         .flash-message::before {
  3541.             content: '';
  3542.             position: absolute;
  3543.             left: 0;
  3544.             top: 0;
  3545.             bottom: 0;
  3546.             width: 5px;
  3547.             background: linear-gradient(180deg, currentColor 0%, rgba(255,255,255,0.3) 100%);
  3548.             border-radius: 12px 0 0 12px;
  3549.         }
  3550.         
  3551.         .flash-message.alert-success {
  3552.             background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%) !important;
  3553.             color: #155724 !important;
  3554.             border-left: 5px solid #28a745 !important;
  3555.         }
  3556.         
  3557.         .flash-message.alert-success i.fa {
  3558.             color: #28a745 !important;
  3559.             font-size: 1.3rem !important;
  3560.             display: inline-block !important;
  3561.             margin-right: 8px;
  3562.             vertical-align: middle;
  3563.         }
  3564.         
  3565.         .flash-message.alert-danger {
  3566.             background: linear-gradient(135deg, #f8d7da 0%, #f5c6cb 100%) !important;
  3567.             color: #721c24 !important;
  3568.             border-left: 5px solid #dc3545 !important;
  3569.         }
  3570.         
  3571.         .flash-message.alert-danger i.fa {
  3572.             color: #dc3545 !important;
  3573.             font-size: 1.3rem !important;
  3574.             display: inline-block !important;
  3575.             margin-right: 8px;
  3576.             vertical-align: middle;
  3577.         }
  3578.         
  3579.         .flash-message.alert-warning {
  3580.             background: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%) !important;
  3581.             color: #856404 !important;
  3582.             border-left: 5px solid #ffc107 !important;
  3583.         }
  3584.         
  3585.         .flash-message.alert-warning i.fa {
  3586.             color: #ffa200 !important;
  3587.             font-size: 1.3rem !important;
  3588.             display: inline-block !important;
  3589.             margin-right: 8px;
  3590.             vertical-align: middle;
  3591.         }
  3592.         
  3593.         .flash-message.alert-info {
  3594.             background: linear-gradient(135deg, #d1ecf1 0%, #bee5eb 100%) !important;
  3595.             color: #0c5460 !important;
  3596.             border-left: 5px solid #17a2b8 !important;
  3597.         }
  3598.         
  3599.         .flash-message.alert-info i.fa {
  3600.             color: #17a2b8 !important;
  3601.             font-size: 1.3rem !important;
  3602.             display: inline-block !important;
  3603.             margin-right: 8px;
  3604.             vertical-align: middle;
  3605.         }
  3606.         
  3607.         .flash-message strong {
  3608.             flex: 1;
  3609.             font-weight: 600;
  3610.             font-size: 0.95rem;
  3611.             line-height: 1.5;
  3612.         }
  3613.         
  3614.         .flash-message .btn-close {
  3615.             opacity: 0.7;
  3616.             padding: 8px !important;
  3617.             margin: -8px -8px -8px auto !important;
  3618.             transition: all 0.2s ease;
  3619.             border-radius: 50% !important;
  3620.             background: rgba(0, 0, 0, 0.05) !important;
  3621.             width: 32px !important;
  3622.             height: 32px !important;
  3623.             display: flex !important;
  3624.             align-items: center !important;
  3625.             justify-content: center !important;
  3626.             border: none !important;
  3627.             cursor: pointer !important;
  3628.             position: relative !important;
  3629.         }
  3630.         
  3631.         /* Ajouter une icône X visible dans le bouton */
  3632.         .flash-message .btn-close::before {
  3633.             content: '×' !important;
  3634.             font-size: 24px !important;
  3635.             line-height: 1 !important;
  3636.             color: currentColor !important;
  3637.             font-weight: bold !important;
  3638.             display: block !important;
  3639.             position: absolute !important;
  3640.             top: 50% !important;
  3641.             left: 50% !important;
  3642.             transform: translate(-50%, -50%) !important;
  3643.         }
  3644.         
  3645.         .flash-message .btn-close:hover {
  3646.             opacity: 1 !important;
  3647.             background: rgba(0, 0, 0, 0.15) !important;
  3648.             transform: rotate(90deg) !important;
  3649.         }
  3650.         
  3651.         .flash-message .btn-close:hover::before {
  3652.             transform: translate(-50%, -50%) rotate(-90deg) !important;
  3653.         }
  3654.         
  3655.         @keyframes slideInDownFlash {
  3656.             from {
  3657.                 opacity: 0;
  3658.                 transform: translateY(-30px) scale(0.95);
  3659.             }
  3660.             to {
  3661.                 opacity: 1;
  3662.                 transform: translateY(0) scale(1);
  3663.             }
  3664.         }
  3665.         
  3666.         #flash-messages-container {
  3667.             margin-top: 20px;
  3668.             margin-bottom: 0;
  3669.         }
  3670.         
  3671.         @media (max-width: 768px) {
  3672.             .flash-message {
  3673.                 padding: 14px 16px !important;
  3674.                 font-size: 0.9rem;
  3675.             }
  3676.             
  3677.             .flash-message i {
  3678.                 font-size: 1.2rem !important;
  3679.             }
  3680.         }
  3681.         
  3682.         /* Styles pour l'icône de comparaison */
  3683.         .comparison-icon {
  3684.             position: relative;
  3685.             display: inline-block;
  3686.             color: #333;
  3687.             text-decoration: none;
  3688.             transition: color 0.3s ease;
  3689.         }
  3690.         
  3691.         .comparison-icon:hover {
  3692.             color: #ffa200;
  3693.         }
  3694.         
  3695.         .comparison-badge {
  3696.             position: absolute;
  3697.             top: 17px;
  3698.             left: 12px;
  3699.             background: #ffa200;
  3700.             color: white;
  3701.             border-radius: 50%;
  3702.             width: 18px;
  3703.             height: 18px;
  3704.             font-size: 10px;
  3705.             display: flex;
  3706.             align-items: center;
  3707.             justify-content: center;
  3708.             font-weight: bold;
  3709.             animation: pulse 2s infinite;
  3710.         }
  3711.         
  3712.         .comparison-icon:hover .comparison-badge {
  3713.             animation: none;
  3714.         }
  3715.         
  3716.         /* Styles pour les mega-menus - style comme la barre de recherche */
  3717.         .mega-menu {
  3718.             width: 100%;
  3719.             max-width: 1200px;
  3720.             left: 50%;
  3721.             transform: translateX(-50%);
  3722.             padding: 25px;
  3723.             border-radius: 12px;
  3724.             box-shadow: 0 8px 30px rgba(0,0,0,0.12);
  3725.             border: none;
  3726.             background: white;
  3727.             display: none;
  3728.             position: absolute;
  3729.             top: 100%;
  3730.             z-index: 9999 !important;
  3731.             margin-top: 10px;
  3732.             opacity: 0;
  3733.             visibility: hidden;
  3734.             transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;
  3735.         }
  3736.         
  3737.         .mega-menu.active {
  3738.             display: block;
  3739.             opacity: 1;
  3740.             visibility: visible;
  3741.             transform: translateX(-50%) translateY(0);
  3742.         }
  3743.         
  3744.         .nav-item.dropdown {
  3745.             position: relative !important;
  3746.         }
  3747.         
  3748.         @media (min-width: 768px) {
  3749.             .nav-item.dropdown {
  3750.                 position: relative !important;
  3751.             }
  3752.             
  3753.             .mega-menu {
  3754.                 position: absolute !important;
  3755.                 left: 50% !important;
  3756.                 transform: translateX(-50%) !important;
  3757.                 width: auto !important;
  3758.                 min-width: 600px !important;
  3759.             }
  3760.         }
  3761.         
  3762.         /* Correction supplémentaire pour l'affichage sur la page d'accueil */
  3763.         body.home .nav-item.dropdown,
  3764.         .nav-item.dropdown {
  3765.             position: relative !important;
  3766.         }
  3767.         
  3768.         body.home .mega-menu,
  3769.         .mega-menu {
  3770.             position: absolute !important;
  3771.             left: 50% !important;
  3772.             transform: translateX(-50%) translateY(0) !important;
  3773.             width: auto !important;
  3774.             min-width: 600px !important;
  3775.             max-width: 90% !important;
  3776.             top: 100% !important;
  3777.             margin-top: 10px !important;
  3778.         }
  3779.         
  3780.         /* Assurer que les mega-menus sont toujours visibles au survol */
  3781.         .nav-item.dropdown:hover .mega-menu {
  3782.             opacity: 1 !important;
  3783.             visibility: visible !important;
  3784.             display: block !important;
  3785.             transform: translateX(-50%) translateY(0) !important;
  3786.         }
  3787.         
  3788.         .mega-menu .dropdown-item {
  3789.             padding: 0;
  3790.             border: none;
  3791.         }
  3792.         
  3793.         .mega-menu .dropdown-header {
  3794.             font-weight: 700;
  3795.             color: #2c3e50;
  3796.             margin-bottom: 18px;
  3797.             padding-bottom: 10px;
  3798.             border-bottom: 3px solid #3498db;
  3799.             font-size: 16px;
  3800.             text-transform: uppercase;
  3801.             letter-spacing: 0.5px;
  3802.         }
  3803.         
  3804.         .mega-menu .dropdown-item a {
  3805.             display: block;
  3806.             padding: 10px 15px;
  3807.             color: #555;
  3808.             text-decoration: none;
  3809.             border-radius: 6px;
  3810.             transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  3811.             position: relative;
  3812.             overflow: hidden;
  3813.         }
  3814.         
  3815.         .mega-menu .dropdown-item a::before {
  3816.             content: '';
  3817.             position: absolute;
  3818.             top: 0;
  3819.             left: -100%;
  3820.             width: 100%;
  3821.             height: 100%;
  3822.             background: linear-gradient(90deg, transparent, rgba(52, 152, 219, 0.1), transparent);
  3823.             transition: left 0.5s;
  3824.         }
  3825.         
  3826.         .mega-menu .dropdown-item a:hover::before {
  3827.             left: 100%;
  3828.         }
  3829.         
  3830.         .mega-menu .dropdown-item a:hover {
  3831.             background: linear-gradient(135deg, #f8f9fa, #e3f2fd);
  3832.             color: #2980b9;
  3833.             transform: translateX(8px);
  3834.             box-shadow: 0 2px 8px rgba(52, 152, 219, 0.2);
  3835.         }
  3836.         
  3837.         .mega-menu .dropdown-item a i {
  3838.             width: 22px;
  3839.             text-align: center;
  3840.             margin-right: 8px;
  3841.             color: #3498db;
  3842.             transition: color 0.3s ease;
  3843.         }
  3844.         
  3845.         .mega-menu .dropdown-item a:hover i {
  3846.             color: #2980b9;
  3847.         }
  3848.         
  3849.         /* Animation d'apparition améliorée */
  3850.         @keyframes slideInDown {
  3851.             from {
  3852.                 opacity: 0;
  3853.                 transform: translateY(-20px);
  3854.             }
  3855.             to {
  3856.                 opacity: 1;
  3857.                 transform: translateY(0);
  3858.             }
  3859.         }
  3860.         
  3861.         .mega-menu {
  3862.             animation: slideInDown 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  3863.         }
  3864.         
  3865.         /* Effet de survol sur le lien principal */
  3866.         .nav-item.dropdown .nav-link {
  3867.             position: relative;
  3868.             transition: all 0.3s ease;
  3869.         }
  3870.         
  3871.         .nav-item.dropdown .nav-link::after {
  3872.             content: '';
  3873.             position: absolute;
  3874.             bottom: -2px;
  3875.             left: 50%;
  3876.             width: 0;
  3877.             height: 2px;
  3878.             background: linear-gradient(90deg, #3498db, #2980b9);
  3879.             transition: all 0.3s ease;
  3880.             transform: translateX(-50%);
  3881.         }
  3882.         
  3883.         .nav-item.dropdown:hover .nav-link::after {
  3884.             width: 100%;
  3885.         }
  3886.         
  3887.         .nav-item.dropdown:hover .nav-link {
  3888.             color: #2980b9;
  3889.         }
  3890.         
  3891.         @keyframes fadeInDown {
  3892.             from {
  3893.                 opacity: 0;
  3894.                 transform: translateY(-10px);
  3895.             }
  3896.             to {
  3897.                 opacity: 1;
  3898.                 transform: translateY(0);
  3899.             }
  3900.         }
  3901.         
  3902.         /* Responsive */
  3903.         @media (max-width: 768px) {
  3904.             .mega-menu {
  3905.                 width: 100%;
  3906.                 left: 0;
  3907.                 padding: 15px;
  3908.             }
  3909.             
  3910.             .mega-menu .row {
  3911.                 margin: 0;
  3912.             }
  3913.             
  3914.             .mega-menu .col-md-3 {
  3915.                 margin-bottom: 20px;
  3916.             }
  3917.         }
  3918.     </style>
  3919.     
  3920.     
  3921.     {% block stylesheets %}
  3922.         {{ encore_entry_link_tags('app') }}
  3923.     {% endblock %}
  3924.     
  3925.     <!-- Script pour forcer l'application des styles CSS après chargement -->
  3926.     <script>
  3927.         document.addEventListener('DOMContentLoaded', function() {
  3928.             // Forcer le masquage du toggle sur grands écrans
  3929.             if (window.innerWidth >= 992) {
  3930.                 const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
  3931.                 togglers.forEach(function(toggler) {
  3932.                     if (toggler) {
  3933.                         toggler.style.display = 'none';
  3934.                         toggler.style.visibility = 'hidden';
  3935.                         toggler.style.opacity = '0';
  3936.                         toggler.style.width = '0';
  3937.                         toggler.style.height = '0';
  3938.                         toggler.style.padding = '0';
  3939.                         toggler.style.margin = '0';
  3940.                         toggler.style.border = 'none';
  3941.                         toggler.style.position = 'absolute';
  3942.                         toggler.style.left = '-9999px';
  3943.                     }
  3944.                 });
  3945.                 
  3946.                 const iconBars = document.querySelectorAll('.navbar-toggler .icon-bar, .header_area .navbar .navbar-toggler .icon-bar, .navbar-toggler-icon');
  3947.                 iconBars.forEach(function(bar) {
  3948.                     if (bar) {
  3949.                         bar.style.display = 'none';
  3950.                         bar.style.visibility = 'hidden';
  3951.                     }
  3952.                 });
  3953.             }
  3954.             
  3955.             // Alignement des icônes navbar sur mobile
  3956.             const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
  3957.             navbarRight.forEach(function(nav) {
  3958.                 if (nav && window.innerWidth <= 991.98) {
  3959.                     // Mobile: colonne avec icônes alignées horizontalement
  3960.                     nav.style.display = 'flex';
  3961.                     nav.style.flexDirection = 'column';
  3962.                     nav.style.alignItems = 'center';
  3963.                     nav.style.textAlign = 'center';
  3964.                     
  3965.                     // Le container d'icônes reste horizontal
  3966.                     const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
  3967.                     if (iconsContainer) {
  3968.                         iconsContainer.style.display = 'flex';
  3969.                         iconsContainer.style.flexDirection = 'row';
  3970.                         iconsContainer.style.justifyContent = 'center';
  3971.                     }
  3972.                     
  3973.                     // Le bouton compte en bas
  3974.                     const accountBtn = nav.querySelector('li:last-child');
  3975.                     if (accountBtn) {
  3976.                         accountBtn.style.width = '100%';
  3977.                         accountBtn.style.display = 'flex';
  3978.                         accountBtn.style.justifyContent = 'center';
  3979.                         accountBtn.style.marginTop = '12px';
  3980.                         accountBtn.style.paddingTop = '12px';
  3981.                         accountBtn.style.borderTop = '1px solid #e0e0e0';
  3982.                     }
  3983.                 } else if (nav && window.innerWidth > 991.98) {
  3984.                     // Desktop: alignement horizontal normal
  3985.                     nav.style.display = 'flex';
  3986.                     nav.style.flexDirection = 'row';
  3987.                     nav.style.alignItems = 'center';
  3988.                     nav.style.justifyContent = 'flex-end';
  3989.                 }
  3990.             });
  3991.         });
  3992.         
  3993.         // Réappliquer lors du redimensionnement
  3994.         window.addEventListener('resize', function() {
  3995.             if (window.innerWidth >= 992) {
  3996.                 const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
  3997.                 togglers.forEach(function(toggler) {
  3998.                     if (toggler) {
  3999.                         toggler.style.display = 'none';
  4000.                         toggler.style.visibility = 'hidden';
  4001.                     }
  4002.                 });
  4003.             }
  4004.             
  4005.             // Réappliquer l'alignement des icônes navbar
  4006.             const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
  4007.             navbarRight.forEach(function(nav) {
  4008.                 if (nav && window.innerWidth <= 991.98) {
  4009.                     // Mobile: colonne avec icônes alignées horizontalement
  4010.                     nav.style.display = 'flex';
  4011.                     nav.style.flexDirection = 'column';
  4012.                     nav.style.alignItems = 'center';
  4013.                     nav.style.textAlign = 'center';
  4014.                     
  4015.                     // Le container d'icônes reste horizontal
  4016.                     const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
  4017.                     if (iconsContainer) {
  4018.                         iconsContainer.style.display = 'flex';
  4019.                         iconsContainer.style.flexDirection = 'row';
  4020.                         iconsContainer.style.justifyContent = 'center';
  4021.                     }
  4022.                     
  4023.                     const accountBtn = nav.querySelector('li:last-child');
  4024.                     if (accountBtn) {
  4025.                         accountBtn.style.width = '100%';
  4026.                         accountBtn.style.display = 'flex';
  4027.                         accountBtn.style.justifyContent = 'center';
  4028.                         accountBtn.style.marginTop = '12px';
  4029.                         accountBtn.style.paddingTop = '12px';
  4030.                         accountBtn.style.borderTop = '1px solid #e0e0e0';
  4031.                     }
  4032.                 } else if (nav && window.innerWidth > 991.98) {
  4033.                     // Desktop: alignement horizontal normal
  4034.                     nav.style.display = 'flex';
  4035.                     nav.style.flexDirection = 'row';
  4036.                     nav.style.alignItems = 'center';
  4037.                     nav.style.justifyContent = 'flex-end';
  4038.                 }
  4039.             });
  4040.         });
  4041.         
  4042.     </script>
  4043.     {% set current_route = app.request.attributes.get('_route') %}
  4044.     {% set is_account_route = current_route starts with 'ui_account_' or current_route == 'notifications_list' %}
  4045.     <style>
  4046.         /* Shared dark-mode fixes for the public account area. */
  4047.         @media (prefers-color-scheme: dark) {
  4048.             body.account-theme-scope {
  4049.                 background-color: #111827;
  4050.                 color: #e5e7eb;
  4051.             }
  4052.             body.account-theme-scope .card,
  4053.             body.account-theme-scope .notification-item,
  4054.             body.account-theme-scope .list-group-item,
  4055.             body.account-theme-scope .modal-content,
  4056.             body.account-theme-scope .dropdown-menu,
  4057.             body.account-theme-scope .form-control,
  4058.             body.account-theme-scope .form-select,
  4059.             body.account-theme-scope .input-group-text,
  4060.             body.account-theme-scope .accordion-item,
  4061.             body.account-theme-scope .table,
  4062.             body.account-theme-scope .table td,
  4063.             body.account-theme-scope .table th {
  4064.                 background-color: #1f2937 !important;
  4065.                 border-color: #374151 !important;
  4066.                 color: #e5e7eb !important;
  4067.             }
  4068.             body.account-theme-scope .card-header,
  4069.             body.account-theme-scope .card-header.bg-white,
  4070.             body.account-theme-scope .bg-white,
  4071.             body.account-theme-scope .account-menu-list .menu-main {
  4072.                 background-color: #182131 !important;
  4073.                 border-color: #374151 !important;
  4074.             }
  4075.             body.account-theme-scope .text-muted,
  4076.             body.account-theme-scope .form-text,
  4077.             body.account-theme-scope .form-label,
  4078.             body.account-theme-scope small,
  4079.             body.account-theme-scope .small,
  4080.             body.account-theme-scope .btn-outline-secondary,
  4081.             body.account-theme-scope .btn-outline-secondary i {
  4082.                 color: #aeb8c7 !important;
  4083.             }
  4084.             body.account-theme-scope h1,
  4085.             body.account-theme-scope h2,
  4086.             body.account-theme-scope h3,
  4087.             body.account-theme-scope h4,
  4088.             body.account-theme-scope h5,
  4089.             body.account-theme-scope h6,
  4090.             body.account-theme-scope .list-group-item,
  4091.             body.account-theme-scope .card-title,
  4092.             body.account-theme-scope .card-text,
  4093.             body.account-theme-scope .notification-title,
  4094.             body.account-theme-scope .notification-message,
  4095.             body.account-theme-scope .notification-meta,
  4096.             body.account-theme-scope .table,
  4097.             body.account-theme-scope .table td,
  4098.             body.account-theme-scope .table th,
  4099.             body.account-theme-scope .table strong,
  4100.             body.account-theme-scope .table a:not(.btn),
  4101.             body.account-theme-scope .breadcrumb-banner,
  4102.             body.account-theme-scope .breadcrumb-banner a,
  4103.             body.account-theme-scope .breadcrumb-banner h1,
  4104.             body.account-theme-scope .empty-state-title,
  4105.             body.account-theme-scope .empty-state-text {
  4106.                 color: #e5e7eb !important;
  4107.             }
  4108.             body.account-theme-scope .account-menu-list .list-group-item:hover:not(.menu-action-active):not(.menu-main) {
  4109.                 background-color: #243041 !important;
  4110.             }
  4111.             body.account-theme-scope .notification-item.unread {
  4112.                 background-color: #172554 !important;
  4113.                 border-left-color: #60a5fa !important;
  4114.             }
  4115.             body.account-theme-scope .notification-item.archived {
  4116.                 opacity: 0.85;
  4117.             }
  4118.             body.account-theme-scope .btn-outline-primary,
  4119.             body.account-theme-scope .btn-outline-secondary,
  4120.             body.account-theme-scope .btn-outline-warning,
  4121.             body.account-theme-scope .btn-outline-danger {
  4122.                 background-color: transparent !important;
  4123.             }
  4124.             body.account-theme-scope .empty-state-icon {
  4125.                 color: #6b7280 !important;
  4126.             }
  4127.             body.account-theme-scope .profile-picture-container .profile-picture,
  4128.             body.account-theme-scope .profile-picture-mobile,
  4129.             body.account-theme-scope .profile-picture-edit-icon,
  4130.             body.account-theme-scope .profile-picture-edit-icon-mobile {
  4131.                 border-color: #111827 !important;
  4132.             }
  4133.         }
  4134.         html.dark-mode body.account-theme-scope,
  4135.         body.dark-mode.account-theme-scope,
  4136.         html[data-theme=\"dark\"] body.account-theme-scope,
  4137.         body[data-theme=\"dark\"].account-theme-scope,
  4138.         html[data-bs-theme=\"dark\"] body.account-theme-scope,
  4139.         body[data-bs-theme=\"dark\"].account-theme-scope {
  4140.             background-color: #111827;
  4141.             color: #e5e7eb;
  4142.         }
  4143.         html.dark-mode body.account-theme-scope .card,
  4144.         html.dark-mode body.account-theme-scope .notification-item,
  4145.         html.dark-mode body.account-theme-scope .list-group-item,
  4146.         html.dark-mode body.account-theme-scope .modal-content,
  4147.         html.dark-mode body.account-theme-scope .dropdown-menu,
  4148.         html.dark-mode body.account-theme-scope .form-control,
  4149.         html.dark-mode body.account-theme-scope .form-select,
  4150.         html.dark-mode body.account-theme-scope .input-group-text,
  4151.         html.dark-mode body.account-theme-scope .accordion-item,
  4152.         html.dark-mode body.account-theme-scope .table,
  4153.         html.dark-mode body.account-theme-scope .table td,
  4154.         html.dark-mode body.account-theme-scope .table th,
  4155.         body.dark-mode.account-theme-scope .card,
  4156.         body.dark-mode.account-theme-scope .notification-item,
  4157.         body.dark-mode.account-theme-scope .list-group-item,
  4158.         body.dark-mode.account-theme-scope .modal-content,
  4159.         body.dark-mode.account-theme-scope .dropdown-menu,
  4160.         body.dark-mode.account-theme-scope .form-control,
  4161.         body.dark-mode.account-theme-scope .form-select,
  4162.         body.dark-mode.account-theme-scope .input-group-text,
  4163.         body.dark-mode.account-theme-scope .accordion-item,
  4164.         body.dark-mode.account-theme-scope .table,
  4165.         body.dark-mode.account-theme-scope .table td,
  4166.         body.dark-mode.account-theme-scope .table th,
  4167.         html[data-theme=\"dark\"] body.account-theme-scope .card,
  4168.         html[data-theme=\"dark\"] body.account-theme-scope .notification-item,
  4169.         html[data-theme=\"dark\"] body.account-theme-scope .list-group-item,
  4170.         html[data-theme=\"dark\"] body.account-theme-scope .modal-content,
  4171.         html[data-theme=\"dark\"] body.account-theme-scope .dropdown-menu,
  4172.         html[data-theme=\"dark\"] body.account-theme-scope .form-control,
  4173.         html[data-theme=\"dark\"] body.account-theme-scope .form-select,
  4174.         html[data-theme=\"dark\"] body.account-theme-scope .input-group-text,
  4175.         html[data-theme=\"dark\"] body.account-theme-scope .accordion-item,
  4176.         html[data-theme=\"dark\"] body.account-theme-scope .table,
  4177.         html[data-theme=\"dark\"] body.account-theme-scope .table td,
  4178.         html[data-theme=\"dark\"] body.account-theme-scope .table th,
  4179.         body[data-theme=\"dark\"].account-theme-scope .card,
  4180.         body[data-theme=\"dark\"].account-theme-scope .notification-item,
  4181.         body[data-theme=\"dark\"].account-theme-scope .list-group-item,
  4182.         body[data-theme=\"dark\"].account-theme-scope .modal-content,
  4183.         body[data-theme=\"dark\"].account-theme-scope .dropdown-menu,
  4184.         body[data-theme=\"dark\"].account-theme-scope .form-control,
  4185.         body[data-theme=\"dark\"].account-theme-scope .form-select,
  4186.         body[data-theme=\"dark\"].account-theme-scope .input-group-text,
  4187.         body[data-theme=\"dark\"].account-theme-scope .accordion-item,
  4188.         body[data-theme=\"dark\"].account-theme-scope .table,
  4189.         body[data-theme=\"dark\"].account-theme-scope .table td,
  4190.         body[data-theme=\"dark\"].account-theme-scope .table th,
  4191.         html[data-bs-theme=\"dark\"] body.account-theme-scope .card,
  4192.         html[data-bs-theme=\"dark\"] body.account-theme-scope .notification-item,
  4193.         html[data-bs-theme=\"dark\"] body.account-theme-scope .list-group-item,
  4194.         html[data-bs-theme=\"dark\"] body.account-theme-scope .modal-content,
  4195.         html[data-bs-theme=\"dark\"] body.account-theme-scope .dropdown-menu,
  4196.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-control,
  4197.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-select,
  4198.         html[data-bs-theme=\"dark\"] body.account-theme-scope .input-group-text,
  4199.         html[data-bs-theme=\"dark\"] body.account-theme-scope .accordion-item,
  4200.         html[data-bs-theme=\"dark\"] body.account-theme-scope .table,
  4201.         html[data-bs-theme=\"dark\"] body.account-theme-scope .table td,
  4202.         html[data-bs-theme=\"dark\"] body.account-theme-scope .table th,
  4203.         body[data-bs-theme=\"dark\"].account-theme-scope .card,
  4204.         body[data-bs-theme=\"dark\"].account-theme-scope .notification-item,
  4205.         body[data-bs-theme=\"dark\"].account-theme-scope .list-group-item,
  4206.         body[data-bs-theme=\"dark\"].account-theme-scope .modal-content,
  4207.         body[data-bs-theme=\"dark\"].account-theme-scope .dropdown-menu,
  4208.         body[data-bs-theme=\"dark\"].account-theme-scope .form-control,
  4209.         body[data-bs-theme=\"dark\"].account-theme-scope .form-select,
  4210.         body[data-bs-theme=\"dark\"].account-theme-scope .input-group-text,
  4211.         body[data-bs-theme=\"dark\"].account-theme-scope .accordion-item,
  4212.         body[data-bs-theme=\"dark\"].account-theme-scope .table,
  4213.         body[data-bs-theme=\"dark\"].account-theme-scope .table td,
  4214.         body[data-bs-theme=\"dark\"].account-theme-scope .table th {
  4215.             background-color: #1f2937 !important;
  4216.             border-color: #374151 !important;
  4217.             color: #e5e7eb !important;
  4218.         }
  4219.         html.dark-mode body.account-theme-scope .card-header,
  4220.         html.dark-mode body.account-theme-scope .card-header.bg-white,
  4221.         html.dark-mode body.account-theme-scope .bg-white,
  4222.         html.dark-mode body.account-theme-scope .account-menu-list .menu-main,
  4223.         body.dark-mode.account-theme-scope .card-header,
  4224.         body.dark-mode.account-theme-scope .card-header.bg-white,
  4225.         body.dark-mode.account-theme-scope .bg-white,
  4226.         body.dark-mode.account-theme-scope .account-menu-list .menu-main,
  4227.         html[data-theme=\"dark\"] body.account-theme-scope .card-header,
  4228.         html[data-theme=\"dark\"] body.account-theme-scope .card-header.bg-white,
  4229.         html[data-theme=\"dark\"] body.account-theme-scope .bg-white,
  4230.         html[data-theme=\"dark\"] body.account-theme-scope .account-menu-list .menu-main,
  4231.         body[data-theme=\"dark\"].account-theme-scope .card-header,
  4232.         body[data-theme=\"dark\"].account-theme-scope .card-header.bg-white,
  4233.         body[data-theme=\"dark\"].account-theme-scope .bg-white,
  4234.         body[data-theme=\"dark\"].account-theme-scope .account-menu-list .menu-main,
  4235.         html[data-bs-theme=\"dark\"] body.account-theme-scope .card-header,
  4236.         html[data-bs-theme=\"dark\"] body.account-theme-scope .card-header.bg-white,
  4237.         html[data-bs-theme=\"dark\"] body.account-theme-scope .bg-white,
  4238.         html[data-bs-theme=\"dark\"] body.account-theme-scope .account-menu-list .menu-main,
  4239.         body[data-bs-theme=\"dark\"].account-theme-scope .card-header,
  4240.         body[data-bs-theme=\"dark\"].account-theme-scope .card-header.bg-white,
  4241.         body[data-bs-theme=\"dark\"].account-theme-scope .bg-white,
  4242.         body[data-bs-theme=\"dark\"].account-theme-scope .account-menu-list .menu-main {
  4243.             background-color: #182131 !important;
  4244.             border-color: #374151 !important;
  4245.         }
  4246.         html.dark-mode body.account-theme-scope .text-muted,
  4247.         html.dark-mode body.account-theme-scope .form-text,
  4248.         html.dark-mode body.account-theme-scope .form-label,
  4249.         html.dark-mode body.account-theme-scope small,
  4250.         html.dark-mode body.account-theme-scope .small,
  4251.         html.dark-mode body.account-theme-scope .btn-outline-secondary,
  4252.         html.dark-mode body.account-theme-scope .btn-outline-secondary i,
  4253.         body.dark-mode.account-theme-scope .text-muted,
  4254.         body.dark-mode.account-theme-scope .form-text,
  4255.         body.dark-mode.account-theme-scope .form-label,
  4256.         body.dark-mode.account-theme-scope small,
  4257.         body.dark-mode.account-theme-scope .small,
  4258.         body.dark-mode.account-theme-scope .btn-outline-secondary,
  4259.         body.dark-mode.account-theme-scope .btn-outline-secondary i,
  4260.         html[data-theme=\"dark\"] body.account-theme-scope .text-muted,
  4261.         html[data-theme=\"dark\"] body.account-theme-scope .form-text,
  4262.         html[data-theme=\"dark\"] body.account-theme-scope .form-label,
  4263.         html[data-theme=\"dark\"] body.account-theme-scope small,
  4264.         html[data-theme=\"dark\"] body.account-theme-scope .small,
  4265.         html[data-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary,
  4266.         html[data-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary i,
  4267.         body[data-theme=\"dark\"].account-theme-scope .text-muted,
  4268.         body[data-theme=\"dark\"].account-theme-scope .form-text,
  4269.         body[data-theme=\"dark\"].account-theme-scope .form-label,
  4270.         body[data-theme=\"dark\"].account-theme-scope small,
  4271.         body[data-theme=\"dark\"].account-theme-scope .small,
  4272.         body[data-theme=\"dark\"].account-theme-scope .btn-outline-secondary,
  4273.         body[data-theme=\"dark\"].account-theme-scope .btn-outline-secondary i,
  4274.         html[data-bs-theme=\"dark\"] body.account-theme-scope .text-muted,
  4275.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-text,
  4276.         html[data-bs-theme=\"dark\"] body.account-theme-scope .form-label,
  4277.         html[data-bs-theme=\"dark\"] body.account-theme-scope small,
  4278.         html[data-bs-theme=\"dark\"] body.account-theme-scope .small,
  4279.         html[data-bs-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary,
  4280.         html[data-bs-theme=\"dark\"] body.account-theme-scope .btn-outline-secondary i,
  4281.         body[data-bs-theme=\"dark\"].account-theme-scope .text-muted,
  4282.         body[data-bs-theme=\"dark\"].account-theme-scope .form-text,
  4283.         body[data-bs-theme=\"dark\"].account-theme-scope .form-label,
  4284.         body[data-bs-theme=\"dark\"].account-theme-scope small,
  4285.         body[data-bs-theme=\"dark\"].account-theme-scope .small,
  4286.         body[data-bs-theme=\"dark\"].account-theme-scope .btn-outline-secondary,
  4287.         body[data-bs-theme=\"dark\"].account-theme-scope .btn-outline-secondary i {
  4288.             color: #aeb8c7 !important;
  4289.         }
  4290.         html.dark-mode body.account-theme-scope .empty-state-icon,
  4291.         body.dark-mode.account-theme-scope .empty-state-icon,
  4292.         html[data-theme=\"dark\"] body.account-theme-scope .empty-state-icon,
  4293.         body[data-theme=\"dark\"].account-theme-scope .empty-state-icon,
  4294.         html[data-bs-theme=\"dark\"] body.account-theme-scope .empty-state-icon,
  4295.         body[data-bs-theme=\"dark\"].account-theme-scope .empty-state-icon {
  4296.             color: #6b7280 !important;
  4297.         }
  4298.     </style>
  4299. </head>
  4300. <body {% if current_menu is defined and current_menu == \"listing\" %}id=\"category\"{% endif %} class=\"{% if is_account_route %}account-theme-scope{% endif %}\">
  4301. <!-- Start Header Area -->
  4302. <header class=\"header_area sticky-header\">
  4303.     <div class=\"main_menu\">
  4304.         <nav class=\"navbar navbar-expand-lg navbar-light main_box\">
  4305.             <div class=\"container\">
  4306.                 <!-- Brand and toggle get grouped for better mobile display -->
  4307.                 <a class=\"navbar-brand logo_h\" href=\"{{ path('ui_home') }}\"><img style=\"width: auto;height: 60px\" src=\"{{ asset('logo.png') }}\" alt=\"\"></a>
  4308.                 <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\"
  4309.                         aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">
  4310.                     <span class=\"icon-bar\"></span>
  4311.                     <span class=\"icon-bar\"></span>
  4312.                     <span class=\"icon-bar\"></span>
  4313.                 </button>
  4314.                 <!-- Collect the nav links, forms, and other content for toggling -->
  4315.                 <div class=\"collapse navbar-collapse offset\" id=\"navbarSupportedContent\">
  4316.                     <ul class=\"nav navbar-nav menu_nav ml-auto\">
  4317.                         <li class=\"nav-item {% if current_menu is defined and current_menu == \"home\" %}active{% endif %}\">
  4318.                             <a class=\"nav-link\" href=\"{{ path('ui_home') }}\">Accueil</a>
  4319.                         </li>
  4320.                         <li class=\"nav-item {% if current_menu is defined and current_menu == \"shops\" %}active{% endif %}\">
  4321.                             <a class=\"nav-link\" href=\"{{ path('ui_shops_list') }}\">Boutiques</a>
  4322.                         </li>
  4323.                         <li class=\"nav-item {% if current_menu is defined and current_menu == \"listing\" %}active{% endif %}\">
  4324.                             <a class=\"nav-link\" href=\"{{ path('ui_listing') }}\">Produits</a>
  4325.                         </li>
  4326.                         <li class=\"nav-item {% if current_menu is defined and current_menu == \"blog\" %}active{% endif %}\">
  4327.                             <a class=\"nav-link\" href=\"{{ path('ui_blog') }}\">Blog</a>
  4328.                         </li>
  4329.                         <li class=\"nav-item {% if current_menu is defined and current_menu == \"contact\" %}active{% endif %}\">
  4330.                             <a class=\"nav-link\" href=\"{{ path('ui_contact') }}\">Contact</a>
  4331.                         </li>
  4332.                     </ul>
  4333.                     <ul class=\"nav navbar-nav navbar-right\">
  4334.                         <li class=\"nav-item header-icons-item\">
  4335.                             <div class=\"navbar-icons-wrapper\">
  4336.                                 <a href=\"{{ path('ui_cart') }}\" class=\"cart {% if current_menu is defined and current_menu == \"cart\" %}active{% endif %}\" aria-label=\"Panier\">
  4337.                                     <span class=\"ti-bag\"></span>
  4338.                                 </a>
  4339.                                 <a href=\"{{ path('ui_product_comparison') }}\" class=\"comparison-icon {% if current_menu is defined and current_menu == \"comparison\" %}active{% endif %}\" title=\"Comparaison premium\" aria-label=\"Comparaison premium\">
  4340.                                     <span class=\"lnr lnr-sync\"></span>
  4341.                                     <span class=\"comparison-badge\" id=\"comparisonBadge\" data-comparison-badge style=\"display: none;\">0</span>
  4342.                                 </a>
  4343.                                 {% if app.user %}
  4344.                                 <a href=\"{{ path('notifications_list') }}\" class=\"notification-icon\" title=\"Notifications\" aria-label=\"Notifications\">
  4345.                                     <span class=\"ti-bell\"></span>
  4346.                                     <span class=\"notification-badge text-white\" id=\"notificationBadge\" style=\"display: none;color: white;\">0</span>
  4347.                                 </a>
  4348.                                 {% endif %}
  4349.                                 <button class=\"theme-toggle-btn\" type=\"button\" data-theme-toggle aria-label=\"Passer au mode sombre\" title=\"Passer au mode sombre\">
  4350.                                     <span class=\"ti-moon\" data-theme-icon></span>
  4351.                                 </button>
  4352.                                 <button class=\"search\" type=\"button\" aria-label=\"Recherche\">
  4353.                                     <span class=\"lnr lnr-magnifier\" id=\"search\"></span>
  4354.                                 </button>
  4355.                             </div>
  4356.                         </li>
  4357.                         <li class=\"nav-item header-account-item\">
  4358.                             {% if app.user %}
  4359.                                 <a class=\"btn btn-primary btn-account header-account-link text-white\" href=\"{{ path('ui_account_index') }}\">
  4360.                                     <i class=\"ti-user\"></i> Mon compte
  4361.                                 </a>
  4362.                             {% else %}
  4363.                                 <a class=\"btn btn-primary btn-account header-account-link text-white\" href=\"{{ path('ui_app_login') }}\">
  4364.                                     <i class=\"ti-lock\"></i>Se connecter
  4365.                                 </a>
  4366.                             {% endif %}
  4367.                         </li>
  4368.                     </ul>
  4369.                 </div>
  4370.             </div>
  4371.         </nav>
  4372.     </div>
  4373.     <div class=\"search_input\" id=\"search_input_box\">
  4374.         <div class=\"container\">
  4375.             <form class=\"d-flex justify-content-between\">
  4376.                 <input type=\"text\" class=\"form-control\" id=\"search_input\" placeholder=\"Search Here\">
  4377.                 <button type=\"submit\" class=\"btn\"></button>
  4378.                 <span class=\"lnr lnr-cross\" id=\"close_search\" title=\"Close Search\"></span>
  4379.             </form>
  4380.         </div>
  4381.     </div>
  4382. </header>
  4383. <!-- End Header Area -->
  4384. <!-- Flash Messages -->
  4385. <div class=\"container mt-3\" id=\"flash-messages-container\" style=\"position: relative; z-index: 1050;\">
  4386.     <div class=\"row\">
  4387.         <div class=\"col-12\">
  4388.             {% for message in app.flashes('success') %}
  4389.                 <div class=\"alert alert-success alert-dismissible fade show flash-message\" role=\"alert\">
  4390.                     <i class=\"fa fa-check-circle\"></i>
  4391.                     <strong>{{ message }}</strong>
  4392.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  4393.                 </div>
  4394.             {% endfor %}
  4395.             
  4396.             {% for message in app.flashes('error') %}
  4397.                 <div class=\"alert alert-danger alert-dismissible fade show flash-message\" role=\"alert\">
  4398.                     <i class=\"fa fa-exclamation-circle\"></i>
  4399.                     <strong>{{ message }}</strong>
  4400.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  4401.                 </div>
  4402.             {% endfor %}
  4403.             
  4404.             {% for message in app.flashes('warning') %}
  4405.                 <div class=\"alert alert-warning alert-dismissible fade show flash-message\" role=\"alert\">
  4406.                     <i class=\"fa fa-exclamation-triangle\"></i>
  4407.                     <strong>{{ message }}</strong>
  4408.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  4409.                 </div>
  4410.             {% endfor %}
  4411.             
  4412.             {% for message in app.flashes('info') %}
  4413.                 <div class=\"alert alert-info alert-dismissible fade show flash-message\" role=\"alert\">
  4414.                     <i class=\"fa fa-info-circle\"></i>
  4415.                     <strong>{{ message }}</strong>
  4416.                     <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
  4417.                 </div>
  4418.             {% endfor %}
  4419.         </div>
  4420.     </div>
  4421. </div>
  4422. <div id=\"comparisonTray\" class=\"comparison-tray\" aria-live=\"polite\">
  4423.     <div class=\"comparison-tray__header\">
  4424.         <div>
  4425.             <p class=\"comparison-tray__title\">Comparaison premium</p>
  4426.             <p class=\"comparison-tray__meta\" id=\"comparisonTrayMeta\">Aucun produit en comparaison</p>
  4427.         </div>
  4428.         <a href=\"{{ path('ui_product_comparison') }}\" class=\"comparison-tray__go\">Ouvrir</a>
  4429.     </div>
  4430.     <div class=\"comparison-tray__items\" id=\"comparisonTrayItems\"></div>
  4431.     <p class=\"comparison-tray__empty\" id=\"comparisonTrayEmpty\">Ajoute des produits d'une meme categorie pour obtenir une comparaison ultra pertinente.</p>
  4432.     <div class=\"comparison-tray__actions\">
  4433.         <a href=\"{{ path('ui_product_comparison') }}\" class=\"comparison-tray__go\">Comparer maintenant</a>
  4434.         <button type=\"button\" class=\"comparison-tray__clear\" id=\"comparisonTrayClear\">Vider</button>
  4435.     </div>
  4436. </div>
  4437. {% block body %}{% endblock %}
  4438. <!-- start footer Area -->
  4439. <footer class=\"footer-area section_gap\">
  4440.     <div class=\"footer-pattern\"></div>
  4441.     <div class=\"container\">
  4442.         <div class=\"row\">
  4443.             <div class=\"col-lg-3 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  4444.                 <div class=\"single-footer-widget\">
  4445.                     <div class=\"footer-logo mb-3\">
  4446.                         <h4 class=\"footer-brand\">MaketOu</h4>
  4447.                     </div>
  4448.                     <p class=\"footer-description\">
  4449.                         MaketOu est la première marketplace haïtienne qui connecte les acheteurs et les vendeurs. 
  4450.                         Nous offrons une plateforme sécurisée et moderne pour le commerce en ligne en Haïti.
  4451.                     </p>
  4452.                     <div class=\"footer-social mt-3\">
  4453.                         <h6 class=\"mb-2\">Suivez-nous</h6>
  4454.                         <div class=\"footer-social-icons\">
  4455.                             <a href=\"#\" class=\"social-icon\" aria-label=\"Facebook\" title=\"Facebook\">
  4456.                                 <i class=\"fa fa-facebook\"></i>
  4457.                             </a>
  4458.                             <a href=\"#\" class=\"social-icon\" aria-label=\"Twitter\" title=\"Twitter\">
  4459.                                 <i class=\"fa fa-twitter\"></i>
  4460.                             </a>
  4461.                             <a href=\"#\" class=\"social-icon\" aria-label=\"Instagram\" title=\"Instagram\">
  4462.                                 <i class=\"fa fa-instagram\"></i>
  4463.                             </a>
  4464.                             <a href=\"#\" class=\"social-icon\" aria-label=\"LinkedIn\" title=\"LinkedIn\">
  4465.                                 <i class=\"fa fa-linkedin\"></i>
  4466.                             </a>
  4467.                         </div>
  4468.                     </div>
  4469.                 </div>
  4470.             </div>
  4471.             <div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  4472.                 <div class=\"single-footer-widget\">
  4473.                     <h6 class=\"footer-widget-title\">Liens rapides</h6>
  4474.                     <ul class=\"footer-list\">
  4475.                         <li><a href=\"{{ path('ui_home') }}\"><i class=\"fa fa-angle-right me-2\"></i>Accueil</a></li>
  4476.                         <li><a href=\"{{ path('ui_listing') }}\"><i class=\"fa fa-angle-right me-2\"></i>Produits</a></li>
  4477.                         <li><a href=\"{{ path('ui_shops_list') }}\"><i class=\"fa fa-angle-right me-2\"></i>Boutiques</a></li>
  4478.                         {% if app.user %}
  4479.                             <li><a href=\"{{ path('ui_account_index') }}\"><i class=\"fa fa-angle-right me-2\"></i>Mon compte</a></li>
  4480.                         {% else %}
  4481.                             <li><a href=\"{{ path('ui_app_login') }}\"><i class=\"fa fa-angle-right me-2\"></i>Se connecter</a></li>
  4482.                             <li><a href=\"{{ path('ui_app_register') }}\"><i class=\"fa fa-angle-right me-2\"></i>S'inscrire</a></li>
  4483.                         {% endif %}
  4484.                     </ul>
  4485.                 </div>
  4486.             </div>
  4487.             <div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  4488.                 <div class=\"single-footer-widget\">
  4489.                     <h6 class=\"footer-widget-title\">Pour les vendeurs</h6>
  4490.                     <ul class=\"footer-list\">
  4491.                         <li><a href=\"{{ path('seller_index') }}\"><i class=\"fa fa-angle-right me-2\"></i>Ouvrir une boutique</a></li>
  4492.                         <li><a href=\"{{ path('seller_help_how_to_sell') }}\"><i class=\"fa fa-angle-right me-2\"></i>Comment vendre</a></li>
  4493.                         <li><a href=\"{{ path('seller_help_pricing') }}\"><i class=\"fa fa-angle-right me-2\"></i>Tarifs</a></li>
  4494.                         <li><a href=\"{{ path('seller_help_support') }}\"><i class=\"fa fa-angle-right me-2\"></i>Support vendeur</a></li>
  4495.                     </ul>
  4496.                 </div>
  4497.             </div>
  4498.             <div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
  4499.                 <div class=\"single-footer-widget\">
  4500.                     <h6 class=\"footer-widget-title\">Support</h6>
  4501.                     <ul class=\"footer-list\">
  4502.                         <li><a href=\"{{ path('ui_help') }}\"><i class=\"fa fa-angle-right me-2\"></i> Centre d'Aide</a></li>
  4503.                         <li><a href=\"{{ path('ui_contact') }}\"><i class=\"fa fa-angle-right me-2\"></i> Contactez-nous</a></li>
  4504.                         <li><a href=\"{{ path('ui_faq') }}\"><i class=\"fa fa-angle-right me-2\"></i> FAQ</a></li>
  4505.                         <li><a href=\"{{ path('ui_privacy') }}\"><i class=\"fa fa-angle-right me-2\"></i> Politique de Confidentialité</a></li>
  4506.                         <li><a href=\"{{ path('ui_terms') }}\"><i class=\"fa fa-angle-right me-2\"></i> Conditions d'Utilisation</a></li>
  4507.                     </ul>
  4508.                 </div>
  4509.             </div>
  4510.             <div class=\"col-lg-3 col-md-6 col-sm-6\">
  4511.                 <div class=\"single-footer-widget\">
  4512.                     <h6 class=\"footer-widget-title\">Newsletter</h6>
  4513.                     <p class=\"footer-newsletter-text\">Restez informé des dernières nouveautés</p>
  4514.                     <div class=\"footer-newsletter-wrapper\" id=\"mc_embed_signup\">
  4515.                         <form action=\"{{ path('ui_newsletter_subscribe') }}\" method=\"post\" class=\"footer-newsletter-form\">
  4516.                             <div class=\"newsletter-input-group\">
  4517.                                 <i class=\"fa fa-envelope newsletter-icon\"></i>
  4518.                                 <input class=\"form-control newsletter-input\" name=\"email\" placeholder=\"Votre email\" required type=\"email\">
  4519.                                 <button type=\"submit\" class=\"newsletter-btn\" aria-label=\"S'abonner\">
  4520.                                     <span class=\"newsletter-btn-icon\">
  4521.                                         <i class=\"fa fa-paper-plane\" aria-hidden=\"true\"></i>
  4522.                                     </span>
  4523.                                     <span class=\"newsletter-btn-loader\" style=\"display: none;\">
  4524.                                         <i class=\"fa fa-spinner fa-spin\" aria-hidden=\"true\"></i>
  4525.                                     </span>
  4526.                                 </button>
  4527.                             </div>
  4528.                         </form>
  4529.                     </div>
  4530.                     <div class=\"footer-trust-badges mt-3\">
  4531.                         <div class=\"trust-item\">
  4532.                             <i class=\"fa fa-shield\"></i>
  4533.                             <span>Paiement sécurisé</span>
  4534.                         </div>
  4535.                         <div class=\"trust-item\">
  4536.                             <i class=\"fa fa-truck\"></i>
  4537.                             <span>Livraison rapide</span>
  4538.                         </div>
  4539.                     </div>
  4540.                 </div>
  4541.             </div>
  4542.         </div>
  4543.         <div class=\"footer-divider\"></div>
  4544.         <div class=\"footer-bottom d-flex justify-content-center align-items-center flex-wrap\">
  4545.             <p class=\"footer-text m-0\">
  4546.                 Copyright &copy;<script>document.write(new Date().getFullYear());</script>
  4547.                 Tous droits réservés | Ce site a été fait avec <i class=\"fa fa-heart-o\" aria-hidden=\"true\" style=\"color: #dc3545;\"></i> par <a
  4548.                         href=\"https://tech.foulgor.com\" target=\"_blank\" style=\"color: #ffa200;\">Foulgor Tech</a>
  4549.             </p>
  4550.         </div>
  4551.     </div>
  4552. </footer>
  4553. <style>
  4554. /* ============================================
  4555.    FOOTER MODERNE - Design amélioré
  4556.    ============================================ */
  4557. .footer-area {
  4558.     background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
  4559.     position: relative;
  4560.     overflow: hidden;
  4561.     padding: 50px 0 20px;
  4562. }
  4563. .footer-pattern {
  4564.     position: absolute;
  4565.     top: 0;
  4566.     left: 0;
  4567.     right: 0;
  4568.     bottom: 0;
  4569.     background-image: 
  4570.         radial-gradient(circle at 20% 50%, rgba(255, 162, 0, 0.1) 0%, transparent 50%),
  4571.         radial-gradient(circle at 80% 80%, rgba(255, 162, 0, 0.08) 0%, transparent 50%);
  4572.     pointer-events: none;
  4573. }
  4574. .footer-area .container {
  4575.     position: relative;
  4576.     z-index: 1;
  4577. }
  4578. /* Widgets */
  4579. .single-footer-widget {
  4580.     color: rgba(255, 255, 255, 0.9);
  4581. }
  4582. .footer-brand {
  4583.     font-size: 1.6rem;
  4584.     font-weight: 700;
  4585.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  4586.     -webkit-background-clip: text;
  4587.     -webkit-text-fill-color: transparent;
  4588.     background-clip: text;
  4589.     margin-bottom: 12px;
  4590.     display: inline-block;
  4591. }
  4592. .footer-widget-title {
  4593.     color: #fff;
  4594.     font-size: 1rem;
  4595.     font-weight: 600;
  4596.     margin-bottom: 18px;
  4597.     position: relative;
  4598.     padding-bottom: 8px;
  4599. }
  4600. .footer-widget-title::after {
  4601.     content: '';
  4602.     position: absolute;
  4603.     bottom: 0;
  4604.     left: 0;
  4605.     width: 40px;
  4606.     height: 3px;
  4607.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  4608.     border-radius: 2px;
  4609. }
  4610. .footer-description {
  4611.     color: rgba(255, 255, 255, 0.7);
  4612.     line-height: 1.6;
  4613.     font-size: 0.9rem;
  4614.     margin-bottom: 0;
  4615. }
  4616. /* Liste de liens */
  4617. .footer-list {
  4618.     list-style: none;
  4619.     padding: 0;
  4620.     margin: 0;
  4621. }
  4622. .footer-list li {
  4623.     margin-bottom: 10px;
  4624. }
  4625. .footer-list li a {
  4626.     color: rgba(255, 255, 255, 0.7);
  4627.     text-decoration: none;
  4628.     transition: all 0.3s ease;
  4629.     font-size: 0.9rem;
  4630.     display: inline-flex;
  4631.     align-items: center;
  4632. }
  4633. .footer-list li a i {
  4634.     font-size: 0.8rem;
  4635.     opacity: 0.6;
  4636.     transition: all 0.3s ease;
  4637. }
  4638. .footer-list li a:hover {
  4639.     color: #ffa200;
  4640.     transform: translateX(5px);
  4641. }
  4642. .footer-list li a:hover i {
  4643.     opacity: 1;
  4644.     color: #ffa200;
  4645. }
  4646. /* Newsletter */
  4647. .footer-newsletter-text {
  4648.     color: rgba(255, 255, 255, 0.7);
  4649.     font-size: 0.85rem;
  4650.     margin-bottom: 15px;
  4651.     line-height: 1.5;
  4652. }
  4653. .footer-newsletter-wrapper {
  4654.     margin-bottom: 15px;
  4655. }
  4656. .newsletter-input-group {
  4657.     display: flex;
  4658.     align-items: center;
  4659.     background: rgba(255, 255, 255, 0.08);
  4660.     border-radius: 30px;
  4661.     padding: 4px 4px 4px 15px;
  4662.     backdrop-filter: blur(10px);
  4663.     border: 1px solid rgba(255, 255, 255, 0.15);
  4664.     transition: all 0.3s ease;
  4665.     gap: 8px;
  4666. }
  4667. .newsletter-input-group:focus-within {
  4668.     background: rgba(255, 255, 255, 0.12);
  4669.     border-color: rgba(255, 162, 0, 0.6);
  4670.     box-shadow: 0 0 0 2px rgba(255, 162, 0, 0.15);
  4671. }
  4672. .newsletter-icon {
  4673.     color: rgba(255, 255, 255, 0.5);
  4674.     font-size: 0.9rem;
  4675.     flex-shrink: 0;
  4676. }
  4677. .newsletter-input-group:focus-within .newsletter-icon {
  4678.     color: #ffa200;
  4679. }
  4680. .newsletter-input {
  4681.     flex: 1;
  4682.     background: transparent;
  4683.     border: none;
  4684.     color: #fff;
  4685.     padding: 10px 8px;
  4686.     font-size: 0.9rem;
  4687.     min-width: 0;
  4688. }
  4689. .newsletter-input::placeholder {
  4690.     color: rgba(255, 255, 255, 0.4);
  4691.     font-size: 0.85rem;
  4692. }
  4693. .newsletter-input:focus {
  4694.     outline: none;
  4695.     box-shadow: none;
  4696. }
  4697. .newsletter-btn {
  4698.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  4699.     border: none;
  4700.     color: white;
  4701.     width: 42px;
  4702.     height: 42px;
  4703.     min-width: 42px;
  4704.     min-height: 42px;
  4705.     border-radius: 50%;
  4706.     display: flex;
  4707.     align-items: center;
  4708.     justify-content: center;
  4709.     cursor: pointer;
  4710.     transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  4711.     flex-shrink: 0;
  4712.     box-shadow: 0 4px 15px rgba(255, 162, 0, 0.4), 
  4713.                 0 0 0 0 rgba(255, 162, 0, 0.4);
  4714.     font-size: 0.9rem;
  4715.     position: relative;
  4716.     overflow: hidden;
  4717. }
  4718. .newsletter-btn::before {
  4719.     content: '';
  4720.     position: absolute;
  4721.     top: 50%;
  4722.     left: 50%;
  4723.     width: 0;
  4724.     height: 0;
  4725.     border-radius: 50%;
  4726.     background: rgba(255, 255, 255, 0.3);
  4727.     transform: translate(-50%, -50%);
  4728.     transition: width 0.6s ease, height 0.6s ease;
  4729. }
  4730. .newsletter-btn:hover::before {
  4731.     width: 100%;
  4732.     height: 100%;
  4733. }
  4734. .newsletter-btn:hover {
  4735.     transform: translateX(3px) scale(1.05);
  4736.     box-shadow: 0 6px 20px rgba(255, 162, 0, 0.5),
  4737.                 0 0 0 8px rgba(255, 162, 0, 0.1);
  4738.     background: linear-gradient(135deg, #e8910a 0%, #ffa200 100%);
  4739. }
  4740. .newsletter-btn:active {
  4741.     transform: translateX(3px) scale(0.98);
  4742.     box-shadow: 0 3px 10px rgba(255, 162, 0, 0.4);
  4743. }
  4744. .newsletter-btn:focus {
  4745.     outline: none;
  4746.     box-shadow: 0 4px 15px rgba(255, 162, 0, 0.4),
  4747.                 0 0 0 3px rgba(255, 162, 0, 0.3);
  4748. }
  4749. .newsletter-btn-icon,
  4750. .newsletter-btn-loader {
  4751.     position: relative;
  4752.     z-index: 2;
  4753.     display: flex;
  4754.     align-items: center;
  4755.     justify-content: center;
  4756.     transition: all 0.3s ease;
  4757. }
  4758. .newsletter-btn:hover .newsletter-btn-icon {
  4759.     transform: translateX(2px) rotate(-10deg);
  4760. }
  4761. .newsletter-btn.loading .newsletter-btn-icon {
  4762.     opacity: 0;
  4763.     transform: scale(0);
  4764. }
  4765. .newsletter-btn.loading .newsletter-btn-loader {
  4766.     display: flex !important;
  4767. }
  4768. .newsletter-btn.success {
  4769.     background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  4770.     box-shadow: 0 4px 15px rgba(40, 167, 69, 0.4);
  4771. }
  4772. .newsletter-btn.success .newsletter-btn-icon i::before {
  4773.     content: \"\\f00c\";
  4774. }
  4775. /* Trust badges */
  4776. .footer-trust-badges {
  4777.     display: flex;
  4778.     flex-direction: row;
  4779.     gap: 15px;
  4780.     flex-wrap: wrap;
  4781. }
  4782. .trust-item {
  4783.     display: flex;
  4784.     align-items: center;
  4785.     gap: 6px;
  4786.     color: rgba(255, 255, 255, 0.6);
  4787.     font-size: 0.8rem;
  4788. }
  4789. .trust-item i {
  4790.     color: #ffa200;
  4791.     font-size: 0.9rem;
  4792. }
  4793. /* Social icons */
  4794. .footer-social {
  4795.     margin-top: 0 !important;
  4796.     position: relative !important;
  4797.     width: 100% !important;
  4798.     clear: both !important;
  4799.     float: none !important;
  4800. }
  4801. .footer-social h6 {
  4802.     color: #fff;
  4803.     font-size: 0.95rem;
  4804.     font-weight: 600;
  4805.     margin-bottom: 12px !important;
  4806.     display: block !important;
  4807.     width: 100% !important;
  4808.     position: relative !important;
  4809.     clear: both !important;
  4810.     float: none !important;
  4811. }
  4812. .footer-social-icons {
  4813.     display: flex !important;
  4814.     gap: 12px !important;
  4815.     flex-wrap: wrap !important;
  4816.     align-items: center !important;
  4817.     justify-content: flex-start !important;
  4818.     width: 100% !important;
  4819.     position: relative !important;
  4820.     clear: both !important;
  4821.     float: none !important;
  4822.     margin: 0 !important;
  4823.     padding: 0 !important;
  4824. }
  4825. .social-icon {
  4826.     width: 38px !important;
  4827.     height: 38px !important;
  4828.     min-width: 38px !important;
  4829.     min-height: 38px !important;
  4830.     display: inline-flex !important;
  4831.     align-items: center !important;
  4832.     justify-content: center !important;
  4833.     background: rgba(255, 255, 255, 0.1) !important;
  4834.     border-radius: 50% !important;
  4835.     color: rgba(255, 255, 255, 0.8) !important;
  4836.     text-decoration: none !important;
  4837.     transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
  4838.     font-size: 16px !important;
  4839.     line-height: 1 !important;
  4840.     backdrop-filter: blur(10px) !important;
  4841.     border: 1px solid rgba(255, 255, 255, 0.1) !important;
  4842.     flex-shrink: 0 !important;
  4843.     position: relative !important;
  4844.     float: none !important;
  4845.     margin: 0 !important;
  4846.     padding: 0 !important;
  4847.     vertical-align: middle !important;
  4848. }
  4849. .social-icon i {
  4850.     font-size: 16px !important;
  4851.     line-height: 1 !important;
  4852.     display: inline-block !important;
  4853.     transition: transform 0.3s ease !important;
  4854.     position: relative !important;
  4855.     z-index: 1 !important;
  4856.     margin: 0 !important;
  4857.     padding: 0 !important;
  4858. }
  4859. .social-icon:hover {
  4860.     background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%) !important;
  4861.     transform: translateY(-5px) scale(1.1) !important;
  4862.     color: white !important;
  4863.     border-color: transparent !important;
  4864.     box-shadow: 0 8px 20px rgba(255, 162, 0, 0.4) !important;
  4865. }
  4866. .social-icon:hover i {
  4867.     transform: scale(1.1) !important;
  4868. }
  4869. /* Footer divider */
  4870. .footer-divider {
  4871.     height: 1px;
  4872.     background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
  4873.     margin: 30px 0 20px;
  4874. }
  4875. /* Footer bottom */
  4876. .footer-bottom {
  4877.     padding-top: 15px;
  4878. }
  4879. .footer-text {
  4880.     color: rgba(255, 255, 255, 0.6);
  4881.     font-size: 0.9rem;
  4882.     margin: 0;
  4883.     text-align: center;
  4884. }
  4885. /* Responsive */
  4886. @media(max-width: 991.98px) {
  4887.     .footer-area {
  4888.         padding: 40px 0 20px;
  4889.     }
  4890.     
  4891.     .single-footer-widget {
  4892.         margin-bottom: 30px;
  4893.     }
  4894.     
  4895.     .footer-social {
  4896.         margin-top: 15px;
  4897.     }
  4898. }
  4899. @media(max-width: 767.98px) {
  4900.     .footer-area {
  4901.         padding: 35px 0 18px;
  4902.     }
  4903.     
  4904.     .footer-brand {
  4905.         font-size: 1.4rem;
  4906.     }
  4907.     
  4908.     .footer-widget-title {
  4909.         font-size: 0.95rem;
  4910.     }
  4911.     
  4912.     
  4913.     .newsletter-input-group {
  4914.         padding: 3px 3px 3px 12px;
  4915.     }
  4916.     
  4917.     .newsletter-input {
  4918.         padding: 8px 6px;
  4919.         font-size: 0.85rem;
  4920.     }
  4921.     
  4922.     .newsletter-btn {
  4923.         width: 38px;
  4924.         height: 38px;
  4925.         min-width: 38px;
  4926.         min-height: 38px;
  4927.         font-size: 0.85rem;
  4928.     }
  4929.     
  4930.     .footer-trust-badges {
  4931.         flex-direction: row;
  4932.         flex-wrap: wrap;
  4933.         justify-content: flex-start;
  4934.         gap: 12px;
  4935.     }
  4936. }
  4937. @media(max-width: 575.98px) {
  4938.     .footer-area {
  4939.         padding: 40px 0 20px;
  4940.     }
  4941.     
  4942.     .footer-brand {
  4943.         font-size: 1.3rem;
  4944.     }
  4945.     
  4946.     .social-icon {
  4947.         width: 38px;
  4948.         height: 38px;
  4949.         font-size: 16px;
  4950.     }
  4951.     
  4952.     .social-icon i {
  4953.         font-size: 16px;
  4954.     }
  4955. }
  4956. </style>
  4957. <script>
  4958. // Debounced autocomplete for header search
  4959. (function(){
  4960.   const input = document.getElementById('search_input');
  4961.   const box = document.getElementById('search_suggestions');
  4962.   if (!input || !box) return;
  4963.   let t = null;
  4964.   input.addEventListener('input', function(){
  4965.     const q = input.value.trim();
  4966.     clearTimeout(t);
  4967.     if (q.length === 0) { box.style.display = 'none'; box.innerHTML=''; return; }
  4968.     t = setTimeout(() => fetchSuggestions(q), 200);
  4969.   });
  4970.   function fetchSuggestions(q){
  4971.     const url = '{{ path('ui_api_search_suggest') }}' + '?q=' + encodeURIComponent(q);
  4972.     fetch(url).then(r => r.json()).then(data => {
  4973.       if (!data.success) { box.style.display='none'; return; }
  4974.       renderSuggestions(data.results || []);
  4975.     }).catch(() => { box.style.display='none'; });
  4976.   }
  4977.   function renderSuggestions(items){
  4978.     if (!items.length) { box.style.display='none'; box.innerHTML=''; return; }
  4979.     box.innerHTML = items.map(it => suggestionItem(it)).join('');
  4980.     box.style.display = 'block';
  4981.   }
  4982.   function suggestionItem(it){
  4983.     const icon = it.type === 'product' ? 'ti-package' : (it.type === 'shop' ? 'ti-briefcase' : (it.type === 'category' ? 'ti-layers' : 'ti-tag'));
  4984.     return '<a href=\"' + it.url + '\" class=\"list-group-item list-group-item-action d-flex align-items-center\">'
  4985.          + '<i class=\"' + icon + ' me-4\"></i>'
  4986.          + '<span class=\"ml-2\">' + escapeHtml(it.label) + '</span>'
  4987.          + '<span class=\"badge bg-light text-dark ms-auto\">' + it.type + '</span>'
  4988.          + '</a>';
  4989.   }
  4990.   function escapeHtml(s){
  4991.     return s.replace(/[&<>\"]+/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c]));
  4992.   }
  4993.   document.addEventListener('click', function(e){
  4994.     if (!box.contains(e.target) && e.target !== input) {
  4995.       box.style.display='none';
  4996.     }
  4997.   });
  4998.   window.handleSearchSubmit = function(e){
  4999.     if (e) e.preventDefault();
  5000.     const first = box.querySelector('a');
  5001.     if (first) { window.location.href = first.getAttribute('href'); return false; }
  5002.     // fallback to listing page search by name
  5003.     const q = input.value.trim();
  5004.     if (q.length) {
  5005.       window.location.href = '{{ path('ui_listing') }}' + '?q=' + encodeURIComponent(q);
  5006.     }
  5007.     return false;
  5008.   }
  5009. })();
  5010. // Gestion des mega-menus avec clic (comme la barre de recherche)
  5011. document.addEventListener('DOMContentLoaded', function() {
  5012.     const dropdownItems = document.querySelectorAll('.nav-item.dropdown');
  5013.     
  5014.     dropdownItems.forEach(function(item) {
  5015.         const dropdownToggle = item.querySelector('.dropdown-toggle');
  5016.         const dropdownMenu = item.querySelector('.mega-menu');
  5017.         
  5018.         if (!dropdownToggle || !dropdownMenu) return;
  5019.         
  5020.         // Fermer les autres menus quand on ouvre un nouveau
  5021.         function closeAllMenus() {
  5022.             dropdownItems.forEach(function(otherItem) {
  5023.                 const otherMenu = otherItem.querySelector('.mega-menu');
  5024.                 if (otherMenu && otherMenu !== dropdownMenu) {
  5025.                     \$(otherMenu).slideUp(300);
  5026.                     otherMenu.classList.remove('active');
  5027.                 }
  5028.             });
  5029.         }
  5030.         
  5031.         // Toggle au clic (comme la barre de recherche)
  5032.         dropdownToggle.addEventListener('click', function(e) {
  5033.             e.preventDefault();
  5034.             e.stopPropagation();
  5035.             
  5036.             closeAllMenus();
  5037.             
  5038.             if (dropdownMenu.classList.contains('active')) {
  5039.                 // Fermer le menu
  5040.                 dropdownMenu.style.opacity = '0';
  5041.                 dropdownMenu.style.visibility = 'hidden';
  5042.                 dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
  5043.                 setTimeout(() => {
  5044.                     dropdownMenu.classList.remove('active');
  5045.                     dropdownMenu.style.display = 'none';
  5046.                 }, 300);
  5047.             } else {
  5048.                 // Ouvrir le menu
  5049.                 dropdownMenu.style.display = 'block';
  5050.                 setTimeout(() => {
  5051.                     dropdownMenu.classList.add('active');
  5052.             dropdownMenu.style.opacity = '1';
  5053.             dropdownMenu.style.visibility = 'visible';
  5054.                     dropdownMenu.style.transform = 'translateX(-50%) translateY(0)';
  5055.                 }, 10);
  5056.             }
  5057.         });
  5058.         
  5059.         // Fermer au clic en dehors
  5060.         document.addEventListener('click', function(e) {
  5061.             if (!item.contains(e.target) && dropdownMenu.classList.contains('active')) {
  5062.                 dropdownMenu.style.opacity = '0';
  5063.                 dropdownMenu.style.visibility = 'hidden';
  5064.                 dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
  5065.                 setTimeout(() => {
  5066.                     dropdownMenu.classList.remove('active');
  5067.                     dropdownMenu.style.display = 'none';
  5068.                 }, 300);
  5069.             }
  5070.         });
  5071.         
  5072.         // Animation des éléments du menu
  5073.         const menuItems = dropdownMenu.querySelectorAll('.dropdown-item a');
  5074.         menuItems.forEach(function(menuItem, index) {
  5075.             menuItem.style.animationDelay = (index * 0.05) + 's';
  5076.         });
  5077.     });
  5078.     
  5079.     // Gestion des clics sur mobile
  5080.     if (window.innerWidth <= 768) {
  5081.         dropdownItems.forEach(function(item) {
  5082.             const dropdownToggle = item.querySelector('.dropdown-toggle');
  5083.             const dropdownMenu = item.querySelector('.mega-menu');
  5084.             
  5085.             dropdownToggle.addEventListener('click', function(e) {
  5086.                 e.preventDefault();
  5087.                 
  5088.                 // Fermer tous les autres menus
  5089.                 dropdownItems.forEach(function(otherItem) {
  5090.                     if (otherItem !== item) {
  5091.                         const otherMenu = otherItem.querySelector('.mega-menu');
  5092.                         otherMenu.style.opacity = '0';
  5093.                         otherMenu.style.visibility = 'hidden';
  5094.                         otherMenu.style.transform = 'translateY(-10px)';
  5095.                     }
  5096.                 });
  5097.                 
  5098.                 // Toggle le menu actuel
  5099.                 if (dropdownMenu.style.opacity === '1') {
  5100.                     dropdownMenu.style.opacity = '0';
  5101.                     dropdownMenu.style.visibility = 'hidden';
  5102.                     dropdownMenu.style.transform = 'translateY(-10px)';
  5103.                 } else {
  5104.                     dropdownMenu.style.opacity = '1';
  5105.                     dropdownMenu.style.visibility = 'visible';
  5106.                     dropdownMenu.style.transform = 'translateY(0)';
  5107.                 }
  5108.             });
  5109.         });
  5110.     }
  5111.     
  5112.     // Fermer les menus quand on clique ailleurs
  5113.     document.addEventListener('click', function(e) {
  5114.         if (!e.target.closest('.nav-item.dropdown')) {
  5115.             dropdownItems.forEach(function(item) {
  5116.                 const dropdownMenu = item.querySelector('.mega-menu');
  5117.                 dropdownMenu.style.opacity = '0';
  5118.                 dropdownMenu.style.visibility = 'hidden';
  5119.                 dropdownMenu.style.transform = 'translateY(-10px)';
  5120.             });
  5121.         }
  5122.     });
  5123. });
  5124. </script>
  5125. <!-- End footer Area -->
  5126. <script src=\"{{ asset('ui/js/vendor/jquery-2.2.4.min.js') }}\"></script>
  5127. <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>
  5128. <script>
  5129.     // Initialiser le collapse Bootstrap 5 pour le menu hamburger après chargement de Bootstrap
  5130.     document.addEventListener('DOMContentLoaded', function() {
  5131.         // Attendre que Bootstrap soit complètement chargé
  5132.         if (typeof bootstrap !== 'undefined') {
  5133.             const navbarToggler = document.querySelector('.navbar-toggler');
  5134.             const navbarCollapse = document.getElementById('navbarSupportedContent');
  5135.             
  5136.             if (navbarToggler && navbarCollapse) {
  5137.                 // Bootstrap 5 devrait gérer automatiquement avec data-bs-toggle
  5138.                 // Mais on s'assure que ça fonctionne en écoutant les événements
  5139.                 navbarCollapse.addEventListener('show.bs.collapse', function() {
  5140.                     navbarToggler.setAttribute('aria-expanded', 'true');
  5141.                     navbarToggler.classList.add('active');
  5142.                 });
  5143.                 
  5144.                 navbarCollapse.addEventListener('hide.bs.collapse', function() {
  5145.                     navbarToggler.setAttribute('aria-expanded', 'false');
  5146.                     navbarToggler.classList.remove('active');
  5147.                 });
  5148.             }
  5149.         }
  5150.     });
  5151. </script>
  5152. <script src=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.js\"></script>
  5153. <script src=\"{{ asset('ui/js/jquery.ajaxchimp.min.js') }}\"></script>
  5154. <script src=\"{{ asset('ui/js/jquery.nice-select.min.js') }}\"></script>
  5155. <script src=\"{{ asset('ui/js/jquery.sticky.js') }}\"></script>
  5156. <script src=\"{{ asset('ui/js/nouislider.min.js') }}\"></script>
  5157. <script src=\"{{ asset('ui/js/countdown.js') }}\"></script>
  5158. <script src=\"{{ asset('ui/js/jquery.magnific-popup.min.js') }}\"></script>
  5159. <script src=\"{{ asset('ui/js/owl.carousel.min.js') }}\"></script>
  5160. <script src=\"https://maps.googleapis.com/maps/api/js?key=AIzaSyCjCGmQ0Uq4exrzdcL6rvxywDDOvfAu6eE\"></script>
  5161. <script src=\"{{ asset('ui/js/gmaps.min.js') }}\"></script>
  5162. <script src=\"{{ asset('ui/js/main.js') }}\"></script>
  5163. <script>
  5164.     window.maketouConfig = {
  5165.         themeStorageKey: 'maketou-theme',
  5166.         comparison: {
  5167.             assetBase: '{{ asset('')|e('js') }}',
  5168.             addUrlTemplate: '{{ path('ui_api_comparison_add', {'id': '__ID__'})|e('js') }}',
  5169.             removeUrlTemplate: '{{ path('ui_api_comparison_remove', {'id': '__ID__'})|e('js') }}',
  5170.             clearUrl: '{{ path('ui_api_comparison_clear')|e('js') }}',
  5171.             countUrl: '{{ path('ui_api_comparison_count')|e('js') }}',
  5172.             dataUrl: '{{ path('ui_api_comparison_data')|e('js') }}',
  5173.             pageUrl: '{{ path('ui_product_comparison')|e('js') }}'
  5174.         }
  5175.     };
  5176. </script>
  5177. <script src=\"{{ asset('ui/js/theme-public.js') }}\"></script>
  5178. <script src=\"{{ asset('ui/js/comparison-v2.js') }}\"></script>
  5179.     {{ encore_entry_script_tags('app') }}
  5180.     
  5181.     <!-- PWA Service Worker Registration -->
  5182.     <script>
  5183.         // Enregistrement du Service Worker
  5184.         if ('serviceWorker' in navigator) {
  5185.             window.addEventListener('load', () => {
  5186.                 navigator.serviceWorker.register('{{ asset('sw.js') }}')
  5187.                     .then((registration) => {
  5188.                         console.log('Service Worker enregistré avec succès:', registration.scope);
  5189.                         
  5190.                         // Vérifie les mises à jour du service worker
  5191.                         registration.addEventListener('updatefound', () => {
  5192.                             const newWorker = registration.installing;
  5193.                             newWorker.addEventListener('statechange', () => {
  5194.                                 if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
  5195.                                     // Nouveau service worker disponible
  5196.                                     if (confirm('Une nouvelle version de MaketOu est disponible. Voulez-vous l\\'installer maintenant ?')) {
  5197.                                         newWorker.postMessage({ type: 'SKIP_WAITING' });
  5198.                                         window.location.reload();
  5199.                                     }
  5200.                                 }
  5201.                             });
  5202.                         });
  5203.                     })
  5204.                     .catch((error) => {
  5205.                         console.log('Échec de l\\'enregistrement du Service Worker:', error);
  5206.                     });
  5207.                 
  5208.                 // Écoute les messages du service worker
  5209.                 navigator.serviceWorker.addEventListener('message', (event) => {
  5210.                     console.log('Message du Service Worker:', event.data);
  5211.                 });
  5212.             });
  5213.         }
  5214.     </script>
  5215.     
  5216.     <!-- PWA Install Script -->
  5217.     <script src=\"{{ asset('js/pwa-install.js') }}\"></script>
  5218.     
  5219.     <script>
  5220.     // Charger les compteurs au chargement de la page
  5221.     document.addEventListener('DOMContentLoaded', function() {
  5222.         {% if app.user %}
  5223.             loadNotificationCount();
  5224.             // Délai pour s'assurer que la session est bien établie après connexion
  5225.             setTimeout(function() {
  5226.                 loadComparisonCount();
  5227.             }, 500);
  5228.         {% endif %}
  5229.         
  5230.         // Gérer le bouton de recherche mobile
  5231.         const searchMobileBtn = document.getElementById('searchMobileBtn');
  5232.         if (searchMobileBtn) {
  5233.             searchMobileBtn.addEventListener('click', function(e) {
  5234.                 e.preventDefault();
  5235.                 // Utiliser le même comportement que le bouton desktop
  5236.                 const searchBox = document.getElementById('search_input_box');
  5237.                 if (searchBox) {
  5238.                     searchBox.style.display = 'block';
  5239.                     const searchInput = document.getElementById('search_input');
  5240.                     if (searchInput) {
  5241.                         setTimeout(() => searchInput.focus(), 100);
  5242.                     }
  5243.                 }
  5244.             });
  5245.         }
  5246.     });
  5247.     
  5248.     function loadNotificationCount() {
  5249.         {% if app.user %}
  5250.         fetch('{{ path(\"api_notifications_count\") }}')
  5251.             .then(response => {
  5252.                 if (!response.ok) {
  5253.                     throw new Error('Erreur HTTP: ' + response.status);
  5254.                 }
  5255.                 return response.json();
  5256.             })
  5257.             .then(data => {
  5258.                 const count = data.count || 0;
  5259.                 
  5260.                 // Mettre à jour tous les badges de notification
  5261.                 const badges = [
  5262.                     document.getElementById('notificationBadge'),
  5263.                     document.getElementById('notificationBadgeMobile'),
  5264.                     document.querySelector('.notification-badge')
  5265.                 ].filter(badge => badge !== null);
  5266.                 
  5267.                 badges.forEach(badge => {
  5268.                     if (count > 0) {
  5269.                         badge.textContent = count;
  5270.                         badge.style.display = 'flex';
  5271.                         badge.style.color = 'white';
  5272.                         badge.style.backgroundColor = '#dc3545';
  5273.                     } else {
  5274.                         badge.style.display = 'none';
  5275.                     }
  5276.                 });
  5277.                 
  5278.                 // Si on est sur la page des notifications, mettre à jour aussi le contenu de la page
  5279.                 if (typeof updateNotificationPageContent === 'function') {
  5280.                     updateNotificationPageContent(count);
  5281.                 }
  5282.             })
  5283.             .catch(error => {
  5284.                 console.error('Erreur lors du chargement du compteur de notifications:', error);
  5285.             });
  5286.         {% endif %}
  5287.     }
  5288.     
  5289.     // Exposer la fonction globalement pour qu'elle puisse être appelée depuis d'autres pages
  5290.     window.loadNotificationCount = loadNotificationCount;
  5291.     
  5292.     // Recharger le compteur toutes les 30 secondes pour garder les données à jour
  5293.     {% if app.user %}
  5294.     setInterval(function() {
  5295.         loadNotificationCount();
  5296.     }, 30000);
  5297.     {% endif %}
  5298.     
  5299.     function loadComparisonCount() {
  5300.         // Ne pas appeler l'API si on est sur une page d'erreur ou de redirection
  5301.         if (window.location.pathname.includes('/api/') || window.location.pathname.includes('/login')) {
  5302.             return;
  5303.         }
  5304.         
  5305.         // Utiliser un try-catch pour éviter toute redirection
  5306.         try {
  5307.             fetch('{{ path(\"ui_api_comparison_count\") }}', {
  5308.                 method: 'GET',
  5309.                 headers: {
  5310.                     'X-Requested-With': 'XMLHttpRequest',
  5311.                     'Accept': 'application/json'
  5312.                 },
  5313.                 credentials: 'same-origin',
  5314.                 redirect: 'error' // Empêcher les redirections automatiques
  5315.             })
  5316.             .then(response => {
  5317.                 // Vérifier si la réponse est OK
  5318.                 if (!response.ok) {
  5319.                     // Si c'est une redirection (301, 302, etc.) ou une erreur d'authentification, ignorer silencieusement
  5320.                     if (response.status >= 300 && response.status < 400) {
  5321.                         console.warn('Redirection détectée, arrêt de la requête');
  5322.                         return null;
  5323.                     }
  5324.                     if (response.status === 401 || response.status === 403) {
  5325.                         console.warn('Utilisateur non authentifié pour la comparaison');
  5326.                         return null;
  5327.                     }
  5328.                     // Pour les autres erreurs, throw pour être capturé par catch
  5329.                     throw new Error('Erreur HTTP: ' + response.status);
  5330.                 }
  5331.                 
  5332.                 // Vérifier que c'est bien du JSON
  5333.                 const contentType = response.headers.get('content-type');
  5334.                 if (!contentType || !contentType.includes('application/json')) {
  5335.                     // Si ce n'est pas du JSON, c'est probablement une redirection HTML
  5336.                     console.warn('La réponse n\\'est pas du JSON, probable redirection');
  5337.                     return null;
  5338.                 }
  5339.                 
  5340.                 return response.json();
  5341.             })
  5342.             .then(data => {
  5343.                 // Si data est null (redirection ou erreur), ne rien faire
  5344.                 if (!data || typeof data.count === 'undefined') {
  5345.                     return;
  5346.                 }
  5347.                 
  5348.                 // Mettre à jour les badges desktop et mobile
  5349.                 const badges = [
  5350.                     document.getElementById('comparisonBadge'),
  5351.                     document.getElementById('comparisonBadgeMobile')
  5352.                 ];
  5353.                 badges.forEach(badge => {
  5354.                     if (badge) {
  5355.                         if (data.count > 0) {
  5356.                             badge.textContent = data.count;
  5357.                             badge.style.display = 'flex';
  5358.                         } else {
  5359.                             badge.style.display = 'none';
  5360.                         }
  5361.                     }
  5362.                 });
  5363.             })
  5364.             .catch(error => {
  5365.                 // Ne pas afficher d'erreur si c'est juste une absence d'authentification ou une redirection
  5366.                 if (error.message && !error.message.includes('401') && !error.message.includes('403') && !error.message.includes('redirect')) {
  5367.                     console.error('Erreur lors du chargement du compteur de comparaison:', error);
  5368.                 }
  5369.                 // Empêcher toute redirection vers l'URL de l'API
  5370.                 return false;
  5371.             });
  5372.         } catch (e) {
  5373.             // Capturer toute erreur qui pourrait causer une redirection
  5374.             console.warn('Erreur lors de l\\'appel à l\\'API de comparaison:', e);
  5375.         }
  5376.     }
  5377.     
  5378.     // Fonction globale pour gérer la comparaison
  5379.     function toggleComparison(productId, element) {
  5380.         if (!element) {
  5381.             element = document.querySelector(`.comparison-btn[data-product-id=\"\${productId}\"]`);
  5382.         }
  5383.         
  5384.         if (!element) {
  5385.             console.error('Bouton de comparaison non trouvé pour le produit', productId);
  5386.             return;
  5387.         }
  5388.         
  5389.         const originalHtml = element.innerHTML;
  5390.         // Désactiver le bouton/lien
  5391.         if (element.tagName === 'BUTTON') {
  5392.             element.disabled = true;
  5393.         } else {
  5394.             element.style.pointerEvents = 'none';
  5395.             element.style.opacity = '0.6';
  5396.         }
  5397.         element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
  5398.         
  5399.         // Vérifier d'abord si le produit est déjà en comparaison
  5400.         let isInComparison = false;
  5401.         fetch(`/api/comparison/status/\${productId}`)
  5402.             .then(response => {
  5403.                 const contentType = response.headers.get('content-type');
  5404.                 if (contentType && contentType.includes('text/html')) {
  5405.                     window.location.href = '{{ path(\"ui_app_login\") }}';
  5406.                     throw new Error('Not authenticated');
  5407.                 }
  5408.                 return response.json();
  5409.             })
  5410.             .then(data => {
  5411.                 isInComparison = data.inComparison;
  5412.                 const url = isInComparison ? `/api/comparison/remove/\${productId}` : `/api/comparison/add/\${productId}`;
  5413.                 
  5414.                 return fetch(url, {
  5415.                     method: 'POST',
  5416.                     headers: {
  5417.                         'Content-Type': 'application/json',
  5418.                         'X-Requested-With': 'XMLHttpRequest'
  5419.                     }
  5420.                 });
  5421.             })
  5422.             .then(response => {
  5423.                 const contentType = response.headers.get('content-type');
  5424.                 if (contentType && contentType.includes('text/html')) {
  5425.                     window.location.href = '{{ path(\"ui_app_login\") }}';
  5426.                     throw new Error('Not authenticated');
  5427.                 }
  5428.                 return response.json();
  5429.             })
  5430.             .then(data => {
  5431.                 if (data.success) {
  5432.                     // Mettre à jour le compteur
  5433.                     loadComparisonCount();
  5434.                     
  5435.                     // Mettre à jour l'apparence du bouton
  5436.                     if (element) {
  5437.                         // Inverser l'état (car on vient de le changer)
  5438.                         const newState = !isInComparison;
  5439.                         
  5440.                         // Restaurer le HTML original puis mettre à jour
  5441.                         element.innerHTML = originalHtml;
  5442.                         
  5443.                         if (newState) {
  5444.                             element.classList.add('active');
  5445.                             // Mettre à jour le texte pour les deux types de boutons
  5446.                             const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
  5447.                             if (textEl) textEl.textContent = 'En comparaison';
  5448.                             // Mettre à jour l'icône si nécessaire (chercher dans span ou i)
  5449.                             const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
  5450.                             if (iconEl) {
  5451.                                 iconEl.style.color = '#28a745';
  5452.                                 iconEl.classList.add('active');
  5453.                             }
  5454.                         } else {
  5455.                             element.classList.remove('active');
  5456.                             const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
  5457.                             if (textEl) textEl.textContent = 'Comparer';
  5458.                             // Restaurer la couleur de l'icône
  5459.                             const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
  5460.                             if (iconEl) {
  5461.                                 iconEl.style.color = '';
  5462.                                 iconEl.classList.remove('active');
  5463.                             }
  5464.                         }
  5465.                     }
  5466.                     
  5467.                     // Afficher une notification
  5468.                     showNotification(data.message, 'success');
  5469.                 } else {
  5470.                     showNotification(data.message, 'error');
  5471.                     if (element) {
  5472.                         element.innerHTML = originalHtml;
  5473.                     }
  5474.                 }
  5475.             })
  5476.             .catch(error => {
  5477.                 console.error('Erreur:', error);
  5478.                 showNotification('Une erreur est survenue', 'error');
  5479.                 if (element) {
  5480.                     element.innerHTML = originalHtml;
  5481.                 }
  5482.             })
  5483.             .finally(() => {
  5484.                 if (element) {
  5485.                     if (element.tagName === 'BUTTON') {
  5486.                         element.disabled = false;
  5487.                     } else {
  5488.                         element.style.pointerEvents = '';
  5489.                         element.style.opacity = '';
  5490.                     }
  5491.                 }
  5492.             });
  5493.     }
  5494.     
  5495.     // Fonction globale pour gérer les favoris
  5496.     function toggleWishlist(productId, element) {
  5497.         if (!element) {
  5498.             element = document.querySelector(`.wishlist-btn[data-product-id=\"\${productId}\"]`);
  5499.         }
  5500.         
  5501.         if (!element) {
  5502.             console.error('Bouton de wishlist non trouvé pour le produit', productId);
  5503.             return;
  5504.         }
  5505.         
  5506.         const originalHtml = element.innerHTML;
  5507.         // Désactiver le bouton/lien
  5508.         if (element.tagName === 'BUTTON') {
  5509.             element.disabled = true;
  5510.         } else {
  5511.             element.style.pointerEvents = 'none';
  5512.             element.style.opacity = '0.6';
  5513.         }
  5514.         element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
  5515.         
  5516.         // Vérifier d'abord si le produit est déjà en favoris
  5517.         let isInWishlist = false;
  5518.         fetch(`/api/wishlist/status/\${productId}`)
  5519.             .then(response => {
  5520.                 const contentType = response.headers.get('content-type');
  5521.                 if (contentType && contentType.includes('text/html')) {
  5522.                     window.location.href = '{{ path(\"ui_app_login\") }}';
  5523.                     throw new Error('Not authenticated');
  5524.                 }
  5525.                 return response.json();
  5526.             })
  5527.             .then(data => {
  5528.                 isInWishlist = data.inWishlist;
  5529.                 const url = isInWishlist ? `/api/wishlist/remove/\${productId}` : `/api/wishlist/add/\${productId}`;
  5530.                 
  5531.                 return fetch(url, {
  5532.                     method: 'POST',
  5533.                     headers: {
  5534.                         'Content-Type': 'application/json',
  5535.                         'X-Requested-With': 'XMLHttpRequest'
  5536.                     }
  5537.                 });
  5538.             })
  5539.             .then(response => {
  5540.                 const contentType = response.headers.get('content-type');
  5541.                 if (contentType && contentType.includes('text/html')) {
  5542.                     window.location.href = '{{ path(\"ui_app_login\") }}';
  5543.                     throw new Error('Not authenticated');
  5544.                 }
  5545.                 return response.json();
  5546.             })
  5547.             .then(data => {
  5548.                 if (data.success) {
  5549.                     // Mettre à jour l'apparence du bouton
  5550.                     if (element) {
  5551.                         // Inverser l'état (car on vient de le changer)
  5552.                         const newState = !isInWishlist;
  5553.                         
  5554.                         // Restaurer le HTML original puis mettre à jour
  5555.                         element.innerHTML = originalHtml;
  5556.                         
  5557.                         // Chercher l'icône dans span ou i
  5558.                         const icon = element.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
  5559.                         const text = element.querySelector('.wishlist-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
  5560.                         
  5561.                         if (newState) {
  5562.                             if (icon) {
  5563.                                 // Pour les icônes linr, on change la classe
  5564.                                 if (icon.classList.contains('lnr-heart')) {
  5565.                                     icon.classList.remove('lnr-heart');
  5566.                                 }
  5567.                                 if (!icon.classList.contains('lnr-heart-filled')) {
  5568.                                     icon.classList.add('lnr-heart-filled');
  5569.                                 }
  5570.                                 icon.style.color = '#dc3545';
  5571.                             }
  5572.                             element.classList.add('active');
  5573.                             if (text) text.textContent = 'Dans favoris';
  5574.                         } else {
  5575.                             if (icon) {
  5576.                                 // Restaurer l'icône originale
  5577.                                 if (icon.classList.contains('lnr-heart-filled')) {
  5578.                                     icon.classList.remove('lnr-heart-filled');
  5579.                                 }
  5580.                                 if (!icon.classList.contains('lnr-heart')) {
  5581.                                     icon.classList.add('lnr-heart');
  5582.                                 }
  5583.                                 icon.style.color = '';
  5584.                             }
  5585.                             element.classList.remove('active');
  5586.                             if (text) text.textContent = 'Favoris';
  5587.                         }
  5588.                     }
  5589.                     
  5590.                     // Afficher une notification
  5591.                     showNotification(data.message, 'success');
  5592.                     
  5593.                     // Si on est sur la page wishlist, recharger la page
  5594.                     if (window.location.pathname.includes('/account/wishlist')) {
  5595.                         setTimeout(() => location.reload(), 1000);
  5596.                     }
  5597.                 } else {
  5598.                     showNotification(data.message, 'error');
  5599.                     if (element) {
  5600.                         element.innerHTML = originalHtml;
  5601.                     }
  5602.                 }
  5603.             })
  5604.             .catch(error => {
  5605.                 console.error('Erreur:', error);
  5606.                 showNotification('Une erreur est survenue', 'error');
  5607.                 if (element) {
  5608.                     element.innerHTML = originalHtml;
  5609.                 }
  5610.             })
  5611.             .finally(() => {
  5612.                 if (element) {
  5613.                     if (element.tagName === 'BUTTON') {
  5614.                         element.disabled = false;
  5615.                     } else {
  5616.                         element.style.pointerEvents = '';
  5617.                         element.style.opacity = '';
  5618.                     }
  5619.                 }
  5620.             });
  5621.     }
  5622.     
  5623.     // Fonction pour afficher des notifications
  5624.     function showNotification(message, type = 'success') {
  5625.         // Créer l'élément de notification
  5626.         const notification = document.createElement('div');
  5627.         notification.className = `alert alert-\${type === 'success' ? 'success' : 'danger'} alert-dismissible fade show position-fixed`;
  5628.         notification.style.cssText = 'top: 20px; right: 20px; z-index: 9999; min-width: 300px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);';
  5629.         notification.innerHTML = `
  5630.             \${message}
  5631.             <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\"></button>
  5632.         `;
  5633.         
  5634.         document.body.appendChild(notification);
  5635.         
  5636.         // Supprimer automatiquement après 3 secondes
  5637.         setTimeout(() => {
  5638.             notification.remove();
  5639.         }, 3000);
  5640.     }
  5641.     
  5642.     // Initialiser les alertes Bootstrap 5 pour la fermeture
  5643.     document.addEventListener('DOMContentLoaded', function() {
  5644.         // S'assurer que les alertes peuvent être fermées
  5645.         const alertCloseButtons = document.querySelectorAll('.flash-message .btn-close');
  5646.         alertCloseButtons.forEach(function(button) {
  5647.             button.addEventListener('click', function() {
  5648.                 const alert = this.closest('.alert');
  5649.                 if (alert) {
  5650.                     alert.classList.remove('show');
  5651.                     setTimeout(function() {
  5652.                         alert.remove();
  5653.                     }, 150);
  5654.                 }
  5655.             });
  5656.         });
  5657.         
  5658.         // Charger les statuts initiaux des produits
  5659.         {% if app.user %}
  5660.         // Charger les statuts de comparaison pour tous les produits visibles
  5661.         document.querySelectorAll('.comparison-btn[data-product-id]').forEach(btn => {
  5662.             const productId = btn.dataset.productId;
  5663.             fetch(`/api/comparison/status/\${productId}`)
  5664.                 .then(response => response.json())
  5665.                 .then(data => {
  5666.                     if (data.inComparison) {
  5667.                         btn.classList.add('active');
  5668.                         // Mettre à jour le texte pour les deux types de boutons
  5669.                         const textEl = btn.querySelector('.comparison-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
  5670.                         if (textEl) textEl.textContent = 'En comparaison';
  5671.                         // Mettre à jour l'icône si nécessaire
  5672.                         const iconEl = btn.querySelector('.lnr-sync, [class*=\"sync\"]');
  5673.                         if (iconEl) iconEl.style.color = '#28a745';
  5674.                     }
  5675.                 })
  5676.                 .catch(() => {});
  5677.         });
  5678.         
  5679.         // Charger les statuts de wishlist pour tous les produits visibles
  5680.         document.querySelectorAll('.wishlist-btn[data-product-id]').forEach(btn => {
  5681.             const productId = btn.dataset.productId;
  5682.             fetch(`/api/wishlist/status/\${productId}`)
  5683.                 .then(response => response.json())
  5684.                 .then(data => {
  5685.                     if (data.inWishlist) {
  5686.                         btn.classList.add('active');
  5687.                         // Chercher l'icône dans span ou i
  5688.                         const icon = btn.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
  5689.                         if (icon) {
  5690.                             icon.classList.remove('lnr-heart');
  5691.                             icon.classList.add('lnr-heart-filled');
  5692.                             icon.style.color = '#dc3545';
  5693.                         }
  5694.                         // Mettre à jour le texte pour les deux types de boutons
  5695.                         const textEl = btn.querySelector('.wishlist-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
  5696.                         if (textEl) textEl.textContent = 'Dans favoris';
  5697.                     }
  5698.                 })
  5699.                 .catch(() => {});
  5700.         });
  5701.         
  5702.         // Charger le compteur de comparaison
  5703.         loadComparisonCount();
  5704.         {% endif %}
  5705.     });
  5706.     </script>
  5707. <script>
  5708. // Loader global pour tous les boutons de formulaire
  5709. document.addEventListener('DOMContentLoaded', function() {
  5710.     // Intercepter tous les formulaires
  5711.     const forms = document.querySelectorAll('form');
  5712.     
  5713.     forms.forEach(function(form) {
  5714.         form.addEventListener('submit', function(e) {
  5715.             const submitButtons = form.querySelectorAll('button[type=\"submit\"], input[type=\"submit\"], button:not([type])');
  5716.             
  5717.             submitButtons.forEach(function(button) {
  5718.                 // Vérifier si le bouton n'est pas déjà désactivé
  5719.                 if (!button.disabled && !button.classList.contains('loading')) {
  5720.                     button.classList.add('loading');
  5721.                     button.disabled = true;
  5722.                     
  5723.                     // Sauvegarder le texte original
  5724.                     const originalText = button.innerHTML;
  5725.                     button.setAttribute('data-original-text', originalText);
  5726.                     
  5727.                     // Ajouter le loader
  5728.                     button.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Envoi...';
  5729.                     
  5730.                     // Si le formulaire n'est pas valide, réactiver le bouton après 1 seconde
  5731.                     setTimeout(function() {
  5732.                         if (!form.checkValidity()) {
  5733.                             button.classList.remove('loading');
  5734.                             button.disabled = false;
  5735.                             button.innerHTML = originalText;
  5736.                         }
  5737.                     }, 1000);
  5738.                 }
  5739.             });
  5740.         });
  5741.     });
  5742.     
  5743.     // Pour les boutons qui déclenchent des actions AJAX
  5744.     const ajaxButtons = document.querySelectorAll('[data-ajax], .ajax-submit, button[data-submit]');
  5745.     
  5746.     ajaxButtons.forEach(function(button) {
  5747.         button.addEventListener('click', function(e) {
  5748.             if (this.disabled || this.classList.contains('loading')) {
  5749.                 e.preventDefault();
  5750.                 return false;
  5751.             }
  5752.             
  5753.             this.classList.add('loading');
  5754.             this.disabled = true;
  5755.             
  5756.             const originalText = this.innerHTML;
  5757.             this.setAttribute('data-original-text', originalText);
  5758.             
  5759.             this.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Chargement...';
  5760.         });
  5761.     });
  5762.     
  5763.     // Gestionnaire spécifique pour le formulaire de newsletter
  5764.     const newsletterForm = document.querySelector('.footer-newsletter-form');
  5765.     if (newsletterForm) {
  5766.         newsletterForm.addEventListener('submit', function(e) {
  5767.             const submitBtn = this.querySelector('.newsletter-btn');
  5768.             if (submitBtn && !submitBtn.disabled) {
  5769.                 submitBtn.classList.add('loading');
  5770.                 submitBtn.disabled = true;
  5771.                 
  5772.                 // Afficher le loader et masquer l'icône
  5773.                 const icon = submitBtn.querySelector('.newsletter-btn-icon');
  5774.                 const loader = submitBtn.querySelector('.newsletter-btn-loader');
  5775.                 if (icon) icon.style.display = 'none';
  5776.                 if (loader) loader.style.display = 'flex';
  5777.                 
  5778.                 // Réactiver le bouton après 5 secondes au cas où la requête échoue silencieusement
  5779.                 setTimeout(function() {
  5780.                     if (submitBtn.classList.contains('loading')) {
  5781.                         submitBtn.classList.remove('loading');
  5782.                         submitBtn.disabled = false;
  5783.                         if (icon) icon.style.display = 'flex';
  5784.                         if (loader) loader.style.display = 'none';
  5785.                     }
  5786.                 }, 5000);
  5787.             }
  5788.         });
  5789.         
  5790.         // Gérer la réponse du formulaire (si AJAX)
  5791.         newsletterForm.addEventListener('submit', function(e) {
  5792.             // Si le formulaire est soumis normalement (non-AJAX), le navigateur gère la réponse
  5793.             // Sinon, on peut intercepter pour gérer la réponse AJAX ici
  5794.         });
  5795.     }
  5796. });
  5797. // CSS pour le spinner
  5798. const style = document.createElement('style');
  5799. style.textContent = `
  5800.     .spinner-border-sm {
  5801.         width: 1rem;
  5802.         height: 1rem;
  5803.         border-width: 0.15em;
  5804.     }
  5805.     .spinner-border {
  5806.         display: inline-block;
  5807.         width: 1rem;
  5808.         height: 1rem;
  5809.         vertical-align: text-bottom;
  5810.         border: 0.15em solid currentColor;
  5811.         border-right-color: transparent;
  5812.         border-radius: 50%;
  5813.         animation: spinner-border 0.75s linear infinite;
  5814.     }
  5815.     @keyframes spinner-border {
  5816.         to { transform: rotate(360deg); }
  5817.     }
  5818.     button.loading {
  5819.         opacity: 0.7;
  5820.         cursor: not-allowed !important;
  5821.     }
  5822. `;
  5823. document.head.appendChild(style);
  5824. </script>
  5825. \t<!-- Modal Global Custom Alert -->
  5826. \t<div class=\"modal fade custom-alert-modal\" id=\"customAlertModal\" tabindex=\"-1\" aria-labelledby=\"customAlertModalLabel\" aria-hidden=\"true\">
  5827. \t\t<div class=\"modal-dialog modal-dialog-centered\">
  5828. \t\t\t<div class=\"modal-content\">
  5829. \t\t\t\t<div class=\"modal-header\">
  5830. \t\t\t\t\t<h5 class=\"modal-title text-white\" id=\"customAlertModalLabel\">Notification</h5>
  5831. \t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
  5832. \t\t\t\t</div>
  5833. \t\t\t\t<div class=\"modal-body\">
  5834. \t\t\t\t\t<div class=\"alert-icon\" id=\"alertIcon\">
  5835. \t\t\t\t\t\t<i class=\"lnr lnr-info-circle\"></i>
  5836. \t\t\t\t\t</div>
  5837. \t\t\t\t\t<p class=\"alert-message\" id=\"alertMessage\"></p>
  5838. \t\t\t\t</div>
  5839. \t\t\t\t<div class=\"modal-footer\">
  5840. \t\t\t\t\t<button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\">OK</button>
  5841. \t\t\t\t</div>
  5842. \t\t\t</div>
  5843. \t\t</div>
  5844. \t</div>
  5845. \t<script>
  5846. \t\t// Fonction globale pour remplacer alert() ou afficher des messages
  5847. \t\tfunction showCustomAlert(message, type = 'info') {
  5848. \t\t\tconst modalEl = document.getElementById('customAlertModal');
  5849. \t\t\tif (!modalEl) {
  5850. \t\t\t\t// Fallback sur showNotification
  5851. \t\t\t\tlet notifyType = type === 'error' || type === 'danger' ? 'error' : (type === 'success' ? 'success' : 'warning');
  5852. \t\t\t\tif (typeof showNotification === 'function') {
  5853. \t\t\t\t\tshowNotification(message, notifyType);
  5854. \t\t\t\t} else {
  5855. \t\t\t\t\talert(message);
  5856. \t\t\t\t}
  5857. \t\t\t\treturn;
  5858. \t\t\t}
  5859. \t\t\t
  5860. \t\t\tconst modal = new bootstrap.Modal(modalEl);
  5861. \t\t\tconst alertMessage = document.getElementById('alertMessage');
  5862. \t\t\tconst alertIcon = document.getElementById('alertIcon');
  5863. \t\t\tconst modalTitle = document.getElementById('customAlertModalLabel');
  5864. \t\t\talertMessage.textContent = message;
  5865. \t\t\t// Définir l'icône et le titre selon le type
  5866. \t\t\tlet iconClass = 'lnr lnr-info-circle';
  5867. \t\t\tlet title = 'Information';
  5868. \t\t\tswitch (type) {
  5869. \t\t\t\tcase 'success': 
  5870. \t\t\t\t\ticonClass = 'lnr lnr-checkmark-circle';
  5871. \t\t\t\t\ttitle = 'Succès';
  5872. \t\t\t\t\talertIcon.className = 'alert-icon success';
  5873. \t\t\t\t\tbreak;
  5874. \t\t\t\tcase 'error':
  5875. \t\t\t\tcase 'danger': 
  5876. \t\t\t\t\ticonClass = 'lnr lnr-warning';
  5877. \t\t\t\t\ttitle = 'Erreur';
  5878. \t\t\t\t\talertIcon.className = 'alert-icon error';
  5879. \t\t\t\t\tbreak;
  5880. \t\t\t\tcase 'warning': 
  5881. \t\t\t\t\ticonClass = 'lnr lnr-warning';
  5882. \t\t\t\t\ttitle = 'Attention';
  5883. \t\t\t\t\talertIcon.className = 'alert-icon warning';
  5884. \t\t\t\t\tbreak;
  5885. \t\t\t\tdefault: 
  5886. \t\t\t\t\ticonClass = 'lnr lnr-info-circle';
  5887. \t\t\t\t\ttitle = 'Information';
  5888. \t\t\t\t\talertIcon.className = 'alert-icon info';
  5889. \t\t\t}
  5890. \t\t\talertIcon.innerHTML = `<i class=\"\${iconClass}\"></i>`;
  5891. \t\t\tmodalTitle.textContent = title;
  5892. \t\t\tmodal.show();
  5893. \t\t};
  5894. \t</script>
  5895. {% block javascripts %}
  5896. {% endblock %}
  5897. </body>
  5898. </html>
  5899. ""base_home.html.twig""/home/u540977899/domains/maketou-ht.com/public_html/templates/base_home.html.twig");
  5900.     }
  5901. }