var/cache/dev/twig/fa/fa3304ccd1a4499ea688e4127125ab90.php line 56

Open in your IDE?
  1. <?php
  2. use Twig\Environment;
  3. use Twig\Error\LoaderError;
  4. use Twig\Error\RuntimeError;
  5. use Twig\Extension\CoreExtension;
  6. use Twig\Extension\SandboxExtension;
  7. use Twig\Markup;
  8. use Twig\Sandbox\SecurityError;
  9. use Twig\Sandbox\SecurityNotAllowedTagError;
  10. use Twig\Sandbox\SecurityNotAllowedFilterError;
  11. use Twig\Sandbox\SecurityNotAllowedFunctionError;
  12. use Twig\Source;
  13. use Twig\Template;
  14. use Twig\TemplateWrapper;
  15. /* home/index.html.twig */
  16. class __TwigTemplate_affacb9b2c747adbd7a2c975972a32a5 extends Template
  17. {
  18.     private Source $source;
  19.     /**
  20.      * @var array<string, Template>
  21.      */
  22.     private array $macros = [];
  23.     public function __construct(Environment $env)
  24.     {
  25.         parent::__construct($env);
  26.         $this->source $this->getSourceContext();
  27.         $this->blocks = [
  28.             'title' => [$this'block_title'],
  29.             'stylesheets' => [$this'block_stylesheets'],
  30.             'body' => [$this'block_body'],
  31.             'javascripts' => [$this'block_javascripts'],
  32.         ];
  33.     }
  34.     protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
  35.     {
  36.         // line 1
  37.         return "base_home.html.twig";
  38.     }
  39.     protected function doDisplay(array $context, array $blocks = []): iterable
  40.     {
  41.         $macros $this->macros;
  42.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  43.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""home/index.html.twig"));
  44.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  45.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""home/index.html.twig"));
  46.         $this->parent $this->load("base_home.html.twig"1);
  47.         yield from $this->parent->unwrap()->yield($contextarray_merge($this->blocks$blocks));
  48.         
  49.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  50.         
  51.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  52.     }
  53.     // line 3
  54.     /**
  55.      * @return iterable<null|scalar|\Stringable>
  56.      */
  57.     public function block_title(array $context, array $blocks = []): iterable
  58.     {
  59.         $macros $this->macros;
  60.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  61.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  62.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  63.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  64.         yield "Accueil | MaketOu - Votre marketplace haïtienne
  65. ";
  66.         
  67.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  68.         
  69.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  70.         yield from [];
  71.     }
  72.     // line 6
  73.     /**
  74.      * @return iterable<null|scalar|\Stringable>
  75.      */
  76.     public function block_stylesheets(array $context, array $blocks = []): iterable
  77.     {
  78.         $macros $this->macros;
  79.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  80.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  81.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  82.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  83.         // line 7
  84.         yield "\t<style>
  85. \t\t/* Styles personnalisés pour la page d'accueil */
  86. \t\t.hero-banner {
  87. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  88. \t\t\tcolor: white;
  89. \t\t\tpadding: 100px 0;
  90. \t\t\tposition: relative;
  91. \t\t\toverflow: hidden;
  92. \t\t}
  93. \t\t.hero-banner::before {
  94. \t\t\tcontent: '';
  95. \t\t\tposition: absolute;
  96. \t\t\ttop: 0;
  97. \t\t\tleft: 0;
  98. \t\t\tright: 0;
  99. \t\t\tbottom: 0;
  100. \t\t\tbackground: url('data:image/svg+xml, <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><defs><pattern id=\"grain\" width=\"100\" height=\"100\" patternUnits=\"userSpaceOnUse\"><circle cx=\"25\" cy=\"25\" r=\"1\" fill=\"rgba(255, 255, 255, 0.1)\"/><circle cx=\"75\" cy=\"75\" r=\"1\" fill=\"rgba(255, 255, 255, 0.1)\"/><circle cx=\"50\" cy=\"10\" r=\"0.5\" fill=\"rgba(255, 255, 255, 0.1)\"/><circle cx=\"10\" cy=\"90\" r=\"0.5\" fill=\"rgba(255, 255, 255, 0.1)\"/></pattern></defs><rect width=\"100\" height=\"100\" fill=\"url(%23grain)\"/></svg>');
  101. \t\t\topacity: 0.3;
  102. \t\t}
  103. \t\t.hero-content {
  104. \t\t\tposition: relative;
  105. \t\t\tz-index: 2;
  106. \t\t}
  107. \t\t.stats-card {
  108. \t\t\tbackground: white;
  109. \t\t\tborder-radius: 15px;
  110. \t\t\tpadding: 30px;
  111. \t\t\ttext-align: center;
  112. \t\t\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
  113. \t\t\ttransition: transform 0.3s ease;
  114. \t\t}
  115. \t\t.stats-card:hover {
  116. \t\t\ttransform: translateY(-5px);
  117. \t\t}
  118. \t\t.stats-number {
  119. \t\t\tfont-size: 3rem;
  120. \t\t\tfont-weight: bold;
  121. \t\t\tcolor: #ffa200;
  122. \t\t\tdisplay: block;
  123. \t\t}
  124. \t\t.stats-label {
  125. \t\t\tcolor: #666;
  126. \t\t\tfont-size: 1.1rem;
  127. \t\t\tmargin-top: 10px;
  128. \t\t}
  129. \t\t.category-card {
  130. \t\t\tbackground: white;
  131. \t\t\tborder-radius: 15px;
  132. \t\t\toverflow: hidden;
  133. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  134. \t\t\ttransition: all 0.3s ease;
  135. \t\t\theight: 100%;
  136. \t\t}
  137. \t\t.category-card:hover {
  138. \t\t\ttransform: translateY(-5px);
  139. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  140. \t\t}
  141. \t\t.category-image {
  142. \t\t\theight: 200px;
  143. \t\t\tbackground-size: cover;
  144. \t\t\tbackground-position: center;
  145. \t\t\tposition: relative;
  146. \t\t}
  147. \t\t.category-overlay {
  148. \t\t\tposition: absolute;
  149. \t\t\ttop: 0;
  150. \t\t\tleft: 0;
  151. \t\t\tright: 0;
  152. \t\t\tbottom: 0;
  153. \t\t\tbackground: linear-gradient(45deg, rgba(255,162,0,0.8), rgba(232,145,10,0.8));
  154. \t\t\tdisplay: flex;
  155. \t\t\talign-items: center;
  156. \t\t\tjustify-content: center;
  157. \t\t\topacity: 0;
  158. \t\t\ttransition: opacity 0.3s ease;
  159. \t\t}
  160. \t\t.category-card:hover .category-overlay {
  161. \t\t\topacity: 1;
  162. \t\t}
  163. \t\t.product-card {
  164. \t\t\tbackground: white;
  165. \t\t\tborder-radius: 15px;
  166. \t\t\toverflow: hidden;
  167. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  168. \t\t\ttransition: all 0.3s ease;
  169. \t\t\theight: 100%;
  170. \t\t}
  171. \t\t.product-card:hover {
  172. \t\t\ttransform: translateY(-5px);
  173. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  174. \t\t}
  175. \t\t.product-image {
  176. \t\t\theight: 250px;
  177. \t\t\tbackground-size: cover;
  178. \t\t\tbackground-position: center;
  179. \t\t\tposition: relative;
  180. \t\t}
  181. \t\t.product-badge {
  182. \t\t\tposition: absolute;
  183. \t\t\ttop: 15px;
  184. \t\t\tright: 15px;
  185. \t\t\tbackground: #ffa200;
  186. \t\t\tcolor: white;
  187. \t\t\tpadding: 5px 10px;
  188. \t\t\tborder-radius: 20px;
  189. \t\t\tfont-size: 0.8rem;
  190. \t\t\tfont-weight: bold;
  191. \t\t}
  192. \t\t.product-info {
  193. \t\t\tpadding: 20px;
  194. \t\t}
  195. \t\t.product-title {
  196. \t\t\tfont-size: 1.2rem;
  197. \t\t\tfont-weight: 600;
  198. \t\t\tmargin-bottom: 10px;
  199. \t\t\tcolor: #333;
  200. \t\t}
  201. \t\t.product-price {
  202. \t\t\tfont-size: 1.5rem;
  203. \t\t\tfont-weight: bold;
  204. \t\t\tcolor: #ffa200;
  205. \t\t\tmargin-bottom: 10px;
  206. \t\t}
  207. \t\t.product-shop {
  208. \t\t\tfont-size: 0.9rem;
  209. \t\t\tcolor: #666;
  210. \t\t\tmargin-bottom: 15px;
  211. \t\t}
  212. \t\t.btn-primary-custom {
  213. \t\t\tbackground: #ffa200;
  214. \t\t\tborder: none;
  215. \t\t\tcolor: white;
  216. \t\t\tpadding: 12px 30px;
  217. \t\t\tborder-radius: 25px;
  218. \t\t\tfont-weight: 500;
  219. \t\t\ttransition: all 0.3s ease;
  220. \t\t}
  221. \t\t.btn-primary-custom:hover {
  222. \t\t\tbackground: #e8910a;
  223. \t\t\ttransform: translateY(-2px);
  224. \t\t\tbox-shadow: 0 5px 15px rgba(255, 162, 0, 0.3);
  225. \t\t}
  226. \t\t.section-title {
  227. \t\t\ttext-align: center;
  228. \t\t\tmargin-bottom: 50px;
  229. \t\t}
  230. \t\t.section-title h2 {
  231. \t\t\tfont-size: 2.5rem;
  232. \t\t\tfont-weight: bold;
  233. \t\t\tcolor: #333;
  234. \t\t\tmargin-bottom: 15px;
  235. \t\t}
  236. \t\t.section-title p {
  237. \t\t\tfont-size: 1.2rem;
  238. \t\t\tcolor: #666;
  239. \t\t\tmax-width: 600px;
  240. \t\t\tmargin: 0 auto;
  241. \t\t}
  242. \t\t.feature-card {
  243. \t\t\ttext-align: center;
  244. \t\t\tpadding: 30px 20px;
  245. \t\t\tbackground: white;
  246. \t\t\tborder-radius: 15px;
  247. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  248. \t\t\ttransition: all 0.3s ease;
  249. \t\t\theight: 100%;
  250. \t\t}
  251. \t\t.feature-card:hover {
  252. \t\t\ttransform: translateY(-5px);
  253. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  254. \t\t}
  255. \t\t.feature-icon {
  256. \t\t\twidth: 80px;
  257. \t\t\theight: 80px;
  258. \t\t\tbackground: linear-gradient(135deg, #ffa200, #e8910a);
  259. \t\t\tborder-radius: 50%;
  260. \t\t\tdisplay: flex;
  261. \t\t\talign-items: center;
  262. \t\t\tjustify-content: center;
  263. \t\t\tmargin: 0 auto 20px;
  264. \t\t\tfont-size: 2rem;
  265. \t\t\tcolor: white;
  266. \t\t}
  267. \t\t.newsletter-section {
  268. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  269. \t\t\tcolor: white;
  270. \t\t\tpadding: 80px 0;
  271. \t\t}
  272. \t\t.newsletter-form {
  273. \t\t\tmax-width: 500px;
  274. \t\t\tmargin: 0 auto;
  275. \t\t}
  276. \t\t.newsletter-form .form-control {
  277. \t\t\tborder: none;
  278. \t\t\tborder-radius: 25px;
  279. \t\t\tpadding: 15px 25px;
  280. \t\t\tfont-size: 1.1rem;
  281. \t\t}
  282. \t\t.newsletter-form .btn {
  283. \t\t\tborder-radius: 25px;
  284. \t\t\tpadding: 15px 30px;
  285. \t\t\tfont-weight: 500;
  286. \t\t}
  287. \t\t/* Styles pour les catégories personnalisées */
  288. \t\t.category-card-custom {
  289. \t\t\tbackground: white;
  290. \t\t\tborder-radius: 15px;
  291. \t\t\toverflow: hidden;
  292. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  293. \t\t\ttransition: all 0.3s ease;
  294. \t\t\theight: 100%;
  295. \t\t\tdisplay: flex;
  296. \t\t\tflex-direction: column;
  297. \t\t}
  298. \t\t.category-card-custom:hover {
  299. \t\t\ttransform: translateY(-5px);
  300. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  301. \t\t}
  302. \t\t.category-image-wrapper {
  303. \t\t\tposition: relative;
  304. \t\t\toverflow: hidden;
  305. \t\t}
  306. \t\t.category-image {
  307. \t\t\theight: 200px;
  308. \t\t\tbackground-size: cover;
  309. \t\t\tbackground-position: center;
  310. \t\t\tposition: relative;
  311. \t\t\ttransition: transform 0.5s ease;
  312. \t\t}
  313. \t\t.category-card-custom:hover .category-image {
  314. \t\t\ttransform: scale(1.1);
  315. \t\t}
  316. \t\t.category-overlay-custom {
  317. \t\t\tposition: absolute;
  318. \t\t\ttop: 0;
  319. \t\t\tleft: 0;
  320. \t\t\tright: 0;
  321. \t\t\tbottom: 0;
  322. \t\t\tbackground: rgba(0, 0, 0, 0.5);
  323. \t\t\tdisplay: flex;
  324. \t\t\talign-items: center;
  325. \t\t\tjustify-content: center;
  326. \t\t\topacity: 0;
  327. \t\t\ttransition: opacity 0.3s ease;
  328. \t\t}
  329. \t\t.category-card-custom:hover .category-overlay-custom {
  330. \t\t\topacity: 1;
  331. \t\t}
  332. \t\t.category-icon-wrapper {
  333. \t\t\ttext-align: center;
  334. \t\t\tcolor: white;
  335. \t\t\ttransform: translateY(20px);
  336. \t\t\ttransition: transform 0.3s ease;
  337. \t\t}
  338. \t\t.category-card-custom:hover .category-icon-wrapper {
  339. \t\t\ttransform: translateY(0);
  340. \t\t}
  341. \t\t.category-content {
  342. \t\t\tflex-grow: 1;
  343. \t\t\tdisplay: flex;
  344. \t\t\tflex-direction: column;
  345. \t\t}
  346. \t\t.category-content .btn {
  347. \t\t\tmargin-top: auto;
  348. \t\t}
  349. \t\t/* Responsive Styles */
  350. \t\t@media(max-width: 991.98px) {
  351. \t\t\t.hero-banner {
  352. \t\t\t\tpadding: 60px 0;
  353. \t\t\t}
  354. \t\t\t.stats-number {
  355. \t\t\t\tfont-size: 2.5rem;
  356. \t\t\t}
  357. \t\t\t.section-title h2 {
  358. \t\t\t\tfont-size: 2rem;
  359. \t\t\t}
  360. \t\t\t
  361. \t\t\t.stats-card {
  362. \t\t\t\tmargin-bottom: 1.5rem;
  363. \t\t\t}
  364. \t\t}
  365. \t\t@media(max-width: 767.98px) {
  366. \t\t\t.hero-banner {
  367. \t\t\t\tpadding: 40px 0;
  368. \t\t\t}
  369. \t\t\t.hero-content h1 {
  370. \t\t\t\tfont-size: 1.75rem;
  371. \t\t\t}
  372. \t\t\t.stats-number {
  373. \t\t\t\tfont-size: 2rem;
  374. \t\t\t}
  375. \t\t\t.stats-label {
  376. \t\t\t\tfont-size: 0.9rem;
  377. \t\t\t}
  378. \t\t\t.section-title h2 {
  379. \t\t\t\tfont-size: 1.75rem;
  380. \t\t\t}
  381. \t\t\t.section-title p {
  382. \t\t\t\tfont-size: 1rem;
  383. \t\t\t}
  384. \t\t\t
  385. \t\t\t.category-card,
  386. \t\t\t.product-card {
  387. \t\t\t\tmargin-bottom: 1.5rem;
  388. \t\t\t}
  389. \t\t\t
  390. \t\t\t.category-image {
  391. \t\t\t\theight: 150px;
  392. \t\t\t}
  393. \t\t\t
  394. \t\t\t.product-image {
  395. \t\t\t\theight: 200px;
  396. \t\t\t}
  397. \t\t\t
  398. \t\t\t.feature-card {
  399. \t\t\t\tmargin-bottom: 1.5rem;
  400. \t\t\t}
  401. \t\t\t
  402. \t\t\t.newsletter-section {
  403. \t\t\t\tpadding: 40px 0;
  404. \t\t\t}
  405. \t\t}
  406. \t\t@media(max-width: 575.98px) {
  407. \t\t\t.hero-banner {
  408. \t\t\t\tpadding: 30px 0;
  409. \t\t\t}
  410. \t\t\t.hero-content h1 {
  411. \t\t\t\tfont-size: 1.5rem;
  412. \t\t\t}
  413. \t\t\t.stats-card {
  414. \t\t\t\tpadding: 1.5rem;
  415. \t\t\t}
  416. \t\t\t.stats-number {
  417. \t\t\t\tfont-size: 1.75rem;
  418. \t\t\t}
  419. \t\t\t.section-title h2 {
  420. \t\t\t\tfont-size: 1.5rem;
  421. \t\t\t}
  422. \t\t\t
  423. \t\t\t.category-image {
  424. \t\t\t\theight: 120px;
  425. \t\t\t}
  426. \t\t\t
  427. \t\t\t.product-image {
  428. \t\t\t\theight: 180px;
  429. \t\t\t}
  430. \t\t\t
  431. \t\t\t.product-info {
  432. \t\t\t\tpadding: 1rem;
  433. \t\t\t}
  434. \t\t\t
  435. \t\t\t.product-title {
  436. \t\t\t\tfont-size: 1rem;
  437. \t\t\t}
  438. \t\t\t
  439. \t\t\t.product-price {
  440. \t\t\t\tfont-size: 1.25rem;
  441. \t\t\t}
  442. \t\t}
  443. \t\t/* Styles modernes pour le carousel de bannière */
  444. \t\t.banner-area-modern {
  445. \t\t\tposition: relative;
  446. \t\t\twidth: 100%;
  447. \t\t\tmin-height: 500px;
  448. \t\t\tbackground: url('";
  449.         // line 428
  450.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/img/banner/banner-bg.jpg"), "html"nulltrue);
  451.         yield "') center center no-repeat;
  452. \t\t\tbackground-size: cover;
  453. \t\t\toverflow: hidden;
  454. \t\t\tpadding: 60px 0;
  455. \t\t}
  456. \t\t.banner-area-modern::before {
  457. \t\t\tcontent: '';
  458. \t\t\tposition: absolute;
  459. \t\t\ttop: 0;
  460. \t\t\tleft: 0;
  461. \t\t\twidth: 100%;
  462. \t\t\theight: 100%;
  463. \t\t\tbackground: rgba(0, 0, 0, 0.1);
  464. \t\t\tz-index: 1;
  465. \t\t}
  466. \t\t.banner-carousel-wrapper {
  467. \t\t\tposition: relative;
  468. \t\t\twidth: 100%;
  469. \t\t\theight: 100%;
  470. \t\t\tz-index: 2;
  471. \t\t}
  472. \t\t.banner-slide-item {
  473. \t\t\tmin-height: 500px;
  474. \t\t\tdisplay: flex;
  475. \t\t\talign-items: center;
  476. \t\t\tpadding: 40px 0;
  477. \t\t}
  478. \t\t.banner-content-modern {
  479. \t\t\tposition: relative;
  480. \t\t\tz-index: 2;
  481. \t\t\tpadding: 30px;
  482. \t\t\tbackground: rgba(255, 255, 255, 0.98);
  483. \t\t\tborder-radius: 20px;
  484. \t\t\tbox-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
  485. \t\t\tbackdrop-filter: blur(10px);
  486. \t\t\tanimation: fadeInUp 0.8s ease;
  487. \t\t}
  488. \t\t@keyframes fadeInUp {
  489. \t\t\tfrom {
  490. \t\t\t\topacity: 0;
  491. \t\t\t\ttransform: translateY(30px);
  492. \t\t\t}
  493. \t\t\tto {
  494. \t\t\t\topacity: 1;
  495. \t\t\t\ttransform: translateY(0);
  496. \t\t\t}
  497. \t\t}
  498. \t\t.banner-badge {
  499. \t\t\tdisplay: inline-block;
  500. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  501. \t\t\tcolor: white;
  502. \t\t\tpadding: 8px 20px;
  503. \t\t\tborder-radius: 50px;
  504. \t\t\tfont-size: 0.85rem;
  505. \t\t\tfont-weight: 600;
  506. \t\t\tmargin-bottom: 20px;
  507. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  508. \t\t}
  509. \t\t.banner-badge i {
  510. \t\t\tmargin-right: 5px;
  511. \t\t}
  512. \t\t.banner-title-modern {
  513. \t\t\tfont-size: 2.0rem;
  514. \t\t\tfont-weight: 600;
  515. \t\t\tcolor: #2c3e50;
  516. \t\t\tmargin-bottom: 20px;
  517. \t\t\tline-height: 1.2;
  518. \t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  519. \t\t\t-webkit-background-clip: text;
  520. \t\t\t-webkit-text-fill-color: transparent;
  521. \t\t\tbackground-clip: text;
  522. \t\t}
  523. \t\t.banner-description-modern {
  524. \t\t\tfont-size: 1.1rem;
  525. \t\t\tcolor: #555;
  526. \t\t\tline-height: 1.8;
  527. \t\t\tmargin-bottom: 25px;
  528. \t\t}
  529. \t\t.banner-price-modern {
  530. \t\t\tdisplay: flex;
  531. \t\t\talign-items: center;
  532. \t\t\tgap: 15px;
  533. \t\t\tmargin-bottom: 30px;
  534. \t\t\tpadding: 15px 20px;
  535. \t\t\tbackground: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  536. \t\t\tborder-radius: 12px;
  537. \t\t\tborder-left: 4px solid #ffa200;
  538. \t\t}
  539. \t\t.banner-price-modern .price-label {
  540. \t\t\tfont-size: 0.9rem;
  541. \t\t\tcolor: #666;
  542. \t\t\tfont-weight: 600;
  543. \t\t\ttext-transform: uppercase;
  544. \t\t\tletter-spacing: 1px;
  545. \t\t}
  546. \t\t.banner-price-modern .price-value {
  547. \t\t\tfont-size: 1.2rem;
  548. \t\t\tfont-weight: 600;
  549. \t\t\tcolor: #ffa200;
  550. \t\t}
  551. \t\t.banner-actions-modern {
  552. \t\t\tdisplay: flex;
  553. \t\t\tgap: 15px;
  554. \t\t\tflex-wrap: wrap;
  555. \t\t}
  556. \t\t.btn-banner-primary {
  557. \t\t\tdisplay: inline-flex;
  558. \t\t\talign-items: center;
  559. \t\t\tgap: 10px;
  560. \t\t\tpadding: 15px 35px;
  561. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  562. \t\t\tcolor: white;
  563. \t\t\ttext-decoration: none;
  564. \t\t\tborder-radius: 50px;
  565. \t\t\tfont-weight: 600;
  566. \t\t\tfont-size: 1rem;
  567. \t\t\ttransition: all 0.3s ease;
  568. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  569. \t\t}
  570. \t\t.btn-banner-primary:hover {
  571. \t\t\ttransform: translateY(-3px);
  572. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.6);
  573. \t\t\tcolor: white;
  574. \t\t}
  575. \t\t.btn-banner-primary .btn-icon {
  576. \t\t\ttransition: transform 0.3s ease;
  577. \t\t}
  578. \t\t.btn-banner-primary:hover .btn-icon {
  579. \t\t\ttransform: translateX(5px);
  580. \t\t}
  581. \t\t.btn-banner-secondary {
  582. \t\t\tdisplay: inline-flex;
  583. \t\t\talign-items: center;
  584. \t\t\tgap: 8px;
  585. \t\t\tpadding: 15px 25px;
  586. \t\t\tbackground: white;
  587. \t\t\tcolor: #667eea;
  588. \t\t\ttext-decoration: none;
  589. \t\t\tborder-radius: 50px;
  590. \t\t\tfont-weight: 600;
  591. \t\t\tfont-size: 0.95rem;
  592. \t\t\tborder: 2px solid #667eea;
  593. \t\t\ttransition: all 0.3s ease;
  594. \t\t}
  595. \t\t.btn-banner-secondary:hover {
  596. \t\t\tbackground: #667eea;
  597. \t\t\tcolor: white;
  598. \t\t\ttransform: translateY(-3px);
  599. \t\t\tbox-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
  600. \t\t}
  601. \t\t.banner-image-modern {
  602. \t\t\tposition: relative;
  603. \t\t\theight: 450px;
  604. \t\t\tdisplay: flex;
  605. \t\t\talign-items: center;
  606. \t\t\tjustify-content: center;
  607. \t\t}
  608. \t\t.banner-image-wrapper {
  609. \t\t\tposition: relative;
  610. \t\t\twidth: 100%;
  611. \t\t\theight: 100%;
  612. \t\t\tborder-radius: 20px;
  613. \t\t\toverflow: hidden;
  614. \t\t\tbox-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
  615. \t\t\tbackground: white;
  616. \t\t\tpadding: 20px;
  617. \t\t}
  618. \t\t.banner-img {
  619. \t\t\twidth: 100%;
  620. \t\t\theight: 100%;
  621. \t\t\tobject-fit: contain;
  622. \t\t\tborder-radius: 15px;
  623. \t\t\ttransition: transform 0.5s ease;
  624. \t\t}
  625. \t\t.banner-slide-item:hover .banner-img {
  626. \t\t\ttransform: scale(1.05);
  627. \t\t}
  628. \t\t.banner-image-overlay {
  629. \t\t\tposition: absolute;
  630. \t\t\ttop: 0;
  631. \t\t\tleft: 0;
  632. \t\t\twidth: 100%;
  633. \t\t\theight: 100%;
  634. \t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
  635. \t\t\tborder-radius: 15px;
  636. \t\t\tpointer-events: none;
  637. \t\t}
  638. \t\t/* Styles pour Owl Carousel */
  639. \t\t.banner-area-modern .owl-nav {
  640. \t\t\tposition: absolute;
  641. \t\t\ttop: 50%;
  642. \t\t\ttransform: translateY(-50%);
  643. \t\t\twidth: 100%;
  644. \t\t\tdisplay: flex;
  645. \t\t\tjustify-content: space-between;
  646. \t\t\talign-items: center;
  647. \t\t\tpadding: 0 20px;
  648. \t\t\tpointer-events: none;
  649. \t\t\tz-index: 10;
  650. \t\t\tleft: 0;
  651. \t\t\tright: 0;
  652. \t\t\tbox-sizing: border-box;
  653. \t\t}
  654. \t\t.banner-area-modern .owl-nav button {
  655. \t\t\twidth: 60px;
  656. \t\t\theight: 60px;
  657. \t\t\tmin-width: 60px;
  658. \t\t\tmin-height: 60px;
  659. \t\t\tbackground: #ffa200 !important;
  660. \t\t\tborder-radius: 50% !important;
  661. \t\t\tdisplay: flex !important;
  662. \t\t\talign-items: center;
  663. \t\t\tjustify-content: center;
  664. \t\t\tcolor: white !important;
  665. \t\t\tfont-size: 24px !important;
  666. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  667. \t\t\ttransition: all 0.3s ease;
  668. \t\t\tpointer-events: all;
  669. \t\t\tborder: none !important;
  670. \t\t\tposition: relative;
  671. \t\t\tflex-shrink: 0;
  672. \t\t\tmargin: 0;
  673. \t\t\tpadding: 0;
  674. \t\t\tline-height: 1;
  675. \t\t}
  676. \t\t.banner-area-modern .owl-nav button.owl-prev {
  677. \t\t\tmargin-right: auto;
  678. \t\t}
  679. \t\t.banner-area-modern .owl-nav button.owl-next {
  680. \t\t\tmargin-left: auto;
  681. \t\t}
  682. \t\t.banner-area-modern .owl-nav button:hover {
  683. \t\t\tbackground: #ff6b00 !important;
  684. \t\t\tcolor: white !important;
  685. \t\t\ttransform: scale(1.1);
  686. \t\t\tbox-shadow: 0 6px 20px rgba(255, 162, 0, 0.6);
  687. \t\t}
  688. \t\t.banner-area-modern .owl-nav button.disabled {
  689. \t\t\topacity: 0.5;
  690. \t\t\tcursor: not-allowed;
  691. \t\t}
  692. \t\t.banner-area-modern .owl-nav button.disabled:hover {
  693. \t\t\ttransform: scale(1);
  694. \t\t}
  695. \t\t.banner-area-modern .owl-dots {
  696. \t\t\tposition: absolute;
  697. \t\t\tbottom: 30px;
  698. \t\t\tleft: 50%;
  699. \t\t\ttransform: translateX(-50%);
  700. \t\t\tdisplay: flex;
  701. \t\t\tgap: 10px;
  702. \t\t\tz-index: 10;
  703. \t\t}
  704. \t\t.banner-area-modern .owl-dots button {
  705. \t\t\twidth: 12px;
  706. \t\t\theight: 12px;
  707. \t\t\tborder-radius: 50%;
  708. \t\t\tbackground: rgba(255, 255, 255, 0.6) !important;
  709. \t\t\tborder: 2px solid white !important;
  710. \t\t\ttransition: all 0.3s ease;
  711. \t\t\tmargin: 0 5px;
  712. \t\t}
  713. \t\t.banner-area-modern .owl-dots button.active {
  714. \t\t\tbackground: #ffa200 !important;
  715. \t\t\tborder-color: #ffa200 !important;
  716. \t\t\twidth: 30px;
  717. \t\t\tborder-radius: 6px;
  718. \t\t}
  719. \t\t/* Responsive */
  720. \t\t@media(max-width: 992px) {
  721. \t\t\t.banner-area-modern {
  722. \t\t\t\tmin-height: 450px;
  723. \t\t\t\tpadding: 40px 0;
  724. \t\t\t\tbackground-size: cover;
  725. \t\t\t\tbackground-position: center;
  726. \t\t\t}
  727. \t\t\t.banner-slide-item {
  728. \t\t\t\tmin-height: 450px;
  729. \t\t\t\tpadding: 30px 0;
  730. \t\t\t}
  731. \t\t\t.banner-title-modern {
  732. \t\t\t\tfont-size: 1.5rem;
  733. \t\t\t}
  734. \t\t\t.banner-description-modern {
  735. \t\t\t\tfont-size: 1rem;
  736. \t\t\t}
  737. \t\t\t.banner-image-modern {
  738. \t\t\t\theight: 350px;
  739. \t\t\t\tmargin-top: 30px;
  740. \t\t\t}
  741. \t\t\t.banner-content-modern {
  742. \t\t\t\tpadding: 25px;
  743. \t\t\t}
  744. \t\t}
  745. \t\t@media(max-width: 768px) {
  746. \t\t\t.banner-area-modern {
  747. \t\t\t\tmin-height: 400px;
  748. \t\t\t\tpadding: 30px 0;
  749. \t\t\t\tbackground-size: cover;
  750. \t\t\t\tbackground-position: center;
  751. \t\t\t}
  752. \t\t\t.banner-slide-item {
  753. \t\t\t\tmin-height: 400px;
  754. \t\t\t\tpadding: 20px 0;
  755. \t\t\t}
  756. \t\t\t.banner-title-modern {
  757. \t\t\t\tfont-size: 1.25rem;
  758. \t\t\t}
  759. \t\t\t.banner-description-modern {
  760. \t\t\t\tfont-size: 0.95rem;
  761. \t\t\t}
  762. \t\t\t.banner-image-modern {
  763. \t\t\t\theight: 280px;
  764. \t\t\t\tmargin-top: 20px;
  765. \t\t\t}
  766. \t\t\t.banner-content-modern {
  767. \t\t\t\tpadding: 20px;
  768. \t\t\t}
  769. \t\t\t.banner-price-modern .price-value {
  770. \t\t\t\tfont-size: 1.25rem;
  771. \t\t\t}
  772. \t\t\t.banner-actions-modern {
  773. \t\t\t\tflex-direction: column;
  774. \t\t\t}
  775. \t\t\t.btn-banner-primary,
  776. \t\t\t.btn-banner-secondary {
  777. \t\t\t\twidth: 100%;
  778. \t\t\t\tjustify-content: center;
  779. \t\t\t}
  780. \t\t\t.banner-area-modern .owl-nav button {
  781. \t\t\t\twidth: 50px;
  782. \t\t\t\theight: 50px;
  783. \t\t\t\tmin-width: 50px;
  784. \t\t\t\tmin-height: 50px;
  785. \t\t\t\tfont-size: 20px !important;
  786. \t\t\t\tbackground: #ffa200 !important;
  787. \t\t\t}
  788. \t\t\t.banner-area-modern .owl-nav button:hover {
  789. \t\t\t\tbackground: #ff6b00 !important;
  790. \t\t\t}
  791. \t\t}
  792. \t\t@media(max-width: 576px) {
  793. \t\t\t.banner-area-modern {
  794. \t\t\t\tmin-height: 350px;
  795. \t\t\t\tpadding: 0;
  796. \t\t\t\tbackground-size: cover;
  797. \t\t\t\tbackground-position: center;
  798. \t\t\t}
  799. \t\t\t.banner-slide-item {
  800. \t\t\t\tmin-height: 350px;
  801. \t\t\t}
  802. \t\t\t.banner-title-modern {
  803. \t\t\t\tfont-size: 1.25rem;
  804. \t\t\t}
  805. \t\t\t.banner-image-modern {
  806. \t\t\t\theight: 220px;
  807. \t\t\t}
  808. \t\t\t.banner-content-modern {
  809. \t\t\t\tpadding: 15px;
  810. \t\t\t}
  811. \t\t}
  812. \t\t/* Styles pour les catégories de boutiques cliquables */
  813. \t\t.shop-category-clickable {
  814. \t\t\tcursor: pointer;
  815. \t\t\ttransition: all 0.3s ease;
  816. \t\t\theight: 100%;
  817. \t\t}
  818. \t\t.shop-category-clickable:hover {
  819. \t\t\ttransform: translateY(-10px);
  820. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  821. \t\t}
  822. \t\t.shop-category-clickable:hover .category-image {
  823. \t\t\ttransform: scale(1.1);
  824. \t\t}
  825. \t\t.shop-category-clickable:hover .btn-primary-custom {
  826. \t\t\tbackground: #e8910a;
  827. \t\t\ttransform: translateX(5px);
  828. \t\t}
  829. \t\t/* Styles pour les cartes de catégories personnalisées */
  830. \t\t.category-card-custom {
  831. \t\t\tborder-radius: 15px;
  832. \t\t\toverflow: hidden;
  833. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
  834. \t\t\ttransition: transform 0.3s ease, box-shadow 0.3s ease;
  835. \t\t\tbackground: white;
  836. \t\t\theight: 100%;
  837. \t\t}
  838. \t\t.category-card-custom:hover {
  839. \t\t\ttransform: translateY(-10px);
  840. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  841. \t\t}
  842. \t\t.category-image-wrapper {
  843. \t\t\tposition: relative;
  844. \t\t\theight: 200px;
  845. \t\t\toverflow: hidden;
  846. \t\t}
  847. \t\t.category-image {
  848. \t\t\twidth: 100%;
  849. \t\t\theight: 100%;
  850. \t\t\tbackground-size: cover;
  851. \t\t\tbackground-position: center;
  852. \t\t\ttransition: transform 0.3s ease;
  853. \t\t}
  854. \t\t.category-card-custom:hover .category-image {
  855. \t\t\ttransform: scale(1.1);
  856. \t\t}
  857. \t\t.category-overlay-custom {
  858. \t\t\tposition: absolute;
  859. \t\t\ttop: 0;
  860. \t\t\tleft: 0;
  861. \t\t\twidth: 100%;
  862. \t\t\theight: 100%;
  863. \t\t\tbackground: rgba(0, 0, 0, 0.6);
  864. \t\t\tdisplay: flex;
  865. \t\t\talign-items: center;
  866. \t\t\tjustify-content: center;
  867. \t\t\topacity: 0;
  868. \t\t\ttransition: opacity 0.3s ease;
  869. \t\t\tcolor: white;
  870. \t\t}
  871. \t\t.category-card-custom:hover .category-overlay-custom {
  872. \t\t\topacity: 1;
  873. \t\t}
  874. \t\t.category-icon-wrapper {
  875. \t\t\ttext-align: center;
  876. \t\t}
  877. \t\t.category-icon-wrapper i {
  878. \t\t\tcolor: #ffa200;
  879. \t\t\tdisplay: block;
  880. \t\t}
  881. \t\t.category-icon-wrapper h4 {
  882. \t\t\tcolor: white;
  883. \t\t\tmargin-top: 10px;
  884. \t\t}
  885. \t\t/* Styles pour la galerie de produits en vedette */
  886. \t\t.featured-products-carousel-section {
  887. \t\t\tposition: relative;
  888. \t\t\toverflow: hidden;
  889. \t\t}
  890. \t\t.featured-gallery-wrapper {
  891. \t\t\tposition: relative;
  892. \t\t\tmax-width: 1400px;
  893. \t\t\tmargin: 0 auto;
  894. \t\t\tpadding: 0 15px;
  895. \t\t}
  896. \t\t.featured-gallery-container {
  897. \t\t\tposition: relative;
  898. \t\t\toverflow: visible;
  899. \t\t\tborder-radius: 12px;
  900. \t\t}
  901. \t\t.featured-gallery-grid {
  902. \t\t\tdisplay: flex;
  903. \t\t\tgap: 30px;
  904. \t\t\tpadding: 15px 0;
  905. \t\t\toverflow-x: auto;
  906. \t\t\toverflow-y: hidden;
  907. \t\t\tscroll-behavior: smooth;
  908. \t\t\tscroll-behavior: smooth;
  909. \t\t\tscrollbar-width: none; /* Firefox */
  910. \t\t\t-ms-overflow-style: none; /* IE/Edge */
  911. \t\t\t-webkit-overflow-scrolling: touch; /* iOS smooth scroll */
  912. \t\t\twill-change: scroll-position;
  913. \t\t}
  914. \t\t.featured-gallery-grid::-webkit-scrollbar {
  915. \t\t\tdisplay: none; /* Chrome/Safari */
  916. \t\t}
  917. \t\t/* Mode OwlCarousel */
  918. \t\t.featured-gallery-grid.owl-carousel {
  919. \t\t\tdisplay: block;
  920. \t\t\toverflow: hidden;
  921. \t\t\tpadding: 25px 0;
  922. \t\t}
  923. \t\t.featured-gallery-grid.owl-carousel .owl-stage-outer {
  924. \t\t\toverflow: visible;
  925. \t\t}
  926. \t\t.featured-gallery-grid.owl-carousel .featured-gallery-item {
  927. \t\t\topacity: 1;
  928. \t\t\ttransform: none;
  929. \t\t\twidth: auto;
  930. \t\t\tmax-width: none;
  931. \t\t\tmargin: 0 15px;
  932. \t\t}
  933. \t\t.featured-gallery-grid.owl-carousel .owl-stage {
  934. \t\t\tdisplay: flex;
  935. \t\t}
  936. \t\t.featured-gallery-item {
  937. \t\t\tflex: 0 0 auto; /* Largeur automatique basée sur le contenu */
  938. \t\t\twidth: 100%;
  939. \t\t\tmax-width: 100%;
  940. \t\t\topacity: 0;
  941. \t\t\ttransform: translateY(20px) scale(0.95);
  942. \t\t\tanimation: galleryItemFadeIn 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  943. \t\t\tanimation-delay: calc(var(--item-index, 0) * 0.05s);
  944. \t\t}
  945. \t\t/* Produits plus larges et esthétiques - 3 par ligne sur grands écrans */
  946. \t\t@media(min-width: 1200px) {
  947. \t\t\t.featured-gallery-item {
  948. \t\t\t\tflex: 0 0 calc(33.333333% - 20px);
  949. \t\t\t\tmax-width: calc(33.333333% - 20px);
  950. \t\t\t}
  951. \t\t}
  952. \t\t@media(min-width: 992px) and (max-width: 1199px) {
  953. \t\t\t.featured-gallery-item {
  954. \t\t\t\tflex: 0 0 calc(33.333333% - 20px);
  955. \t\t\t\tmax-width: calc(33.333333% - 20px);
  956. \t\t\t}
  957. \t\t}
  958. \t\t@media(min-width: 768px) and (max-width: 991px) {
  959. \t\t\t.featured-gallery-item {
  960. \t\t\t\tflex: 0 0 calc(50% - 15px);
  961. \t\t\t\tmax-width: calc(50% - 15px);
  962. \t\t\t}
  963. \t\t}
  964. \t\t@media(max-width: 767px) {
  965. \t\t\t.featured-gallery-item {
  966. \t\t\t\tflex: 0 0 100%;
  967. \t\t\t\tmax-width: 100%;
  968. \t\t\t}
  969. \t\t}
  970. \t\t/* Design amélioré pour single-product - plus large et esthétique */
  971. \t\t.featured-gallery-item .single-product {
  972. \t\t\tmargin-bottom: 0;
  973. \t\t\tmin-height: 520px;
  974. \t\t\tdisplay: flex;
  975. \t\t\tflex-direction: column;
  976. \t\t\tpadding: 25px;
  977. \t\t\tbackground: #fff;
  978. \t\t\tborder-radius: 16px;
  979. \t\t\tbox-shadow: 0 8px 25px rgba(15, 34, 58, 0.1);
  980. \t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  981. \t\t\tborder: 1px solid rgba(0, 0, 0, 0.05);
  982. \t\t\tposition: relative;
  983. \t\t\toverflow: hidden;
  984. \t\t}
  985. \t\t.featured-gallery-item .single-product::before {
  986. \t\t\tcontent: '';
  987. \t\t\tposition: absolute;
  988. \t\t\ttop: 0;
  989. \t\t\tleft: 0;
  990. \t\t\tright: 0;
  991. \t\t\theight: 4px;
  992. \t\t\tbackground: linear-gradient(90deg, #ffa200 0%, #ff6b00 100%);
  993. \t\t\ttransform: scaleX(0);
  994. \t\t\ttransform-origin: left;
  995. \t\t\ttransition: transform 0.4s ease;
  996. \t\t}
  997. \t\t.featured-gallery-item .single-product:hover {
  998. \t\t\ttransform: translateY(-8px);
  999. \t\t\tbox-shadow: 0 20px 50px rgba(15, 34, 58, 0.15);
  1000. \t\t\tborder-color: rgba(255, 162, 0, 0.3);
  1001. \t\t}
  1002. \t\t.featured-gallery-item .single-product:hover::before {
  1003. \t\t\ttransform: scaleX(1);
  1004. \t\t}
  1005. \t\t/* S'assurer que les images s'affichent correctement - styles identiques à listing.html.twig */
  1006. \t\t.featured-gallery-item .single-product img {
  1007. \t\t\tmargin-bottom: 20px;
  1008. \t\t\twidth: 100%;
  1009. \t\t}
  1010. \t\t/* Styles améliorés pour product-image-container - plus large et esthétique */
  1011. \t\t.featured-gallery-item .product-image-container {
  1012. \t\t\tposition: relative;
  1013. \t\t\toverflow: hidden;
  1014. \t\t\tborder-radius: 14px;
  1015. \t\t\theight: 320px;
  1016. \t\t\tdisplay: flex;
  1017. \t\t\talign-items: center;
  1018. \t\t\tjustify-content: center;
  1019. \t\t\tbackground: linear-gradient(135deg, #f7f7fb 0%, #e8ecf1 100%);
  1020. \t\t\tmargin-bottom: 22px;
  1021. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
  1022. \t\t}
  1023. \t\t.featured-gallery-item .product-image-container:hover {
  1024. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
  1025. \t\t}
  1026. \t\t.featured-gallery-item .product-image-container:hover .main-product-img {
  1027. \t\t\ttransform: scale(1.08);
  1028. \t\t\ttransition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  1029. \t\t}
  1030. \t\t.featured-gallery-item .product-image-container a {
  1031. \t\t\tdisplay: block;
  1032. \t\t\twidth: 100%;
  1033. \t\t\theight: 100%;
  1034. \t\t}
  1035. \t\t.featured-gallery-item .main-product-img {
  1036. \t\t\ttransition: transform 0.3s ease;
  1037. \t\t\twidth: 100% !important;
  1038. \t\t\theight: 100% !important;
  1039. \t\t\tobject-fit: cover;
  1040. \t\t\tobject-position: center;
  1041. \t\t\tdisplay: block;
  1042. \t\t\twill-change: transform, opacity;
  1043. \t\t}
  1044. \t\t.featured-gallery-item .main-product-img.image-fade {
  1045. \t\t\tanimation: imageFade 0.5s ease;
  1046. \t\t}
  1047. \t\t@keyframes imageFade {
  1048. \t\t\tfrom {
  1049. \t\t\t\topacity: 0;
  1050. \t\t\t\ttransform: scale(1.02);
  1051. \t\t\t}
  1052. \t\t\tto {
  1053. \t\t\t\topacity: 1;
  1054. \t\t\t\ttransform: scale(1);
  1055. \t\t\t}
  1056. \t\t}
  1057. \t\t.featured-gallery-item .product-details {
  1058. \t\t\tdisplay: flex;
  1059. \t\t\tflex-direction: column;
  1060. \t\t\theight: 100%;
  1061. \t\t\tpadding: 0 5px;
  1062. \t\t}
  1063. \t\t.featured-gallery-item .product-details h6 {
  1064. \t\t\tfont-size: 1.1rem;
  1065. \t\t\tfont-weight: 600;
  1066. \t\t\tmargin-bottom: 12px;
  1067. \t\t\tline-height: 1.4;
  1068. \t\t\tcolor: #2c3e50;
  1069. \t\t\tmin-height: 48px;
  1070. \t\t}
  1071. \t\t.featured-gallery-item .product-details h6 a {
  1072. \t\t\tcolor: #2c3e50;
  1073. \t\t\ttext-decoration: none;
  1074. \t\t\ttransition: color 0.3s ease;
  1075. \t\t}
  1076. \t\t.featured-gallery-item .product-details h6 a:hover {
  1077. \t\t\tcolor: #ffa200;
  1078. \t\t}
  1079. \t\t.featured-gallery-item .prd-bottom {
  1080. \t\t\tmargin-top: auto;
  1081. \t\t}
  1082. \t\t/* Styles pour img-nav-btn - identiques à listing.html.twig */
  1083. \t\t.featured-gallery-item .img-nav-btn {
  1084. \t\t\tposition: absolute;
  1085. \t\t\ttop: 50%;
  1086. \t\t\ttransform: translateY(-50%);
  1087. \t\t\tbackground: rgba(0, 0, 0, 0.6);
  1088. \t\t\tcolor: white;
  1089. \t\t\tborder: none;
  1090. \t\t\twidth: 35px;
  1091. \t\t\theight: 35px;
  1092. \t\t\tborder-radius: 50%;
  1093. \t\t\tdisplay: flex;
  1094. \t\t\talign-items: center;
  1095. \t\t\tjustify-content: center;
  1096. \t\t\tcursor: pointer;
  1097. \t\t\ttransition: all 0.3s ease;
  1098. \t\t\tz-index: 10;
  1099. \t\t}
  1100. \t\t.featured-gallery-item .img-nav-btn:hover {
  1101. \t\t\tbackground: #095ad3;
  1102. \t\t\ttransform: translateY(-50%) scale(1.1);
  1103. \t\t}
  1104. \t\t.featured-gallery-item .img-nav-left {
  1105. \t\t\tleft: 10px;
  1106. \t\t}
  1107. \t\t.featured-gallery-item .img-nav-right {
  1108. \t\t\tright: 10px;
  1109. \t\t}
  1110. \t\t.featured-gallery-item .img-indicators {
  1111. \t\t\tposition: absolute;
  1112. \t\t\tbottom: 10px;
  1113. \t\t\tleft: 50%;
  1114. \t\t\ttransform: translateX(-50%);
  1115. \t\t\tdisplay: flex;
  1116. \t\t\tgap: 5px;
  1117. \t\t\tz-index: 10;
  1118. \t\t}
  1119. \t\t.featured-gallery-item .indicator {
  1120. \t\t\twidth: 8px;
  1121. \t\t\theight: 8px;
  1122. \t\t\tborder-radius: 50%;
  1123. \t\t\tbackground: rgba(255, 255, 255, 0.5);
  1124. \t\t\tcursor: pointer;
  1125. \t\t\tmargin-bottom: 10px;
  1126. \t\t\ttransition: all 0.3s ease;
  1127. \t\t\tborder: 1px solid rgba(255, 255, 255, 0.3);
  1128. \t\t}
  1129. \t\t.featured-gallery-item .indicator.active {
  1130. \t\t\tbackground: #ffa200;
  1131. \t\t\tborder-color: #ffa200;
  1132. \t\t\ttransform: scale(1.2);
  1133. \t\t}
  1134. \t\t.featured-gallery-item .indicator:hover {
  1135. \t\t\tbackground: rgba(255, 255, 255, 0.8);
  1136. \t\t}
  1137. \t\t/* Styles pour shop-info - identiques à listing.html.twig */
  1138. \t\t.featured-gallery-item .shop-info {
  1139. \t\t\tmargin: 10px 0 15px 0;
  1140. \t\t\tpadding: 8px 0;
  1141. \t\t\tborder-bottom: 1px solid #f0f0f0;
  1142. \t\t}
  1143. \t\t.featured-gallery-item .shop-info small {
  1144. \t\t\tfont-size: 0.9rem;
  1145. \t\t}
  1146. \t\t.featured-gallery-item .shop-link {
  1147. \t\t\tcolor: #007bff;
  1148. \t\t\ttext-decoration: none;
  1149. \t\t\tfont-weight: 500;
  1150. \t\t}
  1151. \t\t.featured-gallery-item .shop-link:hover {
  1152. \t\t\tcolor: #ffa200;
  1153. \t\t\ttext-decoration: underline;
  1154. \t\t}
  1155. \t\t/* Styles améliorés pour le prix */
  1156. \t\t.featured-gallery-item .price {
  1157. \t\t\tmargin-bottom: 18px;
  1158. \t\t}
  1159. \t\t.featured-gallery-item .price h6 {
  1160. \t\t\tfont-size: 1.4rem;
  1161. \t\t\tfont-weight: 700;
  1162. \t\t\tcolor: #ffa200;
  1163. \t\t\tmargin-bottom: 5px;
  1164. \t\t}
  1165. \t\t.featured-gallery-item .price h6.l-through {
  1166. \t\t\tfont-size: 1rem;
  1167. \t\t\tcolor: #95a5a6;
  1168. \t\t\ttext-decoration: line-through;
  1169. \t\t\tfont-weight: 500;
  1170. \t\t}
  1171. \t\t/* Les autres styles (prd-bottom, social-info) sont déjà définis dans main.css */
  1172. \t\t@keyframes galleryItemFadeIn {
  1173. \t\t\tfrom {
  1174. \t\t\t\topacity: 0;
  1175. \t\t\t\ttransform: translateY(20px) scale(0.95);
  1176. \t\t\t}
  1177. \t\t\tto {
  1178. \t\t\t\topacity: 1;
  1179. \t\t\t\ttransform: translateY(0) scale(1);
  1180. \t\t\t}
  1181. \t\t}
  1182. \t\t.featured-gallery-card {
  1183. \t\t\tdisplay: flex;
  1184. \t\t\tflex-direction: column;
  1185. \t\t\theight: 100%;
  1186. \t\t\tbackground: white;
  1187. \t\t\tborder-radius: 12px;
  1188. \t\t\toverflow: hidden;
  1189. \t\t\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
  1190. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1191. \t\t\tborder: 1px solid #f0f0f0;
  1192. \t\t}
  1193. \t\t.featured-gallery-card:hover {
  1194. \t\t\ttransform: translateY(-5px);
  1195. \t\t\tbox-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
  1196. \t\t\tborder-color: #ffa200;
  1197. \t\t}
  1198. \t\t.featured-gallery-image-wrapper {
  1199. \t\t\tposition: relative;
  1200. \t\t\twidth: 100%;
  1201. \t\t\tpadding-top: 100%; /* Ratio 1:1 pour une galerie carrée */
  1202. \t\t\toverflow: hidden;
  1203. \t\t\tbackground: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  1204. \t\t}
  1205. \t\t.featured-gallery-image {
  1206. \t\t\tposition: absolute;
  1207. \t\t\ttop: 0;
  1208. \t\t\tleft: 0;
  1209. \t\t\twidth: 100%;
  1210. \t\t\theight: 100%;
  1211. \t\t\tbackground-size: cover;
  1212. \t\t\tbackground-position: center;
  1213. \t\t\ttransition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
  1214. \t\t}
  1215. \t\t.featured-gallery-card:hover .featured-gallery-image {
  1216. \t\t\ttransform: scale(1.08);
  1217. \t\t}
  1218. \t\t.featured-gallery-badge {
  1219. \t\t\tposition: absolute;
  1220. \t\t\ttop: 8px;
  1221. \t\t\tleft: 8px;
  1222. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1223. \t\t\tcolor: white;
  1224. \t\t\tpadding: 4px 10px;
  1225. \t\t\tborder-radius: 15px;
  1226. \t\t\tfont-size: 12px;
  1227. \t\t\tfont-weight: 600;
  1228. \t\t\tz-index: 2;
  1229. \t\t\tbox-shadow: 0 2px 8px rgba(255, 162, 0, 0.4);
  1230. \t\t}
  1231. \t\t.featured-gallery-overlay {
  1232. \t\t\tposition: absolute;
  1233. \t\t\ttop: 0;
  1234. \t\t\tleft: 0;
  1235. \t\t\twidth: 100%;
  1236. \t\t\theight: 100%;
  1237. \t\t\tbackground: rgba(0, 0, 0, 0.5);
  1238. \t\t\tdisplay: flex;
  1239. \t\t\talign-items: center;
  1240. \t\t\tjustify-content: center;
  1241. \t\t\topacity: 0;
  1242. \t\t\ttransition: opacity 0.3s ease;
  1243. \t\t}
  1244. \t\t.featured-gallery-card:hover .featured-gallery-overlay {
  1245. \t\t\topacity: 1;
  1246. \t\t}
  1247. \t\t.featured-gallery-view-btn {
  1248. \t\t\tbackground: white;
  1249. \t\t\tcolor: #333;
  1250. \t\t\twidth: 40px;
  1251. \t\t\theight: 40px;
  1252. \t\t\tborder-radius: 50%;
  1253. \t\t\tdisplay: flex;
  1254. \t\t\talign-items: center;
  1255. \t\t\tjustify-content: center;
  1256. \t\t\ttext-decoration: none;
  1257. \t\t\tfont-size: 18px;
  1258. \t\t\ttransform: scale(0.8);
  1259. \t\t\ttransition: transform 0.3s ease;
  1260. \t\t}
  1261. \t\t.featured-gallery-card:hover .featured-gallery-view-btn {
  1262. \t\t\ttransform: scale(1);
  1263. \t\t}
  1264. \t\t.featured-gallery-info {
  1265. \t\t\tpadding: 12px;
  1266. \t\t\tflex: 1;
  1267. \t\t\tdisplay: flex;
  1268. \t\t\tflex-direction: column;
  1269. \t\t}
  1270. \t\t.featured-gallery-title {
  1271. \t\t\tfont-size: 14px;
  1272. \t\t\tfont-weight: 600;
  1273. \t\t\tmargin-bottom: 6px;
  1274. \t\t\tcolor: #333;
  1275. \t\t\tline-height: 1.3;
  1276. \t\t\tdisplay: -webkit-box;
  1277. \t\t\t-webkit-line-clamp: 2;
  1278. \t\t\t-webkit-box-orient: vertical;
  1279. \t\t\toverflow: hidden;
  1280. \t\t\tmin-height: 36px;
  1281. \t\t}
  1282. \t\t.featured-gallery-title a {
  1283. \t\t\tcolor: #333;
  1284. \t\t\ttext-decoration: none;
  1285. \t\t\ttransition: color 0.3s ease;
  1286. \t\t}
  1287. \t\t.featured-gallery-title a:hover {
  1288. \t\t\tcolor: #ffa200;
  1289. \t\t}
  1290. \t\t.featured-gallery-price {
  1291. \t\t\tfont-size: 16px;
  1292. \t\t\tfont-weight: 700;
  1293. \t\t\tcolor: #ffa200;
  1294. \t\t\tmargin-bottom: 6px;
  1295. \t\t}
  1296. \t\t.featured-gallery-rating {
  1297. \t\t\tdisplay: flex;
  1298. \t\t\talign-items: center;
  1299. \t\t\tgap: 3px;
  1300. \t\t\tfont-size: 11px;
  1301. \t\t}
  1302. \t\t.featured-gallery-rating .fa-star.active {
  1303. \t\t\tcolor: #ffa200;
  1304. \t\t}
  1305. \t\t.featured-gallery-rating .fa-star-o {
  1306. \t\t\tcolor: #ddd;
  1307. \t\t}
  1308. \t\t.featured-gallery-controls {
  1309. \t\t\tdisplay: flex;
  1310. \t\t\tjustify-content: center;
  1311. \t\t\tgap: 20px;
  1312. \t\t\tmargin-top: 25px;
  1313. \t\t\tpadding: 0 20px;
  1314. \t\t}
  1315. \t\t.featured-gallery-nav-btn {
  1316. \t\t\twidth: 42px;
  1317. \t\t\theight: 42px;
  1318. \t\t\tborder-radius: 50%;
  1319. \t\t\tborder: 1.5px solid #ffa200;
  1320. \t\t\tbackground: white;
  1321. \t\t\tcolor: #ffa200;
  1322. \t\t\tfont-size: 16px;
  1323. \t\t\tcursor: pointer;
  1324. \t\t\tdisplay: flex;
  1325. \t\t\talign-items: center;
  1326. \t\t\tjustify-content: center;
  1327. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1328. \t\t\tbox-shadow: 0 3px 10px rgba(255, 162, 0, 0.18);
  1329. \t\t\tposition: relative;
  1330. \t\t\toverflow: hidden;
  1331. \t\t}
  1332. \t\t.featured-gallery-nav-btn.btn-ripple::after {
  1333. \t\t\tcontent: '';
  1334. \t\t\tposition: absolute;
  1335. \t\t\twidth: 100%;
  1336. \t\t\theight: 100%;
  1337. \t\t\tleft: 0;
  1338. \t\t\ttop: 0;
  1339. \t\t\tborder-radius: 50%;
  1340. \t\t\tbackground: rgba(255, 162, 0, 0.2);
  1341. \t\t\tanimation: rippleEffect 0.35s ease;
  1342. \t\t}
  1343. \t\t@keyframes rippleEffect {
  1344. \t\t\tfrom {
  1345. \t\t\t\ttransform: scale(0.6);
  1346. \t\t\t\topacity: 0.7;
  1347. \t\t\t}
  1348. \t\t\tto {
  1349. \t\t\t\ttransform: scale(1.4);
  1350. \t\t\t\topacity: 0;
  1351. \t\t\t}
  1352. \t\t}
  1353. \t\t.featured-gallery-nav-btn:hover:not(:disabled) {
  1354. \t\t\tbackground: #ffa200;
  1355. \t\t\tcolor: white;
  1356. \t\t\ttransform: scale(1.1);
  1357. \t\t\tbox-shadow: 0 5px 18px rgba(255, 162, 0, 0.4);
  1358. \t\t}
  1359. \t\t.featured-gallery-nav-btn:active:not(:disabled) {
  1360. \t\t\ttransform: scale(0.95);
  1361. \t\t}
  1362. \t\t.featured-gallery-nav-btn:disabled {
  1363. \t\t\topacity: 0.3;
  1364. \t\t\tcursor: not-allowed;
  1365. \t\t}
  1366. \t\t.featured-gallery-load-more {
  1367. \t\t\tmargin-top: 30px;
  1368. \t\t}
  1369. \t\t/* Style pour le bouton \"Voir tous les produits\" */
  1370. \t\t.btn-view-all-products {
  1371. \t\t\tdisplay: inline-flex;
  1372. \t\t\talign-items: center;
  1373. \t\t\tgap: 12px;
  1374. \t\t\tpadding: 16px 40px;
  1375. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1376. \t\t\tcolor: white;
  1377. \t\t\ttext-decoration: none;
  1378. \t\t\tborder-radius: 50px;
  1379. \t\t\tfont-weight: 600;
  1380. \t\t\tfont-size: 16px;
  1381. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1382. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.3);
  1383. \t\t\tposition: relative;
  1384. \t\t\toverflow: hidden;
  1385. \t\t}
  1386. \t\t.btn-view-all-products::before {
  1387. \t\t\tcontent: '';
  1388. \t\t\tposition: absolute;
  1389. \t\t\ttop: 0;
  1390. \t\t\tleft: -100%;
  1391. \t\t\twidth: 100%;
  1392. \t\t\theight: 100%;
  1393. \t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
  1394. \t\t\ttransition: left 0.5s ease;
  1395. \t\t}
  1396. \t\t.btn-view-all-products:hover::before {
  1397. \t\t\tleft: 100%;
  1398. \t\t}
  1399. \t\t.btn-view-all-products:hover {
  1400. \t\t\ttransform: translateY(-3px);
  1401. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.5);
  1402. \t\t\tcolor: white;
  1403. \t\t}
  1404. \t\t.btn-view-all-products:active {
  1405. \t\t\ttransform: translateY(-1px);
  1406. \t\t}
  1407. \t\t.btn-view-all-products i {
  1408. \t\t\tfont-size: 18px;
  1409. \t\t\ttransition: transform 0.3s ease;
  1410. \t\t}
  1411. \t\t.btn-view-all-products:hover i {
  1412. \t\t\ttransform: translateX(5px);
  1413. \t\t}
  1414. \t\t.btn-view-all-products span {
  1415. \t\t\tposition: relative;
  1416. \t\t\tz-index: 1;
  1417. \t\t}
  1418. \t\t/* Responsive */
  1419. \t\t@media(max-width: 767px) {
  1420. \t\t\t.btn-view-all-products {
  1421. \t\t\t\tpadding: 14px 30px;
  1422. \t\t\t\tfont-size: 14px;
  1423. \t\t\t}
  1424. \t\t}
  1425. \t\t/* Responsive */
  1426. \t\t@media(max-width: 767px) {
  1427. \t\t\t.featured-gallery-grid {
  1428. \t\t\t\tgap: 10px;
  1429. \t\t\t}
  1430. \t\t\t.featured-gallery-info {
  1431. \t\t\t\tpadding: 10px;
  1432. \t\t\t}
  1433. \t\t\t.featured-gallery-title {
  1434. \t\t\t\tfont-size: 13px;
  1435. \t\t\t\tmin-height: 32px;
  1436. \t\t\t}
  1437. \t\t\t.featured-gallery-price {
  1438. \t\t\t\tfont-size: 14px;
  1439. \t\t\t}
  1440. \t\t}
  1441. \t\t/* Styles pour les grilles de produits Nouveautés */
  1442. \t\t.latest-products-grid {
  1443. \t\t\tmargin-top: 30px;
  1444. \t\t}
  1445. \t\t.product-card-modern {
  1446. \t\t\tbackground: white;
  1447. \t\t\tborder-radius: 12px;
  1448. \t\t\toverflow: hidden;
  1449. \t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
  1450. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1451. \t\t\theight: 100%;
  1452. \t\t\tdisplay: flex;
  1453. \t\t\tflex-direction: column;
  1454. \t\t\tborder: 1px solid #f0f0f0;
  1455. \t\t}
  1456. \t\t.product-card-modern:hover {
  1457. \t\t\ttransform: translateY(-8px);
  1458. \t\t\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
  1459. \t\t\tborder-color: #ffa200;
  1460. \t\t}
  1461. \t\t.product-image-wrapper {
  1462. \t\t\tposition: relative;
  1463. \t\t\twidth: 100%;
  1464. \t\t\tpadding-top: 75%; /* Ratio 4:3 */
  1465. \t\t\toverflow: hidden;
  1466. \t\t\tbackground: #f8f9fa;
  1467. \t\t}
  1468. \t\t.product-image {
  1469. \t\t\tposition: absolute;
  1470. \t\t\ttop: 0;
  1471. \t\t\tleft: 0;
  1472. \t\t\twidth: 100%;
  1473. \t\t\theight: 100%;
  1474. \t\t\tbackground-size: cover;
  1475. \t\t\tbackground-position: center;
  1476. \t\t\ttransition: transform 0.5s ease;
  1477. \t\t}
  1478. \t\t.product-card-modern:hover .product-image {
  1479. \t\t\ttransform: scale(1.1);
  1480. \t\t}
  1481. \t\t.product-badge-modern {
  1482. \t\t\tposition: absolute;
  1483. \t\t\ttop: 10px;
  1484. \t\t\tright: 10px;
  1485. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1486. \t\t\tcolor: white;
  1487. \t\t\tpadding: 6px 12px;
  1488. \t\t\tborder-radius: 20px;
  1489. \t\t\tfont-size: 12px;
  1490. \t\t\tfont-weight: 600;
  1491. \t\t\tz-index: 2;
  1492. \t\t\tbox-shadow: 0 2px 8px rgba(255, 162, 0, 0.3);
  1493. \t\t}
  1494. \t\t.product-badge-modern.new-badge {
  1495. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  1496. \t\t}
  1497. \t\t.product-overlay {
  1498. \t\t\tposition: absolute;
  1499. \t\t\ttop: 0;
  1500. \t\t\tleft: 0;
  1501. \t\t\twidth: 100%;
  1502. \t\t\theight: 100%;
  1503. \t\t\tbackground: rgba(0, 0, 0, 0.5);
  1504. \t\t\tdisplay: flex;
  1505. \t\t\talign-items: center;
  1506. \t\t\tjustify-content: center;
  1507. \t\t\topacity: 0;
  1508. \t\t\ttransition: opacity 0.3s ease;
  1509. \t\t\tz-index: 1;
  1510. \t\t}
  1511. \t\t.product-card-modern:hover .product-overlay {
  1512. \t\t\topacity: 1;
  1513. \t\t}
  1514. \t\t.btn-view-product {
  1515. \t\t\tbackground: white;
  1516. \t\t\tcolor: #333;
  1517. \t\t\tpadding: 12px 24px;
  1518. \t\t\tborder-radius: 25px;
  1519. \t\t\ttext-decoration: none;
  1520. \t\t\tfont-weight: 600;
  1521. \t\t\tdisplay: flex;
  1522. \t\t\talign-items: center;
  1523. \t\t\tgap: 8px;
  1524. \t\t\ttransition: all 0.3s ease;
  1525. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
  1526. \t\t}
  1527. \t\t.btn-view-product:hover {
  1528. \t\t\tbackground: #ffa200;
  1529. \t\t\tcolor: white;
  1530. \t\t\ttransform: scale(1.05);
  1531. \t\t}
  1532. \t\t.product-info-modern {
  1533. \t\t\tpadding: 16px;
  1534. \t\t\tflex-grow: 1;
  1535. \t\t\tdisplay: flex;
  1536. \t\t\tflex-direction: column;
  1537. \t\t}
  1538. \t\t.product-title-modern {
  1539. \t\t\tmargin: 0 0 8px;
  1540. \t\t\tfont-size: 16px;
  1541. \t\t\tfont-weight: 600;
  1542. \t\t\tline-height: 1.4;
  1543. \t\t}
  1544. \t\t.product-title-modern a {
  1545. \t\t\tcolor: #333;
  1546. \t\t\ttext-decoration: none;
  1547. \t\t\ttransition: color 0.3s ease;
  1548. \t\t}
  1549. \t\t.product-title-modern a:hover {
  1550. \t\t\tcolor: #ffa200;
  1551. \t\t}
  1552. \t\t.product-price-modern {
  1553. \t\t\tfont-size: 20px;
  1554. \t\t\tfont-weight: 700;
  1555. \t\t\tcolor: #ffa200;
  1556. \t\t\tmargin-bottom: 8px;
  1557. \t\t}
  1558. \t\t.product-shop-modern {
  1559. \t\t\tdisplay: flex;
  1560. \t\t\talign-items: center;
  1561. \t\t\tgap: 6px;
  1562. \t\t\tfont-size: 13px;
  1563. \t\t\tcolor: #666;
  1564. \t\t\tmargin-bottom: 8px;
  1565. \t\t}
  1566. \t\t.product-shop-modern i {
  1567. \t\t\tcolor: #ffa200;
  1568. \t\t}
  1569. \t\t.shop-link {
  1570. \t\t\tcolor: #666;
  1571. \t\t\ttext-decoration: none;
  1572. \t\t\ttransition: color 0.3s ease;
  1573. \t\t}
  1574. \t\t.shop-link:hover {
  1575. \t\t\tcolor: #ffa200;
  1576. \t\t}
  1577. \t\t.product-rating-modern {
  1578. \t\t\tdisplay: flex;
  1579. \t\t\talign-items: center;
  1580. \t\t\tgap: 4px;
  1581. \t\t\tmargin-top: auto;
  1582. \t\t}
  1583. \t\t.product-rating-modern .fa-star.active {
  1584. \t\t\tcolor: #ffc107;
  1585. \t\t}
  1586. \t\t.product-rating-modern .fa-star-o {
  1587. \t\t\tcolor: #ddd;
  1588. \t\t}
  1589. \t\t.rating-count {
  1590. \t\t\tfont-size: 12px;
  1591. \t\t\tcolor: #666;
  1592. \t\t\tmargin-left: 4px;
  1593. \t\t}
  1594. \t\t.product-views-modern {
  1595. \t\t\tdisplay: flex;
  1596. \t\t\talign-items: center;
  1597. \t\t\tgap: 6px;
  1598. \t\t\tfont-size: 12px;
  1599. \t\t\tcolor: #666;
  1600. \t\t\tmargin-top: auto;
  1601. \t\t}
  1602. \t\t.product-views-modern i {
  1603. \t\t\tcolor: #999;
  1604. \t\t}
  1605. \t\t/* Style des cartes produits */
  1606. \t\t.product-card {
  1607. \t\t\tbackground: white;
  1608. \t\t\tborder-radius: 15px;
  1609. \t\t\toverflow: hidden;
  1610. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  1611. \t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  1612. \t\t\theight: 100%;
  1613. \t\t\tdisplay: flex;
  1614. \t\t\tflex-direction: column;
  1615. \t\t}
  1616. \t\t.product-card:hover {
  1617. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.2);
  1618. \t\t\ttransform: translateY(-5px);
  1619. \t\t}
  1620. \t\t.product-image {
  1621. \t\t\twidth: 100%;
  1622. \t\t\theight: 250px;
  1623. \t\t\tbackground-size: cover;
  1624. \t\t\tbackground-position: center;
  1625. \t\t\tposition: relative;
  1626. \t\t\toverflow: hidden;
  1627. \t\t}
  1628. \t\t.product-image::before {
  1629. \t\t\tcontent: '';
  1630. \t\t\tposition: absolute;
  1631. \t\t\ttop: 0;
  1632. \t\t\tleft: -100%;
  1633. \t\t\twidth: 100%;
  1634. \t\t\theight: 100%;
  1635. \t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
  1636. \t\t\ttransition: left 0.6s ease;
  1637. \t\t}
  1638. \t\t.product-card:hover .product-image::before {
  1639. \t\t\tleft: 100%;
  1640. \t\t}
  1641. \t\t.product-badge {
  1642. \t\t\tposition: absolute;
  1643. \t\t\ttop: 15px;
  1644. \t\t\tright: 15px;
  1645. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1646. \t\t\tcolor: white;
  1647. \t\t\tpadding: 8px 15px;
  1648. \t\t\tborder-radius: 20px;
  1649. \t\t\tfont-size: 0.85rem;
  1650. \t\t\tfont-weight: 600;
  1651. \t\t\tbox-shadow: 0 4px 10px rgba(255, 162, 0, 0.4);
  1652. \t\t\tz-index: 1;
  1653. \t\t}
  1654. \t\t.product-info {
  1655. \t\t\tpadding: 20px;
  1656. \t\t\tflex-grow: 1;
  1657. \t\t\tdisplay: flex;
  1658. \t\t\tflex-direction: column;
  1659. \t\t}
  1660. \t\t.product-title {
  1661. \t\t\tfont-size: 1.1rem;
  1662. \t\t\tfont-weight: 600;
  1663. \t\t\tcolor: #2c3e50;
  1664. \t\t\tmargin-bottom: 10px;
  1665. \t\t\tline-height: 1.4;
  1666. \t\t\tdisplay: -webkit-box;
  1667. \t\t\t-webkit-line-clamp: 2;
  1668. \t\t\t-webkit-box-orient: vertical;
  1669. \t\t\toverflow: hidden;
  1670. \t\t}
  1671. \t\t.product-price {
  1672. \t\t\tfont-size: 1.5rem;
  1673. \t\t\tfont-weight: 800;
  1674. \t\t\tcolor: #ffa200;
  1675. \t\t\tmargin-bottom: 15px;
  1676. \t\t}
  1677. \t\t.product-shop {
  1678. \t\t\tfont-size: 0.9rem;
  1679. \t\t\tcolor: #666;
  1680. \t\t\tmargin-bottom: 15px;
  1681. \t\t}
  1682. \t\t.product-shop a {
  1683. \t\t\tcolor: #667eea;
  1684. \t\t\ttext-decoration: none;
  1685. \t\t\ttransition: color 0.3s ease;
  1686. \t\t}
  1687. \t\t.product-shop a:hover {
  1688. \t\t\tcolor: #ffa200;
  1689. \t\t}
  1690. \t\t/* Newsletter Modern Styles */
  1691. \t\t.newsletter-section-modern {
  1692. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #095ad3 100%);
  1693. \t\t\tposition: relative;
  1694. \t\t\toverflow: hidden;
  1695. \t\t}
  1696. \t\t.newsletter-section-modern::before {
  1697. \t\t\tcontent: '';
  1698. \t\t\tposition: absolute;
  1699. \t\t\ttop: -50%;
  1700. \t\t\tright: -50%;
  1701. \t\t\twidth: 100%;
  1702. \t\t\theight: 200%;
  1703. \t\t\tbackground: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);
  1704. \t\t\tanimation: pulse 3s ease-in-out infinite;
  1705. \t\t}
  1706. \t\t@keyframes pulse {
  1707. \t\t\t0,
  1708. \t\t\t100% {
  1709. \t\t\t\ttransform: scale(1);
  1710. \t\t\t\topacity: 0.5;
  1711. \t\t\t}
  1712. \t\t\t50% {
  1713. \t\t\t\ttransform: scale(1.1);
  1714. \t\t\t\topacity: 0.8;
  1715. \t\t\t}
  1716. \t\t}
  1717. \t\t.newsletter-card {
  1718. \t\t\tbackground: white;
  1719. \t\t\tborder-radius: 20px;
  1720. \t\t\tpadding: 40px;
  1721. \t\t\tbox-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
  1722. \t\t\tposition: relative;
  1723. \t\t\tz-index: 1;
  1724. \t\t}
  1725. \t\t.newsletter-title {
  1726. \t\t\tfont-size: 2.5rem;
  1727. \t\t\tfont-weight: bold;
  1728. \t\t\tcolor: #333;
  1729. \t\t}
  1730. \t\t.newsletter-description {
  1731. \t\t\tcolor: #666;
  1732. \t\t\tfont-size: 1.1rem;
  1733. \t\t\tline-height: 1.8;
  1734. \t\t}
  1735. \t\t.newsletter-form-modern {
  1736. \t\t\tposition: relative;
  1737. \t\t}
  1738. \t\t.newsletter-input-wrapper {
  1739. \t\t\tdisplay: flex;
  1740. \t\t\tgap: 10px;
  1741. \t\t\tmargin-bottom: 15px;
  1742. \t\t}
  1743. \t\t.newsletter-input {
  1744. \t\t\tflex: 1;
  1745. \t\t\tpadding: 18px 25px;
  1746. \t\t\tborder: 2px solid #e0e0e0;
  1747. \t\t\tborder-radius: 50px;
  1748. \t\t\tfont-size: 1rem;
  1749. \t\t\ttransition: all 0.3s ease;\t\t\tbackground: #fff;
  1750. \t\t\tcolor: #333;
  1751. \t\t}
  1752. \t\t.newsletter-input::placeholder {
  1753. \t\t\tcolor: #777;
  1754. \t\t}
  1755. \t\t.newsletter-input:focus {
  1756. \t\t\toutline: none;
  1757. \t\t\tborder-color: #ffa200;
  1758. \t\t\tbox-shadow: 0 0 0 3px rgba(255, 162, 0, 0.1);
  1759. \t\t}
  1760. \t\t.newsletter-button {
  1761. \t\t\tpadding: 18px 35px;
  1762. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1763. \t\t\tcolor: white;
  1764. \t\t\tborder: none;
  1765. \t\t\tborder-radius: 50px;
  1766. \t\t\tfont-weight: 600;
  1767. \t\t\tfont-size: 1rem;
  1768. \t\t\tcursor: pointer;
  1769. \t\t\ttransition: all 0.3s ease;
  1770. \t\t\twhite-space: nowrap;
  1771. \t\t}
  1772. \t\t.newsletter-button:hover {
  1773. \t\t\ttransform: translateY(-2px);
  1774. \t\t\tbox-shadow: 0 5px 20px rgba(255, 162, 0, 0.4);
  1775. \t\t}
  1776. \t\t.newsletter-privacy {
  1777. \t\t\tcolor: #999;
  1778. \t\t}
  1779. \t\t/* CTA Modern Styles */
  1780. \t\t.cta-section-modern {
  1781. \t\t\tbackground: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  1782. \t\t}
  1783. \t\t.cta-card {
  1784. \t\t\tbackground: white;
  1785. \t\t\tborder-radius: 25px;
  1786. \t\t\tpadding: 50px;
  1787. \t\t\tbox-shadow: 0 15px 50px rgba(0, 0, 0, 0.1);
  1788. \t\t\tposition: relative;
  1789. \t\t\toverflow: hidden;
  1790. \t\t}
  1791. \t\t.cta-card::before {
  1792. \t\t\tcontent: '';
  1793. \t\t\tposition: absolute;
  1794. \t\t\ttop: -50px;
  1795. \t\t\tright: -50px;
  1796. \t\t\twidth: 200px;
  1797. \t\t\theight: 200px;
  1798. \t\t\tbackground: linear-gradient(135deg, rgba(255,162,0,0.1) 0%, rgba(255,162,0,0.05) 100%);
  1799. \t\t\tborder-radius: 50%;
  1800. \t\t}
  1801. \t\t.cta-badge {
  1802. \t\t\tdisplay: inline-block;
  1803. \t\t\tpadding: 8px 20px;
  1804. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1805. \t\t\tcolor: white;
  1806. \t\t\tborder-radius: 50px;
  1807. \t\t\tfont-size: 0.9rem;
  1808. \t\t\tfont-weight: 600;
  1809. \t\t\tmargin-bottom: 20px;
  1810. \t\t}
  1811. \t\t.cta-title {
  1812. \t\t\tfont-size: 3rem;
  1813. \t\t\tfont-weight: bold;
  1814. \t\t\tcolor: #333;
  1815. \t\t\tmargin-bottom: 20px;
  1816. \t\t}
  1817. \t\t.cta-description {
  1818. \t\t\tfont-size: 1.2rem;
  1819. \t\t\tcolor: #666;
  1820. \t\t\tline-height: 1.8;
  1821. \t\t}
  1822. \t\t.cta-features {
  1823. \t\t\tdisplay: flex;
  1824. \t\t\tflex-direction: column;
  1825. \t\t\tgap: 15px;
  1826. \t\t}
  1827. \t\t.cta-feature-item {
  1828. \t\t\tdisplay: flex;
  1829. \t\t\talign-items: center;
  1830. \t\t\tgap: 10px;
  1831. \t\t\tfont-size: 1rem;
  1832. \t\t\tcolor: #555;
  1833. \t\t}
  1834. \t\t.cta-feature-item i {
  1835. \t\t\tcolor: #ffa200;
  1836. \t\t\tfont-size: 1.3rem;
  1837. \t\t}
  1838. \t\t.cta-buttons {
  1839. \t\t\tdisplay: flex;
  1840. \t\t\tgap: 15px;
  1841. \t\t\tflex-wrap: wrap;
  1842. \t\t}
  1843. \t\t.cta-button-primary {
  1844. \t\t\tpadding: 15px 35px;
  1845. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1846. \t\t\tcolor: white;
  1847. \t\t\tborder: none;
  1848. \t\t\tborder-radius: 50px;
  1849. \t\t\tfont-weight: 600;
  1850. \t\t\tfont-size: 1.1rem;
  1851. \t\t\ttransition: all 0.3s ease;
  1852. \t\t}
  1853. \t\t.cta-button-primary:hover {
  1854. \t\t\ttransform: translateY(-3px);
  1855. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.4);
  1856. \t\t\tcolor: white;
  1857. \t\t}
  1858. \t\t.cta-button-secondary {
  1859. \t\t\tpadding: 15px 35px;
  1860. \t\t\tbackground: white;
  1861. \t\t\tcolor: #ffa200;
  1862. \t\t\tborder: 2px solid #ffa200;
  1863. \t\t\tborder-radius: 50px;
  1864. \t\t\tfont-weight: 600;
  1865. \t\t\tfont-size: 1.1rem;
  1866. \t\t\ttransition: all 0.3s ease;
  1867. \t\t}
  1868. \t\t.cta-button-secondary:hover {
  1869. \t\t\tbackground: #ffa200;
  1870. \t\t\tcolor: white;
  1871. \t\t\ttransform: translateY(-3px);
  1872. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.3);
  1873. \t\t}
  1874. \t\t.cta-image-wrapper {
  1875. \t\t\tposition: relative;
  1876. \t\t}
  1877. \t\t.cta-decoration {
  1878. \t\t\tposition: absolute;
  1879. \t\t\ttop: -20px;
  1880. \t\t\tright: -20px;
  1881. \t\t\twidth: 150px;
  1882. \t\t\theight: 150px;
  1883. \t\t\tbackground: linear-gradient(135deg, rgba(255,162,0,0.2) 0%, rgba(255,162,0,0.05) 100%);
  1884. \t\t\tborder-radius: 50%;
  1885. \t\t\tz-index: 0;
  1886. \t\t}
  1887. \t\t.cta-image {
  1888. \t\t\tposition: relative;
  1889. \t\t\tz-index: 1;
  1890. \t\t\tmax-width: 100%;
  1891. \t\t\theight: auto;
  1892. \t\t\tborder-radius: 15px;
  1893. \t\t}
  1894. \t</style>
  1895. ";
  1896.         
  1897.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1898.         
  1899.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1900.         yield from [];
  1901.     }
  1902.     // line 2060
  1903.     /**
  1904.      * @return iterable<null|scalar|\Stringable>
  1905.      */
  1906.     public function block_body(array $context, array $blocks = []): iterable
  1907.     {
  1908.         $macros $this->macros;
  1909.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  1910.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  1911.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  1912.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  1913.         // line 2061
  1914.         yield "\t<!-- Hero Section -->
  1915. \t<!-- start banner Area avec produits en vedette -->
  1916. \t\t";
  1917.         // line 2063
  1918.         if ((array_key_exists("bannerProducts"$context) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["bannerProducts"] ?? null)) > 0))) {
  1919.             // line 2064
  1920.             yield "\t\t\t<section class=\"banner-area-modern\"> <div class=\"banner-carousel-wrapper\">
  1921. \t\t\t\t<div class=\"active-banner-slider owl-carousel\" style=\"margin-top: 100px;\">
  1922. \t\t\t\t\t";
  1923.             // line 2066
  1924.             $context['_parent'] = $context;
  1925.             $context['_seq'] = CoreExtension::ensureTraversable(($context["bannerProducts"] ?? null));
  1926.             $context['loop'] = [
  1927.               'parent' => $context['_parent'],
  1928.               'index0' => 0,
  1929.               'index'  => 1,
  1930.               'first'  => true,
  1931.             ];
  1932.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  1933.                 $length count($context['_seq']);
  1934.                 $context['loop']['revindex0'] = $length 1;
  1935.                 $context['loop']['revindex'] = $length;
  1936.                 $context['loop']['length'] = $length;
  1937.                 $context['loop']['last'] = === $length;
  1938.             }
  1939.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  1940.                 // line 2067
  1941.                 yield "\t\t\t\t\t\t<!-- single-slide -->
  1942. \t\t\t\t\t\t<div class=\"banner-slide-item\">
  1943. \t\t\t\t\t\t\t<div class=\"container\">
  1944. \t\t\t\t\t\t\t\t<div class=\"row align-items-center\">
  1945. \t\t\t\t\t\t\t\t\t<div class=\"col-lg-4 col-md-6 col-12\">
  1946. \t\t\t\t\t\t\t\t\t\t<div class=\"banner-content-modern\">
  1947. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-badge\">
  1948. \t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star\"></i>
  1949. \t\t\t\t\t\t\t\t\t\t\t\tProduit en vedette
  1950. \t\t\t\t\t\t\t\t\t\t\t</div>
  1951. \t\t\t\t\t\t\t\t\t\t\t<h1 class=\"banner-title-modern\">";
  1952.                 // line 2077
  1953.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2077), "html"nulltrue);
  1954.                 yield "</h1>
  1955. \t\t\t\t\t\t\t\t\t\t\t<p class=\"banner-description-modern\">
  1956. \t\t\t\t\t\t\t\t\t\t\t\t";
  1957.                 // line 2079
  1958.                 yield (((($tmp CoreExtension::getAttribute($this->env$this->source$context["product"], "description", [], "any"falsefalsefalse2079)) && $tmp instanceof Markup ? (string) $tmp $tmp)) ? ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["product"], "description", [], "any"falsefalsefalse2079)), 0120) . "..."), "html"nulltrue)) : ("Découvrez ce produit exclusif sur MaketOu"));
  1959.                 yield "
  1960. \t\t\t\t\t\t\t\t\t\t\t</p>
  1961. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-price-modern\">
  1962. \t\t\t\t\t\t\t\t\t\t\t\t<span class=\"price-label\">Prix</span>
  1963. \t\t\t\t\t\t\t\t\t\t\t\t<span class=\"price-value\">";
  1964.                 // line 2083
  1965.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "price", [], "any"falsefalsefalse2083), 2"."" "), "html"nulltrue);
  1966.                 yield "
  1967. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</span>
  1968. \t\t\t\t\t\t\t\t\t\t\t</div>
  1969. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-actions-modern\">
  1970. \t\t\t\t\t\t\t\t\t\t\t\t<a class=\"btn-banner-primary\" href=\"";
  1971.                 // line 2087
  1972.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2087)]), "html"nulltrue);
  1973.                 yield "\">
  1974. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"btn-text\">Voir le produit</span>
  1975. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"btn-icon\">
  1976. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-arrow-right\"></i>
  1977. \t\t\t\t\t\t\t\t\t\t\t\t\t</span>
  1978. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  1979. \t\t\t\t\t\t\t\t\t\t\t\t";
  1980.                 // line 2093
  1981.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2093)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1982.                     // line 2094
  1983.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"btn-banner-secondary\" href=\"";
  1984.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shop_show", ["slug" => CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2094), "slug", [], "any"falsefalsefalse2094)]), "html"nulltrue);
  1985.                     yield "\">
  1986. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  1987. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>";
  1988.                     // line 2096
  1989.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2096), "name", [], "any"falsefalsefalse2096), "html"nulltrue);
  1990.                     yield "</span>
  1991. \t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  1992. \t\t\t\t\t\t\t\t\t\t\t\t";
  1993.                 }
  1994.                 // line 2099
  1995.                 yield "\t\t\t\t\t\t\t\t\t\t\t</div>
  1996. \t\t\t\t\t\t\t\t\t\t</div>
  1997. \t\t\t\t\t\t\t\t\t</div>
  1998. \t\t\t\t\t\t\t\t\t<div class=\"col-lg-8 col-md-6 col-12\">
  1999. \t\t\t\t\t\t\t\t\t\t<div class=\"banner-image-modern\">
  2000. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-image-wrapper\">
  2001. \t\t\t\t\t\t\t\t\t\t\t\t";
  2002.                 // line 2105
  2003.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2105) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2105)) > 0))) {
  2004.                     // line 2106
  2005.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"banner-img\" src=\"";
  2006.                     yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsetruefalse2106), 0, [], "array"truetruefalse2106) && (($_v0 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2106)) && is_array($_v0) || $_v0 instanceof ArrayAccess ? ($_v0[0] ?? null) : null))) ? ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((($_v1 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2106)) && is_array($_v1) || $_v1 instanceof ArrayAccess ? ($_v1[0] ?? null) : null)), "html"nulltrue)) : ($this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((("ui/img/product/p" CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse2106)) . ".jpg")), "html"nulltrue)));
  2007.                     yield "\" alt=\"";
  2008.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2106), "html"nulltrue);
  2009.                     yield "\">
  2010. \t\t\t\t\t\t\t\t\t\t\t\t";
  2011.                 } else {
  2012.                     // line 2108
  2013.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"banner-img\" src=\"";
  2014.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((("ui/img/product/p" CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse2108)) . ".jpg")), "html"nulltrue);
  2015.                     yield "\" alt=\"";
  2016.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2108), "html"nulltrue);
  2017.                     yield "\">
  2018. \t\t\t\t\t\t\t\t\t\t\t\t";
  2019.                 }
  2020.                 // line 2110
  2021.                 yield "\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-image-overlay\"></div>
  2022. \t\t\t\t\t\t\t\t\t\t\t</div>
  2023. \t\t\t\t\t\t\t\t\t\t</div>
  2024. \t\t\t\t\t\t\t\t\t</div>
  2025. \t\t\t\t\t\t\t\t</div>
  2026. \t\t\t\t\t\t\t</div>
  2027. \t\t\t\t\t\t</div>
  2028. \t\t\t\t\t";
  2029.                 ++$context['loop']['index0'];
  2030.                 ++$context['loop']['index'];
  2031.                 $context['loop']['first'] = false;
  2032.                 if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  2033.                     --$context['loop']['revindex0'];
  2034.                     --$context['loop']['revindex'];
  2035.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  2036.                 }
  2037.             }
  2038.             $_parent $context['_parent'];
  2039.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent'], $context['loop']);
  2040.             $context array_intersect_key($context$_parent) + $_parent;
  2041.             // line 2118
  2042.             yield "\t\t\t\t</div>
  2043. \t\t\t</div>
  2044. \t\t</section>
  2045. \t";
  2046.         } else {
  2047.             // line 2122
  2048.             yield "\t\t<!-- Banner par défaut si pas de produits en vedette -->
  2049. \t\t<section class=\"banner-area-modern\">
  2050. \t\t\t<div class=\"banner-carousel-wrapper\">
  2051. \t\t\t\t<div class=\"container\">
  2052. \t\t\t\t\t<div class=\"row align-items-center justify-content-center\">
  2053. \t\t\t\t\t\t<div class=\"col-lg-8 text-center\">
  2054. \t\t\t\t\t\t\t<div class=\"banner-content-modern\" style=\"margin-top: 140px;\">
  2055. \t\t\t\t\t\t\t\t<h1 class=\"banner-title-modern\">Bienvenue sur MaketOu</h1>
  2056. \t\t\t\t\t\t\t\t<p class=\"banner-description-modern\">Votre marketplace haïtienne</p>
  2057. \t\t\t\t\t\t\t</div>
  2058. \t\t\t\t\t\t</div>
  2059. \t\t\t\t\t</div>
  2060. \t\t\t\t</div>
  2061. \t\t\t</div>
  2062. \t\t</section>
  2063. \t";
  2064.         }
  2065.         // line 2138
  2066.         yield "\t<!-- End banner Area -->
  2067. \t<!-- Catégories de produits -->
  2068. \t";
  2069.         // line 2141
  2070.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["categories"] ?? null)) > 0)) {
  2071.             // line 2142
  2072.             yield "\t\t<section class=\"py-5\">
  2073. \t\t\t<div class=\"container\">
  2074. \t\t\t\t<div class=\"section-title\">
  2075. \t\t\t\t\t<h2>Nos catégories</h2>
  2076. \t\t\t\t\t<p>Explorez nos différentes catégories de produits</p>
  2077. \t\t\t\t</div>
  2078. \t\t\t\t<div class=\"row\" id=\"productCategoriesContainer\">
  2079. \t\t\t\t\t";
  2080.             // line 2149
  2081.             $context['_parent'] = $context;
  2082.             $context['_seq'] = CoreExtension::ensureTraversable(Twig\Extension\CoreExtension::slice($this->env->getCharset(), ($context["categories"] ?? null), 08));
  2083.             $context['loop'] = [
  2084.               'parent' => $context['_parent'],
  2085.               'index0' => 0,
  2086.               'index'  => 1,
  2087.               'first'  => true,
  2088.             ];
  2089.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  2090.                 $length count($context['_seq']);
  2091.                 $context['loop']['revindex0'] = $length 1;
  2092.                 $context['loop']['revindex'] = $length;
  2093.                 $context['loop']['length'] = $length;
  2094.                 $context['loop']['last'] = === $length;
  2095.             }
  2096.             foreach ($context['_seq'] as $context["_key"] => $context["category"]) {
  2097.                 // line 2150
  2098.                 yield "\t\t\t\t\t\t<div class=\"col-lg-3 col-md-4 col-sm-6 mb-4\">
  2099. \t\t\t\t\t\t\t<div class=\"category-card-custom\">
  2100. \t\t\t\t\t\t\t\t<div class=\"category-image-wrapper\">
  2101. \t\t\t\t\t\t\t\t\t<div class=\"category-image\" style=\"background-image: url('";
  2102.                 // line 2153
  2103.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["category"], "bannerImage", [], "any"falsefalsefalse2153)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2104.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(("uploads/categories/banner/" CoreExtension::getAttribute($this->env$this->source$context["category"], "bannerImage", [], "any"falsefalsefalse2153))), "html"nulltrue);
  2105.                 } else {
  2106.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((("ui/img/category/cat-" CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse2153)) . ".jpg")), "html"nulltrue);
  2107.                 }
  2108.                 yield "')\">
  2109. \t\t\t\t\t\t\t\t\t\t<div class=\"category-overlay-custom\">
  2110. \t\t\t\t\t\t\t\t\t\t\t<div class=\"category-icon-wrapper\">
  2111. \t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-tag\" style=\"font-size: 3rem;\"></i>
  2112. \t\t\t\t\t\t\t\t\t\t\t\t<h4 class=\"mt-3\">";
  2113.                 // line 2157
  2114.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["category"], "name", [], "any"falsefalsefalse2157), "html"nulltrue);
  2115.                 yield "</h4>
  2116. \t\t\t\t\t\t\t\t\t\t\t</div>
  2117. \t\t\t\t\t\t\t\t\t\t</div>
  2118. \t\t\t\t\t\t\t\t\t</div>
  2119. \t\t\t\t\t\t\t\t</div>
  2120. \t\t\t\t\t\t\t\t<div class=\"category-content p-3\">
  2121. \t\t\t\t\t\t\t\t\t<h5 class=\"mb-2\">";
  2122.                 // line 2163
  2123.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["category"], "name", [], "any"falsefalsefalse2163), "html"nulltrue);
  2124.                 yield "</h5>
  2125. \t\t\t\t\t\t\t\t\t";
  2126.                 // line 2164
  2127.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["category"], "description", [], "any"falsefalsefalse2164)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2128.                     // line 2165
  2129.                     yield "\t\t\t\t\t\t\t\t\t\t<p class=\"text-muted mb-3 small\">";
  2130.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["category"], "description", [], "any"falsefalsefalse2165)), 060), "html"nulltrue);
  2131.                     yield "
  2132. \t\t\t\t\t\t\t\t\t\t\t";
  2133.                     // line 2166
  2134.                     if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["category"], "description", [], "any"falsefalsefalse2166))) > 60)) {
  2135.                         yield "...
  2136. \t\t\t\t\t\t\t\t\t\t\t";
  2137.                     }
  2138.                     // line 2168
  2139.                     yield "\t\t\t\t\t\t\t\t\t\t</p>
  2140. \t\t\t\t\t\t\t\t\t";
  2141.                 }
  2142.                 // line 2170
  2143.                 yield "\t\t\t\t\t\t\t\t\t<a href=\"";
  2144.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing", ["category" => CoreExtension::getAttribute($this->env$this->source$context["category"], "slug", [], "any"falsefalsefalse2170)]), "html"nulltrue);
  2145.                 yield "\" class=\"btn btn-primary-custom btn-sm w-100\">
  2146. \t\t\t\t\t\t\t\t\t\tVoir les produits
  2147. \t\t\t\t\t\t\t\t\t</a>
  2148. \t\t\t\t\t\t\t\t</div>
  2149. \t\t\t\t\t\t\t</div>
  2150. \t\t\t\t\t\t</div>
  2151. \t\t\t\t\t";
  2152.                 ++$context['loop']['index0'];
  2153.                 ++$context['loop']['index'];
  2154.                 $context['loop']['first'] = false;
  2155.                 if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  2156.                     --$context['loop']['revindex0'];
  2157.                     --$context['loop']['revindex'];
  2158.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  2159.                 }
  2160.             }
  2161.             $_parent $context['_parent'];
  2162.             unset($context['_seq'], $context['_key'], $context['category'], $context['_parent'], $context['loop']);
  2163.             $context array_intersect_key($context$_parent) + $_parent;
  2164.             // line 2177
  2165.             yield "\t\t\t\t</div>
  2166. \t\t\t</div>
  2167. \t\t</section>
  2168. \t";
  2169.         }
  2170.         // line 2181
  2171.         yield "
  2172. \t<!-- Catégories de boutiques -->
  2173. \t";
  2174.         // line 2183
  2175.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["shopCategories"] ?? null)) > 0)) {
  2176.             // line 2184
  2177.             yield "\t\t<section class=\"py-5 bg-light\">
  2178. \t\t\t<div class=\"container\">
  2179. \t\t\t\t<div class=\"section-title\">
  2180. \t\t\t\t\t<h2>Nos catégories de boutiques</h2>
  2181. \t\t\t\t\t<p>Explorez les différentes catégories de boutiques disponibles sur MaketOu</p>
  2182. \t\t\t\t</div>
  2183. \t\t\t\t<div class=\"row\" id=\"shopCategoriesContainer\">
  2184. \t\t\t\t\t";
  2185.             // line 2191
  2186.             $context['_parent'] = $context;
  2187.             $context['_seq'] = CoreExtension::ensureTraversable(Twig\Extension\CoreExtension::slice($this->env->getCharset(), ($context["shopCategories"] ?? null), 06));
  2188.             $context['loop'] = [
  2189.               'parent' => $context['_parent'],
  2190.               'index0' => 0,
  2191.               'index'  => 1,
  2192.               'first'  => true,
  2193.             ];
  2194.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  2195.                 $length count($context['_seq']);
  2196.                 $context['loop']['revindex0'] = $length 1;
  2197.                 $context['loop']['revindex'] = $length;
  2198.                 $context['loop']['length'] = $length;
  2199.                 $context['loop']['last'] = === $length;
  2200.             }
  2201.             foreach ($context['_seq'] as $context["_key"] => $context["shopCategory"]) {
  2202.                 // line 2192
  2203.                 yield "\t\t\t\t\t\t<div class=\"col-lg-4 col-md-6 mb-4\">
  2204. \t\t\t\t\t\t\t<a href=\"";
  2205.                 // line 2193
  2206.                 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shops_list");
  2207.                 yield "?category=";
  2208.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "slug", [], "any"falsefalsefalse2193), "html"nulltrue);
  2209.                 yield "\" class=\"text-decoration-none\" style=\"display: block;\">
  2210. \t\t\t\t\t\t\t\t<div class=\"category-card-custom shop-category-clickable\">
  2211. \t\t\t\t\t\t\t\t\t<div class=\"category-image-wrapper\">
  2212. \t\t\t\t\t\t\t\t\t\t<div class=\"category-image\" style=\"background-image: url('";
  2213.                 // line 2196
  2214.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "bannerImage", [], "any"falsefalsefalse2196)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2215.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "bannerImage", [], "any"falsefalsefalse2196)), "html"nulltrue);
  2216.                 } else {
  2217.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((("ui/img/category/shop-" CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse2196)) . ".jpg")), "html"nulltrue);
  2218.                 }
  2219.                 yield "')\">
  2220. \t\t\t\t\t\t\t\t\t\t\t<div class=\"category-overlay-custom\">
  2221. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"category-icon-wrapper\">
  2222. \t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\" style=\"font-size: 3rem;\"></i>
  2223. \t\t\t\t\t\t\t\t\t\t\t\t\t<h4 class=\"mt-3\">";
  2224.                 // line 2200
  2225.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "name", [], "any"falsefalsefalse2200), "html"nulltrue);
  2226.                 yield "</h4>
  2227. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2228.                 // line 2201
  2229.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse2201)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2230.                     // line 2202
  2231.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"mt-2 px-3\">";
  2232.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse2202)), 0100), "html"nulltrue);
  2233.                     yield "
  2234. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2235.                     // line 2203
  2236.                     if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse2203))) > 100)) {
  2237.                         yield "...
  2238. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2239.                     }
  2240.                     // line 2205
  2241.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>
  2242. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2243.                 }
  2244.                 // line 2207
  2245.                 yield "\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2246. \t\t\t\t\t\t\t\t\t\t\t</div>
  2247. \t\t\t\t\t\t\t\t\t\t</div>
  2248. \t\t\t\t\t\t\t\t\t</div>
  2249. \t\t\t\t\t\t\t\t\t<div class=\"category-content p-3\">
  2250. \t\t\t\t\t\t\t\t\t\t<h5 class=\"mb-2\">";
  2251.                 // line 2212
  2252.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "name", [], "any"falsefalsefalse2212), "html"nulltrue);
  2253.                 yield "</h5>
  2254. \t\t\t\t\t\t\t\t\t\t";
  2255.                 // line 2213
  2256.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse2213)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2257.                     // line 2214
  2258.                     yield "\t\t\t\t\t\t\t\t\t\t\t<p class=\"text-muted mb-3 small\">";
  2259.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse2214)), 080), "html"nulltrue);
  2260.                     yield "
  2261. \t\t\t\t\t\t\t\t\t\t\t\t";
  2262.                     // line 2215
  2263.                     if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse2215))) > 80)) {
  2264.                         yield "...
  2265. \t\t\t\t\t\t\t\t\t\t\t\t";
  2266.                     }
  2267.                     // line 2217
  2268.                     yield "\t\t\t\t\t\t\t\t\t\t\t</p>
  2269. \t\t\t\t\t\t\t\t\t\t";
  2270.                 }
  2271.                 // line 2219
  2272.                 yield "\t\t\t\t\t\t\t\t\t\t<span class=\"btn btn-primary-custom btn-sm w-100\">
  2273. \t\t\t\t\t\t\t\t\t\t\tVoir les boutiques
  2274. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-arrow-right ms-2\"></i>
  2275. \t\t\t\t\t\t\t\t\t\t</span>
  2276. \t\t\t\t\t\t\t\t\t</div>
  2277. \t\t\t\t\t\t\t\t</div>
  2278. \t\t\t\t\t\t\t</a>
  2279. \t\t\t\t\t\t</div>
  2280. \t\t\t\t\t";
  2281.                 ++$context['loop']['index0'];
  2282.                 ++$context['loop']['index'];
  2283.                 $context['loop']['first'] = false;
  2284.                 if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  2285.                     --$context['loop']['revindex0'];
  2286.                     --$context['loop']['revindex'];
  2287.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  2288.                 }
  2289.             }
  2290.             $_parent $context['_parent'];
  2291.             unset($context['_seq'], $context['_key'], $context['shopCategory'], $context['_parent'], $context['loop']);
  2292.             $context array_intersect_key($context$_parent) + $_parent;
  2293.             // line 2228
  2294.             yield "\t\t\t\t</div>
  2295. \t\t\t\t";
  2296.             // line 2229
  2297.             if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["shopCategories"] ?? null)) > 6)) {
  2298.                 // line 2230
  2299.                 yield "\t\t\t\t\t<div class=\"text-center mt-4\">
  2300. \t\t\t\t\t\t<button class=\"btn btn-outline-primary btn-lg\" onclick=\"showAllShopCategories()\">
  2301. \t\t\t\t\t\t\t<i class=\"lnr lnr-store me-2\"></i>
  2302. \t\t\t\t\t\t\tVoir toutes les catégories de boutiques (";
  2303.                 // line 2233
  2304.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["shopCategories"] ?? null)), "html"nulltrue);
  2305.                 yield ")
  2306. \t\t\t\t\t\t</button>
  2307. \t\t\t\t\t</div>
  2308. \t\t\t\t";
  2309.             }
  2310.             // line 2237
  2311.             yield "\t\t\t</div>
  2312. \t\t</section>
  2313. \t";
  2314.         }
  2315.         // line 2240
  2316.         yield "
  2317. \t<!-- Produits en vedette -->
  2318. \t";
  2319.         // line 2242
  2320.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["featuredProducts"] ?? null)) > 0)) {
  2321.             // line 2243
  2322.             yield "\t\t<section class=\"py-5\">
  2323. \t\t\t<div class=\"container\">
  2324. \t\t\t\t<div class=\"section-title text-center mb-5\">
  2325. \t\t\t\t\t<h2>Produits en vedette</h2>
  2326. \t\t\t\t\t<p>Découvrez nos produits les plus populaires et les mieux notés</p>
  2327. \t\t\t\t</div>
  2328. \t\t\t\t<div class=\"featured-gallery-wrapper\">
  2329. \t\t\t\t\t<div class=\"featured-gallery-container\">
  2330. \t\t\t\t\t\t<div class=\"featured-gallery-grid\" id=\"featuredGalleryGrid\">
  2331. \t\t\t\t\t\t\t";
  2332.             // line 2253
  2333.             $context['_parent'] = $context;
  2334.             $context['_seq'] = CoreExtension::ensureTraversable(($context["featuredProducts"] ?? null));
  2335.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  2336.                 // line 2254
  2337.                 yield "\t\t\t\t\t\t\t\t<div class=\"featured-gallery-item\">
  2338. \t\t\t\t\t\t\t\t\t<div class=\"single-product\">
  2339. \t\t\t\t\t\t\t\t\t\t<div class=\"product-image-container\" onmouseenter=\"showImageNav(";
  2340.                 // line 2256
  2341.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2256), "html"nulltrue);
  2342.                 yield ")\" onmouseleave=\"hideImageNav(";
  2343.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2256), "html"nulltrue);
  2344.                 yield ")\">
  2345. \t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2346.                 // line 2257
  2347.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2257)]), "html"nulltrue);
  2348.                 yield "\">
  2349. \t\t\t\t\t\t\t\t\t\t\t\t";
  2350.                 // line 2258
  2351.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2258) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2258)) > 0))) {
  2352.                     // line 2259
  2353.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img 
  2354. \t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"img-fluid main-product-img\" 
  2355. \t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"main-img-";
  2356.                     // line 2261
  2357.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2261), "html"nulltrue);
  2358.                     yield "\" 
  2359. \t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc=\"";
  2360.                     // line 2262
  2361.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((($_v2 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2262)) && is_array($_v2) || $_v2 instanceof ArrayAccess ? ($_v2[0] ?? null) : null)), "html"nulltrue);
  2362.                     yield "\" 
  2363. \t\t\t\t\t\t\t\t\t\t\t\t\t\talt=\"";
  2364.                     // line 2263
  2365.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2263), "html"nulltrue);
  2366.                     yield "\"
  2367. \t\t\t\t\t\t\t\t\t\t\t\t\t\tonerror=\"this.onerror=null;this.src='";
  2368.                     // line 2264
  2369.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/img/product/p1.jpg"), "html"nulltrue);
  2370.                     yield "';\"
  2371. \t\t\t\t\t\t\t\t\t\t\t\t\t>
  2372. \t\t\t\t\t\t\t\t\t\t\t\t";
  2373.                 } else {
  2374.                     // line 2267
  2375.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" id=\"main-img-";
  2376.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2267), "html"nulltrue);
  2377.                     yield "\" src=\"";
  2378.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/img/product/p1.jpg"), "html"nulltrue);
  2379.                     yield "\" alt=\"";
  2380.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2267), "html"nulltrue);
  2381.                     yield "\">
  2382. \t\t\t\t\t\t\t\t\t\t\t\t";
  2383.                 }
  2384.                 // line 2269
  2385.                 yield "\t\t\t\t\t\t\t\t\t\t\t</a>
  2386. \t\t\t\t\t\t\t\t\t\t\t<!-- Boutons de navigation (visibles au survol) -->
  2387. \t\t\t\t\t\t\t\t\t\t\t";
  2388.                 // line 2272
  2389.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2272) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2272)) > 1))) {
  2390.                     // line 2273
  2391.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-left\" id=\"img-left-";
  2392.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2273), "html"nulltrue);
  2393.                     yield "\" onclick=\"prevImage(";
  2394.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2273), "html"nulltrue);
  2395.                     yield ")\" style=\"display: none;\">
  2396. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-left\"></span>
  2397. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  2398. \t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-right\" id=\"img-right-";
  2399.                     // line 2276
  2400.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2276), "html"nulltrue);
  2401.                     yield "\" onclick=\"nextImage(";
  2402.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2276), "html"nulltrue);
  2403.                     yield ")\" style=\"display: none;\">
  2404. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-right\"></span>
  2405. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  2406. \t\t\t\t\t\t\t\t\t\t\t\t<!-- Indicateurs de position -->
  2407. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"img-indicators\" id=\"img-indicators-";
  2408.                     // line 2281
  2409.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2281), "html"nulltrue);
  2410.                     yield "\" style=\"display: none;\">
  2411. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2412.                     // line 2282
  2413.                     $context['_parent'] = $context;
  2414.                     $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2282));
  2415.                     $context['loop'] = [
  2416.                       'parent' => $context['_parent'],
  2417.                       'index0' => 0,
  2418.                       'index'  => 1,
  2419.                       'first'  => true,
  2420.                     ];
  2421.                     if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  2422.                         $length count($context['_seq']);
  2423.                         $context['loop']['revindex0'] = $length 1;
  2424.                         $context['loop']['revindex'] = $length;
  2425.                         $context['loop']['length'] = $length;
  2426.                         $context['loop']['last'] = === $length;
  2427.                     }
  2428.                     foreach ($context['_seq'] as $context["_key"] => $context["img"]) {
  2429.                         // line 2283
  2430.                         yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"indicator\" id=\"indicator-";
  2431.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2283), "html"nulltrue);
  2432.                         yield "-";
  2433.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index0", [], "any"falsefalsefalse2283), "html"nulltrue);
  2434.                         yield "\" onclick=\"showImage(";
  2435.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2283), "html"nulltrue);
  2436.                         yield ", ";
  2437.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index0", [], "any"falsefalsefalse2283), "html"nulltrue);
  2438.                         yield ")\"></span>
  2439. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2440.                         ++$context['loop']['index0'];
  2441.                         ++$context['loop']['index'];
  2442.                         $context['loop']['first'] = false;
  2443.                         if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  2444.                             --$context['loop']['revindex0'];
  2445.                             --$context['loop']['revindex'];
  2446.                             $context['loop']['last'] = === $context['loop']['revindex0'];
  2447.                         }
  2448.                     }
  2449.                     $_parent $context['_parent'];
  2450.                     unset($context['_seq'], $context['_key'], $context['img'], $context['_parent'], $context['loop']);
  2451.                     $context array_intersect_key($context$_parent) + $_parent;
  2452.                     // line 2285
  2453.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2454. \t\t\t\t\t\t\t\t\t\t\t";
  2455.                 }
  2456.                 // line 2287
  2457.                 yield "\t\t\t\t\t\t\t\t\t\t</div>
  2458. \t\t\t\t\t\t\t\t\t\t<div class=\"product-details\">
  2459. \t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2460.                 // line 2290
  2461.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2290)]), "html"nulltrue);
  2462.                 yield "\">
  2463. \t\t\t\t\t\t\t\t\t\t\t\t<h6>";
  2464.                 // line 2291
  2465.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2291), "html"nulltrue);
  2466.                 yield "</h6>
  2467. \t\t\t\t\t\t\t\t\t\t\t</a>
  2468. \t\t\t\t\t\t\t\t\t\t\t<!-- Affichage de la boutique -->
  2469. \t\t\t\t\t\t\t\t\t\t\t<div class=\"shop-info\">
  2470. \t\t\t\t\t\t\t\t\t\t\t\t<small class=\"text-muted\">
  2471. \t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  2472. \t\t\t\t\t\t\t\t\t\t\t\t\tVendu par :
  2473. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2474.                 // line 2299
  2475.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"truetruefalse2299) && CoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2299))) {
  2476.                     // line 2300
  2477.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2478.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shop_show", ["slug" => CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2300), "slug", [], "any"falsefalsefalse2300)]), "html"nulltrue);
  2479.                     yield "\" class=\"shop-link\">
  2480. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2481.                     // line 2301
  2482.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2301), "name", [], "any"falsefalsefalse2301), "html"nulltrue);
  2483.                     yield "
  2484. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  2485. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2486.                 } else {
  2487.                     // line 2304
  2488.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted\">Boutique inconnue</span>
  2489. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2490.                 }
  2491.                 // line 2306
  2492.                 yield "\t\t\t\t\t\t\t\t\t\t\t\t</small>
  2493. \t\t\t\t\t\t\t\t\t\t\t</div>
  2494. \t\t\t\t\t\t\t\t\t\t\t<div class=\"price\">
  2495. \t\t\t\t\t\t\t\t\t\t\t\t<h6>";
  2496.                 // line 2310
  2497.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "price", [], "any"falsefalsefalse2310), 2"."" "), "html"nulltrue);
  2498.                 yield "
  2499. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  2500. \t\t\t\t\t\t\t\t\t\t\t\t";
  2501.                 // line 2312
  2502.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["product"], "compareAtPrice", [], "any"falsefalsefalse2312)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2503.                     // line 2313
  2504.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"l-through\">";
  2505.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "compareAtPrice", [], "any"falsefalsefalse2313), 2"."" "), "html"nulltrue);
  2506.                     yield "
  2507. \t\t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  2508. \t\t\t\t\t\t\t\t\t\t\t\t";
  2509.                 }
  2510.                 // line 2316
  2511.                 yield "\t\t\t\t\t\t\t\t\t\t\t</div>
  2512. \t\t\t\t\t\t\t\t\t\t\t<div class=\"prd-bottom\">
  2513. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"social-info add-to-cart\" data-product-id=\"";
  2514.                 // line 2318
  2515.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2318), "html"nulltrue);
  2516.                 yield "\" data-qty=\"1\">
  2517. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
  2518. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">+ panier</p>
  2519. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2520. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info wishlist-btn\" data-product-id=\"";
  2521.                 // line 2322
  2522.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2322), "html"nulltrue);
  2523.                 yield "\" ";
  2524.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2322)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2525.                     yield " onclick=\"toggleWishlist(";
  2526.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2322), "html"nulltrue);
  2527.                     yield ", this); return false;\" ";
  2528.                 } else {
  2529.                     yield " onclick=\"alert('Vous devez être connecté pour ajouter aux favoris'); return false;\" ";
  2530.                 }
  2531.                 yield ">
  2532. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-heart\"></span>
  2533. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Favoris</p>
  2534. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2535. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info comparison-btn\" data-product-id=\"";
  2536.                 // line 2326
  2537.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2326), "html"nulltrue);
  2538.                 yield "\" ";
  2539.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2326)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2540.                     yield " onclick=\"toggleComparison(";
  2541.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2326), "html"nulltrue);
  2542.                     yield ", this); return false;\" ";
  2543.                 } else {
  2544.                     yield " onclick=\"alert('Vous devez être connecté pour comparer des produits'); return false;\" ";
  2545.                 }
  2546.                 yield ">
  2547. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-sync\"></span>
  2548. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Comparer</p>
  2549. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2550. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2551.                 // line 2330
  2552.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2330)]), "html"nulltrue);
  2553.                 yield "\" class=\"social-info\">
  2554. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-move\"></span>
  2555. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Voir plus</p>
  2556. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2557. \t\t\t\t\t\t\t\t\t\t\t</div>
  2558. \t\t\t\t\t\t\t\t\t\t</div>
  2559. \t\t\t\t\t\t\t\t\t</div>
  2560. \t\t\t\t\t\t\t\t</div>
  2561. \t\t\t\t\t\t\t";
  2562.             }
  2563.             $_parent $context['_parent'];
  2564.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  2565.             $context array_intersect_key($context$_parent) + $_parent;
  2566.             // line 2339
  2567.             yield "\t\t\t\t\t\t</div>
  2568. \t\t\t\t\t</div>
  2569. \t\t\t\t\t<!-- Contrôles de navigation -->
  2570. \t\t\t\t\t<div class=\"featured-gallery-controls\">
  2571. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-prev\" id=\"featuredGalleryPrev\" aria-label=\"Précédent\">
  2572. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-left\"></i>
  2573. \t\t\t\t\t\t</button>
  2574. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-next\" id=\"featuredGalleryNext\" aria-label=\"Suivant\">
  2575. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-right\"></i>
  2576. \t\t\t\t\t\t</button>
  2577. \t\t\t\t\t</div>
  2578. \t\t\t\t\t<!-- Bouton charger plus -->
  2579. \t\t\t\t\t<div class=\"featured-gallery-load-more text-center mt-4\" id=\"featuredGalleryLoadMore\" style=\"display: none;\">
  2580. \t\t\t\t\t\t<button class=\"btn btn-outline-primary\" id=\"loadMoreFeaturedBtn\">
  2581. \t\t\t\t\t\t\t<i class=\"lnr lnr-plus-circle me-2\"></i>
  2582. \t\t\t\t\t\t\tCharger plus de produits
  2583. \t\t\t\t\t\t</button>
  2584. \t\t\t\t\t</div>
  2585. \t\t\t\t</div>
  2586. \t\t\t\t<div class=\"text-center mt-5\">
  2587. \t\t\t\t\t<a href=\"";
  2588.             // line 2362
  2589.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
  2590.             yield "\" class=\"btn-view-all-products\">
  2591. \t\t\t\t\t\t<span>Voir tous les produits</span>
  2592. \t\t\t\t\t\t<i class=\"lnr lnr-arrow-right\"></i>
  2593. \t\t\t\t\t</a>
  2594. \t\t\t\t</div>
  2595. \t\t\t</div>
  2596. \t\t</section>
  2597. \t";
  2598.         }
  2599.         // line 2370
  2600.         yield "
  2601. \t<!-- Nouveautés -->
  2602. \t";
  2603.         // line 2372
  2604.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["latestProducts"] ?? null)) > 0)) {
  2605.             // line 2373
  2606.             yield "\t\t<section class=\"py-5 bg-light\">
  2607. \t\t\t<div class=\"container\">
  2608. \t\t\t\t<div class=\"section-title text-center mb-5\">
  2609. \t\t\t\t\t<h2>Nouveautés</h2>
  2610. \t\t\t\t\t<p>Les derniers produits ajoutés sur MaketOu</p>
  2611. \t\t\t\t</div>
  2612. \t\t\t\t<div class=\"featured-gallery-wrapper\">
  2613. \t\t\t\t\t<div class=\"featured-gallery-container\">
  2614. \t\t\t\t\t\t<div class=\"featured-gallery-grid\" id=\"latestGalleryGrid\">
  2615. \t\t\t\t\t\t\t";
  2616.             // line 2383
  2617.             $context['_parent'] = $context;
  2618.             $context['_seq'] = CoreExtension::ensureTraversable(($context["latestProducts"] ?? null));
  2619.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  2620.                 // line 2384
  2621.                 yield "\t\t\t\t\t\t\t\t<div class=\"featured-gallery-item\">
  2622. \t\t\t\t\t\t\t\t\t<div class=\"single-product\">
  2623. \t\t\t\t\t\t\t\t\t\t<div class=\"product-image-container\" onmouseenter=\"showImageNav(";
  2624.                 // line 2386
  2625.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2386), "html"nulltrue);
  2626.                 yield ")\" onmouseleave=\"hideImageNav(";
  2627.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2386), "html"nulltrue);
  2628.                 yield ")\">
  2629. \t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2630.                 // line 2387
  2631.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2387)]), "html"nulltrue);
  2632.                 yield "\">
  2633. \t\t\t\t\t\t\t\t\t\t\t\t";
  2634.                 // line 2388
  2635.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2388) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2388)) > 0))) {
  2636.                     // line 2389
  2637.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" id=\"main-img-";
  2638.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2389), "html"nulltrue);
  2639.                     yield "\" src=\"";
  2640.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((($_v3 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2389)) && is_array($_v3) || $_v3 instanceof ArrayAccess ? ($_v3[0] ?? null) : null)), "html"nulltrue);
  2641.                     yield "\" alt=\"";
  2642.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2389), "html"nulltrue);
  2643.                     yield "\">
  2644. \t\t\t\t\t\t\t\t\t\t\t\t";
  2645.                 } else {
  2646.                     // line 2391
  2647.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" id=\"main-img-";
  2648.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2391), "html"nulltrue);
  2649.                     yield "\" src=\"";
  2650.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/img/product/p1.jpg"), "html"nulltrue);
  2651.                     yield "\" alt=\"";
  2652.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2391), "html"nulltrue);
  2653.                     yield "\">
  2654. \t\t\t\t\t\t\t\t\t\t\t\t";
  2655.                 }
  2656.                 // line 2393
  2657.                 yield "\t\t\t\t\t\t\t\t\t\t\t</a>
  2658. \t\t\t\t\t\t\t\t\t\t\t<!-- Boutons de navigation (visibles au survol) -->
  2659. \t\t\t\t\t\t\t\t\t\t\t";
  2660.                 // line 2396
  2661.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2396) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2396)) > 1))) {
  2662.                     // line 2397
  2663.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-left\" id=\"img-left-";
  2664.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2397), "html"nulltrue);
  2665.                     yield "\" onclick=\"prevImage(";
  2666.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2397), "html"nulltrue);
  2667.                     yield ")\" style=\"display: none;\">
  2668. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-left\"></span>
  2669. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  2670. \t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-right\" id=\"img-right-";
  2671.                     // line 2400
  2672.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2400), "html"nulltrue);
  2673.                     yield "\" onclick=\"nextImage(";
  2674.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2400), "html"nulltrue);
  2675.                     yield ")\" style=\"display: none;\">
  2676. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-right\"></span>
  2677. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  2678. \t\t\t\t\t\t\t\t\t\t\t\t<!-- Indicateurs de position -->
  2679. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"img-indicators\" id=\"img-indicators-";
  2680.                     // line 2405
  2681.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2405), "html"nulltrue);
  2682.                     yield "\" style=\"display: none;\">
  2683. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2684.                     // line 2406
  2685.                     $context['_parent'] = $context;
  2686.                     $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2406));
  2687.                     $context['loop'] = [
  2688.                       'parent' => $context['_parent'],
  2689.                       'index0' => 0,
  2690.                       'index'  => 1,
  2691.                       'first'  => true,
  2692.                     ];
  2693.                     if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  2694.                         $length count($context['_seq']);
  2695.                         $context['loop']['revindex0'] = $length 1;
  2696.                         $context['loop']['revindex'] = $length;
  2697.                         $context['loop']['length'] = $length;
  2698.                         $context['loop']['last'] = === $length;
  2699.                     }
  2700.                     foreach ($context['_seq'] as $context["_key"] => $context["img"]) {
  2701.                         // line 2407
  2702.                         yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"indicator\" id=\"indicator-";
  2703.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2407), "html"nulltrue);
  2704.                         yield "-";
  2705.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index0", [], "any"falsefalsefalse2407), "html"nulltrue);
  2706.                         yield "\" onclick=\"showImage(";
  2707.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2407), "html"nulltrue);
  2708.                         yield ", ";
  2709.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index0", [], "any"falsefalsefalse2407), "html"nulltrue);
  2710.                         yield ")\"></span>
  2711. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2712.                         ++$context['loop']['index0'];
  2713.                         ++$context['loop']['index'];
  2714.                         $context['loop']['first'] = false;
  2715.                         if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  2716.                             --$context['loop']['revindex0'];
  2717.                             --$context['loop']['revindex'];
  2718.                             $context['loop']['last'] = === $context['loop']['revindex0'];
  2719.                         }
  2720.                     }
  2721.                     $_parent $context['_parent'];
  2722.                     unset($context['_seq'], $context['_key'], $context['img'], $context['_parent'], $context['loop']);
  2723.                     $context array_intersect_key($context$_parent) + $_parent;
  2724.                     // line 2409
  2725.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t</div>
  2726. \t\t\t\t\t\t\t\t\t\t\t";
  2727.                 }
  2728.                 // line 2411
  2729.                 yield "\t\t\t\t\t\t\t\t\t\t</div>
  2730. \t\t\t\t\t\t\t\t\t\t<div class=\"product-details\">
  2731. \t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2732.                 // line 2414
  2733.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2414)]), "html"nulltrue);
  2734.                 yield "\">
  2735. \t\t\t\t\t\t\t\t\t\t\t\t<h6>";
  2736.                 // line 2415
  2737.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2415), "html"nulltrue);
  2738.                 yield "</h6>
  2739. \t\t\t\t\t\t\t\t\t\t\t</a>
  2740. \t\t\t\t\t\t\t\t\t\t\t<!-- Affichage de la boutique -->
  2741. \t\t\t\t\t\t\t\t\t\t\t<div class=\"shop-info\">
  2742. \t\t\t\t\t\t\t\t\t\t\t\t<small class=\"text-muted\">
  2743. \t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  2744. \t\t\t\t\t\t\t\t\t\t\t\t\tVendu par :
  2745. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2746.                 // line 2423
  2747.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"truetruefalse2423) && CoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2423))) {
  2748.                     // line 2424
  2749.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2750.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shop_show", ["slug" => CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2424), "slug", [], "any"falsefalsefalse2424)]), "html"nulltrue);
  2751.                     yield "\" class=\"shop-link\">
  2752. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
  2753.                     // line 2425
  2754.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2425), "name", [], "any"falsefalsefalse2425), "html"nulltrue);
  2755.                     yield "
  2756. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  2757. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2758.                 } else {
  2759.                     // line 2428
  2760.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted\">Boutique inconnue</span>
  2761. \t\t\t\t\t\t\t\t\t\t\t\t\t";
  2762.                 }
  2763.                 // line 2430
  2764.                 yield "\t\t\t\t\t\t\t\t\t\t\t\t</small>
  2765. \t\t\t\t\t\t\t\t\t\t\t</div>
  2766. \t\t\t\t\t\t\t\t\t\t\t<div class=\"price\">
  2767. \t\t\t\t\t\t\t\t\t\t\t\t<h6>";
  2768.                 // line 2434
  2769.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "price", [], "any"falsefalsefalse2434), 2"."" "), "html"nulltrue);
  2770.                 yield "
  2771. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  2772. \t\t\t\t\t\t\t\t\t\t\t\t";
  2773.                 // line 2436
  2774.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["product"], "compareAtPrice", [], "any"falsefalsefalse2436)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2775.                     // line 2437
  2776.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"l-through\">";
  2777.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "compareAtPrice", [], "any"falsefalsefalse2437), 2"."" "), "html"nulltrue);
  2778.                     yield "
  2779. \t\t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  2780. \t\t\t\t\t\t\t\t\t\t\t\t";
  2781.                 }
  2782.                 // line 2440
  2783.                 yield "\t\t\t\t\t\t\t\t\t\t\t</div>
  2784. \t\t\t\t\t\t\t\t\t\t\t<div class=\"prd-bottom\">
  2785. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"social-info add-to-cart\" data-product-id=\"";
  2786.                 // line 2442
  2787.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2442), "html"nulltrue);
  2788.                 yield "\" data-qty=\"1\">
  2789. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
  2790. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">+ panier</p>
  2791. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2792. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info wishlist-btn\" data-product-id=\"";
  2793.                 // line 2446
  2794.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2446), "html"nulltrue);
  2795.                 yield "\" ";
  2796.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2446)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2797.                     yield " onclick=\"toggleWishlist(";
  2798.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2446), "html"nulltrue);
  2799.                     yield ", this); return false;\" ";
  2800.                 } else {
  2801.                     yield " onclick=\"alert('Vous devez être connecté pour ajouter aux favoris'); return false;\" ";
  2802.                 }
  2803.                 yield ">
  2804. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-heart\"></span>
  2805. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Favoris</p>
  2806. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2807. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info comparison-btn\" data-product-id=\"";
  2808.                 // line 2450
  2809.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2450), "html"nulltrue);
  2810.                 yield "\" ";
  2811.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse2450)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2812.                     yield " onclick=\"toggleComparison(";
  2813.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2450), "html"nulltrue);
  2814.                     yield ", this); return false;\" ";
  2815.                 } else {
  2816.                     yield " onclick=\"alert('Vous devez être connecté pour comparer des produits'); return false;\" ";
  2817.                 }
  2818.                 yield ">
  2819. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-sync\"></span>
  2820. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Comparer</p>
  2821. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2822. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2823.                 // line 2454
  2824.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2454)]), "html"nulltrue);
  2825.                 yield "\" class=\"social-info\">
  2826. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-move\"></span>
  2827. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Voir plus</p>
  2828. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  2829. \t\t\t\t\t\t\t\t\t\t\t</div>
  2830. \t\t\t\t\t\t\t\t\t\t</div>
  2831. \t\t\t\t\t\t\t\t\t</div>
  2832. \t\t\t\t\t\t\t\t</div>
  2833. \t\t\t\t\t\t\t";
  2834.             }
  2835.             $_parent $context['_parent'];
  2836.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  2837.             $context array_intersect_key($context$_parent) + $_parent;
  2838.             // line 2463
  2839.             yield "\t\t\t\t\t\t</div>
  2840. \t\t\t\t\t</div>
  2841. \t\t\t\t\t<!-- Contrôles de navigation -->
  2842. \t\t\t\t\t<div class=\"featured-gallery-controls\">
  2843. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-prev\" id=\"latestGalleryPrev\" aria-label=\"Précédent\">
  2844. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-left\"></i>
  2845. \t\t\t\t\t\t</button>
  2846. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-next\" id=\"latestGalleryNext\" aria-label=\"Suivant\">
  2847. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-right\"></i>
  2848. \t\t\t\t\t\t</button>
  2849. \t\t\t\t\t</div>
  2850. \t\t\t\t\t<!-- Bouton charger plus -->
  2851. \t\t\t\t\t<div class=\"featured-gallery-load-more text-center mt-4\" id=\"latestGalleryLoadMore\" style=\"display: none;\">
  2852. \t\t\t\t\t\t<button class=\"btn btn-outline-primary\" id=\"loadMoreLatestBtn\">
  2853. \t\t\t\t\t\t\t<i class=\"lnr lnr-plus-circle me-2\"></i>
  2854. \t\t\t\t\t\t\tCharger plus de produits
  2855. \t\t\t\t\t\t</button>
  2856. \t\t\t\t\t</div>
  2857. \t\t\t\t</div>
  2858. \t\t\t\t<div class=\"text-center mt-5\">
  2859. \t\t\t\t\t<a href=\"";
  2860.             // line 2486
  2861.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
  2862.             yield "\" class=\"btn-view-all-products\">
  2863. \t\t\t\t\t\t<span>Voir tous les produits</span>
  2864. \t\t\t\t\t\t<i class=\"lnr lnr-arrow-right\"></i>
  2865. \t\t\t\t\t</a>
  2866. \t\t\t\t</div>
  2867. \t\t\t</div>
  2868. \t\t</section>
  2869. \t";
  2870.         }
  2871.         // line 2494
  2872.         yield "
  2873. \t";
  2874.         // line 2495
  2875.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["recommendedProducts"] ?? null)) > 0)) {
  2876.             // line 2496
  2877.             yield "\t\t<section class=\"py-5\">
  2878. \t\t\t<div class=\"container\">
  2879. \t\t\t\t<div class=\"section-title text-center mb-5\">
  2880. \t\t\t\t\t<h2>Recommandés pour vous</h2>
  2881. \t\t\t\t\t<p>Suggestions basées sur votre activité récente et les tendances de MaketOu</p>
  2882. \t\t\t\t</div>
  2883. \t\t\t\t<div class=\"row g-4\">
  2884. \t\t\t\t\t";
  2885.             // line 2503
  2886.             $context['_parent'] = $context;
  2887.             $context['_seq'] = CoreExtension::ensureTraversable(($context["recommendedProducts"] ?? null));
  2888.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  2889.                 // line 2504
  2890.                 yield "\t\t\t\t\t\t<div class=\"col-12 col-sm-6 col-lg-3\">
  2891. \t\t\t\t\t\t\t<div class=\"product-card h-100\">
  2892. \t\t\t\t\t\t\t\t";
  2893.                 // line 2506
  2894.                 $context["productImage"] = (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsetruefalse2506), 0, [], "array"truetruefalse2506) &&  !(null === (($_v4 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2506)) && is_array($_v4) || $_v4 instanceof ArrayAccess ? ($_v4[0] ?? null) : null)))) ? ((($_v5 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2506)) && is_array($_v5) || $_v5 instanceof ArrayAccess ? ($_v5[0] ?? null) : null)) : ("ui/img/product/p1.jpg"));
  2895.                 // line 2507
  2896.                 yield "\t\t\t\t\t\t\t\t<div class=\"product-image\" style=\"background-image:url('";
  2897.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(($context["productImage"] ?? null)), "html"nulltrue);
  2898.                 yield "');\">
  2899. \t\t\t\t\t\t\t\t\t";
  2900.                 // line 2508
  2901.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["product"], "isFeatured", [], "any"falsefalsefalse2508)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2902.                     // line 2509
  2903.                     yield "\t\t\t\t\t\t\t\t\t\t<span class=\"product-badge bg-success\">Populaire</span>
  2904. \t\t\t\t\t\t\t\t\t";
  2905.                 }
  2906.                 // line 2511
  2907.                 yield "\t\t\t\t\t\t\t\t</div>
  2908. \t\t\t\t\t\t\t\t<div class=\"p-3\">
  2909. \t\t\t\t\t\t\t\t\t<h6 class=\"mb-2\">
  2910. \t\t\t\t\t\t\t\t\t\t<a href=\"";
  2911.                 // line 2514
  2912.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2514)]), "html"nulltrue);
  2913.                 yield "\">";
  2914.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2514), "html"nulltrue);
  2915.                 yield "</a>
  2916. \t\t\t\t\t\t\t\t\t</h6>
  2917. \t\t\t\t\t\t\t\t\t<p class=\"mb-2 text-muted small\">
  2918. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  2919. \t\t\t\t\t\t\t\t\t\t";
  2920.                 // line 2518
  2921.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2518)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  2922.                     // line 2519
  2923.                     yield "\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2924.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shop_show", ["slug" => CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2519), "slug", [], "any"falsefalsefalse2519)]), "html"nulltrue);
  2925.                     yield "\">";
  2926.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["product"], "shop", [], "any"falsefalsefalse2519), "name", [], "any"falsefalsefalse2519), "html"nulltrue);
  2927.                     yield "</a>
  2928. \t\t\t\t\t\t\t\t\t\t";
  2929.                 } else {
  2930.                     // line 2521
  2931.                     yield "\t\t\t\t\t\t\t\t\t\t\tBoutique non spécifiée
  2932. \t\t\t\t\t\t\t\t\t\t";
  2933.                 }
  2934.                 // line 2523
  2935.                 yield "\t\t\t\t\t\t\t\t\t</p>
  2936. \t\t\t\t\t\t\t\t\t<div class=\"d-flex align-items-center justify-content-between\">
  2937. \t\t\t\t\t\t\t\t\t\t<span class=\"fw-bold text-primary\">";
  2938.                 // line 2525
  2939.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "price", [], "any"falsefalsefalse2525), 2"."" "), "html"nulltrue);
  2940.                 yield " HTG</span>
  2941. \t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"btn btn-sm btn-outline-primary add-to-cart\" data-product-id=\"";
  2942.                 // line 2526
  2943.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2526), "html"nulltrue);
  2944.                 yield "\" data-qty=\"1\">
  2945. \t\t\t\t\t\t\t\t\t\t\t<i class=\"ti ti-bag\"></i>
  2946. \t\t\t\t\t\t\t\t\t\t</a>
  2947. \t\t\t\t\t\t\t\t\t</div>
  2948. \t\t\t\t\t\t\t\t</div>
  2949. \t\t\t\t\t\t\t</div>
  2950. \t\t\t\t\t\t</div>
  2951. \t\t\t\t\t";
  2952.             }
  2953.             $_parent $context['_parent'];
  2954.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  2955.             $context array_intersect_key($context$_parent) + $_parent;
  2956.             // line 2534
  2957.             yield "\t\t\t\t</div>
  2958. \t\t\t</div>
  2959. \t\t</section>
  2960. \t";
  2961.         }
  2962.         // line 2538
  2963.         yield "
  2964. \t";
  2965.         // line 2539
  2966.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["recentlyViewedProducts"] ?? null)) > 0)) {
  2967.             // line 2540
  2968.             yield "\t\t<section class=\"py-5 bg-light\">
  2969. \t\t\t<div class=\"container\">
  2970. \t\t\t\t<div class=\"section-title text-center mb-5\">
  2971. \t\t\t\t\t<h2>Récemment consultés</h2>
  2972. \t\t\t\t\t<p>Retrouvez les articles que vous avez explorés dernièrement</p>
  2973. \t\t\t\t</div>
  2974. \t\t\t\t<div class=\"featured-gallery-wrapper\">
  2975. \t\t\t\t\t<div class=\"featured-gallery-container\">
  2976. \t\t\t\t\t\t<div class=\"featured-gallery-grid\">
  2977. \t\t\t\t\t\t\t";
  2978.             // line 2549
  2979.             $context['_parent'] = $context;
  2980.             $context['_seq'] = CoreExtension::ensureTraversable(($context["recentlyViewedProducts"] ?? null));
  2981.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  2982.                 // line 2550
  2983.                 yield "\t\t\t\t\t\t\t\t<div class=\"featured-gallery-item\">
  2984. \t\t\t\t\t\t\t\t\t<div class=\"single-product\">
  2985. \t\t\t\t\t\t\t\t\t\t<div class=\"product-image-container\">
  2986. \t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  2987.                 // line 2553
  2988.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2553)]), "html"nulltrue);
  2989.                 yield "\">
  2990. \t\t\t\t\t\t\t\t\t\t\t\t";
  2991.                 // line 2554
  2992.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2554) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2554)) > 0))) {
  2993.                     // line 2555
  2994.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" src=\"";
  2995.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((($_v6 CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2555)) && is_array($_v6) || $_v6 instanceof ArrayAccess ? ($_v6[0] ?? null) : null)), "html"nulltrue);
  2996.                     yield "\" alt=\"";
  2997.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2555), "html"nulltrue);
  2998.                     yield "\">
  2999. \t\t\t\t\t\t\t\t\t\t\t\t";
  3000.                 } else {
  3001.                     // line 2557
  3002.                     yield "\t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" src=\"";
  3003.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/img/product/p1.jpg"), "html"nulltrue);
  3004.                     yield "\" alt=\"";
  3005.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2557), "html"nulltrue);
  3006.                     yield "\">
  3007. \t\t\t\t\t\t\t\t\t\t\t\t";
  3008.                 }
  3009.                 // line 2559
  3010.                 yield "\t\t\t\t\t\t\t\t\t\t\t</a>
  3011. \t\t\t\t\t\t\t\t\t\t</div>
  3012. \t\t\t\t\t\t\t\t\t\t<div class=\"product-details\">
  3013. \t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  3014.                 // line 2562
  3015.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2562)]), "html"nulltrue);
  3016.                 yield "\">
  3017. \t\t\t\t\t\t\t\t\t\t\t\t<h6>";
  3018.                 // line 2563
  3019.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "name", [], "any"falsefalsefalse2563), "html"nulltrue);
  3020.                 yield "</h6>
  3021. \t\t\t\t\t\t\t\t\t\t\t</a>
  3022. \t\t\t\t\t\t\t\t\t\t\t<div class=\"price\">
  3023. \t\t\t\t\t\t\t\t\t\t\t\t<h6>";
  3024.                 // line 2566
  3025.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatNumber(CoreExtension::getAttribute($this->env$this->source$context["product"], "price", [], "any"falsefalsefalse2566), 2"."" "), "html"nulltrue);
  3026.                 yield " HTG</h6>
  3027. \t\t\t\t\t\t\t\t\t\t\t</div>
  3028. \t\t\t\t\t\t\t\t\t\t\t<div class=\"prd-bottom\">
  3029. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"social-info add-to-cart\" data-product-id=\"";
  3030.                 // line 2569
  3031.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2569), "html"nulltrue);
  3032.                 yield "\" data-qty=\"1\">
  3033. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
  3034. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">+ panier</p>
  3035. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  3036. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"";
  3037.                 // line 2573
  3038.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_product_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["product"], "slug", [], "any"falsefalsefalse2573)]), "html"nulltrue);
  3039.                 yield "\" class=\"social-info\">
  3040. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-move\"></span>
  3041. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Voir</p>
  3042. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  3043. \t\t\t\t\t\t\t\t\t\t\t</div>
  3044. \t\t\t\t\t\t\t\t\t\t</div>
  3045. \t\t\t\t\t\t\t\t\t</div>
  3046. \t\t\t\t\t\t\t\t</div>
  3047. \t\t\t\t\t\t\t";
  3048.             }
  3049.             $_parent $context['_parent'];
  3050.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  3051.             $context array_intersect_key($context$_parent) + $_parent;
  3052.             // line 2582
  3053.             yield "\t\t\t\t\t\t</div>
  3054. \t\t\t\t\t</div>
  3055. \t\t\t\t</div>
  3056. \t\t\t</div>
  3057. \t\t</section>
  3058. \t";
  3059.         }
  3060.         // line 2588
  3061.         yield "
  3062. \t<!-- Fonctionnalités -->
  3063. \t<section class=\"py-5\">
  3064. \t\t<div class=\"container\">
  3065. \t\t\t<div class=\"section-title\">
  3066. \t\t\t\t<h2>Pourquoi choisir MaketOu ?</h2>
  3067. \t\t\t\t<p>Découvrez les avantages de notre plateforme</p>
  3068. \t\t\t</div>
  3069. \t\t\t<div class=\"row\">
  3070. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  3071. \t\t\t\t\t<div class=\"feature-card\">
  3072. \t\t\t\t\t\t<div class=\"feature-icon\">
  3073. \t\t\t\t\t\t\t<i class=\"lnr lnr-rocket\"></i>
  3074. \t\t\t\t\t\t</div>
  3075. \t\t\t\t\t\t<h5>Livraison rapide</h5>
  3076. \t\t\t\t\t\t<p>Recevez vos commandes rapidement avec notre réseau de livraison optimisé</p>
  3077. \t\t\t\t\t</div>
  3078. \t\t\t\t</div>
  3079. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  3080. \t\t\t\t\t<div class=\"feature-card\">
  3081. \t\t\t\t\t\t<div class=\"feature-icon\">
  3082. \t\t\t\t\t\t\t<i class=\"lnr lnr-lock\"></i>
  3083. \t\t\t\t\t\t</div>
  3084. \t\t\t\t\t\t<h5>Paiement sécurisé</h5>
  3085. \t\t\t\t\t\t<p>Vos transactions sont protégées avec les dernières technologies de sécurité</p>
  3086. \t\t\t\t\t</div>
  3087. \t\t\t\t</div>
  3088. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  3089. \t\t\t\t\t<div class=\"feature-card\">
  3090. \t\t\t\t\t\t<div class=\"feature-icon\">
  3091. \t\t\t\t\t\t\t<i class=\"lnr lnr-phone\"></i>
  3092. \t\t\t\t\t\t</div>
  3093. \t\t\t\t\t\t<h5>Support 24/7</h5>
  3094. \t\t\t\t\t\t<p>Notre équipe est disponible pour vous aider à tout moment</p>
  3095. \t\t\t\t\t</div>
  3096. \t\t\t\t</div>
  3097. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  3098. \t\t\t\t\t<div class=\"feature-card\">
  3099. \t\t\t\t\t\t<div class=\"feature-icon\">
  3100. \t\t\t\t\t\t\t<i class=\"lnr lnr-undo\"></i>
  3101. \t\t\t\t\t\t</div>
  3102. \t\t\t\t\t\t<h5>Retour facile</h5>
  3103. \t\t\t\t\t\t<p>Politique de retour flexible pour votre tranquillité d'esprit</p>
  3104. \t\t\t\t\t</div>
  3105. \t\t\t\t</div>
  3106. \t\t\t</div>
  3107. \t\t</div>
  3108. \t</section>
  3109. \t<!-- Newsletter -->
  3110. \t<section class=\"newsletter-section-modern py-5\">
  3111. \t\t<div class=\"container\">
  3112. \t\t\t<div class=\"row justify-content-center\">
  3113. \t\t\t\t<div class=\"col-lg-10\">
  3114. \t\t\t\t\t<div class=\"newsletter-card\">
  3115. \t\t\t\t\t\t<div class=\"row align-items-center\">
  3116. \t\t\t\t\t\t\t<div class=\"col-lg-6 text-center text-lg-start mb-4 mb-lg-0\">
  3117. \t\t\t\t\t\t\t\t<div class=\"newsletter-icon mb-3\">
  3118. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-envelope\" style=\"font-size: 4rem; color: #ffa200;\"></i>
  3119. \t\t\t\t\t\t\t\t</div>
  3120. \t\t\t\t\t\t\t\t<h2 class=\"newsletter-title mb-3\">Restez informé des dernières nouveautés</h2>
  3121. \t\t\t\t\t\t\t\t<p class=\"newsletter-description mb-0\">
  3122. \t\t\t\t\t\t\t\t\tInscrivez-vous à notre newsletter pour recevoir les offres exclusives, 
  3123. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                                les nouveaux produits et les meilleures promotions directement dans votre boîte mail.
  3124. \t\t\t\t\t\t\t\t</p>
  3125. \t\t\t\t\t\t\t</div>
  3126. \t\t\t\t\t\t\t<div class=\"col-lg-6\">
  3127. \t\t\t\t\t\t\t\t<form class=\"newsletter-form-modern\" id=\"newsletterFormHome\">
  3128. \t\t\t\t\t\t\t\t\t<div class=\"newsletter-input-wrapper\">
  3129. \t\t\t\t\t\t\t\t\t\t<input type=\"email\" class=\"newsletter-input\" placeholder=\"Votre adresse email\" required name=\"email\">
  3130. \t\t\t\t\t\t\t\t\t\t<button class=\"newsletter-button\" type=\"submit\">
  3131. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-arrow-right me-2\"></i>
  3132. \t\t\t\t\t\t\t\t\t\t\tS'abonner
  3133. \t\t\t\t\t\t\t\t\t\t</button>
  3134. \t\t\t\t\t\t\t\t\t</div>
  3135. \t\t\t\t\t\t\t\t\t<p class=\"newsletter-privacy mt-3 text-center\">
  3136. \t\t\t\t\t\t\t\t\t\t<small>
  3137. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-lock me-1\"></i>
  3138. \t\t\t\t\t\t\t\t\t\t\tVos données sont sécurisées. Pas de spam, désinscription facile.
  3139. \t\t\t\t\t\t\t\t\t\t</small>
  3140. \t\t\t\t\t\t\t\t\t</p>
  3141. \t\t\t\t\t\t\t\t</form>
  3142. \t\t\t\t\t\t\t</div>
  3143. \t\t\t\t\t\t</div>
  3144. \t\t\t\t\t</div>
  3145. \t\t\t\t</div>
  3146. \t\t\t</div>
  3147. \t\t</div>
  3148. \t</section>
  3149. \t<!-- Call to Action -->
  3150. \t<section class=\"cta-section-modern py-5\">
  3151. \t\t<div class=\"container\">
  3152. \t\t\t<div class=\"cta-card\">
  3153. \t\t\t\t<div class=\"row align-items-center\">
  3154. \t\t\t\t\t<div class=\"col-lg-6 mb-4 mb-lg-0\">
  3155. \t\t\t\t\t\t<div class=\"cta-content\">
  3156. \t\t\t\t\t\t\t<span class=\"cta-badge\">
  3157. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-rocket me-2\"></i>
  3158. \t\t\t\t\t\t\t\tCommencez dès aujourd'hui
  3159. \t\t\t\t\t\t\t</span>
  3160. \t\t\t\t\t\t\t<h2 class=\"cta-title mb-3\">Prêt à commencer ?</h2>
  3161. \t\t\t\t\t\t\t<p class=\"cta-description mb-4\">
  3162. \t\t\t\t\t\t\t\tQue vous soyez
  3163. \t\t\t\t\t\t\t\t<strong>acheteur</strong>
  3164. \t\t\t\t\t\t\t\tou
  3165. \t\t\t\t\t\t\t\t<strong>vendeur</strong>, MaketOu vous offre la plateforme idéale 
  3166. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                            pour vos besoins commerciaux en Haïti. Rejoignez des milliers d'utilisateurs satisfaits !
  3167. \t\t\t\t\t\t\t</p>
  3168. \t\t\t\t\t\t\t<div class=\"cta-features mb-4\">
  3169. \t\t\t\t\t\t\t\t<div class=\"cta-feature-item\">
  3170. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  3171. \t\t\t\t\t\t\t\t\t<span>Plateforme 100% sécurisée</span>
  3172. \t\t\t\t\t\t\t\t</div>
  3173. \t\t\t\t\t\t\t\t<div class=\"cta-feature-item\">
  3174. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  3175. \t\t\t\t\t\t\t\t\t<span>Support client 24/7</span>
  3176. \t\t\t\t\t\t\t\t</div>
  3177. \t\t\t\t\t\t\t\t<div class=\"cta-feature-item\">
  3178. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  3179. \t\t\t\t\t\t\t\t\t<span>Paiements multiples</span>
  3180. \t\t\t\t\t\t\t\t</div>
  3181. \t\t\t\t\t\t\t</div>
  3182. \t\t\t\t\t\t\t<div class=\"cta-buttons\">
  3183. \t\t\t\t\t\t\t\t<button type=\"button\" class=\"btn cta-button-primary\" onclick=\"openReadyModal()\">
  3184. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-rocket me-2\"></i>
  3185. \t\t\t\t\t\t\t\t\tPrêt à commencer ?
  3186. \t\t\t\t\t\t\t\t</button>
  3187. \t\t\t\t\t\t\t\t<a href=\"";
  3188.         // line 2716
  3189.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
  3190.         yield "\" class=\"btn cta-button-secondary\">
  3191. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-magnifier me-2\"></i>
  3192. \t\t\t\t\t\t\t\t\tVoir les produits
  3193. \t\t\t\t\t\t\t\t</a>
  3194. \t\t\t\t\t\t\t</div>
  3195. \t\t\t\t\t\t</div>
  3196. \t\t\t\t\t</div>
  3197. \t\t\t\t\t<div class=\"col-lg-6\">
  3198. \t\t\t\t\t\t<div class=\"cta-image-wrapper\">
  3199. \t\t\t\t\t\t\t<div class=\"cta-decoration\"></div>
  3200. \t\t\t\t\t\t\t<img src=\"";
  3201.         // line 2726
  3202.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("Start.png"), "html"nulltrue);
  3203.         yield "\" alt=\"MaketOu\" class=\"cta-image\">
  3204. \t\t\t\t\t\t</div>
  3205. \t\t\t\t\t</div>
  3206. \t\t\t\t</div>
  3207. \t\t\t</div>
  3208. \t\t</div>
  3209. \t</section>
  3210. ";
  3211.         
  3212.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  3213.         
  3214.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  3215.         yield from [];
  3216.     }
  3217.     // line 2735
  3218.     /**
  3219.      * @return iterable<null|scalar|\Stringable>
  3220.      */
  3221.     public function block_javascripts(array $context, array $blocks = []): iterable
  3222.     {
  3223.         $macros $this->macros;
  3224.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  3225.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascripts"));
  3226.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  3227.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascripts"));
  3228.         // line 2736
  3229.         yield "\t<script src=\"";
  3230.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/product-unified.js"), "html"nulltrue);
  3231.         yield "\"></script>
  3232. \t<script>
  3233. \t\twindow.openReadyModal = function () {
  3234. \t\t\tconst modalEl = document.getElementById('readyModal');
  3235. \t\t\tif (!modalEl) {
  3236. \t\t\t\tconsole.error('readyModal introuvable');
  3237. \t\t\t\treturn;
  3238. \t\t\t}
  3239. \t\t\tif (typeof bootstrap === 'undefined' || !bootstrap.Modal) {
  3240. \t\t\t\tconsole.error('Bootstrap Modal non chargé');
  3241. \t\t\t\treturn;
  3242. \t\t\t}
  3243. \t\t\tconst modalInstance = bootstrap.Modal.getOrCreateInstance(modalEl);
  3244. \t\t\tmodalInstance.show();
  3245. \t\t};
  3246. \t</script>
  3247. \t<script>
  3248. \t\t// Variables globales pour la navigation des images (si pas déjà définies)
  3249. \t\tif (typeof productImages === 'undefined') {
  3250. \t\t\twindow.productImages = {};
  3251. \t\t\twindow.currentImageIndex = {};
  3252. \t\t}
  3253. // Initialisation des données d'images pour les produits \"Produits en vedette\"
  3254. ";
  3255.         // line 2760
  3256.         if (array_key_exists("featuredProducts"$context)) {
  3257.             // line 2761
  3258.             $context['_parent'] = $context;
  3259.             $context['_seq'] = CoreExtension::ensureTraversable(($context["featuredProducts"] ?? null));
  3260.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  3261.                 // line 2762
  3262.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2762) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2762)) > 0))) {
  3263.                     // line 2763
  3264.                     yield "productImages[";
  3265.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2763), "html"nulltrue);
  3266.                     yield "] = [";
  3267.                     $context['_parent'] = $context;
  3268.                     $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2763));
  3269.                     $context['loop'] = [
  3270.                       'parent' => $context['_parent'],
  3271.                       'index0' => 0,
  3272.                       'index'  => 1,
  3273.                       'first'  => true,
  3274.                     ];
  3275.                     if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  3276.                         $length count($context['_seq']);
  3277.                         $context['loop']['revindex0'] = $length 1;
  3278.                         $context['loop']['revindex'] = $length;
  3279.                         $context['loop']['length'] = $length;
  3280.                         $context['loop']['last'] = === $length;
  3281.                     }
  3282.                     foreach ($context['_seq'] as $context["_key"] => $context["img"]) {
  3283.                         yield "'";
  3284.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl($context["img"]), "html"nulltrue);
  3285.                         yield "'";
  3286.                         if ((($tmp =  !CoreExtension::getAttribute($this->env$this->source$context["loop"], "last", [], "any"falsefalsefalse2763)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3287.                             yield ",";
  3288.                         }
  3289.                         ++$context['loop']['index0'];
  3290.                         ++$context['loop']['index'];
  3291.                         $context['loop']['first'] = false;
  3292.                         if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  3293.                             --$context['loop']['revindex0'];
  3294.                             --$context['loop']['revindex'];
  3295.                             $context['loop']['last'] = === $context['loop']['revindex0'];
  3296.                         }
  3297.                     }
  3298.                     $_parent $context['_parent'];
  3299.                     unset($context['_seq'], $context['_key'], $context['img'], $context['_parent'], $context['loop']);
  3300.                     $context array_intersect_key($context$_parent) + $_parent;
  3301.                     yield "];
  3302. currentImageIndex[";
  3303.                     // line 2764
  3304.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2764), "html"nulltrue);
  3305.                     yield "] = 0;";
  3306.                 }
  3307.             }
  3308.             $_parent $context['_parent'];
  3309.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  3310.             $context array_intersect_key($context$_parent) + $_parent;
  3311.         }
  3312.         // line 2765
  3313.         yield "
  3314. // Initialisation des données d'images pour les produits \"Nouveautés\"
  3315. ";
  3316.         // line 2767
  3317.         if (array_key_exists("latestProducts"$context)) {
  3318.             // line 2768
  3319.             $context['_parent'] = $context;
  3320.             $context['_seq'] = CoreExtension::ensureTraversable(($context["latestProducts"] ?? null));
  3321.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  3322.                 // line 2769
  3323.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse2769) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2769)) > 0))) {
  3324.                     // line 2770
  3325.                     yield "productImages[";
  3326.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2770), "html"nulltrue);
  3327.                     yield "] = [";
  3328.                     $context['_parent'] = $context;
  3329.                     $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse2770));
  3330.                     $context['loop'] = [
  3331.                       'parent' => $context['_parent'],
  3332.                       'index0' => 0,
  3333.                       'index'  => 1,
  3334.                       'first'  => true,
  3335.                     ];
  3336.                     if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  3337.                         $length count($context['_seq']);
  3338.                         $context['loop']['revindex0'] = $length 1;
  3339.                         $context['loop']['revindex'] = $length;
  3340.                         $context['loop']['length'] = $length;
  3341.                         $context['loop']['last'] = === $length;
  3342.                     }
  3343.                     foreach ($context['_seq'] as $context["_key"] => $context["img"]) {
  3344.                         yield "'";
  3345.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl($context["img"]), "html"nulltrue);
  3346.                         yield "'";
  3347.                         if ((($tmp =  !CoreExtension::getAttribute($this->env$this->source$context["loop"], "last", [], "any"falsefalsefalse2770)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3348.                             yield ",";
  3349.                         }
  3350.                         ++$context['loop']['index0'];
  3351.                         ++$context['loop']['index'];
  3352.                         $context['loop']['first'] = false;
  3353.                         if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  3354.                             --$context['loop']['revindex0'];
  3355.                             --$context['loop']['revindex'];
  3356.                             $context['loop']['last'] = === $context['loop']['revindex0'];
  3357.                         }
  3358.                     }
  3359.                     $_parent $context['_parent'];
  3360.                     unset($context['_seq'], $context['_key'], $context['img'], $context['_parent'], $context['loop']);
  3361.                     $context array_intersect_key($context$_parent) + $_parent;
  3362.                     yield "];
  3363. currentImageIndex[";
  3364.                     // line 2771
  3365.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse2771), "html"nulltrue);
  3366.                     yield "] = 0;";
  3367.                 }
  3368.             }
  3369.             $_parent $context['_parent'];
  3370.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  3371.             $context array_intersect_key($context$_parent) + $_parent;
  3372.         }
  3373.         // line 2772
  3374.         yield "
  3375. console.log('SCRIPT LOADED - Featured Gallery');
  3376. (function () {
  3377. \t'use strict';
  3378. \tconst SECTION_CONFIGS = [
  3379. \t\t{ grid: '#featuredGalleryGrid', prev: '#featuredGalleryPrev', next: '#featuredGalleryNext' },
  3380. \t\t{ grid: '#latestGalleryGrid', prev: '#latestGalleryPrev', next: '#latestGalleryNext' }
  3381. \t];
  3382. \tfunction triggerRipple(button) {
  3383. \t\tbutton.classList.remove('btn-ripple');
  3384. \t\tvoid button.offsetWidth;
  3385. \t\tbutton.classList.add('btn-ripple');
  3386. \t\tsetTimeout(() => button.classList.remove('btn-ripple'), 350);
  3387. \t}
  3388. \tfunction initSectionCarousel(config) {
  3389. \t\tconst \$grid = \$(config.grid);
  3390. \t\tif (!\$grid.length) {
  3391. \t\t\tconsole.warn('Grid not found:', config.grid);
  3392. \t\t\treturn;
  3393. \t\t}
  3394. \t\tif (typeof \$.fn.owlCarousel !== 'function') {
  3395. \t\t\tconsole.warn('OwlCarousel n\\'est pas chargé pour', config.grid);
  3396. \t\t\treturn;
  3397. \t\t}
  3398. \t\t// Si déjà initialisé, récupérer l'instance existante
  3399. \t\tlet owlInstance;
  3400. \t\tif (\$grid.hasClass('owl-loaded')) {
  3401. \t\t\towlInstance = \$grid.data('owl.carousel');
  3402. \t\t\tconsole.log('OwlCarousel already initialized for', config.grid, owlInstance);
  3403. \t\t} else {
  3404. \t\t\tif (!\$grid.hasClass('owl-carousel')) {
  3405. \t\t\t\t\$grid.addClass('owl-carousel');
  3406. \t\t\t}
  3407. \t\t\towlInstance = \$grid.owlCarousel({
  3408. \t\t\t\tloop: true,
  3409. \t\t\t\tmargin: 30,
  3410. \t\t\t\tautoplay: true,
  3411. \t\t\t\tautoplayTimeout: 4800,
  3412. \t\t\t\tautoplayHoverPause: true,
  3413. \t\t\t\tsmartSpeed: 650,
  3414. \t\t\t\tnav: false,
  3415. \t\t\t\tdots: false,
  3416. \t\t\t\tresponsive: {
  3417. \t\t\t\t\t0: { items: 1, margin: 15 },
  3418. \t\t\t\t\t576: { items: 1.2, margin: 18 },
  3419. \t\t\t\t\t768: { items: 2, margin: 20 },
  3420. \t\t\t\t\t992: { items: 3, margin: 25 },
  3421. \t\t\t\t\t1400: { items: 4, margin: 30 }
  3422. \t\t\t\t}
  3423. \t\t\t});
  3424. \t\t\tconsole.log('OwlCarousel initialized for', config.grid, owlInstance);
  3425. \t\t}
  3426. \t\tconst \$prev = \$(config.prev);
  3427. \t\tconst \$next = \$(config.next);
  3428. \t\tif (\$prev.length) {
  3429. \t\t\t\$prev.off('click.carouselNav').on('click.carouselNav', function (e) {
  3430. \t\t\t\te.preventDefault();
  3431. \t\t\t\te.stopPropagation();
  3432. \t\t\t\tconsole.log('Prev clicked for', config.grid, 'Instance:', owlInstance);
  3433. \t\t\t\tif (owlInstance) {
  3434. \t\t\t\t\ttry {
  3435. \t\t\t\t\t\t\$grid.trigger('prev.owl.carousel');
  3436. \t\t\t\t\t\ttriggerRipple(this);
  3437. \t\t\t\t\t} catch (err) {
  3438. \t\t\t\t\t\tconsole.error('Error triggering prev:', err);
  3439. \t\t\t\t\t}
  3440. \t\t\t\t} else {
  3441. \t\t\t\t\tconsole.error('OwlCarousel instance not available');
  3442. \t\t\t\t}
  3443. \t\t\t});
  3444. \t\t} else {
  3445. \t\t\tconsole.warn('Prev button not found:', config.prev);
  3446. \t\t}
  3447. \t\tif (\$next.length) {
  3448. \t\t\t\$next.off('click.carouselNav').on('click.carouselNav', function (e) {
  3449. \t\t\t\te.preventDefault();
  3450. \t\t\t\te.stopPropagation();
  3451. \t\t\t\tconsole.log('Next clicked for', config.grid, 'Instance:', owlInstance);
  3452. \t\t\t\tif (owlInstance) {
  3453. \t\t\t\t\ttry {
  3454. \t\t\t\t\t\t\$grid.trigger('next.owl.carousel');
  3455. \t\t\t\t\t\ttriggerRipple(this);
  3456. \t\t\t\t\t} catch (err) {
  3457. \t\t\t\t\t\tconsole.error('Error triggering next:', err);
  3458. \t\t\t\t\t}
  3459. \t\t\t\t} else {
  3460. \t\t\t\t\tconsole.error('OwlCarousel instance not available');
  3461. \t\t\t\t}
  3462. \t\t\t});
  3463. \t\t} else {
  3464. \t\t\tconsole.warn('Next button not found:', config.next);
  3465. \t\t}
  3466. \t}
  3467. \tfunction ensureOwl(attempt = 0) {
  3468. \t\tif (window.jQuery && typeof \$.fn !== 'undefined' && typeof \$.fn.owlCarousel === 'function') {
  3469. \t\t\tSECTION_CONFIGS.forEach(initSectionCarousel);
  3470. \t\t} else if (attempt < 15) {
  3471. \t\t\tsetTimeout(() => ensureOwl(attempt + 1), 200);
  3472. \t\t} else {
  3473. \t\t\tconsole.warn('OwlCarousel non disponible après plusieurs tentatives');
  3474. \t\t}
  3475. \t}
  3476. \tdocument.addEventListener('DOMContentLoaded', function () {
  3477. \t\tensureOwl();
  3478. \t});
  3479. })();
  3480. document.addEventListener('DOMContentLoaded', function () { // Animation des cartes au scroll
  3481. const observerOptions = {
  3482. threshold: 0.1,
  3483. rootMargin: '0px 0px -50px 0px'
  3484. };
  3485. const observer = new IntersectionObserver(function (entries) {
  3486. entries.forEach(entry => {
  3487. if (entry.isIntersecting) {
  3488. entry.target.style.opacity = '1';
  3489. entry.target.style.transform = 'translateY(0)';
  3490. }
  3491. });
  3492. }, observerOptions);
  3493. // Observer toutes les cartes
  3494. document.querySelectorAll('.stats-card, .category-card, .product-card, .feature-card').forEach(card => {
  3495. card.style.opacity = '0';
  3496. card.style.transform = 'translateY(30px)';
  3497. card.style.transition = 'all 0.6s ease';
  3498. observer.observe(card);
  3499. });
  3500. // Compteur animé pour les statistiques
  3501. function animateCounter(element, target, duration = 2000) {
  3502. let start = 0;
  3503. const increment = target / (duration / 16);
  3504. function updateCounter() {
  3505. start += increment;
  3506. if (start < target) {
  3507. element.textContent = Math.floor(start).toLocaleString();
  3508. requestAnimationFrame(updateCounter);
  3509. } else {
  3510. element.textContent = target.toLocaleString();
  3511. }
  3512. }
  3513. updateCounter();
  3514. }
  3515. // Animer les compteurs quand ils sont visibles
  3516. const statsObserver = new IntersectionObserver(function (entries) {
  3517. entries.forEach(entry => {
  3518. if (entry.isIntersecting) {
  3519. const numberElement = entry.target.querySelector('.stats-number');
  3520. const target = parseInt(numberElement.textContent.replace(/,/g, ''));
  3521. animateCounter(numberElement, target);
  3522. statsObserver.unobserve(entry.target);
  3523. }
  3524. });
  3525. });
  3526. document.querySelectorAll('.stats-card').forEach(card => {
  3527. statsObserver.observe(card);
  3528. });
  3529. // Gestion de la newsletter
  3530. const newsletterForm = document.querySelector('.newsletter-form');
  3531. if (newsletterForm) {
  3532. newsletterForm.addEventListener('submit', function (e) {
  3533. e.preventDefault();
  3534. const email = this.querySelector('input[type=\"email\"]').value;
  3535. const button = this.querySelector('button');
  3536. const originalText = button.innerHTML;
  3537. // Désactiver le bouton
  3538. button.disabled = true;
  3539. button.innerHTML = '<i class=\"lnr lnr-spinner me-2\"></i>Inscription...';
  3540. // Envoyer la requête
  3541. fetch('";
  3542.         // line 2961
  3543.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_newsletter_subscribe");
  3544.         yield "', {
  3545. method: 'POST',
  3546. headers: {
  3547. 'Content-Type': 'application/x-www-form-urlencoded',
  3548. 'X-Requested-With': 'XMLHttpRequest'
  3549. },
  3550. body: 'email=' + encodeURIComponent(email)
  3551. }).then(response => response.json()).then(data => {
  3552. if (data.success) {
  3553. button.innerHTML = '<i class=\"lnr lnr-check me-2\"></i>Inscription réussie !';
  3554. button.classList.remove('btn-warning');
  3555. button.classList.add('btn-success');
  3556. this.reset();
  3557. } else {
  3558. button.innerHTML = '<i class=\"lnr lnr-warning me-2\"></i>Erreur';
  3559. button.classList.remove('btn-warning');
  3560. button.classList.add('btn-danger');
  3561. }
  3562. setTimeout(() => {
  3563. button.innerHTML = originalText;
  3564. button.classList.remove('btn-success', 'btn-danger');
  3565. button.classList.add('btn-warning');
  3566. button.disabled = false;
  3567. }, 3000);
  3568. }).catch(error => {
  3569. console.error('Erreur:', error);
  3570. button.innerHTML = '<i class=\"lnr lnr-warning me-2\"></i>Erreur';
  3571. button.classList.remove('btn-warning');
  3572. button.classList.add('btn-danger');
  3573. setTimeout(() => {
  3574. button.innerHTML = originalText;
  3575. button.classList.remove('btn-danger');
  3576. button.classList.add('btn-warning');
  3577. button.disabled = false;
  3578. }, 3000);
  3579. });
  3580. });
  3581. }
  3582. });
  3583. // Effet parallaxe léger pour le hero
  3584. window.addEventListener('scroll', function () {
  3585. const scrolled = window.pageYOffset;
  3586. const hero = document.querySelector('.hero-banner');
  3587. if (hero) {
  3588. hero.style.transform = `translateY(\${
  3589. scrolled * 0.5
  3590. }px)`;
  3591. }
  3592. });
  3593. });
  3594. // Fonction pour afficher toutes les catégories
  3595. function showAllCategories () {
  3596. const container = document.getElementById('productCategoriesContainer');
  3597. const btn = document.getElementById('showAllCategoriesBtn');";
  3598.         // line 3018
  3599.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["allCategories"] ?? null)) > 8)) {
  3600.             $context['_parent'] = $context;
  3601.             $context['_seq'] = CoreExtension::ensureTraversable(($context["allCategories"] ?? null));
  3602.             $context['loop'] = [
  3603.               'parent' => $context['_parent'],
  3604.               'index0' => 0,
  3605.               'index'  => 1,
  3606.               'first'  => true,
  3607.             ];
  3608.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  3609.                 $length count($context['_seq']);
  3610.                 $context['loop']['revindex0'] = $length 1;
  3611.                 $context['loop']['revindex'] = $length;
  3612.                 $context['loop']['length'] = $length;
  3613.                 $context['loop']['last'] = === $length;
  3614.             }
  3615.             foreach ($context['_seq'] as $context["_key"] => $context["category"]) {
  3616.                 if ((CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3018) > 8)) {
  3617.                     yield "const categoryHtml ";
  3618.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3018), "html"nulltrue);
  3619.                     yield " = `
  3620.         <div class=\"col-lg-3 col-md-4 col-sm-6 mb-4\">
  3621.             <div class=\"category-card-custom\">
  3622.                 <div class=\"category-image-wrapper\">
  3623.                     <div class=\"category-image\" style=\"background-image: url('";
  3624.                     // line 3022
  3625.                     if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["category"], "bannerImage", [], "any"falsefalsefalse3022)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3626.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(("uploads/categories/banner/" CoreExtension::getAttribute($this->env$this->source$context["category"], "bannerImage", [], "any"falsefalsefalse3022))), "html"nulltrue);
  3627.                     } else {
  3628.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((("ui/img/category/cat-" CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3022)) . ".jpg")), "html"nulltrue);
  3629.                     }
  3630.                     yield "')\">
  3631.                         <div class=\"category-overlay-custom\">
  3632.                             <div class=\"category-icon-wrapper\">
  3633.                                 <i class=\"lnr lnr-tag\" style=\"font-size: 3rem;\"></i>
  3634.                                 <h4 class=\"mt-3\">";
  3635.                     // line 3026
  3636.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["category"], "name", [], "any"falsefalsefalse3026), "html"nulltrue);
  3637.                     yield "</h4>
  3638.                             </div>
  3639.                         </div>
  3640.                     </div>
  3641.                 </div>
  3642.                 <div class=\"category-content p-3\">
  3643.                     <h5 class=\"mb-2\">";
  3644.                     // line 3032
  3645.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["category"], "name", [], "any"falsefalsefalse3032), "html"nulltrue);
  3646.                     yield "</h5>
  3647.                     ";
  3648.                     // line 3033
  3649.                     if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["category"], "description", [], "any"falsefalsefalse3033)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3650.                         // line 3034
  3651.                         yield "                        <p class=\"text-muted mb-3 small\">";
  3652.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["category"], "description", [], "any"falsefalsefalse3034)), 060), "html"nulltrue);
  3653.                         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["category"], "description", [], "any"falsefalsefalse3034))) > 60)) {
  3654.                             yield "...";
  3655.                         }
  3656.                         yield "</p>
  3657.                     ";
  3658.                     }
  3659.                     // line 3036
  3660.                     yield "                    <a href=\"";
  3661.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing", ["category" => CoreExtension::getAttribute($this->env$this->source$context["category"], "slug", [], "any"falsefalsefalse3036)]), "html"nulltrue);
  3662.                     yield "\" class=\"btn btn-primary-custom btn-sm w-100\">
  3663.                         Voir les produits
  3664.                     </a>
  3665.                 </div>
  3666.             </div>
  3667.         </div>
  3668.     `;
  3669. container.insertAdjacentHTML('beforeend', categoryHtml ";
  3670.                     // line 3043
  3671.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3043), "html"nulltrue);
  3672.                     yield ");";
  3673.                 }
  3674.                 ++$context['loop']['index0'];
  3675.                 ++$context['loop']['index'];
  3676.                 $context['loop']['first'] = false;
  3677.                 if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  3678.                     --$context['loop']['revindex0'];
  3679.                     --$context['loop']['revindex'];
  3680.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  3681.                 }
  3682.             }
  3683.             $_parent $context['_parent'];
  3684.             unset($context['_seq'], $context['_key'], $context['category'], $context['_parent'], $context['loop']);
  3685.             $context array_intersect_key($context$_parent) + $_parent;
  3686.         }
  3687.         yield "if (btn) 
  3688. btn.style.display = 'none';
  3689. }
  3690. // Fonction pour afficher toutes les catégories de boutiques
  3691. function showAllShopCategories () {
  3692. const container = document.getElementById('shopCategoriesContainer');
  3693. const btn = document.querySelector('[onclick=\"showAllShopCategories()\"]') ?. parentElement;";
  3694.         // line 3053
  3695.         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), ($context["allShopCategories"] ?? null)) > 6)) {
  3696.             $context['_parent'] = $context;
  3697.             $context['_seq'] = CoreExtension::ensureTraversable(($context["allShopCategories"] ?? null));
  3698.             $context['loop'] = [
  3699.               'parent' => $context['_parent'],
  3700.               'index0' => 0,
  3701.               'index'  => 1,
  3702.               'first'  => true,
  3703.             ];
  3704.             if (is_array($context['_seq']) || (is_object($context['_seq']) && $context['_seq'] instanceof \Countable)) {
  3705.                 $length count($context['_seq']);
  3706.                 $context['loop']['revindex0'] = $length 1;
  3707.                 $context['loop']['revindex'] = $length;
  3708.                 $context['loop']['length'] = $length;
  3709.                 $context['loop']['last'] = === $length;
  3710.             }
  3711.             foreach ($context['_seq'] as $context["_key"] => $context["shopCategory"]) {
  3712.                 if ((CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3053) > 6)) {
  3713.                     yield "const shopCategoryHtml ";
  3714.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3053), "html"nulltrue);
  3715.                     yield " = `
  3716.         <div class=\"col-lg-4 col-md-6 mb-4\">
  3717.             <a href=\"";
  3718.                     // line 3055
  3719.                     yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_shops_list");
  3720.                     yield "?category=";
  3721.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "slug", [], "any"falsefalsefalse3055), "html"nulltrue);
  3722.                     yield "\" class=\"text-decoration-none\" style=\"display: block;\">
  3723.                 <div class=\"category-card-custom shop-category-clickable\">
  3724.                     <div class=\"category-image-wrapper\">
  3725.                         <div class=\"category-image\" style=\"background-image: url('";
  3726.                     // line 3058
  3727.                     if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "bannerImage", [], "any"falsefalsefalse3058)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3728.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "bannerImage", [], "any"falsefalsefalse3058)), "html"nulltrue);
  3729.                     } else {
  3730.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl((("ui/img/category/shop-" CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3058)) . ".jpg")), "html"nulltrue);
  3731.                     }
  3732.                     yield "')\">
  3733.                             <div class=\"category-overlay-custom\">
  3734.                                 <div class=\"category-icon-wrapper\">
  3735.                                     <i class=\"lnr lnr-store\" style=\"font-size: 3rem;\"></i>
  3736.                                     <h4 class=\"mt-3\">";
  3737.                     // line 3062
  3738.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "name", [], "any"falsefalsefalse3062), "html"nulltrue);
  3739.                     yield "</h4>
  3740.                                     ";
  3741.                     // line 3063
  3742.                     if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse3063)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3743.                         // line 3064
  3744.                         yield "                                        <p class=\"mt-2 px-3\">";
  3745.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse3064)), 0100), "html"nulltrue);
  3746.                         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse3064))) > 100)) {
  3747.                             yield "...";
  3748.                         }
  3749.                         yield "</p>
  3750.                                     ";
  3751.                     }
  3752.                     // line 3066
  3753.                     yield "                                </div>
  3754.                             </div>
  3755.                         </div>
  3756.                     </div>
  3757.                     <div class=\"category-content p-3\">
  3758.                         <h5 class=\"mb-2\">";
  3759.                     // line 3071
  3760.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "name", [], "any"falsefalsefalse3071), "html"nulltrue);
  3761.                     yield "</h5>
  3762.                         ";
  3763.                     // line 3072
  3764.                     if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse3072)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3765.                         // line 3073
  3766.                         yield "                            <p class=\"text-muted mb-3 small\">";
  3767.                         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse3073)), 080), "html"nulltrue);
  3768.                         if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), Twig\Extension\CoreExtension::striptags(CoreExtension::getAttribute($this->env$this->source$context["shopCategory"], "description", [], "any"falsefalsefalse3073))) > 80)) {
  3769.                             yield "...";
  3770.                         }
  3771.                         yield "</p>
  3772.                         ";
  3773.                     }
  3774.                     // line 3075
  3775.                     yield "                        <span class=\"btn btn-primary-custom btn-sm w-100\">
  3776.                             Voir les boutiques <i class=\"lnr lnr-arrow-right ms-2\"></i>
  3777.                         </span>
  3778.                     </div>
  3779.                 </div>
  3780.             </a>
  3781.         </div>
  3782.     `;
  3783. container.insertAdjacentHTML('beforeend', shopCategoryHtml ";
  3784.                     // line 3083
  3785.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["loop"], "index", [], "any"falsefalsefalse3083), "html"nulltrue);
  3786.                     yield ");";
  3787.                 }
  3788.                 ++$context['loop']['index0'];
  3789.                 ++$context['loop']['index'];
  3790.                 $context['loop']['first'] = false;
  3791.                 if (isset($context['loop']['revindex0'], $context['loop']['revindex'])) {
  3792.                     --$context['loop']['revindex0'];
  3793.                     --$context['loop']['revindex'];
  3794.                     $context['loop']['last'] = === $context['loop']['revindex0'];
  3795.                 }
  3796.             }
  3797.             $_parent $context['_parent'];
  3798.             unset($context['_seq'], $context['_key'], $context['shopCategory'], $context['_parent'], $context['loop']);
  3799.             $context array_intersect_key($context$_parent) + $_parent;
  3800.         }
  3801.         yield "if (btn) 
  3802. btn.style.display = 'none';
  3803. }
  3804.     // Initialiser les carousels
  3805.     <script src=\"";
  3806.         // line 3091
  3807.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("ui/js/product-unified.js"), "html"nulltrue);
  3808.         yield "\"></script>
  3809.     <script>
  3810.         document.addEventListener('DOMContentLoaded', function() {
  3811.             // Init featured products images
  3812.             ";
  3813.         // line 3095
  3814.         if (array_key_exists("featuredProducts"$context)) {
  3815.             // line 3096
  3816.             yield "                ";
  3817.             $context['_parent'] = $context;
  3818.             $context['_seq'] = CoreExtension::ensureTraversable(($context["featuredProducts"] ?? null));
  3819.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  3820.                 // line 3097
  3821.                 yield "                    ";
  3822.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse3097) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse3097)) > 0))) {
  3823.                     // line 3098
  3824.                     yield "                        if (typeof initProductImages === 'function') {
  3825.                             initProductImages(";
  3826.                     // line 3099
  3827.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse3099), "html"nulltrue);
  3828.                     yield ", ";
  3829.                     yield json_encode(CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse3099));
  3830.                     yield ");
  3831.                         }
  3832.                     ";
  3833.                 }
  3834.                 // line 3102
  3835.                 yield "                ";
  3836.             }
  3837.             $_parent $context['_parent'];
  3838.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  3839.             $context array_intersect_key($context$_parent) + $_parent;
  3840.             // line 3103
  3841.             yield "            ";
  3842.         }
  3843.         // line 3104
  3844.         yield "
  3845.             // Init latest products images
  3846.             ";
  3847.         // line 3106
  3848.         if (array_key_exists("latestProducts"$context)) {
  3849.             // line 3107
  3850.             yield "                ";
  3851.             $context['_parent'] = $context;
  3852.             $context['_seq'] = CoreExtension::ensureTraversable(($context["latestProducts"] ?? null));
  3853.             foreach ($context['_seq'] as $context["_key"] => $context["product"]) {
  3854.                 // line 3108
  3855.                 yield "                    ";
  3856.                 if ((CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"truetruefalse3108) && (Twig\Extension\CoreExtension::length($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse3108)) > 0))) {
  3857.                     // line 3109
  3858.                     yield "                        if (typeof initProductImages === 'function') {
  3859.                             initProductImages(";
  3860.                     // line 3110
  3861.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["product"], "id", [], "any"falsefalsefalse3110), "html"nulltrue);
  3862.                     yield ", ";
  3863.                     yield json_encode(CoreExtension::getAttribute($this->env$this->source$context["product"], "images", [], "any"falsefalsefalse3110));
  3864.                     yield ");
  3865.                         }
  3866.                     ";
  3867.                 }
  3868.                 // line 3113
  3869.                 yield "                ";
  3870.             }
  3871.             $_parent $context['_parent'];
  3872.             unset($context['_seq'], $context['_key'], $context['product'], $context['_parent']);
  3873.             $context array_intersect_key($context$_parent) + $_parent;
  3874.             // line 3114
  3875.             yield "            ";
  3876.         }
  3877.         // line 3115
  3878.         yield "        });
  3879.     </script>
  3880.     <script>
  3881.     \$(document).ready(function () { // Carousel bannière principale
  3882. if (\$('.active-banner-slider').length) {
  3883. \$('.active-banner-slider').owlCarousel({
  3884. items: 1,
  3885. loop: true,
  3886. autoplay: true,
  3887. autoplayTimeout: 6000,
  3888. autoplayHoverPause: true,
  3889. nav: true,
  3890. dots: true,
  3891. navText: [
  3892. '<i class=\"lnr lnr-chevron-left\"></i>', '<i class=\"lnr lnr-chevron-right\"></i>'
  3893. ],
  3894. smartSpeed: 1000,
  3895. animateOut: 'fadeOut',
  3896. animateIn: 'fadeIn',
  3897. responsive: {
  3898. 0: {
  3899. items: 1,
  3900. nav: true,
  3901. dots: true
  3902. },
  3903. 768: {
  3904. items: 1,
  3905. nav: true,
  3906. dots: true
  3907. },
  3908. 992: {
  3909. items: 1,
  3910. nav: true,
  3911. dots: true
  3912. }
  3913. }
  3914. });
  3915. }
  3916. // Animation d'apparition pour les cartes produits
  3917. const observerOptions = {
  3918. threshold: 0.1,
  3919. rootMargin: '0px 0px -50px 0px'
  3920. };
  3921. const productObserver = new IntersectionObserver(function (entries) {
  3922. entries.forEach(entry => {
  3923. if (entry.isIntersecting) {
  3924. entry.target.style.opacity = '1';
  3925. entry.target.style.transform = 'translateY(0)';
  3926. }
  3927. });
  3928. }, observerOptions);
  3929. document.querySelectorAll('.product-card-modern').forEach((card, index) => {
  3930. card.style.opacity = '0';
  3931. card.style.transform = 'translateY(20px)';
  3932. card.style.transition = `opacity 0.6s ease \${
  3933. index * 0.1
  3934. }s, transform 0.6s ease \${
  3935. index * 0.1
  3936. }s`;
  3937. productObserver.observe(card);
  3938. });
  3939. });
  3940. \t</script>
  3941. \t<!-- Modal \"Prêt à commencer ?\" -->
  3942. \t<div class=\"modal fade\" id=\"readyModal\" tabindex=\"-1\">
  3943. \t\t<div class=\"modal-dialog modal-dialog-centered\">
  3944. \t\t\t<div class=\"modal-content\">
  3945. \t\t\t\t<div class=\"modal-header\">
  3946. \t\t\t\t\t<h5 class=\"modal-title\">
  3947. \t\t\t\t\t\t<i class=\"lnr lnr-rocket me-2\"></i>Prêt à commencer ?
  3948. \t\t\t\t\t</h5>
  3949. \t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\"></button>
  3950. \t\t\t\t</div>
  3951. \t\t\t\t<div class=\"modal-body\">
  3952. \t\t\t\t\t";
  3953.         // line 3193
  3954.         if ((($tmp CoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse3193)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  3955.             // line 3194
  3956.             yield "\t\t\t\t\t\t";
  3957.             if ((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, ($context["app"] ?? null), "user", [], "any"falsefalsefalse3194), "kycStatus", [], "any"falsefalsefalse3194) == "verified")) {
  3958.                 // line 3195
  3959.                 yield "\t\t\t\t\t\t\t<div class=\"text-center\">
  3960. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\" style=\"font-size: 4rem; color: #28a745;\"></i>
  3961. \t\t\t\t\t\t\t\t<h4 class=\"mt-3\">Votre compte est vérifié !</h4>
  3962. \t\t\t\t\t\t\t\t<p class=\"text-muted\">Vous pouvez commencer à utiliser MaketOu en toute sérénité.</p>
  3963. \t\t\t\t\t\t\t\t<div class=\"mt-4\">
  3964. \t\t\t\t\t\t\t\t\t<a href=\"";
  3965.                 // line 3200
  3966.                 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("seller_index");
  3967.                 yield "\" class=\"btn btn-primary me-2\">
  3968. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store me-1\"></i>Ouvrir ma boutique
  3969. \t\t\t\t\t\t\t\t\t</a>
  3970. \t\t\t\t\t\t\t\t\t<a href=\"";
  3971.                 // line 3203
  3972.                 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_listing");
  3973.                 yield "\" class=\"btn btn-outline-primary\">
  3974. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-magnifier me-1\"></i>Voir les produits
  3975. \t\t\t\t\t\t\t\t\t</a>
  3976. \t\t\t\t\t\t\t\t</div>
  3977. \t\t\t\t\t\t\t</div>
  3978. \t\t\t\t\t\t";
  3979.             } else {
  3980.                 // line 3209
  3981.                 yield "\t\t\t\t\t\t\t<div class=\"text-center\">
  3982. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-shield\" style=\"font-size: 4rem; color: #ffa200;\"></i>
  3983. \t\t\t\t\t\t\t\t<h4 class=\"mt-3\">Vérification requise</h4>
  3984. \t\t\t\t\t\t\t\t<p class=\"text-muted\">Pour utiliser toutes les fonctionnalités de MaketOu, vous devez compléter votre vérification KYC.</p>
  3985. \t\t\t\t\t\t\t\t<div class=\"mt-4\">
  3986. \t\t\t\t\t\t\t\t\t<a href=\"";
  3987.                 // line 3214
  3988.                 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_account_kyc");
  3989.                 yield "\" class=\"btn btn-primary btn-lg\">
  3990. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle me-1\"></i> <span class=\"d-none d-md-inline\">Commencer la vérification</span>
  3991. \t\t\t\t\t\t\t\t\t</a>
  3992. \t\t\t\t\t\t\t\t</div>
  3993. \t\t\t\t\t\t\t</div>
  3994. \t\t\t\t\t\t";
  3995.             }
  3996.             // line 3220
  3997.             yield "\t\t\t\t\t";
  3998.         } else {
  3999.             // line 3221
  4000.             yield "\t\t\t\t\t\t<div class=\"text-center\">
  4001. \t\t\t\t\t\t\t<i class=\"lnr lnr-user\" style=\"font-size: 4rem; color: #007bff;\"></i>
  4002. \t\t\t\t\t\t\t<h4 class=\"mt-3\">Connectez-vous pour commencer</h4>
  4003. \t\t\t\t\t\t\t<p class=\"text-muted\">Créez un compte ou connectez-vous pour accéder à toutes les fonctionnalités de MaketOu.</p>
  4004. \t\t\t\t\t\t\t<div class=\"mt-4\">
  4005. \t\t\t\t\t\t\t\t<a href=\"";
  4006.             // line 3226
  4007.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_login");
  4008.             yield "\" class=\"btn btn-primary btn-lg me-2\">
  4009. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-enter me-1\"></i> Se connecter
  4010. \t\t\t\t\t\t\t\t</a>
  4011. \t\t\t\t\t\t\t\t<a href=\"";
  4012.             // line 3229
  4013.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("ui_app_register");
  4014.             yield "\" class=\"btn btn-outline-primary btn-lg\">
  4015. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-user-plus me-1\"></i> S'inscrire
  4016. \t\t\t\t\t\t\t\t</a>
  4017. \t\t\t\t\t\t\t</div>
  4018. \t\t\t\t\t\t</div>
  4019. \t\t\t\t\t";
  4020.         }
  4021.         // line 3235
  4022.         yield "\t\t\t\t</div>
  4023. \t\t\t</div>
  4024. \t\t</div>
  4025. \t</div>
  4026. ";
  4027.         
  4028.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  4029.         
  4030.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  4031.         yield from [];
  4032.     }
  4033.     /**
  4034.      * @codeCoverageIgnore
  4035.      */
  4036.     public function getTemplateName(): string
  4037.     {
  4038.         return "home/index.html.twig";
  4039.     }
  4040.     /**
  4041.      * @codeCoverageIgnore
  4042.      */
  4043.     public function isTraitable(): bool
  4044.     {
  4045.         return false;
  4046.     }
  4047.     /**
  4048.      * @codeCoverageIgnore
  4049.      */
  4050.     public function getDebugInfo(): array
  4051.     {
  4052.         return array (  4354 => 3235,  4345 => 3229,  4339 => 3226,  4332 => 3221,  4329 => 3220,  4320 => 3214,  4313 => 3209,  4304 => 3203,  4298 => 3200,  4291 => 3195,  4288 => 3194,  4286 => 3193,  4206 => 3115,  4203 => 3114,  4197 => 3113,  4189 => 3110,  4186 => 3109,  4183 => 3108,  4178 => 3107,  4176 => 3106,  4172 => 3104,  4169 => 3103,  4163 => 3102,  4155 => 3099,  4152 => 3098,  4149 => 3097,  4144 => 3096,  4142 => 3095,  4135 => 3091,  4109 => 3083,  4099 => 3075,  4090 => 3073,  4088 => 3072,  4084 => 3071,  4077 => 3066,  4068 => 3064,  4066 => 3063,  4062 => 3062,  4051 => 3058,  4043 => 3055,  4019 => 3053,  3991 => 3043,  3980 => 3036,  3971 => 3034,  3969 => 3033,  3965 => 3032,  3956 => 3026,  3945 => 3022,  3919 => 3018,  3859 => 2961,  3668 => 2772,  3659 => 2771,  3619 => 2770,  3617 => 2769,  3613 => 2768,  3611 => 2767,  3607 => 2765,  3598 => 2764,  3558 => 2763,  3556 => 2762,  3552 => 2761,  3550 => 2760,  3522 => 2736,  3509 => 2735,  3490 => 2726,  3477 => 2716,  3347 => 2588,  3339 => 2582,  3324 => 2573,  3317 => 2569,  3311 => 2566,  3305 => 2563,  3301 => 2562,  3296 => 2559,  3288 => 2557,  3280 => 2555,  3278 => 2554,  3274 => 2553,  3269 => 2550,  3265 => 2549,  3254 => 2540,  3252 => 2539,  3249 => 2538,  3243 => 2534,  3229 => 2526,  3225 => 2525,  3221 => 2523,  3217 => 2521,  3209 => 2519,  3207 => 2518,  3198 => 2514,  3193 => 2511,  3189 => 2509,  3187 => 2508,  3182 => 2507,  3180 => 2506,  3176 => 2504,  3172 => 2503,  3163 => 2496,  3161 => 2495,  3158 => 2494,  3147 => 2486,  3122 => 2463,  3107 => 2454,  3092 => 2450,  3077 => 2446,  3070 => 2442,  3066 => 2440,  3059 => 2437,  3057 => 2436,  3052 => 2434,  3046 => 2430,  3042 => 2428,  3036 => 2425,  3031 => 2424,  3029 => 2423,  3018 => 2415,  3014 => 2414,  3009 => 2411,  3005 => 2409,  2982 => 2407,  2965 => 2406,  2961 => 2405,  2951 => 2400,  2942 => 2397,  2940 => 2396,  2935 => 2393,  2925 => 2391,  2915 => 2389,  2913 => 2388,  2909 => 2387,  2903 => 2386,  2899 => 2384,  2895 => 2383,  2883 => 2373,  2881 => 2372,  2877 => 2370,  2866 => 2362,  2841 => 2339,  2826 => 2330,  2811 => 2326,  2796 => 2322,  2789 => 2318,  2785 => 2316,  2778 => 2313,  2776 => 2312,  2771 => 2310,  2765 => 2306,  2761 => 2304,  2755 => 2301,  2750 => 2300,  2748 => 2299,  2737 => 2291,  2733 => 2290,  2728 => 2287,  2724 => 2285,  2701 => 2283,  2684 => 2282,  2680 => 2281,  2670 => 2276,  2661 => 2273,  2659 => 2272,  2654 => 2269,  2644 => 2267,  2638 => 2264,  2634 => 2263,  2630 => 2262,  2626 => 2261,  2622 => 2259,  2620 => 2258,  2616 => 2257,  2610 => 2256,  2606 => 2254,  2602 => 2253,  2590 => 2243,  2588 => 2242,  2584 => 2240,  2579 => 2237,  2572 => 2233,  2567 => 2230,  2565 => 2229,  2562 => 2228,  2540 => 2219,  2536 => 2217,  2531 => 2215,  2526 => 2214,  2524 => 2213,  2520 => 2212,  2513 => 2207,  2509 => 2205,  2504 => 2203,  2499 => 2202,  2497 => 2201,  2493 => 2200,  2482 => 2196,  2474 => 2193,  2471 => 2192,  2454 => 2191,  2445 => 2184,  2443 => 2183,  2439 => 2181,  2433 => 2177,  2411 => 2170,  2407 => 2168,  2402 => 2166,  2397 => 2165,  2395 => 2164,  2391 => 2163,  2382 => 2157,  2371 => 2153,  2366 => 2150,  2349 => 2149,  2340 => 2142,  2338 => 2141,  2333 => 2138,  2315 => 2122,  2309 => 2118,  2288 => 2110,  2280 => 2108,  2272 => 2106,  2270 => 2105,  2262 => 2099,  2256 => 2096,  2250 => 2094,  2248 => 2093,  2239 => 2087,  2232 => 2083,  2225 => 2079,  2220 => 2077,  2208 => 2067,  2191 => 2066,  2187 => 2064,  2185 => 2063,  2181 => 2061,  2168 => 2060,  526 => 428,  103 => 7,  90 => 6,  66 => 3,  43 => 1,);
  4053.     }
  4054.     public function getSourceContext(): Source
  4055.     {
  4056.         return new Source("{% extends 'base_home.html.twig' %}
  4057. {% block title %}Accueil | MaketOu - Votre marketplace haïtienne
  4058. {% endblock %}
  4059. {% block stylesheets %}
  4060. \t<style>
  4061. \t\t/* Styles personnalisés pour la page d'accueil */
  4062. \t\t.hero-banner {
  4063. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  4064. \t\t\tcolor: white;
  4065. \t\t\tpadding: 100px 0;
  4066. \t\t\tposition: relative;
  4067. \t\t\toverflow: hidden;
  4068. \t\t}
  4069. \t\t.hero-banner::before {
  4070. \t\t\tcontent: '';
  4071. \t\t\tposition: absolute;
  4072. \t\t\ttop: 0;
  4073. \t\t\tleft: 0;
  4074. \t\t\tright: 0;
  4075. \t\t\tbottom: 0;
  4076. \t\t\tbackground: url('data:image/svg+xml, <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><defs><pattern id=\"grain\" width=\"100\" height=\"100\" patternUnits=\"userSpaceOnUse\"><circle cx=\"25\" cy=\"25\" r=\"1\" fill=\"rgba(255, 255, 255, 0.1)\"/><circle cx=\"75\" cy=\"75\" r=\"1\" fill=\"rgba(255, 255, 255, 0.1)\"/><circle cx=\"50\" cy=\"10\" r=\"0.5\" fill=\"rgba(255, 255, 255, 0.1)\"/><circle cx=\"10\" cy=\"90\" r=\"0.5\" fill=\"rgba(255, 255, 255, 0.1)\"/></pattern></defs><rect width=\"100\" height=\"100\" fill=\"url(%23grain)\"/></svg>');
  4077. \t\t\topacity: 0.3;
  4078. \t\t}
  4079. \t\t.hero-content {
  4080. \t\t\tposition: relative;
  4081. \t\t\tz-index: 2;
  4082. \t\t}
  4083. \t\t.stats-card {
  4084. \t\t\tbackground: white;
  4085. \t\t\tborder-radius: 15px;
  4086. \t\t\tpadding: 30px;
  4087. \t\t\ttext-align: center;
  4088. \t\t\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
  4089. \t\t\ttransition: transform 0.3s ease;
  4090. \t\t}
  4091. \t\t.stats-card:hover {
  4092. \t\t\ttransform: translateY(-5px);
  4093. \t\t}
  4094. \t\t.stats-number {
  4095. \t\t\tfont-size: 3rem;
  4096. \t\t\tfont-weight: bold;
  4097. \t\t\tcolor: #ffa200;
  4098. \t\t\tdisplay: block;
  4099. \t\t}
  4100. \t\t.stats-label {
  4101. \t\t\tcolor: #666;
  4102. \t\t\tfont-size: 1.1rem;
  4103. \t\t\tmargin-top: 10px;
  4104. \t\t}
  4105. \t\t.category-card {
  4106. \t\t\tbackground: white;
  4107. \t\t\tborder-radius: 15px;
  4108. \t\t\toverflow: hidden;
  4109. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  4110. \t\t\ttransition: all 0.3s ease;
  4111. \t\t\theight: 100%;
  4112. \t\t}
  4113. \t\t.category-card:hover {
  4114. \t\t\ttransform: translateY(-5px);
  4115. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  4116. \t\t}
  4117. \t\t.category-image {
  4118. \t\t\theight: 200px;
  4119. \t\t\tbackground-size: cover;
  4120. \t\t\tbackground-position: center;
  4121. \t\t\tposition: relative;
  4122. \t\t}
  4123. \t\t.category-overlay {
  4124. \t\t\tposition: absolute;
  4125. \t\t\ttop: 0;
  4126. \t\t\tleft: 0;
  4127. \t\t\tright: 0;
  4128. \t\t\tbottom: 0;
  4129. \t\t\tbackground: linear-gradient(45deg, rgba(255,162,0,0.8), rgba(232,145,10,0.8));
  4130. \t\t\tdisplay: flex;
  4131. \t\t\talign-items: center;
  4132. \t\t\tjustify-content: center;
  4133. \t\t\topacity: 0;
  4134. \t\t\ttransition: opacity 0.3s ease;
  4135. \t\t}
  4136. \t\t.category-card:hover .category-overlay {
  4137. \t\t\topacity: 1;
  4138. \t\t}
  4139. \t\t.product-card {
  4140. \t\t\tbackground: white;
  4141. \t\t\tborder-radius: 15px;
  4142. \t\t\toverflow: hidden;
  4143. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  4144. \t\t\ttransition: all 0.3s ease;
  4145. \t\t\theight: 100%;
  4146. \t\t}
  4147. \t\t.product-card:hover {
  4148. \t\t\ttransform: translateY(-5px);
  4149. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  4150. \t\t}
  4151. \t\t.product-image {
  4152. \t\t\theight: 250px;
  4153. \t\t\tbackground-size: cover;
  4154. \t\t\tbackground-position: center;
  4155. \t\t\tposition: relative;
  4156. \t\t}
  4157. \t\t.product-badge {
  4158. \t\t\tposition: absolute;
  4159. \t\t\ttop: 15px;
  4160. \t\t\tright: 15px;
  4161. \t\t\tbackground: #ffa200;
  4162. \t\t\tcolor: white;
  4163. \t\t\tpadding: 5px 10px;
  4164. \t\t\tborder-radius: 20px;
  4165. \t\t\tfont-size: 0.8rem;
  4166. \t\t\tfont-weight: bold;
  4167. \t\t}
  4168. \t\t.product-info {
  4169. \t\t\tpadding: 20px;
  4170. \t\t}
  4171. \t\t.product-title {
  4172. \t\t\tfont-size: 1.2rem;
  4173. \t\t\tfont-weight: 600;
  4174. \t\t\tmargin-bottom: 10px;
  4175. \t\t\tcolor: #333;
  4176. \t\t}
  4177. \t\t.product-price {
  4178. \t\t\tfont-size: 1.5rem;
  4179. \t\t\tfont-weight: bold;
  4180. \t\t\tcolor: #ffa200;
  4181. \t\t\tmargin-bottom: 10px;
  4182. \t\t}
  4183. \t\t.product-shop {
  4184. \t\t\tfont-size: 0.9rem;
  4185. \t\t\tcolor: #666;
  4186. \t\t\tmargin-bottom: 15px;
  4187. \t\t}
  4188. \t\t.btn-primary-custom {
  4189. \t\t\tbackground: #ffa200;
  4190. \t\t\tborder: none;
  4191. \t\t\tcolor: white;
  4192. \t\t\tpadding: 12px 30px;
  4193. \t\t\tborder-radius: 25px;
  4194. \t\t\tfont-weight: 500;
  4195. \t\t\ttransition: all 0.3s ease;
  4196. \t\t}
  4197. \t\t.btn-primary-custom:hover {
  4198. \t\t\tbackground: #e8910a;
  4199. \t\t\ttransform: translateY(-2px);
  4200. \t\t\tbox-shadow: 0 5px 15px rgba(255, 162, 0, 0.3);
  4201. \t\t}
  4202. \t\t.section-title {
  4203. \t\t\ttext-align: center;
  4204. \t\t\tmargin-bottom: 50px;
  4205. \t\t}
  4206. \t\t.section-title h2 {
  4207. \t\t\tfont-size: 2.5rem;
  4208. \t\t\tfont-weight: bold;
  4209. \t\t\tcolor: #333;
  4210. \t\t\tmargin-bottom: 15px;
  4211. \t\t}
  4212. \t\t.section-title p {
  4213. \t\t\tfont-size: 1.2rem;
  4214. \t\t\tcolor: #666;
  4215. \t\t\tmax-width: 600px;
  4216. \t\t\tmargin: 0 auto;
  4217. \t\t}
  4218. \t\t.feature-card {
  4219. \t\t\ttext-align: center;
  4220. \t\t\tpadding: 30px 20px;
  4221. \t\t\tbackground: white;
  4222. \t\t\tborder-radius: 15px;
  4223. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  4224. \t\t\ttransition: all 0.3s ease;
  4225. \t\t\theight: 100%;
  4226. \t\t}
  4227. \t\t.feature-card:hover {
  4228. \t\t\ttransform: translateY(-5px);
  4229. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  4230. \t\t}
  4231. \t\t.feature-icon {
  4232. \t\t\twidth: 80px;
  4233. \t\t\theight: 80px;
  4234. \t\t\tbackground: linear-gradient(135deg, #ffa200, #e8910a);
  4235. \t\t\tborder-radius: 50%;
  4236. \t\t\tdisplay: flex;
  4237. \t\t\talign-items: center;
  4238. \t\t\tjustify-content: center;
  4239. \t\t\tmargin: 0 auto 20px;
  4240. \t\t\tfont-size: 2rem;
  4241. \t\t\tcolor: white;
  4242. \t\t}
  4243. \t\t.newsletter-section {
  4244. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  4245. \t\t\tcolor: white;
  4246. \t\t\tpadding: 80px 0;
  4247. \t\t}
  4248. \t\t.newsletter-form {
  4249. \t\t\tmax-width: 500px;
  4250. \t\t\tmargin: 0 auto;
  4251. \t\t}
  4252. \t\t.newsletter-form .form-control {
  4253. \t\t\tborder: none;
  4254. \t\t\tborder-radius: 25px;
  4255. \t\t\tpadding: 15px 25px;
  4256. \t\t\tfont-size: 1.1rem;
  4257. \t\t}
  4258. \t\t.newsletter-form .btn {
  4259. \t\t\tborder-radius: 25px;
  4260. \t\t\tpadding: 15px 30px;
  4261. \t\t\tfont-weight: 500;
  4262. \t\t}
  4263. \t\t/* Styles pour les catégories personnalisées */
  4264. \t\t.category-card-custom {
  4265. \t\t\tbackground: white;
  4266. \t\t\tborder-radius: 15px;
  4267. \t\t\toverflow: hidden;
  4268. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  4269. \t\t\ttransition: all 0.3s ease;
  4270. \t\t\theight: 100%;
  4271. \t\t\tdisplay: flex;
  4272. \t\t\tflex-direction: column;
  4273. \t\t}
  4274. \t\t.category-card-custom:hover {
  4275. \t\t\ttransform: translateY(-5px);
  4276. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  4277. \t\t}
  4278. \t\t.category-image-wrapper {
  4279. \t\t\tposition: relative;
  4280. \t\t\toverflow: hidden;
  4281. \t\t}
  4282. \t\t.category-image {
  4283. \t\t\theight: 200px;
  4284. \t\t\tbackground-size: cover;
  4285. \t\t\tbackground-position: center;
  4286. \t\t\tposition: relative;
  4287. \t\t\ttransition: transform 0.5s ease;
  4288. \t\t}
  4289. \t\t.category-card-custom:hover .category-image {
  4290. \t\t\ttransform: scale(1.1);
  4291. \t\t}
  4292. \t\t.category-overlay-custom {
  4293. \t\t\tposition: absolute;
  4294. \t\t\ttop: 0;
  4295. \t\t\tleft: 0;
  4296. \t\t\tright: 0;
  4297. \t\t\tbottom: 0;
  4298. \t\t\tbackground: rgba(0, 0, 0, 0.5);
  4299. \t\t\tdisplay: flex;
  4300. \t\t\talign-items: center;
  4301. \t\t\tjustify-content: center;
  4302. \t\t\topacity: 0;
  4303. \t\t\ttransition: opacity 0.3s ease;
  4304. \t\t}
  4305. \t\t.category-card-custom:hover .category-overlay-custom {
  4306. \t\t\topacity: 1;
  4307. \t\t}
  4308. \t\t.category-icon-wrapper {
  4309. \t\t\ttext-align: center;
  4310. \t\t\tcolor: white;
  4311. \t\t\ttransform: translateY(20px);
  4312. \t\t\ttransition: transform 0.3s ease;
  4313. \t\t}
  4314. \t\t.category-card-custom:hover .category-icon-wrapper {
  4315. \t\t\ttransform: translateY(0);
  4316. \t\t}
  4317. \t\t.category-content {
  4318. \t\t\tflex-grow: 1;
  4319. \t\t\tdisplay: flex;
  4320. \t\t\tflex-direction: column;
  4321. \t\t}
  4322. \t\t.category-content .btn {
  4323. \t\t\tmargin-top: auto;
  4324. \t\t}
  4325. \t\t/* Responsive Styles */
  4326. \t\t@media(max-width: 991.98px) {
  4327. \t\t\t.hero-banner {
  4328. \t\t\t\tpadding: 60px 0;
  4329. \t\t\t}
  4330. \t\t\t.stats-number {
  4331. \t\t\t\tfont-size: 2.5rem;
  4332. \t\t\t}
  4333. \t\t\t.section-title h2 {
  4334. \t\t\t\tfont-size: 2rem;
  4335. \t\t\t}
  4336. \t\t\t
  4337. \t\t\t.stats-card {
  4338. \t\t\t\tmargin-bottom: 1.5rem;
  4339. \t\t\t}
  4340. \t\t}
  4341. \t\t@media(max-width: 767.98px) {
  4342. \t\t\t.hero-banner {
  4343. \t\t\t\tpadding: 40px 0;
  4344. \t\t\t}
  4345. \t\t\t.hero-content h1 {
  4346. \t\t\t\tfont-size: 1.75rem;
  4347. \t\t\t}
  4348. \t\t\t.stats-number {
  4349. \t\t\t\tfont-size: 2rem;
  4350. \t\t\t}
  4351. \t\t\t.stats-label {
  4352. \t\t\t\tfont-size: 0.9rem;
  4353. \t\t\t}
  4354. \t\t\t.section-title h2 {
  4355. \t\t\t\tfont-size: 1.75rem;
  4356. \t\t\t}
  4357. \t\t\t.section-title p {
  4358. \t\t\t\tfont-size: 1rem;
  4359. \t\t\t}
  4360. \t\t\t
  4361. \t\t\t.category-card,
  4362. \t\t\t.product-card {
  4363. \t\t\t\tmargin-bottom: 1.5rem;
  4364. \t\t\t}
  4365. \t\t\t
  4366. \t\t\t.category-image {
  4367. \t\t\t\theight: 150px;
  4368. \t\t\t}
  4369. \t\t\t
  4370. \t\t\t.product-image {
  4371. \t\t\t\theight: 200px;
  4372. \t\t\t}
  4373. \t\t\t
  4374. \t\t\t.feature-card {
  4375. \t\t\t\tmargin-bottom: 1.5rem;
  4376. \t\t\t}
  4377. \t\t\t
  4378. \t\t\t.newsletter-section {
  4379. \t\t\t\tpadding: 40px 0;
  4380. \t\t\t}
  4381. \t\t}
  4382. \t\t@media(max-width: 575.98px) {
  4383. \t\t\t.hero-banner {
  4384. \t\t\t\tpadding: 30px 0;
  4385. \t\t\t}
  4386. \t\t\t.hero-content h1 {
  4387. \t\t\t\tfont-size: 1.5rem;
  4388. \t\t\t}
  4389. \t\t\t.stats-card {
  4390. \t\t\t\tpadding: 1.5rem;
  4391. \t\t\t}
  4392. \t\t\t.stats-number {
  4393. \t\t\t\tfont-size: 1.75rem;
  4394. \t\t\t}
  4395. \t\t\t.section-title h2 {
  4396. \t\t\t\tfont-size: 1.5rem;
  4397. \t\t\t}
  4398. \t\t\t
  4399. \t\t\t.category-image {
  4400. \t\t\t\theight: 120px;
  4401. \t\t\t}
  4402. \t\t\t
  4403. \t\t\t.product-image {
  4404. \t\t\t\theight: 180px;
  4405. \t\t\t}
  4406. \t\t\t
  4407. \t\t\t.product-info {
  4408. \t\t\t\tpadding: 1rem;
  4409. \t\t\t}
  4410. \t\t\t
  4411. \t\t\t.product-title {
  4412. \t\t\t\tfont-size: 1rem;
  4413. \t\t\t}
  4414. \t\t\t
  4415. \t\t\t.product-price {
  4416. \t\t\t\tfont-size: 1.25rem;
  4417. \t\t\t}
  4418. \t\t}
  4419. \t\t/* Styles modernes pour le carousel de bannière */
  4420. \t\t.banner-area-modern {
  4421. \t\t\tposition: relative;
  4422. \t\t\twidth: 100%;
  4423. \t\t\tmin-height: 500px;
  4424. \t\t\tbackground: url('{{ asset('ui/img/banner/banner-bg.jpg') }}') center center no-repeat;
  4425. \t\t\tbackground-size: cover;
  4426. \t\t\toverflow: hidden;
  4427. \t\t\tpadding: 60px 0;
  4428. \t\t}
  4429. \t\t.banner-area-modern::before {
  4430. \t\t\tcontent: '';
  4431. \t\t\tposition: absolute;
  4432. \t\t\ttop: 0;
  4433. \t\t\tleft: 0;
  4434. \t\t\twidth: 100%;
  4435. \t\t\theight: 100%;
  4436. \t\t\tbackground: rgba(0, 0, 0, 0.1);
  4437. \t\t\tz-index: 1;
  4438. \t\t}
  4439. \t\t.banner-carousel-wrapper {
  4440. \t\t\tposition: relative;
  4441. \t\t\twidth: 100%;
  4442. \t\t\theight: 100%;
  4443. \t\t\tz-index: 2;
  4444. \t\t}
  4445. \t\t.banner-slide-item {
  4446. \t\t\tmin-height: 500px;
  4447. \t\t\tdisplay: flex;
  4448. \t\t\talign-items: center;
  4449. \t\t\tpadding: 40px 0;
  4450. \t\t}
  4451. \t\t.banner-content-modern {
  4452. \t\t\tposition: relative;
  4453. \t\t\tz-index: 2;
  4454. \t\t\tpadding: 30px;
  4455. \t\t\tbackground: rgba(255, 255, 255, 0.98);
  4456. \t\t\tborder-radius: 20px;
  4457. \t\t\tbox-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
  4458. \t\t\tbackdrop-filter: blur(10px);
  4459. \t\t\tanimation: fadeInUp 0.8s ease;
  4460. \t\t}
  4461. \t\t@keyframes fadeInUp {
  4462. \t\t\tfrom {
  4463. \t\t\t\topacity: 0;
  4464. \t\t\t\ttransform: translateY(30px);
  4465. \t\t\t}
  4466. \t\t\tto {
  4467. \t\t\t\topacity: 1;
  4468. \t\t\t\ttransform: translateY(0);
  4469. \t\t\t}
  4470. \t\t}
  4471. \t\t.banner-badge {
  4472. \t\t\tdisplay: inline-block;
  4473. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  4474. \t\t\tcolor: white;
  4475. \t\t\tpadding: 8px 20px;
  4476. \t\t\tborder-radius: 50px;
  4477. \t\t\tfont-size: 0.85rem;
  4478. \t\t\tfont-weight: 600;
  4479. \t\t\tmargin-bottom: 20px;
  4480. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  4481. \t\t}
  4482. \t\t.banner-badge i {
  4483. \t\t\tmargin-right: 5px;
  4484. \t\t}
  4485. \t\t.banner-title-modern {
  4486. \t\t\tfont-size: 2.0rem;
  4487. \t\t\tfont-weight: 600;
  4488. \t\t\tcolor: #2c3e50;
  4489. \t\t\tmargin-bottom: 20px;
  4490. \t\t\tline-height: 1.2;
  4491. \t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  4492. \t\t\t-webkit-background-clip: text;
  4493. \t\t\t-webkit-text-fill-color: transparent;
  4494. \t\t\tbackground-clip: text;
  4495. \t\t}
  4496. \t\t.banner-description-modern {
  4497. \t\t\tfont-size: 1.1rem;
  4498. \t\t\tcolor: #555;
  4499. \t\t\tline-height: 1.8;
  4500. \t\t\tmargin-bottom: 25px;
  4501. \t\t}
  4502. \t\t.banner-price-modern {
  4503. \t\t\tdisplay: flex;
  4504. \t\t\talign-items: center;
  4505. \t\t\tgap: 15px;
  4506. \t\t\tmargin-bottom: 30px;
  4507. \t\t\tpadding: 15px 20px;
  4508. \t\t\tbackground: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  4509. \t\t\tborder-radius: 12px;
  4510. \t\t\tborder-left: 4px solid #ffa200;
  4511. \t\t}
  4512. \t\t.banner-price-modern .price-label {
  4513. \t\t\tfont-size: 0.9rem;
  4514. \t\t\tcolor: #666;
  4515. \t\t\tfont-weight: 600;
  4516. \t\t\ttext-transform: uppercase;
  4517. \t\t\tletter-spacing: 1px;
  4518. \t\t}
  4519. \t\t.banner-price-modern .price-value {
  4520. \t\t\tfont-size: 1.2rem;
  4521. \t\t\tfont-weight: 600;
  4522. \t\t\tcolor: #ffa200;
  4523. \t\t}
  4524. \t\t.banner-actions-modern {
  4525. \t\t\tdisplay: flex;
  4526. \t\t\tgap: 15px;
  4527. \t\t\tflex-wrap: wrap;
  4528. \t\t}
  4529. \t\t.btn-banner-primary {
  4530. \t\t\tdisplay: inline-flex;
  4531. \t\t\talign-items: center;
  4532. \t\t\tgap: 10px;
  4533. \t\t\tpadding: 15px 35px;
  4534. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  4535. \t\t\tcolor: white;
  4536. \t\t\ttext-decoration: none;
  4537. \t\t\tborder-radius: 50px;
  4538. \t\t\tfont-weight: 600;
  4539. \t\t\tfont-size: 1rem;
  4540. \t\t\ttransition: all 0.3s ease;
  4541. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  4542. \t\t}
  4543. \t\t.btn-banner-primary:hover {
  4544. \t\t\ttransform: translateY(-3px);
  4545. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.6);
  4546. \t\t\tcolor: white;
  4547. \t\t}
  4548. \t\t.btn-banner-primary .btn-icon {
  4549. \t\t\ttransition: transform 0.3s ease;
  4550. \t\t}
  4551. \t\t.btn-banner-primary:hover .btn-icon {
  4552. \t\t\ttransform: translateX(5px);
  4553. \t\t}
  4554. \t\t.btn-banner-secondary {
  4555. \t\t\tdisplay: inline-flex;
  4556. \t\t\talign-items: center;
  4557. \t\t\tgap: 8px;
  4558. \t\t\tpadding: 15px 25px;
  4559. \t\t\tbackground: white;
  4560. \t\t\tcolor: #667eea;
  4561. \t\t\ttext-decoration: none;
  4562. \t\t\tborder-radius: 50px;
  4563. \t\t\tfont-weight: 600;
  4564. \t\t\tfont-size: 0.95rem;
  4565. \t\t\tborder: 2px solid #667eea;
  4566. \t\t\ttransition: all 0.3s ease;
  4567. \t\t}
  4568. \t\t.btn-banner-secondary:hover {
  4569. \t\t\tbackground: #667eea;
  4570. \t\t\tcolor: white;
  4571. \t\t\ttransform: translateY(-3px);
  4572. \t\t\tbox-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
  4573. \t\t}
  4574. \t\t.banner-image-modern {
  4575. \t\t\tposition: relative;
  4576. \t\t\theight: 450px;
  4577. \t\t\tdisplay: flex;
  4578. \t\t\talign-items: center;
  4579. \t\t\tjustify-content: center;
  4580. \t\t}
  4581. \t\t.banner-image-wrapper {
  4582. \t\t\tposition: relative;
  4583. \t\t\twidth: 100%;
  4584. \t\t\theight: 100%;
  4585. \t\t\tborder-radius: 20px;
  4586. \t\t\toverflow: hidden;
  4587. \t\t\tbox-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
  4588. \t\t\tbackground: white;
  4589. \t\t\tpadding: 20px;
  4590. \t\t}
  4591. \t\t.banner-img {
  4592. \t\t\twidth: 100%;
  4593. \t\t\theight: 100%;
  4594. \t\t\tobject-fit: contain;
  4595. \t\t\tborder-radius: 15px;
  4596. \t\t\ttransition: transform 0.5s ease;
  4597. \t\t}
  4598. \t\t.banner-slide-item:hover .banner-img {
  4599. \t\t\ttransform: scale(1.05);
  4600. \t\t}
  4601. \t\t.banner-image-overlay {
  4602. \t\t\tposition: absolute;
  4603. \t\t\ttop: 0;
  4604. \t\t\tleft: 0;
  4605. \t\t\twidth: 100%;
  4606. \t\t\theight: 100%;
  4607. \t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
  4608. \t\t\tborder-radius: 15px;
  4609. \t\t\tpointer-events: none;
  4610. \t\t}
  4611. \t\t/* Styles pour Owl Carousel */
  4612. \t\t.banner-area-modern .owl-nav {
  4613. \t\t\tposition: absolute;
  4614. \t\t\ttop: 50%;
  4615. \t\t\ttransform: translateY(-50%);
  4616. \t\t\twidth: 100%;
  4617. \t\t\tdisplay: flex;
  4618. \t\t\tjustify-content: space-between;
  4619. \t\t\talign-items: center;
  4620. \t\t\tpadding: 0 20px;
  4621. \t\t\tpointer-events: none;
  4622. \t\t\tz-index: 10;
  4623. \t\t\tleft: 0;
  4624. \t\t\tright: 0;
  4625. \t\t\tbox-sizing: border-box;
  4626. \t\t}
  4627. \t\t.banner-area-modern .owl-nav button {
  4628. \t\t\twidth: 60px;
  4629. \t\t\theight: 60px;
  4630. \t\t\tmin-width: 60px;
  4631. \t\t\tmin-height: 60px;
  4632. \t\t\tbackground: #ffa200 !important;
  4633. \t\t\tborder-radius: 50% !important;
  4634. \t\t\tdisplay: flex !important;
  4635. \t\t\talign-items: center;
  4636. \t\t\tjustify-content: center;
  4637. \t\t\tcolor: white !important;
  4638. \t\t\tfont-size: 24px !important;
  4639. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  4640. \t\t\ttransition: all 0.3s ease;
  4641. \t\t\tpointer-events: all;
  4642. \t\t\tborder: none !important;
  4643. \t\t\tposition: relative;
  4644. \t\t\tflex-shrink: 0;
  4645. \t\t\tmargin: 0;
  4646. \t\t\tpadding: 0;
  4647. \t\t\tline-height: 1;
  4648. \t\t}
  4649. \t\t.banner-area-modern .owl-nav button.owl-prev {
  4650. \t\t\tmargin-right: auto;
  4651. \t\t}
  4652. \t\t.banner-area-modern .owl-nav button.owl-next {
  4653. \t\t\tmargin-left: auto;
  4654. \t\t}
  4655. \t\t.banner-area-modern .owl-nav button:hover {
  4656. \t\t\tbackground: #ff6b00 !important;
  4657. \t\t\tcolor: white !important;
  4658. \t\t\ttransform: scale(1.1);
  4659. \t\t\tbox-shadow: 0 6px 20px rgba(255, 162, 0, 0.6);
  4660. \t\t}
  4661. \t\t.banner-area-modern .owl-nav button.disabled {
  4662. \t\t\topacity: 0.5;
  4663. \t\t\tcursor: not-allowed;
  4664. \t\t}
  4665. \t\t.banner-area-modern .owl-nav button.disabled:hover {
  4666. \t\t\ttransform: scale(1);
  4667. \t\t}
  4668. \t\t.banner-area-modern .owl-dots {
  4669. \t\t\tposition: absolute;
  4670. \t\t\tbottom: 30px;
  4671. \t\t\tleft: 50%;
  4672. \t\t\ttransform: translateX(-50%);
  4673. \t\t\tdisplay: flex;
  4674. \t\t\tgap: 10px;
  4675. \t\t\tz-index: 10;
  4676. \t\t}
  4677. \t\t.banner-area-modern .owl-dots button {
  4678. \t\t\twidth: 12px;
  4679. \t\t\theight: 12px;
  4680. \t\t\tborder-radius: 50%;
  4681. \t\t\tbackground: rgba(255, 255, 255, 0.6) !important;
  4682. \t\t\tborder: 2px solid white !important;
  4683. \t\t\ttransition: all 0.3s ease;
  4684. \t\t\tmargin: 0 5px;
  4685. \t\t}
  4686. \t\t.banner-area-modern .owl-dots button.active {
  4687. \t\t\tbackground: #ffa200 !important;
  4688. \t\t\tborder-color: #ffa200 !important;
  4689. \t\t\twidth: 30px;
  4690. \t\t\tborder-radius: 6px;
  4691. \t\t}
  4692. \t\t/* Responsive */
  4693. \t\t@media(max-width: 992px) {
  4694. \t\t\t.banner-area-modern {
  4695. \t\t\t\tmin-height: 450px;
  4696. \t\t\t\tpadding: 40px 0;
  4697. \t\t\t\tbackground-size: cover;
  4698. \t\t\t\tbackground-position: center;
  4699. \t\t\t}
  4700. \t\t\t.banner-slide-item {
  4701. \t\t\t\tmin-height: 450px;
  4702. \t\t\t\tpadding: 30px 0;
  4703. \t\t\t}
  4704. \t\t\t.banner-title-modern {
  4705. \t\t\t\tfont-size: 1.5rem;
  4706. \t\t\t}
  4707. \t\t\t.banner-description-modern {
  4708. \t\t\t\tfont-size: 1rem;
  4709. \t\t\t}
  4710. \t\t\t.banner-image-modern {
  4711. \t\t\t\theight: 350px;
  4712. \t\t\t\tmargin-top: 30px;
  4713. \t\t\t}
  4714. \t\t\t.banner-content-modern {
  4715. \t\t\t\tpadding: 25px;
  4716. \t\t\t}
  4717. \t\t}
  4718. \t\t@media(max-width: 768px) {
  4719. \t\t\t.banner-area-modern {
  4720. \t\t\t\tmin-height: 400px;
  4721. \t\t\t\tpadding: 30px 0;
  4722. \t\t\t\tbackground-size: cover;
  4723. \t\t\t\tbackground-position: center;
  4724. \t\t\t}
  4725. \t\t\t.banner-slide-item {
  4726. \t\t\t\tmin-height: 400px;
  4727. \t\t\t\tpadding: 20px 0;
  4728. \t\t\t}
  4729. \t\t\t.banner-title-modern {
  4730. \t\t\t\tfont-size: 1.25rem;
  4731. \t\t\t}
  4732. \t\t\t.banner-description-modern {
  4733. \t\t\t\tfont-size: 0.95rem;
  4734. \t\t\t}
  4735. \t\t\t.banner-image-modern {
  4736. \t\t\t\theight: 280px;
  4737. \t\t\t\tmargin-top: 20px;
  4738. \t\t\t}
  4739. \t\t\t.banner-content-modern {
  4740. \t\t\t\tpadding: 20px;
  4741. \t\t\t}
  4742. \t\t\t.banner-price-modern .price-value {
  4743. \t\t\t\tfont-size: 1.25rem;
  4744. \t\t\t}
  4745. \t\t\t.banner-actions-modern {
  4746. \t\t\t\tflex-direction: column;
  4747. \t\t\t}
  4748. \t\t\t.btn-banner-primary,
  4749. \t\t\t.btn-banner-secondary {
  4750. \t\t\t\twidth: 100%;
  4751. \t\t\t\tjustify-content: center;
  4752. \t\t\t}
  4753. \t\t\t.banner-area-modern .owl-nav button {
  4754. \t\t\t\twidth: 50px;
  4755. \t\t\t\theight: 50px;
  4756. \t\t\t\tmin-width: 50px;
  4757. \t\t\t\tmin-height: 50px;
  4758. \t\t\t\tfont-size: 20px !important;
  4759. \t\t\t\tbackground: #ffa200 !important;
  4760. \t\t\t}
  4761. \t\t\t.banner-area-modern .owl-nav button:hover {
  4762. \t\t\t\tbackground: #ff6b00 !important;
  4763. \t\t\t}
  4764. \t\t}
  4765. \t\t@media(max-width: 576px) {
  4766. \t\t\t.banner-area-modern {
  4767. \t\t\t\tmin-height: 350px;
  4768. \t\t\t\tpadding: 0;
  4769. \t\t\t\tbackground-size: cover;
  4770. \t\t\t\tbackground-position: center;
  4771. \t\t\t}
  4772. \t\t\t.banner-slide-item {
  4773. \t\t\t\tmin-height: 350px;
  4774. \t\t\t}
  4775. \t\t\t.banner-title-modern {
  4776. \t\t\t\tfont-size: 1.25rem;
  4777. \t\t\t}
  4778. \t\t\t.banner-image-modern {
  4779. \t\t\t\theight: 220px;
  4780. \t\t\t}
  4781. \t\t\t.banner-content-modern {
  4782. \t\t\t\tpadding: 15px;
  4783. \t\t\t}
  4784. \t\t}
  4785. \t\t/* Styles pour les catégories de boutiques cliquables */
  4786. \t\t.shop-category-clickable {
  4787. \t\t\tcursor: pointer;
  4788. \t\t\ttransition: all 0.3s ease;
  4789. \t\t\theight: 100%;
  4790. \t\t}
  4791. \t\t.shop-category-clickable:hover {
  4792. \t\t\ttransform: translateY(-10px);
  4793. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  4794. \t\t}
  4795. \t\t.shop-category-clickable:hover .category-image {
  4796. \t\t\ttransform: scale(1.1);
  4797. \t\t}
  4798. \t\t.shop-category-clickable:hover .btn-primary-custom {
  4799. \t\t\tbackground: #e8910a;
  4800. \t\t\ttransform: translateX(5px);
  4801. \t\t}
  4802. \t\t/* Styles pour les cartes de catégories personnalisées */
  4803. \t\t.category-card-custom {
  4804. \t\t\tborder-radius: 15px;
  4805. \t\t\toverflow: hidden;
  4806. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
  4807. \t\t\ttransition: transform 0.3s ease, box-shadow 0.3s ease;
  4808. \t\t\tbackground: white;
  4809. \t\t\theight: 100%;
  4810. \t\t}
  4811. \t\t.category-card-custom:hover {
  4812. \t\t\ttransform: translateY(-10px);
  4813. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  4814. \t\t}
  4815. \t\t.category-image-wrapper {
  4816. \t\t\tposition: relative;
  4817. \t\t\theight: 200px;
  4818. \t\t\toverflow: hidden;
  4819. \t\t}
  4820. \t\t.category-image {
  4821. \t\t\twidth: 100%;
  4822. \t\t\theight: 100%;
  4823. \t\t\tbackground-size: cover;
  4824. \t\t\tbackground-position: center;
  4825. \t\t\ttransition: transform 0.3s ease;
  4826. \t\t}
  4827. \t\t.category-card-custom:hover .category-image {
  4828. \t\t\ttransform: scale(1.1);
  4829. \t\t}
  4830. \t\t.category-overlay-custom {
  4831. \t\t\tposition: absolute;
  4832. \t\t\ttop: 0;
  4833. \t\t\tleft: 0;
  4834. \t\t\twidth: 100%;
  4835. \t\t\theight: 100%;
  4836. \t\t\tbackground: rgba(0, 0, 0, 0.6);
  4837. \t\t\tdisplay: flex;
  4838. \t\t\talign-items: center;
  4839. \t\t\tjustify-content: center;
  4840. \t\t\topacity: 0;
  4841. \t\t\ttransition: opacity 0.3s ease;
  4842. \t\t\tcolor: white;
  4843. \t\t}
  4844. \t\t.category-card-custom:hover .category-overlay-custom {
  4845. \t\t\topacity: 1;
  4846. \t\t}
  4847. \t\t.category-icon-wrapper {
  4848. \t\t\ttext-align: center;
  4849. \t\t}
  4850. \t\t.category-icon-wrapper i {
  4851. \t\t\tcolor: #ffa200;
  4852. \t\t\tdisplay: block;
  4853. \t\t}
  4854. \t\t.category-icon-wrapper h4 {
  4855. \t\t\tcolor: white;
  4856. \t\t\tmargin-top: 10px;
  4857. \t\t}
  4858. \t\t/* Styles pour la galerie de produits en vedette */
  4859. \t\t.featured-products-carousel-section {
  4860. \t\t\tposition: relative;
  4861. \t\t\toverflow: hidden;
  4862. \t\t}
  4863. \t\t.featured-gallery-wrapper {
  4864. \t\t\tposition: relative;
  4865. \t\t\tmax-width: 1400px;
  4866. \t\t\tmargin: 0 auto;
  4867. \t\t\tpadding: 0 15px;
  4868. \t\t}
  4869. \t\t.featured-gallery-container {
  4870. \t\t\tposition: relative;
  4871. \t\t\toverflow: visible;
  4872. \t\t\tborder-radius: 12px;
  4873. \t\t}
  4874. \t\t.featured-gallery-grid {
  4875. \t\t\tdisplay: flex;
  4876. \t\t\tgap: 30px;
  4877. \t\t\tpadding: 15px 0;
  4878. \t\t\toverflow-x: auto;
  4879. \t\t\toverflow-y: hidden;
  4880. \t\t\tscroll-behavior: smooth;
  4881. \t\t\tscroll-behavior: smooth;
  4882. \t\t\tscrollbar-width: none; /* Firefox */
  4883. \t\t\t-ms-overflow-style: none; /* IE/Edge */
  4884. \t\t\t-webkit-overflow-scrolling: touch; /* iOS smooth scroll */
  4885. \t\t\twill-change: scroll-position;
  4886. \t\t}
  4887. \t\t.featured-gallery-grid::-webkit-scrollbar {
  4888. \t\t\tdisplay: none; /* Chrome/Safari */
  4889. \t\t}
  4890. \t\t/* Mode OwlCarousel */
  4891. \t\t.featured-gallery-grid.owl-carousel {
  4892. \t\t\tdisplay: block;
  4893. \t\t\toverflow: hidden;
  4894. \t\t\tpadding: 25px 0;
  4895. \t\t}
  4896. \t\t.featured-gallery-grid.owl-carousel .owl-stage-outer {
  4897. \t\t\toverflow: visible;
  4898. \t\t}
  4899. \t\t.featured-gallery-grid.owl-carousel .featured-gallery-item {
  4900. \t\t\topacity: 1;
  4901. \t\t\ttransform: none;
  4902. \t\t\twidth: auto;
  4903. \t\t\tmax-width: none;
  4904. \t\t\tmargin: 0 15px;
  4905. \t\t}
  4906. \t\t.featured-gallery-grid.owl-carousel .owl-stage {
  4907. \t\t\tdisplay: flex;
  4908. \t\t}
  4909. \t\t.featured-gallery-item {
  4910. \t\t\tflex: 0 0 auto; /* Largeur automatique basée sur le contenu */
  4911. \t\t\twidth: 100%;
  4912. \t\t\tmax-width: 100%;
  4913. \t\t\topacity: 0;
  4914. \t\t\ttransform: translateY(20px) scale(0.95);
  4915. \t\t\tanimation: galleryItemFadeIn 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  4916. \t\t\tanimation-delay: calc(var(--item-index, 0) * 0.05s);
  4917. \t\t}
  4918. \t\t/* Produits plus larges et esthétiques - 3 par ligne sur grands écrans */
  4919. \t\t@media(min-width: 1200px) {
  4920. \t\t\t.featured-gallery-item {
  4921. \t\t\t\tflex: 0 0 calc(33.333333% - 20px);
  4922. \t\t\t\tmax-width: calc(33.333333% - 20px);
  4923. \t\t\t}
  4924. \t\t}
  4925. \t\t@media(min-width: 992px) and (max-width: 1199px) {
  4926. \t\t\t.featured-gallery-item {
  4927. \t\t\t\tflex: 0 0 calc(33.333333% - 20px);
  4928. \t\t\t\tmax-width: calc(33.333333% - 20px);
  4929. \t\t\t}
  4930. \t\t}
  4931. \t\t@media(min-width: 768px) and (max-width: 991px) {
  4932. \t\t\t.featured-gallery-item {
  4933. \t\t\t\tflex: 0 0 calc(50% - 15px);
  4934. \t\t\t\tmax-width: calc(50% - 15px);
  4935. \t\t\t}
  4936. \t\t}
  4937. \t\t@media(max-width: 767px) {
  4938. \t\t\t.featured-gallery-item {
  4939. \t\t\t\tflex: 0 0 100%;
  4940. \t\t\t\tmax-width: 100%;
  4941. \t\t\t}
  4942. \t\t}
  4943. \t\t/* Design amélioré pour single-product - plus large et esthétique */
  4944. \t\t.featured-gallery-item .single-product {
  4945. \t\t\tmargin-bottom: 0;
  4946. \t\t\tmin-height: 520px;
  4947. \t\t\tdisplay: flex;
  4948. \t\t\tflex-direction: column;
  4949. \t\t\tpadding: 25px;
  4950. \t\t\tbackground: #fff;
  4951. \t\t\tborder-radius: 16px;
  4952. \t\t\tbox-shadow: 0 8px 25px rgba(15, 34, 58, 0.1);
  4953. \t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  4954. \t\t\tborder: 1px solid rgba(0, 0, 0, 0.05);
  4955. \t\t\tposition: relative;
  4956. \t\t\toverflow: hidden;
  4957. \t\t}
  4958. \t\t.featured-gallery-item .single-product::before {
  4959. \t\t\tcontent: '';
  4960. \t\t\tposition: absolute;
  4961. \t\t\ttop: 0;
  4962. \t\t\tleft: 0;
  4963. \t\t\tright: 0;
  4964. \t\t\theight: 4px;
  4965. \t\t\tbackground: linear-gradient(90deg, #ffa200 0%, #ff6b00 100%);
  4966. \t\t\ttransform: scaleX(0);
  4967. \t\t\ttransform-origin: left;
  4968. \t\t\ttransition: transform 0.4s ease;
  4969. \t\t}
  4970. \t\t.featured-gallery-item .single-product:hover {
  4971. \t\t\ttransform: translateY(-8px);
  4972. \t\t\tbox-shadow: 0 20px 50px rgba(15, 34, 58, 0.15);
  4973. \t\t\tborder-color: rgba(255, 162, 0, 0.3);
  4974. \t\t}
  4975. \t\t.featured-gallery-item .single-product:hover::before {
  4976. \t\t\ttransform: scaleX(1);
  4977. \t\t}
  4978. \t\t/* S'assurer que les images s'affichent correctement - styles identiques à listing.html.twig */
  4979. \t\t.featured-gallery-item .single-product img {
  4980. \t\t\tmargin-bottom: 20px;
  4981. \t\t\twidth: 100%;
  4982. \t\t}
  4983. \t\t/* Styles améliorés pour product-image-container - plus large et esthétique */
  4984. \t\t.featured-gallery-item .product-image-container {
  4985. \t\t\tposition: relative;
  4986. \t\t\toverflow: hidden;
  4987. \t\t\tborder-radius: 14px;
  4988. \t\t\theight: 320px;
  4989. \t\t\tdisplay: flex;
  4990. \t\t\talign-items: center;
  4991. \t\t\tjustify-content: center;
  4992. \t\t\tbackground: linear-gradient(135deg, #f7f7fb 0%, #e8ecf1 100%);
  4993. \t\t\tmargin-bottom: 22px;
  4994. \t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
  4995. \t\t}
  4996. \t\t.featured-gallery-item .product-image-container:hover {
  4997. \t\t\tbox-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
  4998. \t\t}
  4999. \t\t.featured-gallery-item .product-image-container:hover .main-product-img {
  5000. \t\t\ttransform: scale(1.08);
  5001. \t\t\ttransition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  5002. \t\t}
  5003. \t\t.featured-gallery-item .product-image-container a {
  5004. \t\t\tdisplay: block;
  5005. \t\t\twidth: 100%;
  5006. \t\t\theight: 100%;
  5007. \t\t}
  5008. \t\t.featured-gallery-item .main-product-img {
  5009. \t\t\ttransition: transform 0.3s ease;
  5010. \t\t\twidth: 100% !important;
  5011. \t\t\theight: 100% !important;
  5012. \t\t\tobject-fit: cover;
  5013. \t\t\tobject-position: center;
  5014. \t\t\tdisplay: block;
  5015. \t\t\twill-change: transform, opacity;
  5016. \t\t}
  5017. \t\t.featured-gallery-item .main-product-img.image-fade {
  5018. \t\t\tanimation: imageFade 0.5s ease;
  5019. \t\t}
  5020. \t\t@keyframes imageFade {
  5021. \t\t\tfrom {
  5022. \t\t\t\topacity: 0;
  5023. \t\t\t\ttransform: scale(1.02);
  5024. \t\t\t}
  5025. \t\t\tto {
  5026. \t\t\t\topacity: 1;
  5027. \t\t\t\ttransform: scale(1);
  5028. \t\t\t}
  5029. \t\t}
  5030. \t\t.featured-gallery-item .product-details {
  5031. \t\t\tdisplay: flex;
  5032. \t\t\tflex-direction: column;
  5033. \t\t\theight: 100%;
  5034. \t\t\tpadding: 0 5px;
  5035. \t\t}
  5036. \t\t.featured-gallery-item .product-details h6 {
  5037. \t\t\tfont-size: 1.1rem;
  5038. \t\t\tfont-weight: 600;
  5039. \t\t\tmargin-bottom: 12px;
  5040. \t\t\tline-height: 1.4;
  5041. \t\t\tcolor: #2c3e50;
  5042. \t\t\tmin-height: 48px;
  5043. \t\t}
  5044. \t\t.featured-gallery-item .product-details h6 a {
  5045. \t\t\tcolor: #2c3e50;
  5046. \t\t\ttext-decoration: none;
  5047. \t\t\ttransition: color 0.3s ease;
  5048. \t\t}
  5049. \t\t.featured-gallery-item .product-details h6 a:hover {
  5050. \t\t\tcolor: #ffa200;
  5051. \t\t}
  5052. \t\t.featured-gallery-item .prd-bottom {
  5053. \t\t\tmargin-top: auto;
  5054. \t\t}
  5055. \t\t/* Styles pour img-nav-btn - identiques à listing.html.twig */
  5056. \t\t.featured-gallery-item .img-nav-btn {
  5057. \t\t\tposition: absolute;
  5058. \t\t\ttop: 50%;
  5059. \t\t\ttransform: translateY(-50%);
  5060. \t\t\tbackground: rgba(0, 0, 0, 0.6);
  5061. \t\t\tcolor: white;
  5062. \t\t\tborder: none;
  5063. \t\t\twidth: 35px;
  5064. \t\t\theight: 35px;
  5065. \t\t\tborder-radius: 50%;
  5066. \t\t\tdisplay: flex;
  5067. \t\t\talign-items: center;
  5068. \t\t\tjustify-content: center;
  5069. \t\t\tcursor: pointer;
  5070. \t\t\ttransition: all 0.3s ease;
  5071. \t\t\tz-index: 10;
  5072. \t\t}
  5073. \t\t.featured-gallery-item .img-nav-btn:hover {
  5074. \t\t\tbackground: #095ad3;
  5075. \t\t\ttransform: translateY(-50%) scale(1.1);
  5076. \t\t}
  5077. \t\t.featured-gallery-item .img-nav-left {
  5078. \t\t\tleft: 10px;
  5079. \t\t}
  5080. \t\t.featured-gallery-item .img-nav-right {
  5081. \t\t\tright: 10px;
  5082. \t\t}
  5083. \t\t.featured-gallery-item .img-indicators {
  5084. \t\t\tposition: absolute;
  5085. \t\t\tbottom: 10px;
  5086. \t\t\tleft: 50%;
  5087. \t\t\ttransform: translateX(-50%);
  5088. \t\t\tdisplay: flex;
  5089. \t\t\tgap: 5px;
  5090. \t\t\tz-index: 10;
  5091. \t\t}
  5092. \t\t.featured-gallery-item .indicator {
  5093. \t\t\twidth: 8px;
  5094. \t\t\theight: 8px;
  5095. \t\t\tborder-radius: 50%;
  5096. \t\t\tbackground: rgba(255, 255, 255, 0.5);
  5097. \t\t\tcursor: pointer;
  5098. \t\t\tmargin-bottom: 10px;
  5099. \t\t\ttransition: all 0.3s ease;
  5100. \t\t\tborder: 1px solid rgba(255, 255, 255, 0.3);
  5101. \t\t}
  5102. \t\t.featured-gallery-item .indicator.active {
  5103. \t\t\tbackground: #ffa200;
  5104. \t\t\tborder-color: #ffa200;
  5105. \t\t\ttransform: scale(1.2);
  5106. \t\t}
  5107. \t\t.featured-gallery-item .indicator:hover {
  5108. \t\t\tbackground: rgba(255, 255, 255, 0.8);
  5109. \t\t}
  5110. \t\t/* Styles pour shop-info - identiques à listing.html.twig */
  5111. \t\t.featured-gallery-item .shop-info {
  5112. \t\t\tmargin: 10px 0 15px 0;
  5113. \t\t\tpadding: 8px 0;
  5114. \t\t\tborder-bottom: 1px solid #f0f0f0;
  5115. \t\t}
  5116. \t\t.featured-gallery-item .shop-info small {
  5117. \t\t\tfont-size: 0.9rem;
  5118. \t\t}
  5119. \t\t.featured-gallery-item .shop-link {
  5120. \t\t\tcolor: #007bff;
  5121. \t\t\ttext-decoration: none;
  5122. \t\t\tfont-weight: 500;
  5123. \t\t}
  5124. \t\t.featured-gallery-item .shop-link:hover {
  5125. \t\t\tcolor: #ffa200;
  5126. \t\t\ttext-decoration: underline;
  5127. \t\t}
  5128. \t\t/* Styles améliorés pour le prix */
  5129. \t\t.featured-gallery-item .price {
  5130. \t\t\tmargin-bottom: 18px;
  5131. \t\t}
  5132. \t\t.featured-gallery-item .price h6 {
  5133. \t\t\tfont-size: 1.4rem;
  5134. \t\t\tfont-weight: 700;
  5135. \t\t\tcolor: #ffa200;
  5136. \t\t\tmargin-bottom: 5px;
  5137. \t\t}
  5138. \t\t.featured-gallery-item .price h6.l-through {
  5139. \t\t\tfont-size: 1rem;
  5140. \t\t\tcolor: #95a5a6;
  5141. \t\t\ttext-decoration: line-through;
  5142. \t\t\tfont-weight: 500;
  5143. \t\t}
  5144. \t\t/* Les autres styles (prd-bottom, social-info) sont déjà définis dans main.css */
  5145. \t\t@keyframes galleryItemFadeIn {
  5146. \t\t\tfrom {
  5147. \t\t\t\topacity: 0;
  5148. \t\t\t\ttransform: translateY(20px) scale(0.95);
  5149. \t\t\t}
  5150. \t\t\tto {
  5151. \t\t\t\topacity: 1;
  5152. \t\t\t\ttransform: translateY(0) scale(1);
  5153. \t\t\t}
  5154. \t\t}
  5155. \t\t.featured-gallery-card {
  5156. \t\t\tdisplay: flex;
  5157. \t\t\tflex-direction: column;
  5158. \t\t\theight: 100%;
  5159. \t\t\tbackground: white;
  5160. \t\t\tborder-radius: 12px;
  5161. \t\t\toverflow: hidden;
  5162. \t\t\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
  5163. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  5164. \t\t\tborder: 1px solid #f0f0f0;
  5165. \t\t}
  5166. \t\t.featured-gallery-card:hover {
  5167. \t\t\ttransform: translateY(-5px);
  5168. \t\t\tbox-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
  5169. \t\t\tborder-color: #ffa200;
  5170. \t\t}
  5171. \t\t.featured-gallery-image-wrapper {
  5172. \t\t\tposition: relative;
  5173. \t\t\twidth: 100%;
  5174. \t\t\tpadding-top: 100%; /* Ratio 1:1 pour une galerie carrée */
  5175. \t\t\toverflow: hidden;
  5176. \t\t\tbackground: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  5177. \t\t}
  5178. \t\t.featured-gallery-image {
  5179. \t\t\tposition: absolute;
  5180. \t\t\ttop: 0;
  5181. \t\t\tleft: 0;
  5182. \t\t\twidth: 100%;
  5183. \t\t\theight: 100%;
  5184. \t\t\tbackground-size: cover;
  5185. \t\t\tbackground-position: center;
  5186. \t\t\ttransition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
  5187. \t\t}
  5188. \t\t.featured-gallery-card:hover .featured-gallery-image {
  5189. \t\t\ttransform: scale(1.08);
  5190. \t\t}
  5191. \t\t.featured-gallery-badge {
  5192. \t\t\tposition: absolute;
  5193. \t\t\ttop: 8px;
  5194. \t\t\tleft: 8px;
  5195. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  5196. \t\t\tcolor: white;
  5197. \t\t\tpadding: 4px 10px;
  5198. \t\t\tborder-radius: 15px;
  5199. \t\t\tfont-size: 12px;
  5200. \t\t\tfont-weight: 600;
  5201. \t\t\tz-index: 2;
  5202. \t\t\tbox-shadow: 0 2px 8px rgba(255, 162, 0, 0.4);
  5203. \t\t}
  5204. \t\t.featured-gallery-overlay {
  5205. \t\t\tposition: absolute;
  5206. \t\t\ttop: 0;
  5207. \t\t\tleft: 0;
  5208. \t\t\twidth: 100%;
  5209. \t\t\theight: 100%;
  5210. \t\t\tbackground: rgba(0, 0, 0, 0.5);
  5211. \t\t\tdisplay: flex;
  5212. \t\t\talign-items: center;
  5213. \t\t\tjustify-content: center;
  5214. \t\t\topacity: 0;
  5215. \t\t\ttransition: opacity 0.3s ease;
  5216. \t\t}
  5217. \t\t.featured-gallery-card:hover .featured-gallery-overlay {
  5218. \t\t\topacity: 1;
  5219. \t\t}
  5220. \t\t.featured-gallery-view-btn {
  5221. \t\t\tbackground: white;
  5222. \t\t\tcolor: #333;
  5223. \t\t\twidth: 40px;
  5224. \t\t\theight: 40px;
  5225. \t\t\tborder-radius: 50%;
  5226. \t\t\tdisplay: flex;
  5227. \t\t\talign-items: center;
  5228. \t\t\tjustify-content: center;
  5229. \t\t\ttext-decoration: none;
  5230. \t\t\tfont-size: 18px;
  5231. \t\t\ttransform: scale(0.8);
  5232. \t\t\ttransition: transform 0.3s ease;
  5233. \t\t}
  5234. \t\t.featured-gallery-card:hover .featured-gallery-view-btn {
  5235. \t\t\ttransform: scale(1);
  5236. \t\t}
  5237. \t\t.featured-gallery-info {
  5238. \t\t\tpadding: 12px;
  5239. \t\t\tflex: 1;
  5240. \t\t\tdisplay: flex;
  5241. \t\t\tflex-direction: column;
  5242. \t\t}
  5243. \t\t.featured-gallery-title {
  5244. \t\t\tfont-size: 14px;
  5245. \t\t\tfont-weight: 600;
  5246. \t\t\tmargin-bottom: 6px;
  5247. \t\t\tcolor: #333;
  5248. \t\t\tline-height: 1.3;
  5249. \t\t\tdisplay: -webkit-box;
  5250. \t\t\t-webkit-line-clamp: 2;
  5251. \t\t\t-webkit-box-orient: vertical;
  5252. \t\t\toverflow: hidden;
  5253. \t\t\tmin-height: 36px;
  5254. \t\t}
  5255. \t\t.featured-gallery-title a {
  5256. \t\t\tcolor: #333;
  5257. \t\t\ttext-decoration: none;
  5258. \t\t\ttransition: color 0.3s ease;
  5259. \t\t}
  5260. \t\t.featured-gallery-title a:hover {
  5261. \t\t\tcolor: #ffa200;
  5262. \t\t}
  5263. \t\t.featured-gallery-price {
  5264. \t\t\tfont-size: 16px;
  5265. \t\t\tfont-weight: 700;
  5266. \t\t\tcolor: #ffa200;
  5267. \t\t\tmargin-bottom: 6px;
  5268. \t\t}
  5269. \t\t.featured-gallery-rating {
  5270. \t\t\tdisplay: flex;
  5271. \t\t\talign-items: center;
  5272. \t\t\tgap: 3px;
  5273. \t\t\tfont-size: 11px;
  5274. \t\t}
  5275. \t\t.featured-gallery-rating .fa-star.active {
  5276. \t\t\tcolor: #ffa200;
  5277. \t\t}
  5278. \t\t.featured-gallery-rating .fa-star-o {
  5279. \t\t\tcolor: #ddd;
  5280. \t\t}
  5281. \t\t.featured-gallery-controls {
  5282. \t\t\tdisplay: flex;
  5283. \t\t\tjustify-content: center;
  5284. \t\t\tgap: 20px;
  5285. \t\t\tmargin-top: 25px;
  5286. \t\t\tpadding: 0 20px;
  5287. \t\t}
  5288. \t\t.featured-gallery-nav-btn {
  5289. \t\t\twidth: 42px;
  5290. \t\t\theight: 42px;
  5291. \t\t\tborder-radius: 50%;
  5292. \t\t\tborder: 1.5px solid #ffa200;
  5293. \t\t\tbackground: white;
  5294. \t\t\tcolor: #ffa200;
  5295. \t\t\tfont-size: 16px;
  5296. \t\t\tcursor: pointer;
  5297. \t\t\tdisplay: flex;
  5298. \t\t\talign-items: center;
  5299. \t\t\tjustify-content: center;
  5300. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  5301. \t\t\tbox-shadow: 0 3px 10px rgba(255, 162, 0, 0.18);
  5302. \t\t\tposition: relative;
  5303. \t\t\toverflow: hidden;
  5304. \t\t}
  5305. \t\t.featured-gallery-nav-btn.btn-ripple::after {
  5306. \t\t\tcontent: '';
  5307. \t\t\tposition: absolute;
  5308. \t\t\twidth: 100%;
  5309. \t\t\theight: 100%;
  5310. \t\t\tleft: 0;
  5311. \t\t\ttop: 0;
  5312. \t\t\tborder-radius: 50%;
  5313. \t\t\tbackground: rgba(255, 162, 0, 0.2);
  5314. \t\t\tanimation: rippleEffect 0.35s ease;
  5315. \t\t}
  5316. \t\t@keyframes rippleEffect {
  5317. \t\t\tfrom {
  5318. \t\t\t\ttransform: scale(0.6);
  5319. \t\t\t\topacity: 0.7;
  5320. \t\t\t}
  5321. \t\t\tto {
  5322. \t\t\t\ttransform: scale(1.4);
  5323. \t\t\t\topacity: 0;
  5324. \t\t\t}
  5325. \t\t}
  5326. \t\t.featured-gallery-nav-btn:hover:not(:disabled) {
  5327. \t\t\tbackground: #ffa200;
  5328. \t\t\tcolor: white;
  5329. \t\t\ttransform: scale(1.1);
  5330. \t\t\tbox-shadow: 0 5px 18px rgba(255, 162, 0, 0.4);
  5331. \t\t}
  5332. \t\t.featured-gallery-nav-btn:active:not(:disabled) {
  5333. \t\t\ttransform: scale(0.95);
  5334. \t\t}
  5335. \t\t.featured-gallery-nav-btn:disabled {
  5336. \t\t\topacity: 0.3;
  5337. \t\t\tcursor: not-allowed;
  5338. \t\t}
  5339. \t\t.featured-gallery-load-more {
  5340. \t\t\tmargin-top: 30px;
  5341. \t\t}
  5342. \t\t/* Style pour le bouton \"Voir tous les produits\" */
  5343. \t\t.btn-view-all-products {
  5344. \t\t\tdisplay: inline-flex;
  5345. \t\t\talign-items: center;
  5346. \t\t\tgap: 12px;
  5347. \t\t\tpadding: 16px 40px;
  5348. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  5349. \t\t\tcolor: white;
  5350. \t\t\ttext-decoration: none;
  5351. \t\t\tborder-radius: 50px;
  5352. \t\t\tfont-weight: 600;
  5353. \t\t\tfont-size: 16px;
  5354. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  5355. \t\t\tbox-shadow: 0 4px 15px rgba(255, 162, 0, 0.3);
  5356. \t\t\tposition: relative;
  5357. \t\t\toverflow: hidden;
  5358. \t\t}
  5359. \t\t.btn-view-all-products::before {
  5360. \t\t\tcontent: '';
  5361. \t\t\tposition: absolute;
  5362. \t\t\ttop: 0;
  5363. \t\t\tleft: -100%;
  5364. \t\t\twidth: 100%;
  5365. \t\t\theight: 100%;
  5366. \t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
  5367. \t\t\ttransition: left 0.5s ease;
  5368. \t\t}
  5369. \t\t.btn-view-all-products:hover::before {
  5370. \t\t\tleft: 100%;
  5371. \t\t}
  5372. \t\t.btn-view-all-products:hover {
  5373. \t\t\ttransform: translateY(-3px);
  5374. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.5);
  5375. \t\t\tcolor: white;
  5376. \t\t}
  5377. \t\t.btn-view-all-products:active {
  5378. \t\t\ttransform: translateY(-1px);
  5379. \t\t}
  5380. \t\t.btn-view-all-products i {
  5381. \t\t\tfont-size: 18px;
  5382. \t\t\ttransition: transform 0.3s ease;
  5383. \t\t}
  5384. \t\t.btn-view-all-products:hover i {
  5385. \t\t\ttransform: translateX(5px);
  5386. \t\t}
  5387. \t\t.btn-view-all-products span {
  5388. \t\t\tposition: relative;
  5389. \t\t\tz-index: 1;
  5390. \t\t}
  5391. \t\t/* Responsive */
  5392. \t\t@media(max-width: 767px) {
  5393. \t\t\t.btn-view-all-products {
  5394. \t\t\t\tpadding: 14px 30px;
  5395. \t\t\t\tfont-size: 14px;
  5396. \t\t\t}
  5397. \t\t}
  5398. \t\t/* Responsive */
  5399. \t\t@media(max-width: 767px) {
  5400. \t\t\t.featured-gallery-grid {
  5401. \t\t\t\tgap: 10px;
  5402. \t\t\t}
  5403. \t\t\t.featured-gallery-info {
  5404. \t\t\t\tpadding: 10px;
  5405. \t\t\t}
  5406. \t\t\t.featured-gallery-title {
  5407. \t\t\t\tfont-size: 13px;
  5408. \t\t\t\tmin-height: 32px;
  5409. \t\t\t}
  5410. \t\t\t.featured-gallery-price {
  5411. \t\t\t\tfont-size: 14px;
  5412. \t\t\t}
  5413. \t\t}
  5414. \t\t/* Styles pour les grilles de produits Nouveautés */
  5415. \t\t.latest-products-grid {
  5416. \t\t\tmargin-top: 30px;
  5417. \t\t}
  5418. \t\t.product-card-modern {
  5419. \t\t\tbackground: white;
  5420. \t\t\tborder-radius: 12px;
  5421. \t\t\toverflow: hidden;
  5422. \t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
  5423. \t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  5424. \t\t\theight: 100%;
  5425. \t\t\tdisplay: flex;
  5426. \t\t\tflex-direction: column;
  5427. \t\t\tborder: 1px solid #f0f0f0;
  5428. \t\t}
  5429. \t\t.product-card-modern:hover {
  5430. \t\t\ttransform: translateY(-8px);
  5431. \t\t\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
  5432. \t\t\tborder-color: #ffa200;
  5433. \t\t}
  5434. \t\t.product-image-wrapper {
  5435. \t\t\tposition: relative;
  5436. \t\t\twidth: 100%;
  5437. \t\t\tpadding-top: 75%; /* Ratio 4:3 */
  5438. \t\t\toverflow: hidden;
  5439. \t\t\tbackground: #f8f9fa;
  5440. \t\t}
  5441. \t\t.product-image {
  5442. \t\t\tposition: absolute;
  5443. \t\t\ttop: 0;
  5444. \t\t\tleft: 0;
  5445. \t\t\twidth: 100%;
  5446. \t\t\theight: 100%;
  5447. \t\t\tbackground-size: cover;
  5448. \t\t\tbackground-position: center;
  5449. \t\t\ttransition: transform 0.5s ease;
  5450. \t\t}
  5451. \t\t.product-card-modern:hover .product-image {
  5452. \t\t\ttransform: scale(1.1);
  5453. \t\t}
  5454. \t\t.product-badge-modern {
  5455. \t\t\tposition: absolute;
  5456. \t\t\ttop: 10px;
  5457. \t\t\tright: 10px;
  5458. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  5459. \t\t\tcolor: white;
  5460. \t\t\tpadding: 6px 12px;
  5461. \t\t\tborder-radius: 20px;
  5462. \t\t\tfont-size: 12px;
  5463. \t\t\tfont-weight: 600;
  5464. \t\t\tz-index: 2;
  5465. \t\t\tbox-shadow: 0 2px 8px rgba(255, 162, 0, 0.3);
  5466. \t\t}
  5467. \t\t.product-badge-modern.new-badge {
  5468. \t\t\tbackground: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  5469. \t\t}
  5470. \t\t.product-overlay {
  5471. \t\t\tposition: absolute;
  5472. \t\t\ttop: 0;
  5473. \t\t\tleft: 0;
  5474. \t\t\twidth: 100%;
  5475. \t\t\theight: 100%;
  5476. \t\t\tbackground: rgba(0, 0, 0, 0.5);
  5477. \t\t\tdisplay: flex;
  5478. \t\t\talign-items: center;
  5479. \t\t\tjustify-content: center;
  5480. \t\t\topacity: 0;
  5481. \t\t\ttransition: opacity 0.3s ease;
  5482. \t\t\tz-index: 1;
  5483. \t\t}
  5484. \t\t.product-card-modern:hover .product-overlay {
  5485. \t\t\topacity: 1;
  5486. \t\t}
  5487. \t\t.btn-view-product {
  5488. \t\t\tbackground: white;
  5489. \t\t\tcolor: #333;
  5490. \t\t\tpadding: 12px 24px;
  5491. \t\t\tborder-radius: 25px;
  5492. \t\t\ttext-decoration: none;
  5493. \t\t\tfont-weight: 600;
  5494. \t\t\tdisplay: flex;
  5495. \t\t\talign-items: center;
  5496. \t\t\tgap: 8px;
  5497. \t\t\ttransition: all 0.3s ease;
  5498. \t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
  5499. \t\t}
  5500. \t\t.btn-view-product:hover {
  5501. \t\t\tbackground: #ffa200;
  5502. \t\t\tcolor: white;
  5503. \t\t\ttransform: scale(1.05);
  5504. \t\t}
  5505. \t\t.product-info-modern {
  5506. \t\t\tpadding: 16px;
  5507. \t\t\tflex-grow: 1;
  5508. \t\t\tdisplay: flex;
  5509. \t\t\tflex-direction: column;
  5510. \t\t}
  5511. \t\t.product-title-modern {
  5512. \t\t\tmargin: 0 0 8px;
  5513. \t\t\tfont-size: 16px;
  5514. \t\t\tfont-weight: 600;
  5515. \t\t\tline-height: 1.4;
  5516. \t\t}
  5517. \t\t.product-title-modern a {
  5518. \t\t\tcolor: #333;
  5519. \t\t\ttext-decoration: none;
  5520. \t\t\ttransition: color 0.3s ease;
  5521. \t\t}
  5522. \t\t.product-title-modern a:hover {
  5523. \t\t\tcolor: #ffa200;
  5524. \t\t}
  5525. \t\t.product-price-modern {
  5526. \t\t\tfont-size: 20px;
  5527. \t\t\tfont-weight: 700;
  5528. \t\t\tcolor: #ffa200;
  5529. \t\t\tmargin-bottom: 8px;
  5530. \t\t}
  5531. \t\t.product-shop-modern {
  5532. \t\t\tdisplay: flex;
  5533. \t\t\talign-items: center;
  5534. \t\t\tgap: 6px;
  5535. \t\t\tfont-size: 13px;
  5536. \t\t\tcolor: #666;
  5537. \t\t\tmargin-bottom: 8px;
  5538. \t\t}
  5539. \t\t.product-shop-modern i {
  5540. \t\t\tcolor: #ffa200;
  5541. \t\t}
  5542. \t\t.shop-link {
  5543. \t\t\tcolor: #666;
  5544. \t\t\ttext-decoration: none;
  5545. \t\t\ttransition: color 0.3s ease;
  5546. \t\t}
  5547. \t\t.shop-link:hover {
  5548. \t\t\tcolor: #ffa200;
  5549. \t\t}
  5550. \t\t.product-rating-modern {
  5551. \t\t\tdisplay: flex;
  5552. \t\t\talign-items: center;
  5553. \t\t\tgap: 4px;
  5554. \t\t\tmargin-top: auto;
  5555. \t\t}
  5556. \t\t.product-rating-modern .fa-star.active {
  5557. \t\t\tcolor: #ffc107;
  5558. \t\t}
  5559. \t\t.product-rating-modern .fa-star-o {
  5560. \t\t\tcolor: #ddd;
  5561. \t\t}
  5562. \t\t.rating-count {
  5563. \t\t\tfont-size: 12px;
  5564. \t\t\tcolor: #666;
  5565. \t\t\tmargin-left: 4px;
  5566. \t\t}
  5567. \t\t.product-views-modern {
  5568. \t\t\tdisplay: flex;
  5569. \t\t\talign-items: center;
  5570. \t\t\tgap: 6px;
  5571. \t\t\tfont-size: 12px;
  5572. \t\t\tcolor: #666;
  5573. \t\t\tmargin-top: auto;
  5574. \t\t}
  5575. \t\t.product-views-modern i {
  5576. \t\t\tcolor: #999;
  5577. \t\t}
  5578. \t\t/* Style des cartes produits */
  5579. \t\t.product-card {
  5580. \t\t\tbackground: white;
  5581. \t\t\tborder-radius: 15px;
  5582. \t\t\toverflow: hidden;
  5583. \t\t\tbox-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  5584. \t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  5585. \t\t\theight: 100%;
  5586. \t\t\tdisplay: flex;
  5587. \t\t\tflex-direction: column;
  5588. \t\t}
  5589. \t\t.product-card:hover {
  5590. \t\t\tbox-shadow: 0 15px 40px rgba(0, 0, 0, 0.2);
  5591. \t\t\ttransform: translateY(-5px);
  5592. \t\t}
  5593. \t\t.product-image {
  5594. \t\t\twidth: 100%;
  5595. \t\t\theight: 250px;
  5596. \t\t\tbackground-size: cover;
  5597. \t\t\tbackground-position: center;
  5598. \t\t\tposition: relative;
  5599. \t\t\toverflow: hidden;
  5600. \t\t}
  5601. \t\t.product-image::before {
  5602. \t\t\tcontent: '';
  5603. \t\t\tposition: absolute;
  5604. \t\t\ttop: 0;
  5605. \t\t\tleft: -100%;
  5606. \t\t\twidth: 100%;
  5607. \t\t\theight: 100%;
  5608. \t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
  5609. \t\t\ttransition: left 0.6s ease;
  5610. \t\t}
  5611. \t\t.product-card:hover .product-image::before {
  5612. \t\t\tleft: 100%;
  5613. \t\t}
  5614. \t\t.product-badge {
  5615. \t\t\tposition: absolute;
  5616. \t\t\ttop: 15px;
  5617. \t\t\tright: 15px;
  5618. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  5619. \t\t\tcolor: white;
  5620. \t\t\tpadding: 8px 15px;
  5621. \t\t\tborder-radius: 20px;
  5622. \t\t\tfont-size: 0.85rem;
  5623. \t\t\tfont-weight: 600;
  5624. \t\t\tbox-shadow: 0 4px 10px rgba(255, 162, 0, 0.4);
  5625. \t\t\tz-index: 1;
  5626. \t\t}
  5627. \t\t.product-info {
  5628. \t\t\tpadding: 20px;
  5629. \t\t\tflex-grow: 1;
  5630. \t\t\tdisplay: flex;
  5631. \t\t\tflex-direction: column;
  5632. \t\t}
  5633. \t\t.product-title {
  5634. \t\t\tfont-size: 1.1rem;
  5635. \t\t\tfont-weight: 600;
  5636. \t\t\tcolor: #2c3e50;
  5637. \t\t\tmargin-bottom: 10px;
  5638. \t\t\tline-height: 1.4;
  5639. \t\t\tdisplay: -webkit-box;
  5640. \t\t\t-webkit-line-clamp: 2;
  5641. \t\t\t-webkit-box-orient: vertical;
  5642. \t\t\toverflow: hidden;
  5643. \t\t}
  5644. \t\t.product-price {
  5645. \t\t\tfont-size: 1.5rem;
  5646. \t\t\tfont-weight: 800;
  5647. \t\t\tcolor: #ffa200;
  5648. \t\t\tmargin-bottom: 15px;
  5649. \t\t}
  5650. \t\t.product-shop {
  5651. \t\t\tfont-size: 0.9rem;
  5652. \t\t\tcolor: #666;
  5653. \t\t\tmargin-bottom: 15px;
  5654. \t\t}
  5655. \t\t.product-shop a {
  5656. \t\t\tcolor: #667eea;
  5657. \t\t\ttext-decoration: none;
  5658. \t\t\ttransition: color 0.3s ease;
  5659. \t\t}
  5660. \t\t.product-shop a:hover {
  5661. \t\t\tcolor: #ffa200;
  5662. \t\t}
  5663. \t\t/* Newsletter Modern Styles */
  5664. \t\t.newsletter-section-modern {
  5665. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #095ad3 100%);
  5666. \t\t\tposition: relative;
  5667. \t\t\toverflow: hidden;
  5668. \t\t}
  5669. \t\t.newsletter-section-modern::before {
  5670. \t\t\tcontent: '';
  5671. \t\t\tposition: absolute;
  5672. \t\t\ttop: -50%;
  5673. \t\t\tright: -50%;
  5674. \t\t\twidth: 100%;
  5675. \t\t\theight: 200%;
  5676. \t\t\tbackground: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);
  5677. \t\t\tanimation: pulse 3s ease-in-out infinite;
  5678. \t\t}
  5679. \t\t@keyframes pulse {
  5680. \t\t\t0,
  5681. \t\t\t100% {
  5682. \t\t\t\ttransform: scale(1);
  5683. \t\t\t\topacity: 0.5;
  5684. \t\t\t}
  5685. \t\t\t50% {
  5686. \t\t\t\ttransform: scale(1.1);
  5687. \t\t\t\topacity: 0.8;
  5688. \t\t\t}
  5689. \t\t}
  5690. \t\t.newsletter-card {
  5691. \t\t\tbackground: white;
  5692. \t\t\tborder-radius: 20px;
  5693. \t\t\tpadding: 40px;
  5694. \t\t\tbox-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
  5695. \t\t\tposition: relative;
  5696. \t\t\tz-index: 1;
  5697. \t\t}
  5698. \t\t.newsletter-title {
  5699. \t\t\tfont-size: 2.5rem;
  5700. \t\t\tfont-weight: bold;
  5701. \t\t\tcolor: #333;
  5702. \t\t}
  5703. \t\t.newsletter-description {
  5704. \t\t\tcolor: #666;
  5705. \t\t\tfont-size: 1.1rem;
  5706. \t\t\tline-height: 1.8;
  5707. \t\t}
  5708. \t\t.newsletter-form-modern {
  5709. \t\t\tposition: relative;
  5710. \t\t}
  5711. \t\t.newsletter-input-wrapper {
  5712. \t\t\tdisplay: flex;
  5713. \t\t\tgap: 10px;
  5714. \t\t\tmargin-bottom: 15px;
  5715. \t\t}
  5716. \t\t.newsletter-input {
  5717. \t\t\tflex: 1;
  5718. \t\t\tpadding: 18px 25px;
  5719. \t\t\tborder: 2px solid #e0e0e0;
  5720. \t\t\tborder-radius: 50px;
  5721. \t\t\tfont-size: 1rem;
  5722. \t\t\ttransition: all 0.3s ease;\t\t\tbackground: #fff;
  5723. \t\t\tcolor: #333;
  5724. \t\t}
  5725. \t\t.newsletter-input::placeholder {
  5726. \t\t\tcolor: #777;
  5727. \t\t}
  5728. \t\t.newsletter-input:focus {
  5729. \t\t\toutline: none;
  5730. \t\t\tborder-color: #ffa200;
  5731. \t\t\tbox-shadow: 0 0 0 3px rgba(255, 162, 0, 0.1);
  5732. \t\t}
  5733. \t\t.newsletter-button {
  5734. \t\t\tpadding: 18px 35px;
  5735. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  5736. \t\t\tcolor: white;
  5737. \t\t\tborder: none;
  5738. \t\t\tborder-radius: 50px;
  5739. \t\t\tfont-weight: 600;
  5740. \t\t\tfont-size: 1rem;
  5741. \t\t\tcursor: pointer;
  5742. \t\t\ttransition: all 0.3s ease;
  5743. \t\t\twhite-space: nowrap;
  5744. \t\t}
  5745. \t\t.newsletter-button:hover {
  5746. \t\t\ttransform: translateY(-2px);
  5747. \t\t\tbox-shadow: 0 5px 20px rgba(255, 162, 0, 0.4);
  5748. \t\t}
  5749. \t\t.newsletter-privacy {
  5750. \t\t\tcolor: #999;
  5751. \t\t}
  5752. \t\t/* CTA Modern Styles */
  5753. \t\t.cta-section-modern {
  5754. \t\t\tbackground: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  5755. \t\t}
  5756. \t\t.cta-card {
  5757. \t\t\tbackground: white;
  5758. \t\t\tborder-radius: 25px;
  5759. \t\t\tpadding: 50px;
  5760. \t\t\tbox-shadow: 0 15px 50px rgba(0, 0, 0, 0.1);
  5761. \t\t\tposition: relative;
  5762. \t\t\toverflow: hidden;
  5763. \t\t}
  5764. \t\t.cta-card::before {
  5765. \t\t\tcontent: '';
  5766. \t\t\tposition: absolute;
  5767. \t\t\ttop: -50px;
  5768. \t\t\tright: -50px;
  5769. \t\t\twidth: 200px;
  5770. \t\t\theight: 200px;
  5771. \t\t\tbackground: linear-gradient(135deg, rgba(255,162,0,0.1) 0%, rgba(255,162,0,0.05) 100%);
  5772. \t\t\tborder-radius: 50%;
  5773. \t\t}
  5774. \t\t.cta-badge {
  5775. \t\t\tdisplay: inline-block;
  5776. \t\t\tpadding: 8px 20px;
  5777. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  5778. \t\t\tcolor: white;
  5779. \t\t\tborder-radius: 50px;
  5780. \t\t\tfont-size: 0.9rem;
  5781. \t\t\tfont-weight: 600;
  5782. \t\t\tmargin-bottom: 20px;
  5783. \t\t}
  5784. \t\t.cta-title {
  5785. \t\t\tfont-size: 3rem;
  5786. \t\t\tfont-weight: bold;
  5787. \t\t\tcolor: #333;
  5788. \t\t\tmargin-bottom: 20px;
  5789. \t\t}
  5790. \t\t.cta-description {
  5791. \t\t\tfont-size: 1.2rem;
  5792. \t\t\tcolor: #666;
  5793. \t\t\tline-height: 1.8;
  5794. \t\t}
  5795. \t\t.cta-features {
  5796. \t\t\tdisplay: flex;
  5797. \t\t\tflex-direction: column;
  5798. \t\t\tgap: 15px;
  5799. \t\t}
  5800. \t\t.cta-feature-item {
  5801. \t\t\tdisplay: flex;
  5802. \t\t\talign-items: center;
  5803. \t\t\tgap: 10px;
  5804. \t\t\tfont-size: 1rem;
  5805. \t\t\tcolor: #555;
  5806. \t\t}
  5807. \t\t.cta-feature-item i {
  5808. \t\t\tcolor: #ffa200;
  5809. \t\t\tfont-size: 1.3rem;
  5810. \t\t}
  5811. \t\t.cta-buttons {
  5812. \t\t\tdisplay: flex;
  5813. \t\t\tgap: 15px;
  5814. \t\t\tflex-wrap: wrap;
  5815. \t\t}
  5816. \t\t.cta-button-primary {
  5817. \t\t\tpadding: 15px 35px;
  5818. \t\t\tbackground: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  5819. \t\t\tcolor: white;
  5820. \t\t\tborder: none;
  5821. \t\t\tborder-radius: 50px;
  5822. \t\t\tfont-weight: 600;
  5823. \t\t\tfont-size: 1.1rem;
  5824. \t\t\ttransition: all 0.3s ease;
  5825. \t\t}
  5826. \t\t.cta-button-primary:hover {
  5827. \t\t\ttransform: translateY(-3px);
  5828. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.4);
  5829. \t\t\tcolor: white;
  5830. \t\t}
  5831. \t\t.cta-button-secondary {
  5832. \t\t\tpadding: 15px 35px;
  5833. \t\t\tbackground: white;
  5834. \t\t\tcolor: #ffa200;
  5835. \t\t\tborder: 2px solid #ffa200;
  5836. \t\t\tborder-radius: 50px;
  5837. \t\t\tfont-weight: 600;
  5838. \t\t\tfont-size: 1.1rem;
  5839. \t\t\ttransition: all 0.3s ease;
  5840. \t\t}
  5841. \t\t.cta-button-secondary:hover {
  5842. \t\t\tbackground: #ffa200;
  5843. \t\t\tcolor: white;
  5844. \t\t\ttransform: translateY(-3px);
  5845. \t\t\tbox-shadow: 0 8px 25px rgba(255, 162, 0, 0.3);
  5846. \t\t}
  5847. \t\t.cta-image-wrapper {
  5848. \t\t\tposition: relative;
  5849. \t\t}
  5850. \t\t.cta-decoration {
  5851. \t\t\tposition: absolute;
  5852. \t\t\ttop: -20px;
  5853. \t\t\tright: -20px;
  5854. \t\t\twidth: 150px;
  5855. \t\t\theight: 150px;
  5856. \t\t\tbackground: linear-gradient(135deg, rgba(255,162,0,0.2) 0%, rgba(255,162,0,0.05) 100%);
  5857. \t\t\tborder-radius: 50%;
  5858. \t\t\tz-index: 0;
  5859. \t\t}
  5860. \t\t.cta-image {
  5861. \t\t\tposition: relative;
  5862. \t\t\tz-index: 1;
  5863. \t\t\tmax-width: 100%;
  5864. \t\t\theight: auto;
  5865. \t\t\tborder-radius: 15px;
  5866. \t\t}
  5867. \t</style>
  5868. {% endblock %}
  5869. {% block body %}
  5870. \t<!-- Hero Section -->
  5871. \t<!-- start banner Area avec produits en vedette -->
  5872. \t\t{% if bannerProducts is defined and bannerProducts|length > 0 %}
  5873. \t\t\t<section class=\"banner-area-modern\"> <div class=\"banner-carousel-wrapper\">
  5874. \t\t\t\t<div class=\"active-banner-slider owl-carousel\" style=\"margin-top: 100px;\">
  5875. \t\t\t\t\t{% for product in bannerProducts %}
  5876. \t\t\t\t\t\t<!-- single-slide -->
  5877. \t\t\t\t\t\t<div class=\"banner-slide-item\">
  5878. \t\t\t\t\t\t\t<div class=\"container\">
  5879. \t\t\t\t\t\t\t\t<div class=\"row align-items-center\">
  5880. \t\t\t\t\t\t\t\t\t<div class=\"col-lg-4 col-md-6 col-12\">
  5881. \t\t\t\t\t\t\t\t\t\t<div class=\"banner-content-modern\">
  5882. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-badge\">
  5883. \t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-star\"></i>
  5884. \t\t\t\t\t\t\t\t\t\t\t\tProduit en vedette
  5885. \t\t\t\t\t\t\t\t\t\t\t</div>
  5886. \t\t\t\t\t\t\t\t\t\t\t<h1 class=\"banner-title-modern\">{{ product.name }}</h1>
  5887. \t\t\t\t\t\t\t\t\t\t\t<p class=\"banner-description-modern\">
  5888. \t\t\t\t\t\t\t\t\t\t\t\t{{ product.description ? (product.description|striptags|slice(0, 120) ~ '...') : 'Découvrez ce produit exclusif sur MaketOu' }}
  5889. \t\t\t\t\t\t\t\t\t\t\t</p>
  5890. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-price-modern\">
  5891. \t\t\t\t\t\t\t\t\t\t\t\t<span class=\"price-label\">Prix</span>
  5892. \t\t\t\t\t\t\t\t\t\t\t\t<span class=\"price-value\">{{ product.price|number_format(2, '.', ' ') }}
  5893. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</span>
  5894. \t\t\t\t\t\t\t\t\t\t\t</div>
  5895. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-actions-modern\">
  5896. \t\t\t\t\t\t\t\t\t\t\t\t<a class=\"btn-banner-primary\" href=\"{{ path('ui_product_show', {'slug': product.slug}) }}\">
  5897. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"btn-text\">Voir le produit</span>
  5898. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"btn-icon\">
  5899. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-arrow-right\"></i>
  5900. \t\t\t\t\t\t\t\t\t\t\t\t\t</span>
  5901. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  5902. \t\t\t\t\t\t\t\t\t\t\t\t{% if product.shop %}
  5903. \t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"btn-banner-secondary\" href=\"{{ path('ui_shop_show', {'slug': product.shop.slug}) }}\">
  5904. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  5905. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ product.shop.name }}</span>
  5906. \t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  5907. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  5908. \t\t\t\t\t\t\t\t\t\t\t</div>
  5909. \t\t\t\t\t\t\t\t\t\t</div>
  5910. \t\t\t\t\t\t\t\t\t</div>
  5911. \t\t\t\t\t\t\t\t\t<div class=\"col-lg-8 col-md-6 col-12\">
  5912. \t\t\t\t\t\t\t\t\t\t<div class=\"banner-image-modern\">
  5913. \t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-image-wrapper\">
  5914. \t\t\t\t\t\t\t\t\t\t\t\t{% if product.images is defined and product.images|length > 0 %}
  5915. \t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"banner-img\" src=\"{{ product.images[0] is defined and product.images[0] ? asset(product.images[0]) : asset('ui/img/product/p' ~ loop.index ~ '.jpg') }}\" alt=\"{{ product.name }}\">
  5916. \t\t\t\t\t\t\t\t\t\t\t\t{% else %}
  5917. \t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"banner-img\" src=\"{{ asset('ui/img/product/p' ~ loop.index ~ '.jpg') }}\" alt=\"{{ product.name }}\">
  5918. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  5919. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"banner-image-overlay\"></div>
  5920. \t\t\t\t\t\t\t\t\t\t\t</div>
  5921. \t\t\t\t\t\t\t\t\t\t</div>
  5922. \t\t\t\t\t\t\t\t\t</div>
  5923. \t\t\t\t\t\t\t\t</div>
  5924. \t\t\t\t\t\t\t</div>
  5925. \t\t\t\t\t\t</div>
  5926. \t\t\t\t\t{% endfor %}
  5927. \t\t\t\t</div>
  5928. \t\t\t</div>
  5929. \t\t</section>
  5930. \t{% else %}
  5931. \t\t<!-- Banner par défaut si pas de produits en vedette -->
  5932. \t\t<section class=\"banner-area-modern\">
  5933. \t\t\t<div class=\"banner-carousel-wrapper\">
  5934. \t\t\t\t<div class=\"container\">
  5935. \t\t\t\t\t<div class=\"row align-items-center justify-content-center\">
  5936. \t\t\t\t\t\t<div class=\"col-lg-8 text-center\">
  5937. \t\t\t\t\t\t\t<div class=\"banner-content-modern\" style=\"margin-top: 140px;\">
  5938. \t\t\t\t\t\t\t\t<h1 class=\"banner-title-modern\">Bienvenue sur MaketOu</h1>
  5939. \t\t\t\t\t\t\t\t<p class=\"banner-description-modern\">Votre marketplace haïtienne</p>
  5940. \t\t\t\t\t\t\t</div>
  5941. \t\t\t\t\t\t</div>
  5942. \t\t\t\t\t</div>
  5943. \t\t\t\t</div>
  5944. \t\t\t</div>
  5945. \t\t</section>
  5946. \t{% endif %}
  5947. \t<!-- End banner Area -->
  5948. \t<!-- Catégories de produits -->
  5949. \t{% if categories|length > 0 %}
  5950. \t\t<section class=\"py-5\">
  5951. \t\t\t<div class=\"container\">
  5952. \t\t\t\t<div class=\"section-title\">
  5953. \t\t\t\t\t<h2>Nos catégories</h2>
  5954. \t\t\t\t\t<p>Explorez nos différentes catégories de produits</p>
  5955. \t\t\t\t</div>
  5956. \t\t\t\t<div class=\"row\" id=\"productCategoriesContainer\">
  5957. \t\t\t\t\t{% for category in categories|slice(0, 8) %}
  5958. \t\t\t\t\t\t<div class=\"col-lg-3 col-md-4 col-sm-6 mb-4\">
  5959. \t\t\t\t\t\t\t<div class=\"category-card-custom\">
  5960. \t\t\t\t\t\t\t\t<div class=\"category-image-wrapper\">
  5961. \t\t\t\t\t\t\t\t\t<div class=\"category-image\" style=\"background-image: url('{% if category.bannerImage %}{{ asset('uploads/categories/banner/' ~ category.bannerImage) }}{% else %}{{ asset('ui/img/category/cat-' ~ loop.index ~ '.jpg') }}{% endif %}')\">
  5962. \t\t\t\t\t\t\t\t\t\t<div class=\"category-overlay-custom\">
  5963. \t\t\t\t\t\t\t\t\t\t\t<div class=\"category-icon-wrapper\">
  5964. \t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-tag\" style=\"font-size: 3rem;\"></i>
  5965. \t\t\t\t\t\t\t\t\t\t\t\t<h4 class=\"mt-3\">{{ category.name }}</h4>
  5966. \t\t\t\t\t\t\t\t\t\t\t</div>
  5967. \t\t\t\t\t\t\t\t\t\t</div>
  5968. \t\t\t\t\t\t\t\t\t</div>
  5969. \t\t\t\t\t\t\t\t</div>
  5970. \t\t\t\t\t\t\t\t<div class=\"category-content p-3\">
  5971. \t\t\t\t\t\t\t\t\t<h5 class=\"mb-2\">{{ category.name }}</h5>
  5972. \t\t\t\t\t\t\t\t\t{% if category.description %}
  5973. \t\t\t\t\t\t\t\t\t\t<p class=\"text-muted mb-3 small\">{{ category.description|striptags|slice(0, 60) }}
  5974. \t\t\t\t\t\t\t\t\t\t\t{% if category.description|striptags|length > 60 %}...
  5975. \t\t\t\t\t\t\t\t\t\t\t{% endif %}
  5976. \t\t\t\t\t\t\t\t\t\t</p>
  5977. \t\t\t\t\t\t\t\t\t{% endif %}
  5978. \t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_listing', {'category': category.slug}) }}\" class=\"btn btn-primary-custom btn-sm w-100\">
  5979. \t\t\t\t\t\t\t\t\t\tVoir les produits
  5980. \t\t\t\t\t\t\t\t\t</a>
  5981. \t\t\t\t\t\t\t\t</div>
  5982. \t\t\t\t\t\t\t</div>
  5983. \t\t\t\t\t\t</div>
  5984. \t\t\t\t\t{% endfor %}
  5985. \t\t\t\t</div>
  5986. \t\t\t</div>
  5987. \t\t</section>
  5988. \t{% endif %}
  5989. \t<!-- Catégories de boutiques -->
  5990. \t{% if shopCategories|length > 0 %}
  5991. \t\t<section class=\"py-5 bg-light\">
  5992. \t\t\t<div class=\"container\">
  5993. \t\t\t\t<div class=\"section-title\">
  5994. \t\t\t\t\t<h2>Nos catégories de boutiques</h2>
  5995. \t\t\t\t\t<p>Explorez les différentes catégories de boutiques disponibles sur MaketOu</p>
  5996. \t\t\t\t</div>
  5997. \t\t\t\t<div class=\"row\" id=\"shopCategoriesContainer\">
  5998. \t\t\t\t\t{% for shopCategory in shopCategories|slice(0, 6) %}
  5999. \t\t\t\t\t\t<div class=\"col-lg-4 col-md-6 mb-4\">
  6000. \t\t\t\t\t\t\t<a href=\"{{ path('ui_shops_list') }}?category={{ shopCategory.slug }}\" class=\"text-decoration-none\" style=\"display: block;\">
  6001. \t\t\t\t\t\t\t\t<div class=\"category-card-custom shop-category-clickable\">
  6002. \t\t\t\t\t\t\t\t\t<div class=\"category-image-wrapper\">
  6003. \t\t\t\t\t\t\t\t\t\t<div class=\"category-image\" style=\"background-image: url('{% if shopCategory.bannerImage %}{{ asset(shopCategory.bannerImage) }}{% else %}{{ asset('ui/img/category/shop-' ~ loop.index ~ '.jpg') }}{% endif %}')\">
  6004. \t\t\t\t\t\t\t\t\t\t\t<div class=\"category-overlay-custom\">
  6005. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"category-icon-wrapper\">
  6006. \t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\" style=\"font-size: 3rem;\"></i>
  6007. \t\t\t\t\t\t\t\t\t\t\t\t\t<h4 class=\"mt-3\">{{ shopCategory.name }}</h4>
  6008. \t\t\t\t\t\t\t\t\t\t\t\t\t{% if shopCategory.description %}
  6009. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"mt-2 px-3\">{{ shopCategory.description|striptags|slice(0, 100) }}
  6010. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{% if shopCategory.description|striptags|length > 100 %}...
  6011. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6012. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>
  6013. \t\t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6014. \t\t\t\t\t\t\t\t\t\t\t\t</div>
  6015. \t\t\t\t\t\t\t\t\t\t\t</div>
  6016. \t\t\t\t\t\t\t\t\t\t</div>
  6017. \t\t\t\t\t\t\t\t\t</div>
  6018. \t\t\t\t\t\t\t\t\t<div class=\"category-content p-3\">
  6019. \t\t\t\t\t\t\t\t\t\t<h5 class=\"mb-2\">{{ shopCategory.name }}</h5>
  6020. \t\t\t\t\t\t\t\t\t\t{% if shopCategory.description %}
  6021. \t\t\t\t\t\t\t\t\t\t\t<p class=\"text-muted mb-3 small\">{{ shopCategory.description|striptags|slice(0, 80) }}
  6022. \t\t\t\t\t\t\t\t\t\t\t\t{% if shopCategory.description|striptags|length > 80 %}...
  6023. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6024. \t\t\t\t\t\t\t\t\t\t\t</p>
  6025. \t\t\t\t\t\t\t\t\t\t{% endif %}
  6026. \t\t\t\t\t\t\t\t\t\t<span class=\"btn btn-primary-custom btn-sm w-100\">
  6027. \t\t\t\t\t\t\t\t\t\t\tVoir les boutiques
  6028. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-arrow-right ms-2\"></i>
  6029. \t\t\t\t\t\t\t\t\t\t</span>
  6030. \t\t\t\t\t\t\t\t\t</div>
  6031. \t\t\t\t\t\t\t\t</div>
  6032. \t\t\t\t\t\t\t</a>
  6033. \t\t\t\t\t\t</div>
  6034. \t\t\t\t\t{% endfor %}
  6035. \t\t\t\t</div>
  6036. \t\t\t\t{% if shopCategories|length > 6 %}
  6037. \t\t\t\t\t<div class=\"text-center mt-4\">
  6038. \t\t\t\t\t\t<button class=\"btn btn-outline-primary btn-lg\" onclick=\"showAllShopCategories()\">
  6039. \t\t\t\t\t\t\t<i class=\"lnr lnr-store me-2\"></i>
  6040. \t\t\t\t\t\t\tVoir toutes les catégories de boutiques ({{ shopCategories|length }})
  6041. \t\t\t\t\t\t</button>
  6042. \t\t\t\t\t</div>
  6043. \t\t\t\t{% endif %}
  6044. \t\t\t</div>
  6045. \t\t</section>
  6046. \t{% endif %}
  6047. \t<!-- Produits en vedette -->
  6048. \t{% if featuredProducts|length > 0 %}
  6049. \t\t<section class=\"py-5\">
  6050. \t\t\t<div class=\"container\">
  6051. \t\t\t\t<div class=\"section-title text-center mb-5\">
  6052. \t\t\t\t\t<h2>Produits en vedette</h2>
  6053. \t\t\t\t\t<p>Découvrez nos produits les plus populaires et les mieux notés</p>
  6054. \t\t\t\t</div>
  6055. \t\t\t\t<div class=\"featured-gallery-wrapper\">
  6056. \t\t\t\t\t<div class=\"featured-gallery-container\">
  6057. \t\t\t\t\t\t<div class=\"featured-gallery-grid\" id=\"featuredGalleryGrid\">
  6058. \t\t\t\t\t\t\t{% for product in featuredProducts %}
  6059. \t\t\t\t\t\t\t\t<div class=\"featured-gallery-item\">
  6060. \t\t\t\t\t\t\t\t\t<div class=\"single-product\">
  6061. \t\t\t\t\t\t\t\t\t\t<div class=\"product-image-container\" onmouseenter=\"showImageNav({{ product.id }})\" onmouseleave=\"hideImageNav({{ product.id }})\">
  6062. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">
  6063. \t\t\t\t\t\t\t\t\t\t\t\t{% if product.images is defined and product.images|length > 0 %}
  6064. \t\t\t\t\t\t\t\t\t\t\t\t\t<img 
  6065. \t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"img-fluid main-product-img\" 
  6066. \t\t\t\t\t\t\t\t\t\t\t\t\t\tid=\"main-img-{{ product.id }}\" 
  6067. \t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc=\"{{ asset(product.images[0]) }}\" 
  6068. \t\t\t\t\t\t\t\t\t\t\t\t\t\talt=\"{{ product.name }}\"
  6069. \t\t\t\t\t\t\t\t\t\t\t\t\t\tonerror=\"this.onerror=null;this.src='{{ asset('ui/img/product/p1.jpg') }}';\"
  6070. \t\t\t\t\t\t\t\t\t\t\t\t\t>
  6071. \t\t\t\t\t\t\t\t\t\t\t\t{% else %}
  6072. \t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" id=\"main-img-{{ product.id }}\" src=\"{{ asset('ui/img/product/p1.jpg') }}\" alt=\"{{ product.name }}\">
  6073. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6074. \t\t\t\t\t\t\t\t\t\t\t</a>
  6075. \t\t\t\t\t\t\t\t\t\t\t<!-- Boutons de navigation (visibles au survol) -->
  6076. \t\t\t\t\t\t\t\t\t\t\t{% if product.images is defined and product.images|length > 1 %}
  6077. \t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-left\" id=\"img-left-{{ product.id }}\" onclick=\"prevImage({{ product.id }})\" style=\"display: none;\">
  6078. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-left\"></span>
  6079. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  6080. \t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-right\" id=\"img-right-{{ product.id }}\" onclick=\"nextImage({{ product.id }})\" style=\"display: none;\">
  6081. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-right\"></span>
  6082. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  6083. \t\t\t\t\t\t\t\t\t\t\t\t<!-- Indicateurs de position -->
  6084. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"img-indicators\" id=\"img-indicators-{{ product.id }}\" style=\"display: none;\">
  6085. \t\t\t\t\t\t\t\t\t\t\t\t\t{% for img in product.images %}
  6086. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"indicator\" id=\"indicator-{{ product.id }}-{{ loop.index0 }}\" onclick=\"showImage({{ product.id }}, {{ loop.index0 }})\"></span>
  6087. \t\t\t\t\t\t\t\t\t\t\t\t\t{% endfor %}
  6088. \t\t\t\t\t\t\t\t\t\t\t\t</div>
  6089. \t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6090. \t\t\t\t\t\t\t\t\t\t</div>
  6091. \t\t\t\t\t\t\t\t\t\t<div class=\"product-details\">
  6092. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">
  6093. \t\t\t\t\t\t\t\t\t\t\t\t<h6>{{ product.name }}</h6>
  6094. \t\t\t\t\t\t\t\t\t\t\t</a>
  6095. \t\t\t\t\t\t\t\t\t\t\t<!-- Affichage de la boutique -->
  6096. \t\t\t\t\t\t\t\t\t\t\t<div class=\"shop-info\">
  6097. \t\t\t\t\t\t\t\t\t\t\t\t<small class=\"text-muted\">
  6098. \t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  6099. \t\t\t\t\t\t\t\t\t\t\t\t\tVendu par :
  6100. \t\t\t\t\t\t\t\t\t\t\t\t\t{% if product.shop is defined and product.shop %}
  6101. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_shop_show', {'slug': product.shop.slug}) }}\" class=\"shop-link\">
  6102. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ product.shop.name }}
  6103. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  6104. \t\t\t\t\t\t\t\t\t\t\t\t\t{% else %}
  6105. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted\">Boutique inconnue</span>
  6106. \t\t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6107. \t\t\t\t\t\t\t\t\t\t\t\t</small>
  6108. \t\t\t\t\t\t\t\t\t\t\t</div>
  6109. \t\t\t\t\t\t\t\t\t\t\t<div class=\"price\">
  6110. \t\t\t\t\t\t\t\t\t\t\t\t<h6>{{ product.price|number_format(2, '.', ' ') }}
  6111. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  6112. \t\t\t\t\t\t\t\t\t\t\t\t{% if product.compareAtPrice %}
  6113. \t\t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"l-through\">{{ product.compareAtPrice|number_format(2, '.', ' ') }}
  6114. \t\t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  6115. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6116. \t\t\t\t\t\t\t\t\t\t\t</div>
  6117. \t\t\t\t\t\t\t\t\t\t\t<div class=\"prd-bottom\">
  6118. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"social-info add-to-cart\" data-product-id=\"{{ product.id }}\" data-qty=\"1\">
  6119. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
  6120. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">+ panier</p>
  6121. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6122. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info wishlist-btn\" data-product-id=\"{{ product.id }}\" {% if app.user %} onclick=\"toggleWishlist({{ product.id }}, this); return false;\" {% else %} onclick=\"alert('Vous devez être connecté pour ajouter aux favoris'); return false;\" {% endif %}>
  6123. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-heart\"></span>
  6124. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Favoris</p>
  6125. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6126. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info comparison-btn\" data-product-id=\"{{ product.id }}\" {% if app.user %} onclick=\"toggleComparison({{ product.id }}, this); return false;\" {% else %} onclick=\"alert('Vous devez être connecté pour comparer des produits'); return false;\" {% endif %}>
  6127. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-sync\"></span>
  6128. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Comparer</p>
  6129. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6130. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\" class=\"social-info\">
  6131. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-move\"></span>
  6132. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Voir plus</p>
  6133. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6134. \t\t\t\t\t\t\t\t\t\t\t</div>
  6135. \t\t\t\t\t\t\t\t\t\t</div>
  6136. \t\t\t\t\t\t\t\t\t</div>
  6137. \t\t\t\t\t\t\t\t</div>
  6138. \t\t\t\t\t\t\t{% endfor %}
  6139. \t\t\t\t\t\t</div>
  6140. \t\t\t\t\t</div>
  6141. \t\t\t\t\t<!-- Contrôles de navigation -->
  6142. \t\t\t\t\t<div class=\"featured-gallery-controls\">
  6143. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-prev\" id=\"featuredGalleryPrev\" aria-label=\"Précédent\">
  6144. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-left\"></i>
  6145. \t\t\t\t\t\t</button>
  6146. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-next\" id=\"featuredGalleryNext\" aria-label=\"Suivant\">
  6147. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-right\"></i>
  6148. \t\t\t\t\t\t</button>
  6149. \t\t\t\t\t</div>
  6150. \t\t\t\t\t<!-- Bouton charger plus -->
  6151. \t\t\t\t\t<div class=\"featured-gallery-load-more text-center mt-4\" id=\"featuredGalleryLoadMore\" style=\"display: none;\">
  6152. \t\t\t\t\t\t<button class=\"btn btn-outline-primary\" id=\"loadMoreFeaturedBtn\">
  6153. \t\t\t\t\t\t\t<i class=\"lnr lnr-plus-circle me-2\"></i>
  6154. \t\t\t\t\t\t\tCharger plus de produits
  6155. \t\t\t\t\t\t</button>
  6156. \t\t\t\t\t</div>
  6157. \t\t\t\t</div>
  6158. \t\t\t\t<div class=\"text-center mt-5\">
  6159. \t\t\t\t\t<a href=\"{{ path('ui_listing') }}\" class=\"btn-view-all-products\">
  6160. \t\t\t\t\t\t<span>Voir tous les produits</span>
  6161. \t\t\t\t\t\t<i class=\"lnr lnr-arrow-right\"></i>
  6162. \t\t\t\t\t</a>
  6163. \t\t\t\t</div>
  6164. \t\t\t</div>
  6165. \t\t</section>
  6166. \t{% endif %}
  6167. \t<!-- Nouveautés -->
  6168. \t{% if latestProducts|length > 0 %}
  6169. \t\t<section class=\"py-5 bg-light\">
  6170. \t\t\t<div class=\"container\">
  6171. \t\t\t\t<div class=\"section-title text-center mb-5\">
  6172. \t\t\t\t\t<h2>Nouveautés</h2>
  6173. \t\t\t\t\t<p>Les derniers produits ajoutés sur MaketOu</p>
  6174. \t\t\t\t</div>
  6175. \t\t\t\t<div class=\"featured-gallery-wrapper\">
  6176. \t\t\t\t\t<div class=\"featured-gallery-container\">
  6177. \t\t\t\t\t\t<div class=\"featured-gallery-grid\" id=\"latestGalleryGrid\">
  6178. \t\t\t\t\t\t\t{% for product in latestProducts %}
  6179. \t\t\t\t\t\t\t\t<div class=\"featured-gallery-item\">
  6180. \t\t\t\t\t\t\t\t\t<div class=\"single-product\">
  6181. \t\t\t\t\t\t\t\t\t\t<div class=\"product-image-container\" onmouseenter=\"showImageNav({{ product.id }})\" onmouseleave=\"hideImageNav({{ product.id }})\">
  6182. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">
  6183. \t\t\t\t\t\t\t\t\t\t\t\t{% if product.images is defined and product.images|length > 0 %}
  6184. \t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" id=\"main-img-{{ product.id }}\" src=\"{{ asset(product.images[0]) }}\" alt=\"{{ product.name }}\">
  6185. \t\t\t\t\t\t\t\t\t\t\t\t{% else %}
  6186. \t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" id=\"main-img-{{ product.id }}\" src=\"{{ asset('ui/img/product/p1.jpg') }}\" alt=\"{{ product.name }}\">
  6187. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6188. \t\t\t\t\t\t\t\t\t\t\t</a>
  6189. \t\t\t\t\t\t\t\t\t\t\t<!-- Boutons de navigation (visibles au survol) -->
  6190. \t\t\t\t\t\t\t\t\t\t\t{% if product.images is defined and product.images|length > 1 %}
  6191. \t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-left\" id=\"img-left-{{ product.id }}\" onclick=\"prevImage({{ product.id }})\" style=\"display: none;\">
  6192. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-left\"></span>
  6193. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  6194. \t\t\t\t\t\t\t\t\t\t\t\t<button class=\"img-nav-btn img-nav-right\" id=\"img-right-{{ product.id }}\" onclick=\"nextImage({{ product.id }})\" style=\"display: none;\">
  6195. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-chevron-right\"></span>
  6196. \t\t\t\t\t\t\t\t\t\t\t\t</button>
  6197. \t\t\t\t\t\t\t\t\t\t\t\t<!-- Indicateurs de position -->
  6198. \t\t\t\t\t\t\t\t\t\t\t\t<div class=\"img-indicators\" id=\"img-indicators-{{ product.id }}\" style=\"display: none;\">
  6199. \t\t\t\t\t\t\t\t\t\t\t\t\t{% for img in product.images %}
  6200. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"indicator\" id=\"indicator-{{ product.id }}-{{ loop.index0 }}\" onclick=\"showImage({{ product.id }}, {{ loop.index0 }})\"></span>
  6201. \t\t\t\t\t\t\t\t\t\t\t\t\t{% endfor %}
  6202. \t\t\t\t\t\t\t\t\t\t\t\t</div>
  6203. \t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6204. \t\t\t\t\t\t\t\t\t\t</div>
  6205. \t\t\t\t\t\t\t\t\t\t<div class=\"product-details\">
  6206. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">
  6207. \t\t\t\t\t\t\t\t\t\t\t\t<h6>{{ product.name }}</h6>
  6208. \t\t\t\t\t\t\t\t\t\t\t</a>
  6209. \t\t\t\t\t\t\t\t\t\t\t<!-- Affichage de la boutique -->
  6210. \t\t\t\t\t\t\t\t\t\t\t<div class=\"shop-info\">
  6211. \t\t\t\t\t\t\t\t\t\t\t\t<small class=\"text-muted\">
  6212. \t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  6213. \t\t\t\t\t\t\t\t\t\t\t\t\tVendu par :
  6214. \t\t\t\t\t\t\t\t\t\t\t\t\t{% if product.shop is defined and product.shop %}
  6215. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_shop_show', {'slug': product.shop.slug}) }}\" class=\"shop-link\">
  6216. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{{ product.shop.name }}
  6217. \t\t\t\t\t\t\t\t\t\t\t\t\t\t</a>
  6218. \t\t\t\t\t\t\t\t\t\t\t\t\t{% else %}
  6219. \t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"text-muted\">Boutique inconnue</span>
  6220. \t\t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6221. \t\t\t\t\t\t\t\t\t\t\t\t</small>
  6222. \t\t\t\t\t\t\t\t\t\t\t</div>
  6223. \t\t\t\t\t\t\t\t\t\t\t<div class=\"price\">
  6224. \t\t\t\t\t\t\t\t\t\t\t\t<h6>{{ product.price|number_format(2, '.', ' ') }}
  6225. \t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  6226. \t\t\t\t\t\t\t\t\t\t\t\t{% if product.compareAtPrice %}
  6227. \t\t\t\t\t\t\t\t\t\t\t\t\t<h6 class=\"l-through\">{{ product.compareAtPrice|number_format(2, '.', ' ') }}
  6228. \t\t\t\t\t\t\t\t\t\t\t\t\t\tHTG</h6>
  6229. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6230. \t\t\t\t\t\t\t\t\t\t\t</div>
  6231. \t\t\t\t\t\t\t\t\t\t\t<div class=\"prd-bottom\">
  6232. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"social-info add-to-cart\" data-product-id=\"{{ product.id }}\" data-qty=\"1\">
  6233. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
  6234. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">+ panier</p>
  6235. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6236. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info wishlist-btn\" data-product-id=\"{{ product.id }}\" {% if app.user %} onclick=\"toggleWishlist({{ product.id }}, this); return false;\" {% else %} onclick=\"alert('Vous devez être connecté pour ajouter aux favoris'); return false;\" {% endif %}>
  6237. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-heart\"></span>
  6238. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Favoris</p>
  6239. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6240. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"social-info comparison-btn\" data-product-id=\"{{ product.id }}\" {% if app.user %} onclick=\"toggleComparison({{ product.id }}, this); return false;\" {% else %} onclick=\"alert('Vous devez être connecté pour comparer des produits'); return false;\" {% endif %}>
  6241. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-sync\"></span>
  6242. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Comparer</p>
  6243. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6244. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\" class=\"social-info\">
  6245. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-move\"></span>
  6246. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Voir plus</p>
  6247. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6248. \t\t\t\t\t\t\t\t\t\t\t</div>
  6249. \t\t\t\t\t\t\t\t\t\t</div>
  6250. \t\t\t\t\t\t\t\t\t</div>
  6251. \t\t\t\t\t\t\t\t</div>
  6252. \t\t\t\t\t\t\t{% endfor %}
  6253. \t\t\t\t\t\t</div>
  6254. \t\t\t\t\t</div>
  6255. \t\t\t\t\t<!-- Contrôles de navigation -->
  6256. \t\t\t\t\t<div class=\"featured-gallery-controls\">
  6257. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-prev\" id=\"latestGalleryPrev\" aria-label=\"Précédent\">
  6258. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-left\"></i>
  6259. \t\t\t\t\t\t</button>
  6260. \t\t\t\t\t\t<button class=\"featured-gallery-nav-btn featured-gallery-next\" id=\"latestGalleryNext\" aria-label=\"Suivant\">
  6261. \t\t\t\t\t\t\t<i class=\"lnr lnr-chevron-right\"></i>
  6262. \t\t\t\t\t\t</button>
  6263. \t\t\t\t\t</div>
  6264. \t\t\t\t\t<!-- Bouton charger plus -->
  6265. \t\t\t\t\t<div class=\"featured-gallery-load-more text-center mt-4\" id=\"latestGalleryLoadMore\" style=\"display: none;\">
  6266. \t\t\t\t\t\t<button class=\"btn btn-outline-primary\" id=\"loadMoreLatestBtn\">
  6267. \t\t\t\t\t\t\t<i class=\"lnr lnr-plus-circle me-2\"></i>
  6268. \t\t\t\t\t\t\tCharger plus de produits
  6269. \t\t\t\t\t\t</button>
  6270. \t\t\t\t\t</div>
  6271. \t\t\t\t</div>
  6272. \t\t\t\t<div class=\"text-center mt-5\">
  6273. \t\t\t\t\t<a href=\"{{ path('ui_listing') }}\" class=\"btn-view-all-products\">
  6274. \t\t\t\t\t\t<span>Voir tous les produits</span>
  6275. \t\t\t\t\t\t<i class=\"lnr lnr-arrow-right\"></i>
  6276. \t\t\t\t\t</a>
  6277. \t\t\t\t</div>
  6278. \t\t\t</div>
  6279. \t\t</section>
  6280. \t{% endif %}
  6281. \t{% if recommendedProducts|length > 0 %}
  6282. \t\t<section class=\"py-5\">
  6283. \t\t\t<div class=\"container\">
  6284. \t\t\t\t<div class=\"section-title text-center mb-5\">
  6285. \t\t\t\t\t<h2>Recommandés pour vous</h2>
  6286. \t\t\t\t\t<p>Suggestions basées sur votre activité récente et les tendances de MaketOu</p>
  6287. \t\t\t\t</div>
  6288. \t\t\t\t<div class=\"row g-4\">
  6289. \t\t\t\t\t{% for product in recommendedProducts %}
  6290. \t\t\t\t\t\t<div class=\"col-12 col-sm-6 col-lg-3\">
  6291. \t\t\t\t\t\t\t<div class=\"product-card h-100\">
  6292. \t\t\t\t\t\t\t\t{% set productImage = product.images[0] ?? 'ui/img/product/p1.jpg' %}
  6293. \t\t\t\t\t\t\t\t<div class=\"product-image\" style=\"background-image:url('{{ asset(productImage) }}');\">
  6294. \t\t\t\t\t\t\t\t\t{% if product.isFeatured %}
  6295. \t\t\t\t\t\t\t\t\t\t<span class=\"product-badge bg-success\">Populaire</span>
  6296. \t\t\t\t\t\t\t\t\t{% endif %}
  6297. \t\t\t\t\t\t\t\t</div>
  6298. \t\t\t\t\t\t\t\t<div class=\"p-3\">
  6299. \t\t\t\t\t\t\t\t\t<h6 class=\"mb-2\">
  6300. \t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">{{ product.name }}</a>
  6301. \t\t\t\t\t\t\t\t\t</h6>
  6302. \t\t\t\t\t\t\t\t\t<p class=\"mb-2 text-muted small\">
  6303. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store\"></i>
  6304. \t\t\t\t\t\t\t\t\t\t{% if product.shop %}
  6305. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_shop_show', {'slug': product.shop.slug}) }}\">{{ product.shop.name }}</a>
  6306. \t\t\t\t\t\t\t\t\t\t{% else %}
  6307. \t\t\t\t\t\t\t\t\t\t\tBoutique non spécifiée
  6308. \t\t\t\t\t\t\t\t\t\t{% endif %}
  6309. \t\t\t\t\t\t\t\t\t</p>
  6310. \t\t\t\t\t\t\t\t\t<div class=\"d-flex align-items-center justify-content-between\">
  6311. \t\t\t\t\t\t\t\t\t\t<span class=\"fw-bold text-primary\">{{ product.price|number_format(2, '.', ' ') }} HTG</span>
  6312. \t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"btn btn-sm btn-outline-primary add-to-cart\" data-product-id=\"{{ product.id }}\" data-qty=\"1\">
  6313. \t\t\t\t\t\t\t\t\t\t\t<i class=\"ti ti-bag\"></i>
  6314. \t\t\t\t\t\t\t\t\t\t</a>
  6315. \t\t\t\t\t\t\t\t\t</div>
  6316. \t\t\t\t\t\t\t\t</div>
  6317. \t\t\t\t\t\t\t</div>
  6318. \t\t\t\t\t\t</div>
  6319. \t\t\t\t\t{% endfor %}
  6320. \t\t\t\t</div>
  6321. \t\t\t</div>
  6322. \t\t</section>
  6323. \t{% endif %}
  6324. \t{% if recentlyViewedProducts|length > 0 %}
  6325. \t\t<section class=\"py-5 bg-light\">
  6326. \t\t\t<div class=\"container\">
  6327. \t\t\t\t<div class=\"section-title text-center mb-5\">
  6328. \t\t\t\t\t<h2>Récemment consultés</h2>
  6329. \t\t\t\t\t<p>Retrouvez les articles que vous avez explorés dernièrement</p>
  6330. \t\t\t\t</div>
  6331. \t\t\t\t<div class=\"featured-gallery-wrapper\">
  6332. \t\t\t\t\t<div class=\"featured-gallery-container\">
  6333. \t\t\t\t\t\t<div class=\"featured-gallery-grid\">
  6334. \t\t\t\t\t\t\t{% for product in recentlyViewedProducts %}
  6335. \t\t\t\t\t\t\t\t<div class=\"featured-gallery-item\">
  6336. \t\t\t\t\t\t\t\t\t<div class=\"single-product\">
  6337. \t\t\t\t\t\t\t\t\t\t<div class=\"product-image-container\">
  6338. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">
  6339. \t\t\t\t\t\t\t\t\t\t\t\t{% if product.images is defined and product.images|length > 0 %}
  6340. \t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" src=\"{{ asset(product.images[0]) }}\" alt=\"{{ product.name }}\">
  6341. \t\t\t\t\t\t\t\t\t\t\t\t{% else %}
  6342. \t\t\t\t\t\t\t\t\t\t\t\t\t<img class=\"img-fluid main-product-img\" src=\"{{ asset('ui/img/product/p1.jpg') }}\" alt=\"{{ product.name }}\">
  6343. \t\t\t\t\t\t\t\t\t\t\t\t{% endif %}
  6344. \t\t\t\t\t\t\t\t\t\t\t</a>
  6345. \t\t\t\t\t\t\t\t\t\t</div>
  6346. \t\t\t\t\t\t\t\t\t\t<div class=\"product-details\">
  6347. \t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\">
  6348. \t\t\t\t\t\t\t\t\t\t\t\t<h6>{{ product.name }}</h6>
  6349. \t\t\t\t\t\t\t\t\t\t\t</a>
  6350. \t\t\t\t\t\t\t\t\t\t\t<div class=\"price\">
  6351. \t\t\t\t\t\t\t\t\t\t\t\t<h6>{{ product.price|number_format(2, '.', ' ') }} HTG</h6>
  6352. \t\t\t\t\t\t\t\t\t\t\t</div>
  6353. \t\t\t\t\t\t\t\t\t\t\t<div class=\"prd-bottom\">
  6354. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"javascript:void(0)\" class=\"social-info add-to-cart\" data-product-id=\"{{ product.id }}\" data-qty=\"1\">
  6355. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"ti-bag\"></span>
  6356. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">+ panier</p>
  6357. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6358. \t\t\t\t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_product_show', { slug: product.slug }) }}\" class=\"social-info\">
  6359. \t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"lnr lnr-move\"></span>
  6360. \t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"hover-text\">Voir</p>
  6361. \t\t\t\t\t\t\t\t\t\t\t\t</a>
  6362. \t\t\t\t\t\t\t\t\t\t\t</div>
  6363. \t\t\t\t\t\t\t\t\t\t</div>
  6364. \t\t\t\t\t\t\t\t\t</div>
  6365. \t\t\t\t\t\t\t\t</div>
  6366. \t\t\t\t\t\t\t{% endfor %}
  6367. \t\t\t\t\t\t</div>
  6368. \t\t\t\t\t</div>
  6369. \t\t\t\t</div>
  6370. \t\t\t</div>
  6371. \t\t</section>
  6372. \t{% endif %}
  6373. \t<!-- Fonctionnalités -->
  6374. \t<section class=\"py-5\">
  6375. \t\t<div class=\"container\">
  6376. \t\t\t<div class=\"section-title\">
  6377. \t\t\t\t<h2>Pourquoi choisir MaketOu ?</h2>
  6378. \t\t\t\t<p>Découvrez les avantages de notre plateforme</p>
  6379. \t\t\t</div>
  6380. \t\t\t<div class=\"row\">
  6381. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  6382. \t\t\t\t\t<div class=\"feature-card\">
  6383. \t\t\t\t\t\t<div class=\"feature-icon\">
  6384. \t\t\t\t\t\t\t<i class=\"lnr lnr-rocket\"></i>
  6385. \t\t\t\t\t\t</div>
  6386. \t\t\t\t\t\t<h5>Livraison rapide</h5>
  6387. \t\t\t\t\t\t<p>Recevez vos commandes rapidement avec notre réseau de livraison optimisé</p>
  6388. \t\t\t\t\t</div>
  6389. \t\t\t\t</div>
  6390. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  6391. \t\t\t\t\t<div class=\"feature-card\">
  6392. \t\t\t\t\t\t<div class=\"feature-icon\">
  6393. \t\t\t\t\t\t\t<i class=\"lnr lnr-lock\"></i>
  6394. \t\t\t\t\t\t</div>
  6395. \t\t\t\t\t\t<h5>Paiement sécurisé</h5>
  6396. \t\t\t\t\t\t<p>Vos transactions sont protégées avec les dernières technologies de sécurité</p>
  6397. \t\t\t\t\t</div>
  6398. \t\t\t\t</div>
  6399. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  6400. \t\t\t\t\t<div class=\"feature-card\">
  6401. \t\t\t\t\t\t<div class=\"feature-icon\">
  6402. \t\t\t\t\t\t\t<i class=\"lnr lnr-phone\"></i>
  6403. \t\t\t\t\t\t</div>
  6404. \t\t\t\t\t\t<h5>Support 24/7</h5>
  6405. \t\t\t\t\t\t<p>Notre équipe est disponible pour vous aider à tout moment</p>
  6406. \t\t\t\t\t</div>
  6407. \t\t\t\t</div>
  6408. \t\t\t\t<div class=\"col-lg-3 col-md-6 mb-4\">
  6409. \t\t\t\t\t<div class=\"feature-card\">
  6410. \t\t\t\t\t\t<div class=\"feature-icon\">
  6411. \t\t\t\t\t\t\t<i class=\"lnr lnr-undo\"></i>
  6412. \t\t\t\t\t\t</div>
  6413. \t\t\t\t\t\t<h5>Retour facile</h5>
  6414. \t\t\t\t\t\t<p>Politique de retour flexible pour votre tranquillité d'esprit</p>
  6415. \t\t\t\t\t</div>
  6416. \t\t\t\t</div>
  6417. \t\t\t</div>
  6418. \t\t</div>
  6419. \t</section>
  6420. \t<!-- Newsletter -->
  6421. \t<section class=\"newsletter-section-modern py-5\">
  6422. \t\t<div class=\"container\">
  6423. \t\t\t<div class=\"row justify-content-center\">
  6424. \t\t\t\t<div class=\"col-lg-10\">
  6425. \t\t\t\t\t<div class=\"newsletter-card\">
  6426. \t\t\t\t\t\t<div class=\"row align-items-center\">
  6427. \t\t\t\t\t\t\t<div class=\"col-lg-6 text-center text-lg-start mb-4 mb-lg-0\">
  6428. \t\t\t\t\t\t\t\t<div class=\"newsletter-icon mb-3\">
  6429. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-envelope\" style=\"font-size: 4rem; color: #ffa200;\"></i>
  6430. \t\t\t\t\t\t\t\t</div>
  6431. \t\t\t\t\t\t\t\t<h2 class=\"newsletter-title mb-3\">Restez informé des dernières nouveautés</h2>
  6432. \t\t\t\t\t\t\t\t<p class=\"newsletter-description mb-0\">
  6433. \t\t\t\t\t\t\t\t\tInscrivez-vous à notre newsletter pour recevoir les offres exclusives, 
  6434. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                                les nouveaux produits et les meilleures promotions directement dans votre boîte mail.
  6435. \t\t\t\t\t\t\t\t</p>
  6436. \t\t\t\t\t\t\t</div>
  6437. \t\t\t\t\t\t\t<div class=\"col-lg-6\">
  6438. \t\t\t\t\t\t\t\t<form class=\"newsletter-form-modern\" id=\"newsletterFormHome\">
  6439. \t\t\t\t\t\t\t\t\t<div class=\"newsletter-input-wrapper\">
  6440. \t\t\t\t\t\t\t\t\t\t<input type=\"email\" class=\"newsletter-input\" placeholder=\"Votre adresse email\" required name=\"email\">
  6441. \t\t\t\t\t\t\t\t\t\t<button class=\"newsletter-button\" type=\"submit\">
  6442. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-arrow-right me-2\"></i>
  6443. \t\t\t\t\t\t\t\t\t\t\tS'abonner
  6444. \t\t\t\t\t\t\t\t\t\t</button>
  6445. \t\t\t\t\t\t\t\t\t</div>
  6446. \t\t\t\t\t\t\t\t\t<p class=\"newsletter-privacy mt-3 text-center\">
  6447. \t\t\t\t\t\t\t\t\t\t<small>
  6448. \t\t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-lock me-1\"></i>
  6449. \t\t\t\t\t\t\t\t\t\t\tVos données sont sécurisées. Pas de spam, désinscription facile.
  6450. \t\t\t\t\t\t\t\t\t\t</small>
  6451. \t\t\t\t\t\t\t\t\t</p>
  6452. \t\t\t\t\t\t\t\t</form>
  6453. \t\t\t\t\t\t\t</div>
  6454. \t\t\t\t\t\t</div>
  6455. \t\t\t\t\t</div>
  6456. \t\t\t\t</div>
  6457. \t\t\t</div>
  6458. \t\t</div>
  6459. \t</section>
  6460. \t<!-- Call to Action -->
  6461. \t<section class=\"cta-section-modern py-5\">
  6462. \t\t<div class=\"container\">
  6463. \t\t\t<div class=\"cta-card\">
  6464. \t\t\t\t<div class=\"row align-items-center\">
  6465. \t\t\t\t\t<div class=\"col-lg-6 mb-4 mb-lg-0\">
  6466. \t\t\t\t\t\t<div class=\"cta-content\">
  6467. \t\t\t\t\t\t\t<span class=\"cta-badge\">
  6468. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-rocket me-2\"></i>
  6469. \t\t\t\t\t\t\t\tCommencez dès aujourd'hui
  6470. \t\t\t\t\t\t\t</span>
  6471. \t\t\t\t\t\t\t<h2 class=\"cta-title mb-3\">Prêt à commencer ?</h2>
  6472. \t\t\t\t\t\t\t<p class=\"cta-description mb-4\">
  6473. \t\t\t\t\t\t\t\tQue vous soyez
  6474. \t\t\t\t\t\t\t\t<strong>acheteur</strong>
  6475. \t\t\t\t\t\t\t\tou
  6476. \t\t\t\t\t\t\t\t<strong>vendeur</strong>, MaketOu vous offre la plateforme idéale 
  6477. \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t                            pour vos besoins commerciaux en Haïti. Rejoignez des milliers d'utilisateurs satisfaits !
  6478. \t\t\t\t\t\t\t</p>
  6479. \t\t\t\t\t\t\t<div class=\"cta-features mb-4\">
  6480. \t\t\t\t\t\t\t\t<div class=\"cta-feature-item\">
  6481. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  6482. \t\t\t\t\t\t\t\t\t<span>Plateforme 100% sécurisée</span>
  6483. \t\t\t\t\t\t\t\t</div>
  6484. \t\t\t\t\t\t\t\t<div class=\"cta-feature-item\">
  6485. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  6486. \t\t\t\t\t\t\t\t\t<span>Support client 24/7</span>
  6487. \t\t\t\t\t\t\t\t</div>
  6488. \t\t\t\t\t\t\t\t<div class=\"cta-feature-item\">
  6489. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\"></i>
  6490. \t\t\t\t\t\t\t\t\t<span>Paiements multiples</span>
  6491. \t\t\t\t\t\t\t\t</div>
  6492. \t\t\t\t\t\t\t</div>
  6493. \t\t\t\t\t\t\t<div class=\"cta-buttons\">
  6494. \t\t\t\t\t\t\t\t<button type=\"button\" class=\"btn cta-button-primary\" onclick=\"openReadyModal()\">
  6495. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-rocket me-2\"></i>
  6496. \t\t\t\t\t\t\t\t\tPrêt à commencer ?
  6497. \t\t\t\t\t\t\t\t</button>
  6498. \t\t\t\t\t\t\t\t<a href=\"{{ path('ui_listing') }}\" class=\"btn cta-button-secondary\">
  6499. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-magnifier me-2\"></i>
  6500. \t\t\t\t\t\t\t\t\tVoir les produits
  6501. \t\t\t\t\t\t\t\t</a>
  6502. \t\t\t\t\t\t\t</div>
  6503. \t\t\t\t\t\t</div>
  6504. \t\t\t\t\t</div>
  6505. \t\t\t\t\t<div class=\"col-lg-6\">
  6506. \t\t\t\t\t\t<div class=\"cta-image-wrapper\">
  6507. \t\t\t\t\t\t\t<div class=\"cta-decoration\"></div>
  6508. \t\t\t\t\t\t\t<img src=\"{{ asset('Start.png') }}\" alt=\"MaketOu\" class=\"cta-image\">
  6509. \t\t\t\t\t\t</div>
  6510. \t\t\t\t\t</div>
  6511. \t\t\t\t</div>
  6512. \t\t\t</div>
  6513. \t\t</div>
  6514. \t</section>
  6515. {% endblock %}
  6516. {% block javascripts %}
  6517. \t<script src=\"{{ asset('ui/js/product-unified.js') }}\"></script>
  6518. \t<script>
  6519. \t\twindow.openReadyModal = function () {
  6520. \t\t\tconst modalEl = document.getElementById('readyModal');
  6521. \t\t\tif (!modalEl) {
  6522. \t\t\t\tconsole.error('readyModal introuvable');
  6523. \t\t\t\treturn;
  6524. \t\t\t}
  6525. \t\t\tif (typeof bootstrap === 'undefined' || !bootstrap.Modal) {
  6526. \t\t\t\tconsole.error('Bootstrap Modal non chargé');
  6527. \t\t\t\treturn;
  6528. \t\t\t}
  6529. \t\t\tconst modalInstance = bootstrap.Modal.getOrCreateInstance(modalEl);
  6530. \t\t\tmodalInstance.show();
  6531. \t\t};
  6532. \t</script>
  6533. \t<script>
  6534. \t\t// Variables globales pour la navigation des images (si pas déjà définies)
  6535. \t\tif (typeof productImages === 'undefined') {
  6536. \t\t\twindow.productImages = {};
  6537. \t\t\twindow.currentImageIndex = {};
  6538. \t\t}
  6539. // Initialisation des données d'images pour les produits \"Produits en vedette\"
  6540. {% if featuredProducts is defined %}
  6541. {% for product in featuredProducts %}
  6542. {% if product.images is defined and product.images|length > 0 %}
  6543. productImages[{{ product.id }}] = [{% for img in product.images %}'{{ asset(img) }}'{% if not loop.last %},{% endif %}{% endfor %}];
  6544. currentImageIndex[{{ product.id }}] = 0;{% endif %}{% endfor %}{% endif %}
  6545. // Initialisation des données d'images pour les produits \"Nouveautés\"
  6546. {% if latestProducts is defined %}
  6547. {% for product in latestProducts %}
  6548. {% if product.images is defined and product.images|length > 0 %}
  6549. productImages[{{ product.id }}] = [{% for img in product.images %}'{{ asset(img) }}'{% if not loop.last %},{% endif %}{% endfor %}];
  6550. currentImageIndex[{{ product.id }}] = 0;{% endif %}{% endfor %}{% endif %}
  6551. console.log('SCRIPT LOADED - Featured Gallery');
  6552. (function () {
  6553. \t'use strict';
  6554. \tconst SECTION_CONFIGS = [
  6555. \t\t{ grid: '#featuredGalleryGrid', prev: '#featuredGalleryPrev', next: '#featuredGalleryNext' },
  6556. \t\t{ grid: '#latestGalleryGrid', prev: '#latestGalleryPrev', next: '#latestGalleryNext' }
  6557. \t];
  6558. \tfunction triggerRipple(button) {
  6559. \t\tbutton.classList.remove('btn-ripple');
  6560. \t\tvoid button.offsetWidth;
  6561. \t\tbutton.classList.add('btn-ripple');
  6562. \t\tsetTimeout(() => button.classList.remove('btn-ripple'), 350);
  6563. \t}
  6564. \tfunction initSectionCarousel(config) {
  6565. \t\tconst \$grid = \$(config.grid);
  6566. \t\tif (!\$grid.length) {
  6567. \t\t\tconsole.warn('Grid not found:', config.grid);
  6568. \t\t\treturn;
  6569. \t\t}
  6570. \t\tif (typeof \$.fn.owlCarousel !== 'function') {
  6571. \t\t\tconsole.warn('OwlCarousel n\\'est pas chargé pour', config.grid);
  6572. \t\t\treturn;
  6573. \t\t}
  6574. \t\t// Si déjà initialisé, récupérer l'instance existante
  6575. \t\tlet owlInstance;
  6576. \t\tif (\$grid.hasClass('owl-loaded')) {
  6577. \t\t\towlInstance = \$grid.data('owl.carousel');
  6578. \t\t\tconsole.log('OwlCarousel already initialized for', config.grid, owlInstance);
  6579. \t\t} else {
  6580. \t\t\tif (!\$grid.hasClass('owl-carousel')) {
  6581. \t\t\t\t\$grid.addClass('owl-carousel');
  6582. \t\t\t}
  6583. \t\t\towlInstance = \$grid.owlCarousel({
  6584. \t\t\t\tloop: true,
  6585. \t\t\t\tmargin: 30,
  6586. \t\t\t\tautoplay: true,
  6587. \t\t\t\tautoplayTimeout: 4800,
  6588. \t\t\t\tautoplayHoverPause: true,
  6589. \t\t\t\tsmartSpeed: 650,
  6590. \t\t\t\tnav: false,
  6591. \t\t\t\tdots: false,
  6592. \t\t\t\tresponsive: {
  6593. \t\t\t\t\t0: { items: 1, margin: 15 },
  6594. \t\t\t\t\t576: { items: 1.2, margin: 18 },
  6595. \t\t\t\t\t768: { items: 2, margin: 20 },
  6596. \t\t\t\t\t992: { items: 3, margin: 25 },
  6597. \t\t\t\t\t1400: { items: 4, margin: 30 }
  6598. \t\t\t\t}
  6599. \t\t\t});
  6600. \t\t\tconsole.log('OwlCarousel initialized for', config.grid, owlInstance);
  6601. \t\t}
  6602. \t\tconst \$prev = \$(config.prev);
  6603. \t\tconst \$next = \$(config.next);
  6604. \t\tif (\$prev.length) {
  6605. \t\t\t\$prev.off('click.carouselNav').on('click.carouselNav', function (e) {
  6606. \t\t\t\te.preventDefault();
  6607. \t\t\t\te.stopPropagation();
  6608. \t\t\t\tconsole.log('Prev clicked for', config.grid, 'Instance:', owlInstance);
  6609. \t\t\t\tif (owlInstance) {
  6610. \t\t\t\t\ttry {
  6611. \t\t\t\t\t\t\$grid.trigger('prev.owl.carousel');
  6612. \t\t\t\t\t\ttriggerRipple(this);
  6613. \t\t\t\t\t} catch (err) {
  6614. \t\t\t\t\t\tconsole.error('Error triggering prev:', err);
  6615. \t\t\t\t\t}
  6616. \t\t\t\t} else {
  6617. \t\t\t\t\tconsole.error('OwlCarousel instance not available');
  6618. \t\t\t\t}
  6619. \t\t\t});
  6620. \t\t} else {
  6621. \t\t\tconsole.warn('Prev button not found:', config.prev);
  6622. \t\t}
  6623. \t\tif (\$next.length) {
  6624. \t\t\t\$next.off('click.carouselNav').on('click.carouselNav', function (e) {
  6625. \t\t\t\te.preventDefault();
  6626. \t\t\t\te.stopPropagation();
  6627. \t\t\t\tconsole.log('Next clicked for', config.grid, 'Instance:', owlInstance);
  6628. \t\t\t\tif (owlInstance) {
  6629. \t\t\t\t\ttry {
  6630. \t\t\t\t\t\t\$grid.trigger('next.owl.carousel');
  6631. \t\t\t\t\t\ttriggerRipple(this);
  6632. \t\t\t\t\t} catch (err) {
  6633. \t\t\t\t\t\tconsole.error('Error triggering next:', err);
  6634. \t\t\t\t\t}
  6635. \t\t\t\t} else {
  6636. \t\t\t\t\tconsole.error('OwlCarousel instance not available');
  6637. \t\t\t\t}
  6638. \t\t\t});
  6639. \t\t} else {
  6640. \t\t\tconsole.warn('Next button not found:', config.next);
  6641. \t\t}
  6642. \t}
  6643. \tfunction ensureOwl(attempt = 0) {
  6644. \t\tif (window.jQuery && typeof \$.fn !== 'undefined' && typeof \$.fn.owlCarousel === 'function') {
  6645. \t\t\tSECTION_CONFIGS.forEach(initSectionCarousel);
  6646. \t\t} else if (attempt < 15) {
  6647. \t\t\tsetTimeout(() => ensureOwl(attempt + 1), 200);
  6648. \t\t} else {
  6649. \t\t\tconsole.warn('OwlCarousel non disponible après plusieurs tentatives');
  6650. \t\t}
  6651. \t}
  6652. \tdocument.addEventListener('DOMContentLoaded', function () {
  6653. \t\tensureOwl();
  6654. \t});
  6655. })();
  6656. document.addEventListener('DOMContentLoaded', function () { // Animation des cartes au scroll
  6657. const observerOptions = {
  6658. threshold: 0.1,
  6659. rootMargin: '0px 0px -50px 0px'
  6660. };
  6661. const observer = new IntersectionObserver(function (entries) {
  6662. entries.forEach(entry => {
  6663. if (entry.isIntersecting) {
  6664. entry.target.style.opacity = '1';
  6665. entry.target.style.transform = 'translateY(0)';
  6666. }
  6667. });
  6668. }, observerOptions);
  6669. // Observer toutes les cartes
  6670. document.querySelectorAll('.stats-card, .category-card, .product-card, .feature-card').forEach(card => {
  6671. card.style.opacity = '0';
  6672. card.style.transform = 'translateY(30px)';
  6673. card.style.transition = 'all 0.6s ease';
  6674. observer.observe(card);
  6675. });
  6676. // Compteur animé pour les statistiques
  6677. function animateCounter(element, target, duration = 2000) {
  6678. let start = 0;
  6679. const increment = target / (duration / 16);
  6680. function updateCounter() {
  6681. start += increment;
  6682. if (start < target) {
  6683. element.textContent = Math.floor(start).toLocaleString();
  6684. requestAnimationFrame(updateCounter);
  6685. } else {
  6686. element.textContent = target.toLocaleString();
  6687. }
  6688. }
  6689. updateCounter();
  6690. }
  6691. // Animer les compteurs quand ils sont visibles
  6692. const statsObserver = new IntersectionObserver(function (entries) {
  6693. entries.forEach(entry => {
  6694. if (entry.isIntersecting) {
  6695. const numberElement = entry.target.querySelector('.stats-number');
  6696. const target = parseInt(numberElement.textContent.replace(/,/g, ''));
  6697. animateCounter(numberElement, target);
  6698. statsObserver.unobserve(entry.target);
  6699. }
  6700. });
  6701. });
  6702. document.querySelectorAll('.stats-card').forEach(card => {
  6703. statsObserver.observe(card);
  6704. });
  6705. // Gestion de la newsletter
  6706. const newsletterForm = document.querySelector('.newsletter-form');
  6707. if (newsletterForm) {
  6708. newsletterForm.addEventListener('submit', function (e) {
  6709. e.preventDefault();
  6710. const email = this.querySelector('input[type=\"email\"]').value;
  6711. const button = this.querySelector('button');
  6712. const originalText = button.innerHTML;
  6713. // Désactiver le bouton
  6714. button.disabled = true;
  6715. button.innerHTML = '<i class=\"lnr lnr-spinner me-2\"></i>Inscription...';
  6716. // Envoyer la requête
  6717. fetch('{{ path(\"ui_newsletter_subscribe\") }}', {
  6718. method: 'POST',
  6719. headers: {
  6720. 'Content-Type': 'application/x-www-form-urlencoded',
  6721. 'X-Requested-With': 'XMLHttpRequest'
  6722. },
  6723. body: 'email=' + encodeURIComponent(email)
  6724. }).then(response => response.json()).then(data => {
  6725. if (data.success) {
  6726. button.innerHTML = '<i class=\"lnr lnr-check me-2\"></i>Inscription réussie !';
  6727. button.classList.remove('btn-warning');
  6728. button.classList.add('btn-success');
  6729. this.reset();
  6730. } else {
  6731. button.innerHTML = '<i class=\"lnr lnr-warning me-2\"></i>Erreur';
  6732. button.classList.remove('btn-warning');
  6733. button.classList.add('btn-danger');
  6734. }
  6735. setTimeout(() => {
  6736. button.innerHTML = originalText;
  6737. button.classList.remove('btn-success', 'btn-danger');
  6738. button.classList.add('btn-warning');
  6739. button.disabled = false;
  6740. }, 3000);
  6741. }).catch(error => {
  6742. console.error('Erreur:', error);
  6743. button.innerHTML = '<i class=\"lnr lnr-warning me-2\"></i>Erreur';
  6744. button.classList.remove('btn-warning');
  6745. button.classList.add('btn-danger');
  6746. setTimeout(() => {
  6747. button.innerHTML = originalText;
  6748. button.classList.remove('btn-danger');
  6749. button.classList.add('btn-warning');
  6750. button.disabled = false;
  6751. }, 3000);
  6752. });
  6753. });
  6754. }
  6755. });
  6756. // Effet parallaxe léger pour le hero
  6757. window.addEventListener('scroll', function () {
  6758. const scrolled = window.pageYOffset;
  6759. const hero = document.querySelector('.hero-banner');
  6760. if (hero) {
  6761. hero.style.transform = `translateY(\${
  6762. scrolled * 0.5
  6763. }px)`;
  6764. }
  6765. });
  6766. });
  6767. // Fonction pour afficher toutes les catégories
  6768. function showAllCategories () {
  6769. const container = document.getElementById('productCategoriesContainer');
  6770. const btn = document.getElementById('showAllCategoriesBtn');{% if allCategories|length > 8 %}{% for category in allCategories %}{% if loop.index > 8 %}const categoryHtml {{ loop.index }} = `
  6771.         <div class=\"col-lg-3 col-md-4 col-sm-6 mb-4\">
  6772.             <div class=\"category-card-custom\">
  6773.                 <div class=\"category-image-wrapper\">
  6774.                     <div class=\"category-image\" style=\"background-image: url('{% if category.bannerImage %}{{ asset('uploads/categories/banner/' ~ category.bannerImage) }}{% else %}{{ asset('ui/img/category/cat-' ~ loop.index ~ '.jpg') }}{% endif %}')\">
  6775.                         <div class=\"category-overlay-custom\">
  6776.                             <div class=\"category-icon-wrapper\">
  6777.                                 <i class=\"lnr lnr-tag\" style=\"font-size: 3rem;\"></i>
  6778.                                 <h4 class=\"mt-3\">{{ category.name }}</h4>
  6779.                             </div>
  6780.                         </div>
  6781.                     </div>
  6782.                 </div>
  6783.                 <div class=\"category-content p-3\">
  6784.                     <h5 class=\"mb-2\">{{ category.name }}</h5>
  6785.                     {% if category.description %}
  6786.                         <p class=\"text-muted mb-3 small\">{{ category.description|striptags|slice(0, 60) }}{% if category.description|striptags|length > 60 %}...{% endif %}</p>
  6787.                     {% endif %}
  6788.                     <a href=\"{{ path('ui_listing', {'category': category.slug}) }}\" class=\"btn btn-primary-custom btn-sm w-100\">
  6789.                         Voir les produits
  6790.                     </a>
  6791.                 </div>
  6792.             </div>
  6793.         </div>
  6794.     `;
  6795. container.insertAdjacentHTML('beforeend', categoryHtml {{ loop.index }});{% endif %}{% endfor %}{% endif %}if (btn) 
  6796. btn.style.display = 'none';
  6797. }
  6798. // Fonction pour afficher toutes les catégories de boutiques
  6799. function showAllShopCategories () {
  6800. const container = document.getElementById('shopCategoriesContainer');
  6801. const btn = document.querySelector('[onclick=\"showAllShopCategories()\"]') ?. parentElement;{% if allShopCategories|length > 6 %}{% for shopCategory in allShopCategories %}{% if loop.index > 6 %}const shopCategoryHtml {{ loop.index }} = `
  6802.         <div class=\"col-lg-4 col-md-6 mb-4\">
  6803.             <a href=\"{{ path('ui_shops_list') }}?category={{ shopCategory.slug }}\" class=\"text-decoration-none\" style=\"display: block;\">
  6804.                 <div class=\"category-card-custom shop-category-clickable\">
  6805.                     <div class=\"category-image-wrapper\">
  6806.                         <div class=\"category-image\" style=\"background-image: url('{% if shopCategory.bannerImage %}{{ asset(shopCategory.bannerImage) }}{% else %}{{ asset('ui/img/category/shop-' ~ loop.index ~ '.jpg') }}{% endif %}')\">
  6807.                             <div class=\"category-overlay-custom\">
  6808.                                 <div class=\"category-icon-wrapper\">
  6809.                                     <i class=\"lnr lnr-store\" style=\"font-size: 3rem;\"></i>
  6810.                                     <h4 class=\"mt-3\">{{ shopCategory.name }}</h4>
  6811.                                     {% if shopCategory.description %}
  6812.                                         <p class=\"mt-2 px-3\">{{ shopCategory.description|striptags|slice(0, 100) }}{% if shopCategory.description|striptags|length > 100 %}...{% endif %}</p>
  6813.                                     {% endif %}
  6814.                                 </div>
  6815.                             </div>
  6816.                         </div>
  6817.                     </div>
  6818.                     <div class=\"category-content p-3\">
  6819.                         <h5 class=\"mb-2\">{{ shopCategory.name }}</h5>
  6820.                         {% if shopCategory.description %}
  6821.                             <p class=\"text-muted mb-3 small\">{{ shopCategory.description|striptags|slice(0, 80) }}{% if shopCategory.description|striptags|length > 80 %}...{% endif %}</p>
  6822.                         {% endif %}
  6823.                         <span class=\"btn btn-primary-custom btn-sm w-100\">
  6824.                             Voir les boutiques <i class=\"lnr lnr-arrow-right ms-2\"></i>
  6825.                         </span>
  6826.                     </div>
  6827.                 </div>
  6828.             </a>
  6829.         </div>
  6830.     `;
  6831. container.insertAdjacentHTML('beforeend', shopCategoryHtml {{ loop.index }});{% endif %}{% endfor %}{% endif %}if (btn) 
  6832. btn.style.display = 'none';
  6833. }
  6834.     // Initialiser les carousels
  6835.     <script src=\"{{ asset('ui/js/product-unified.js') }}\"></script>
  6836.     <script>
  6837.         document.addEventListener('DOMContentLoaded', function() {
  6838.             // Init featured products images
  6839.             {% if featuredProducts is defined %}
  6840.                 {% for product in featuredProducts %}
  6841.                     {% if product.images is defined and product.images|length > 0 %}
  6842.                         if (typeof initProductImages === 'function') {
  6843.                             initProductImages({{ product.id }}, {{ product.images|json_encode|raw }});
  6844.                         }
  6845.                     {% endif %}
  6846.                 {% endfor %}
  6847.             {% endif %}
  6848.             // Init latest products images
  6849.             {% if latestProducts is defined %}
  6850.                 {% for product in latestProducts %}
  6851.                     {% if product.images is defined and product.images|length > 0 %}
  6852.                         if (typeof initProductImages === 'function') {
  6853.                             initProductImages({{ product.id }}, {{ product.images|json_encode|raw }});
  6854.                         }
  6855.                     {% endif %}
  6856.                 {% endfor %}
  6857.             {% endif %}
  6858.         });
  6859.     </script>
  6860.     <script>
  6861.     \$(document).ready(function () { // Carousel bannière principale
  6862. if (\$('.active-banner-slider').length) {
  6863. \$('.active-banner-slider').owlCarousel({
  6864. items: 1,
  6865. loop: true,
  6866. autoplay: true,
  6867. autoplayTimeout: 6000,
  6868. autoplayHoverPause: true,
  6869. nav: true,
  6870. dots: true,
  6871. navText: [
  6872. '<i class=\"lnr lnr-chevron-left\"></i>', '<i class=\"lnr lnr-chevron-right\"></i>'
  6873. ],
  6874. smartSpeed: 1000,
  6875. animateOut: 'fadeOut',
  6876. animateIn: 'fadeIn',
  6877. responsive: {
  6878. 0: {
  6879. items: 1,
  6880. nav: true,
  6881. dots: true
  6882. },
  6883. 768: {
  6884. items: 1,
  6885. nav: true,
  6886. dots: true
  6887. },
  6888. 992: {
  6889. items: 1,
  6890. nav: true,
  6891. dots: true
  6892. }
  6893. }
  6894. });
  6895. }
  6896. // Animation d'apparition pour les cartes produits
  6897. const observerOptions = {
  6898. threshold: 0.1,
  6899. rootMargin: '0px 0px -50px 0px'
  6900. };
  6901. const productObserver = new IntersectionObserver(function (entries) {
  6902. entries.forEach(entry => {
  6903. if (entry.isIntersecting) {
  6904. entry.target.style.opacity = '1';
  6905. entry.target.style.transform = 'translateY(0)';
  6906. }
  6907. });
  6908. }, observerOptions);
  6909. document.querySelectorAll('.product-card-modern').forEach((card, index) => {
  6910. card.style.opacity = '0';
  6911. card.style.transform = 'translateY(20px)';
  6912. card.style.transition = `opacity 0.6s ease \${
  6913. index * 0.1
  6914. }s, transform 0.6s ease \${
  6915. index * 0.1
  6916. }s`;
  6917. productObserver.observe(card);
  6918. });
  6919. });
  6920. \t</script>
  6921. \t<!-- Modal \"Prêt à commencer ?\" -->
  6922. \t<div class=\"modal fade\" id=\"readyModal\" tabindex=\"-1\">
  6923. \t\t<div class=\"modal-dialog modal-dialog-centered\">
  6924. \t\t\t<div class=\"modal-content\">
  6925. \t\t\t\t<div class=\"modal-header\">
  6926. \t\t\t\t\t<h5 class=\"modal-title\">
  6927. \t\t\t\t\t\t<i class=\"lnr lnr-rocket me-2\"></i>Prêt à commencer ?
  6928. \t\t\t\t\t</h5>
  6929. \t\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\"></button>
  6930. \t\t\t\t</div>
  6931. \t\t\t\t<div class=\"modal-body\">
  6932. \t\t\t\t\t{% if app.user %}
  6933. \t\t\t\t\t\t{% if app.user.kycStatus == 'verified' %}
  6934. \t\t\t\t\t\t\t<div class=\"text-center\">
  6935. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle\" style=\"font-size: 4rem; color: #28a745;\"></i>
  6936. \t\t\t\t\t\t\t\t<h4 class=\"mt-3\">Votre compte est vérifié !</h4>
  6937. \t\t\t\t\t\t\t\t<p class=\"text-muted\">Vous pouvez commencer à utiliser MaketOu en toute sérénité.</p>
  6938. \t\t\t\t\t\t\t\t<div class=\"mt-4\">
  6939. \t\t\t\t\t\t\t\t\t<a href=\"{{ path('seller_index') }}\" class=\"btn btn-primary me-2\">
  6940. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-store me-1\"></i>Ouvrir ma boutique
  6941. \t\t\t\t\t\t\t\t\t</a>
  6942. \t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_listing') }}\" class=\"btn btn-outline-primary\">
  6943. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-magnifier me-1\"></i>Voir les produits
  6944. \t\t\t\t\t\t\t\t\t</a>
  6945. \t\t\t\t\t\t\t\t</div>
  6946. \t\t\t\t\t\t\t</div>
  6947. \t\t\t\t\t\t{% else %}
  6948. \t\t\t\t\t\t\t<div class=\"text-center\">
  6949. \t\t\t\t\t\t\t\t<i class=\"lnr lnr-shield\" style=\"font-size: 4rem; color: #ffa200;\"></i>
  6950. \t\t\t\t\t\t\t\t<h4 class=\"mt-3\">Vérification requise</h4>
  6951. \t\t\t\t\t\t\t\t<p class=\"text-muted\">Pour utiliser toutes les fonctionnalités de MaketOu, vous devez compléter votre vérification KYC.</p>
  6952. \t\t\t\t\t\t\t\t<div class=\"mt-4\">
  6953. \t\t\t\t\t\t\t\t\t<a href=\"{{ path('ui_account_kyc') }}\" class=\"btn btn-primary btn-lg\">
  6954. \t\t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-checkmark-circle me-1\"></i> <span class=\"d-none d-md-inline\">Commencer la vérification</span>
  6955. \t\t\t\t\t\t\t\t\t</a>
  6956. \t\t\t\t\t\t\t\t</div>
  6957. \t\t\t\t\t\t\t</div>
  6958. \t\t\t\t\t\t{% endif %}
  6959. \t\t\t\t\t{% else %}
  6960. \t\t\t\t\t\t<div class=\"text-center\">
  6961. \t\t\t\t\t\t\t<i class=\"lnr lnr-user\" style=\"font-size: 4rem; color: #007bff;\"></i>
  6962. \t\t\t\t\t\t\t<h4 class=\"mt-3\">Connectez-vous pour commencer</h4>
  6963. \t\t\t\t\t\t\t<p class=\"text-muted\">Créez un compte ou connectez-vous pour accéder à toutes les fonctionnalités de MaketOu.</p>
  6964. \t\t\t\t\t\t\t<div class=\"mt-4\">
  6965. \t\t\t\t\t\t\t\t<a href=\"{{ path('ui_app_login') }}\" class=\"btn btn-primary btn-lg me-2\">
  6966. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-enter me-1\"></i> Se connecter
  6967. \t\t\t\t\t\t\t\t</a>
  6968. \t\t\t\t\t\t\t\t<a href=\"{{ path('ui_app_register') }}\" class=\"btn btn-outline-primary btn-lg\">
  6969. \t\t\t\t\t\t\t\t\t<i class=\"lnr lnr-user-plus me-1\"></i> S'inscrire
  6970. \t\t\t\t\t\t\t\t</a>
  6971. \t\t\t\t\t\t\t</div>
  6972. \t\t\t\t\t\t</div>
  6973. \t\t\t\t\t{% endif %}
  6974. \t\t\t\t</div>
  6975. \t\t\t</div>
  6976. \t\t</div>
  6977. \t</div>
  6978. {% endblock %}
  6979. ""home/index.html.twig""/home/u540977899/domains/maketou-ht.com/public_html/templates/home/index.html.twig");
  6980.     }
  6981. }