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