<?php
use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Extension\CoreExtension;
use Twig\Extension\SandboxExtension;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;
use Twig\TemplateWrapper;
/* base_home.html.twig */
class __TwigTemplate_c86efc76357b73ced93910d382926e56 extends Template
{
private Source $source;
/**
* @var array<string, Template>
*/
private array $macros = [];
public function __construct(Environment $env)
{
parent::__construct($env);
$this->source = $this->getSourceContext();
$this->parent = false;
$this->blocks = [
'title' => [$this, 'block_title'],
'stylesheets' => [$this, 'block_stylesheets'],
'body' => [$this, 'block_body'],
'javascripts' => [$this, 'block_javascripts'],
];
}
protected function doDisplay(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
$__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
$__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "base_home.html.twig"));
$__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "base_home.html.twig"));
// line 1
yield "<!DOCTYPE html>
<html lang=\"fr\" class=\"no-js\">
\t<head>
\t\t<!-- Mobile Specific Meta -->
\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no\">
\t\t<meta name=\"mobile-web-app-capable\" content=\"yes\">
\t\t<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">
\t\t<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">
\t\t<meta name=\"apple-mobile-web-app-title\" content=\"MaketOu\">
\t\t<meta name=\"theme-color\" content=\"#ffa200\">
\t\t<meta name=\"msapplication-TileColor\" content=\"#ffa200\">
\t\t<meta
\t\tname=\"msapplication-config\" content=\"";
// line 14
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/browserconfig.xml"), "html", null, true);
yield "\">
\t\t<!-- Favicon-->
\t\t<link rel=\"shortcut icon\" href=\"";
// line 17
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/favicon-16x16.png"), "html", null, true);
yield "\">
\t\t<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"";
// line 18
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/apple-touch-icon.png"), "html", null, true);
yield "\">
\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"";
// line 19
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/favicon-32x32.png"), "html", null, true);
yield "\">
\t\t<link
\t\trel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"";
// line 21
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("favicon/favicon-16x16.png"), "html", null, true);
yield "\">
\t\t<!-- PWA Manifest -->
\t\t<link
\t\trel=\"manifest\" href=\"";
// line 25
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("manifest.json"), "html", null, true);
yield "\">
\t\t<!-- Author Meta -->
\t\t<meta
\t\tname=\"author\" content=\"Foulgor Tech\">
\t\t<!-- Meta Description -->
\t\t<meta
\t\tname=\"description\" content=\"\">
\t\t<!-- Meta Keyword -->
\t\t<meta
\t\tname=\"keywords\" content=\"\">
\t\t<!-- meta character set -->
\t\t<meta
\t\tcharset=\"UTF-8\">
\t\t<!-- Site Title -->
\t\t<title>
\t\t\t";
// line 40
yield from $this->unwrap()->yieldBlock('title', $context, $blocks);
// line 42
yield "\t\t</title>
\t\t<!--
\t\t\t\t\t\t CSS
\t\t\t\t\t\t ============================================= -->
\t\t<link rel=\"stylesheet\" href=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.css\"/>
\t\t<link rel=\"stylesheet\" href=\"";
// line 47
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/linearicons.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 48
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/font-awesome.min.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 49
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/themify-icons.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 50
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/bootstrap.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 51
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/owl.carousel.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 52
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/nice-select.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 53
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/nouislider.min.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 54
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/ion.rangeSlider.css"), "html", null, true);
yield "\"/>
\t\t<link rel=\"stylesheet\" href=\"";
// line 55
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/ion.rangeSlider.skinFlat.css"), "html", null, true);
yield "\"/>
\t\t<link rel=\"stylesheet\" href=\"";
// line 56
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/magnific-popup.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 57
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/main.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 58
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/cart-modal.css"), "html", null, true);
yield "\">
\t\t<link rel=\"stylesheet\" href=\"";
// line 59
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/css/buttons-unified.css"), "html", null, true);
yield "\">
\t\t<meta
\t\tcharset=\"UTF-8\">
\t\t";
// line 63
yield "
\t\t<style>
\t\t\t/* Styles pour l'icône de notification */
\t\t\t.notification-icon {
\t\t\t\tposition: relative;
\t\t\t\tdisplay: inline-block;
\t\t\t\tcolor: #333;
\t\t\t\ttext-decoration: none;
\t\t\t\ttransition: color 0.3s ease;
\t\t\t}
\t\t\t.notification-icon:hover {
\t\t\t\tcolor: #007bff;
\t\t\t}
\t\t\t.notification-badge {
\t\t\t\tposition: absolute;
\t\t\t\ttop: -4px;
\t\t\t\tright: -2px;
\t\t\t\tbackground: #dc3545 !important;
\t\t\t\tcolor: white !important;
\t\t\t\tborder-radius: 50%;
\t\t\t\twidth: 18px;
\t\t\t\theight: 18px;
\t\t\t\tfont-size: 8px !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tfont-weight: bold !important;
\t\t\t\tanimation: pulse 2s infinite;
\t\t\t\tz-index: 10;
\t\t\t\tline-height: 1 !important;
\t\t\t}
\t\t\t/* Forcer le texte en blanc pour tous les éléments du badge - avec spécificité maximale */
\t\t\t.notification-badge,
\t\t\t.notification-badge.text-white,
\t\t\t.notification-badge *,
\t\t\t#notificationBadge,
\t\t\t#notificationBadge.text-white,
\t\t\t#notificationBadge *,
\t\t\tspan.notification-badge,
\t\t\tspan.notification-badge.text-white,
\t\t\tspan#notificationBadge,
\t\t\tspan#notificationBadge.text-white {
\t\t\t\tcolor: white !important;
\t\t\t\ttext-color: white !important;
\t\t\t\t-webkit-text-fill-color: white !important;
\t\t\t}
\t\t\t/* S'assurer que le contenu texte est bien en blanc */
\t\t\t.notification-badge::before,
\t\t\t.notification-badge::after {
\t\t\t\tcolor: white !important;
\t\t\t}
\t\t\t/* Forcer la couleur pour tous les sélecteurs possibles avec spécificité maximale */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge.text-white,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span.notification-badge,
\t\t\t.notification-icon .notification-badge,
\t\t\t.notification-icon .notification-badge.text-white,
\t\t\t.notification-icon span.notification-badge,
\t\t\ta.notification-icon .notification-badge,
\t\t\ta.notification-icon span.notification-badge {
\t\t\t\tcolor: white !important;
\t\t\t\ttext-color: white !important;
\t\t\t\t-webkit-text-fill-color: white !important;
\t\t\t}
\t\t\t/* Forcer la couleur pour tous les enfants directs */
\t\t\t.notification-icon > .notification-badge,
\t\t\t.notification-icon > span.notification-badge {
\t\t\t\tcolor: white !important;
\t\t\t}
\t\t\t@keyframes pulse {
\t\t\t\t0% {
\t\t\t\t\ttransform: scale(1);
\t\t\t\t}
\t\t\t\t50% {
\t\t\t\t\ttransform: scale(1.1);
\t\t\t\t}
\t\t\t\t100% {
\t\t\t\t\ttransform: scale(1);
\t\t\t\t}
\t\t\t}
\t\t\t.notification-icon:hover .notification-badge {
\t\t\t\tanimation: none;
\t\t\t}
\t\t\t/* Container pour les icônes - toujours alignées horizontalement */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
\t\t\t\tdisplay: flex !important;
\t\t\t\tflex-direction: row !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tgap: 15px !important;
\t\t\t\tlist-style: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\twidth: auto !important;
\t\t\t}
\t\t\t/* Surcharger les styles existants pour les li contenant le wrapper */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right li:has(.navbar-icons-wrapper) {
\t\t\t\tmargin-left: 0 !important;
\t\t\t\tmargin-right: 0 !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t}
\t\t\t/* Styles pour les icônes */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\twidth: 40px !important;
\t\t\t\theight: 40px !important;
\t\t\t\tmin-width: 40px !important;
\t\t\t\tmin-height: 40px !important;
\t\t\t\tcolor: #333 !important;
\t\t\t\ttext-decoration: none !important;
\t\t\t\ttransition: all 0.3s ease !important;
\t\t\t\tborder-radius: 50% !important;
\t\t\t\tposition: relative !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart:hover,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon:hover,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon:hover,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search:hover {
\t\t\t\tbackground-color: #f0f0f0 !important;
\t\t\t\tcolor: #ffa200 !important;
\t\t\t\ttransform: scale(1.1) !important;
\t\t\t}
\t\t\t/* Surcharger le line-height de main.css */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart span,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search span {
\t\t\t\tfont-size: 18px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tcolor: inherit !important;
\t\t\t\tfont-weight: normal !important;
\t\t\t}
\t\t\t/* Icône de comparaison en noir comme le panier */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon {
\t\t\t\tcolor: #333 !important;
\t\t\t}
\t\t\t/* L'icône elle-même (lnr-sync) doit être noire, mais pas le badge */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon > span.lnr-sync,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon span:not(.comparison-badge) {
\t\t\t\tcolor: #333 !important;
\t\t\t\tfont-size: 18px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tfont-weight: normal !important;
\t\t\t}
\t\t\t/* Le badge doit rester blanc */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon .comparison-badge {
\t\t\t\tcolor: white !important;
\t\t\t}
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
\t\t\t\tbackground: transparent !important;
\t\t\t\tborder: 0 !important;
\t\t\t\tcursor: pointer !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t/* Alignement des icônes navbar sur mobile */
\t\t\t@media(max-width: 991.98px) {
\t\t\t\t/* Container navbar-right en colonne sur mobile */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right {
\t\t\t\t\tdisplay: flex !important;
\t\t\t\t\tflex-direction: column !important;
\t\t\t\t\talign-items: center !important;
\t\t\t\t\tjustify-content: center !important;
\t\t\t\t\twidth: 100% !important;
\t\t\t\t\tgap: 0 !important;
\t\t\t\t\tmargin: 0 !important;
\t\t\t\t\tpadding: 10px 0 !important;
\t\t\t\t}
\t\t\t\t/* Le container d'icônes reste horizontal */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
\t\t\t\t\twidth: 100% !important;
\t\t\t\t\tjustify-content: center !important;
\t\t\t\t\tdisplay: flex !important;
\t\t\t\t\tflex-direction: row !important;
\t\t\t\t}
\t\t\t\t/* Le bouton compte en bas - pleine largeur */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right li:last-child {
\t\t\t\t\twidth: 100% !important;
\t\t\t\t\tdisplay: flex !important;
\t\t\t\t\tjustify-content: center !important;
\t\t\t\t\tmargin-top: 12px !important;
\t\t\t\t\tpadding-top: 12px !important;
\t\t\t\t\tborder-top: 1px solid #e0e0e0 !important;
\t\t\t\t}
\t\t\t\t/* Bouton compte responsive */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .btn-account {
\t\t\t\t\twidth: 100%;
\t\t\t\t\tmax-width: 200px;
\t\t\t\t\tpadding: 10px 20px;
\t\t\t\t\tfont-size: 14px;
\t\t\t\t}
\t\t\t}
\t\t\t/* Styles pour les messages flash - Design moderne */
\t\t\t.flash-message {
\t\t\t\tanimation: slideInDownFlash 0.4s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t\tposition: relative;
\t\t\t\toverflow: visible !important;
\t\t\t\tborder: none !important;
\t\t\t\tpadding: 16px 20px !important;
\t\t\t\tborder-radius: 12px !important;
\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center;
\t\t\t\tgap: 12px;
\t\t\t\tmargin-bottom: 15px;
\t\t\t\tbackdrop-filter: blur(10px);
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t/* S'assurer que les icônes Font Awesome sont visibles */
\t\t\t.flash-message i.fa {
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tvisibility: visible !important;
\t\t\t\topacity: 1 !important;
\t\t\t\twidth: auto !important;
\t\t\t\theight: auto !important;
\t\t\t\tfont-family: \"FontAwesome\" !important;
\t\t\t\tfont-style: normal !important;
\t\t\t\tfont-weight: normal !important;
\t\t\t\ttext-rendering: auto !important;
\t\t\t\t-webkit-font-smoothing: antialiased !important;
\t\t\t\t-moz-osx-font-smoothing: grayscale !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tflex-shrink: 0 !important;
\t\t\t}
\t\t\t/* Forcer l'affichage des pseudo-éléments Font Awesome */
\t\t\t.flash-message i.fa::before {
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tvisibility: visible !important;
\t\t\t\topacity: 1 !important;
\t\t\t\tcontent: attr(data-icon) !important;
\t\t\t}
\t\t\t/* Styles spécifiques pour chaque icône */
\t\t\t.flash-message i.fa-check-circle::before {
\t\t\t\tcontent: \"\\f058\" !important;
\t\t\t}
\t\t\t.flash-message i.fa-exclamation-circle::before {
\t\t\t\tcontent: \"\\f06a\" !important;
\t\t\t}
\t\t\t.flash-message i.fa-exclamation-triangle::before {
\t\t\t\tcontent: \"\\f071\" !important;
\t\t\t}
\t\t\t.flash-message i.fa-info-circle::before {
\t\t\t\tcontent: \"\\f05a\" !important;
\t\t\t}
\t\t\t.flash-message:hover {
\t\t\t\tbox-shadow: 0 6px 20px rgba(0, 0, 0, 0.2) !important;
\t\t\t\ttransform: translateY(-2px);
\t\t\t}
\t\t\t.flash-message::before {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\tleft: 0;
\t\t\t\ttop: 0;
\t\t\t\tbottom: 0;
\t\t\t\twidth: 5px;
\t\t\t\tbackground: linear-gradient(180deg, currentColor 0%, rgba(255,255,255,0.3) 100%);
\t\t\t\tborder-radius: 12px 0 0 12px;
\t\t\t}
\t\t\t.flash-message.alert-success {
\t\t\t\tbackground: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%) !important;
\t\t\t\tcolor: #155724 !important;
\t\t\t\tborder-left: 5px solid #28a745 !important;
\t\t\t}
\t\t\t.flash-message.alert-success i.fa {
\t\t\t\tcolor: #28a745 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message.alert-danger {
\t\t\t\tbackground: linear-gradient(135deg, #f8d7da 0%, #f5c6cb 100%) !important;
\t\t\t\tcolor: #721c24 !important;
\t\t\t\tborder-left: 5px solid #dc3545 !important;
\t\t\t}
\t\t\t.flash-message.alert-danger i.fa {
\t\t\t\tcolor: #dc3545 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message.alert-warning {
\t\t\t\tbackground: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%) !important;
\t\t\t\tcolor: #856404 !important;
\t\t\t\tborder-left: 5px solid #ffc107 !important;
\t\t\t}
\t\t\t.flash-message.alert-warning i.fa {
\t\t\t\tcolor: #ffa200 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message.alert-info {
\t\t\t\tbackground: linear-gradient(135deg, #d1ecf1 0%, #bee5eb 100%) !important;
\t\t\t\tcolor: #0c5460 !important;
\t\t\t\tborder-left: 5px solid #17a2b8 !important;
\t\t\t}
\t\t\t.flash-message.alert-info i.fa {
\t\t\t\tcolor: #17a2b8 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message strong {
\t\t\t\tflex: 1;
\t\t\t\tfont-weight: 600;
\t\t\t\tfont-size: 0.95rem;
\t\t\t\tline-height: 1.5;
\t\t\t}
\t\t\t.flash-message .btn-close {
\t\t\t\topacity: 0.7;
\t\t\t\tpadding: 8px !important;
\t\t\t\tmargin: -8px -8px -8px auto !important;
\t\t\t\ttransition: all 0.2s ease;
\t\t\t\tborder-radius: 50% !important;
\t\t\t\tbackground: rgba(0, 0, 0, 0.05) !important;
\t\t\t\twidth: 32px !important;
\t\t\t\theight: 32px !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tborder: none !important;
\t\t\t\tcursor: pointer !important;
\t\t\t\tposition: relative !important;
\t\t\t}
\t\t\t/* Ajouter une icône X visible dans le bouton */
\t\t\t.flash-message .btn-close::before {
\t\t\t\tcontent: '×' !important;
\t\t\t\tfont-size: 24px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tcolor: currentColor !important;
\t\t\t\tfont-weight: bold !important;
\t\t\t\tdisplay: block !important;
\t\t\t\tposition: absolute !important;
\t\t\t\ttop: 50% !important;
\t\t\t\tleft: 50% !important;
\t\t\t\ttransform: translate(-50%, -50%) !important;
\t\t\t}
\t\t\t.flash-message .btn-close:hover {
\t\t\t\topacity: 1 !important;
\t\t\t\tbackground: rgba(0, 0, 0, 0.15) !important;
\t\t\t\ttransform: rotate(90deg) !important;
\t\t\t}
\t\t\t.flash-message .btn-close:hover::before {
\t\t\t\ttransform: translate(-50%, -50%) rotate(-90deg) !important;
\t\t\t}
\t\t\t@keyframes slideInDownFlash {
\t\t\t\tfrom {
\t\t\t\t\topacity: 0;
\t\t\t\t\ttransform: translateY(-30px) scale(0.95);
\t\t\t\t}
\t\t\t\tto {
\t\t\t\t\topacity: 1;
\t\t\t\t\ttransform: translateY(0) scale(1);
\t\t\t\t}
\t\t\t}
\t\t\t#flash-messages-container {
\t\t\t\tmargin-top: 20px;
\t\t\t\tmargin-bottom: 0;
\t\t\t}
\t\t\t@media(max-width: 768px) {
\t\t\t\t.flash-message {
\t\t\t\t\tpadding: 14px 16px !important;
\t\t\t\t\tfont-size: 0.9rem;
\t\t\t\t}
\t\t\t\t.flash-message i {
\t\t\t\t\tfont-size: 1.2rem !important;
\t\t\t\t}
\t\t\t}
\t\t\t/* Styles pour l'icône de comparaison */
\t\t\t.comparison-icon {
\t\t\t\tposition: relative;
\t\t\t\tdisplay: inline-block;
\t\t\t\tcolor: #333;
\t\t\t\ttext-decoration: none;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.comparison-icon:hover {
\t\t\t\tcolor: #ffa200;
\t\t\t}
\t\t\t.comparison-badge {
\t\t\t\tposition: absolute;
\t\t\t\ttop: -4px;
\t\t\t\tright: -2px;
\t\t\t\tbackground: #095ad3 !important;
\t\t\t\tcolor: white !important;
\t\t\t\tborder-radius: 50%;
\t\t\t\twidth: 18px;
\t\t\t\theight: 18px;
\t\t\t\tfont-size: 8px !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tfont-weight: bold !important;
\t\t\t\tanimation: pulse 2s infinite;
\t\t\t\tz-index: 10;
\t\t\t\tline-height: 1 !important;
\t\t\t}
\t\t\t/* Correction de l'alignement des boutons actifs dans prd-bottom */
\t\t\t/* Ne s'applique qu'aux boutons actifs pour éviter de casser le comportement hover */
\t\t\t.single-product .product-details .prd-bottom .social-info.active {
\t\t\t\tvertical-align: middle !important;
\t\t\t\tposition: relative !important;
\t\t\t\ttop: 0 !important;
\t\t\t\ttransform: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tline-height: normal !important;
\t\t\t\twidth: 35px !important;
\t\t\t\theight: auto !important;
\t\t\t\tmin-height: auto !important;
\t\t\t\tmax-height: none !important;
\t\t\t}
\t\t\t.single-product .product-details .prd-bottom .social-info.wishlist-btn.active,
\t\t\t.single-product .product-details .prd-bottom .social-info.comparison-btn.active {
\t\t\t\tvertical-align: middle !important;
\t\t\t\tposition: relative !important;
\t\t\t\ttop: 0 !important;
\t\t\t\ttransform: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tline-height: normal !important;
\t\t\t\twidth: 35px !important;
\t\t\t\theight: auto !important;
\t\t\t\tmin-height: auto !important;
\t\t\t\tmax-height: none !important;
\t\t\t}
\t\t\t.single-product .product-details .prd-bottom .social-info.active .hover-text {
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tline-height: normal !important;
\t\t\t\tposition: absolute !important;
\t\t\t\ttop: 0 !important;
\t\t\t\tbackground: #ffa200 !important;
\t\t\t\tleft: -40px !important;
\t\t\t}
\t\t\t/* S'assurer qu'aucune marge supplémentaire n'est ajoutée quand un bouton est actif */
\t\t\t.single-product .product-details .prd-bottom .social-info.active span,
\t\t\t.single-product .product-details .prd-bottom .social-info.active p {
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t/* Empêcher le hover de changer la largeur quand le bouton est actif */
\t\t\t.single-product .product-details .prd-bottom .social-info.active:hover {
\t\t\t\twidth: 35px !important;
\t\t\t}
\t\t\t.comparison-icon:hover .comparison-badge {
\t\t\t\tanimation: none;
\t\t\t}
\t\t\t/* Styles pour les mega-menus - style comme la barre de recherche */
\t\t\t.mega-menu {
\t\t\t\twidth: 100%;
\t\t\t\tmax-width: 1200px;
\t\t\t\tleft: 50%;
\t\t\t\ttransform: translateX(-50%);
\t\t\t\tpadding: 25px;
\t\t\t\tborder-radius: 12px;
\t\t\t\tbox-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
\t\t\t\tborder: none;
\t\t\t\tbackground: white;
\t\t\t\tdisplay: none;
\t\t\t\tposition: absolute;
\t\t\t\ttop: 100%;
\t\t\t\tz-index: 9999 !important;
\t\t\t\tmargin-top: 10px;
\t\t\t\topacity: 0;
\t\t\t\tvisibility: hidden;
\t\t\t\ttransition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;
\t\t\t}
\t\t\t.mega-menu.active {
\t\t\t\tdisplay: block;
\t\t\t\topacity: 1;
\t\t\t\tvisibility: visible;
\t\t\t\ttransform: translateX(-50%) translateY(0);
\t\t\t}
\t\t\t.nav-item.dropdown {
\t\t\t\tposition: relative !important;
\t\t\t}
\t\t\t@media(min-width: 768px) {
\t\t\t\t.nav-item.dropdown {
\t\t\t\t\tposition: relative !important;
\t\t\t\t}
\t\t\t\t.mega-menu {
\t\t\t\t\tposition: absolute !important;
\t\t\t\t\tleft: 50% !important;
\t\t\t\t\ttransform: translateX(-50%) !important;
\t\t\t\t\twidth: auto !important;
\t\t\t\t\tmin-width: 600px !important;
\t\t\t\t}
\t\t\t}
\t\t\t/* Correction supplémentaire pour l'affichage sur la page d'accueil */
\t\t\tbody.home .nav-item.dropdown,
\t\t\t.nav-item.dropdown {
\t\t\t\tposition: relative !important;
\t\t\t}
\t\t\tbody.home .mega-menu,
\t\t\t.mega-menu {
\t\t\t\tposition: absolute !important;
\t\t\t\tleft: 50% !important;
\t\t\t\ttransform: translateX(-50%) translateY(0) !important;
\t\t\t\twidth: auto !important;
\t\t\t\tmin-width: 600px !important;
\t\t\t\tmax-width: 90% !important;
\t\t\t\ttop: 100% !important;
\t\t\t\tmargin-top: 10px !important;
\t\t\t}
\t\t\t/* Assurer que les mega-menus sont toujours visibles au survol */
\t\t\t.nav-item.dropdown:hover .mega-menu {
\t\t\t\topacity: 1 !important;
\t\t\t\tvisibility: visible !important;
\t\t\t\tdisplay: block !important;
\t\t\t\ttransform: translateX(-50%) translateY(0) !important;
\t\t\t}
\t\t\t.mega-menu .dropdown-item {
\t\t\t\tpadding: 0;
\t\t\t\tborder: none;
\t\t\t}
\t\t\t.mega-menu .dropdown-header {
\t\t\t\tfont-weight: 700;
\t\t\t\tcolor: #2c3e50;
\t\t\t\tmargin-bottom: 18px;
\t\t\t\tpadding-bottom: 10px;
\t\t\t\tborder-bottom: 3px solid #3498db;
\t\t\t\tfont-size: 16px;
\t\t\t\ttext-transform: uppercase;
\t\t\t\tletter-spacing: 0.5px;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a {
\t\t\t\tdisplay: block;
\t\t\t\tpadding: 10px 15px;
\t\t\t\tcolor: #555;
\t\t\t\ttext-decoration: none;
\t\t\t\tborder-radius: 6px;
\t\t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t\tposition: relative;
\t\t\t\toverflow: hidden;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a::before {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\ttop: 0;
\t\t\t\tleft: -100%;
\t\t\t\twidth: 100%;
\t\t\t\theight: 100%;
\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(52, 152, 219, 0.1), transparent);
\t\t\t\ttransition: left 0.5s;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a:hover::before {
\t\t\t\tleft: 100%;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a:hover {
\t\t\t\tbackground: linear-gradient(135deg, #f8f9fa, #e3f2fd);
\t\t\t\tcolor: #2980b9;
\t\t\t\ttransform: translateX(8px);
\t\t\t\tbox-shadow: 0 2px 8px rgba(52, 152, 219, 0.2);
\t\t\t}
\t\t\t.mega-menu .dropdown-item a i {
\t\t\t\twidth: 22px;
\t\t\t\ttext-align: center;
\t\t\t\tmargin-right: 8px;
\t\t\t\tcolor: #3498db;
\t\t\t\ttransition: color 0.3s ease;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a:hover i {
\t\t\t\tcolor: #2980b9;
\t\t\t}
\t\t\t/* Animation d'apparition améliorée */
\t\t\t@keyframes slideInDown {
\t\t\t\tfrom {
\t\t\t\t\topacity: 0;
\t\t\t\t\ttransform: translateY(-20px);
\t\t\t\t}
\t\t\t\tto {
\t\t\t\t\topacity: 1;
\t\t\t\t\ttransform: translateY(0);
\t\t\t\t}
\t\t\t}
\t\t\t.mega-menu {
\t\t\t\tanimation: slideInDown 0.4s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t}
\t\t\t/* Effet de survol sur le lien principal */
\t\t\t.nav-item.dropdown .nav-link {
\t\t\t\tposition: relative;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.nav-item.dropdown .nav-link::after {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\tbottom: -2px;
\t\t\t\tleft: 50%;
\t\t\t\twidth: 0;
\t\t\t\theight: 2px;
\t\t\t\tbackground: linear-gradient(90deg, #3498db, #2980b9);
\t\t\t\ttransition: all 0.3s ease;
\t\t\t\ttransform: translateX(-50%);
\t\t\t}
\t\t\t.nav-item.dropdown:hover .nav-link::after {
\t\t\t\twidth: 100%;
\t\t\t}
\t\t\t.nav-item.dropdown:hover .nav-link {
\t\t\t\tcolor: #2980b9;
\t\t\t}
\t\t\t@keyframes fadeInDown {
\t\t\t\tfrom {
\t\t\t\t\topacity: 0;
\t\t\t\t\ttransform: translateY(-10px);
\t\t\t\t}
\t\t\t\tto {
\t\t\t\t\topacity: 1;
\t\t\t\t\ttransform: translateY(0);
\t\t\t\t}
\t\t\t}
\t\t\t/* Responsive */
\t\t\t@media(max-width: 768px) {
\t\t\t\t.mega-menu {
\t\t\t\t\twidth: 100%;
\t\t\t\t\tleft: 0;
\t\t\t\t\tpadding: 15px;
\t\t\t\t}
\t\t\t\t.mega-menu .row {
\t\t\t\t\tmargin: 0;
\t\t\t\t}
\t\t\t\t.mega-menu .col-md-3 {
\t\t\t\t\tmargin-bottom: 20px;
\t\t\t\t}
\t\t\t}
\t\t\t/* ============================================
\t\t\t.footer-area {
\t\t\t\tbackground: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
\t\t\t\tposition: relative;
\t\t\t\toverflow: hidden;
\t\t\t\tpadding: 50px 0 20px;
\t\t\t}
\t\t\t.footer-pattern {
\t\t\t\tposition: absolute;
\t\t\t\ttop: 0;
\t\t\t\tleft: 0;
\t\t\t\tright: 0;
\t\t\t\tbottom: 0;
\t\t\t\tbackground-image: radial-gradient(circle at 20% 50%, rgba(255, 162, 0, 0.1) 0%, transparent 50%), radial-gradient(circle at 80% 80%, rgba(255, 162, 0, 0.08) 0%, transparent 50%);
\t\t\t\tpointer-events: none;
\t\t\t}
\t\t\t.footer-area .container {
\t\t\t\tposition: relative;
\t\t\t\tz-index: 1;
\t\t\t}
\t\t\t/* Widgets */
\t\t\t.single-footer-widget {
\t\t\t\tcolor: rgba(255, 255, 255, 0.9);
\t\t\t}
\t\t\t.footer-brand {
\t\t\t\tfont-size: 1.6rem;
\t\t\t\tfont-weight: 700;
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
\t\t\t\t-webkit-background-clip: text;
\t\t\t\t-webkit-text-fill-color: transparent;
\t\t\t\tbackground-clip: text;
\t\t\t\tmargin-bottom: 12px;
\t\t\t\tdisplay: inline-block;
\t\t\t}
\t\t\t.footer-widget-title {
\t\t\t\tcolor: #fff;
\t\t\t\tfont-size: 1rem;
\t\t\t\tfont-weight: 600;
\t\t\t\tmargin-bottom: 18px;
\t\t\t\tposition: relative;
\t\t\t\tpadding-bottom: 8px;
\t\t\t}
\t\t\t.footer-widget-title::after {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\tbottom: 0;
\t\t\t\tleft: 0;
\t\t\t\twidth: 40px;
\t\t\t\theight: 3px;
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
\t\t\t\tborder-radius: 2px;
\t\t\t}
\t\t\t.footer-description {
\t\t\t\tcolor: rgba(255, 255, 255, 0.7);
\t\t\t\tline-height: 1.6;
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tmargin-bottom: 0;
\t\t\t}
\t\t\t/* Liste de liens */
\t\t\t.footer-list {
\t\t\t\tlist-style: none;
\t\t\t\tpadding: 0;
\t\t\t\tmargin: 0;
\t\t\t}
\t\t\t.footer-list li {
\t\t\t\tmargin-bottom: 10px;
\t\t\t}
\t\t\t.footer-list li a {
\t\t\t\tcolor: rgba(255, 255, 255, 0.7);
\t\t\t\ttext-decoration: none;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tdisplay: inline-flex;
\t\t\t\talign-items: center;
\t\t\t}
\t\t\t.footer-list li a i {
\t\t\t\tfont-size: 0.8rem;
\t\t\t\topacity: 0.6;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.footer-list li a:hover {
\t\t\t\tcolor: #ffa200;
\t\t\t\ttransform: translateX(5px);
\t\t\t}
\t\t\t.footer-list li a:hover i {
\t\t\t\topacity: 1;
\t\t\t\tcolor: #ffa200;
\t\t\t}
\t\t\t/* Newsletter */
\t\t\t.footer-newsletter-text {
\t\t\t\tcolor: rgba(255, 255, 255, 0.7);
\t\t\t\tfont-size: 0.85rem;
\t\t\t\tmargin-bottom: 15px;
\t\t\t\tline-height: 1.5;
\t\t\t}
\t\t\t.footer-newsletter-wrapper {
\t\t\t\tmargin-bottom: 15px;
\t\t\t}
\t\t\t.newsletter-input-group {
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tbackground: rgba(255, 255, 255, 0.08);
\t\t\t\tborder-radius: 30px;
\t\t\t\tpadding: 4px 4px 4px 15px;
\t\t\t\tbackdrop-filter: blur(10px);
\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);
\t\t\t\ttransition: all 0.3s ease;
\t\t\t\tgap: 8px;
\t\t\t}
\t\t\t.newsletter-input-group:focus-within {
\t\t\t\tbackground: rgba(255, 255, 255, 0.12);
\t\t\t\tborder-color: rgba(255, 162, 0, 0.6);
\t\t\t\tbox-shadow: 0 0 0 2px rgba(255, 162, 0, 0.15);
\t\t\t}
\t\t\t.newsletter-icon {
\t\t\t\tcolor: rgba(255, 255, 255, 0.5);
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tflex-shrink: 0;
\t\t\t}
\t\t\t.newsletter-input-group:focus-within .newsletter-icon {
\t\t\t\tcolor: #ffa200;
\t\t\t}
\t\t\t.newsletter-input {
\t\t\t\tflex: 1;
\t\t\t\tbackground: transparent;
\t\t\t\tborder: none;
\t\t\t\tcolor: #fff;
\t\t\t\tpadding: 10px 8px;
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tmin-width: 0;
\t\t\t}
\t\t\t.newsletter-input::placeholder {
\t\t\t\tcolor: rgba(255, 255, 255, 0.4);
\t\t\t\tfont-size: 0.85rem;
\t\t\t}
\t\t\t.newsletter-input:focus {
\t\t\t\toutline: none;
\t\t\t\tbox-shadow: none;
\t\t\t}
\t\t\t.newsletter-btn {
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
\t\t\t\tborder: none;
\t\t\t\tcolor: white;
\t\t\t\twidth: 42px;
\t\t\t\theight: 42px;
\t\t\t\tmin-width: 42px;
\t\t\t\tmin-height: 42px;
\t\t\t\tborder-radius: 50%;
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tjustify-content: center;
\t\t\t\tcursor: pointer;
\t\t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t\tflex-shrink: 0;
\t\t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4), 0 0 0 0 rgba(255, 162, 0, 0.4);
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tposition: relative;
\t\t\t\toverflow: hidden;
\t\t\t}
\t\t\t.newsletter-btn::before {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\ttop: 50%;
\t\t\t\tleft: 50%;
\t\t\t\twidth: 0;
\t\t\t\theight: 0;
\t\t\t\tborder-radius: 50%;
\t\t\t\tbackground: rgba(255, 255, 255, 0.3);
\t\t\t\ttransform: translate(-50%, -50%);
\t\t\t\ttransition: width 0.6s ease, height 0.6s ease;
\t\t\t}
\t\t\t.newsletter-btn:hover::before {
\t\t\t\twidth: 100%;
\t\t\t\theight: 100%;
\t\t\t}
\t\t\t.newsletter-btn:hover {
\t\t\t\ttransform: translateX(3px) scale(1.05);
\t\t\t\tbox-shadow: 0 6px 20px rgba(255, 162, 0, 0.5), 0 0 0 8px rgba(255, 162, 0, 0.1);
\t\t\t\tbackground: linear-gradient(135deg, #e8910a 0%, #ffa200 100%);
\t\t\t}
\t\t\t.newsletter-btn:active {
\t\t\t\ttransform: translateX(3px) scale(0.98);
\t\t\t\tbox-shadow: 0 3px 10px rgba(255, 162, 0, 0.4);
\t\t\t}
\t\t\t.newsletter-btn:focus {
\t\t\t\toutline: none;
\t\t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4), 0 0 0 3px rgba(255, 162, 0, 0.3);
\t\t\t}
\t\t\t.newsletter-btn-icon,
\t\t\t.newsletter-btn-loader {
\t\t\t\tposition: relative;
\t\t\t\tz-index: 2;
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tjustify-content: center;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.newsletter-btn:hover .newsletter-btn-icon {
\t\t\t\ttransform: translateX(2px) rotate(-10deg);
\t\t\t}
\t\t\t.newsletter-btn.loading .newsletter-btn-icon {
\t\t\t\topacity: 0;
\t\t\t\ttransform: scale(0);
\t\t\t}
\t\t\t.newsletter-btn.loading .newsletter-btn-loader {
\t\t\t\tdisplay: flex !important;
\t\t\t}
\t\t\t.newsletter-btn.success {
\t\t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
\t\t\t\tbox-shadow: 0 4px 15px rgba(40, 167, 69, 0.4);
\t\t\t}
\t\t\t.newsletter-btn.success .newsletter-btn-icon i::before {
\t\t\t\tcontent: \"\\f00c\";
\t\t\t}
\t\t\t/* Trust badges */
\t\t\t.footer-trust-badges {
\t\t\t\tdisplay: flex;
\t\t\t\tflex-direction: row;
\t\t\t\tgap: 15px;
\t\t\t\tflex-wrap: wrap;
\t\t\t}
\t\t\t.trust-item {
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tgap: 6px;
\t\t\t\tcolor: rgba(255, 255, 255, 0.6);
\t\t\t\tfont-size: 0.8rem;
\t\t\t}
\t\t\t.trust-item i {
\t\t\t\tcolor: #ffa200;
\t\t\t\tfont-size: 0.9rem;
\t\t\t}
\t\t\t/* Social icons */
\t\t\t.footer-social {
\t\t\t\tmargin-top: 0 !important;
\t\t\t\tposition: relative !important;
\t\t\t\twidth: 100% !important;
\t\t\t\tclear: both !important;
\t\t\t\tfloat: none !important;
\t\t\t}
\t\t\t.footer-social h6 {
\t\t\t\tcolor: #fff;
\t\t\t\tfont-size: 0.95rem;
\t\t\t\tfont-weight: 600;
\t\t\t\tmargin-bottom: 12px !important;
\t\t\t\tdisplay: block !important;
\t\t\t\twidth: 100% !important;
\t\t\t\tposition: relative !important;
\t\t\t\tclear: both !important;
\t\t\t\tfloat: none !important;
\t\t\t}
\t\t\t.footer-social-icons {
\t\t\t\tdisplay: flex !important;
\t\t\t\tgap: 12px !important;
\t\t\t\tflex-wrap: wrap !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: flex-start !important;
\t\t\t\twidth: 100% !important;
\t\t\t\tposition: relative !important;
\t\t\t\tclear: both !important;
\t\t\t\tfloat: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t.social-icon {
\t\t\t\twidth: 38px !important;
\t\t\t\theight: 38px !important;
\t\t\t\tmin-width: 38px !important;
\t\t\t\tmin-height: 38px !important;
\t\t\t\tdisplay: inline-flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tbackground: rgba(255, 255, 255, 0.1) !important;
\t\t\t\tborder-radius: 50% !important;
\t\t\t\tcolor: rgba(255, 255, 255, 0.8) !important;
\t\t\t\ttext-decoration: none !important;
\t\t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
\t\t\t\tfont-size: 16px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tbackdrop-filter: blur(10px) !important;
\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1) !important;
\t\t\t\tflex-shrink: 0 !important;
\t\t\t\tposition: relative !important;
\t\t\t\tfloat: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tvertical-align: middle !important;
\t\t\t}
\t\t\t.social-icon i {
\t\t\t\tfont-size: 16px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\ttransition: transform 0.3s ease !important;
\t\t\t\tposition: relative !important;
\t\t\t\tz-index: 1 !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t.social-icon:hover {
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%) !important;
\t\t\t\ttransform: translateY(-5px) scale(1.1) !important;
\t\t\t\tcolor: white !important;
\t\t\t\tborder-color: transparent !important;
\t\t\t\tbox-shadow: 0 8px 20px rgba(255, 162, 0, 0.4) !important;
\t\t\t}
\t\t\t.social-icon:hover i {
\t\t\t\ttransform: scale(1.1) !important;
\t\t\t}
\t\t\t/* Footer divider */
\t\t\t.footer-divider {
\t\t\t\theight: 1px;
\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
\t\t\t\tmargin: 30px 0 20px;
\t\t\t}
\t\t\t/* Footer bottom */
\t\t\t.footer-bottom {
\t\t\t\tpadding-top: 15px;
\t\t\t}
\t\t\t.footer-text {
\t\t\t\tcolor: rgba(255, 255, 255, 0.6);
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tmargin: 0;
\t\t\t\ttext-align: center;
\t\t\t}
\t\t\t/* Responsive */
\t\t\t@media(max-width: 991.98px) {
\t\t\t\t.footer-area {
\t\t\t\t\tpadding: 40px 0 20px;
\t\t\t\t}
\t\t\t\t.single-footer-widget {
\t\t\t\t\tmargin-bottom: 30px;
\t\t\t\t}
\t\t\t\t.footer-social {
\t\t\t\t\tmargin-top: 15px;
\t\t\t\t}
\t\t\t}
\t\t\t@media(max-width: 767.98px) {
\t\t\t\t.footer-area {
\t\t\t\t\tpadding: 35px 0 18px;
\t\t\t\t}
\t\t\t\t.footer-brand {
\t\t\t\t\tfont-size: 1.4rem;
\t\t\t\t}
\t\t\t\t.footer-widget-title {
\t\t\t\t\tfont-size: 0.95rem;
\t\t\t\t}
\t\t\t\t.newsletter-input-group {
\t\t\t\t\tpadding: 3px 3px 3px 12px;
\t\t\t\t}
\t\t\t\t.newsletter-input {
\t\t\t\t\tpadding: 8px 6px;
\t\t\t\t\tfont-size: 0.85rem;
\t\t\t\t}
\t\t\t\t.newsletter-btn {
\t\t\t\t\twidth: 38px;
\t\t\t\t\theight: 38px;
\t\t\t\t\tmin-width: 38px;
\t\t\t\t\tmin-height: 38px;
\t\t\t\t\tfont-size: 0.85rem;
\t\t\t\t}
\t\t\t\t.footer-trust-badges {
\t\t\t\t\tflex-direction: row;
\t\t\t\t\tflex-wrap: wrap;
\t\t\t\t\tjustify-content: flex-start;
\t\t\t\t\tgap: 12px;
\t\t\t\t}
\t\t\t}
\t\t\t@media(max-width: 575.98px) {
\t\t\t\t.footer-area {
\t\t\t\t\tpadding: 40px 0 20px;
\t\t\t\t}
\t\t\t\t.footer-brand {
\t\t\t\t\tfont-size: 1.3rem;
\t\t\t\t}
\t\t\t\t.social-icon {
\t\t\t\t\twidth: 38px;
\t\t\t\t\theight: 38px;
\t\t\t\t\tfont-size: 16px;
\t\t\t\t}
\t\t\t\t.social-icon i {
\t\t\t\t\tfont-size: 16px;
\t\t\t\t}
\t\t\t}
\t\t</style>
\t\t";
// line 1236
yield from $this->unwrap()->yieldBlock('stylesheets', $context, $blocks);
// line 1239
yield "
\t\t<!-- Script pour forcer l'application des styles CSS après chargement -->
\t\t<script>
\t\t\tdocument.addEventListener('DOMContentLoaded', function () { // Forcer le masquage du toggle sur grands écrans
if (window.innerWidth >= 992) {
const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
togglers.forEach(function (toggler) {
if (toggler) {
toggler.style.display = 'none';
toggler.style.visibility = 'hidden';
toggler.style.opacity = '0';
toggler.style.width = '0';
toggler.style.height = '0';
toggler.style.padding = '0';
toggler.style.margin = '0';
toggler.style.border = 'none';
toggler.style.position = 'absolute';
toggler.style.left = '-9999px';
}
});
const iconBars = document.querySelectorAll('.navbar-toggler .icon-bar, .header_area .navbar .navbar-toggler .icon-bar, .navbar-toggler-icon');
iconBars.forEach(function (bar) {
if (bar) {
bar.style.display = 'none';
bar.style.visibility = 'hidden';
}
});
}
// Alignement des icônes navbar sur mobile
const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
navbarRight.forEach(function (nav) {
if (nav && window.innerWidth<= 991.98) {
// Mobile: colonne avec icônes alignées horizontalement
nav.style.display = 'flex';
nav.style.flexDirection = 'column';
nav.style.alignItems = 'center';
nav.style.textAlign = 'center';
// Le container d'icônes reste horizontal
const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
if (iconsContainer) {
iconsContainer.style.display = 'flex';
iconsContainer.style.flexDirection = 'row';
iconsContainer.style.justifyContent = 'center';
}
// Le bouton compte en bas
const accountBtn = nav.querySelector('li:last-child');
if (accountBtn) {
accountBtn.style.width = '100%';
accountBtn.style.display = 'flex';
accountBtn.style.justifyContent = 'center';
accountBtn.style.marginTop = '12px';
accountBtn.style.paddingTop = '12px';
accountBtn.style.borderTop = '1px solid #e0e0e0';
}
} else if (nav && window.innerWidth> 991.98) { // Desktop: alignement horizontal normal
nav.style.display = 'flex';
nav.style.flexDirection = 'row';
nav.style.alignItems = 'center';
nav.style.justifyContent = 'flex-end';
}
});
});
// Réappliquer lors du redimensionnement
window.addEventListener('resize', function () {
if (window.innerWidth >= 992) {
const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
togglers.forEach(function (toggler) {
if (toggler) {
toggler.style.display = 'none';
toggler.style.visibility = 'hidden';
}
});
}
// Réappliquer l'alignement des icônes navbar
const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
navbarRight.forEach(function (nav) {
if (nav && window.innerWidth<= 991.98) {
// Mobile: colonne avec icônes alignées horizontalement
nav.style.display = 'flex';
nav.style.flexDirection = 'column';
nav.style.alignItems = 'center';
nav.style.textAlign = 'center';
// Le container d'icônes reste horizontal
const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
if (iconsContainer) {
iconsContainer.style.display = 'flex';
iconsContainer.style.flexDirection = 'row';
iconsContainer.style.justifyContent = 'center';
}
const accountBtn = nav.querySelector('li:last-child');
if (accountBtn) {
accountBtn.style.width = '100%';
accountBtn.style.display = 'flex';
accountBtn.style.justifyContent = 'center';
accountBtn.style.marginTop = '12px';
accountBtn.style.paddingTop = '12px';
accountBtn.style.borderTop = '1px solid #e0e0e0';
}
} else if (nav && window.innerWidth> 991.98) { // Desktop: alignement horizontal normal
nav.style.display = 'flex';
nav.style.flexDirection = 'row';
nav.style.alignItems = 'center';
nav.style.justifyContent = 'flex-end';
}
});
});
\t\t</script>
\t</head>
\t<body
\t\t";
// line 1357
if ((array_key_exists("current_menu", $context) && (($context["current_menu"] ?? null) == "listing"))) {
yield " id=\"category\" ";
}
yield ">
\t\t<!-- Start Header Area -->
\t\t<header class=\"header_area sticky-header\">
\t\t\t<div class=\"main_menu\">
\t\t\t\t<nav class=\"navbar navbar-expand-lg navbar-light main_box\">
\t\t\t\t\t<div
\t\t\t\t\t\tclass=\"container\">
\t\t\t\t\t\t<!-- Brand and toggle get grouped for better mobile display -->
\t\t\t\t\t\t<a class=\"navbar-brand logo_h\" href=\"";
// line 1366
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_home");
yield "\"><img style=\"width: auto;height: 60px\" src=\"";
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("logo.png"), "html", null, true);
yield "\" alt=\"\"></a>
\t\t\t\t\t\t<button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">
\t\t\t\t\t\t\t<span class=\"icon-bar\"></span>
\t\t\t\t\t\t\t<span class=\"icon-bar\"></span>
\t\t\t\t\t\t\t<span class=\"icon-bar\"></span>
\t\t\t\t\t\t</button>
\t\t\t\t\t\t<!-- Collect the nav links, forms, and other content for toggling -->
\t\t\t\t\t\t<div class=\"collapse navbar-collapse offset\" id=\"navbarSupportedContent\">
\t\t\t\t\t\t\t<ul class=\"nav navbar-nav menu_nav ml-auto\">
\t\t\t\t\t\t\t\t<li class=\"nav-item ";
// line 1375
if ((array_key_exists("current_menu", $context) && (($context["current_menu"] ?? null) == " home"))) {
yield "active";
}
yield "\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"";
// line 1376
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_home");
yield "\">Accueil</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item ";
// line 1378
if ((array_key_exists("current_menu", $context) && (($context["current_menu"] ?? null) == " shops"))) {
yield "active";
}
yield "\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"";
// line 1379
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shops_list");
yield "\">Boutiques</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item ";
// line 1381
if ((array_key_exists("current_menu", $context) && (($context["current_menu"] ?? null) == " listing"))) {
yield "active";
}
yield "\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"";
// line 1382
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "\">Produits</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item ";
// line 1384
if ((array_key_exists("current_menu", $context) && (($context["current_menu"] ?? null) == " contact"))) {
yield "active";
}
yield "\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"";
// line 1385
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_contact");
yield "\">Contact</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t\t<ul class=\"nav navbar-nav navbar-right\">
\t\t\t\t\t\t\t\t<li class=\"nav-item\">
\t\t\t\t\t\t\t\t\t<div class=\"navbar-icons-wrapper\">
\t\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1391
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_cart");
yield "\" class=\"cart ";
if ((array_key_exists("current_menu", $context) && (($context["current_menu"] ?? null) == " cart"))) {
yield "active";
}
yield "\" aria-label=\"Panier\">
\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t\t";
// line 1394
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 1394)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 1395
yield "\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("notifications_list");
yield "\" class=\"notification-icon\" title=\"Notifications\" aria-label=\"Notifications\">
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bell\"></span>
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"notification-badge text-white\" id=\"notificationBadge\" style=\"display: none;color: white;\">0</span>
\t\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1399
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_comparison");
yield "\" class=\"comparison-icon\" title=\"Comparaison\" aria-label=\"Comparaison\">
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-sync\"></span>
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"comparison-badge text-white\" id=\"comparisonBadge\" style=\"display: none;color: white;\">0</span>
\t\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t\t";
}
// line 1404
yield "\t\t\t\t\t\t\t\t\t\t<button class=\"search\" type=\"button\" aria-label=\"Recherche\">
\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-magnifier\" id=\"search\"></span>
\t\t\t\t\t\t\t\t\t\t</button>
\t\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item\">
\t\t\t\t\t\t\t\t\t";
// line 1410
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 1410)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 1411
yield "\t\t\t\t\t\t\t\t\t\t<a class=\"nav-link btn btn-primary btn-account text-white\" href=\"";
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_account_index");
yield "\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"ti-user\"></i>
\t\t\t\t\t\t\t\t\t\t\tMon compte
\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t";
} else {
// line 1416
yield "\t\t\t\t\t\t\t\t\t\t<a class=\"nav-link btn btn-primary btn-account text-white\" href=\"";
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
yield "\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"ti-lock\"></i>
\t\t\t\t\t\t\t\t\t\t\tSe connecter
\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t";
}
// line 1421
yield "\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t</nav>
\t\t\t</div>
\t\t\t<div class=\"search_input\" id=\"search_input_box\">
\t\t\t\t<div class=\"container\">
\t\t\t\t\t<form class=\"d-flex justify-content-between\" id=\"search_form\" action=\"";
// line 1429
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "\" method=\"get\">
\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" id=\"search_input\" name=\"q\" placeholder=\"Rechercher un produit, une boutique, une catégorie...\" autocomplete=\"off\" value=\"";
// line 1430
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "request", [], "any", false, false, false, 1430), "query", [], "any", false, false, false, 1430), "get", ["q", ""], "method", false, false, false, 1430), "html", null, true);
yield "\">
\t\t\t\t\t\t<button type=\"button\" class=\"btn\" id=\"search_submit_btn\">
\t\t\t\t\t\t\t<i class=\"lnr lnr-magnifier\"></i>
\t\t\t\t\t\t</button>
\t\t\t\t\t\t";
// line 1434
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "request", [], "any", false, false, false, 1434), "query", [], "any", false, false, false, 1434), "get", ["q"], "method", false, false, false, 1434)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 1435
yield "\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-clear-search\" id=\"clear_search_btn\" title=\"Effacer la recherche\">
\t\t\t\t\t\t\t\t<i class=\"lnr lnr-cross\"></i>
\t\t\t\t\t\t\t</button>
\t\t\t\t\t\t";
}
// line 1439
yield "\t\t\t\t\t\t<span class=\"lnr lnr-cross\" id=\"close_search\" title=\"Fermer la recherche\"></span>
\t\t\t\t\t</form>
\t\t\t\t\t<div id=\"search_results\" class=\"search-results-container\"></div>
\t\t\t\t</div>
\t\t\t</div>
\t\t</header>
\t\t<!-- End Header Area -->
\t\t<!-- Flash Messages -->
\t\t<div class=\"container mt-3\" id=\"flash-messages-container\" style=\"position: relative; z-index: 1050;\">
\t\t\t<div class=\"row\">
\t\t\t\t<div class=\"col-12\">
\t\t\t\t\t";
// line 1451
$context['_parent'] = $context;
$context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "flashes", ["success"], "method", false, false, false, 1451));
foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
// line 1452
yield "\t\t\t\t\t\t<div class=\"alert alert-success alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-check-circle\"></i>
\t\t\t\t\t\t\t<strong>";
// line 1454
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html", null, true);
yield "</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t";
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 1458
yield "
\t\t\t\t\t";
// line 1459
$context['_parent'] = $context;
$context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "flashes", ["error"], "method", false, false, false, 1459));
foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
// line 1460
yield "\t\t\t\t\t\t<div class=\"alert alert-danger alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-exclamation-circle\"></i>
\t\t\t\t\t\t\t<strong>";
// line 1462
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html", null, true);
yield "</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t";
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 1466
yield "
\t\t\t\t\t";
// line 1467
$context['_parent'] = $context;
$context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "flashes", ["warning"], "method", false, false, false, 1467));
foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
// line 1468
yield "\t\t\t\t\t\t<div class=\"alert alert-warning alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-exclamation-triangle\"></i>
\t\t\t\t\t\t\t<strong>";
// line 1470
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html", null, true);
yield "</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t";
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 1474
yield "
\t\t\t\t\t";
// line 1475
$context['_parent'] = $context;
$context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "flashes", ["info"], "method", false, false, false, 1475));
foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
// line 1476
yield "\t\t\t\t\t\t<div class=\"alert alert-info alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-info-circle\"></i>
\t\t\t\t\t\t\t<strong>";
// line 1478
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html", null, true);
yield "</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t";
}
$_parent = $context['_parent'];
unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
$context = array_intersect_key($context, $_parent) + $_parent;
// line 1482
yield "\t\t\t\t</div>
\t\t\t</div>
\t\t</div>
\t\t";
// line 1486
yield from $this->unwrap()->yieldBlock('body', $context, $blocks);
// line 1487
yield "
\t\t<!-- start footer Area -->
\t\t<footer class=\"footer-area section_gap\">
\t\t\t<div class=\"footer-pattern\"></div>
\t\t\t<div class=\"container\">
\t\t\t\t<div class=\"row\">
\t\t\t\t\t<div class=\"col-lg-3 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<div class=\"footer-logo mb-3\">
\t\t\t\t\t\t\t\t<h4 class=\"footer-brand\">MaketOu</h4>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t<p class=\"footer-description\">
\t\t\t\t\t\t\t\tMaketOu est la première marketplace haïtienne qui connecte les acheteurs et les vendeurs.
\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t Nous offrons une plateforme sécurisée et moderne pour le commerce en ligne en Haïti.
\t\t\t\t\t\t\t</p>
\t\t\t\t\t\t\t<div class=\"footer-social mt-3\">
\t\t\t\t\t\t\t\t<h6 class=\"mb-2\">Suivez-nous</h6>
\t\t\t\t\t\t\t\t<div class=\"footer-social-icons\">
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"Facebook\" title=\"Facebook\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-facebook\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"Twitter\" title=\"Twitter\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-twitter\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"Instagram\" title=\"Instagram\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-instagram\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"LinkedIn\" title=\"LinkedIn\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-linkedin\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Liens rapides</h6>
\t\t\t\t\t\t\t<ul class=\"footer-list\">
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1526
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_home");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Accueil</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1530
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Produits</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1534
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shops_list");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Boutiques</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t";
// line 1537
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 1537)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 1538
yield "\t\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1539
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_account_index");
yield "\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Mon compte</a>
\t\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t";
} else {
// line 1543
yield "\t\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1544
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
yield "\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Se connecter</a>
\t\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1548
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_register");
yield "\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> S'inscrire</a>
\t\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t";
}
// line 1552
yield "\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Pour les vendeurs</h6>
\t\t\t\t\t\t\t<ul class=\"footer-list\">
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1560
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_index");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Ouvrir une boutique</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1564
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_help_how_to_sell");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Comment vendre</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1568
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_help_pricing");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Tarifs</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1572
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_help_support");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Support vendeur</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Support</h6>
\t\t\t\t\t\t\t<ul class=\"footer-list\">
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1583
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_help");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Centre d'Aide</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1587
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_contact");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Contactez-nous</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1591
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_faq");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> FAQ</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1595
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_privacy");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Politique de Confidentialité</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"";
// line 1599
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_terms");
yield "\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Conditions d'Utilisation</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-3 col-md-6 col-sm-6\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Newsletter</h6>
\t\t\t\t\t\t\t<p class=\"footer-newsletter-text\">Restez informé des dernières nouveautés</p>
\t\t\t\t\t\t\t<div class=\"footer-newsletter-wrapper\" id=\"mc_embed_signup\">
\t\t\t\t\t\t\t\t<form action=\"";
// line 1610
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_newsletter_subscribe");
yield "\" method=\"post\" class=\"footer-newsletter-form\">
\t\t\t\t\t\t\t\t\t<div class=\"newsletter-input-group\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-envelope newsletter-icon\"></i>
\t\t\t\t\t\t\t\t\t\t<input class=\"form-control newsletter-input\" name=\"email\" placeholder=\"Votre email\" required type=\"email\">
\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"newsletter-btn\" aria-label=\"S'abonner\">
\t\t\t\t\t\t\t\t\t\t\t<span class=\"newsletter-btn-icon\">
\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-paper-plane\" aria-hidden=\"true\"></i>
\t\t\t\t\t\t\t\t\t\t\t</span>
\t\t\t\t\t\t\t\t\t\t\t<span class=\"newsletter-btn-loader\" style=\"display: none;\">
\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-spinner fa-spin\" aria-hidden=\"true\"></i>
\t\t\t\t\t\t\t\t\t\t\t</span>
\t\t\t\t\t\t\t\t\t\t</button>
\t\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t\t</form>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t<div class=\"footer-trust-badges mt-3\">
\t\t\t\t\t\t\t\t<div class=\"trust-item\">
\t\t\t\t\t\t\t\t\t<i class=\"fa fa-shield\"></i>
\t\t\t\t\t\t\t\t\t<span>Paiement sécurisé</span>
\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t\t<div class=\"trust-item\">
\t\t\t\t\t\t\t\t\t<i class=\"fa fa-truck\"></i>
\t\t\t\t\t\t\t\t\t<span>Livraison rapide</span>
\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t</div>
\t\t\t\t<div class=\"footer-divider\"></div>
\t\t\t\t<div class=\"footer-bottom d-flex justify-content-center align-items-center flex-wrap\">
\t\t\t\t\t<p class=\"footer-text m-0\">
\t\t\t\t\t\tCopyright ©<script>
\t\t\t\t\t\t\tdocument.write(new Date().getFullYear());
\t\t\t\t\t\t</script>
\t\t\t\t\t\tTous droits réservés | Ce site a été fait avec
\t\t\t\t\t\t<i class=\"fa fa-heart-o\" aria-hidden=\"true\" style=\"color: #dc3545;\"></i>
\t\t\t\t\t\tpar
\t\t\t\t\t\t<a href=\"https://tech.foulgor.com\" target=\"_blank\" style=\"color: #ffa200;\">Foulgor Tech</a>
\t\t\t\t\t</p>
\t\t\t\t</div>
\t\t\t</div>
\t\t</footer>
\t\t<style>
\t\t\t.search-results-container {
\t\t\t\tposition: absolute;
\t\t\t\ttop: 100%;
\t\t\t\tleft: 15px;
\t\t\t\tright: 15px;
\t\t\t\tbackground: #fff;
\t\t\t\tborder: 1px solid #ddd;
\t\t\t\tborder-top: none;
\t\t\t\tz-index: 9999;
\t\t\t\tbox-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
\t\t\t\tmax-height: 400px;
\t\t\t\toverflow-y: auto;
\t\t\t\tdisplay: none;
\t\t\t\tborder-radius: 0 0 4px 4px;
\t\t\t}
\t\t\t.search-results-container .list-group-item {
\t\t\t\tborder-left: none;
\t\t\t\tborder-right: none;
\t\t\t\tborder-radius: 0;
\t\t\t\tcursor: pointer;
\t\t\t\tpadding: 12px 15px;
\t\t\t\ttransition: background-color 0.2s ease;
\t\t\t}
\t\t\t.search-results-container .list-group-item:hover {
\t\t\t\tbackground-color: #f8f9fa;
\t\t\t}
\t\t\t.search-results-container .list-group-item i {
\t\t\t\tcolor: #777;
\t\t\t\tfont-size: 1.2rem;
\t\t\t}
\t\t\t/* Ensure container is relative for absolute positioning of results */
\t\t\t#search_input_box .container {
\t\t\t\tposition: relative;
\t\t\t}
\t\t\t#search_input_box .form-control {
\t\t\t\tflex: 1;
\t\t\t\tpadding-right: 10px;
\t\t\t}
\t\t\t#search_input_box #search_submit_btn {
\t\t\t\tbackground: transparent;
\t\t\t\tborder: 0;
\t\t\t\tcolor: #fff;
\t\t\t\tpadding: 0 15px;
\t\t\t\tcursor: pointer;
\t\t\t\ttransition: opacity 0.3s ease;
\t\t\t}
\t\t\t#search_input_box #search_submit_btn:hover {
\t\t\t\topacity: 0.8;
\t\t\t}
\t\t\t#search_input_box .btn-clear-search {
\t\t\t\tbackground: transparent;
\t\t\t\tborder: 0;
\t\t\t\tcolor: #fff;
\t\t\t\tpadding: 0 10px;
\t\t\t\tcursor: pointer;
\t\t\t\ttransition: opacity 0.3s ease;
\t\t\t\tdisplay: none;
\t\t\t}
\t\t\t#search_input_box .btn-clear-search:hover {
\t\t\t\topacity: 0.8;
\t\t\t}
\t\t\t#search_input_box .btn-clear-search i {
\t\t\t\tfont-size: 1.1rem;
\t\t\t}
\t\t\t#search_input_box form {
\t\t\t\tposition: relative;
\t\t\t\talign-items: center;
\t\t\t}
\t\t</style>
\t\t<script>
\t\t\t// Debounced autocomplete for header search
(function () {
const input = document.getElementById('search_input');
const box = document.getElementById('search_results');
const searchForm = document.getElementById('search_form');
const clearSearchBtn = document.getElementById('clear_search_btn');
const closeSearchBtn = document.getElementById('close_search');
if (! input || ! box)
return;
// Fonction pour effacer la recherche
function clearSearch() {
input.value = '';
box.style.display = 'none';
box.innerHTML = '';
if (clearSearchBtn) {
clearSearchBtn.style.display = 'none';
}
// Si on est sur la page listing, utiliser AJAX pour mettre à jour
if (typeof currentFilters !== 'undefined') {
currentFilters.q = '';
currentFilters.page = 1;
if (typeof applyFilters === 'function') {
applyFilters();
}
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
} else { // Sinon, rediriger vers la page listing sans recherche
window.location.href = '";
// line 1755
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "';
}
}
// Bouton pour effacer la recherche
if (clearSearchBtn) {
clearSearchBtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
clearSearch();
});
}
// Bouton de soumission de recherche
var searchSubmitBtn = document.getElementById('search_submit_btn');
if (searchSubmitBtn) {
searchSubmitBtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return false;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '";
// line 1793
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
});
}
// Gestion du formulaire de recherche
if (searchForm) {
searchForm.addEventListener('submit', function (e) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '";
// line 1824
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
});
}
let t = null;
input.addEventListener('input', function () {
const q = input.value.trim();
clearTimeout(t);
if (q.length === 0) {
box.style.display = 'none';
box.innerHTML = '';
// Afficher/masquer le bouton clear
if (clearSearchBtn) {
clearSearchBtn.style.display = 'none';
}
return;
}
// Afficher le bouton clear
if (clearSearchBtn) {
clearSearchBtn.style.display = 'block';
}
t = setTimeout(() => fetchSuggestions(q), 300);
});
function fetchSuggestions(q) {
const url = '";
// line 1852
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_search_suggest");
yield "' + '?q=' + encodeURIComponent(q);
fetch(url).then(r => r.json()).then(data => {
if (!data.success) {
box.style.display = 'none';
return;
}
renderSuggestions(data.results || []);
}).catch(() => {
box.style.display = 'none';
});
}
function renderSuggestions(items) {
if (! items.length) {
box.style.display = 'none';
box.innerHTML = '';
return;
}
box.innerHTML = items.map(it => suggestionItem(it)).join('');
box.style.display = 'block';
}
function suggestionItem(it) {
const icon = it.type === 'product' ? 'ti-package' : (it.type === 'shop' ? 'ti-briefcase' : (it.type === 'category' ? 'ti-layers' : 'ti-tag'));
const typeLabel = it.type === 'product' ? 'Produit' : (it.type === 'shop' ? 'Boutique' : (it.type === 'category' ? 'Catégorie' : 'Tag'));
return '<a href=\"' + it.url + '\" class=\"list-group-item list-group-item-action d-flex align-items-center\">' + '<i class=\"' + icon + ' me-3\"></i>' + '<span class=\"flex-grow-1\">' + escapeHtml(it.label) + '</span>' + '<span class=\"badge bg-light text-dark ms-2\">' + typeLabel + '</span>' + '</a>';
}
function escapeHtml(s) {
return s.replace(/[&<>\"]+/g, c => ({'&': '&', '<': '<', '>': '>', '\"': '"'}[c]));
}
document.addEventListener('click', function (e) {
if (! box.contains(e.target) && e.target !== input) {
box.style.display = 'none';
}
});
window.handleSearchSubmit = function (e) {
if (e)
e.preventDefault();
const first = box.querySelector('a');
if (first) {
window.location.href = first.getAttribute('href');
return false;
}
// fallback to listing page search by name
const q = input.value.trim();
if (q.length) { // Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined') {
currentFilters.q = q;
currentFilters.page = 1;
if (typeof applyFilters === 'function') {
applyFilters();
}
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
} else {
window.location.href = '";
// line 1913
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "' + '?q=' + encodeURIComponent(q);
}
}
return false;
}
// Gestion de la touche Enter dans le champ de recherche
if (input) {
input.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.keyCode === 13) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return false;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '";
// line 1944
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
}
});
}
// Ajouter un event listener au bouton de soumission (réutiliser la variable si elle existe déjà)
if (!searchSubmitBtn) {
searchSubmitBtn = document.getElementById('search_submit_btn');
}
if (searchSubmitBtn) {
searchSubmitBtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return false;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '";
// line 1979
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
yield "' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
});
}
// Afficher le bouton clear au chargement si une recherche est active
document.addEventListener('DOMContentLoaded', function () {
const q = input.value.trim();
if (q.length > 0 && clearSearchBtn) {
clearSearchBtn.style.display = 'block';
}
});
})();
// Gestion des mega-menus avec clic (comme la barre de recherche)
document.addEventListener('DOMContentLoaded', function () {
const dropdownItems = document.querySelectorAll('.nav-item.dropdown');
dropdownItems.forEach(function (item) {
const dropdownToggle = item.querySelector('.dropdown-toggle');
const dropdownMenu = item.querySelector('.mega-menu');
if (! dropdownToggle || ! dropdownMenu)
return;
// Fermer les autres menus quand on ouvre un nouveau
function closeAllMenus() {
dropdownItems.forEach(function (otherItem) {
const otherMenu = otherItem.querySelector('.mega-menu');
if (otherMenu && otherMenu !== dropdownMenu) {
\$(otherMenu).slideUp(300);
otherMenu.classList.remove('active');
}
});
}
// Toggle au clic (comme la barre de recherche)
dropdownToggle.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
closeAllMenus();
if (dropdownMenu.classList.contains('active')) { // Fermer le menu
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
setTimeout(() => {
dropdownMenu.classList.remove('active');
dropdownMenu.style.display = 'none';
}, 300);
} else { // Ouvrir le menu
dropdownMenu.style.display = 'block';
setTimeout(() => {
dropdownMenu.classList.add('active');
dropdownMenu.style.opacity = '1';
dropdownMenu.style.visibility = 'visible';
dropdownMenu.style.transform = 'translateX(-50%) translateY(0)';
}, 10);
}
});
// Fermer au clic en dehors
document.addEventListener('click', function (e) {
if (! item.contains(e.target) && dropdownMenu.classList.contains('active')) {
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
setTimeout(() => {
dropdownMenu.classList.remove('active');
dropdownMenu.style.display = 'none';
}, 300);
}
});
// Animation des éléments du menu
const menuItems = dropdownMenu.querySelectorAll('.dropdown-item a');
menuItems.forEach(function (menuItem, index) {
menuItem.style.animationDelay = (index * 0.05) + 's';
});
});
// Gestion des clics sur mobile
if (window.innerWidth <= 768) {
dropdownItems.forEach(function (item) {
const dropdownToggle = item.querySelector('.dropdown-toggle');
const dropdownMenu = item.querySelector('.mega-menu');
dropdownToggle.addEventListener('click', function (e) {
e.preventDefault();
// Fermer tous les autres menus
dropdownItems.forEach(function (otherItem) {
if (otherItem !== item) {
const otherMenu = otherItem.querySelector('.mega-menu');
otherMenu.style.opacity = '0';
otherMenu.style.visibility = 'hidden';
otherMenu.style.transform = 'translateY(-10px)';
}
});
// Toggle le menu actuel
if (dropdownMenu.style.opacity === '1') {
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateY(-10px)';
} else {
dropdownMenu.style.opacity = '1';
dropdownMenu.style.visibility = 'visible';
dropdownMenu.style.transform = 'translateY(0)';
}
});
});
}
// Fermer les menus quand on clique ailleurs
document.addEventListener('click', function (e) {
if (! e.target.closest('.nav-item.dropdown')) {
dropdownItems.forEach(function (item) {
const dropdownMenu = item.querySelector('.mega-menu');
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateY(-10px)';
});
}
});
});
\t\t</script>
\t\t<!-- End footer Area -->
\t\t<script src=\"";
// line 2113
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", null, true);
yield "\"></script>
\t\t<script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>
\t\t<script>
\t\t\t// Initialiser le collapse Bootstrap 5 pour le menu hamburger après chargement de Bootstrap
document.addEventListener('DOMContentLoaded', function () { // Attendre que Bootstrap soit complètement chargé
if (typeof bootstrap !== 'undefined') {
const navbarToggler = document.querySelector('.navbar-toggler');
const navbarCollapse = document.getElementById('navbarSupportedContent');
if (navbarToggler && navbarCollapse) {
// Bootstrap 5 devrait gérer automatiquement avec data-bs-toggle
// Mais on s'assure que ça fonctionne en écoutant les événements
navbarCollapse.addEventListener('show.bs.collapse', function () {
navbarToggler.setAttribute('aria-expanded', 'true');
navbarToggler.classList.add('active');
});
navbarCollapse.addEventListener('hide.bs.collapse', function () {
navbarToggler.setAttribute('aria-expanded', 'false');
navbarToggler.classList.remove('active');
});
}
}
});
\t\t</script>
\t\t<script src=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.js\"></script>
\t\t<script src=\"";
// line 2139
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.ajaxchimp.min.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2140
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.nice-select.min.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2141
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.sticky.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2142
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/nouislider.min.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2143
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/countdown.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2144
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/jquery.magnific-popup.min.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2145
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/owl.carousel.min.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"https://maps.googleapis.com/maps/api/js?key=AIzaSyCjCGmQ0Uq4exrzdcL6rvxywDDOvfAu6eE\"></script>
\t\t<script src=\"";
// line 2147
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/gmaps.min.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2148
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/main.js"), "html", null, true);
yield "\"></script>
\t\t";
// line 2150
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getFunction('encore_entry_script_tags')->getCallable()("app"), "html", null, true);
yield "
\t\t<!-- PWA Service Worker Registration -->
\t\t<script>
\t\t\t// Enregistrement du Service Worker
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('";
// line 2157
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("sw.js"), "html", null, true);
yield "').then((registration) => {
console.log('Service Worker enregistré avec succès:', registration.scope);
// Vérifie les mises à jour du service worker
registration.addEventListener('updatefound', () => {
const newWorker = registration.installing;
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { // Nouveau service worker disponible
if (confirm('Une nouvelle version de MaketOu est disponible. Voulez-vous l\\'installer maintenant ?')) {
newWorker.postMessage({type: 'SKIP_WAITING'});
window.location.reload();
}
}
});
});
}).catch((error) => {
console.log('Échec de l\\'enregistrement du Service Worker:', error);
});
// Écoute les messages du service worker
navigator.serviceWorker.addEventListener('message', (event) => {
console.log('Message du Service Worker:', event.data);
});
});
}
\t\t</script>
\t\t<!-- PWA Install Script -->
\t\t<script src=\"";
// line 2185
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("js/pwa-install.js"), "html", null, true);
yield "\"></script>
\t\t<script>
\t\t\t// Charger les compteurs au chargement de la page
document.addEventListener('DOMContentLoaded', function () {
";
// line 2190
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 2190)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 2191
yield "loadNotificationCount();
// Délai pour s'assurer que la session est bien établie après connexion
setTimeout(function () {
loadComparisonCount();
}, 500);";
}
// line 2196
yield "
// Gérer le bouton de recherche mobile
const searchMobileBtn = document.getElementById('searchMobileBtn');
if (searchMobileBtn) {
searchMobileBtn.addEventListener('click', function (e) {
e.preventDefault();
// Utiliser le même comportement que le bouton desktop
const searchBox = document.getElementById('search_input_box');
if (searchBox) {
searchBox.style.display = 'block';
const searchInput = document.getElementById('search_input');
if (searchInput) {
setTimeout(() => searchInput.focus(), 100);
}
}
});
}
});
function loadNotificationCount() {
";
// line 2216
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 2216)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 2217
yield "fetch('";
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("api_notifications_count");
yield "').then(response => {
if (!response.ok) {
throw new Error('Erreur HTTP: ' + response.status);
}
return response.json();
}).then(data => {
const count = data.count || 0;
// Mettre à jour tous les badges de notification
const badges = [document.getElementById('notificationBadge'), document.getElementById('notificationBadgeMobile'), document.querySelector('.notification-badge')].filter(badge => badge !== null);
badges.forEach(badge => {
if (count > 0) {
badge.textContent = count;
badge.style.display = 'flex';
badge.style.color = 'white';
badge.style.backgroundColor = '#dc3545';
} else {
badge.style.display = 'none';
}
});
// Si on est sur la page des notifications, mettre à jour aussi le contenu de la page
if (typeof updateNotificationPageContent === 'function') {
updateNotificationPageContent(count);
}
}).catch(error => {
console.error('Erreur lors du chargement du compteur de notifications:', error);
});";
}
// line 2246
yield "}
// Exposer la fonction globalement pour qu'elle puisse être appelée depuis d'autres pages
window.loadNotificationCount = loadNotificationCount;
// Recharger le compteur toutes les 30 secondes pour garder les données à jour
";
// line 2252
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 2252)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 2253
yield "setInterval(function () {
loadNotificationCount();
}, 30000);";
}
// line 2255
yield "function loadComparisonCount() {
";
// line 2256
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 2256)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 2257
yield "// Ne pas appeler l'API si on est sur une page d'erreur ou de redirection
if (window.location.pathname.includes('/api/') || window.location.pathname.includes('/login')) {
return;
}
// Utiliser un try-catch pour éviter toute redirection
try {
fetch('";
// line 2264
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_api_comparison_count");
yield "', {
method: 'GET',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'application/json'
},
credentials: 'same-origin',
redirect: 'error' // Empêcher les redirections automatiques
}).then(response => { // Vérifier si la réponse est OK
if (!response.ok) { // Si c'est une redirection (301, 302, etc.) ou une erreur d'authentification, ignorer silencieusement
if (response.status >= 300 && response.status < 400) {
console.warn('Redirection détectée, arrêt de la requête');
return null;
}
if (response.status === 401 || response.status === 403) {
console.warn('Utilisateur non authentifié pour la comparaison');
return null;
}
// Pour les autres erreurs, throw pour être capturé par catch
throw new Error('Erreur HTTP: ' + response.status);
}
// Vérifier que c'est bien du JSON
const contentType = response.headers.get('content-type');
if (! contentType || ! contentType.includes('application/json')) { // Si ce n'est pas du JSON, c'est probablement une redirection HTML
console.warn('La réponse n\\'est pas du JSON, probable redirection');
return null;
}
return response.json();
}).then(data => { // Si data est null (redirection ou erreur), ne rien faire
if (!data || typeof data.count === 'undefined') {
return;
}
// Mettre à jour les badges desktop et mobile
const badges = [document.getElementById('comparisonBadge'), document.getElementById('comparisonBadgeMobile')];
badges.forEach(badge => {
if (badge) {
if (data.count > 0) {
badge.textContent = data.count;
badge.style.display = 'flex';
} else {
badge.style.display = 'none';
}
}
});
}).catch(error => { // Ne pas afficher d'erreur si c'est juste une absence d'authentification ou une redirection
if (error.message && !error.message.includes('401') && !error.message.includes('403') && !error.message.includes('redirect')) {
console.error('Erreur lors du chargement du compteur de comparaison:', error);
}
// Empêcher toute redirection vers l'URL de l'API
return false;
});
} catch (e) { // Capturer toute erreur qui pourrait causer une redirection
console.warn('Erreur lors de l\\'appel à l\\'API de comparaison:', e);
}
";
}
// line 2322
yield "}
// Fonction globale pour gérer la comparaison
function toggleComparison(productId, element) {
if (! element) {
element = document.querySelector(`.comparison-btn[data-product-id=\"\${productId}\"]`);
}
if (! element) {
console.error('Bouton de comparaison non trouvé pour le produit', productId);
return;
}
const originalHtml = element.innerHTML;
// Désactiver le bouton/lien
if (element.tagName === 'BUTTON') {
element.disabled = true;
} else {
element.style.pointerEvents = 'none';
element.style.opacity = '0.6';
} element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
// Vérifier d'abord si le produit est déjà en comparaison
let isInComparison = false;
fetch(`/api/comparison/status/\${productId}`).then(response => response.json()).then(data => {
isInComparison = data.inComparison;
const url = isInComparison ? `/api/comparison/remove/\${productId}` : `/api/comparison/add/\${productId}`;
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
});
}).then(response => response.json()).then(data => {
if (data.success) { // Mettre à jour le compteur
loadComparisonCount();
// Mettre à jour l'apparence du bouton
if (element) { // Inverser l'état (car on vient de le changer)
const newState = ! isInComparison;
// Restaurer le HTML original puis mettre à jour
element.innerHTML = originalHtml;
if (newState) {
element.classList.add('active');
// Mettre à jour le texte pour les deux types de boutons
const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'En comparaison';
// Mettre à jour l'icône si nécessaire (chercher dans span ou i)
const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
if (iconEl) {
iconEl.style.color = '#28a745';
iconEl.classList.add('active');
}
} else {
element.classList.remove('active');
const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'Comparer';
// Restaurer la couleur de l'icône
const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
if (iconEl) {
iconEl.style.color = '';
iconEl.classList.remove('active');
}
}
}
// Afficher une notification
showNotification(data.message, 'success');
} else {
showNotification(data.message, 'error');
if (element) {
element.innerHTML = originalHtml;
}
}
}).catch(error => {
console.error('Erreur:', error);
showNotification('Une erreur est survenue', 'error');
if (element) {
element.innerHTML = originalHtml;
}
}). finally(() => {
if (element) {
if (element.tagName === 'BUTTON') {
element.disabled = false;
} else {
element.style.pointerEvents = '';
element.style.opacity = '';
}
}
});
}
// Fonction globale pour gérer les favoris
function toggleWishlist(productId, element) {
if (! element) {
element = document.querySelector(`.wishlist-btn[data-product-id=\"\${productId}\"]`);
}
if (! element) {
console.error('Bouton de wishlist non trouvé pour le produit', productId);
return;
}
const originalHtml = element.innerHTML;
// Désactiver le bouton/lien
if (element.tagName === 'BUTTON') {
element.disabled = true;
} else {
element.style.pointerEvents = 'none';
element.style.opacity = '0.6';
} element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
// Vérifier d'abord si le produit est déjà en favoris
let isInWishlist = false;
fetch(`/api/wishlist/status/\${productId}`).then(response => response.json()).then(data => {
isInWishlist = data.inWishlist;
const url = isInWishlist ? `/api/wishlist/remove/\${productId}` : `/api/wishlist/add/\${productId}`;
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
});
}).then(response => response.json()).then(data => {
if (data.success) { // Mettre à jour l'apparence du bouton
if (element) { // Inverser l'état (car on vient de le changer)
const newState = ! isInWishlist;
// Restaurer le HTML original puis mettre à jour
element.innerHTML = originalHtml;
// Chercher l'icône dans span ou i
const icon = element.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
const text = element.querySelector('.wishlist-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
if (newState) {
if (icon) { // Pour les icônes linr, on change la classe
if (icon.classList.contains('lnr-heart')) {
icon.classList.remove('lnr-heart');
}
if (! icon.classList.contains('lnr-heart-filled')) {
icon.classList.add('lnr-heart-filled');
}
icon.style.color = '#dc3545';
}
element.classList.add('active');
if (text)
text.textContent = 'Dans favoris';
} else {
if (icon) { // Restaurer l'icône originale
if (icon.classList.contains('lnr-heart-filled')) {
icon.classList.remove('lnr-heart-filled');
}
if (! icon.classList.contains('lnr-heart')) {
icon.classList.add('lnr-heart');
}
icon.style.color = '';
}
element.classList.remove('active');
if (text)
text.textContent = 'Favoris';
}
}
// Afficher une notification
showNotification(data.message, 'success');
// Si on est sur la page wishlist, recharger la page
if (window.location.pathname.includes('/account/wishlist')) {
setTimeout(() => location.reload(), 1000);
}
} else {
showNotification(data.message, 'error');
if (element) {
element.innerHTML = originalHtml;
}
}
}).catch(error => {
console.error('Erreur:', error);
showNotification('Une erreur est survenue', 'error');
if (element) {
element.innerHTML = originalHtml;
}
}). finally(() => {
if (element) {
if (element.tagName === 'BUTTON') {
element.disabled = false;
} else {
element.style.pointerEvents = '';
element.style.opacity = '';
}
}
});
}
// Fonction pour afficher des notifications
function showNotification(message, type = 'success') { // Créer l'élément de notification
const notification = document.createElement('div');
notification.className = `alert alert-\${
type === 'success' ? 'success' : 'danger'
} alert-dismissible fade show position-fixed`;
notification.style.cssText = 'top: 20px; right: 20px; z-index: 9999; min-width: 300px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);';
notification.innerHTML = `
\${message}
<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\"></button>
`;
document.body.appendChild(notification);
// Supprimer automatiquement après 3 secondes
setTimeout(() => {
notification.remove();
}, 3000);
}
// Initialiser les alertes Bootstrap 5 pour la fermeture
document.addEventListener('DOMContentLoaded', function () { // S'assurer que les alertes peuvent être fermées
const alertCloseButtons = document.querySelectorAll('.flash-message .btn-close');
alertCloseButtons.forEach(function (button) {
button.addEventListener('click', function () {
const alert = this.closest('.alert');
if (alert) {
alert.classList.remove('show');
setTimeout(function () {
alert.remove();
}, 150);
}
});
});
// Charger les statuts initiaux des produits
";
// line 2573
if ((($tmp = CoreExtension::getAttribute($this->env, $this->source, ($context["app"] ?? null), "user", [], "any", false, false, false, 2573)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
// line 2574
yield "// Charger les statuts de comparaison pour tous les produits visibles
document.querySelectorAll('.comparison-btn[data-product-id]').forEach(btn => {
const productId = btn.dataset.productId;
fetch(`/api/comparison/status/\${productId}`).then(response => response.json()).then(data => {
if (data.inComparison) {
btn.classList.add('active');
// Mettre à jour le texte pour les deux types de boutons
const textEl = btn.querySelector('.comparison-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'En comparaison';
// Mettre à jour l'icône si nécessaire
const iconEl = btn.querySelector('.lnr-sync, [class*=\"sync\"]');
if (iconEl)
iconEl.style.color = '#28a745';
}
}).catch(() => {});
});
// Charger les statuts de wishlist pour tous les produits visibles
document.querySelectorAll('.wishlist-btn[data-product-id]').forEach(btn => {
const productId = btn.dataset.productId;
fetch(`/api/wishlist/status/\${productId}`).then(response => response.json()).then(data => {
if (data.inWishlist) {
// Chercher l'icône dans span ou i
const icon = btn.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
if (icon) {
icon.classList.remove('lnr-heart');
icon.classList.add('lnr-heart');
icon.style.color = '#ffa200';
}
// Mettre à jour le texte pour les deux types de boutons
const textEl = btn.querySelector('.wishlist-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'favoris';
}
}).catch(() => {});
});
// Charger le compteur de comparaison
loadComparisonCount();";
}
// line 2623
yield "});
\t\t</script>
\t\t<script>
\t\t\t// Loader global pour tous les boutons de formulaire
document.addEventListener('DOMContentLoaded', function () { // Intercepter tous les formulaires
const forms = document.querySelectorAll('form');
forms.forEach(function (form) {
form.addEventListener('submit', function (e) {
const submitButtons = form.querySelectorAll('button[type=\"submit\"], input[type=\"submit\"], button:not([type])');
submitButtons.forEach(function (button) { // Vérifier si le bouton n'est pas déjà désactivé
if (! button.disabled && ! button.classList.contains('loading')) {
button.classList.add('loading');
button.disabled = true;
// Sauvegarder le texte original
const originalText = button.innerHTML;
button.setAttribute('data-original-text', originalText);
// Ajouter le loader
button.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Envoi...';
// Si le formulaire n'est pas valide, réactiver le bouton après 1 seconde
setTimeout(function () {
if (! form.checkValidity()) {
button.classList.remove('loading');
button.disabled = false;
button.innerHTML = originalText;
}
}, 1000);
}
});
});
});
// Pour les boutons qui déclenchent des actions AJAX
const ajaxButtons = document.querySelectorAll('[data-ajax], .ajax-submit, button[data-submit]');
ajaxButtons.forEach(function (button) {
button.addEventListener('click', function (e) {
if (this.disabled || this.classList.contains('loading')) {
e.preventDefault();
return false;
}
this.classList.add('loading');
this.disabled = true;
const originalText = this.innerHTML;
this.setAttribute('data-original-text', originalText);
this.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Chargement...';
});
});
// Gestionnaire spécifique pour le formulaire de newsletter
const newsletterForm = document.querySelector('.footer-newsletter-form');
if (newsletterForm) {
newsletterForm.addEventListener('submit', function (e) {
const submitBtn = this.querySelector('.newsletter-btn');
if (submitBtn && ! submitBtn.disabled) {
submitBtn.classList.add('loading');
submitBtn.disabled = true;
// Afficher le loader et masquer l'icône
const icon = submitBtn.querySelector('.newsletter-btn-icon');
const loader = submitBtn.querySelector('.newsletter-btn-loader');
if (icon)
icon.style.display = 'none';
if (loader)
loader.style.display = 'flex';
// Réactiver le bouton après 5 secondes au cas où la requête échoue silencieusement
setTimeout(function () {
if (submitBtn.classList.contains('loading')) {
submitBtn.classList.remove('loading');
submitBtn.disabled = false;
if (icon)
icon.style.display = 'flex';
if (loader)
loader.style.display = 'none';
}
}, 5000);
}
});
// Gérer la réponse du formulaire (si AJAX)
newsletterForm.addEventListener('submit', function (e) {
// Si le formulaire est soumis normalement (non-AJAX), le navigateur gère la réponse
// Sinon, on peut intercepter pour gérer la réponse AJAX ici
});
}
});
// CSS pour le spinner
const style = document.createElement('style');
style.textContent = `
.spinner-border-sm {
width: 1rem;
height: 1rem;
border-width: 0.15em;
}
.spinner-border {
display: inline-block;
width: 1rem;
height: 1rem;
vertical-align: text-bottom;
border: 0.15em solid currentColor;
border-right-color: transparent;
border-radius: 50%;
animation: spinner-border 0.75s linear infinite;
}
@keyframes spinner-border {
to { transform: rotate(360deg); }
}
button.loading {
opacity: 0.7;
cursor: not-allowed !important;
}
`;
document.head.appendChild(style);
\t\t</script>
\t\t<!-- Cart Modal -->
\t\t<div id=\"ebay-cart-modal\" class=\"ebay-cart-modal-overlay\" style=\"display: none;\" data-url=\"\">
\t\t\t<div class=\"ebay-cart-modal\">
\t\t\t\t<div class=\"ebay-modal-header\">
\t\t\t\t\t<h3>
\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
\t\t\t\t\t\tAjouté au panier !</h3>
\t\t\t\t\t<button class=\"ebay-modal-close\" onclick=\"closeEbayCartModal()\">×</button>
\t\t\t\t</div>
\t\t\t\t<div class=\"ebay-modal-content\">
\t\t\t\t\t<div class=\"ebay-product-info\">
\t\t\t\t\t\t<div class=\"ebay-product-image\">
\t\t\t\t\t\t\t<img id=\"ebay-modal-product-image\" src=\"\" alt=\"Produit\"/>
\t\t\t\t\t\t</div>
\t\t\t\t\t\t<div class=\"ebay-product-details\">
\t\t\t\t\t\t\t<h4 id=\"ebay-modal-product-name\">Nom du produit</h4>
\t\t\t\t\t\t\t<div class=\"ebay-product-price\" id=\"ebay-modal-product-price\">Prix</div>
\t\t\t\t\t\t\t<div class=\"ebay-product-quantity\">
\t\t\t\t\t\t\t\t<span>Quantité:
\t\t\t\t\t\t\t\t</span>
\t\t\t\t\t\t\t\t<span id=\"ebay-modal-product-quantity\">1</span>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<!-- Recommendations Section -->
\t\t\t\t\t<div class=\"ebay-recommendations\" style=\"display: none;\">
\t\t\t\t\t\t<h4>Les clients ont aussi acheté :</h4>
\t\t\t\t\t\t<div
\t\t\t\t\t\t\tclass=\"ebay-recommendations-grid\" id=\"ebay-modal-recommendations\"><!-- Recommendations will be injected here -->
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"ebay-modal-actions\">
\t\t\t\t\t\t<button class=\"ebay-btn-continue\" onclick=\"closeEbayCartModal()\">
\t\t\t\t\t\t\tContinuer mes achats
\t\t\t\t\t\t</button>
\t\t\t\t\t\t<a href=\"";
// line 2797
yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_cart");
yield "\" class=\"ebay-btn-view-cart\">
\t\t\t\t\t\t\tVoir mon panier
\t\t\t\t\t\t</a>
\t\t\t\t\t</div>
\t\t\t\t</div>
\t\t\t</div>
\t\t</div>
\t\t<script src=\"";
// line 2805
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/cart-modal.js"), "html", null, true);
yield "\"></script>
\t\t<script src=\"";
// line 2806
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/notification-badge.js"), "html", null, true);
yield "\"></script>
\t\t";
// line 2808
yield from $this->unwrap()->yieldBlock('javascripts', $context, $blocks);
// line 2809
yield "\t</body>
</html>
";
$__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
yield from [];
}
// line 40
/**
* @return iterable<null|scalar|\Stringable>
*/
public function block_title(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
$__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
$__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
$__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
yield "MaketOu
\t\t\t";
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
$__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
yield from [];
}
// line 1236
/**
* @return iterable<null|scalar|\Stringable>
*/
public function block_stylesheets(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
$__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
$__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
$__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
// line 1237
yield "\t\t\t";
yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getFunction('encore_entry_link_tags')->getCallable()("app"), "html", null, true);
yield "
\t\t";
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
$__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
yield from [];
}
// line 1486
/**
* @return iterable<null|scalar|\Stringable>
*/
public function block_body(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
$__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
$__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
$__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
$__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
yield from [];
}
// line 2808
/**
* @return iterable<null|scalar|\Stringable>
*/
public function block_javascripts(array $context, array $blocks = []): iterable
{
$macros = $this->macros;
$__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
$__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
$__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
$__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
$__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
yield from [];
}
/**
* @codeCoverageIgnore
*/
public function getTemplateName(): string
{
return "base_home.html.twig";
}
/**
* @codeCoverageIgnore
*/
public function isTraitable(): bool
{
return false;
}
/**
* @codeCoverageIgnore
*/
public function getDebugInfo(): array
{
return array ( 3301 => 2808, 3279 => 1486, 3265 => 1237, 3252 => 1236, 3228 => 40, 3215 => 2809, 3213 => 2808, 3208 => 2806, 3204 => 2805, 3193 => 2797, 3017 => 2623, 2966 => 2574, 2964 => 2573, 2711 => 2322, 2650 => 2264, 2641 => 2257, 2639 => 2256, 2636 => 2255, 2631 => 2253, 2629 => 2252, 2621 => 2246, 2588 => 2217, 2586 => 2216, 2564 => 2196, 2557 => 2191, 2555 => 2190, 2547 => 2185, 2516 => 2157, 2506 => 2150, 2501 => 2148, 2497 => 2147, 2492 => 2145, 2488 => 2144, 2484 => 2143, 2480 => 2142, 2476 => 2141, 2472 => 2140, 2468 => 2139, 2439 => 2113, 2302 => 1979, 2264 => 1944, 2230 => 1913, 2166 => 1852, 2135 => 1824, 2101 => 1793, 2060 => 1755, 1912 => 1610, 1898 => 1599, 1891 => 1595, 1884 => 1591, 1877 => 1587, 1870 => 1583, 1856 => 1572, 1849 => 1568, 1842 => 1564, 1835 => 1560, 1825 => 1552, 1818 => 1548, 1811 => 1544, 1808 => 1543, 1801 => 1539, 1798 => 1538, 1796 => 1537, 1790 => 1534, 1783 => 1530, 1776 => 1526, 1735 => 1487, 1733 => 1486, 1727 => 1482, 1717 => 1478, 1713 => 1476, 1709 => 1475, 1706 => 1474, 1696 => 1470, 1692 => 1468, 1688 => 1467, 1685 => 1466, 1675 => 1462, 1671 => 1460, 1667 => 1459, 1664 => 1458, 1654 => 1454, 1650 => 1452, 1646 => 1451, 1632 => 1439, 1626 => 1435, 1624 => 1434, 1617 => 1430, 1613 => 1429, 1603 => 1421, 1594 => 1416, 1585 => 1411, 1583 => 1410, 1575 => 1404, 1567 => 1399, 1559 => 1395, 1557 => 1394, 1547 => 1391, 1538 => 1385, 1532 => 1384, 1527 => 1382, 1521 => 1381, 1516 => 1379, 1510 => 1378, 1505 => 1376, 1499 => 1375, 1485 => 1366, 1471 => 1357, 1351 => 1239, 1349 => 1236, 174 => 63, 168 => 59, 164 => 58, 160 => 57, 156 => 56, 152 => 55, 148 => 54, 144 => 53, 140 => 52, 136 => 51, 132 => 50, 128 => 49, 124 => 48, 120 => 47, 113 => 42, 111 => 40, 93 => 25, 86 => 21, 81 => 19, 77 => 18, 73 => 17, 67 => 14, 52 => 1,);
}
public function getSourceContext(): Source
{
return new Source("<!DOCTYPE html>
<html lang=\"fr\" class=\"no-js\">
\t<head>
\t\t<!-- Mobile Specific Meta -->
\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no\">
\t\t<meta name=\"mobile-web-app-capable\" content=\"yes\">
\t\t<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">
\t\t<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">
\t\t<meta name=\"apple-mobile-web-app-title\" content=\"MaketOu\">
\t\t<meta name=\"theme-color\" content=\"#ffa200\">
\t\t<meta name=\"msapplication-TileColor\" content=\"#ffa200\">
\t\t<meta
\t\tname=\"msapplication-config\" content=\"{{ asset('favicon/browserconfig.xml') }}\">
\t\t<!-- Favicon-->
\t\t<link rel=\"shortcut icon\" href=\"{{ asset('favicon/favicon-16x16.png') }}\">
\t\t<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"{{ asset('favicon/apple-touch-icon.png') }}\">
\t\t<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"{{ asset('favicon/favicon-32x32.png') }}\">
\t\t<link
\t\trel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"{{ asset('favicon/favicon-16x16.png') }}\">
\t\t<!-- PWA Manifest -->
\t\t<link
\t\trel=\"manifest\" href=\"{{ asset('manifest.json') }}\">
\t\t<!-- Author Meta -->
\t\t<meta
\t\tname=\"author\" content=\"Foulgor Tech\">
\t\t<!-- Meta Description -->
\t\t<meta
\t\tname=\"description\" content=\"\">
\t\t<!-- Meta Keyword -->
\t\t<meta
\t\tname=\"keywords\" content=\"\">
\t\t<!-- meta character set -->
\t\t<meta
\t\tcharset=\"UTF-8\">
\t\t<!-- Site Title -->
\t\t<title>
\t\t\t{% block title %}MaketOu
\t\t\t{% endblock %}
\t\t</title>
\t\t<!--
\t\t\t\t\t\t CSS
\t\t\t\t\t\t ============================================= -->
\t\t<link rel=\"stylesheet\" href=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.css\"/>
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/linearicons.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/font-awesome.min.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/themify-icons.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/bootstrap.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/owl.carousel.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/nice-select.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/nouislider.min.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/ion.rangeSlider.css') }}\"/>
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/ion.rangeSlider.skinFlat.css') }}\"/>
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/magnific-popup.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/main.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/cart-modal.css') }}\">
\t\t<link rel=\"stylesheet\" href=\"{{ asset('ui/css/buttons-unified.css') }}\">
\t\t<meta
\t\tcharset=\"UTF-8\">
\t\t{# Run `composer require symfony/webpack-encore-bundle` to start using Symfony UX #}
\t\t<style>
\t\t\t/* Styles pour l'icône de notification */
\t\t\t.notification-icon {
\t\t\t\tposition: relative;
\t\t\t\tdisplay: inline-block;
\t\t\t\tcolor: #333;
\t\t\t\ttext-decoration: none;
\t\t\t\ttransition: color 0.3s ease;
\t\t\t}
\t\t\t.notification-icon:hover {
\t\t\t\tcolor: #007bff;
\t\t\t}
\t\t\t.notification-badge {
\t\t\t\tposition: absolute;
\t\t\t\ttop: -4px;
\t\t\t\tright: -2px;
\t\t\t\tbackground: #dc3545 !important;
\t\t\t\tcolor: white !important;
\t\t\t\tborder-radius: 50%;
\t\t\t\twidth: 18px;
\t\t\t\theight: 18px;
\t\t\t\tfont-size: 8px !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tfont-weight: bold !important;
\t\t\t\tanimation: pulse 2s infinite;
\t\t\t\tz-index: 10;
\t\t\t\tline-height: 1 !important;
\t\t\t}
\t\t\t/* Forcer le texte en blanc pour tous les éléments du badge - avec spécificité maximale */
\t\t\t.notification-badge,
\t\t\t.notification-badge.text-white,
\t\t\t.notification-badge *,
\t\t\t#notificationBadge,
\t\t\t#notificationBadge.text-white,
\t\t\t#notificationBadge *,
\t\t\tspan.notification-badge,
\t\t\tspan.notification-badge.text-white,
\t\t\tspan#notificationBadge,
\t\t\tspan#notificationBadge.text-white {
\t\t\t\tcolor: white !important;
\t\t\t\ttext-color: white !important;
\t\t\t\t-webkit-text-fill-color: white !important;
\t\t\t}
\t\t\t/* S'assurer que le contenu texte est bien en blanc */
\t\t\t.notification-badge::before,
\t\t\t.notification-badge::after {
\t\t\t\tcolor: white !important;
\t\t\t}
\t\t\t/* Forcer la couleur pour tous les sélecteurs possibles avec spécificité maximale */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon .notification-badge.text-white,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span.notification-badge,
\t\t\t.notification-icon .notification-badge,
\t\t\t.notification-icon .notification-badge.text-white,
\t\t\t.notification-icon span.notification-badge,
\t\t\ta.notification-icon .notification-badge,
\t\t\ta.notification-icon span.notification-badge {
\t\t\t\tcolor: white !important;
\t\t\t\ttext-color: white !important;
\t\t\t\t-webkit-text-fill-color: white !important;
\t\t\t}
\t\t\t/* Forcer la couleur pour tous les enfants directs */
\t\t\t.notification-icon > .notification-badge,
\t\t\t.notification-icon > span.notification-badge {
\t\t\t\tcolor: white !important;
\t\t\t}
\t\t\t@keyframes pulse {
\t\t\t\t0% {
\t\t\t\t\ttransform: scale(1);
\t\t\t\t}
\t\t\t\t50% {
\t\t\t\t\ttransform: scale(1.1);
\t\t\t\t}
\t\t\t\t100% {
\t\t\t\t\ttransform: scale(1);
\t\t\t\t}
\t\t\t}
\t\t\t.notification-icon:hover .notification-badge {
\t\t\t\tanimation: none;
\t\t\t}
\t\t\t/* Container pour les icônes - toujours alignées horizontalement */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
\t\t\t\tdisplay: flex !important;
\t\t\t\tflex-direction: row !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tgap: 15px !important;
\t\t\t\tlist-style: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\twidth: auto !important;
\t\t\t}
\t\t\t/* Surcharger les styles existants pour les li contenant le wrapper */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right li:has(.navbar-icons-wrapper) {
\t\t\t\tmargin-left: 0 !important;
\t\t\t\tmargin-right: 0 !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t}
\t\t\t/* Styles pour les icônes */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\twidth: 40px !important;
\t\t\t\theight: 40px !important;
\t\t\t\tmin-width: 40px !important;
\t\t\t\tmin-height: 40px !important;
\t\t\t\tcolor: #333 !important;
\t\t\t\ttext-decoration: none !important;
\t\t\t\ttransition: all 0.3s ease !important;
\t\t\t\tborder-radius: 50% !important;
\t\t\t\tposition: relative !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart:hover,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon:hover,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon:hover,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search:hover {
\t\t\t\tbackground-color: #f0f0f0 !important;
\t\t\t\tcolor: #ffa200 !important;
\t\t\t\ttransform: scale(1.1) !important;
\t\t\t}
\t\t\t/* Surcharger le line-height de main.css */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .cart span,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .notification-icon span,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search span {
\t\t\t\tfont-size: 18px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tcolor: inherit !important;
\t\t\t\tfont-weight: normal !important;
\t\t\t}
\t\t\t/* Icône de comparaison en noir comme le panier */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon {
\t\t\t\tcolor: #333 !important;
\t\t\t}
\t\t\t/* L'icône elle-même (lnr-sync) doit être noire, mais pas le badge */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon > span.lnr-sync,
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon span:not(.comparison-badge) {
\t\t\t\tcolor: #333 !important;
\t\t\t\tfont-size: 18px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tfont-weight: normal !important;
\t\t\t}
\t\t\t/* Le badge doit rester blanc */
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .comparison-icon .comparison-badge {
\t\t\t\tcolor: white !important;
\t\t\t}
\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper .search {
\t\t\t\tbackground: transparent !important;
\t\t\t\tborder: 0 !important;
\t\t\t\tcursor: pointer !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t/* Alignement des icônes navbar sur mobile */
\t\t\t@media(max-width: 991.98px) {
\t\t\t\t/* Container navbar-right en colonne sur mobile */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right {
\t\t\t\t\tdisplay: flex !important;
\t\t\t\t\tflex-direction: column !important;
\t\t\t\t\talign-items: center !important;
\t\t\t\t\tjustify-content: center !important;
\t\t\t\t\twidth: 100% !important;
\t\t\t\t\tgap: 0 !important;
\t\t\t\t\tmargin: 0 !important;
\t\t\t\t\tpadding: 10px 0 !important;
\t\t\t\t}
\t\t\t\t/* Le container d'icônes reste horizontal */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .navbar-icons-wrapper {
\t\t\t\t\twidth: 100% !important;
\t\t\t\t\tjustify-content: center !important;
\t\t\t\t\tdisplay: flex !important;
\t\t\t\t\tflex-direction: row !important;
\t\t\t\t}
\t\t\t\t/* Le bouton compte en bas - pleine largeur */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right li:last-child {
\t\t\t\t\twidth: 100% !important;
\t\t\t\t\tdisplay: flex !important;
\t\t\t\t\tjustify-content: center !important;
\t\t\t\t\tmargin-top: 12px !important;
\t\t\t\t\tpadding-top: 12px !important;
\t\t\t\t\tborder-top: 1px solid #e0e0e0 !important;
\t\t\t\t}
\t\t\t\t/* Bouton compte responsive */
\t\t\t\t.header_area .navbar .nav.navbar-nav.navbar-right .btn-account {
\t\t\t\t\twidth: 100%;
\t\t\t\t\tmax-width: 200px;
\t\t\t\t\tpadding: 10px 20px;
\t\t\t\t\tfont-size: 14px;
\t\t\t\t}
\t\t\t}
\t\t\t/* Styles pour les messages flash - Design moderne */
\t\t\t.flash-message {
\t\t\t\tanimation: slideInDownFlash 0.4s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t\tposition: relative;
\t\t\t\toverflow: visible !important;
\t\t\t\tborder: none !important;
\t\t\t\tpadding: 16px 20px !important;
\t\t\t\tborder-radius: 12px !important;
\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center;
\t\t\t\tgap: 12px;
\t\t\t\tmargin-bottom: 15px;
\t\t\t\tbackdrop-filter: blur(10px);
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t/* S'assurer que les icônes Font Awesome sont visibles */
\t\t\t.flash-message i.fa {
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tvisibility: visible !important;
\t\t\t\topacity: 1 !important;
\t\t\t\twidth: auto !important;
\t\t\t\theight: auto !important;
\t\t\t\tfont-family: \"FontAwesome\" !important;
\t\t\t\tfont-style: normal !important;
\t\t\t\tfont-weight: normal !important;
\t\t\t\ttext-rendering: auto !important;
\t\t\t\t-webkit-font-smoothing: antialiased !important;
\t\t\t\t-moz-osx-font-smoothing: grayscale !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tflex-shrink: 0 !important;
\t\t\t}
\t\t\t/* Forcer l'affichage des pseudo-éléments Font Awesome */
\t\t\t.flash-message i.fa::before {
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tvisibility: visible !important;
\t\t\t\topacity: 1 !important;
\t\t\t\tcontent: attr(data-icon) !important;
\t\t\t}
\t\t\t/* Styles spécifiques pour chaque icône */
\t\t\t.flash-message i.fa-check-circle::before {
\t\t\t\tcontent: \"\\f058\" !important;
\t\t\t}
\t\t\t.flash-message i.fa-exclamation-circle::before {
\t\t\t\tcontent: \"\\f06a\" !important;
\t\t\t}
\t\t\t.flash-message i.fa-exclamation-triangle::before {
\t\t\t\tcontent: \"\\f071\" !important;
\t\t\t}
\t\t\t.flash-message i.fa-info-circle::before {
\t\t\t\tcontent: \"\\f05a\" !important;
\t\t\t}
\t\t\t.flash-message:hover {
\t\t\t\tbox-shadow: 0 6px 20px rgba(0, 0, 0, 0.2) !important;
\t\t\t\ttransform: translateY(-2px);
\t\t\t}
\t\t\t.flash-message::before {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\tleft: 0;
\t\t\t\ttop: 0;
\t\t\t\tbottom: 0;
\t\t\t\twidth: 5px;
\t\t\t\tbackground: linear-gradient(180deg, currentColor 0%, rgba(255,255,255,0.3) 100%);
\t\t\t\tborder-radius: 12px 0 0 12px;
\t\t\t}
\t\t\t.flash-message.alert-success {
\t\t\t\tbackground: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%) !important;
\t\t\t\tcolor: #155724 !important;
\t\t\t\tborder-left: 5px solid #28a745 !important;
\t\t\t}
\t\t\t.flash-message.alert-success i.fa {
\t\t\t\tcolor: #28a745 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message.alert-danger {
\t\t\t\tbackground: linear-gradient(135deg, #f8d7da 0%, #f5c6cb 100%) !important;
\t\t\t\tcolor: #721c24 !important;
\t\t\t\tborder-left: 5px solid #dc3545 !important;
\t\t\t}
\t\t\t.flash-message.alert-danger i.fa {
\t\t\t\tcolor: #dc3545 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message.alert-warning {
\t\t\t\tbackground: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%) !important;
\t\t\t\tcolor: #856404 !important;
\t\t\t\tborder-left: 5px solid #ffc107 !important;
\t\t\t}
\t\t\t.flash-message.alert-warning i.fa {
\t\t\t\tcolor: #ffa200 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message.alert-info {
\t\t\t\tbackground: linear-gradient(135deg, #d1ecf1 0%, #bee5eb 100%) !important;
\t\t\t\tcolor: #0c5460 !important;
\t\t\t\tborder-left: 5px solid #17a2b8 !important;
\t\t\t}
\t\t\t.flash-message.alert-info i.fa {
\t\t\t\tcolor: #17a2b8 !important;
\t\t\t\tfont-size: 1.3rem !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\tmargin-right: 8px;
\t\t\t\tvertical-align: middle;
\t\t\t}
\t\t\t.flash-message strong {
\t\t\t\tflex: 1;
\t\t\t\tfont-weight: 600;
\t\t\t\tfont-size: 0.95rem;
\t\t\t\tline-height: 1.5;
\t\t\t}
\t\t\t.flash-message .btn-close {
\t\t\t\topacity: 0.7;
\t\t\t\tpadding: 8px !important;
\t\t\t\tmargin: -8px -8px -8px auto !important;
\t\t\t\ttransition: all 0.2s ease;
\t\t\t\tborder-radius: 50% !important;
\t\t\t\tbackground: rgba(0, 0, 0, 0.05) !important;
\t\t\t\twidth: 32px !important;
\t\t\t\theight: 32px !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tborder: none !important;
\t\t\t\tcursor: pointer !important;
\t\t\t\tposition: relative !important;
\t\t\t}
\t\t\t/* Ajouter une icône X visible dans le bouton */
\t\t\t.flash-message .btn-close::before {
\t\t\t\tcontent: '×' !important;
\t\t\t\tfont-size: 24px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tcolor: currentColor !important;
\t\t\t\tfont-weight: bold !important;
\t\t\t\tdisplay: block !important;
\t\t\t\tposition: absolute !important;
\t\t\t\ttop: 50% !important;
\t\t\t\tleft: 50% !important;
\t\t\t\ttransform: translate(-50%, -50%) !important;
\t\t\t}
\t\t\t.flash-message .btn-close:hover {
\t\t\t\topacity: 1 !important;
\t\t\t\tbackground: rgba(0, 0, 0, 0.15) !important;
\t\t\t\ttransform: rotate(90deg) !important;
\t\t\t}
\t\t\t.flash-message .btn-close:hover::before {
\t\t\t\ttransform: translate(-50%, -50%) rotate(-90deg) !important;
\t\t\t}
\t\t\t@keyframes slideInDownFlash {
\t\t\t\tfrom {
\t\t\t\t\topacity: 0;
\t\t\t\t\ttransform: translateY(-30px) scale(0.95);
\t\t\t\t}
\t\t\t\tto {
\t\t\t\t\topacity: 1;
\t\t\t\t\ttransform: translateY(0) scale(1);
\t\t\t\t}
\t\t\t}
\t\t\t#flash-messages-container {
\t\t\t\tmargin-top: 20px;
\t\t\t\tmargin-bottom: 0;
\t\t\t}
\t\t\t@media(max-width: 768px) {
\t\t\t\t.flash-message {
\t\t\t\t\tpadding: 14px 16px !important;
\t\t\t\t\tfont-size: 0.9rem;
\t\t\t\t}
\t\t\t\t.flash-message i {
\t\t\t\t\tfont-size: 1.2rem !important;
\t\t\t\t}
\t\t\t}
\t\t\t/* Styles pour l'icône de comparaison */
\t\t\t.comparison-icon {
\t\t\t\tposition: relative;
\t\t\t\tdisplay: inline-block;
\t\t\t\tcolor: #333;
\t\t\t\ttext-decoration: none;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.comparison-icon:hover {
\t\t\t\tcolor: #ffa200;
\t\t\t}
\t\t\t.comparison-badge {
\t\t\t\tposition: absolute;
\t\t\t\ttop: -4px;
\t\t\t\tright: -2px;
\t\t\t\tbackground: #095ad3 !important;
\t\t\t\tcolor: white !important;
\t\t\t\tborder-radius: 50%;
\t\t\t\twidth: 18px;
\t\t\t\theight: 18px;
\t\t\t\tfont-size: 8px !important;
\t\t\t\tdisplay: flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tfont-weight: bold !important;
\t\t\t\tanimation: pulse 2s infinite;
\t\t\t\tz-index: 10;
\t\t\t\tline-height: 1 !important;
\t\t\t}
\t\t\t/* Correction de l'alignement des boutons actifs dans prd-bottom */
\t\t\t/* Ne s'applique qu'aux boutons actifs pour éviter de casser le comportement hover */
\t\t\t.single-product .product-details .prd-bottom .social-info.active {
\t\t\t\tvertical-align: middle !important;
\t\t\t\tposition: relative !important;
\t\t\t\ttop: 0 !important;
\t\t\t\ttransform: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tline-height: normal !important;
\t\t\t\twidth: 35px !important;
\t\t\t\theight: auto !important;
\t\t\t\tmin-height: auto !important;
\t\t\t\tmax-height: none !important;
\t\t\t}
\t\t\t.single-product .product-details .prd-bottom .social-info.wishlist-btn.active,
\t\t\t.single-product .product-details .prd-bottom .social-info.comparison-btn.active {
\t\t\t\tvertical-align: middle !important;
\t\t\t\tposition: relative !important;
\t\t\t\ttop: 0 !important;
\t\t\t\ttransform: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tline-height: normal !important;
\t\t\t\twidth: 35px !important;
\t\t\t\theight: auto !important;
\t\t\t\tmin-height: auto !important;
\t\t\t\tmax-height: none !important;
\t\t\t}
\t\t\t.single-product .product-details .prd-bottom .social-info.active .hover-text {
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tline-height: normal !important;
\t\t\t\tposition: absolute !important;
\t\t\t\ttop: 0 !important;
\t\t\t\tbackground: #ffa200 !important;
\t\t\t\tleft: -40px !important;
\t\t\t}
\t\t\t/* S'assurer qu'aucune marge supplémentaire n'est ajoutée quand un bouton est actif */
\t\t\t.single-product .product-details .prd-bottom .social-info.active span,
\t\t\t.single-product .product-details .prd-bottom .social-info.active p {
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t/* Empêcher le hover de changer la largeur quand le bouton est actif */
\t\t\t.single-product .product-details .prd-bottom .social-info.active:hover {
\t\t\t\twidth: 35px !important;
\t\t\t}
\t\t\t.comparison-icon:hover .comparison-badge {
\t\t\t\tanimation: none;
\t\t\t}
\t\t\t/* Styles pour les mega-menus - style comme la barre de recherche */
\t\t\t.mega-menu {
\t\t\t\twidth: 100%;
\t\t\t\tmax-width: 1200px;
\t\t\t\tleft: 50%;
\t\t\t\ttransform: translateX(-50%);
\t\t\t\tpadding: 25px;
\t\t\t\tborder-radius: 12px;
\t\t\t\tbox-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
\t\t\t\tborder: none;
\t\t\t\tbackground: white;
\t\t\t\tdisplay: none;
\t\t\t\tposition: absolute;
\t\t\t\ttop: 100%;
\t\t\t\tz-index: 9999 !important;
\t\t\t\tmargin-top: 10px;
\t\t\t\topacity: 0;
\t\t\t\tvisibility: hidden;
\t\t\t\ttransition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;
\t\t\t}
\t\t\t.mega-menu.active {
\t\t\t\tdisplay: block;
\t\t\t\topacity: 1;
\t\t\t\tvisibility: visible;
\t\t\t\ttransform: translateX(-50%) translateY(0);
\t\t\t}
\t\t\t.nav-item.dropdown {
\t\t\t\tposition: relative !important;
\t\t\t}
\t\t\t@media(min-width: 768px) {
\t\t\t\t.nav-item.dropdown {
\t\t\t\t\tposition: relative !important;
\t\t\t\t}
\t\t\t\t.mega-menu {
\t\t\t\t\tposition: absolute !important;
\t\t\t\t\tleft: 50% !important;
\t\t\t\t\ttransform: translateX(-50%) !important;
\t\t\t\t\twidth: auto !important;
\t\t\t\t\tmin-width: 600px !important;
\t\t\t\t}
\t\t\t}
\t\t\t/* Correction supplémentaire pour l'affichage sur la page d'accueil */
\t\t\tbody.home .nav-item.dropdown,
\t\t\t.nav-item.dropdown {
\t\t\t\tposition: relative !important;
\t\t\t}
\t\t\tbody.home .mega-menu,
\t\t\t.mega-menu {
\t\t\t\tposition: absolute !important;
\t\t\t\tleft: 50% !important;
\t\t\t\ttransform: translateX(-50%) translateY(0) !important;
\t\t\t\twidth: auto !important;
\t\t\t\tmin-width: 600px !important;
\t\t\t\tmax-width: 90% !important;
\t\t\t\ttop: 100% !important;
\t\t\t\tmargin-top: 10px !important;
\t\t\t}
\t\t\t/* Assurer que les mega-menus sont toujours visibles au survol */
\t\t\t.nav-item.dropdown:hover .mega-menu {
\t\t\t\topacity: 1 !important;
\t\t\t\tvisibility: visible !important;
\t\t\t\tdisplay: block !important;
\t\t\t\ttransform: translateX(-50%) translateY(0) !important;
\t\t\t}
\t\t\t.mega-menu .dropdown-item {
\t\t\t\tpadding: 0;
\t\t\t\tborder: none;
\t\t\t}
\t\t\t.mega-menu .dropdown-header {
\t\t\t\tfont-weight: 700;
\t\t\t\tcolor: #2c3e50;
\t\t\t\tmargin-bottom: 18px;
\t\t\t\tpadding-bottom: 10px;
\t\t\t\tborder-bottom: 3px solid #3498db;
\t\t\t\tfont-size: 16px;
\t\t\t\ttext-transform: uppercase;
\t\t\t\tletter-spacing: 0.5px;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a {
\t\t\t\tdisplay: block;
\t\t\t\tpadding: 10px 15px;
\t\t\t\tcolor: #555;
\t\t\t\ttext-decoration: none;
\t\t\t\tborder-radius: 6px;
\t\t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t\tposition: relative;
\t\t\t\toverflow: hidden;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a::before {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\ttop: 0;
\t\t\t\tleft: -100%;
\t\t\t\twidth: 100%;
\t\t\t\theight: 100%;
\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(52, 152, 219, 0.1), transparent);
\t\t\t\ttransition: left 0.5s;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a:hover::before {
\t\t\t\tleft: 100%;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a:hover {
\t\t\t\tbackground: linear-gradient(135deg, #f8f9fa, #e3f2fd);
\t\t\t\tcolor: #2980b9;
\t\t\t\ttransform: translateX(8px);
\t\t\t\tbox-shadow: 0 2px 8px rgba(52, 152, 219, 0.2);
\t\t\t}
\t\t\t.mega-menu .dropdown-item a i {
\t\t\t\twidth: 22px;
\t\t\t\ttext-align: center;
\t\t\t\tmargin-right: 8px;
\t\t\t\tcolor: #3498db;
\t\t\t\ttransition: color 0.3s ease;
\t\t\t}
\t\t\t.mega-menu .dropdown-item a:hover i {
\t\t\t\tcolor: #2980b9;
\t\t\t}
\t\t\t/* Animation d'apparition améliorée */
\t\t\t@keyframes slideInDown {
\t\t\t\tfrom {
\t\t\t\t\topacity: 0;
\t\t\t\t\ttransform: translateY(-20px);
\t\t\t\t}
\t\t\t\tto {
\t\t\t\t\topacity: 1;
\t\t\t\t\ttransform: translateY(0);
\t\t\t\t}
\t\t\t}
\t\t\t.mega-menu {
\t\t\t\tanimation: slideInDown 0.4s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t}
\t\t\t/* Effet de survol sur le lien principal */
\t\t\t.nav-item.dropdown .nav-link {
\t\t\t\tposition: relative;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.nav-item.dropdown .nav-link::after {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\tbottom: -2px;
\t\t\t\tleft: 50%;
\t\t\t\twidth: 0;
\t\t\t\theight: 2px;
\t\t\t\tbackground: linear-gradient(90deg, #3498db, #2980b9);
\t\t\t\ttransition: all 0.3s ease;
\t\t\t\ttransform: translateX(-50%);
\t\t\t}
\t\t\t.nav-item.dropdown:hover .nav-link::after {
\t\t\t\twidth: 100%;
\t\t\t}
\t\t\t.nav-item.dropdown:hover .nav-link {
\t\t\t\tcolor: #2980b9;
\t\t\t}
\t\t\t@keyframes fadeInDown {
\t\t\t\tfrom {
\t\t\t\t\topacity: 0;
\t\t\t\t\ttransform: translateY(-10px);
\t\t\t\t}
\t\t\t\tto {
\t\t\t\t\topacity: 1;
\t\t\t\t\ttransform: translateY(0);
\t\t\t\t}
\t\t\t}
\t\t\t/* Responsive */
\t\t\t@media(max-width: 768px) {
\t\t\t\t.mega-menu {
\t\t\t\t\twidth: 100%;
\t\t\t\t\tleft: 0;
\t\t\t\t\tpadding: 15px;
\t\t\t\t}
\t\t\t\t.mega-menu .row {
\t\t\t\t\tmargin: 0;
\t\t\t\t}
\t\t\t\t.mega-menu .col-md-3 {
\t\t\t\t\tmargin-bottom: 20px;
\t\t\t\t}
\t\t\t}
\t\t\t/* ============================================
\t\t\t.footer-area {
\t\t\t\tbackground: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
\t\t\t\tposition: relative;
\t\t\t\toverflow: hidden;
\t\t\t\tpadding: 50px 0 20px;
\t\t\t}
\t\t\t.footer-pattern {
\t\t\t\tposition: absolute;
\t\t\t\ttop: 0;
\t\t\t\tleft: 0;
\t\t\t\tright: 0;
\t\t\t\tbottom: 0;
\t\t\t\tbackground-image: radial-gradient(circle at 20% 50%, rgba(255, 162, 0, 0.1) 0%, transparent 50%), radial-gradient(circle at 80% 80%, rgba(255, 162, 0, 0.08) 0%, transparent 50%);
\t\t\t\tpointer-events: none;
\t\t\t}
\t\t\t.footer-area .container {
\t\t\t\tposition: relative;
\t\t\t\tz-index: 1;
\t\t\t}
\t\t\t/* Widgets */
\t\t\t.single-footer-widget {
\t\t\t\tcolor: rgba(255, 255, 255, 0.9);
\t\t\t}
\t\t\t.footer-brand {
\t\t\t\tfont-size: 1.6rem;
\t\t\t\tfont-weight: 700;
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
\t\t\t\t-webkit-background-clip: text;
\t\t\t\t-webkit-text-fill-color: transparent;
\t\t\t\tbackground-clip: text;
\t\t\t\tmargin-bottom: 12px;
\t\t\t\tdisplay: inline-block;
\t\t\t}
\t\t\t.footer-widget-title {
\t\t\t\tcolor: #fff;
\t\t\t\tfont-size: 1rem;
\t\t\t\tfont-weight: 600;
\t\t\t\tmargin-bottom: 18px;
\t\t\t\tposition: relative;
\t\t\t\tpadding-bottom: 8px;
\t\t\t}
\t\t\t.footer-widget-title::after {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\tbottom: 0;
\t\t\t\tleft: 0;
\t\t\t\twidth: 40px;
\t\t\t\theight: 3px;
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
\t\t\t\tborder-radius: 2px;
\t\t\t}
\t\t\t.footer-description {
\t\t\t\tcolor: rgba(255, 255, 255, 0.7);
\t\t\t\tline-height: 1.6;
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tmargin-bottom: 0;
\t\t\t}
\t\t\t/* Liste de liens */
\t\t\t.footer-list {
\t\t\t\tlist-style: none;
\t\t\t\tpadding: 0;
\t\t\t\tmargin: 0;
\t\t\t}
\t\t\t.footer-list li {
\t\t\t\tmargin-bottom: 10px;
\t\t\t}
\t\t\t.footer-list li a {
\t\t\t\tcolor: rgba(255, 255, 255, 0.7);
\t\t\t\ttext-decoration: none;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tdisplay: inline-flex;
\t\t\t\talign-items: center;
\t\t\t}
\t\t\t.footer-list li a i {
\t\t\t\tfont-size: 0.8rem;
\t\t\t\topacity: 0.6;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.footer-list li a:hover {
\t\t\t\tcolor: #ffa200;
\t\t\t\ttransform: translateX(5px);
\t\t\t}
\t\t\t.footer-list li a:hover i {
\t\t\t\topacity: 1;
\t\t\t\tcolor: #ffa200;
\t\t\t}
\t\t\t/* Newsletter */
\t\t\t.footer-newsletter-text {
\t\t\t\tcolor: rgba(255, 255, 255, 0.7);
\t\t\t\tfont-size: 0.85rem;
\t\t\t\tmargin-bottom: 15px;
\t\t\t\tline-height: 1.5;
\t\t\t}
\t\t\t.footer-newsletter-wrapper {
\t\t\t\tmargin-bottom: 15px;
\t\t\t}
\t\t\t.newsletter-input-group {
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tbackground: rgba(255, 255, 255, 0.08);
\t\t\t\tborder-radius: 30px;
\t\t\t\tpadding: 4px 4px 4px 15px;
\t\t\t\tbackdrop-filter: blur(10px);
\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);
\t\t\t\ttransition: all 0.3s ease;
\t\t\t\tgap: 8px;
\t\t\t}
\t\t\t.newsletter-input-group:focus-within {
\t\t\t\tbackground: rgba(255, 255, 255, 0.12);
\t\t\t\tborder-color: rgba(255, 162, 0, 0.6);
\t\t\t\tbox-shadow: 0 0 0 2px rgba(255, 162, 0, 0.15);
\t\t\t}
\t\t\t.newsletter-icon {
\t\t\t\tcolor: rgba(255, 255, 255, 0.5);
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tflex-shrink: 0;
\t\t\t}
\t\t\t.newsletter-input-group:focus-within .newsletter-icon {
\t\t\t\tcolor: #ffa200;
\t\t\t}
\t\t\t.newsletter-input {
\t\t\t\tflex: 1;
\t\t\t\tbackground: transparent;
\t\t\t\tborder: none;
\t\t\t\tcolor: #fff;
\t\t\t\tpadding: 10px 8px;
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tmin-width: 0;
\t\t\t}
\t\t\t.newsletter-input::placeholder {
\t\t\t\tcolor: rgba(255, 255, 255, 0.4);
\t\t\t\tfont-size: 0.85rem;
\t\t\t}
\t\t\t.newsletter-input:focus {
\t\t\t\toutline: none;
\t\t\t\tbox-shadow: none;
\t\t\t}
\t\t\t.newsletter-btn {
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
\t\t\t\tborder: none;
\t\t\t\tcolor: white;
\t\t\t\twidth: 42px;
\t\t\t\theight: 42px;
\t\t\t\tmin-width: 42px;
\t\t\t\tmin-height: 42px;
\t\t\t\tborder-radius: 50%;
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tjustify-content: center;
\t\t\t\tcursor: pointer;
\t\t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
\t\t\t\tflex-shrink: 0;
\t\t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4), 0 0 0 0 rgba(255, 162, 0, 0.4);
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tposition: relative;
\t\t\t\toverflow: hidden;
\t\t\t}
\t\t\t.newsletter-btn::before {
\t\t\t\tcontent: '';
\t\t\t\tposition: absolute;
\t\t\t\ttop: 50%;
\t\t\t\tleft: 50%;
\t\t\t\twidth: 0;
\t\t\t\theight: 0;
\t\t\t\tborder-radius: 50%;
\t\t\t\tbackground: rgba(255, 255, 255, 0.3);
\t\t\t\ttransform: translate(-50%, -50%);
\t\t\t\ttransition: width 0.6s ease, height 0.6s ease;
\t\t\t}
\t\t\t.newsletter-btn:hover::before {
\t\t\t\twidth: 100%;
\t\t\t\theight: 100%;
\t\t\t}
\t\t\t.newsletter-btn:hover {
\t\t\t\ttransform: translateX(3px) scale(1.05);
\t\t\t\tbox-shadow: 0 6px 20px rgba(255, 162, 0, 0.5), 0 0 0 8px rgba(255, 162, 0, 0.1);
\t\t\t\tbackground: linear-gradient(135deg, #e8910a 0%, #ffa200 100%);
\t\t\t}
\t\t\t.newsletter-btn:active {
\t\t\t\ttransform: translateX(3px) scale(0.98);
\t\t\t\tbox-shadow: 0 3px 10px rgba(255, 162, 0, 0.4);
\t\t\t}
\t\t\t.newsletter-btn:focus {
\t\t\t\toutline: none;
\t\t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4), 0 0 0 3px rgba(255, 162, 0, 0.3);
\t\t\t}
\t\t\t.newsletter-btn-icon,
\t\t\t.newsletter-btn-loader {
\t\t\t\tposition: relative;
\t\t\t\tz-index: 2;
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tjustify-content: center;
\t\t\t\ttransition: all 0.3s ease;
\t\t\t}
\t\t\t.newsletter-btn:hover .newsletter-btn-icon {
\t\t\t\ttransform: translateX(2px) rotate(-10deg);
\t\t\t}
\t\t\t.newsletter-btn.loading .newsletter-btn-icon {
\t\t\t\topacity: 0;
\t\t\t\ttransform: scale(0);
\t\t\t}
\t\t\t.newsletter-btn.loading .newsletter-btn-loader {
\t\t\t\tdisplay: flex !important;
\t\t\t}
\t\t\t.newsletter-btn.success {
\t\t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
\t\t\t\tbox-shadow: 0 4px 15px rgba(40, 167, 69, 0.4);
\t\t\t}
\t\t\t.newsletter-btn.success .newsletter-btn-icon i::before {
\t\t\t\tcontent: \"\\f00c\";
\t\t\t}
\t\t\t/* Trust badges */
\t\t\t.footer-trust-badges {
\t\t\t\tdisplay: flex;
\t\t\t\tflex-direction: row;
\t\t\t\tgap: 15px;
\t\t\t\tflex-wrap: wrap;
\t\t\t}
\t\t\t.trust-item {
\t\t\t\tdisplay: flex;
\t\t\t\talign-items: center;
\t\t\t\tgap: 6px;
\t\t\t\tcolor: rgba(255, 255, 255, 0.6);
\t\t\t\tfont-size: 0.8rem;
\t\t\t}
\t\t\t.trust-item i {
\t\t\t\tcolor: #ffa200;
\t\t\t\tfont-size: 0.9rem;
\t\t\t}
\t\t\t/* Social icons */
\t\t\t.footer-social {
\t\t\t\tmargin-top: 0 !important;
\t\t\t\tposition: relative !important;
\t\t\t\twidth: 100% !important;
\t\t\t\tclear: both !important;
\t\t\t\tfloat: none !important;
\t\t\t}
\t\t\t.footer-social h6 {
\t\t\t\tcolor: #fff;
\t\t\t\tfont-size: 0.95rem;
\t\t\t\tfont-weight: 600;
\t\t\t\tmargin-bottom: 12px !important;
\t\t\t\tdisplay: block !important;
\t\t\t\twidth: 100% !important;
\t\t\t\tposition: relative !important;
\t\t\t\tclear: both !important;
\t\t\t\tfloat: none !important;
\t\t\t}
\t\t\t.footer-social-icons {
\t\t\t\tdisplay: flex !important;
\t\t\t\tgap: 12px !important;
\t\t\t\tflex-wrap: wrap !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: flex-start !important;
\t\t\t\twidth: 100% !important;
\t\t\t\tposition: relative !important;
\t\t\t\tclear: both !important;
\t\t\t\tfloat: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t.social-icon {
\t\t\t\twidth: 38px !important;
\t\t\t\theight: 38px !important;
\t\t\t\tmin-width: 38px !important;
\t\t\t\tmin-height: 38px !important;
\t\t\t\tdisplay: inline-flex !important;
\t\t\t\talign-items: center !important;
\t\t\t\tjustify-content: center !important;
\t\t\t\tbackground: rgba(255, 255, 255, 0.1) !important;
\t\t\t\tborder-radius: 50% !important;
\t\t\t\tcolor: rgba(255, 255, 255, 0.8) !important;
\t\t\t\ttext-decoration: none !important;
\t\t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
\t\t\t\tfont-size: 16px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tbackdrop-filter: blur(10px) !important;
\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1) !important;
\t\t\t\tflex-shrink: 0 !important;
\t\t\t\tposition: relative !important;
\t\t\t\tfloat: none !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t\tvertical-align: middle !important;
\t\t\t}
\t\t\t.social-icon i {
\t\t\t\tfont-size: 16px !important;
\t\t\t\tline-height: 1 !important;
\t\t\t\tdisplay: inline-block !important;
\t\t\t\ttransition: transform 0.3s ease !important;
\t\t\t\tposition: relative !important;
\t\t\t\tz-index: 1 !important;
\t\t\t\tmargin: 0 !important;
\t\t\t\tpadding: 0 !important;
\t\t\t}
\t\t\t.social-icon:hover {
\t\t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%) !important;
\t\t\t\ttransform: translateY(-5px) scale(1.1) !important;
\t\t\t\tcolor: white !important;
\t\t\t\tborder-color: transparent !important;
\t\t\t\tbox-shadow: 0 8px 20px rgba(255, 162, 0, 0.4) !important;
\t\t\t}
\t\t\t.social-icon:hover i {
\t\t\t\ttransform: scale(1.1) !important;
\t\t\t}
\t\t\t/* Footer divider */
\t\t\t.footer-divider {
\t\t\t\theight: 1px;
\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
\t\t\t\tmargin: 30px 0 20px;
\t\t\t}
\t\t\t/* Footer bottom */
\t\t\t.footer-bottom {
\t\t\t\tpadding-top: 15px;
\t\t\t}
\t\t\t.footer-text {
\t\t\t\tcolor: rgba(255, 255, 255, 0.6);
\t\t\t\tfont-size: 0.9rem;
\t\t\t\tmargin: 0;
\t\t\t\ttext-align: center;
\t\t\t}
\t\t\t/* Responsive */
\t\t\t@media(max-width: 991.98px) {
\t\t\t\t.footer-area {
\t\t\t\t\tpadding: 40px 0 20px;
\t\t\t\t}
\t\t\t\t.single-footer-widget {
\t\t\t\t\tmargin-bottom: 30px;
\t\t\t\t}
\t\t\t\t.footer-social {
\t\t\t\t\tmargin-top: 15px;
\t\t\t\t}
\t\t\t}
\t\t\t@media(max-width: 767.98px) {
\t\t\t\t.footer-area {
\t\t\t\t\tpadding: 35px 0 18px;
\t\t\t\t}
\t\t\t\t.footer-brand {
\t\t\t\t\tfont-size: 1.4rem;
\t\t\t\t}
\t\t\t\t.footer-widget-title {
\t\t\t\t\tfont-size: 0.95rem;
\t\t\t\t}
\t\t\t\t.newsletter-input-group {
\t\t\t\t\tpadding: 3px 3px 3px 12px;
\t\t\t\t}
\t\t\t\t.newsletter-input {
\t\t\t\t\tpadding: 8px 6px;
\t\t\t\t\tfont-size: 0.85rem;
\t\t\t\t}
\t\t\t\t.newsletter-btn {
\t\t\t\t\twidth: 38px;
\t\t\t\t\theight: 38px;
\t\t\t\t\tmin-width: 38px;
\t\t\t\t\tmin-height: 38px;
\t\t\t\t\tfont-size: 0.85rem;
\t\t\t\t}
\t\t\t\t.footer-trust-badges {
\t\t\t\t\tflex-direction: row;
\t\t\t\t\tflex-wrap: wrap;
\t\t\t\t\tjustify-content: flex-start;
\t\t\t\t\tgap: 12px;
\t\t\t\t}
\t\t\t}
\t\t\t@media(max-width: 575.98px) {
\t\t\t\t.footer-area {
\t\t\t\t\tpadding: 40px 0 20px;
\t\t\t\t}
\t\t\t\t.footer-brand {
\t\t\t\t\tfont-size: 1.3rem;
\t\t\t\t}
\t\t\t\t.social-icon {
\t\t\t\t\twidth: 38px;
\t\t\t\t\theight: 38px;
\t\t\t\t\tfont-size: 16px;
\t\t\t\t}
\t\t\t\t.social-icon i {
\t\t\t\t\tfont-size: 16px;
\t\t\t\t}
\t\t\t}
\t\t</style>
\t\t{% block stylesheets %}
\t\t\t{{ encore_entry_link_tags('app') }}
\t\t{% endblock %}
\t\t<!-- Script pour forcer l'application des styles CSS après chargement -->
\t\t<script>
\t\t\tdocument.addEventListener('DOMContentLoaded', function () { // Forcer le masquage du toggle sur grands écrans
if (window.innerWidth >= 992) {
const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
togglers.forEach(function (toggler) {
if (toggler) {
toggler.style.display = 'none';
toggler.style.visibility = 'hidden';
toggler.style.opacity = '0';
toggler.style.width = '0';
toggler.style.height = '0';
toggler.style.padding = '0';
toggler.style.margin = '0';
toggler.style.border = 'none';
toggler.style.position = 'absolute';
toggler.style.left = '-9999px';
}
});
const iconBars = document.querySelectorAll('.navbar-toggler .icon-bar, .header_area .navbar .navbar-toggler .icon-bar, .navbar-toggler-icon');
iconBars.forEach(function (bar) {
if (bar) {
bar.style.display = 'none';
bar.style.visibility = 'hidden';
}
});
}
// Alignement des icônes navbar sur mobile
const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
navbarRight.forEach(function (nav) {
if (nav && window.innerWidth<= 991.98) {
// Mobile: colonne avec icônes alignées horizontalement
nav.style.display = 'flex';
nav.style.flexDirection = 'column';
nav.style.alignItems = 'center';
nav.style.textAlign = 'center';
// Le container d'icônes reste horizontal
const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
if (iconsContainer) {
iconsContainer.style.display = 'flex';
iconsContainer.style.flexDirection = 'row';
iconsContainer.style.justifyContent = 'center';
}
// Le bouton compte en bas
const accountBtn = nav.querySelector('li:last-child');
if (accountBtn) {
accountBtn.style.width = '100%';
accountBtn.style.display = 'flex';
accountBtn.style.justifyContent = 'center';
accountBtn.style.marginTop = '12px';
accountBtn.style.paddingTop = '12px';
accountBtn.style.borderTop = '1px solid #e0e0e0';
}
} else if (nav && window.innerWidth> 991.98) { // Desktop: alignement horizontal normal
nav.style.display = 'flex';
nav.style.flexDirection = 'row';
nav.style.alignItems = 'center';
nav.style.justifyContent = 'flex-end';
}
});
});
// Réappliquer lors du redimensionnement
window.addEventListener('resize', function () {
if (window.innerWidth >= 992) {
const togglers = document.querySelectorAll('.navbar-toggler, .header_area .navbar .navbar-toggler');
togglers.forEach(function (toggler) {
if (toggler) {
toggler.style.display = 'none';
toggler.style.visibility = 'hidden';
}
});
}
// Réappliquer l'alignement des icônes navbar
const navbarRight = document.querySelectorAll('.navbar-right, .header_area .navbar .nav.navbar-nav.navbar-right');
navbarRight.forEach(function (nav) {
if (nav && window.innerWidth<= 991.98) {
// Mobile: colonne avec icônes alignées horizontalement
nav.style.display = 'flex';
nav.style.flexDirection = 'column';
nav.style.alignItems = 'center';
nav.style.textAlign = 'center';
// Le container d'icônes reste horizontal
const iconsContainer = nav.querySelector('.navbar-icons-wrapper');
if (iconsContainer) {
iconsContainer.style.display = 'flex';
iconsContainer.style.flexDirection = 'row';
iconsContainer.style.justifyContent = 'center';
}
const accountBtn = nav.querySelector('li:last-child');
if (accountBtn) {
accountBtn.style.width = '100%';
accountBtn.style.display = 'flex';
accountBtn.style.justifyContent = 'center';
accountBtn.style.marginTop = '12px';
accountBtn.style.paddingTop = '12px';
accountBtn.style.borderTop = '1px solid #e0e0e0';
}
} else if (nav && window.innerWidth> 991.98) { // Desktop: alignement horizontal normal
nav.style.display = 'flex';
nav.style.flexDirection = 'row';
nav.style.alignItems = 'center';
nav.style.justifyContent = 'flex-end';
}
});
});
\t\t</script>
\t</head>
\t<body
\t\t{% if current_menu is defined and current_menu == \"listing\" %} id=\"category\" {% endif %}>
\t\t<!-- Start Header Area -->
\t\t<header class=\"header_area sticky-header\">
\t\t\t<div class=\"main_menu\">
\t\t\t\t<nav class=\"navbar navbar-expand-lg navbar-light main_box\">
\t\t\t\t\t<div
\t\t\t\t\t\tclass=\"container\">
\t\t\t\t\t\t<!-- Brand and toggle get grouped for better mobile display -->
\t\t\t\t\t\t<a class=\"navbar-brand logo_h\" href=\"{{ path('ui_home') }}\"><img style=\"width: auto;height: 60px\" src=\"{{ asset('logo.png') }}\" alt=\"\"></a>
\t\t\t\t\t\t<button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">
\t\t\t\t\t\t\t<span class=\"icon-bar\"></span>
\t\t\t\t\t\t\t<span class=\"icon-bar\"></span>
\t\t\t\t\t\t\t<span class=\"icon-bar\"></span>
\t\t\t\t\t\t</button>
\t\t\t\t\t\t<!-- Collect the nav links, forms, and other content for toggling -->
\t\t\t\t\t\t<div class=\"collapse navbar-collapse offset\" id=\"navbarSupportedContent\">
\t\t\t\t\t\t\t<ul class=\"nav navbar-nav menu_nav ml-auto\">
\t\t\t\t\t\t\t\t<li class=\"nav-item {% if current_menu is defined and current_menu == \" home\" %}active{% endif %}\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"{{ path('ui_home') }}\">Accueil</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item {% if current_menu is defined and current_menu == \" shops\" %}active{% endif %}\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"{{ path('ui_shops_list') }}\">Boutiques</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item {% if current_menu is defined and current_menu == \" listing\" %}active{% endif %}\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"{{ path('ui_listing') }}\">Produits</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item {% if current_menu is defined and current_menu == \" contact\" %}active{% endif %}\">
\t\t\t\t\t\t\t\t\t<a class=\"nav-link\" href=\"{{ path('ui_contact') }}\">Contact</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t\t<ul class=\"nav navbar-nav navbar-right\">
\t\t\t\t\t\t\t\t<li class=\"nav-item\">
\t\t\t\t\t\t\t\t\t<div class=\"navbar-icons-wrapper\">
\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_cart') }}\" class=\"cart {% if current_menu is defined and current_menu == \" cart\" %}active{% endif %}\" aria-label=\"Panier\">
\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t\t{% if app.user %}
\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('notifications_list') }}\" class=\"notification-icon\" title=\"Notifications\" aria-label=\"Notifications\">
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bell\"></span>
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"notification-badge text-white\" id=\"notificationBadge\" style=\"display: none;color: white;\">0</span>
\t\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_comparison') }}\" class=\"comparison-icon\" title=\"Comparaison\" aria-label=\"Comparaison\">
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-sync\"></span>
\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"comparison-badge text-white\" id=\"comparisonBadge\" style=\"display: none;color: white;\">0</span>
\t\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t\t{% endif %}
\t\t\t\t\t\t\t\t\t\t<button class=\"search\" type=\"button\" aria-label=\"Recherche\">
\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-magnifier\" id=\"search\"></span>
\t\t\t\t\t\t\t\t\t\t</button>
\t\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li class=\"nav-item\">
\t\t\t\t\t\t\t\t\t{% if app.user %}
\t\t\t\t\t\t\t\t\t\t<a class=\"nav-link btn btn-primary btn-account text-white\" href=\"{{ path('ui_account_index') }}\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"ti-user\"></i>
\t\t\t\t\t\t\t\t\t\t\tMon compte
\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t{% else %}
\t\t\t\t\t\t\t\t\t\t<a class=\"nav-link btn btn-primary btn-account text-white\" href=\"{{ path('ui_app_login') }}\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"ti-lock\"></i>
\t\t\t\t\t\t\t\t\t\t\tSe connecter
\t\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t{% endif %}
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t</nav>
\t\t\t</div>
\t\t\t<div class=\"search_input\" id=\"search_input_box\">
\t\t\t\t<div class=\"container\">
\t\t\t\t\t<form class=\"d-flex justify-content-between\" id=\"search_form\" action=\"{{ path('ui_listing') }}\" method=\"get\">
\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" id=\"search_input\" name=\"q\" placeholder=\"Rechercher un produit, une boutique, une catégorie...\" autocomplete=\"off\" value=\"{{ app.request.query.get('q', '') }}\">
\t\t\t\t\t\t<button type=\"button\" class=\"btn\" id=\"search_submit_btn\">
\t\t\t\t\t\t\t<i class=\"lnr lnr-magnifier\"></i>
\t\t\t\t\t\t</button>
\t\t\t\t\t\t{% if app.request.query.get('q') %}
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-clear-search\" id=\"clear_search_btn\" title=\"Effacer la recherche\">
\t\t\t\t\t\t\t\t<i class=\"lnr lnr-cross\"></i>
\t\t\t\t\t\t\t</button>
\t\t\t\t\t\t{% endif %}
\t\t\t\t\t\t<span class=\"lnr lnr-cross\" id=\"close_search\" title=\"Fermer la recherche\"></span>
\t\t\t\t\t</form>
\t\t\t\t\t<div id=\"search_results\" class=\"search-results-container\"></div>
\t\t\t\t</div>
\t\t\t</div>
\t\t</header>
\t\t<!-- End Header Area -->
\t\t<!-- Flash Messages -->
\t\t<div class=\"container mt-3\" id=\"flash-messages-container\" style=\"position: relative; z-index: 1050;\">
\t\t\t<div class=\"row\">
\t\t\t\t<div class=\"col-12\">
\t\t\t\t\t{% for message in app.flashes('success') %}
\t\t\t\t\t\t<div class=\"alert alert-success alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-check-circle\"></i>
\t\t\t\t\t\t\t<strong>{{ message }}</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t{% endfor %}
\t\t\t\t\t{% for message in app.flashes('error') %}
\t\t\t\t\t\t<div class=\"alert alert-danger alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-exclamation-circle\"></i>
\t\t\t\t\t\t\t<strong>{{ message }}</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t{% endfor %}
\t\t\t\t\t{% for message in app.flashes('warning') %}
\t\t\t\t\t\t<div class=\"alert alert-warning alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-exclamation-triangle\"></i>
\t\t\t\t\t\t\t<strong>{{ message }}</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t{% endfor %}
\t\t\t\t\t{% for message in app.flashes('info') %}
\t\t\t\t\t\t<div class=\"alert alert-info alert-dismissible fade show flash-message\" role=\"alert\">
\t\t\t\t\t\t\t<i class=\"fa fa-info-circle\"></i>
\t\t\t\t\t\t\t<strong>{{ message }}</strong>
\t\t\t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>
\t\t\t\t\t\t</div>
\t\t\t\t\t{% endfor %}
\t\t\t\t</div>
\t\t\t</div>
\t\t</div>
\t\t{% block body %}{% endblock %}
\t\t<!-- start footer Area -->
\t\t<footer class=\"footer-area section_gap\">
\t\t\t<div class=\"footer-pattern\"></div>
\t\t\t<div class=\"container\">
\t\t\t\t<div class=\"row\">
\t\t\t\t\t<div class=\"col-lg-3 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<div class=\"footer-logo mb-3\">
\t\t\t\t\t\t\t\t<h4 class=\"footer-brand\">MaketOu</h4>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t<p class=\"footer-description\">
\t\t\t\t\t\t\t\tMaketOu est la première marketplace haïtienne qui connecte les acheteurs et les vendeurs.
\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t Nous offrons une plateforme sécurisée et moderne pour le commerce en ligne en Haïti.
\t\t\t\t\t\t\t</p>
\t\t\t\t\t\t\t<div class=\"footer-social mt-3\">
\t\t\t\t\t\t\t\t<h6 class=\"mb-2\">Suivez-nous</h6>
\t\t\t\t\t\t\t\t<div class=\"footer-social-icons\">
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"Facebook\" title=\"Facebook\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-facebook\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"Twitter\" title=\"Twitter\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-twitter\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"Instagram\" title=\"Instagram\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-instagram\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-icon\" aria-label=\"LinkedIn\" title=\"LinkedIn\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-linkedin\"></i>
\t\t\t\t\t\t\t\t\t</a>
\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Liens rapides</h6>
\t\t\t\t\t\t\t<ul class=\"footer-list\">
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_home') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Accueil</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_listing') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Produits</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_shops_list') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Boutiques</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t{% if app.user %}
\t\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_account_index') }}\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Mon compte</a>
\t\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t{% else %}
\t\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_app_login') }}\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Se connecter</a>
\t\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_app_register') }}\">
\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> S'inscrire</a>
\t\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t{% endif %}
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Pour les vendeurs</h6>
\t\t\t\t\t\t\t<ul class=\"footer-list\">
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('seller_index') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Ouvrir une boutique</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('seller_help_how_to_sell') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Comment vendre</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('seller_help_pricing') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Tarifs</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('seller_help_support') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Support vendeur</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-2 col-md-6 col-sm-6 mb-4 mb-lg-0\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Support</h6>
\t\t\t\t\t\t\t<ul class=\"footer-list\">
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_help') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Centre d'Aide</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_contact') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Contactez-nous</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_faq') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> FAQ</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_privacy') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Politique de Confidentialité</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t\t<li>
\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_terms') }}\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-angle-right me-2\"></i> Conditions d'Utilisation</a>
\t\t\t\t\t\t\t\t</li>
\t\t\t\t\t\t\t</ul>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"col-lg-3 col-md-6 col-sm-6\">
\t\t\t\t\t\t<div class=\"single-footer-widget\">
\t\t\t\t\t\t\t<h6 class=\"footer-widget-title\">Newsletter</h6>
\t\t\t\t\t\t\t<p class=\"footer-newsletter-text\">Restez informé des dernières nouveautés</p>
\t\t\t\t\t\t\t<div class=\"footer-newsletter-wrapper\" id=\"mc_embed_signup\">
\t\t\t\t\t\t\t\t<form action=\"{{ path('ui_newsletter_subscribe') }}\" method=\"post\" class=\"footer-newsletter-form\">
\t\t\t\t\t\t\t\t\t<div class=\"newsletter-input-group\">
\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-envelope newsletter-icon\"></i>
\t\t\t\t\t\t\t\t\t\t<input class=\"form-control newsletter-input\" name=\"email\" placeholder=\"Votre email\" required type=\"email\">
\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"newsletter-btn\" aria-label=\"S'abonner\">
\t\t\t\t\t\t\t\t\t\t\t<span class=\"newsletter-btn-icon\">
\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-paper-plane\" aria-hidden=\"true\"></i>
\t\t\t\t\t\t\t\t\t\t\t</span>
\t\t\t\t\t\t\t\t\t\t\t<span class=\"newsletter-btn-loader\" style=\"display: none;\">
\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-spinner fa-spin\" aria-hidden=\"true\"></i>
\t\t\t\t\t\t\t\t\t\t\t</span>
\t\t\t\t\t\t\t\t\t\t</button>
\t\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t\t</form>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t<div class=\"footer-trust-badges mt-3\">
\t\t\t\t\t\t\t\t<div class=\"trust-item\">
\t\t\t\t\t\t\t\t\t<i class=\"fa fa-shield\"></i>
\t\t\t\t\t\t\t\t\t<span>Paiement sécurisé</span>
\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t\t<div class=\"trust-item\">
\t\t\t\t\t\t\t\t\t<i class=\"fa fa-truck\"></i>
\t\t\t\t\t\t\t\t\t<span>Livraison rapide</span>
\t\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t</div>
\t\t\t\t<div class=\"footer-divider\"></div>
\t\t\t\t<div class=\"footer-bottom d-flex justify-content-center align-items-center flex-wrap\">
\t\t\t\t\t<p class=\"footer-text m-0\">
\t\t\t\t\t\tCopyright ©<script>
\t\t\t\t\t\t\tdocument.write(new Date().getFullYear());
\t\t\t\t\t\t</script>
\t\t\t\t\t\tTous droits réservés | Ce site a été fait avec
\t\t\t\t\t\t<i class=\"fa fa-heart-o\" aria-hidden=\"true\" style=\"color: #dc3545;\"></i>
\t\t\t\t\t\tpar
\t\t\t\t\t\t<a href=\"https://tech.foulgor.com\" target=\"_blank\" style=\"color: #ffa200;\">Foulgor Tech</a>
\t\t\t\t\t</p>
\t\t\t\t</div>
\t\t\t</div>
\t\t</footer>
\t\t<style>
\t\t\t.search-results-container {
\t\t\t\tposition: absolute;
\t\t\t\ttop: 100%;
\t\t\t\tleft: 15px;
\t\t\t\tright: 15px;
\t\t\t\tbackground: #fff;
\t\t\t\tborder: 1px solid #ddd;
\t\t\t\tborder-top: none;
\t\t\t\tz-index: 9999;
\t\t\t\tbox-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
\t\t\t\tmax-height: 400px;
\t\t\t\toverflow-y: auto;
\t\t\t\tdisplay: none;
\t\t\t\tborder-radius: 0 0 4px 4px;
\t\t\t}
\t\t\t.search-results-container .list-group-item {
\t\t\t\tborder-left: none;
\t\t\t\tborder-right: none;
\t\t\t\tborder-radius: 0;
\t\t\t\tcursor: pointer;
\t\t\t\tpadding: 12px 15px;
\t\t\t\ttransition: background-color 0.2s ease;
\t\t\t}
\t\t\t.search-results-container .list-group-item:hover {
\t\t\t\tbackground-color: #f8f9fa;
\t\t\t}
\t\t\t.search-results-container .list-group-item i {
\t\t\t\tcolor: #777;
\t\t\t\tfont-size: 1.2rem;
\t\t\t}
\t\t\t/* Ensure container is relative for absolute positioning of results */
\t\t\t#search_input_box .container {
\t\t\t\tposition: relative;
\t\t\t}
\t\t\t#search_input_box .form-control {
\t\t\t\tflex: 1;
\t\t\t\tpadding-right: 10px;
\t\t\t}
\t\t\t#search_input_box #search_submit_btn {
\t\t\t\tbackground: transparent;
\t\t\t\tborder: 0;
\t\t\t\tcolor: #fff;
\t\t\t\tpadding: 0 15px;
\t\t\t\tcursor: pointer;
\t\t\t\ttransition: opacity 0.3s ease;
\t\t\t}
\t\t\t#search_input_box #search_submit_btn:hover {
\t\t\t\topacity: 0.8;
\t\t\t}
\t\t\t#search_input_box .btn-clear-search {
\t\t\t\tbackground: transparent;
\t\t\t\tborder: 0;
\t\t\t\tcolor: #fff;
\t\t\t\tpadding: 0 10px;
\t\t\t\tcursor: pointer;
\t\t\t\ttransition: opacity 0.3s ease;
\t\t\t\tdisplay: none;
\t\t\t}
\t\t\t#search_input_box .btn-clear-search:hover {
\t\t\t\topacity: 0.8;
\t\t\t}
\t\t\t#search_input_box .btn-clear-search i {
\t\t\t\tfont-size: 1.1rem;
\t\t\t}
\t\t\t#search_input_box form {
\t\t\t\tposition: relative;
\t\t\t\talign-items: center;
\t\t\t}
\t\t</style>
\t\t<script>
\t\t\t// Debounced autocomplete for header search
(function () {
const input = document.getElementById('search_input');
const box = document.getElementById('search_results');
const searchForm = document.getElementById('search_form');
const clearSearchBtn = document.getElementById('clear_search_btn');
const closeSearchBtn = document.getElementById('close_search');
if (! input || ! box)
return;
// Fonction pour effacer la recherche
function clearSearch() {
input.value = '';
box.style.display = 'none';
box.innerHTML = '';
if (clearSearchBtn) {
clearSearchBtn.style.display = 'none';
}
// Si on est sur la page listing, utiliser AJAX pour mettre à jour
if (typeof currentFilters !== 'undefined') {
currentFilters.q = '';
currentFilters.page = 1;
if (typeof applyFilters === 'function') {
applyFilters();
}
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
} else { // Sinon, rediriger vers la page listing sans recherche
window.location.href = '{{ path('ui_listing') }}';
}
}
// Bouton pour effacer la recherche
if (clearSearchBtn) {
clearSearchBtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
clearSearch();
});
}
// Bouton de soumission de recherche
var searchSubmitBtn = document.getElementById('search_submit_btn');
if (searchSubmitBtn) {
searchSubmitBtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return false;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '{{ path('ui_listing') }}' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
});
}
// Gestion du formulaire de recherche
if (searchForm) {
searchForm.addEventListener('submit', function (e) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '{{ path('ui_listing') }}' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
});
}
let t = null;
input.addEventListener('input', function () {
const q = input.value.trim();
clearTimeout(t);
if (q.length === 0) {
box.style.display = 'none';
box.innerHTML = '';
// Afficher/masquer le bouton clear
if (clearSearchBtn) {
clearSearchBtn.style.display = 'none';
}
return;
}
// Afficher le bouton clear
if (clearSearchBtn) {
clearSearchBtn.style.display = 'block';
}
t = setTimeout(() => fetchSuggestions(q), 300);
});
function fetchSuggestions(q) {
const url = '{{ path('ui_api_search_suggest') }}' + '?q=' + encodeURIComponent(q);
fetch(url).then(r => r.json()).then(data => {
if (!data.success) {
box.style.display = 'none';
return;
}
renderSuggestions(data.results || []);
}).catch(() => {
box.style.display = 'none';
});
}
function renderSuggestions(items) {
if (! items.length) {
box.style.display = 'none';
box.innerHTML = '';
return;
}
box.innerHTML = items.map(it => suggestionItem(it)).join('');
box.style.display = 'block';
}
function suggestionItem(it) {
const icon = it.type === 'product' ? 'ti-package' : (it.type === 'shop' ? 'ti-briefcase' : (it.type === 'category' ? 'ti-layers' : 'ti-tag'));
const typeLabel = it.type === 'product' ? 'Produit' : (it.type === 'shop' ? 'Boutique' : (it.type === 'category' ? 'Catégorie' : 'Tag'));
return '<a href=\"' + it.url + '\" class=\"list-group-item list-group-item-action d-flex align-items-center\">' + '<i class=\"' + icon + ' me-3\"></i>' + '<span class=\"flex-grow-1\">' + escapeHtml(it.label) + '</span>' + '<span class=\"badge bg-light text-dark ms-2\">' + typeLabel + '</span>' + '</a>';
}
function escapeHtml(s) {
return s.replace(/[&<>\"]+/g, c => ({'&': '&', '<': '<', '>': '>', '\"': '"'}[c]));
}
document.addEventListener('click', function (e) {
if (! box.contains(e.target) && e.target !== input) {
box.style.display = 'none';
}
});
window.handleSearchSubmit = function (e) {
if (e)
e.preventDefault();
const first = box.querySelector('a');
if (first) {
window.location.href = first.getAttribute('href');
return false;
}
// fallback to listing page search by name
const q = input.value.trim();
if (q.length) { // Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined') {
currentFilters.q = q;
currentFilters.page = 1;
if (typeof applyFilters === 'function') {
applyFilters();
}
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
} else {
window.location.href = '{{ path('ui_listing') }}' + '?q=' + encodeURIComponent(q);
}
}
return false;
}
// Gestion de la touche Enter dans le champ de recherche
if (input) {
input.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.keyCode === 13) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return false;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '{{ path('ui_listing') }}' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
}
});
}
// Ajouter un event listener au bouton de soumission (réutiliser la variable si elle existe déjà)
if (!searchSubmitBtn) {
searchSubmitBtn = document.getElementById('search_submit_btn');
}
if (searchSubmitBtn) {
searchSubmitBtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const q = input.value.trim();
if (q.length === 0) {
clearSearch();
return false;
}
// Si on est sur la page listing, utiliser AJAX
if (typeof currentFilters !== 'undefined' && typeof applyFilters === 'function') {
currentFilters.q = q;
currentFilters.page = 1;
applyFilters();
if (typeof updateActiveFilters === 'function') {
updateActiveFilters();
}
// Fermer la boîte de recherche
if (closeSearchBtn) {
closeSearchBtn.click();
}
} else { // Sinon, rediriger vers la page listing avec la recherche
const listingUrl = '{{ path('ui_listing') }}' + '?q=' + encodeURIComponent(q);
window.location.href = listingUrl;
}
return false;
});
}
// Afficher le bouton clear au chargement si une recherche est active
document.addEventListener('DOMContentLoaded', function () {
const q = input.value.trim();
if (q.length > 0 && clearSearchBtn) {
clearSearchBtn.style.display = 'block';
}
});
})();
// Gestion des mega-menus avec clic (comme la barre de recherche)
document.addEventListener('DOMContentLoaded', function () {
const dropdownItems = document.querySelectorAll('.nav-item.dropdown');
dropdownItems.forEach(function (item) {
const dropdownToggle = item.querySelector('.dropdown-toggle');
const dropdownMenu = item.querySelector('.mega-menu');
if (! dropdownToggle || ! dropdownMenu)
return;
// Fermer les autres menus quand on ouvre un nouveau
function closeAllMenus() {
dropdownItems.forEach(function (otherItem) {
const otherMenu = otherItem.querySelector('.mega-menu');
if (otherMenu && otherMenu !== dropdownMenu) {
\$(otherMenu).slideUp(300);
otherMenu.classList.remove('active');
}
});
}
// Toggle au clic (comme la barre de recherche)
dropdownToggle.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
closeAllMenus();
if (dropdownMenu.classList.contains('active')) { // Fermer le menu
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
setTimeout(() => {
dropdownMenu.classList.remove('active');
dropdownMenu.style.display = 'none';
}, 300);
} else { // Ouvrir le menu
dropdownMenu.style.display = 'block';
setTimeout(() => {
dropdownMenu.classList.add('active');
dropdownMenu.style.opacity = '1';
dropdownMenu.style.visibility = 'visible';
dropdownMenu.style.transform = 'translateX(-50%) translateY(0)';
}, 10);
}
});
// Fermer au clic en dehors
document.addEventListener('click', function (e) {
if (! item.contains(e.target) && dropdownMenu.classList.contains('active')) {
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateX(-50%) translateY(-10px)';
setTimeout(() => {
dropdownMenu.classList.remove('active');
dropdownMenu.style.display = 'none';
}, 300);
}
});
// Animation des éléments du menu
const menuItems = dropdownMenu.querySelectorAll('.dropdown-item a');
menuItems.forEach(function (menuItem, index) {
menuItem.style.animationDelay = (index * 0.05) + 's';
});
});
// Gestion des clics sur mobile
if (window.innerWidth <= 768) {
dropdownItems.forEach(function (item) {
const dropdownToggle = item.querySelector('.dropdown-toggle');
const dropdownMenu = item.querySelector('.mega-menu');
dropdownToggle.addEventListener('click', function (e) {
e.preventDefault();
// Fermer tous les autres menus
dropdownItems.forEach(function (otherItem) {
if (otherItem !== item) {
const otherMenu = otherItem.querySelector('.mega-menu');
otherMenu.style.opacity = '0';
otherMenu.style.visibility = 'hidden';
otherMenu.style.transform = 'translateY(-10px)';
}
});
// Toggle le menu actuel
if (dropdownMenu.style.opacity === '1') {
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateY(-10px)';
} else {
dropdownMenu.style.opacity = '1';
dropdownMenu.style.visibility = 'visible';
dropdownMenu.style.transform = 'translateY(0)';
}
});
});
}
// Fermer les menus quand on clique ailleurs
document.addEventListener('click', function (e) {
if (! e.target.closest('.nav-item.dropdown')) {
dropdownItems.forEach(function (item) {
const dropdownMenu = item.querySelector('.mega-menu');
dropdownMenu.style.opacity = '0';
dropdownMenu.style.visibility = 'hidden';
dropdownMenu.style.transform = 'translateY(-10px)';
});
}
});
});
\t\t</script>
\t\t<!-- End footer Area -->
\t\t<script src=\"{{ asset('ui/js/vendor/jquery-2.2.4.min.js') }}\"></script>
\t\t<script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>
\t\t<script>
\t\t\t// Initialiser le collapse Bootstrap 5 pour le menu hamburger après chargement de Bootstrap
document.addEventListener('DOMContentLoaded', function () { // Attendre que Bootstrap soit complètement chargé
if (typeof bootstrap !== 'undefined') {
const navbarToggler = document.querySelector('.navbar-toggler');
const navbarCollapse = document.getElementById('navbarSupportedContent');
if (navbarToggler && navbarCollapse) {
// Bootstrap 5 devrait gérer automatiquement avec data-bs-toggle
// Mais on s'assure que ça fonctionne en écoutant les événements
navbarCollapse.addEventListener('show.bs.collapse', function () {
navbarToggler.setAttribute('aria-expanded', 'true');
navbarToggler.classList.add('active');
});
navbarCollapse.addEventListener('hide.bs.collapse', function () {
navbarToggler.setAttribute('aria-expanded', 'false');
navbarToggler.classList.remove('active');
});
}
}
});
\t\t</script>
\t\t<script src=\"https://unpkg.com/dropzone@5/dist/min/dropzone.min.js\"></script>
\t\t<script src=\"{{ asset('ui/js/jquery.ajaxchimp.min.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/jquery.nice-select.min.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/jquery.sticky.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/nouislider.min.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/countdown.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/jquery.magnific-popup.min.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/owl.carousel.min.js') }}\"></script>
\t\t<script src=\"https://maps.googleapis.com/maps/api/js?key=AIzaSyCjCGmQ0Uq4exrzdcL6rvxywDDOvfAu6eE\"></script>
\t\t<script src=\"{{ asset('ui/js/gmaps.min.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/main.js') }}\"></script>
\t\t{{ encore_entry_script_tags('app') }}
\t\t<!-- PWA Service Worker Registration -->
\t\t<script>
\t\t\t// Enregistrement du Service Worker
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('{{ asset('sw.js') }}').then((registration) => {
console.log('Service Worker enregistré avec succès:', registration.scope);
// Vérifie les mises à jour du service worker
registration.addEventListener('updatefound', () => {
const newWorker = registration.installing;
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { // Nouveau service worker disponible
if (confirm('Une nouvelle version de MaketOu est disponible. Voulez-vous l\\'installer maintenant ?')) {
newWorker.postMessage({type: 'SKIP_WAITING'});
window.location.reload();
}
}
});
});
}).catch((error) => {
console.log('Échec de l\\'enregistrement du Service Worker:', error);
});
// Écoute les messages du service worker
navigator.serviceWorker.addEventListener('message', (event) => {
console.log('Message du Service Worker:', event.data);
});
});
}
\t\t</script>
\t\t<!-- PWA Install Script -->
\t\t<script src=\"{{ asset('js/pwa-install.js') }}\"></script>
\t\t<script>
\t\t\t// Charger les compteurs au chargement de la page
document.addEventListener('DOMContentLoaded', function () {
{% if app.user %}
loadNotificationCount();
// Délai pour s'assurer que la session est bien établie après connexion
setTimeout(function () {
loadComparisonCount();
}, 500);{% endif %}
// Gérer le bouton de recherche mobile
const searchMobileBtn = document.getElementById('searchMobileBtn');
if (searchMobileBtn) {
searchMobileBtn.addEventListener('click', function (e) {
e.preventDefault();
// Utiliser le même comportement que le bouton desktop
const searchBox = document.getElementById('search_input_box');
if (searchBox) {
searchBox.style.display = 'block';
const searchInput = document.getElementById('search_input');
if (searchInput) {
setTimeout(() => searchInput.focus(), 100);
}
}
});
}
});
function loadNotificationCount() {
{% if app.user %}
fetch('{{ path(\"api_notifications_count\") }}').then(response => {
if (!response.ok) {
throw new Error('Erreur HTTP: ' + response.status);
}
return response.json();
}).then(data => {
const count = data.count || 0;
// Mettre à jour tous les badges de notification
const badges = [document.getElementById('notificationBadge'), document.getElementById('notificationBadgeMobile'), document.querySelector('.notification-badge')].filter(badge => badge !== null);
badges.forEach(badge => {
if (count > 0) {
badge.textContent = count;
badge.style.display = 'flex';
badge.style.color = 'white';
badge.style.backgroundColor = '#dc3545';
} else {
badge.style.display = 'none';
}
});
// Si on est sur la page des notifications, mettre à jour aussi le contenu de la page
if (typeof updateNotificationPageContent === 'function') {
updateNotificationPageContent(count);
}
}).catch(error => {
console.error('Erreur lors du chargement du compteur de notifications:', error);
});{% endif %}
}
// Exposer la fonction globalement pour qu'elle puisse être appelée depuis d'autres pages
window.loadNotificationCount = loadNotificationCount;
// Recharger le compteur toutes les 30 secondes pour garder les données à jour
{% if app.user %}
setInterval(function () {
loadNotificationCount();
}, 30000);{% endif %}function loadComparisonCount() {
{% if app.user %}
// Ne pas appeler l'API si on est sur une page d'erreur ou de redirection
if (window.location.pathname.includes('/api/') || window.location.pathname.includes('/login')) {
return;
}
// Utiliser un try-catch pour éviter toute redirection
try {
fetch('{{ path(\"ui_api_comparison_count\") }}', {
method: 'GET',
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'application/json'
},
credentials: 'same-origin',
redirect: 'error' // Empêcher les redirections automatiques
}).then(response => { // Vérifier si la réponse est OK
if (!response.ok) { // Si c'est une redirection (301, 302, etc.) ou une erreur d'authentification, ignorer silencieusement
if (response.status >= 300 && response.status < 400) {
console.warn('Redirection détectée, arrêt de la requête');
return null;
}
if (response.status === 401 || response.status === 403) {
console.warn('Utilisateur non authentifié pour la comparaison');
return null;
}
// Pour les autres erreurs, throw pour être capturé par catch
throw new Error('Erreur HTTP: ' + response.status);
}
// Vérifier que c'est bien du JSON
const contentType = response.headers.get('content-type');
if (! contentType || ! contentType.includes('application/json')) { // Si ce n'est pas du JSON, c'est probablement une redirection HTML
console.warn('La réponse n\\'est pas du JSON, probable redirection');
return null;
}
return response.json();
}).then(data => { // Si data est null (redirection ou erreur), ne rien faire
if (!data || typeof data.count === 'undefined') {
return;
}
// Mettre à jour les badges desktop et mobile
const badges = [document.getElementById('comparisonBadge'), document.getElementById('comparisonBadgeMobile')];
badges.forEach(badge => {
if (badge) {
if (data.count > 0) {
badge.textContent = data.count;
badge.style.display = 'flex';
} else {
badge.style.display = 'none';
}
}
});
}).catch(error => { // Ne pas afficher d'erreur si c'est juste une absence d'authentification ou une redirection
if (error.message && !error.message.includes('401') && !error.message.includes('403') && !error.message.includes('redirect')) {
console.error('Erreur lors du chargement du compteur de comparaison:', error);
}
// Empêcher toute redirection vers l'URL de l'API
return false;
});
} catch (e) { // Capturer toute erreur qui pourrait causer une redirection
console.warn('Erreur lors de l\\'appel à l\\'API de comparaison:', e);
}
{% endif %}
}
// Fonction globale pour gérer la comparaison
function toggleComparison(productId, element) {
if (! element) {
element = document.querySelector(`.comparison-btn[data-product-id=\"\${productId}\"]`);
}
if (! element) {
console.error('Bouton de comparaison non trouvé pour le produit', productId);
return;
}
const originalHtml = element.innerHTML;
// Désactiver le bouton/lien
if (element.tagName === 'BUTTON') {
element.disabled = true;
} else {
element.style.pointerEvents = 'none';
element.style.opacity = '0.6';
} element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
// Vérifier d'abord si le produit est déjà en comparaison
let isInComparison = false;
fetch(`/api/comparison/status/\${productId}`).then(response => response.json()).then(data => {
isInComparison = data.inComparison;
const url = isInComparison ? `/api/comparison/remove/\${productId}` : `/api/comparison/add/\${productId}`;
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
});
}).then(response => response.json()).then(data => {
if (data.success) { // Mettre à jour le compteur
loadComparisonCount();
// Mettre à jour l'apparence du bouton
if (element) { // Inverser l'état (car on vient de le changer)
const newState = ! isInComparison;
// Restaurer le HTML original puis mettre à jour
element.innerHTML = originalHtml;
if (newState) {
element.classList.add('active');
// Mettre à jour le texte pour les deux types de boutons
const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'En comparaison';
// Mettre à jour l'icône si nécessaire (chercher dans span ou i)
const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
if (iconEl) {
iconEl.style.color = '#28a745';
iconEl.classList.add('active');
}
} else {
element.classList.remove('active');
const textEl = element.querySelector('.comparison-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'Comparer';
// Restaurer la couleur de l'icône
const iconEl = element.querySelector('.lnr-sync, span.lnr-sync, [class*=\"sync\"], i[class*=\"sync\"]');
if (iconEl) {
iconEl.style.color = '';
iconEl.classList.remove('active');
}
}
}
// Afficher une notification
showNotification(data.message, 'success');
} else {
showNotification(data.message, 'error');
if (element) {
element.innerHTML = originalHtml;
}
}
}).catch(error => {
console.error('Erreur:', error);
showNotification('Une erreur est survenue', 'error');
if (element) {
element.innerHTML = originalHtml;
}
}). finally(() => {
if (element) {
if (element.tagName === 'BUTTON') {
element.disabled = false;
} else {
element.style.pointerEvents = '';
element.style.opacity = '';
}
}
});
}
// Fonction globale pour gérer les favoris
function toggleWishlist(productId, element) {
if (! element) {
element = document.querySelector(`.wishlist-btn[data-product-id=\"\${productId}\"]`);
}
if (! element) {
console.error('Bouton de wishlist non trouvé pour le produit', productId);
return;
}
const originalHtml = element.innerHTML;
// Désactiver le bouton/lien
if (element.tagName === 'BUTTON') {
element.disabled = true;
} else {
element.style.pointerEvents = 'none';
element.style.opacity = '0.6';
} element.innerHTML = '<span class=\"spinner-border spinner-border-sm\"></span>';
// Vérifier d'abord si le produit est déjà en favoris
let isInWishlist = false;
fetch(`/api/wishlist/status/\${productId}`).then(response => response.json()).then(data => {
isInWishlist = data.inWishlist;
const url = isInWishlist ? `/api/wishlist/remove/\${productId}` : `/api/wishlist/add/\${productId}`;
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
});
}).then(response => response.json()).then(data => {
if (data.success) { // Mettre à jour l'apparence du bouton
if (element) { // Inverser l'état (car on vient de le changer)
const newState = ! isInWishlist;
// Restaurer le HTML original puis mettre à jour
element.innerHTML = originalHtml;
// Chercher l'icône dans span ou i
const icon = element.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
const text = element.querySelector('.wishlist-text') || element.querySelector('.hover-text') || element.querySelector('p.hover-text');
if (newState) {
if (icon) { // Pour les icônes linr, on change la classe
if (icon.classList.contains('lnr-heart')) {
icon.classList.remove('lnr-heart');
}
if (! icon.classList.contains('lnr-heart-filled')) {
icon.classList.add('lnr-heart-filled');
}
icon.style.color = '#dc3545';
}
element.classList.add('active');
if (text)
text.textContent = 'Dans favoris';
} else {
if (icon) { // Restaurer l'icône originale
if (icon.classList.contains('lnr-heart-filled')) {
icon.classList.remove('lnr-heart-filled');
}
if (! icon.classList.contains('lnr-heart')) {
icon.classList.add('lnr-heart');
}
icon.style.color = '';
}
element.classList.remove('active');
if (text)
text.textContent = 'Favoris';
}
}
// Afficher une notification
showNotification(data.message, 'success');
// Si on est sur la page wishlist, recharger la page
if (window.location.pathname.includes('/account/wishlist')) {
setTimeout(() => location.reload(), 1000);
}
} else {
showNotification(data.message, 'error');
if (element) {
element.innerHTML = originalHtml;
}
}
}).catch(error => {
console.error('Erreur:', error);
showNotification('Une erreur est survenue', 'error');
if (element) {
element.innerHTML = originalHtml;
}
}). finally(() => {
if (element) {
if (element.tagName === 'BUTTON') {
element.disabled = false;
} else {
element.style.pointerEvents = '';
element.style.opacity = '';
}
}
});
}
// Fonction pour afficher des notifications
function showNotification(message, type = 'success') { // Créer l'élément de notification
const notification = document.createElement('div');
notification.className = `alert alert-\${
type === 'success' ? 'success' : 'danger'
} alert-dismissible fade show position-fixed`;
notification.style.cssText = 'top: 20px; right: 20px; z-index: 9999; min-width: 300px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);';
notification.innerHTML = `
\${message}
<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\"></button>
`;
document.body.appendChild(notification);
// Supprimer automatiquement après 3 secondes
setTimeout(() => {
notification.remove();
}, 3000);
}
// Initialiser les alertes Bootstrap 5 pour la fermeture
document.addEventListener('DOMContentLoaded', function () { // S'assurer que les alertes peuvent être fermées
const alertCloseButtons = document.querySelectorAll('.flash-message .btn-close');
alertCloseButtons.forEach(function (button) {
button.addEventListener('click', function () {
const alert = this.closest('.alert');
if (alert) {
alert.classList.remove('show');
setTimeout(function () {
alert.remove();
}, 150);
}
});
});
// Charger les statuts initiaux des produits
{% if app.user %}
// Charger les statuts de comparaison pour tous les produits visibles
document.querySelectorAll('.comparison-btn[data-product-id]').forEach(btn => {
const productId = btn.dataset.productId;
fetch(`/api/comparison/status/\${productId}`).then(response => response.json()).then(data => {
if (data.inComparison) {
btn.classList.add('active');
// Mettre à jour le texte pour les deux types de boutons
const textEl = btn.querySelector('.comparison-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'En comparaison';
// Mettre à jour l'icône si nécessaire
const iconEl = btn.querySelector('.lnr-sync, [class*=\"sync\"]');
if (iconEl)
iconEl.style.color = '#28a745';
}
}).catch(() => {});
});
// Charger les statuts de wishlist pour tous les produits visibles
document.querySelectorAll('.wishlist-btn[data-product-id]').forEach(btn => {
const productId = btn.dataset.productId;
fetch(`/api/wishlist/status/\${productId}`).then(response => response.json()).then(data => {
if (data.inWishlist) {
// Chercher l'icône dans span ou i
const icon = btn.querySelector('span.lnr-heart, i.lnr-heart, [class*=\"lnr-heart\"]');
if (icon) {
icon.classList.remove('lnr-heart');
icon.classList.add('lnr-heart');
icon.style.color = '#ffa200';
}
// Mettre à jour le texte pour les deux types de boutons
const textEl = btn.querySelector('.wishlist-text') || btn.querySelector('.hover-text') || btn.querySelector('p.hover-text');
if (textEl)
textEl.textContent = 'favoris';
}
}).catch(() => {});
});
// Charger le compteur de comparaison
loadComparisonCount();{% endif %}
});
\t\t</script>
\t\t<script>
\t\t\t// Loader global pour tous les boutons de formulaire
document.addEventListener('DOMContentLoaded', function () { // Intercepter tous les formulaires
const forms = document.querySelectorAll('form');
forms.forEach(function (form) {
form.addEventListener('submit', function (e) {
const submitButtons = form.querySelectorAll('button[type=\"submit\"], input[type=\"submit\"], button:not([type])');
submitButtons.forEach(function (button) { // Vérifier si le bouton n'est pas déjà désactivé
if (! button.disabled && ! button.classList.contains('loading')) {
button.classList.add('loading');
button.disabled = true;
// Sauvegarder le texte original
const originalText = button.innerHTML;
button.setAttribute('data-original-text', originalText);
// Ajouter le loader
button.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Envoi...';
// Si le formulaire n'est pas valide, réactiver le bouton après 1 seconde
setTimeout(function () {
if (! form.checkValidity()) {
button.classList.remove('loading');
button.disabled = false;
button.innerHTML = originalText;
}
}, 1000);
}
});
});
});
// Pour les boutons qui déclenchent des actions AJAX
const ajaxButtons = document.querySelectorAll('[data-ajax], .ajax-submit, button[data-submit]');
ajaxButtons.forEach(function (button) {
button.addEventListener('click', function (e) {
if (this.disabled || this.classList.contains('loading')) {
e.preventDefault();
return false;
}
this.classList.add('loading');
this.disabled = true;
const originalText = this.innerHTML;
this.setAttribute('data-original-text', originalText);
this.innerHTML = '<span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>Chargement...';
});
});
// Gestionnaire spécifique pour le formulaire de newsletter
const newsletterForm = document.querySelector('.footer-newsletter-form');
if (newsletterForm) {
newsletterForm.addEventListener('submit', function (e) {
const submitBtn = this.querySelector('.newsletter-btn');
if (submitBtn && ! submitBtn.disabled) {
submitBtn.classList.add('loading');
submitBtn.disabled = true;
// Afficher le loader et masquer l'icône
const icon = submitBtn.querySelector('.newsletter-btn-icon');
const loader = submitBtn.querySelector('.newsletter-btn-loader');
if (icon)
icon.style.display = 'none';
if (loader)
loader.style.display = 'flex';
// Réactiver le bouton après 5 secondes au cas où la requête échoue silencieusement
setTimeout(function () {
if (submitBtn.classList.contains('loading')) {
submitBtn.classList.remove('loading');
submitBtn.disabled = false;
if (icon)
icon.style.display = 'flex';
if (loader)
loader.style.display = 'none';
}
}, 5000);
}
});
// Gérer la réponse du formulaire (si AJAX)
newsletterForm.addEventListener('submit', function (e) {
// Si le formulaire est soumis normalement (non-AJAX), le navigateur gère la réponse
// Sinon, on peut intercepter pour gérer la réponse AJAX ici
});
}
});
// CSS pour le spinner
const style = document.createElement('style');
style.textContent = `
.spinner-border-sm {
width: 1rem;
height: 1rem;
border-width: 0.15em;
}
.spinner-border {
display: inline-block;
width: 1rem;
height: 1rem;
vertical-align: text-bottom;
border: 0.15em solid currentColor;
border-right-color: transparent;
border-radius: 50%;
animation: spinner-border 0.75s linear infinite;
}
@keyframes spinner-border {
to { transform: rotate(360deg); }
}
button.loading {
opacity: 0.7;
cursor: not-allowed !important;
}
`;
document.head.appendChild(style);
\t\t</script>
\t\t<!-- Cart Modal -->
\t\t<div id=\"ebay-cart-modal\" class=\"ebay-cart-modal-overlay\" style=\"display: none;\" data-url=\"\">
\t\t\t<div class=\"ebay-cart-modal\">
\t\t\t\t<div class=\"ebay-modal-header\">
\t\t\t\t\t<h3>
\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
\t\t\t\t\t\tAjouté au panier !</h3>
\t\t\t\t\t<button class=\"ebay-modal-close\" onclick=\"closeEbayCartModal()\">×</button>
\t\t\t\t</div>
\t\t\t\t<div class=\"ebay-modal-content\">
\t\t\t\t\t<div class=\"ebay-product-info\">
\t\t\t\t\t\t<div class=\"ebay-product-image\">
\t\t\t\t\t\t\t<img id=\"ebay-modal-product-image\" src=\"\" alt=\"Produit\"/>
\t\t\t\t\t\t</div>
\t\t\t\t\t\t<div class=\"ebay-product-details\">
\t\t\t\t\t\t\t<h4 id=\"ebay-modal-product-name\">Nom du produit</h4>
\t\t\t\t\t\t\t<div class=\"ebay-product-price\" id=\"ebay-modal-product-price\">Prix</div>
\t\t\t\t\t\t\t<div class=\"ebay-product-quantity\">
\t\t\t\t\t\t\t\t<span>Quantité:
\t\t\t\t\t\t\t\t</span>
\t\t\t\t\t\t\t\t<span id=\"ebay-modal-product-quantity\">1</span>
\t\t\t\t\t\t\t</div>
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<!-- Recommendations Section -->
\t\t\t\t\t<div class=\"ebay-recommendations\" style=\"display: none;\">
\t\t\t\t\t\t<h4>Les clients ont aussi acheté :</h4>
\t\t\t\t\t\t<div
\t\t\t\t\t\t\tclass=\"ebay-recommendations-grid\" id=\"ebay-modal-recommendations\"><!-- Recommendations will be injected here -->
\t\t\t\t\t\t</div>
\t\t\t\t\t</div>
\t\t\t\t\t<div class=\"ebay-modal-actions\">
\t\t\t\t\t\t<button class=\"ebay-btn-continue\" onclick=\"closeEbayCartModal()\">
\t\t\t\t\t\t\tContinuer mes achats
\t\t\t\t\t\t</button>
\t\t\t\t\t\t<a href=\"{{ path('ui_cart') }}\" class=\"ebay-btn-view-cart\">
\t\t\t\t\t\t\tVoir mon panier
\t\t\t\t\t\t</a>
\t\t\t\t\t</div>
\t\t\t\t</div>
\t\t\t</div>
\t\t</div>
\t\t<script src=\"{{ asset('ui/js/cart-modal.js') }}\"></script>
\t\t<script src=\"{{ asset('ui/js/notification-badge.js') }}\"></script>
\t\t{% block javascripts %}{% endblock %}
\t</body>
</html>
", "base_home.html.twig", "/home/u540977899/domains/maketou-ht.com/public_html/templates/base_home.html.twig");
}
}