templates/home/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base_home.html.twig' %}
  2. {% block title %}Accueil | MaketOu - Votre marketplace haïtienne
  3. {% endblock %}
  4. {% block stylesheets %}
  5.     <style>
  6.         /* Styles personnalisés pour la page d'accueil */
  7.         .hero-banner {
  8.             background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  9.             color: white;
  10.             padding: 100px 0;
  11.             position: relative;
  12.             overflow: hidden;
  13.         }
  14.         .hero-banner::before {
  15.             content: '';
  16.             position: absolute;
  17.             top: 0;
  18.             left: 0;
  19.             right: 0;
  20.             bottom: 0;
  21.             background: 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>');
  22.             opacity: 0.3;
  23.         }
  24.         .hero-content {
  25.             position: relative;
  26.             z-index: 2;
  27.         }
  28.         .stats-card {
  29.             background: white;
  30.             border-radius: 15px;
  31.             padding: 30px;
  32.             text-align: center;
  33.             box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
  34.             transition: transform 0.3s ease;
  35.         }
  36.         .stats-card:hover {
  37.             transform: translateY(-5px);
  38.         }
  39.         .stats-number {
  40.             font-size: 3rem;
  41.             font-weight: bold;
  42.             color: #ffa200;
  43.             display: block;
  44.         }
  45.         .stats-label {
  46.             color: #666;
  47.             font-size: 1.1rem;
  48.             margin-top: 10px;
  49.         }
  50.         .category-card {
  51.             background: white;
  52.             border-radius: 15px;
  53.             overflow: hidden;
  54.             box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  55.             transition: all 0.3s ease;
  56.             height: 100%;
  57.         }
  58.         .category-card:hover {
  59.             transform: translateY(-5px);
  60.             box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  61.         }
  62.         .category-image {
  63.             height: 200px;
  64.             background-size: cover;
  65.             background-position: center;
  66.             position: relative;
  67.         }
  68.         .category-overlay {
  69.             position: absolute;
  70.             top: 0;
  71.             left: 0;
  72.             right: 0;
  73.             bottom: 0;
  74.             background: linear-gradient(45deg, rgba(255,162,0,0.8), rgba(232,145,10,0.8));
  75.             display: flex;
  76.             align-items: center;
  77.             justify-content: center;
  78.             opacity: 0;
  79.             transition: opacity 0.3s ease;
  80.         }
  81.         .category-card:hover .category-overlay {
  82.             opacity: 1;
  83.         }
  84.         .product-card {
  85.             background: white;
  86.             border-radius: 15px;
  87.             overflow: hidden;
  88.             box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  89.             transition: all 0.3s ease;
  90.             height: 100%;
  91.         }
  92.         .product-card:hover {
  93.             transform: translateY(-5px);
  94.             box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  95.         }
  96.         .product-image {
  97.             height: 250px;
  98.             background-size: cover;
  99.             background-position: center;
  100.             position: relative;
  101.         }
  102.         .product-badge {
  103.             position: absolute;
  104.             top: 15px;
  105.             right: 15px;
  106.             background: #ffa200;
  107.             color: white;
  108.             padding: 5px 10px;
  109.             border-radius: 20px;
  110.             font-size: 0.8rem;
  111.             font-weight: bold;
  112.         }
  113.         .product-info {
  114.             padding: 20px;
  115.         }
  116.         .product-title {
  117.             font-size: 1.2rem;
  118.             font-weight: 600;
  119.             margin-bottom: 10px;
  120.             color: #333;
  121.         }
  122.         .product-price {
  123.             font-size: 1.5rem;
  124.             font-weight: bold;
  125.             color: #ffa200;
  126.             margin-bottom: 10px;
  127.         }
  128.         .product-shop {
  129.             font-size: 0.9rem;
  130.             color: #666;
  131.             margin-bottom: 15px;
  132.         }
  133.         .btn-primary-custom {
  134.             background: #ffa200;
  135.             border: none;
  136.             color: white;
  137.             padding: 12px 30px;
  138.             border-radius: 25px;
  139.             font-weight: 500;
  140.             transition: all 0.3s ease;
  141.         }
  142.         .btn-primary-custom:hover {
  143.             background: #e8910a;
  144.             transform: translateY(-2px);
  145.             box-shadow: 0 5px 15px rgba(255, 162, 0, 0.3);
  146.         }
  147.         .section-title {
  148.             text-align: center;
  149.             margin-bottom: 50px;
  150.         }
  151.         .section-title h2 {
  152.             font-size: 2.5rem;
  153.             font-weight: bold;
  154.             color: #333;
  155.             margin-bottom: 15px;
  156.         }
  157.         .section-title p {
  158.             font-size: 1.2rem;
  159.             color: #666;
  160.             max-width: 600px;
  161.             margin: 0 auto;
  162.         }
  163.         .feature-card {
  164.             text-align: center;
  165.             padding: 30px 20px;
  166.             background: white;
  167.             border-radius: 15px;
  168.             box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  169.             transition: all 0.3s ease;
  170.             height: 100%;
  171.         }
  172.         .feature-card:hover {
  173.             transform: translateY(-5px);
  174.             box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  175.         }
  176.         .feature-icon {
  177.             width: 80px;
  178.             height: 80px;
  179.             background: linear-gradient(135deg, #ffa200, #e8910a);
  180.             border-radius: 50%;
  181.             display: flex;
  182.             align-items: center;
  183.             justify-content: center;
  184.             margin: 0 auto 20px;
  185.             font-size: 2rem;
  186.             color: white;
  187.         }
  188.         .newsletter-section {
  189.             background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  190.             color: white;
  191.             padding: 80px 0;
  192.         }
  193.         .newsletter-form {
  194.             max-width: 500px;
  195.             margin: 0 auto;
  196.         }
  197.         .newsletter-form .form-control {
  198.             border: none;
  199.             border-radius: 25px;
  200.             padding: 15px 25px;
  201.             font-size: 1.1rem;
  202.         }
  203.         .newsletter-form .btn {
  204.             border-radius: 25px;
  205.             padding: 15px 30px;
  206.             font-weight: 500;
  207.         }
  208.         /* Styles pour les catégories personnalisées */
  209.         .category-card-custom {
  210.             background: white;
  211.             border-radius: 15px;
  212.             overflow: hidden;
  213.             box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  214.             transition: all 0.3s ease;
  215.             height: 100%;
  216.             display: flex;
  217.             flex-direction: column;
  218.         }
  219.         .category-card-custom:hover {
  220.             transform: translateY(-5px);
  221.             box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
  222.         }
  223.         .category-image-wrapper {
  224.             position: relative;
  225.             overflow: hidden;
  226.         }
  227.         .category-image {
  228.             height: 200px;
  229.             background-size: cover;
  230.             background-position: center;
  231.             position: relative;
  232.             transition: transform 0.5s ease;
  233.         }
  234.         .category-card-custom:hover .category-image {
  235.             transform: scale(1.1);
  236.         }
  237.         .category-overlay-custom {
  238.             position: absolute;
  239.             top: 0;
  240.             left: 0;
  241.             right: 0;
  242.             bottom: 0;
  243.             background: rgba(0, 0, 0, 0.5);
  244.             display: flex;
  245.             align-items: center;
  246.             justify-content: center;
  247.             opacity: 0;
  248.             transition: opacity 0.3s ease;
  249.         }
  250.         .category-card-custom:hover .category-overlay-custom {
  251.             opacity: 1;
  252.         }
  253.         .category-icon-wrapper {
  254.             text-align: center;
  255.             color: white;
  256.             transform: translateY(20px);
  257.             transition: transform 0.3s ease;
  258.         }
  259.         .category-card-custom:hover .category-icon-wrapper {
  260.             transform: translateY(0);
  261.         }
  262.         .category-content {
  263.             flex-grow: 1;
  264.             display: flex;
  265.             flex-direction: column;
  266.         }
  267.         .category-content .btn {
  268.             margin-top: auto;
  269.         }
  270.         /* Responsive Styles */
  271.         @media(max-width: 991.98px) {
  272.             .hero-banner {
  273.                 padding: 60px 0;
  274.             }
  275.             .stats-number {
  276.                 font-size: 2.5rem;
  277.             }
  278.             .section-title h2 {
  279.                 font-size: 2rem;
  280.             }
  281.             
  282.             .stats-card {
  283.                 margin-bottom: 1.5rem;
  284.             }
  285.         }
  286.         @media(max-width: 767.98px) {
  287.             .hero-banner {
  288.                 padding: 40px 0;
  289.             }
  290.             .hero-content h1 {
  291.                 font-size: 1.75rem;
  292.             }
  293.             .stats-number {
  294.                 font-size: 2rem;
  295.             }
  296.             .stats-label {
  297.                 font-size: 0.9rem;
  298.             }
  299.             .section-title h2 {
  300.                 font-size: 1.75rem;
  301.             }
  302.             .section-title p {
  303.                 font-size: 1rem;
  304.             }
  305.             
  306.             .category-card,
  307.             .product-card {
  308.                 margin-bottom: 1.5rem;
  309.             }
  310.             
  311.             .category-image {
  312.                 height: 150px;
  313.             }
  314.             
  315.             .product-image {
  316.                 height: 200px;
  317.             }
  318.             
  319.             .feature-card {
  320.                 margin-bottom: 1.5rem;
  321.             }
  322.             
  323.             .newsletter-section {
  324.                 padding: 40px 0;
  325.             }
  326.         }
  327.         @media(max-width: 575.98px) {
  328.             .hero-banner {
  329.                 padding: 30px 0;
  330.             }
  331.             .hero-content h1 {
  332.                 font-size: 1.5rem;
  333.             }
  334.             .stats-card {
  335.                 padding: 1.5rem;
  336.             }
  337.             .stats-number {
  338.                 font-size: 1.75rem;
  339.             }
  340.             .section-title h2 {
  341.                 font-size: 1.5rem;
  342.             }
  343.             
  344.             .category-image {
  345.                 height: 120px;
  346.             }
  347.             
  348.             .product-image {
  349.                 height: 180px;
  350.             }
  351.             
  352.             .product-info {
  353.                 padding: 1rem;
  354.             }
  355.             
  356.             .product-title {
  357.                 font-size: 1rem;
  358.             }
  359.             
  360.             .product-price {
  361.                 font-size: 1.25rem;
  362.             }
  363.         }
  364.         /* Styles modernes pour le carousel de bannière */
  365.         .banner-area-modern {
  366.             position: relative;
  367.             width: 100%;
  368.             min-height: 500px;
  369.             background: url('{{ asset('ui/img/banner/banner-bg.jpg') }}') center center no-repeat;
  370.             background-size: cover;
  371.             overflow: hidden;
  372.             padding: 60px 0;
  373.         }
  374.         .banner-area-modern::before {
  375.             content: '';
  376.             position: absolute;
  377.             top: 0;
  378.             left: 0;
  379.             width: 100%;
  380.             height: 100%;
  381.             background: rgba(0, 0, 0, 0.1);
  382.             z-index: 1;
  383.         }
  384.         .banner-carousel-wrapper {
  385.             position: relative;
  386.             width: 100%;
  387.             height: 100%;
  388.             z-index: 2;
  389.         }
  390.         .banner-slide-item {
  391.             min-height: 500px;
  392.             display: flex;
  393.             align-items: center;
  394.             padding: 40px 0;
  395.         }
  396.         .banner-content-modern {
  397.             position: relative;
  398.             z-index: 2;
  399.             padding: 30px;
  400.             background: rgba(255, 255, 255, 0.98);
  401.             border-radius: 20px;
  402.             box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
  403.             backdrop-filter: blur(10px);
  404.             animation: fadeInUp 0.8s ease;
  405.         }
  406.         @keyframes fadeInUp {
  407.             from {
  408.                 opacity: 0;
  409.                 transform: translateY(30px);
  410.             }
  411.             to {
  412.                 opacity: 1;
  413.                 transform: translateY(0);
  414.             }
  415.         }
  416.         .banner-badge {
  417.             display: inline-block;
  418.             background: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  419.             color: white;
  420.             padding: 8px 20px;
  421.             border-radius: 50px;
  422.             font-size: 0.85rem;
  423.             font-weight: 600;
  424.             margin-bottom: 20px;
  425.             box-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  426.         }
  427.         .banner-badge i {
  428.             margin-right: 5px;
  429.         }
  430.         .banner-title-modern {
  431.             font-size: 2.0rem;
  432.             font-weight: 600;
  433.             color: #2c3e50;
  434.             margin-bottom: 20px;
  435.             line-height: 1.2;
  436.             background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  437.             -webkit-background-clip: text;
  438.             -webkit-text-fill-color: transparent;
  439.             background-clip: text;
  440.         }
  441.         .banner-description-modern {
  442.             font-size: 1.1rem;
  443.             color: #555;
  444.             line-height: 1.8;
  445.             margin-bottom: 25px;
  446.         }
  447.         .banner-price-modern {
  448.             display: flex;
  449.             align-items: center;
  450.             gap: 15px;
  451.             margin-bottom: 30px;
  452.             padding: 15px 20px;
  453.             background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  454.             border-radius: 12px;
  455.             border-left: 4px solid #ffa200;
  456.         }
  457.         .banner-price-modern .price-label {
  458.             font-size: 0.9rem;
  459.             color: #666;
  460.             font-weight: 600;
  461.             text-transform: uppercase;
  462.             letter-spacing: 1px;
  463.         }
  464.         .banner-price-modern .price-value {
  465.             font-size: 1.2rem;
  466.             font-weight: 600;
  467.             color: #ffa200;
  468.         }
  469.         .banner-actions-modern {
  470.             display: flex;
  471.             gap: 15px;
  472.             flex-wrap: wrap;
  473.         }
  474.         .btn-banner-primary {
  475.             display: inline-flex;
  476.             align-items: center;
  477.             gap: 10px;
  478.             padding: 15px 35px;
  479.             background: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  480.             color: white;
  481.             text-decoration: none;
  482.             border-radius: 50px;
  483.             font-weight: 600;
  484.             font-size: 1rem;
  485.             transition: all 0.3s ease;
  486.             box-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  487.         }
  488.         .btn-banner-primary:hover {
  489.             transform: translateY(-3px);
  490.             box-shadow: 0 8px 25px rgba(255, 162, 0, 0.6);
  491.             color: white;
  492.         }
  493.         .btn-banner-primary .btn-icon {
  494.             transition: transform 0.3s ease;
  495.         }
  496.         .btn-banner-primary:hover .btn-icon {
  497.             transform: translateX(5px);
  498.         }
  499.         .btn-banner-secondary {
  500.             display: inline-flex;
  501.             align-items: center;
  502.             gap: 8px;
  503.             padding: 15px 25px;
  504.             background: white;
  505.             color: #667eea;
  506.             text-decoration: none;
  507.             border-radius: 50px;
  508.             font-weight: 600;
  509.             font-size: 0.95rem;
  510.             border: 2px solid #667eea;
  511.             transition: all 0.3s ease;
  512.         }
  513.         .btn-banner-secondary:hover {
  514.             background: #667eea;
  515.             color: white;
  516.             transform: translateY(-3px);
  517.             box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
  518.         }
  519.         .banner-image-modern {
  520.             position: relative;
  521.             height: 450px;
  522.             display: flex;
  523.             align-items: center;
  524.             justify-content: center;
  525.         }
  526.         .banner-image-wrapper {
  527.             position: relative;
  528.             width: 100%;
  529.             height: 100%;
  530.             border-radius: 20px;
  531.             overflow: hidden;
  532.             box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
  533.             background: white;
  534.             padding: 20px;
  535.         }
  536.         .banner-img {
  537.             width: 100%;
  538.             height: 100%;
  539.             object-fit: contain;
  540.             border-radius: 15px;
  541.             transition: transform 0.5s ease;
  542.         }
  543.         .banner-slide-item:hover .banner-img {
  544.             transform: scale(1.05);
  545.         }
  546.         .banner-image-overlay {
  547.             position: absolute;
  548.             top: 0;
  549.             left: 0;
  550.             width: 100%;
  551.             height: 100%;
  552.             background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);
  553.             border-radius: 15px;
  554.             pointer-events: none;
  555.         }
  556.         /* Styles pour Owl Carousel */
  557.         .banner-area-modern .owl-nav {
  558.             position: absolute;
  559.             top: 50%;
  560.             transform: translateY(-50%);
  561.             width: 100%;
  562.             display: flex;
  563.             justify-content: space-between;
  564.             align-items: center;
  565.             padding: 0 20px;
  566.             pointer-events: none;
  567.             z-index: 10;
  568.             left: 0;
  569.             right: 0;
  570.             box-sizing: border-box;
  571.         }
  572.         .banner-area-modern .owl-nav button {
  573.             width: 60px;
  574.             height: 60px;
  575.             min-width: 60px;
  576.             min-height: 60px;
  577.             background: #ffa200 !important;
  578.             border-radius: 50% !important;
  579.             display: flex !important;
  580.             align-items: center;
  581.             justify-content: center;
  582.             color: white !important;
  583.             font-size: 24px !important;
  584.             box-shadow: 0 4px 15px rgba(255, 162, 0, 0.4);
  585.             transition: all 0.3s ease;
  586.             pointer-events: all;
  587.             border: none !important;
  588.             position: relative;
  589.             flex-shrink: 0;
  590.             margin: 0;
  591.             padding: 0;
  592.             line-height: 1;
  593.         }
  594.         .banner-area-modern .owl-nav button.owl-prev {
  595.             margin-right: auto;
  596.         }
  597.         .banner-area-modern .owl-nav button.owl-next {
  598.             margin-left: auto;
  599.         }
  600.         .banner-area-modern .owl-nav button:hover {
  601.             background: #ff6b00 !important;
  602.             color: white !important;
  603.             transform: scale(1.1);
  604.             box-shadow: 0 6px 20px rgba(255, 162, 0, 0.6);
  605.         }
  606.         .banner-area-modern .owl-nav button.disabled {
  607.             opacity: 0.5;
  608.             cursor: not-allowed;
  609.         }
  610.         .banner-area-modern .owl-nav button.disabled:hover {
  611.             transform: scale(1);
  612.         }
  613.         .banner-area-modern .owl-dots {
  614.             position: absolute;
  615.             bottom: 30px;
  616.             left: 50%;
  617.             transform: translateX(-50%);
  618.             display: flex;
  619.             gap: 10px;
  620.             z-index: 10;
  621.         }
  622.         .banner-area-modern .owl-dots button {
  623.             width: 12px;
  624.             height: 12px;
  625.             border-radius: 50%;
  626.             background: rgba(255, 255, 255, 0.6) !important;
  627.             border: 2px solid white !important;
  628.             transition: all 0.3s ease;
  629.             margin: 0 5px;
  630.         }
  631.         .banner-area-modern .owl-dots button.active {
  632.             background: #ffa200 !important;
  633.             border-color: #ffa200 !important;
  634.             width: 30px;
  635.             border-radius: 6px;
  636.         }
  637.         /* Responsive */
  638.         @media(max-width: 992px) {
  639.             .banner-area-modern {
  640.                 min-height: 450px;
  641.                 padding: 40px 0;
  642.                 background-size: cover;
  643.                 background-position: center;
  644.             }
  645.             .banner-slide-item {
  646.                 min-height: 450px;
  647.                 padding: 30px 0;
  648.             }
  649.             .banner-title-modern {
  650.                 font-size: 1.5rem;
  651.             }
  652.             .banner-description-modern {
  653.                 font-size: 1rem;
  654.             }
  655.             .banner-image-modern {
  656.                 height: 350px;
  657.                 margin-top: 30px;
  658.             }
  659.             .banner-content-modern {
  660.                 padding: 25px;
  661.             }
  662.         }
  663.         @media(max-width: 768px) {
  664.             .banner-area-modern {
  665.                 min-height: 400px;
  666.                 padding: 30px 0;
  667.                 background-size: cover;
  668.                 background-position: center;
  669.             }
  670.             .banner-slide-item {
  671.                 min-height: 400px;
  672.                 padding: 20px 0;
  673.             }
  674.             .banner-title-modern {
  675.                 font-size: 1.25rem;
  676.             }
  677.             .banner-description-modern {
  678.                 font-size: 0.95rem;
  679.             }
  680.             .banner-image-modern {
  681.                 height: 280px;
  682.                 margin-top: 20px;
  683.             }
  684.             .banner-content-modern {
  685.                 padding: 20px;
  686.             }
  687.             .banner-price-modern .price-value {
  688.                 font-size: 1.25rem;
  689.             }
  690.             .banner-actions-modern {
  691.                 flex-direction: column;
  692.             }
  693.             .btn-banner-primary,
  694.             .btn-banner-secondary {
  695.                 width: 100%;
  696.                 justify-content: center;
  697.             }
  698.             .banner-area-modern .owl-nav button {
  699.                 width: 50px;
  700.                 height: 50px;
  701.                 min-width: 50px;
  702.                 min-height: 50px;
  703.                 font-size: 20px !important;
  704.                 background: #ffa200 !important;
  705.             }
  706.             .banner-area-modern .owl-nav button:hover {
  707.                 background: #ff6b00 !important;
  708.             }
  709.         }
  710.         @media(max-width: 576px) {
  711.             .banner-area-modern {
  712.                 min-height: 350px;
  713.                 padding: 0;
  714.                 background-size: cover;
  715.                 background-position: center;
  716.             }
  717.             .banner-slide-item {
  718.                 min-height: 350px;
  719.             }
  720.             .banner-title-modern {
  721.                 font-size: 1.25rem;
  722.             }
  723.             .banner-image-modern {
  724.                 height: 220px;
  725.             }
  726.             .banner-content-modern {
  727.                 padding: 15px;
  728.             }
  729.         }
  730.         /* Styles pour les catégories de boutiques cliquables */
  731.         .shop-category-clickable {
  732.             cursor: pointer;
  733.             transition: all 0.3s ease;
  734.             height: 100%;
  735.         }
  736.         .shop-category-clickable:hover {
  737.             transform: translateY(-10px);
  738.             box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  739.         }
  740.         .shop-category-clickable:hover .category-image {
  741.             transform: scale(1.1);
  742.         }
  743.         .shop-category-clickable:hover .btn-primary-custom {
  744.             background: #e8910a;
  745.             transform: translateX(5px);
  746.         }
  747.         /* Styles pour les cartes de catégories personnalisées */
  748.         .category-card-custom {
  749.             border-radius: 15px;
  750.             overflow: hidden;
  751.             box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
  752.             transition: transform 0.3s ease, box-shadow 0.3s ease;
  753.             background: white;
  754.             height: 100%;
  755.         }
  756.         .category-card-custom:hover {
  757.             transform: translateY(-10px);
  758.             box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
  759.         }
  760.         .category-image-wrapper {
  761.             position: relative;
  762.             height: 200px;
  763.             overflow: hidden;
  764.         }
  765.         .category-image {
  766.             width: 100%;
  767.             height: 100%;
  768.             background-size: cover;
  769.             background-position: center;
  770.             transition: transform 0.3s ease;
  771.         }
  772.         .category-card-custom:hover .category-image {
  773.             transform: scale(1.1);
  774.         }
  775.         .category-overlay-custom {
  776.             position: absolute;
  777.             top: 0;
  778.             left: 0;
  779.             width: 100%;
  780.             height: 100%;
  781.             background: rgba(0, 0, 0, 0.6);
  782.             display: flex;
  783.             align-items: center;
  784.             justify-content: center;
  785.             opacity: 0;
  786.             transition: opacity 0.3s ease;
  787.             color: white;
  788.         }
  789.         .category-card-custom:hover .category-overlay-custom {
  790.             opacity: 1;
  791.         }
  792.         .category-icon-wrapper {
  793.             text-align: center;
  794.         }
  795.         .category-icon-wrapper i {
  796.             color: #ffa200;
  797.             display: block;
  798.         }
  799.         .category-icon-wrapper h4 {
  800.             color: white;
  801.             margin-top: 10px;
  802.         }
  803.         /* Styles pour la galerie de produits en vedette */
  804.         .featured-products-carousel-section {
  805.             position: relative;
  806.             overflow: hidden;
  807.         }
  808.         .featured-gallery-wrapper {
  809.             position: relative;
  810.             max-width: 1400px;
  811.             margin: 0 auto;
  812.             padding: 0 15px;
  813.         }
  814.         .featured-gallery-container {
  815.             position: relative;
  816.             overflow: visible;
  817.             border-radius: 12px;
  818.         }
  819.         .featured-gallery-grid {
  820.             display: flex;
  821.             gap: 30px;
  822.             padding: 15px 0;
  823.             overflow-x: auto;
  824.             overflow-y: hidden;
  825.             scroll-behavior: smooth;
  826.             scroll-behavior: smooth;
  827.             scrollbar-width: none; /* Firefox */
  828.             -ms-overflow-style: none; /* IE/Edge */
  829.             -webkit-overflow-scrolling: touch; /* iOS smooth scroll */
  830.             will-change: scroll-position;
  831.         }
  832.         .featured-gallery-grid::-webkit-scrollbar {
  833.             display: none; /* Chrome/Safari */
  834.         }
  835.         /* Mode OwlCarousel */
  836.         .featured-gallery-grid.owl-carousel {
  837.             display: block;
  838.             overflow: hidden;
  839.             padding: 25px 0;
  840.         }
  841.         .featured-gallery-grid.owl-carousel .owl-stage-outer {
  842.             overflow: visible;
  843.         }
  844.         .featured-gallery-grid.owl-carousel .featured-gallery-item {
  845.             opacity: 1;
  846.             transform: none;
  847.             width: auto;
  848.             max-width: none;
  849.             margin: 0 15px;
  850.         }
  851.         .featured-gallery-grid.owl-carousel .owl-stage {
  852.             display: flex;
  853.         }
  854.         .featured-gallery-item {
  855.             flex: 0 0 auto; /* Largeur automatique basée sur le contenu */
  856.             width: 100%;
  857.             max-width: 100%;
  858.             opacity: 0;
  859.             transform: translateY(20px) scale(0.95);
  860.             animation: galleryItemFadeIn 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
  861.             animation-delay: calc(var(--item-index, 0) * 0.05s);
  862.         }
  863.         /* Produits plus larges et esthétiques - 3 par ligne sur grands écrans */
  864.         @media(min-width: 1200px) {
  865.             .featured-gallery-item {
  866.                 flex: 0 0 calc(33.333333% - 20px);
  867.                 max-width: calc(33.333333% - 20px);
  868.             }
  869.         }
  870.         @media(min-width: 992px) and (max-width: 1199px) {
  871.             .featured-gallery-item {
  872.                 flex: 0 0 calc(33.333333% - 20px);
  873.                 max-width: calc(33.333333% - 20px);
  874.             }
  875.         }
  876.         @media(min-width: 768px) and (max-width: 991px) {
  877.             .featured-gallery-item {
  878.                 flex: 0 0 calc(50% - 15px);
  879.                 max-width: calc(50% - 15px);
  880.             }
  881.         }
  882.         @media(max-width: 767px) {
  883.             .featured-gallery-item {
  884.                 flex: 0 0 100%;
  885.                 max-width: 100%;
  886.             }
  887.         }
  888.         /* Design amélioré pour single-product - plus large et esthétique */
  889.         .featured-gallery-item .single-product {
  890.             margin-bottom: 0;
  891.             min-height: 520px;
  892.             display: flex;
  893.             flex-direction: column;
  894.             padding: 25px;
  895.             background: #fff;
  896.             border-radius: 16px;
  897.             box-shadow: 0 8px 25px rgba(15, 34, 58, 0.1);
  898.             transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  899.             border: 1px solid rgba(0, 0, 0, 0.05);
  900.             position: relative;
  901.             overflow: hidden;
  902.         }
  903.         .featured-gallery-item .single-product::before {
  904.             content: '';
  905.             position: absolute;
  906.             top: 0;
  907.             left: 0;
  908.             right: 0;
  909.             height: 4px;
  910.             background: linear-gradient(90deg, #ffa200 0%, #ff6b00 100%);
  911.             transform: scaleX(0);
  912.             transform-origin: left;
  913.             transition: transform 0.4s ease;
  914.         }
  915.         .featured-gallery-item .single-product:hover {
  916.             transform: translateY(-8px);
  917.             box-shadow: 0 20px 50px rgba(15, 34, 58, 0.15);
  918.             border-color: rgba(255, 162, 0, 0.3);
  919.         }
  920.         .featured-gallery-item .single-product:hover::before {
  921.             transform: scaleX(1);
  922.         }
  923.         /* S'assurer que les images s'affichent correctement - styles identiques à listing.html.twig */
  924.         .featured-gallery-item .single-product img {
  925.             margin-bottom: 20px;
  926.             width: 100%;
  927.         }
  928.         /* Styles améliorés pour product-image-container - plus large et esthétique */
  929.         .featured-gallery-item .product-image-container {
  930.             position: relative;
  931.             overflow: hidden;
  932.             border-radius: 14px;
  933.             height: 320px;
  934.             display: flex;
  935.             align-items: center;
  936.             justify-content: center;
  937.             background: linear-gradient(135deg, #f7f7fb 0%, #e8ecf1 100%);
  938.             margin-bottom: 22px;
  939.             box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
  940.         }
  941.         .featured-gallery-item .product-image-container:hover {
  942.             box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
  943.         }
  944.         .featured-gallery-item .product-image-container:hover .main-product-img {
  945.             transform: scale(1.08);
  946.             transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  947.         }
  948.         .featured-gallery-item .product-image-container a {
  949.             display: block;
  950.             width: 100%;
  951.             height: 100%;
  952.         }
  953.         .featured-gallery-item .main-product-img {
  954.             transition: transform 0.3s ease;
  955.             width: 100% !important;
  956.             height: 100% !important;
  957.             object-fit: cover;
  958.             object-position: center;
  959.             display: block;
  960.             will-change: transform, opacity;
  961.         }
  962.         .featured-gallery-item .main-product-img.image-fade {
  963.             animation: imageFade 0.5s ease;
  964.         }
  965.         @keyframes imageFade {
  966.             from {
  967.                 opacity: 0;
  968.                 transform: scale(1.02);
  969.             }
  970.             to {
  971.                 opacity: 1;
  972.                 transform: scale(1);
  973.             }
  974.         }
  975.         .featured-gallery-item .product-details {
  976.             display: flex;
  977.             flex-direction: column;
  978.             height: 100%;
  979.             padding: 0 5px;
  980.         }
  981.         .featured-gallery-item .product-details h6 {
  982.             font-size: 1.1rem;
  983.             font-weight: 600;
  984.             margin-bottom: 12px;
  985.             line-height: 1.4;
  986.             color: #2c3e50;
  987.             min-height: 48px;
  988.         }
  989.         .featured-gallery-item .product-details h6 a {
  990.             color: #2c3e50;
  991.             text-decoration: none;
  992.             transition: color 0.3s ease;
  993.         }
  994.         .featured-gallery-item .product-details h6 a:hover {
  995.             color: #ffa200;
  996.         }
  997.         .featured-gallery-item .prd-bottom {
  998.             margin-top: auto;
  999.         }
  1000.         /* Styles pour img-nav-btn - identiques à listing.html.twig */
  1001.         .featured-gallery-item .img-nav-btn {
  1002.             position: absolute;
  1003.             top: 50%;
  1004.             transform: translateY(-50%);
  1005.             background: rgba(0, 0, 0, 0.6);
  1006.             color: white;
  1007.             border: none;
  1008.             width: 35px;
  1009.             height: 35px;
  1010.             border-radius: 50%;
  1011.             display: flex;
  1012.             align-items: center;
  1013.             justify-content: center;
  1014.             cursor: pointer;
  1015.             transition: all 0.3s ease;
  1016.             z-index: 10;
  1017.         }
  1018.         .featured-gallery-item .img-nav-btn:hover {
  1019.             background: #095ad3;
  1020.             transform: translateY(-50%) scale(1.1);
  1021.         }
  1022.         .featured-gallery-item .img-nav-left {
  1023.             left: 10px;
  1024.         }
  1025.         .featured-gallery-item .img-nav-right {
  1026.             right: 10px;
  1027.         }
  1028.         .featured-gallery-item .img-indicators {
  1029.             position: absolute;
  1030.             bottom: 10px;
  1031.             left: 50%;
  1032.             transform: translateX(-50%);
  1033.             display: flex;
  1034.             gap: 5px;
  1035.             z-index: 10;
  1036.         }
  1037.         .featured-gallery-item .indicator {
  1038.             width: 8px;
  1039.             height: 8px;
  1040.             border-radius: 50%;
  1041.             background: rgba(255, 255, 255, 0.5);
  1042.             cursor: pointer;
  1043.             margin-bottom: 10px;
  1044.             transition: all 0.3s ease;
  1045.             border: 1px solid rgba(255, 255, 255, 0.3);
  1046.         }
  1047.         .featured-gallery-item .indicator.active {
  1048.             background: #ffa200;
  1049.             border-color: #ffa200;
  1050.             transform: scale(1.2);
  1051.         }
  1052.         .featured-gallery-item .indicator:hover {
  1053.             background: rgba(255, 255, 255, 0.8);
  1054.         }
  1055.         /* Styles pour shop-info - identiques à listing.html.twig */
  1056.         .featured-gallery-item .shop-info {
  1057.             margin: 10px 0 15px 0;
  1058.             padding: 8px 0;
  1059.             border-bottom: 1px solid #f0f0f0;
  1060.         }
  1061.         .featured-gallery-item .shop-info small {
  1062.             font-size: 0.9rem;
  1063.         }
  1064.         .featured-gallery-item .shop-link {
  1065.             color: #007bff;
  1066.             text-decoration: none;
  1067.             font-weight: 500;
  1068.         }
  1069.         .featured-gallery-item .shop-link:hover {
  1070.             color: #ffa200;
  1071.             text-decoration: underline;
  1072.         }
  1073.         /* Styles améliorés pour le prix */
  1074.         .featured-gallery-item .price {
  1075.             margin-bottom: 18px;
  1076.         }
  1077.         .featured-gallery-item .price h6 {
  1078.             font-size: 1.4rem;
  1079.             font-weight: 700;
  1080.             color: #ffa200;
  1081.             margin-bottom: 5px;
  1082.         }
  1083.         .featured-gallery-item .price h6.l-through {
  1084.             font-size: 1rem;
  1085.             color: #95a5a6;
  1086.             text-decoration: line-through;
  1087.             font-weight: 500;
  1088.         }
  1089.         /* Les autres styles (prd-bottom, social-info) sont déjà définis dans main.css */
  1090.         @keyframes galleryItemFadeIn {
  1091.             from {
  1092.                 opacity: 0;
  1093.                 transform: translateY(20px) scale(0.95);
  1094.             }
  1095.             to {
  1096.                 opacity: 1;
  1097.                 transform: translateY(0) scale(1);
  1098.             }
  1099.         }
  1100.         .featured-gallery-card {
  1101.             display: flex;
  1102.             flex-direction: column;
  1103.             height: 100%;
  1104.             background: white;
  1105.             border-radius: 12px;
  1106.             overflow: hidden;
  1107.             box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
  1108.             transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1109.             border: 1px solid #f0f0f0;
  1110.         }
  1111.         .featured-gallery-card:hover {
  1112.             transform: translateY(-5px);
  1113.             box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
  1114.             border-color: #ffa200;
  1115.         }
  1116.         .featured-gallery-image-wrapper {
  1117.             position: relative;
  1118.             width: 100%;
  1119.             padding-top: 100%; /* Ratio 1:1 pour une galerie carrée */
  1120.             overflow: hidden;
  1121.             background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  1122.         }
  1123.         .featured-gallery-image {
  1124.             position: absolute;
  1125.             top: 0;
  1126.             left: 0;
  1127.             width: 100%;
  1128.             height: 100%;
  1129.             background-size: cover;
  1130.             background-position: center;
  1131.             transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
  1132.         }
  1133.         .featured-gallery-card:hover .featured-gallery-image {
  1134.             transform: scale(1.08);
  1135.         }
  1136.         .featured-gallery-badge {
  1137.             position: absolute;
  1138.             top: 8px;
  1139.             left: 8px;
  1140.             background: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1141.             color: white;
  1142.             padding: 4px 10px;
  1143.             border-radius: 15px;
  1144.             font-size: 12px;
  1145.             font-weight: 600;
  1146.             z-index: 2;
  1147.             box-shadow: 0 2px 8px rgba(255, 162, 0, 0.4);
  1148.         }
  1149.         .featured-gallery-overlay {
  1150.             position: absolute;
  1151.             top: 0;
  1152.             left: 0;
  1153.             width: 100%;
  1154.             height: 100%;
  1155.             background: rgba(0, 0, 0, 0.5);
  1156.             display: flex;
  1157.             align-items: center;
  1158.             justify-content: center;
  1159.             opacity: 0;
  1160.             transition: opacity 0.3s ease;
  1161.         }
  1162.         .featured-gallery-card:hover .featured-gallery-overlay {
  1163.             opacity: 1;
  1164.         }
  1165.         .featured-gallery-view-btn {
  1166.             background: white;
  1167.             color: #333;
  1168.             width: 40px;
  1169.             height: 40px;
  1170.             border-radius: 50%;
  1171.             display: flex;
  1172.             align-items: center;
  1173.             justify-content: center;
  1174.             text-decoration: none;
  1175.             font-size: 18px;
  1176.             transform: scale(0.8);
  1177.             transition: transform 0.3s ease;
  1178.         }
  1179.         .featured-gallery-card:hover .featured-gallery-view-btn {
  1180.             transform: scale(1);
  1181.         }
  1182.         .featured-gallery-info {
  1183.             padding: 12px;
  1184.             flex: 1;
  1185.             display: flex;
  1186.             flex-direction: column;
  1187.         }
  1188.         .featured-gallery-title {
  1189.             font-size: 14px;
  1190.             font-weight: 600;
  1191.             margin-bottom: 6px;
  1192.             color: #333;
  1193.             line-height: 1.3;
  1194.             display: -webkit-box;
  1195.             -webkit-line-clamp: 2;
  1196.             -webkit-box-orient: vertical;
  1197.             overflow: hidden;
  1198.             min-height: 36px;
  1199.         }
  1200.         .featured-gallery-title a {
  1201.             color: #333;
  1202.             text-decoration: none;
  1203.             transition: color 0.3s ease;
  1204.         }
  1205.         .featured-gallery-title a:hover {
  1206.             color: #ffa200;
  1207.         }
  1208.         .featured-gallery-price {
  1209.             font-size: 16px;
  1210.             font-weight: 700;
  1211.             color: #ffa200;
  1212.             margin-bottom: 6px;
  1213.         }
  1214.         .featured-gallery-rating {
  1215.             display: flex;
  1216.             align-items: center;
  1217.             gap: 3px;
  1218.             font-size: 11px;
  1219.         }
  1220.         .featured-gallery-rating .fa-star.active {
  1221.             color: #ffa200;
  1222.         }
  1223.         .featured-gallery-rating .fa-star-o {
  1224.             color: #ddd;
  1225.         }
  1226.         .featured-gallery-controls {
  1227.             display: flex;
  1228.             justify-content: center;
  1229.             gap: 20px;
  1230.             margin-top: 25px;
  1231.             padding: 0 20px;
  1232.         }
  1233.         .featured-gallery-nav-btn {
  1234.             width: 42px;
  1235.             height: 42px;
  1236.             border-radius: 50%;
  1237.             border: 1.5px solid #ffa200;
  1238.             background: white;
  1239.             color: #ffa200;
  1240.             font-size: 16px;
  1241.             cursor: pointer;
  1242.             display: flex;
  1243.             align-items: center;
  1244.             justify-content: center;
  1245.             transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1246.             box-shadow: 0 3px 10px rgba(255, 162, 0, 0.18);
  1247.             position: relative;
  1248.             overflow: hidden;
  1249.         }
  1250.         .featured-gallery-nav-btn.btn-ripple::after {
  1251.             content: '';
  1252.             position: absolute;
  1253.             width: 100%;
  1254.             height: 100%;
  1255.             left: 0;
  1256.             top: 0;
  1257.             border-radius: 50%;
  1258.             background: rgba(255, 162, 0, 0.2);
  1259.             animation: rippleEffect 0.35s ease;
  1260.         }
  1261.         @keyframes rippleEffect {
  1262.             from {
  1263.                 transform: scale(0.6);
  1264.                 opacity: 0.7;
  1265.             }
  1266.             to {
  1267.                 transform: scale(1.4);
  1268.                 opacity: 0;
  1269.             }
  1270.         }
  1271.         .featured-gallery-nav-btn:hover:not(:disabled) {
  1272.             background: #ffa200;
  1273.             color: white;
  1274.             transform: scale(1.1);
  1275.             box-shadow: 0 5px 18px rgba(255, 162, 0, 0.4);
  1276.         }
  1277.         .featured-gallery-nav-btn:active:not(:disabled) {
  1278.             transform: scale(0.95);
  1279.         }
  1280.         .featured-gallery-nav-btn:disabled {
  1281.             opacity: 0.3;
  1282.             cursor: not-allowed;
  1283.         }
  1284.         .featured-gallery-load-more {
  1285.             margin-top: 30px;
  1286.         }
  1287.         /* Style pour le bouton "Voir tous les produits" */
  1288.         .btn-view-all-products {
  1289.             display: inline-flex;
  1290.             align-items: center;
  1291.             gap: 12px;
  1292.             padding: 16px 40px;
  1293.             background: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1294.             color: white;
  1295.             text-decoration: none;
  1296.             border-radius: 50px;
  1297.             font-weight: 600;
  1298.             font-size: 16px;
  1299.             transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1300.             box-shadow: 0 4px 15px rgba(255, 162, 0, 0.3);
  1301.             position: relative;
  1302.             overflow: hidden;
  1303.         }
  1304.         .btn-view-all-products::before {
  1305.             content: '';
  1306.             position: absolute;
  1307.             top: 0;
  1308.             left: -100%;
  1309.             width: 100%;
  1310.             height: 100%;
  1311.             background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
  1312.             transition: left 0.5s ease;
  1313.         }
  1314.         .btn-view-all-products:hover::before {
  1315.             left: 100%;
  1316.         }
  1317.         .btn-view-all-products:hover {
  1318.             transform: translateY(-3px);
  1319.             box-shadow: 0 8px 25px rgba(255, 162, 0, 0.5);
  1320.             color: white;
  1321.         }
  1322.         .btn-view-all-products:active {
  1323.             transform: translateY(-1px);
  1324.         }
  1325.         .btn-view-all-products i {
  1326.             font-size: 18px;
  1327.             transition: transform 0.3s ease;
  1328.         }
  1329.         .btn-view-all-products:hover i {
  1330.             transform: translateX(5px);
  1331.         }
  1332.         .btn-view-all-products span {
  1333.             position: relative;
  1334.             z-index: 1;
  1335.         }
  1336.         /* Responsive */
  1337.         @media(max-width: 767px) {
  1338.             .btn-view-all-products {
  1339.                 padding: 14px 30px;
  1340.                 font-size: 14px;
  1341.             }
  1342.         }
  1343.         /* Responsive */
  1344.         @media(max-width: 767px) {
  1345.             .featured-gallery-grid {
  1346.                 gap: 10px;
  1347.             }
  1348.             .featured-gallery-info {
  1349.                 padding: 10px;
  1350.             }
  1351.             .featured-gallery-title {
  1352.                 font-size: 13px;
  1353.                 min-height: 32px;
  1354.             }
  1355.             .featured-gallery-price {
  1356.                 font-size: 14px;
  1357.             }
  1358.         }
  1359.         /* Styles pour les grilles de produits Nouveautés */
  1360.         .latest-products-grid {
  1361.             margin-top: 30px;
  1362.         }
  1363.         .product-card-modern {
  1364.             background: white;
  1365.             border-radius: 12px;
  1366.             overflow: hidden;
  1367.             box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
  1368.             transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  1369.             height: 100%;
  1370.             display: flex;
  1371.             flex-direction: column;
  1372.             border: 1px solid #f0f0f0;
  1373.         }
  1374.         .product-card-modern:hover {
  1375.             transform: translateY(-8px);
  1376.             box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
  1377.             border-color: #ffa200;
  1378.         }
  1379.         .product-image-wrapper {
  1380.             position: relative;
  1381.             width: 100%;
  1382.             padding-top: 75%; /* Ratio 4:3 */
  1383.             overflow: hidden;
  1384.             background: #f8f9fa;
  1385.         }
  1386.         .product-image {
  1387.             position: absolute;
  1388.             top: 0;
  1389.             left: 0;
  1390.             width: 100%;
  1391.             height: 100%;
  1392.             background-size: cover;
  1393.             background-position: center;
  1394.             transition: transform 0.5s ease;
  1395.         }
  1396.         .product-card-modern:hover .product-image {
  1397.             transform: scale(1.1);
  1398.         }
  1399.         .product-badge-modern {
  1400.             position: absolute;
  1401.             top: 10px;
  1402.             right: 10px;
  1403.             background: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1404.             color: white;
  1405.             padding: 6px 12px;
  1406.             border-radius: 20px;
  1407.             font-size: 12px;
  1408.             font-weight: 600;
  1409.             z-index: 2;
  1410.             box-shadow: 0 2px 8px rgba(255, 162, 0, 0.3);
  1411.         }
  1412.         .product-badge-modern.new-badge {
  1413.             background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  1414.         }
  1415.         .product-overlay {
  1416.             position: absolute;
  1417.             top: 0;
  1418.             left: 0;
  1419.             width: 100%;
  1420.             height: 100%;
  1421.             background: rgba(0, 0, 0, 0.5);
  1422.             display: flex;
  1423.             align-items: center;
  1424.             justify-content: center;
  1425.             opacity: 0;
  1426.             transition: opacity 0.3s ease;
  1427.             z-index: 1;
  1428.         }
  1429.         .product-card-modern:hover .product-overlay {
  1430.             opacity: 1;
  1431.         }
  1432.         .btn-view-product {
  1433.             background: white;
  1434.             color: #333;
  1435.             padding: 12px 24px;
  1436.             border-radius: 25px;
  1437.             text-decoration: none;
  1438.             font-weight: 600;
  1439.             display: flex;
  1440.             align-items: center;
  1441.             gap: 8px;
  1442.             transition: all 0.3s ease;
  1443.             box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
  1444.         }
  1445.         .btn-view-product:hover {
  1446.             background: #ffa200;
  1447.             color: white;
  1448.             transform: scale(1.05);
  1449.         }
  1450.         .product-info-modern {
  1451.             padding: 16px;
  1452.             flex-grow: 1;
  1453.             display: flex;
  1454.             flex-direction: column;
  1455.         }
  1456.         .product-title-modern {
  1457.             margin: 0 0 8px;
  1458.             font-size: 16px;
  1459.             font-weight: 600;
  1460.             line-height: 1.4;
  1461.         }
  1462.         .product-title-modern a {
  1463.             color: #333;
  1464.             text-decoration: none;
  1465.             transition: color 0.3s ease;
  1466.         }
  1467.         .product-title-modern a:hover {
  1468.             color: #ffa200;
  1469.         }
  1470.         .product-price-modern {
  1471.             font-size: 20px;
  1472.             font-weight: 700;
  1473.             color: #ffa200;
  1474.             margin-bottom: 8px;
  1475.         }
  1476.         .product-shop-modern {
  1477.             display: flex;
  1478.             align-items: center;
  1479.             gap: 6px;
  1480.             font-size: 13px;
  1481.             color: #666;
  1482.             margin-bottom: 8px;
  1483.         }
  1484.         .product-shop-modern i {
  1485.             color: #ffa200;
  1486.         }
  1487.         .shop-link {
  1488.             color: #666;
  1489.             text-decoration: none;
  1490.             transition: color 0.3s ease;
  1491.         }
  1492.         .shop-link:hover {
  1493.             color: #ffa200;
  1494.         }
  1495.         .product-rating-modern {
  1496.             display: flex;
  1497.             align-items: center;
  1498.             gap: 4px;
  1499.             margin-top: auto;
  1500.         }
  1501.         .product-rating-modern .fa-star.active {
  1502.             color: #ffc107;
  1503.         }
  1504.         .product-rating-modern .fa-star-o {
  1505.             color: #ddd;
  1506.         }
  1507.         .rating-count {
  1508.             font-size: 12px;
  1509.             color: #666;
  1510.             margin-left: 4px;
  1511.         }
  1512.         .product-views-modern {
  1513.             display: flex;
  1514.             align-items: center;
  1515.             gap: 6px;
  1516.             font-size: 12px;
  1517.             color: #666;
  1518.             margin-top: auto;
  1519.         }
  1520.         .product-views-modern i {
  1521.             color: #999;
  1522.         }
  1523.         /* Style des cartes produits */
  1524.         .product-card {
  1525.             background: white;
  1526.             border-radius: 15px;
  1527.             overflow: hidden;
  1528.             box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
  1529.             transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  1530.             height: 100%;
  1531.             display: flex;
  1532.             flex-direction: column;
  1533.         }
  1534.         .product-card:hover {
  1535.             box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2);
  1536.             transform: translateY(-5px);
  1537.         }
  1538.         .product-image {
  1539.             width: 100%;
  1540.             height: 250px;
  1541.             background-size: cover;
  1542.             background-position: center;
  1543.             position: relative;
  1544.             overflow: hidden;
  1545.         }
  1546.         .product-image::before {
  1547.             content: '';
  1548.             position: absolute;
  1549.             top: 0;
  1550.             left: -100%;
  1551.             width: 100%;
  1552.             height: 100%;
  1553.             background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
  1554.             transition: left 0.6s ease;
  1555.         }
  1556.         .product-card:hover .product-image::before {
  1557.             left: 100%;
  1558.         }
  1559.         .product-badge {
  1560.             position: absolute;
  1561.             top: 15px;
  1562.             right: 15px;
  1563.             background: linear-gradient(135deg, #ffa200 0%, #ff6b00 100%);
  1564.             color: white;
  1565.             padding: 8px 15px;
  1566.             border-radius: 20px;
  1567.             font-size: 0.85rem;
  1568.             font-weight: 600;
  1569.             box-shadow: 0 4px 10px rgba(255, 162, 0, 0.4);
  1570.             z-index: 1;
  1571.         }
  1572.         .product-info {
  1573.             padding: 20px;
  1574.             flex-grow: 1;
  1575.             display: flex;
  1576.             flex-direction: column;
  1577.         }
  1578.         .product-title {
  1579.             font-size: 1.1rem;
  1580.             font-weight: 600;
  1581.             color: #2c3e50;
  1582.             margin-bottom: 10px;
  1583.             line-height: 1.4;
  1584.             display: -webkit-box;
  1585.             -webkit-line-clamp: 2;
  1586.             -webkit-box-orient: vertical;
  1587.             overflow: hidden;
  1588.         }
  1589.         .product-price {
  1590.             font-size: 1.5rem;
  1591.             font-weight: 800;
  1592.             color: #ffa200;
  1593.             margin-bottom: 15px;
  1594.         }
  1595.         .product-shop {
  1596.             font-size: 0.9rem;
  1597.             color: #666;
  1598.             margin-bottom: 15px;
  1599.         }
  1600.         .product-shop a {
  1601.             color: #667eea;
  1602.             text-decoration: none;
  1603.             transition: color 0.3s ease;
  1604.         }
  1605.         .product-shop a:hover {
  1606.             color: #ffa200;
  1607.         }
  1608.         /* Newsletter Modern Styles */
  1609.         .newsletter-section-modern {
  1610.             background: linear-gradient(135deg, #ffa200 0%, #095ad3 100%);
  1611.             position: relative;
  1612.             overflow: hidden;
  1613.         }
  1614.         .newsletter-section-modern::before {
  1615.             content: '';
  1616.             position: absolute;
  1617.             top: -50%;
  1618.             right: -50%;
  1619.             width: 100%;
  1620.             height: 200%;
  1621.             background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);
  1622.             animation: pulse 3s ease-in-out infinite;
  1623.         }
  1624.         @keyframes pulse {
  1625.             0,
  1626.             100% {
  1627.                 transform: scale(1);
  1628.                 opacity: 0.5;
  1629.             }
  1630.             50% {
  1631.                 transform: scale(1.1);
  1632.                 opacity: 0.8;
  1633.             }
  1634.         }
  1635.         .newsletter-card {
  1636.             background: white;
  1637.             border-radius: 20px;
  1638.             padding: 40px;
  1639.             box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
  1640.             position: relative;
  1641.             z-index: 1;
  1642.         }
  1643.         .newsletter-title {
  1644.             font-size: 2.5rem;
  1645.             font-weight: bold;
  1646.             color: #333;
  1647.         }
  1648.         .newsletter-description {
  1649.             color: #666;
  1650.             font-size: 1.1rem;
  1651.             line-height: 1.8;
  1652.         }
  1653.         .newsletter-form-modern {
  1654.             position: relative;
  1655.         }
  1656.         .newsletter-input-wrapper {
  1657.             display: flex;
  1658.             gap: 10px;
  1659.             margin-bottom: 15px;
  1660.         }
  1661.         .newsletter-input {
  1662.             flex: 1;
  1663.             padding: 18px 25px;
  1664.             border: 2px solid #e0e0e0;
  1665.             border-radius: 50px;
  1666.             font-size: 1rem;
  1667.             transition: all 0.3s ease;            background: #fff;
  1668.             color: #333;
  1669.         }
  1670.         .newsletter-input::placeholder {
  1671.             color: #777;
  1672.         }
  1673.         .newsletter-input:focus {
  1674.             outline: none;
  1675.             border-color: #ffa200;
  1676.             box-shadow: 0 0 0 3px rgba(255, 162, 0, 0.1);
  1677.         }
  1678.         .newsletter-button {
  1679.             padding: 18px 35px;
  1680.             background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1681.             color: white;
  1682.             border: none;
  1683.             border-radius: 50px;
  1684.             font-weight: 600;
  1685.             font-size: 1rem;
  1686.             cursor: pointer;
  1687.             transition: all 0.3s ease;
  1688.             white-space: nowrap;
  1689.         }
  1690.         .newsletter-button:hover {
  1691.             transform: translateY(-2px);
  1692.             box-shadow: 0 5px 20px rgba(255, 162, 0, 0.4);
  1693.         }
  1694.         .newsletter-privacy {
  1695.             color: #999;
  1696.         }
  1697.         /* CTA Modern Styles */
  1698.         .cta-section-modern {
  1699.             background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
  1700.         }
  1701.         .cta-card {
  1702.             background: white;
  1703.             border-radius: 25px;
  1704.             padding: 50px;
  1705.             box-shadow: 0 15px 50px rgba(0, 0, 0, 0.1);
  1706.             position: relative;
  1707.             overflow: hidden;
  1708.         }
  1709.         .cta-card::before {
  1710.             content: '';
  1711.             position: absolute;
  1712.             top: -50px;
  1713.             right: -50px;
  1714.             width: 200px;
  1715.             height: 200px;
  1716.             background: linear-gradient(135deg, rgba(255,162,0,0.1) 0%, rgba(255,162,0,0.05) 100%);
  1717.             border-radius: 50%;
  1718.         }
  1719.         .cta-badge {
  1720.             display: inline-block;
  1721.             padding: 8px 20px;
  1722.             background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1723.             color: white;
  1724.             border-radius: 50px;
  1725.             font-size: 0.9rem;
  1726.             font-weight: 600;
  1727.             margin-bottom: 20px;
  1728.         }
  1729.         .cta-title {
  1730.             font-size: 3rem;
  1731.             font-weight: bold;
  1732.             color: #333;
  1733.             margin-bottom: 20px;
  1734.         }
  1735.         .cta-description {
  1736.             font-size: 1.2rem;
  1737.             color: #666;
  1738.             line-height: 1.8;
  1739.         }
  1740.         .cta-features {
  1741.             display: flex;
  1742.             flex-direction: column;
  1743.             gap: 15px;
  1744.         }
  1745.         .cta-feature-item {
  1746.             display: flex;
  1747.             align-items: center;
  1748.             gap: 10px;
  1749.             font-size: 1rem;
  1750.             color: #555;
  1751.         }
  1752.         .cta-feature-item i {
  1753.             color: #ffa200;
  1754.             font-size: 1.3rem;
  1755.         }
  1756.         .cta-buttons {
  1757.             display: flex;
  1758.             gap: 15px;
  1759.             flex-wrap: wrap;
  1760.         }
  1761.         .cta-button-primary {
  1762.             padding: 15px 35px;
  1763.             background: linear-gradient(135deg, #ffa200 0%, #e8910a 100%);
  1764.             color: white;
  1765.             border: none;
  1766.             border-radius: 50px;
  1767.             font-weight: 600;
  1768.             font-size: 1.1rem;
  1769.             transition: all 0.3s ease;
  1770.         }
  1771.         .cta-button-primary:hover {
  1772.             transform: translateY(-3px);
  1773.             box-shadow: 0 8px 25px rgba(255, 162, 0, 0.4);
  1774.             color: white;
  1775.         }
  1776.         .cta-button-secondary {
  1777.             padding: 15px 35px;
  1778.             background: white;
  1779.             color: #ffa200;
  1780.             border: 2px solid #ffa200;
  1781.             border-radius: 50px;
  1782.             font-weight: 600;
  1783.             font-size: 1.1rem;
  1784.             transition: all 0.3s ease;
  1785.         }
  1786.         .cta-button-secondary:hover {
  1787.             background: #ffa200;
  1788.             color: white;
  1789.             transform: translateY(-3px);
  1790.             box-shadow: 0 8px 25px rgba(255, 162, 0, 0.3);
  1791.         }
  1792.         .cta-image-wrapper {
  1793.             position: relative;
  1794.         }
  1795.         .cta-decoration {
  1796.             position: absolute;
  1797.             top: -20px;
  1798.             right: -20px;
  1799.             width: 150px;
  1800.             height: 150px;
  1801.             background: linear-gradient(135deg, rgba(255,162,0,0.2) 0%, rgba(255,162,0,0.05) 100%);
  1802.             border-radius: 50%;
  1803.             z-index: 0;
  1804.         }
  1805.         .cta-image {
  1806.             position: relative;
  1807.             z-index: 1;
  1808.             max-width: 100%;
  1809.             height: auto;
  1810.             border-radius: 15px;
  1811.         }
  1812.     </style>
  1813. {% endblock %}
  1814. {% block body %}
  1815.     <!-- Hero Section -->
  1816.     <!-- start banner Area avec produits en vedette -->
  1817.         {% if bannerProducts is defined and bannerProducts|length > 0 %}
  1818.             <section class="banner-area-modern"> <div class="banner-carousel-wrapper">
  1819.                 <div class="active-banner-slider owl-carousel" style="margin-top: 100px;">
  1820.                     {% for product in bannerProducts %}
  1821.                         <!-- single-slide -->
  1822.                         <div class="banner-slide-item">
  1823.                             <div class="container">
  1824.                                 <div class="row align-items-center">
  1825.                                     <div class="col-lg-4 col-md-6 col-12">
  1826.                                         <div class="banner-content-modern">
  1827.                                             <div class="banner-badge">
  1828.                                                 <i class="lnr lnr-star"></i>
  1829.                                                 Produit en vedette
  1830.                                             </div>
  1831.                                             <h1 class="banner-title-modern">{{ product.name }}</h1>
  1832.                                             <p class="banner-description-modern">
  1833.                                                 {{ product.description ? (product.description|striptags|slice(0, 120) ~ '...') : 'Découvrez ce produit exclusif sur MaketOu' }}
  1834.                                             </p>
  1835.                                             <div class="banner-price-modern">
  1836.                                                 <span class="price-label">Prix</span>
  1837.                                                 <span class="price-value">{{ product.price|number_format(2, '.', ' ') }}
  1838.                                                     HTG</span>
  1839.                                             </div>
  1840.                                             <div class="banner-actions-modern">
  1841.                                                 <a class="btn-banner-primary" href="{{ path('ui_product_show', {'slug': product.slug}) }}">
  1842.                                                     <span class="btn-text">Voir le produit</span>
  1843.                                                     <span class="btn-icon">
  1844.                                                         <i class="lnr lnr-arrow-right"></i>
  1845.                                                     </span>
  1846.                                                 </a>
  1847.                                                 {% if product.shop %}
  1848.                                                     <a class="btn-banner-secondary" href="{{ path('ui_shop_show', {'slug': product.shop.slug}) }}">
  1849.                                                         <i class="lnr lnr-store"></i>
  1850.                                                         <span>{{ product.shop.name }}</span>
  1851.                                                     </a>
  1852.                                                 {% endif %}
  1853.                                             </div>
  1854.                                         </div>
  1855.                                     </div>
  1856.                                     <div class="col-lg-8 col-md-6 col-12">
  1857.                                         <div class="banner-image-modern">
  1858.                                             <div class="banner-image-wrapper">
  1859.                                                 {% if product.images is defined and product.images|length > 0 %}
  1860.                                                     <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 }}">
  1861.                                                 {% else %}
  1862.                                                     <img class="banner-img" src="{{ asset('ui/img/product/p' ~ loop.index ~ '.jpg') }}" alt="{{ product.name }}">
  1863.                                                 {% endif %}
  1864.                                                 <div class="banner-image-overlay"></div>
  1865.                                             </div>
  1866.                                         </div>
  1867.                                     </div>
  1868.                                 </div>
  1869.                             </div>
  1870.                         </div>
  1871.                     {% endfor %}
  1872.                 </div>
  1873.             </div>
  1874.         </section>
  1875.     {% else %}
  1876.         <!-- Banner par défaut si pas de produits en vedette -->
  1877.         <section class="banner-area-modern">
  1878.             <div class="banner-carousel-wrapper">
  1879.                 <div class="container">
  1880.                     <div class="row align-items-center justify-content-center">
  1881.                         <div class="col-lg-8 text-center">
  1882.                             <div class="banner-content-modern" style="margin-top: 140px;">
  1883.                                 <h1 class="banner-title-modern">Bienvenue sur MaketOu</h1>
  1884.                                 <p class="banner-description-modern">Votre marketplace haïtienne</p>
  1885.                             </div>
  1886.                         </div>
  1887.                     </div>
  1888.                 </div>
  1889.             </div>
  1890.         </section>
  1891.     {% endif %}
  1892.     <!-- End banner Area -->
  1893.     <!-- Catégories de produits -->
  1894.     {% if categories|length > 0 %}
  1895.         <section class="py-5">
  1896.             <div class="container">
  1897.                 <div class="section-title">
  1898.                     <h2>Nos catégories</h2>
  1899.                     <p>Explorez nos différentes catégories de produits</p>
  1900.                 </div>
  1901.                 <div class="row" id="productCategoriesContainer">
  1902.                     {% for category in categories|slice(0, 8) %}
  1903.                         <div class="col-lg-3 col-md-4 col-sm-6 mb-4">
  1904.                             <div class="category-card-custom">
  1905.                                 <div class="category-image-wrapper">
  1906.                                     <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 %}')">
  1907.                                         <div class="category-overlay-custom">
  1908.                                             <div class="category-icon-wrapper">
  1909.                                                 <i class="lnr lnr-tag" style="font-size: 3rem;"></i>
  1910.                                                 <h4 class="mt-3">{{ category.name }}</h4>
  1911.                                             </div>
  1912.                                         </div>
  1913.                                     </div>
  1914.                                 </div>
  1915.                                 <div class="category-content p-3">
  1916.                                     <h5 class="mb-2">{{ category.name }}</h5>
  1917.                                     {% if category.description %}
  1918.                                         <p class="text-muted mb-3 small">{{ category.description|striptags|slice(0, 60) }}
  1919.                                             {% if category.description|striptags|length > 60 %}...
  1920.                                             {% endif %}
  1921.                                         </p>
  1922.                                     {% endif %}
  1923.                                     <a href="{{ path('ui_listing', {'category': category.slug}) }}" class="btn btn-primary-custom btn-sm w-100">
  1924.                                         Voir les produits
  1925.                                     </a>
  1926.                                 </div>
  1927.                             </div>
  1928.                         </div>
  1929.                     {% endfor %}
  1930.                 </div>
  1931.             </div>
  1932.         </section>
  1933.     {% endif %}
  1934.     <!-- Catégories de boutiques -->
  1935.     {% if shopCategories|length > 0 %}
  1936.         <section class="py-5 bg-light">
  1937.             <div class="container">
  1938.                 <div class="section-title">
  1939.                     <h2>Nos catégories de boutiques</h2>
  1940.                     <p>Explorez les différentes catégories de boutiques disponibles sur MaketOu</p>
  1941.                 </div>
  1942.                 <div class="row" id="shopCategoriesContainer">
  1943.                     {% for shopCategory in shopCategories|slice(0, 6) %}
  1944.                         <div class="col-lg-4 col-md-6 mb-4">
  1945.                             <a href="{{ path('ui_shops_list') }}?category={{ shopCategory.slug }}" class="text-decoration-none" style="display: block;">
  1946.                                 <div class="category-card-custom shop-category-clickable">
  1947.                                     <div class="category-image-wrapper">
  1948.                                         <div class="category-image" style="background-image: url('{% if shopCategory.bannerImage %}{{ asset(shopCategory.bannerImage) }}{% else %}{{ asset('ui/img/category/shop-' ~ loop.index ~ '.jpg') }}{% endif %}')">
  1949.                                             <div class="category-overlay-custom">
  1950.                                                 <div class="category-icon-wrapper">
  1951.                                                     <i class="lnr lnr-store" style="font-size: 3rem;"></i>
  1952.                                                     <h4 class="mt-3">{{ shopCategory.name }}</h4>
  1953.                                                     {% if shopCategory.description %}
  1954.                                                         <p class="mt-2 px-3">{{ shopCategory.description|striptags|slice(0, 100) }}
  1955.                                                             {% if shopCategory.description|striptags|length > 100 %}...
  1956.                                                             {% endif %}
  1957.                                                         </p>
  1958.                                                     {% endif %}
  1959.                                                 </div>
  1960.                                             </div>
  1961.                                         </div>
  1962.                                     </div>
  1963.                                     <div class="category-content p-3">
  1964.                                         <h5 class="mb-2">{{ shopCategory.name }}</h5>
  1965.                                         {% if shopCategory.description %}
  1966.                                             <p class="text-muted mb-3 small">{{ shopCategory.description|striptags|slice(0, 80) }}
  1967.                                                 {% if shopCategory.description|striptags|length > 80 %}...
  1968.                                                 {% endif %}
  1969.                                             </p>
  1970.                                         {% endif %}
  1971.                                         <span class="btn btn-primary-custom btn-sm w-100">
  1972.                                             Voir les boutiques
  1973.                                             <i class="lnr lnr-arrow-right ms-2"></i>
  1974.                                         </span>
  1975.                                     </div>
  1976.                                 </div>
  1977.                             </a>
  1978.                         </div>
  1979.                     {% endfor %}
  1980.                 </div>
  1981.                 {% if shopCategories|length > 6 %}
  1982.                     <div class="text-center mt-4">
  1983.                         <button class="btn btn-outline-primary btn-lg" onclick="showAllShopCategories()">
  1984.                             <i class="lnr lnr-store me-2"></i>
  1985.                             Voir toutes les catégories de boutiques ({{ shopCategories|length }})
  1986.                         </button>
  1987.                     </div>
  1988.                 {% endif %}
  1989.             </div>
  1990.         </section>
  1991.     {% endif %}
  1992.     <!-- Produits en vedette -->
  1993.     {% if featuredProducts|length > 0 %}
  1994.         <section class="py-5">
  1995.             <div class="container">
  1996.                 <div class="section-title text-center mb-5">
  1997.                     <h2>Produits en vedette</h2>
  1998.                     <p>Découvrez nos produits les plus populaires et les mieux notés</p>
  1999.                 </div>
  2000.                 <div class="featured-gallery-wrapper">
  2001.                     <div class="featured-gallery-container">
  2002.                         <div class="featured-gallery-grid" id="featuredGalleryGrid">
  2003.                             {% for product in featuredProducts %}
  2004.                                 <div class="featured-gallery-item">
  2005.                                     <div class="single-product">
  2006.                                         <div class="product-image-container" onmouseenter="showImageNav({{ product.id }})" onmouseleave="hideImageNav({{ product.id }})">
  2007.                                             <a href="{{ path('ui_product_show', { slug: product.slug }) }}">
  2008.                                                 {% if product.images is defined and product.images|length > 0 %}
  2009.                                                     <img 
  2010.                                                         class="img-fluid main-product-img" 
  2011.                                                         id="main-img-{{ product.id }}" 
  2012.                                                         src="{{ asset(product.images[0]) }}" 
  2013.                                                         alt="{{ product.name }}"
  2014.                                                         onerror="this.onerror=null;this.src='{{ asset('ui/img/product/p1.jpg') }}';"
  2015.                                                     >
  2016.                                                 {% else %}
  2017.                                                     <img class="img-fluid main-product-img" id="main-img-{{ product.id }}" src="{{ asset('ui/img/product/p1.jpg') }}" alt="{{ product.name }}">
  2018.                                                 {% endif %}
  2019.                                             </a>
  2020.                                             <!-- Boutons de navigation (visibles au survol) -->
  2021.                                             {% if product.images is defined and product.images|length > 1 %}
  2022.                                                 <button class="img-nav-btn img-nav-left" id="img-left-{{ product.id }}" onclick="prevImage({{ product.id }})" style="display: none;">
  2023.                                                     <span class="lnr lnr-chevron-left"></span>
  2024.                                                 </button>
  2025.                                                 <button class="img-nav-btn img-nav-right" id="img-right-{{ product.id }}" onclick="nextImage({{ product.id }})" style="display: none;">
  2026.                                                     <span class="lnr lnr-chevron-right"></span>
  2027.                                                 </button>
  2028.                                                 <!-- Indicateurs de position -->
  2029.                                                 <div class="img-indicators" id="img-indicators-{{ product.id }}" style="display: none;">
  2030.                                                     {% for img in product.images %}
  2031.                                                         <span class="indicator" id="indicator-{{ product.id }}-{{ loop.index0 }}" onclick="showImage({{ product.id }}, {{ loop.index0 }})"></span>
  2032.                                                     {% endfor %}
  2033.                                                 </div>
  2034.                                             {% endif %}
  2035.                                         </div>
  2036.                                         <div class="product-details">
  2037.                                             <a href="{{ path('ui_product_show', { slug: product.slug }) }}">
  2038.                                                 <h6>{{ product.name }}</h6>
  2039.                                             </a>
  2040.                                             <!-- Affichage de la boutique -->
  2041.                                             <div class="shop-info">
  2042.                                                 <small class="text-muted">
  2043.                                                     <i class="lnr lnr-store"></i>
  2044.                                                     Vendu par :
  2045.                                                     {% if product.shop is defined and product.shop %}
  2046.                                                         <a href="{{ path('ui_shop_show', {'slug': product.shop.slug}) }}" class="shop-link">
  2047.                                                             {{ product.shop.name }}
  2048.                                                         </a>
  2049.                                                     {% else %}
  2050.                                                         <span class="text-muted">Boutique inconnue</span>
  2051.                                                     {% endif %}
  2052.                                                 </small>
  2053.                                             </div>
  2054.                                             <div class="price">
  2055.                                                 <h6>{{ product.price|number_format(2, '.', ' ') }}
  2056.                                                     HTG</h6>
  2057.                                                 {% if product.compareAtPrice %}
  2058.                                                     <h6 class="l-through">{{ product.compareAtPrice|number_format(2, '.', ' ') }}
  2059.                                                         HTG</h6>
  2060.                                                 {% endif %}
  2061.                                             </div>
  2062.                                             <div class="prd-bottom">
  2063.                                                 <a href="javascript:void(0)" class="social-info add-to-cart" data-product-id="{{ product.id }}" data-qty="1">
  2064.                                                     <span class="ti-bag"></span>
  2065.                                                     <p class="hover-text">+ panier</p>
  2066.                                                 </a>
  2067.                                                 <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 %}>
  2068.                                                     <span class="lnr lnr-heart"></span>
  2069.                                                     <p class="hover-text">Favoris</p>
  2070.                                                 </a>
  2071.                                                 <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 %}>
  2072.                                                     <span class="lnr lnr-sync"></span>
  2073.                                                     <p class="hover-text">Comparer</p>
  2074.                                                 </a>
  2075.                                                 <a href="{{ path('ui_product_show', { slug: product.slug }) }}" class="social-info">
  2076.                                                     <span class="lnr lnr-move"></span>
  2077.                                                     <p class="hover-text">Voir plus</p>
  2078.                                                 </a>
  2079.                                             </div>
  2080.                                         </div>
  2081.                                     </div>
  2082.                                 </div>
  2083.                             {% endfor %}
  2084.                         </div>
  2085.                     </div>
  2086.                     <!-- Contrôles de navigation -->
  2087.                     <div class="featured-gallery-controls">
  2088.                         <button class="featured-gallery-nav-btn featured-gallery-prev" id="featuredGalleryPrev" aria-label="Précédent">
  2089.                             <i class="lnr lnr-chevron-left"></i>
  2090.                         </button>
  2091.                         <button class="featured-gallery-nav-btn featured-gallery-next" id="featuredGalleryNext" aria-label="Suivant">
  2092.                             <i class="lnr lnr-chevron-right"></i>
  2093.                         </button>
  2094.                     </div>
  2095.                     <!-- Bouton charger plus -->
  2096.                     <div class="featured-gallery-load-more text-center mt-4" id="featuredGalleryLoadMore" style="display: none;">
  2097.                         <button class="btn btn-outline-primary" id="loadMoreFeaturedBtn">
  2098.                             <i class="lnr lnr-plus-circle me-2"></i>
  2099.                             Charger plus de produits
  2100.                         </button>
  2101.                     </div>
  2102.                 </div>
  2103.                 <div class="text-center mt-5">
  2104.                     <a href="{{ path('ui_listing') }}" class="btn-view-all-products">
  2105.                         <span>Voir tous les produits</span>
  2106.                         <i class="lnr lnr-arrow-right"></i>
  2107.                     </a>
  2108.                 </div>
  2109.             </div>
  2110.         </section>
  2111.     {% endif %}
  2112.     <!-- Nouveautés -->
  2113.     {% if latestProducts|length > 0 %}
  2114.         <section class="py-5 bg-light">
  2115.             <div class="container">
  2116.                 <div class="section-title text-center mb-5">
  2117.                     <h2>Nouveautés</h2>
  2118.                     <p>Les derniers produits ajoutés sur MaketOu</p>
  2119.                 </div>
  2120.                 <div class="featured-gallery-wrapper">
  2121.                     <div class="featured-gallery-container">
  2122.                         <div class="featured-gallery-grid" id="latestGalleryGrid">
  2123.                             {% for product in latestProducts %}
  2124.                                 <div class="featured-gallery-item">
  2125.                                     <div class="single-product">
  2126.                                         <div class="product-image-container" onmouseenter="showImageNav({{ product.id }})" onmouseleave="hideImageNav({{ product.id }})">
  2127.                                             <a href="{{ path('ui_product_show', { slug: product.slug }) }}">
  2128.                                                 {% if product.images is defined and product.images|length > 0 %}
  2129.                                                     <img class="img-fluid main-product-img" id="main-img-{{ product.id }}" src="{{ asset(product.images[0]) }}" alt="{{ product.name }}">
  2130.                                                 {% else %}
  2131.                                                     <img class="img-fluid main-product-img" id="main-img-{{ product.id }}" src="{{ asset('ui/img/product/p1.jpg') }}" alt="{{ product.name }}">
  2132.                                                 {% endif %}
  2133.                                             </a>
  2134.                                             <!-- Boutons de navigation (visibles au survol) -->
  2135.                                             {% if product.images is defined and product.images|length > 1 %}
  2136.                                                 <button class="img-nav-btn img-nav-left" id="img-left-{{ product.id }}" onclick="prevImage({{ product.id }})" style="display: none;">
  2137.                                                     <span class="lnr lnr-chevron-left"></span>
  2138.                                                 </button>
  2139.                                                 <button class="img-nav-btn img-nav-right" id="img-right-{{ product.id }}" onclick="nextImage({{ product.id }})" style="display: none;">
  2140.                                                     <span class="lnr lnr-chevron-right"></span>
  2141.                                                 </button>
  2142.                                                 <!-- Indicateurs de position -->
  2143.                                                 <div class="img-indicators" id="img-indicators-{{ product.id }}" style="display: none;">
  2144.                                                     {% for img in product.images %}
  2145.                                                         <span class="indicator" id="indicator-{{ product.id }}-{{ loop.index0 }}" onclick="showImage({{ product.id }}, {{ loop.index0 }})"></span>
  2146.                                                     {% endfor %}
  2147.                                                 </div>
  2148.                                             {% endif %}
  2149.                                         </div>
  2150.                                         <div class="product-details">
  2151.                                             <a href="{{ path('ui_product_show', { slug: product.slug }) }}">
  2152.                                                 <h6>{{ product.name }}</h6>
  2153.                                             </a>
  2154.                                             <!-- Affichage de la boutique -->
  2155.                                             <div class="shop-info">
  2156.                                                 <small class="text-muted">
  2157.                                                     <i class="lnr lnr-store"></i>
  2158.                                                     Vendu par :
  2159.                                                     {% if product.shop is defined and product.shop %}
  2160.                                                         <a href="{{ path('ui_shop_show', {'slug': product.shop.slug}) }}" class="shop-link">
  2161.                                                             {{ product.shop.name }}
  2162.                                                         </a>
  2163.                                                     {% else %}
  2164.                                                         <span class="text-muted">Boutique inconnue</span>
  2165.                                                     {% endif %}
  2166.                                                 </small>
  2167.                                             </div>
  2168.                                             <div class="price">
  2169.                                                 <h6>{{ product.price|number_format(2, '.', ' ') }}
  2170.                                                     HTG</h6>
  2171.                                                 {% if product.compareAtPrice %}
  2172.                                                     <h6 class="l-through">{{ product.compareAtPrice|number_format(2, '.', ' ') }}
  2173.                                                         HTG</h6>
  2174.                                                 {% endif %}
  2175.                                             </div>
  2176.                                             <div class="prd-bottom">
  2177.                                                 <a href="javascript:void(0)" class="social-info add-to-cart" data-product-id="{{ product.id }}" data-qty="1">
  2178.                                                     <span class="ti-bag"></span>
  2179.                                                     <p class="hover-text">+ panier</p>
  2180.                                                 </a>
  2181.                                                 <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 %}>
  2182.                                                     <span class="lnr lnr-heart"></span>
  2183.                                                     <p class="hover-text">Favoris</p>
  2184.                                                 </a>
  2185.                                                 <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 %}>
  2186.                                                     <span class="lnr lnr-sync"></span>
  2187.                                                     <p class="hover-text">Comparer</p>
  2188.                                                 </a>
  2189.                                                 <a href="{{ path('ui_product_show', { slug: product.slug }) }}" class="social-info">
  2190.                                                     <span class="lnr lnr-move"></span>
  2191.                                                     <p class="hover-text">Voir plus</p>
  2192.                                                 </a>
  2193.                                             </div>
  2194.                                         </div>
  2195.                                     </div>
  2196.                                 </div>
  2197.                             {% endfor %}
  2198.                         </div>
  2199.                     </div>
  2200.                     <!-- Contrôles de navigation -->
  2201.                     <div class="featured-gallery-controls">
  2202.                         <button class="featured-gallery-nav-btn featured-gallery-prev" id="latestGalleryPrev" aria-label="Précédent">
  2203.                             <i class="lnr lnr-chevron-left"></i>
  2204.                         </button>
  2205.                         <button class="featured-gallery-nav-btn featured-gallery-next" id="latestGalleryNext" aria-label="Suivant">
  2206.                             <i class="lnr lnr-chevron-right"></i>
  2207.                         </button>
  2208.                     </div>
  2209.                     <!-- Bouton charger plus -->
  2210.                     <div class="featured-gallery-load-more text-center mt-4" id="latestGalleryLoadMore" style="display: none;">
  2211.                         <button class="btn btn-outline-primary" id="loadMoreLatestBtn">
  2212.                             <i class="lnr lnr-plus-circle me-2"></i>
  2213.                             Charger plus de produits
  2214.                         </button>
  2215.                     </div>
  2216.                 </div>
  2217.                 <div class="text-center mt-5">
  2218.                     <a href="{{ path('ui_listing') }}" class="btn-view-all-products">
  2219.                         <span>Voir tous les produits</span>
  2220.                         <i class="lnr lnr-arrow-right"></i>
  2221.                     </a>
  2222.                 </div>
  2223.             </div>
  2224.         </section>
  2225.     {% endif %}
  2226.     {% if recommendedProducts|length > 0 %}
  2227.         <section class="py-5">
  2228.             <div class="container">
  2229.                 <div class="section-title text-center mb-5">
  2230.                     <h2>Recommandés pour vous</h2>
  2231.                     <p>Suggestions basées sur votre activité récente et les tendances de MaketOu</p>
  2232.                 </div>
  2233.                 <div class="row g-4">
  2234.                     {% for product in recommendedProducts %}
  2235.                         <div class="col-12 col-sm-6 col-lg-3">
  2236.                             <div class="product-card h-100">
  2237.                                 {% set productImage = product.images[0] ?? 'ui/img/product/p1.jpg' %}
  2238.                                 <div class="product-image" style="background-image:url('{{ asset(productImage) }}');">
  2239.                                     {% if product.isFeatured %}
  2240.                                         <span class="product-badge bg-success">Populaire</span>
  2241.                                     {% endif %}
  2242.                                 </div>
  2243.                                 <div class="p-3">
  2244.                                     <h6 class="mb-2">
  2245.                                         <a href="{{ path('ui_product_show', { slug: product.slug }) }}">{{ product.name }}</a>
  2246.                                     </h6>
  2247.                                     <p class="mb-2 text-muted small">
  2248.                                         <i class="lnr lnr-store"></i>
  2249.                                         {% if product.shop %}
  2250.                                             <a href="{{ path('ui_shop_show', {'slug': product.shop.slug}) }}">{{ product.shop.name }}</a>
  2251.                                         {% else %}
  2252.                                             Boutique non spécifiée
  2253.                                         {% endif %}
  2254.                                     </p>
  2255.                                     <div class="d-flex align-items-center justify-content-between">
  2256.                                         <span class="fw-bold text-primary">{{ product.price|number_format(2, '.', ' ') }} HTG</span>
  2257.                                         <a href="javascript:void(0)" class="btn btn-sm btn-outline-primary add-to-cart" data-product-id="{{ product.id }}" data-qty="1">
  2258.                                             <i class="ti ti-bag"></i>
  2259.                                         </a>
  2260.                                     </div>
  2261.                                 </div>
  2262.                             </div>
  2263.                         </div>
  2264.                     {% endfor %}
  2265.                 </div>
  2266.             </div>
  2267.         </section>
  2268.     {% endif %}
  2269.     {% if recentlyViewedProducts|length > 0 %}
  2270.         <section class="py-5 bg-light">
  2271.             <div class="container">
  2272.                 <div class="section-title text-center mb-5">
  2273.                     <h2>Récemment consultés</h2>
  2274.                     <p>Retrouvez les articles que vous avez explorés dernièrement</p>
  2275.                 </div>
  2276.                 <div class="featured-gallery-wrapper">
  2277.                     <div class="featured-gallery-container">
  2278.                         <div class="featured-gallery-grid">
  2279.                             {% for product in recentlyViewedProducts %}
  2280.                                 <div class="featured-gallery-item">
  2281.                                     <div class="single-product">
  2282.                                         <div class="product-image-container">
  2283.                                             <a href="{{ path('ui_product_show', { slug: product.slug }) }}">
  2284.                                                 {% if product.images is defined and product.images|length > 0 %}
  2285.                                                     <img class="img-fluid main-product-img" src="{{ asset(product.images[0]) }}" alt="{{ product.name }}">
  2286.                                                 {% else %}
  2287.                                                     <img class="img-fluid main-product-img" src="{{ asset('ui/img/product/p1.jpg') }}" alt="{{ product.name }}">
  2288.                                                 {% endif %}
  2289.                                             </a>
  2290.                                         </div>
  2291.                                         <div class="product-details">
  2292.                                             <a href="{{ path('ui_product_show', { slug: product.slug }) }}">
  2293.                                                 <h6>{{ product.name }}</h6>
  2294.                                             </a>
  2295.                                             <div class="price">
  2296.                                                 <h6>{{ product.price|number_format(2, '.', ' ') }} HTG</h6>
  2297.                                             </div>
  2298.                                             <div class="prd-bottom">
  2299.                                                 <a href="javascript:void(0)" class="social-info add-to-cart" data-product-id="{{ product.id }}" data-qty="1">
  2300.                                                     <span class="ti-bag"></span>
  2301.                                                     <p class="hover-text">+ panier</p>
  2302.                                                 </a>
  2303.                                                 <a href="{{ path('ui_product_show', { slug: product.slug }) }}" class="social-info">
  2304.                                                     <span class="lnr lnr-move"></span>
  2305.                                                     <p class="hover-text">Voir</p>
  2306.                                                 </a>
  2307.                                             </div>
  2308.                                         </div>
  2309.                                     </div>
  2310.                                 </div>
  2311.                             {% endfor %}
  2312.                         </div>
  2313.                     </div>
  2314.                 </div>
  2315.             </div>
  2316.         </section>
  2317.     {% endif %}
  2318.     <!-- Fonctionnalités -->
  2319.     <section class="py-5">
  2320.         <div class="container">
  2321.             <div class="section-title">
  2322.                 <h2>Pourquoi choisir MaketOu ?</h2>
  2323.                 <p>Découvrez les avantages de notre plateforme</p>
  2324.             </div>
  2325.             <div class="row">
  2326.                 <div class="col-lg-3 col-md-6 mb-4">
  2327.                     <div class="feature-card">
  2328.                         <div class="feature-icon">
  2329.                             <i class="lnr lnr-rocket"></i>
  2330.                         </div>
  2331.                         <h5>Livraison rapide</h5>
  2332.                         <p>Recevez vos commandes rapidement avec notre réseau de livraison optimisé</p>
  2333.                     </div>
  2334.                 </div>
  2335.                 <div class="col-lg-3 col-md-6 mb-4">
  2336.                     <div class="feature-card">
  2337.                         <div class="feature-icon">
  2338.                             <i class="lnr lnr-lock"></i>
  2339.                         </div>
  2340.                         <h5>Paiement sécurisé</h5>
  2341.                         <p>Vos transactions sont protégées avec les dernières technologies de sécurité</p>
  2342.                     </div>
  2343.                 </div>
  2344.                 <div class="col-lg-3 col-md-6 mb-4">
  2345.                     <div class="feature-card">
  2346.                         <div class="feature-icon">
  2347.                             <i class="lnr lnr-phone"></i>
  2348.                         </div>
  2349.                         <h5>Support 24/7</h5>
  2350.                         <p>Notre équipe est disponible pour vous aider à tout moment</p>
  2351.                     </div>
  2352.                 </div>
  2353.                 <div class="col-lg-3 col-md-6 mb-4">
  2354.                     <div class="feature-card">
  2355.                         <div class="feature-icon">
  2356.                             <i class="lnr lnr-undo"></i>
  2357.                         </div>
  2358.                         <h5>Retour facile</h5>
  2359.                         <p>Politique de retour flexible pour votre tranquillité d'esprit</p>
  2360.                     </div>
  2361.                 </div>
  2362.             </div>
  2363.         </div>
  2364.     </section>
  2365.     <!-- Newsletter -->
  2366.     <section class="newsletter-section-modern py-5">
  2367.         <div class="container">
  2368.             <div class="row justify-content-center">
  2369.                 <div class="col-lg-10">
  2370.                     <div class="newsletter-card">
  2371.                         <div class="row align-items-center">
  2372.                             <div class="col-lg-6 text-center text-lg-start mb-4 mb-lg-0">
  2373.                                 <div class="newsletter-icon mb-3">
  2374.                                     <i class="lnr lnr-envelope" style="font-size: 4rem; color: #ffa200;"></i>
  2375.                                 </div>
  2376.                                 <h2 class="newsletter-title mb-3">Restez informé des dernières nouveautés</h2>
  2377.                                 <p class="newsletter-description mb-0">
  2378.                                     Inscrivez-vous à notre newsletter pour recevoir les offres exclusives, 
  2379.                                                                                                                                                                                 les nouveaux produits et les meilleures promotions directement dans votre boîte mail.
  2380.                                 </p>
  2381.                             </div>
  2382.                             <div class="col-lg-6">
  2383.                                 <form class="newsletter-form-modern" id="newsletterFormHome">
  2384.                                     <div class="newsletter-input-wrapper">
  2385.                                         <input type="email" class="newsletter-input" placeholder="Votre adresse email" required name="email">
  2386.                                         <button class="newsletter-button" type="submit">
  2387.                                             <i class="lnr lnr-arrow-right me-2"></i>
  2388.                                             S'abonner
  2389.                                         </button>
  2390.                                     </div>
  2391.                                     <p class="newsletter-privacy mt-3 text-center">
  2392.                                         <small>
  2393.                                             <i class="lnr lnr-lock me-1"></i>
  2394.                                             Vos données sont sécurisées. Pas de spam, désinscription facile.
  2395.                                         </small>
  2396.                                     </p>
  2397.                                 </form>
  2398.                             </div>
  2399.                         </div>
  2400.                     </div>
  2401.                 </div>
  2402.             </div>
  2403.         </div>
  2404.     </section>
  2405.     <!-- Call to Action -->
  2406.     <section class="cta-section-modern py-5">
  2407.         <div class="container">
  2408.             <div class="cta-card">
  2409.                 <div class="row align-items-center">
  2410.                     <div class="col-lg-6 mb-4 mb-lg-0">
  2411.                         <div class="cta-content">
  2412.                             <span class="cta-badge">
  2413.                                 <i class="lnr lnr-rocket me-2"></i>
  2414.                                 Commencez dès aujourd'hui
  2415.                             </span>
  2416.                             <h2 class="cta-title mb-3">Prêt à commencer ?</h2>
  2417.                             <p class="cta-description mb-4">
  2418.                                 Que vous soyez
  2419.                                 <strong>acheteur</strong>
  2420.                                 ou
  2421.                                 <strong>vendeur</strong>, MaketOu vous offre la plateforme idéale 
  2422.                                                                                                                                                                             pour vos besoins commerciaux en Haïti. Rejoignez des milliers d'utilisateurs satisfaits !
  2423.                             </p>
  2424.                             <div class="cta-features mb-4">
  2425.                                 <div class="cta-feature-item">
  2426.                                     <i class="lnr lnr-checkmark-circle"></i>
  2427.                                     <span>Plateforme 100% sécurisée</span>
  2428.                                 </div>
  2429.                                 <div class="cta-feature-item">
  2430.                                     <i class="lnr lnr-checkmark-circle"></i>
  2431.                                     <span>Support client 24/7</span>
  2432.                                 </div>
  2433.                                 <div class="cta-feature-item">
  2434.                                     <i class="lnr lnr-checkmark-circle"></i>
  2435.                                     <span>Paiements multiples</span>
  2436.                                 </div>
  2437.                             </div>
  2438.                             <div class="cta-buttons">
  2439.                                 <button type="button" class="btn cta-button-primary" onclick="openReadyModal()">
  2440.                                     <i class="lnr lnr-rocket me-2"></i>
  2441.                                     Prêt à commencer ?
  2442.                                 </button>
  2443.                                 <a href="{{ path('ui_listing') }}" class="btn cta-button-secondary">
  2444.                                     <i class="lnr lnr-magnifier me-2"></i>
  2445.                                     Voir les produits
  2446.                                 </a>
  2447.                             </div>
  2448.                         </div>
  2449.                     </div>
  2450.                     <div class="col-lg-6">
  2451.                         <div class="cta-image-wrapper">
  2452.                             <div class="cta-decoration"></div>
  2453.                             <img src="{{ asset('Start.png') }}" alt="MaketOu" class="cta-image">
  2454.                         </div>
  2455.                     </div>
  2456.                 </div>
  2457.             </div>
  2458.         </div>
  2459.     </section>
  2460. {% endblock %}
  2461. {% block javascripts %}
  2462.     <script src="{{ asset('ui/js/product-unified.js') }}"></script>
  2463.     <script>
  2464.         window.openReadyModal = function () {
  2465.             const modalEl = document.getElementById('readyModal');
  2466.             if (!modalEl) {
  2467.                 console.error('readyModal introuvable');
  2468.                 return;
  2469.             }
  2470.             if (typeof bootstrap === 'undefined' || !bootstrap.Modal) {
  2471.                 console.error('Bootstrap Modal non chargé');
  2472.                 return;
  2473.             }
  2474.             const modalInstance = bootstrap.Modal.getOrCreateInstance(modalEl);
  2475.             modalInstance.show();
  2476.         };
  2477.     </script>
  2478.     <script>
  2479.         // Variables globales pour la navigation des images (si pas déjà définies)
  2480.         if (typeof productImages === 'undefined') {
  2481.             window.productImages = {};
  2482.             window.currentImageIndex = {};
  2483.         }
  2484. // Initialisation des données d'images pour les produits "Produits en vedette"
  2485. {% if featuredProducts is defined %}
  2486. {% for product in featuredProducts %}
  2487. {% if product.images is defined and product.images|length > 0 %}
  2488. productImages[{{ product.id }}] = [{% for img in product.images %}'{{ asset(img) }}'{% if not loop.last %},{% endif %}{% endfor %}];
  2489. currentImageIndex[{{ product.id }}] = 0;{% endif %}{% endfor %}{% endif %}
  2490. // Initialisation des données d'images pour les produits "Nouveautés"
  2491. {% if latestProducts is defined %}
  2492. {% for product in latestProducts %}
  2493. {% if product.images is defined and product.images|length > 0 %}
  2494. productImages[{{ product.id }}] = [{% for img in product.images %}'{{ asset(img) }}'{% if not loop.last %},{% endif %}{% endfor %}];
  2495. currentImageIndex[{{ product.id }}] = 0;{% endif %}{% endfor %}{% endif %}
  2496. console.log('SCRIPT LOADED - Featured Gallery');
  2497. (function () {
  2498.     'use strict';
  2499.     const SECTION_CONFIGS = [
  2500.         { grid: '#featuredGalleryGrid', prev: '#featuredGalleryPrev', next: '#featuredGalleryNext' },
  2501.         { grid: '#latestGalleryGrid', prev: '#latestGalleryPrev', next: '#latestGalleryNext' }
  2502.     ];
  2503.     function triggerRipple(button) {
  2504.         button.classList.remove('btn-ripple');
  2505.         void button.offsetWidth;
  2506.         button.classList.add('btn-ripple');
  2507.         setTimeout(() => button.classList.remove('btn-ripple'), 350);
  2508.     }
  2509.     function initSectionCarousel(config) {
  2510.         const $grid = $(config.grid);
  2511.         if (!$grid.length) {
  2512.             console.warn('Grid not found:', config.grid);
  2513.             return;
  2514.         }
  2515.         if (typeof $.fn.owlCarousel !== 'function') {
  2516.             console.warn('OwlCarousel n\'est pas chargé pour', config.grid);
  2517.             return;
  2518.         }
  2519.         // Si déjà initialisé, récupérer l'instance existante
  2520.         let owlInstance;
  2521.         if ($grid.hasClass('owl-loaded')) {
  2522.             owlInstance = $grid.data('owl.carousel');
  2523.             console.log('OwlCarousel already initialized for', config.grid, owlInstance);
  2524.         } else {
  2525.             if (!$grid.hasClass('owl-carousel')) {
  2526.                 $grid.addClass('owl-carousel');
  2527.             }
  2528.             owlInstance = $grid.owlCarousel({
  2529.                 loop: true,
  2530.                 margin: 30,
  2531.                 autoplay: true,
  2532.                 autoplayTimeout: 4800,
  2533.                 autoplayHoverPause: true,
  2534.                 smartSpeed: 650,
  2535.                 nav: false,
  2536.                 dots: false,
  2537.                 responsive: {
  2538.                     0: { items: 1, margin: 15 },
  2539.                     576: { items: 1.2, margin: 18 },
  2540.                     768: { items: 2, margin: 20 },
  2541.                     992: { items: 3, margin: 25 },
  2542.                     1400: { items: 4, margin: 30 }
  2543.                 }
  2544.             });
  2545.             console.log('OwlCarousel initialized for', config.grid, owlInstance);
  2546.         }
  2547.         const $prev = $(config.prev);
  2548.         const $next = $(config.next);
  2549.         if ($prev.length) {
  2550.             $prev.off('click.carouselNav').on('click.carouselNav', function (e) {
  2551.                 e.preventDefault();
  2552.                 e.stopPropagation();
  2553.                 console.log('Prev clicked for', config.grid, 'Instance:', owlInstance);
  2554.                 if (owlInstance) {
  2555.                     try {
  2556.                         $grid.trigger('prev.owl.carousel');
  2557.                         triggerRipple(this);
  2558.                     } catch (err) {
  2559.                         console.error('Error triggering prev:', err);
  2560.                     }
  2561.                 } else {
  2562.                     console.error('OwlCarousel instance not available');
  2563.                 }
  2564.             });
  2565.         } else {
  2566.             console.warn('Prev button not found:', config.prev);
  2567.         }
  2568.         if ($next.length) {
  2569.             $next.off('click.carouselNav').on('click.carouselNav', function (e) {
  2570.                 e.preventDefault();
  2571.                 e.stopPropagation();
  2572.                 console.log('Next clicked for', config.grid, 'Instance:', owlInstance);
  2573.                 if (owlInstance) {
  2574.                     try {
  2575.                         $grid.trigger('next.owl.carousel');
  2576.                         triggerRipple(this);
  2577.                     } catch (err) {
  2578.                         console.error('Error triggering next:', err);
  2579.                     }
  2580.                 } else {
  2581.                     console.error('OwlCarousel instance not available');
  2582.                 }
  2583.             });
  2584.         } else {
  2585.             console.warn('Next button not found:', config.next);
  2586.         }
  2587.     }
  2588.     function ensureOwl(attempt = 0) {
  2589.         if (window.jQuery && typeof $.fn !== 'undefined' && typeof $.fn.owlCarousel === 'function') {
  2590.             SECTION_CONFIGS.forEach(initSectionCarousel);
  2591.         } else if (attempt < 15) {
  2592.             setTimeout(() => ensureOwl(attempt + 1), 200);
  2593.         } else {
  2594.             console.warn('OwlCarousel non disponible après plusieurs tentatives');
  2595.         }
  2596.     }
  2597.     document.addEventListener('DOMContentLoaded', function () {
  2598.         ensureOwl();
  2599.     });
  2600. })();
  2601. document.addEventListener('DOMContentLoaded', function () { // Animation des cartes au scroll
  2602. const observerOptions = {
  2603. threshold: 0.1,
  2604. rootMargin: '0px 0px -50px 0px'
  2605. };
  2606. const observer = new IntersectionObserver(function (entries) {
  2607. entries.forEach(entry => {
  2608. if (entry.isIntersecting) {
  2609. entry.target.style.opacity = '1';
  2610. entry.target.style.transform = 'translateY(0)';
  2611. }
  2612. });
  2613. }, observerOptions);
  2614. // Observer toutes les cartes
  2615. document.querySelectorAll('.stats-card, .category-card, .product-card, .feature-card').forEach(card => {
  2616. card.style.opacity = '0';
  2617. card.style.transform = 'translateY(30px)';
  2618. card.style.transition = 'all 0.6s ease';
  2619. observer.observe(card);
  2620. });
  2621. // Compteur animé pour les statistiques
  2622. function animateCounter(element, target, duration = 2000) {
  2623. let start = 0;
  2624. const increment = target / (duration / 16);
  2625. function updateCounter() {
  2626. start += increment;
  2627. if (start < target) {
  2628. element.textContent = Math.floor(start).toLocaleString();
  2629. requestAnimationFrame(updateCounter);
  2630. } else {
  2631. element.textContent = target.toLocaleString();
  2632. }
  2633. }
  2634. updateCounter();
  2635. }
  2636. // Animer les compteurs quand ils sont visibles
  2637. const statsObserver = new IntersectionObserver(function (entries) {
  2638. entries.forEach(entry => {
  2639. if (entry.isIntersecting) {
  2640. const numberElement = entry.target.querySelector('.stats-number');
  2641. const target = parseInt(numberElement.textContent.replace(/,/g, ''));
  2642. animateCounter(numberElement, target);
  2643. statsObserver.unobserve(entry.target);
  2644. }
  2645. });
  2646. });
  2647. document.querySelectorAll('.stats-card').forEach(card => {
  2648. statsObserver.observe(card);
  2649. });
  2650. // Gestion de la newsletter
  2651. const newsletterForm = document.querySelector('.newsletter-form');
  2652. if (newsletterForm) {
  2653. newsletterForm.addEventListener('submit', function (e) {
  2654. e.preventDefault();
  2655. const email = this.querySelector('input[type="email"]').value;
  2656. const button = this.querySelector('button');
  2657. const originalText = button.innerHTML;
  2658. // Désactiver le bouton
  2659. button.disabled = true;
  2660. button.innerHTML = '<i class="lnr lnr-spinner me-2"></i>Inscription...';
  2661. // Envoyer la requête
  2662. fetch('{{ path("ui_newsletter_subscribe") }}', {
  2663. method: 'POST',
  2664. headers: {
  2665. 'Content-Type': 'application/x-www-form-urlencoded',
  2666. 'X-Requested-With': 'XMLHttpRequest'
  2667. },
  2668. body: 'email=' + encodeURIComponent(email)
  2669. }).then(response => response.json()).then(data => {
  2670. if (data.success) {
  2671. button.innerHTML = '<i class="lnr lnr-check me-2"></i>Inscription réussie !';
  2672. button.classList.remove('btn-warning');
  2673. button.classList.add('btn-success');
  2674. this.reset();
  2675. } else {
  2676. button.innerHTML = '<i class="lnr lnr-warning me-2"></i>Erreur';
  2677. button.classList.remove('btn-warning');
  2678. button.classList.add('btn-danger');
  2679. }
  2680. setTimeout(() => {
  2681. button.innerHTML = originalText;
  2682. button.classList.remove('btn-success', 'btn-danger');
  2683. button.classList.add('btn-warning');
  2684. button.disabled = false;
  2685. }, 3000);
  2686. }).catch(error => {
  2687. console.error('Erreur:', error);
  2688. button.innerHTML = '<i class="lnr lnr-warning me-2"></i>Erreur';
  2689. button.classList.remove('btn-warning');
  2690. button.classList.add('btn-danger');
  2691. setTimeout(() => {
  2692. button.innerHTML = originalText;
  2693. button.classList.remove('btn-danger');
  2694. button.classList.add('btn-warning');
  2695. button.disabled = false;
  2696. }, 3000);
  2697. });
  2698. });
  2699. }
  2700. });
  2701. // Effet parallaxe léger pour le hero
  2702. window.addEventListener('scroll', function () {
  2703. const scrolled = window.pageYOffset;
  2704. const hero = document.querySelector('.hero-banner');
  2705. if (hero) {
  2706. hero.style.transform = `translateY(${
  2707. scrolled * 0.5
  2708. }px)`;
  2709. }
  2710. });
  2711. });
  2712. // Fonction pour afficher toutes les catégories
  2713. function showAllCategories () {
  2714. const container = document.getElementById('productCategoriesContainer');
  2715. const btn = document.getElementById('showAllCategoriesBtn');{% if allCategories|length > 8 %}{% for category in allCategories %}{% if loop.index > 8 %}const categoryHtml {{ loop.index }} = `
  2716.         <div class="col-lg-3 col-md-4 col-sm-6 mb-4">
  2717.             <div class="category-card-custom">
  2718.                 <div class="category-image-wrapper">
  2719.                     <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 %}')">
  2720.                         <div class="category-overlay-custom">
  2721.                             <div class="category-icon-wrapper">
  2722.                                 <i class="lnr lnr-tag" style="font-size: 3rem;"></i>
  2723.                                 <h4 class="mt-3">{{ category.name }}</h4>
  2724.                             </div>
  2725.                         </div>
  2726.                     </div>
  2727.                 </div>
  2728.                 <div class="category-content p-3">
  2729.                     <h5 class="mb-2">{{ category.name }}</h5>
  2730.                     {% if category.description %}
  2731.                         <p class="text-muted mb-3 small">{{ category.description|striptags|slice(0, 60) }}{% if category.description|striptags|length > 60 %}...{% endif %}</p>
  2732.                     {% endif %}
  2733.                     <a href="{{ path('ui_listing', {'category': category.slug}) }}" class="btn btn-primary-custom btn-sm w-100">
  2734.                         Voir les produits
  2735.                     </a>
  2736.                 </div>
  2737.             </div>
  2738.         </div>
  2739.     `;
  2740. container.insertAdjacentHTML('beforeend', categoryHtml {{ loop.index }});{% endif %}{% endfor %}{% endif %}if (btn) 
  2741. btn.style.display = 'none';
  2742. }
  2743. // Fonction pour afficher toutes les catégories de boutiques
  2744. function showAllShopCategories () {
  2745. const container = document.getElementById('shopCategoriesContainer');
  2746. const btn = document.querySelector('[onclick="showAllShopCategories()"]') ?. parentElement;{% if allShopCategories|length > 6 %}{% for shopCategory in allShopCategories %}{% if loop.index > 6 %}const shopCategoryHtml {{ loop.index }} = `
  2747.         <div class="col-lg-4 col-md-6 mb-4">
  2748.             <a href="{{ path('ui_shops_list') }}?category={{ shopCategory.slug }}" class="text-decoration-none" style="display: block;">
  2749.                 <div class="category-card-custom shop-category-clickable">
  2750.                     <div class="category-image-wrapper">
  2751.                         <div class="category-image" style="background-image: url('{% if shopCategory.bannerImage %}{{ asset(shopCategory.bannerImage) }}{% else %}{{ asset('ui/img/category/shop-' ~ loop.index ~ '.jpg') }}{% endif %}')">
  2752.                             <div class="category-overlay-custom">
  2753.                                 <div class="category-icon-wrapper">
  2754.                                     <i class="lnr lnr-store" style="font-size: 3rem;"></i>
  2755.                                     <h4 class="mt-3">{{ shopCategory.name }}</h4>
  2756.                                     {% if shopCategory.description %}
  2757.                                         <p class="mt-2 px-3">{{ shopCategory.description|striptags|slice(0, 100) }}{% if shopCategory.description|striptags|length > 100 %}...{% endif %}</p>
  2758.                                     {% endif %}
  2759.                                 </div>
  2760.                             </div>
  2761.                         </div>
  2762.                     </div>
  2763.                     <div class="category-content p-3">
  2764.                         <h5 class="mb-2">{{ shopCategory.name }}</h5>
  2765.                         {% if shopCategory.description %}
  2766.                             <p class="text-muted mb-3 small">{{ shopCategory.description|striptags|slice(0, 80) }}{% if shopCategory.description|striptags|length > 80 %}...{% endif %}</p>
  2767.                         {% endif %}
  2768.                         <span class="btn btn-primary-custom btn-sm w-100">
  2769.                             Voir les boutiques <i class="lnr lnr-arrow-right ms-2"></i>
  2770.                         </span>
  2771.                     </div>
  2772.                 </div>
  2773.             </a>
  2774.         </div>
  2775.     `;
  2776. container.insertAdjacentHTML('beforeend', shopCategoryHtml {{ loop.index }});{% endif %}{% endfor %}{% endif %}if (btn) 
  2777. btn.style.display = 'none';
  2778. }
  2779.     // Initialiser les carousels
  2780.     <script src="{{ asset('ui/js/product-unified.js') }}"></script>
  2781.     <script>
  2782.         document.addEventListener('DOMContentLoaded', function() {
  2783.             // Init featured products images
  2784.             {% if featuredProducts is defined %}
  2785.                 {% for product in featuredProducts %}
  2786.                     {% if product.images is defined and product.images|length > 0 %}
  2787.                         if (typeof initProductImages === 'function') {
  2788.                             initProductImages({{ product.id }}, {{ product.images|json_encode|raw }});
  2789.                         }
  2790.                     {% endif %}
  2791.                 {% endfor %}
  2792.             {% endif %}
  2793.             // Init latest products images
  2794.             {% if latestProducts is defined %}
  2795.                 {% for product in latestProducts %}
  2796.                     {% if product.images is defined and product.images|length > 0 %}
  2797.                         if (typeof initProductImages === 'function') {
  2798.                             initProductImages({{ product.id }}, {{ product.images|json_encode|raw }});
  2799.                         }
  2800.                     {% endif %}
  2801.                 {% endfor %}
  2802.             {% endif %}
  2803.         });
  2804.     </script>
  2805.     <script>
  2806.     $(document).ready(function () { // Carousel bannière principale
  2807. if ($('.active-banner-slider').length) {
  2808. $('.active-banner-slider').owlCarousel({
  2809. items: 1,
  2810. loop: true,
  2811. autoplay: true,
  2812. autoplayTimeout: 6000,
  2813. autoplayHoverPause: true,
  2814. nav: true,
  2815. dots: true,
  2816. navText: [
  2817. '<i class="lnr lnr-chevron-left"></i>', '<i class="lnr lnr-chevron-right"></i>'
  2818. ],
  2819. smartSpeed: 1000,
  2820. animateOut: 'fadeOut',
  2821. animateIn: 'fadeIn',
  2822. responsive: {
  2823. 0: {
  2824. items: 1,
  2825. nav: true,
  2826. dots: true
  2827. },
  2828. 768: {
  2829. items: 1,
  2830. nav: true,
  2831. dots: true
  2832. },
  2833. 992: {
  2834. items: 1,
  2835. nav: true,
  2836. dots: true
  2837. }
  2838. }
  2839. });
  2840. }
  2841. // Animation d'apparition pour les cartes produits
  2842. const observerOptions = {
  2843. threshold: 0.1,
  2844. rootMargin: '0px 0px -50px 0px'
  2845. };
  2846. const productObserver = new IntersectionObserver(function (entries) {
  2847. entries.forEach(entry => {
  2848. if (entry.isIntersecting) {
  2849. entry.target.style.opacity = '1';
  2850. entry.target.style.transform = 'translateY(0)';
  2851. }
  2852. });
  2853. }, observerOptions);
  2854. document.querySelectorAll('.product-card-modern').forEach((card, index) => {
  2855. card.style.opacity = '0';
  2856. card.style.transform = 'translateY(20px)';
  2857. card.style.transition = `opacity 0.6s ease ${
  2858. index * 0.1
  2859. }s, transform 0.6s ease ${
  2860. index * 0.1
  2861. }s`;
  2862. productObserver.observe(card);
  2863. });
  2864. });
  2865.     </script>
  2866.     <!-- Modal "Prêt à commencer ?" -->
  2867.     <div class="modal fade" id="readyModal" tabindex="-1">
  2868.         <div class="modal-dialog modal-dialog-centered">
  2869.             <div class="modal-content">
  2870.                 <div class="modal-header">
  2871.                     <h5 class="modal-title">
  2872.                         <i class="lnr lnr-rocket me-2"></i>Prêt à commencer ?
  2873.                     </h5>
  2874.                     <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
  2875.                 </div>
  2876.                 <div class="modal-body">
  2877.                     {% if app.user %}
  2878.                         {% if app.user.kycStatus == 'verified' %}
  2879.                             <div class="text-center">
  2880.                                 <i class="lnr lnr-checkmark-circle" style="font-size: 4rem; color: #28a745;"></i>
  2881.                                 <h4 class="mt-3">Votre compte est vérifié !</h4>
  2882.                                 <p class="text-muted">Vous pouvez commencer à utiliser MaketOu en toute sérénité.</p>
  2883.                                 <div class="mt-4">
  2884.                                     <a href="{{ path('seller_index') }}" class="btn btn-primary me-2">
  2885.                                         <i class="lnr lnr-store me-1"></i>Ouvrir ma boutique
  2886.                                     </a>
  2887.                                     <a href="{{ path('ui_listing') }}" class="btn btn-outline-primary">
  2888.                                         <i class="lnr lnr-magnifier me-1"></i>Voir les produits
  2889.                                     </a>
  2890.                                 </div>
  2891.                             </div>
  2892.                         {% else %}
  2893.                             <div class="text-center">
  2894.                                 <i class="lnr lnr-shield" style="font-size: 4rem; color: #ffa200;"></i>
  2895.                                 <h4 class="mt-3">Vérification requise</h4>
  2896.                                 <p class="text-muted">Pour utiliser toutes les fonctionnalités de MaketOu, vous devez compléter votre vérification KYC.</p>
  2897.                                 <div class="mt-4">
  2898.                                     <a href="{{ path('ui_account_kyc') }}" class="btn btn-primary btn-lg">
  2899.                                         <i class="lnr lnr-checkmark-circle me-1"></i> <span class="d-none d-md-inline">Commencer la vérification</span>
  2900.                                     </a>
  2901.                                 </div>
  2902.                             </div>
  2903.                         {% endif %}
  2904.                     {% else %}
  2905.                         <div class="text-center">
  2906.                             <i class="lnr lnr-user" style="font-size: 4rem; color: #007bff;"></i>
  2907.                             <h4 class="mt-3">Connectez-vous pour commencer</h4>
  2908.                             <p class="text-muted">Créez un compte ou connectez-vous pour accéder à toutes les fonctionnalités de MaketOu.</p>
  2909.                             <div class="mt-4">
  2910.                                 <a href="{{ path('ui_app_login') }}" class="btn btn-primary btn-lg me-2">
  2911.                                     <i class="lnr lnr-enter me-1"></i> Se connecter
  2912.                                 </a>
  2913.                                 <a href="{{ path('ui_app_register') }}" class="btn btn-outline-primary btn-lg">
  2914.                                     <i class="lnr lnr-user-plus me-1"></i> S'inscrire
  2915.                                 </a>
  2916.                             </div>
  2917.                         </div>
  2918.                     {% endif %}
  2919.                 </div>
  2920.             </div>
  2921.         </div>
  2922.     </div>
  2923. {% endblock %}