templates/front/base.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html class="no-js" lang="fr">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  7.     <meta name="csrf-token" content="{{ csrf_token('front_api') }}">
  8.     {% set company = Globals.getCompany() %}
  9.     {% set companyName = company.name is iterable ? (company.name|first|default('')) : (company.name|default('')) %}
  10.     {% set companyLogo = company.logo is iterable ? (company.logo|first|default('')) : (company.logo|default('')) %}
  11.     {% set companyFooterLogo = company.footerLogo is iterable ? (company.footerLogo|first|default('')) : (company.footerLogo|default('')) %}
  12.     {% set companyAddress = company.address is iterable ? (company.address|first|default('')) : (company.address|default('')) %}
  13.     {% set companyPhone = company.phone is iterable ? (company.phone|first|default('')) : (company.phone|default('')) %}
  14.     {% set companyMail = company.mail is iterable ? (company.mail|first|default('')) : (company.mail|default('')) %}
  15.     {% set companyWebsite = company.website is iterable ? (company.website|first|default('')) : (company.website|default('')) %}
  16.      {% set companySocialLinks = company.socialLinks is iterable ? company.socialLinks : [] %}
  17.     {% set companyTitle = websiteSettingService.get('title', '') %}
  18.     {% set companyDescription = websiteSettingService.get('description', '') %}
  19.     {% set companyKeywords = websiteSettingService.get('keywords') is iterable ? (websiteSettingService.get('keywords')|first|default('')) : (websiteSettingService.get('keywords')|default('')) %}
  20.     {% set themeVars = websiteSettingService.get('themeVars') is iterable ? websiteSettingService.get('themeVars') : {} %}
  21.     <title>{% block title %} {{ companyTitle }} {% endblock %}</title>
  22.      {% block extra_head %}
  23.         <script>
  24.             window.webBaseUrl = '{{ absolute_url(asset('images/web'))|split('?')[0] }}';
  25.             window.imageBaseUrl = '{{ app.request.schemeAndHttpHost }}/images';
  26.             window.websiteSettings = {{ websiteSettings|json_encode|raw }};
  27.             window.CATALOG_FILTER_MAX_PRICE = Number(
  28.                 (window.websiteSettings && window.websiteSettings.catalogFilterMaxPrice) || 999999
  29.             ) || 999999;
  30.             window.APP_CLIENT = {{ app.user ? {
  31.                 id: app.user.id,
  32.                 firstName: app.user.firstName,
  33.                 telephone: app.user.phone,
  34.                 telephone2: app.user.secondPhone,
  35.                 email: app.user.email,
  36.                 country : app.user.country,
  37.                 region  : app.user.region,
  38.                 adresse: app.user.adress,
  39.                 isLogged: true
  40.             }|json_encode|raw : 'null' }};
  41.         </script>
  42.     {% endblock %}
  43.     <meta name="description"
  44.           content="{% block meta_description %}{{ seo_description|default('')|e }}{% endblock %}">
  45.     {% block meta %}
  46.         <meta name="keywords" content="{{ companyKeywords }}">
  47.         {#<meta name="description" content="{{ companyDescription }}">#}
  48.         <meta name="author" content="{{ companyName }}">
  49.         {# Facebook OG #}
  50.         <meta property="og:image" content="{{ asset(companyLogo)  }}">
  51.         <meta property="og:url" content=""{{ companyWebsite  }}">
  52.         <meta property="og:type" content="article">
  53.         <meta property="og:title" content="{{ companyTitle }}">
  54.         <meta property="og:description" content="{{ companyDescription }}">
  55.         {# Twitter OG #}
  56.         <meta name="twitter:title" content="{{ companyTitle }}">
  57.         <meta name="twitter:description" content="{{ companyDescription }}">
  58.         <meta name="twitter:image" content="{{ asset(companyLogo) }}">
  59.         <meta name="twitter:card" content="summary_large_image">
  60.     {% endblock %}
  61.     <script>
  62.         var BASE_URL="{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}";
  63.         // Filtres des tailles et couleurs
  64.         var taillesFilter = [];
  65.         var couleursFilter = [];
  66.         var CATEGORIES = {{ Globals.getCategories()|json_encode|raw }};
  67.         var CATEGORY_URL_TYPE = {{ Globals.getCategoryUrlType()|json_encode|raw }};
  68.         var MIXED_ASPECT_RATIO = {{ Globals.getMixedAspectRatio()|json_encode|raw }};
  69.         var TOP_SALES_PERIOD = {{ Globals.getTopSalesPeriod()|json_encode|raw }};
  70.         {# URLs images globales #}
  71.         window.IMG_PATHS = {
  72.             thumbSquare: '{{ IMG_THUMB_280 }}',
  73.             thumbPortrait: '{{ IMG_THUMB_300 }}',
  74.             web: '{{ IMG_WEB }}',
  75.             zoom: '{{ IMG_ZOOM }}'
  76.         };
  77.     </script>
  78.     {# Favicon #}
  79.     {# Template CSS #}
  80.     {% block stylesheets %}
  81.         <link rel="stylesheet" href="{{ asset('front/assets/css/base.css') }}">
  82.         <link rel="stylesheet" href="{{ asset('assets/bootstrap5/css/bootstrap.min.css') }}">
  83.         <link href="{{ asset('front/assets/toast/css/nice-toast-js.min.css') }}" rel="stylesheet" type="text/css" />
  84.          <link rel="icon" type="image/png" href="{{ asset('front/assets/imgs/theme/favicon.png')}}">
  85.         <link rel="shortcut icon" href="{{ asset('front/assets/imgs/theme/favicon.png') }}" type="image/x-icon">
  86.         <link rel="stylesheet" href="{{ asset('front/assets/css/main.css') }}">
  87.         <link rel="stylesheet" href="{{ asset('assets/css/front-theme.css') }}">
  88.         <link rel="stylesheet" href="{{ asset('front/assets/css/custom-style.css') }}">
  89.         <link rel="stylesheet" href="{{ asset('front/assets/css/filter-modal.css') }}">
  90.         {# UIcons Flaticon #}
  91.         <link rel="stylesheet" href="https://cdn-uicons.flaticon.com/uicons-regular-straight/css/uicons-regular-straight.css">
  92.         <link rel="stylesheet" href="https://cdn-uicons.flaticon.com/uicons-regular-rounded/css/uicons-regular-rounded.css">
  93.         <link rel="stylesheet" href="https://cdn-uicons.flaticon.com/uicons-solid-rounded/css/uicons-solid-rounded.css">
  94.         <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css">
  95.         <style>
  96.             :root {
  97.                 --primary-color: {{ themeVars['--primary-color']|default('#2B2D2F') }};
  98.                 --secondary-color: {{ themeVars['--secondary-color']|default('#3F444A') }};
  99.                 --secondary-color-dark: {{ themeVars['--secondary-color-dark']|default('#1F2327') }};
  100.                 --secondary-color-light: {{ themeVars['--secondary-color-light']|default('#E8E6E1') }};
  101.                 --accent-color: {{ themeVars['--accent-color']|default('#C3A98B') }};
  102.                 --text-color: {{ themeVars['--text-color']|default('#1F1F1F') }};
  103.                 --text-muted: {{ themeVars['--text-muted']|default('#7A7A7A') }};
  104.                 --danger-color: {{ themeVars['--danger-color']|default('#B23A3A') }};
  105.                 --border-color: {{ themeVars['--border-color']|default('#E3E3E3') }};
  106.                 --font-family-base: {{ themeVars['--font-family-base']|default('"Space Grotesk", "Inter", system-ui, sans-serif') }};
  107.                 --font-family-heading: {{ themeVars['--font-family-heading']|default('"Poppins", "Inter", sans-serif') }};
  108.                 --font-family-meta: {{ themeVars['--font-family-meta']|default('"IBM Plex Sans", "Inter", sans-serif') }};
  109.                 --surface-color: {{ themeVars['--surface-color']|default('#FFFFFF') }};
  110.                 --surface-muted: {{ themeVars['--surface-muted']|default('#F8F9FA') }};
  111.                 --header-top-bg: {{ themeVars['--header-top-bg']|default('#000000') }};
  112.                 --header-top-color: {{ themeVars['--header-top-color']|default('#FFFFFF') }};
  113.                 --header-main-bg: {{ themeVars['--header-main-bg']|default(themeVars['--secondary-color-light']|default('#E8E6E1')) }};
  114.                 --header-main-border: {{ themeVars['--header-main-border']|default(themeVars['--border-color']|default('#E3E3E3')) }};
  115.                 --success-color: {{ themeVars['--success-color']|default('#16A34A') }};
  116.                 --warning-color: {{ themeVars['--warning-color']|default('#F59E0B') }};
  117.                 --rating-color: {{ themeVars['--rating-color']|default('#FFC107') }};
  118.                 --danger-soft-bg: {{ themeVars['--danger-soft-bg']|default('#FBE9E9') }};
  119.             }
  120.         </style>
  121.     {% endblock %}
  122.     <script> !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '1239578710475196'); fbq('track', 'PageView'); </script>
  123. </head>
  124. <body>
  125. {# Google tag (gtag.js) #}
  126. <script async src="https://www.googletagmanager.com/gtag/js?id=G-4XS6978LX1"></script>
  127. <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-4XS6978LX1'); </script>
  128.     <header class="header-area site-header header-style-4 header-height-2">
  129.         {# BARRE 1 — INFOS UNIQUEMENT #}
  130.         {% set headerTop = websiteSettingService.get('headerTop', null) %}
  131.         {% if headerTop and headerTop.enabled %}
  132.         <div class="header-top text-white">
  133.             <div class="container text-center small">
  134.                 {% if headerTop.mode == 'marquee' %}
  135.                 <marquee behavior="scroll"
  136.                         direction="left"
  137.                         scrollamount="{{ headerTop.speed|default(4) }}">
  138.                     {% for item in headerTop.messages %}
  139.                         {{ item.text
  140.                             |replace({
  141.                                 '{{ freeDeliveryAmount }}': FREE_DELIVERY_AMOUNT,
  142.                                 '{{ companyName }}': companyName
  143.                             })
  144.                         }}
  145.                         {% if not loop.last %} – {% endif %}
  146.                     {% endfor %}
  147.                 </marquee>
  148.                 {% endif %}
  149.             </div>
  150.         </div>
  151.         {% endif %}
  152.         {# BARRE 2 — LOGO + MENU + ACTIONS #}
  153.         {% set frontCategories = Globals.getCategories() %}
  154.         <div class="header-middle d-lg-block">
  155.             <div class="container">
  156.                 <div class="d-flex align-items-center justify-content-between">
  157.                     <div class="header-action-icon-2 d-lg-none mobile-nav-trigger-wrap">
  158.                         <a href="#" class="burger-icon burger-icon-style-2" aria-label="Ouvrir le menu" role="button">
  159.                             <span class="burger-icon-top"></span>
  160.                             <span class="burger-icon-mid"></span>
  161.                             <span class="burger-icon-bottom"></span>
  162.                         </a>
  163.                     </div>
  164.                     {# Logo gauche (INCHANGÉ) #}
  165.                     <div class="logo logo-width-1">
  166.                         <a href="{{ path('home') }}">
  167.                             <img src="{{ asset(companyLogo) }}" alt="{{ companyName }} logo">
  168.                         </a>
  169.                     </div>
  170.                     {# Menu principal (INCHANGÉ) #}
  171.                     <nav class="header-nav d-none d-lg-flex" aria-label="Navigation principale">
  172.                         <ul class="main-nav">
  173.                             <li>
  174.                                 <a class="{% if app.request.attributes.get('_route') == 'home' %}active{% endif %}"
  175.                                 href="{{ path('home') }}">
  176.                                     <span class="fi-rs-home"></span>
  177.                                 </a>
  178.                             </li>
  179.                             {% for entry in frontCategories %}
  180.                                 {% set activeSubs = entry.getSubCategories()|filter(c => c.isActive) %}
  181.                                 {% set hasSubs = activeSubs|length > 0 %}
  182.                                 <li class="has-submenu {{ hasSubs ? 'has-children' : '' }}">
  183.                                     <a href="{{ path('front_category', { id: entry.id, name: entry.name|slug }) }}">
  184.                                         {{ entry.name }}
  185.                                         {% if hasSubs %}
  186.                                         {% endif %}
  187.                                     </a>
  188.                                     {% if hasSubs %}
  189.                                         <ul class="submenu">
  190.                                             {% for subCategory in activeSubs %}
  191.                                                 <li>
  192.                                                     <a href="{{ path('front_category', { id: subCategory.id, name: subCategory.name|slug }) }}">
  193.                                                         {{ subCategory.name }}
  194.                                                     </a>
  195.                                                 </li>
  196.                                             {% endfor %}
  197.                                         </ul>
  198.                                     {% endif %}
  199.                                 </li>
  200.                             {% endfor %}
  201.                             <li><a href="{{ path('front_products_new') }}">NOUVEAUTÉS</a></li>
  202.                             <li><a href="{{ path('front_products_promo') }}">PROMOTIONS</a></li>
  203.                             <li><a href="{{ path('pack_products') }}">NOS PACKS</a></li>
  204.                         </ul>
  205.                     </nav>
  206.                     {# Actions droite #}
  207.                     <div class="header-action-right app">
  208.                         <div class="header-action-2">
  209.                             {# Bouton recherche #}
  210.                             <div class="header-action-icon-2 position-relative">
  211.                                 <button type="button"
  212.                                         class="search-trigger"
  213.                                         id="headerSearchTrigger"
  214.                                         aria-label="Ouvrir la recherche"
  215.                                         aria-expanded="false"
  216.                                         aria-controls="headerSearchBar">
  217.                                     <img class="svgSearch"
  218.                                         src="{{ asset('front/assets/imgs/theme/icons/icon-search.svg') }}"
  219.                                         alt="{{ companyName }}">
  220.                                 </button>
  221.                             </div>
  222.                             {# Barre de recherche (dropdown) #}
  223.                             <div id="headerSearchBar" class="header-search-bar d-none" role="dialog" aria-label="Recherche">
  224.                                 <div class="header-search-inner">
  225.                                     <input type="search"
  226.                                         id="search"
  227.                                         class="form-control form-control-sm"
  228.                                         placeholder="Rechercher un produit..."
  229.                                         autocomplete="off">
  230.                                     <button type="button" id="button-search-desktop" class="btn btn-sm btn-primary">
  231.                                         Rechercher
  232.                                     </button>
  233.                                 </div>
  234.                                 <div id="headerSearchResults" class="header-search-results d-none" aria-live="polite">
  235.                                     <div class="hsr-grid">
  236.                                         <div class="hsr-products-col">
  237.                                             <div class="hsr-products-head">
  238.                                                 <div class="hsr-title">Produits</div>
  239.                                                 <div class="hsr-nav">
  240.                                                     <button type="button" id="hsrPrev" class="hsr-nav-btn" aria-label="Précédent">‹</button>
  241.                                                     <button type="button" id="hsrNext" class="hsr-nav-btn" aria-label="Suivant">›</button>
  242.                                                 </div>
  243.                                             </div>
  244.                                             <div class="hsr-products-grid" id="hsrProducts"></div>
  245.                                         </div>
  246.                                         <div class="hsr-cats-col">
  247.                                             <div class="hsr-title">Suggestions</div>
  248.                                             <div class="hsr-suggest-block">
  249.                                                 <div class="hsr-suggest-label">Catégories</div>
  250.                                                 <div class="hsr-cats-list" id="hsrCategories"></div>
  251.                                             </div>
  252.                                             <div class="hsr-suggest-block">
  253.                                                 <div class="hsr-suggest-label">Références</div>
  254.                                                 <div class="hsr-cats-list" id="hsrReferences"></div>
  255.                                             </div>
  256.                                         </div>
  257.                                     </div>
  258.                                     <div class="hsr-footer">
  259.                                         <button type="button" class="btn btn-sm btn btn-secondary" id="hsrClose">Fermer</button>
  260.                                         <a href="#" class="btn btn-sm btn-primary" id="hsrViewAll">Voir tous les résultats</a>
  261.                                     </div>
  262.                                 </div>
  263.                             </div>
  264.                             {# Favoris #}
  265.                             <div class="header-action-icon-2">
  266.                                 <a href="{{ path('front_wishlist') }}" id="wishlistLink">
  267.                                     <img class="svgInject"
  268.                                         src="{{ asset('front/assets/imgs/theme/icons/icon-heart.svg') }}"
  269.                                         alt="{{ companyName }}">
  270.                                     <span class="pro-count blue" id="wishlistCount">0</span>
  271.                                 </a>
  272.                             </div>
  273.                             {# Panier #}
  274.                             {% verbatim %}
  275.                             <div class="header-action-icon-2" id="app2" v-cloak>
  276.                                 <a class="mini-cart-icon" :href="route_cart">
  277.                                     <img :src="base_url+'/front/assets/imgs/theme/icons/icon-cart.svg'">
  278.                                     <span class="pro-count blue">{{ cart.length }}</span>
  279.                                 </a>
  280.                             </div>
  281.                             {% endverbatim %}
  282.                             {# Connexion #}
  283.                             {% if not app.user %}
  284.                                 <div class="header-action-icon-2">
  285.                                     <a href="{{ path('user_login') }}">
  286.                                         <i class="fi-rs-user"></i>
  287.                                     </a>
  288.                                 </div>
  289.                             {% else %}
  290.                                 <div class="header-action-icon-2">
  291.                                     <a href="{{ path('user_account') }}">
  292.                                         <img src="{{ asset('front/assets/imgs/theme/icons/icon-user.png') }}" alt="user">
  293.                                     </a>
  294.                                 </div>
  295.                             {% endif %}
  296.                         </div>
  297.                     </div>
  298.                 </div>
  299.             </div>
  300.         </div>
  301.         <div class="mobile-header-active mobile-header-wrapper-style">
  302.             <div class="mobile-header-wrapper-inner">
  303.                 <div class="mobile-header-top">
  304.                     <div class="mobile-header-logo">
  305.                         <a href="{{ path('home') }}">
  306.                             <img src="{{ asset(companyLogo) }}" alt="{{ companyName }} logo">
  307.                         </a>
  308.                     </div>
  309.                     <div class="mobile-menu-close close-style-wrap close-style-position-inherit">
  310.                         <button class="close-style search-close" type="button" aria-label="Fermer le menu">
  311.                             <i class="icon-top"></i>
  312.                             <i class="icon-bottom"></i>
  313.                         </button>
  314.                     </div>
  315.                 </div>
  316.                 <div class="mobile-header-content-area">
  317.                     <div class="mobile-search search-style-3 mobile-header-border">
  318.                         <form action="{{ path('home') }}" method="get" onsubmit="return false;">
  319.                             <input type="search" id="search-mobile" name="name" placeholder="Rechercher un produit..." autocomplete="off">
  320.                             <button type="button" id="button-search-mobile"><i class="fi-rs-search"></i></button>
  321.                         </form>
  322.                     </div>
  323.                     <div class="mobile-menu-wrap mobile-header-border">
  324.                         <nav aria-label="Navigation mobile">
  325.                             <ul class="mobile-menu">
  326.                                 <li><a href="{{ path('home') }}">Accueil</a></li>
  327.                                 {% for entry in frontCategories %}
  328.                                     {% set activeSubs = entry.getSubCategories()|filter(c => c.isActive) %}
  329.                                     {% set hasSubs = activeSubs|length > 0 %}
  330.                                     <li class="{{ hasSubs ? 'menu-item-has-children' : '' }}">
  331.                                         <a href="{{ path('front_category', { id: entry.id, name: entry.name|slug }) }}">
  332.                                             {{ entry.name }}
  333.                                         </a>
  334.                                         {% if hasSubs %}
  335.                                             <ul class="dropdown">
  336.                                                 {% for subCategory in activeSubs %}
  337.                                                     <li>
  338.                                                         <a href="{{ path('front_category', { id: subCategory.id, name: subCategory.name|slug }) }}">
  339.                                                             {{ subCategory.name }}
  340.                                                         </a>
  341.                                                     </li>
  342.                                                 {% endfor %}
  343.                                             </ul>
  344.                                         {% endif %}
  345.                                     </li>
  346.                                 {% endfor %}
  347.                                 <li><a href="{{ path('front_products_new') }}">Nouveautés</a></li>
  348.                                 <li><a href="{{ path('front_products_promo') }}">Promotions</a></li>
  349.                                 <li><a href="{{ path('pack_products') }}">Nos packs</a></li>
  350.                                 <li><a href="{{ path('front_wishlist') }}">Mes favoris</a></li>
  351.                                 <li><a href="{{ path('cart_show') }}">Mon panier</a></li>
  352.                                 {% if app.user %}
  353.                                     <li><a href="{{ path('user_account') }}">Mon compte</a></li>
  354.                                 {% else %}
  355.                                     <li><a href="{{ path('user_login') }}">Connexion</a></li>
  356.                                 {% endif %}
  357.                             </ul>
  358.                         </nav>
  359.                     </div>
  360.                 </div>
  361.             </div>
  362.         </div>
  363.         <div id="notify-app">
  364.             <div class="modal fade" id="notifyModal" tabindex="-1" aria-labelledby="notifyModalLabel" aria-hidden="true">
  365.                 <div class="modal-dialog modal-dialog-centered">
  366.                     <div class="modal-content">
  367.                         <div class="modal-header">
  368.                             <h5 class="modal-title" id="notifyModalLabel">Prévenez-moi</h5>
  369.                             <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  370.                         </div>
  371.                         <div class="modal-body">
  372.                             <p class="text-muted">Recevez un email dès que cette taille sera à nouveau disponible.</p>
  373.                             <div class="mb-3">
  374.                                 <label class="form-label">Adresse email</label>
  375.                                 <input type="email" class="form-control" v-model="notifyEmail" placeholder="email@exemple.com">
  376.                             </div>
  377.                             <p class="small text-secondary" v-if="notifyProduct">
  378.                                 Produit sélectionné : <strong v-text="notifyProduct.name"></strong>
  379.                             </p>
  380.                         </div>
  381.                         <div class="modal-footer">
  382.                             <button type="button" class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Annuler</button>
  383.                             <button type="button" class="btn btn-primary" @click="submitNotify">Prévenez-moi</button>
  384.                         </div>
  385.                     </div>
  386.                 </div>
  387.             </div>
  388.         </div>
  389.     </header>
  390.     {# Modale Notification Produit ajouté au panier #}
  391.     <div id="cart-toast" class="cart-toast" aria-live="polite" aria-atomic="true">
  392.         <div class="cart-toast-content">
  393.             <img id="cart-toast-img" alt="">
  394.             <div class="cart-toast-text">
  395.                 <div class="title" id="cart-toast-title"></div>
  396.                 <div class="meta" id="cart-toast-meta"></div>
  397.             </div>
  398.             <button type="button" class="bs-close" aria-label="Fermer" onclick="CartToast.hide()">×</button>
  399.         </div>
  400.     </div>
  401.     {# Modale panier : confirmation ajout (panel) #}
  402.     <div class="modal fade" id="cartConfirmModal" tabindex="-1" aria-hidden="true">
  403.         <div class="modal-dialog modal-dialog-centered modal-md modal-fullscreen-sm-down">
  404.             <div class="modal-content">
  405.                 <div class="modal-header">
  406.                     <h5 class="modal-title">Produit ajouté au panier</h5>
  407.                     <button type="button" class="close ms-auto" data-bs-dismiss="modal" data-bs-dismiss="modal" aria-label="Fermer">
  408.                         <span aria-hidden="true">&times;</span>
  409.                     </button>
  410.                 </div>
  411.                 <div class="modal-body d-flex align-items-start" style="gap:14px;">
  412.                     <img id="cartConfirmImage" src="" alt="" style="width:96px;aspect-ratio:var(--product-aspect-ratio,1);object-fit:contain;">
  413.                     <div class="flex-grow-1" style="font-size:14px;">
  414.                         <div id="cartConfirmName" style="font-weight:600;"></div>
  415.                         <div class="small text-muted mt-1">
  416.                             <span class="me-1">Couleur :</span><span id="cartConfirmColor"></span>
  417.                         </div>
  418.                         <div class="small text-muted">
  419.                             <span class="me-1">Taille :</span><span id="cartConfirmSize"></span>
  420.                         </div>
  421.                         <div class="small text-muted">
  422.                             <span class="me-1">Référence :</span><span id="cartConfirmRef"></span>
  423.                         </div>
  424.                         <div class="small mt-2">
  425.                             <span class="me-1">Quantité :</span><strong id="cartConfirmQty"></strong>
  426.                         </div>
  427.                     </div>
  428.                 </div>
  429.                 <div class="modal-footer">
  430.                     <button class="btn btn-outline-dark btn-sm" data-bs-dismiss="modal">Continuer mes achats</button>
  431.                     <a href="{{ path('cart_show') }}" class="btn btn-dark btn-sm">Voir mon panier</a>
  432.                 </div>
  433.             </div>
  434.         </div>
  435.     </div>
  436.      {#Modale Commande rapide#}
  437.      {#
  438.     <div id="quickOrderPanel" class="quick-order-panel">
  439.         <div class="panel-header">
  440.             <h5>Commander rapidement</h5>
  441.             <button type="button" class="close-panel" @click="closeQuickOrderPanel">&times;</button>
  442.         </div>
  443.         <div class="panel-body">
  444.             <div class="panel-product d-flex" style="gap:14px;">
  445.                 <img :src="quickOrder.img"
  446.                     alt=""
  447.                     style="width:96px;aspect-ratio:var(--product-aspect-ratio,1);object-fit:contain;">
  448.                 <div>
  449.                     <div style="font-weight:600;">${ produit.name }</div>
  450.                     <div class="small text-muted">
  451.                         ${ selectedDeclinaison.couleur.name } · ${ selectedDeclinaison.taille }
  452.                     </div>
  453.                 </div>
  454.             </div>
  455.             <hr>
  456.             <div class="mb-3">
  457.                 <label class="form-label">Nom & Prénom</label>
  458.                 <input type="text" class="form-control" v-model="quickOrder.name">
  459.             </div>
  460.             <div class="mb-3">
  461.                 <label class="form-label">Adresse complète</label>
  462.                 <textarea class="form-control" rows="2" v-model="quickOrder.address"></textarea>
  463.             </div>
  464.             <div class="mb-3">
  465.                 <label class="form-label">Téléphone</label>
  466.                 <input type="tel" class="form-control" v-model="quickOrder.phone">
  467.             </div>
  468.             <div class="mb-3">
  469.                 <label class="form-label">Remarques</label>
  470.                 <textarea class="form-control" rows="2" v-model="quickOrder.note"></textarea>
  471.             </div>
  472.         </div>
  473.         <div class="panel-footer">
  474.             <button class="btn btn-outline-dark btn-sm" @click="closeQuickOrderPanel">
  475.                 Annuler
  476.             </button>
  477.             <button class="btn btn-dark btn-sm" @click="submitQuickOrder">
  478.                 Confirmer la commande
  479.             </button>
  480.         </div>
  481.     </div>
  482.     #}
  483.     {% block body %}{% endblock %}
  484.     {% block footer %}
  485.         <footer class="main bg-grey-9">
  486.             {#-- Section footer --#}
  487.             <section class="section-padding footer-mid">
  488.                 <div class="container pt-15 pb-20">
  489.                     <div class="row gy-4">
  490.                         {# Bloc : Logo & description #}
  491.                         <div class="col-lg-5 col-md-6">
  492.                             <div class="widget-about font-md">
  493.                                 <div class="logo mb-20">
  494.                                     <a href="{{ path('home') }}">
  495.                                         <img src="{{ asset(companyFooterLogo) }}" alt="{{ companyName }} logo">
  496.                                     </a>
  497.                                 </div>
  498.                                 <h5 class="text-grey-4 fw-600 mb-10">
  499.                                     {{ companyName }} est une marque tunisienne spécialisée dans la vente de vêtements et chaussures en ligne.
  500.                                 </h5>
  501.                                 <p><strong>Adresse :</strong> {{ companyAddress }}</p>
  502.                                 <p><strong>Horaires :</strong> Toujours ouvert</p>
  503.                             </div>
  504.                         </div>
  505.                         {# Bloc : Liens service client #}
  506.                         <div class="col-lg-2 col-md-3">
  507.                             <h5 class="widget-title">Service client</h5>
  508.                             <ul class="footer-list">
  509.                                 <li><a href="{{ path('who_are_we') }}">Qui sommes-nous ?</a></li>
  510.                                 <li><a href="{{ path('delivery_information') }}">Informations de livraison</a></li>
  511.                                 <li><a href="{{ path('return_and_exchange') }}">Retour & échange</a></li>
  512.                                 <li><a href="{{ path('size_guide') }}">Guide des tailles</a></li>
  513.                                 <li><a href="{{ path('terms_of_sales') }}">Conditions générales de vente</a></li>
  514.                                 <li><a href="{{ path('terms') }}">Conditions d’utilisation</a></li>
  515.                                 <li><a href="{{ path('privacy_policy') }}">Politique de confidentialité</a></li>
  516.                                 <li><a href="{{ path('data_deletion') }}">Suppression des données</a></li>
  517.                                 <li><a href="{{ path('contact') }}">Contact</a></li>
  518.                             </ul>
  519.                         </div>
  520.                         {# Bloc : Liens Mon compte #}
  521.                         <div class="col-lg-2 col-md-3">
  522.                             <h5 class="widget-title">Mon compte</h5>
  523.                             <ul class="footer-list">
  524.                                 <li><a href="{{ path('cart_show') }}">Mon panier</a></li>
  525.                                 {% if not app.user %}
  526.                                     <li><a href="{{ path('user_login') }}">Connexion</a></li>
  527.                                 {% else %}
  528.                                     <li><a href="{{ path('user_account') }}">Mon profil</a></li>
  529.                                     <li><a href="{{ path('app_logout') }}">Déconnexion</a></li>
  530.                                 {% endif %}
  531.                             </ul>
  532.                         </div>
  533.                         {# Bloc : Réseaux sociaux #}
  534.                         <div class="col-lg-3 text-center text-lg-start">
  535.                             <h5 class="widget-title mb-3">Suivez-nous sur les réseaux sociaux</h5>
  536.                             <div class="mobile-social-icon d-flex gap-2 justify-content-lg-start justify-content-center">
  537.                                 {% if companySocialLinks %}
  538.                                     {% for key, socialLink in companySocialLinks %}
  539.                                         {% if socialLink is iterable %}
  540.                                             {% set link = socialLink.link|default('') %}
  541.                                             {% set linkLower = link|lower %}
  542.                                             {% set iconKey = '' %}
  543.                                             {% if 'facebook' in linkLower or 'fb.' in linkLower %}
  544.                                                 {% set iconKey = 'facebook' %}
  545.                                             {% elseif 'instagram' in linkLower or 'insta' in linkLower %}
  546.                                                 {% set iconKey = 'instagram' %}
  547.                                             {% elseif 'youtube' in linkLower or 'youtu' in linkLower %}
  548.                                                 {% set iconKey = 'youtube' %}
  549.                                             {% elseif 'tiktok' in linkLower %}
  550.                                                 {% set iconKey = 'tiktok' %}
  551.                                             {% elseif 'whatsapp' in linkLower or 'wa.me' in linkLower %}
  552.                                                 {% set iconKey = 'whatsapp' %}
  553.                                             {% elseif 'telegram' in linkLower or 't.me' in linkLower %}
  554.                                                 {% set iconKey = 'telegram' %}
  555.                                             {% elseif 'linkedin' in linkLower %}
  556.                                                 {% set iconKey = 'linkedin' %}
  557.                                             {% elseif 'twitter' in linkLower or 'x.com' in linkLower %}
  558.                                                 {% set iconKey = 'twitter' %}
  559.                                             {% elseif 'pinterest' in linkLower %}
  560.                                                 {% set iconKey = 'pinterest' %}
  561.                                             {% elseif 'snapchat' in linkLower %}
  562.                                                 {% set iconKey = 'snapchat' %}
  563.                                             {% elseif 'viber' in linkLower %}
  564.                                                 {% set iconKey = 'viber' %}
  565.                                             {% elseif 'threads' in linkLower %}
  566.                                                 {% set iconKey = 'threads' %}
  567.                                             {% endif %}
  568.                                             {% if iconKey and link %}
  569.                                                 <a href="{{ link }}" target="_blank">
  570.                                                     <img src="{{ asset('front/assets/imgs/theme/icons/icon-' ~ iconKey ~ '.svg') }}" alt="{{ iconKey|capitalize }}">
  571.                                                 </a>
  572.                                             {% endif %}
  573.                                         {% else %}
  574.                                             {% set link = socialLink %}
  575.                                             {% set iconKey = key %}
  576.                                             {% if link %}
  577.                                                 <a href="{{ link }}" target="_blank">
  578.                                                     <img src="{{ asset('front/assets/imgs/theme/icons/icon-' ~ iconKey ~ '.svg') }}" alt="{{ iconKey|capitalize }}">
  579.                                                 </a>
  580.                                             {% endif %}
  581.                                         {% endif %}
  582.                                     {% endfor %}
  583.                                 {% endif %}
  584.                             </div>
  585.                         </div>
  586.                     </div>
  587.                 </div>
  588.             </section>
  589.             <div class="container pb-20 wow fadeIn animated">
  590.                 <div class="row">
  591.                     <div class="col-12 mb-20">
  592.                         <div class="footer-bottom"></div>
  593.                     </div>
  594.                     <div class="col-lg-6">
  595.                         <p class="float-md-left font-sm text-muted mb-0">&copy; {{ 'now' | date('Y') }}, <strong class="text-brand">{{ companyName }}</strong> </p>
  596.                     </div>
  597.                     <div class="col-lg-6">
  598.                         <p class="text-lg-end text-start font-sm text-muted mb-0">
  599.                             Designed by <a href="{{ path('home') }}" target="_blank">{{ companyName }}</a>. All rights reserved
  600.                         </p>
  601.                     </div>
  602.                 </div>
  603.             </div>
  604.         </footer>
  605.     {% endblock %}
  606.     {% if app.request.attributes.get('_route') != 'cart_show' %}
  607.         {% verbatim %}
  608.         <div id="app2-mobile" class="mobile-cart-float-wrap" v-cloak>
  609.             <a v-if="cart.length" class="mobile-cart-float" :href="route_cart" aria-label="Ouvrir le panier">
  610.                 <span class="mobile-cart-float__icon">
  611.                     <img :src="base_url + '/front/assets/imgs/theme/icons/icon-cart.svg'" alt="">
  612.                     <span class="mobile-cart-float__count">${ cart.length }</span>
  613.                 </span>
  614.                 <span class="mobile-cart-float__content">
  615.                     <strong class="mobile-cart-float__title">Mon panier</strong>
  616.                     <span class="mobile-cart-float__meta">${ Number(total || 0).toFixed(3) } TND</span>
  617.                     <span class="mobile-cart-float__hint" v-if="freeDeliveryRemaining > 0">
  618.                         Plus que ${ freeDeliveryRemaining.toFixed(3) } TND pour la livraison gratuite
  619.                     </span>
  620.                     <span class="mobile-cart-float__hint is-success" v-else-if="hasFreeDeliveryThreshold">
  621.                         Livraison gratuite débloquée
  622.                     </span>
  623.                 </span>
  624.                 <span class="mobile-cart-float__cta">Voir</span>
  625.             </a>
  626.         </div>
  627.         {% endverbatim %}
  628.     {% endif %}
  629.     {# Modal zoom #}
  630.     {% verbatim %}
  631.         <div id="zoom-app">
  632.             <div class="modal fade zoom-modal" id="imageZoomModal" tabindex="-1">
  633.                 <div class="modal-dialog modal-xl modal-dialog-centered modal-fullscreen-lg-down">
  634.                     <div class="modal-content zoom-modal-content">
  635.                         <div class="modal-header zoom-modal-header">
  636.                             <h6 class="modal-title text-truncate" v-text="zoomImageAlt || 'Aperçu image'"></h6>
  637.                             <div class="zoom-controls">
  638.                                 <button class="zoom-btn" @click="zoomOut">−</button>
  639.                                 <button class="zoom-btn" @click="zoomIn">+</button>
  640.                                 <button class="zoom-btn" @click="zoomReset">⤢</button>
  641.                                 <button class="zoom-btn close-btn" data-bs-dismiss="modal">×</button>
  642.                             </div>
  643.                         </div>
  644.                         <div class="modal-body zoom-modal-body">
  645.                             <div class="zoom-stage"
  646.                                 @mousedown="startPan"
  647.                                 @mousemove="movePan"
  648.                                 @mouseup="endPan"
  649.                                 @mouseleave="endPan">
  650.                              <img
  651.                                 class="zoom-image"
  652.                                 :src="zoomImageSrc"
  653.                                 :alt="zoomImageAlt"
  654.                                 draggable="false"
  655.                                 :style="{
  656.                                     transform: `translate(${zoomPanX}px, ${zoomPanY}px) scale(${zoomLevel})`
  657.                                 }">
  658.                             </div>
  659.                         </div>
  660.                     </div>
  661.                 </div>
  662.             </div>
  663.         </div>
  664.     {% endverbatim %}
  665.     {# Modal infos #}
  666.     {#
  667.     <div class="modal fade custom-modal" id="cotinueModal" tabindex="-1" aria-labelledby="onloadModalLabel"
  668.          aria-hidden="true">
  669.         <div class="modal-dialog">
  670.             <div class="modal-content">
  671.                 <button type="button" class="bs-close" data-bs-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  672.                 <div class="modal-body">
  673.                     <div style="padding: 35px;">
  674.                         <div class="deal-top">
  675.                             <h2 class="text-brand">Deal of the Day</h2>
  676.                             <h5>Limited quantities.</h5>
  677.                         </div>
  678.                         <div class="deal-content">
  679.                             <h6 class="product-title"><a href="shop-product-right.html">Summer Collection New Morden
  680.                                     Design</a></h6>
  681.                             <div class="product-price"><span class="new-price">$139.00</span><span class="old-price">$160.99</span>
  682.                             </div>
  683.                         </div>
  684.                         <div class="deal-bottom">
  685.                             <p>Hurry Up! Offer End In:</p>
  686.                             <div class="deals-countdown" data-countdown="2025/03/25 00:00:00"><span
  687.                                         class="countdown-section"><span class="countdown-amount hover-up">03</span><span
  688.                                             class="countdown-period"> days </span></span><span
  689.                                         class="countdown-section"><span class="countdown-amount hover-up">02</span><span
  690.                                             class="countdown-period"> hours </span></span><span
  691.                                         class="countdown-section"><span class="countdown-amount hover-up">43</span><span
  692.                                             class="countdown-period"> mins </span></span><span
  693.                                         class="countdown-section"><span class="countdown-amount hover-up">29</span><span
  694.                                             class="countdown-period"> sec </span></span></div>
  695.                             <a href="#" class="btn hover-up">Shop Now <i
  696.                                         class="fi-rs-arrow-right"></i></a>
  697.                         </div>
  698.                     </div>
  699.                 </div>
  700.             </div>
  701.         </div>
  702.     </div>#}
  703.     {# Preloader Start #}
  704.     <div id="preloader-active">
  705.         <div class="preloader d-flex align-items-center justify-content-center">
  706.             <div class="preloader-inner position-relative">
  707.                 <div class="text-center">
  708.                     <h5 class="mb-5">CHARGEMENT</h5>
  709.                     <div class="loader">
  710.                         <div class="bar bar1"></div>
  711.                         <div class="bar bar2"></div>
  712.                         <div class="bar bar3"></div>
  713.                     </div>
  714.                 </div>
  715.             </div>
  716.         </div>
  717.     </div>
  718.     {# Preloader loading #}
  719.     <div id="preloader-active-loading" style="opacity: 0.5;display: none;">
  720.         <div class="preloader d-flex align-items-center justify-content-center">
  721.             <div class="preloader-inner position-relative">
  722.                 <div class="text-center">
  723.                     <h5 class="mb-5">CHARGEMENT</h5>
  724.                     <div class="loader">
  725.                         <div class="bar bar1"></div>
  726.                         <div class="bar bar2"></div>
  727.                         <div class="bar bar3"></div>
  728.                     </div>
  729.                 </div>
  730.             </div>
  731.         </div>
  732.     </div>
  733.     {# MODALE PANIER — Confirmation ajout produit (panneau droit) #}
  734.     <div class="modal fade modal-cart-panel"  id="cartConfirmModal"  tabindex="-1"aria-hidden="true">
  735.         <div class="modal-dialog modal-dialog-end modal-fullscreen-sm-down">
  736.             <div class="modal-content">
  737.                 <div class="modal-header">
  738.                     <h5 class="modal-title">Ajouté au panier</h5>
  739.                     <button type="button"
  740.                             class="btn-close"
  741.                             data-bs-dismiss="modal"
  742.                             aria-label="Fermer"></button>
  743.                 </div>
  744.                 <div class="modal-body">
  745.                     <div class="cart-confirm-item">
  746.                         <img id="cartConfirmImage"
  747.                             src=""
  748.                             alt=""
  749.                             class="cart-confirm-image">
  750.                         <div class="cart-confirm-info">
  751.                             <div class="cart-confirm-title"
  752.                                 id="cartConfirmName"></div>
  753.                             <div class="cart-confirm-line">
  754.                                 <span class="label">Couleur :</span>
  755.                                 <span id="cartConfirmColor"></span>
  756.                             </div>
  757.                             <div class="cart-confirm-line">
  758.                                 <span class="label">Taille :</span>
  759.                                 <span id="cartConfirmSize"></span>
  760.                             </div>
  761.                             <div class="cart-confirm-line">
  762.                                 <span class="label">Référence :</span>
  763.                                 <span id="cartConfirmRef"></span>
  764.                             </div>
  765.                             <div class="cart-confirm-line">
  766.                                 <span class="label">Quantité :</span>
  767.                                 <strong id="cartConfirmQty"></strong>
  768.                             </div>
  769.                         </div>
  770.                     </div>
  771.                 </div>
  772.                 <div class="modal-footer flex-column gap-2">
  773.                     <button type="button"
  774.                             class="btn btn-outline-dark w-100"
  775.                             data-bs-dismiss="modal">
  776.                         Continuer mes achats
  777.                     </button>
  778.                     <a href="{{ path('cart_show') }}"
  779.                     class="btn btn-dark w-100">
  780.                         Voir mon panier
  781.                     </a>
  782.                 </div>
  783.             </div>
  784.         </div>
  785.     </div>
  786.     {% if app.environment == 'production'  %}
  787.         <div id="fb-root"></div>
  788.         {# Your Plugin de discussion code #}
  789.         <div id="fb-customer-chat" class="fb-customerchat"></div>
  790.         <script>
  791.             var chatbox = document.getElementById('fb-customer-chat');
  792.             chatbox.setAttribute("page_id", "1888322994731663");
  793.             chatbox.setAttribute("attribution", "biz_inbox");
  794.         </script>
  795.         {# Your SDK code #}
  796.         <script>
  797.             window.fbAsyncInit = function() {
  798.                 FB.init({
  799.                     xfbml            : true,
  800.                     version          : 'v17.0'
  801.                 });
  802.             };
  803.             (function(d, s, id) {
  804.                 var js, fjs = d.getElementsByTagName(s)[0];
  805.                 if (d.getElementById(id)) return;
  806.                 js = d.createElement(s); js.id = id;
  807.                 js.src = 'https://connect.facebook.net/fr_FR/sdk/xfbml.customerchat.js';
  808.                 fjs.parentNode.insertBefore(js, fjs);
  809.             }(document, 'script', 'facebook-jssdk'));
  810.         </script>
  811.     {% endif %}
  812.     {# Vendor JS#}
  813.     {% block javascripts %}
  814.         <script src="{{ asset('front/assets/js/vendor/modernizr-3.6.0.min.js') }}"></script>
  815.         {#<script src="{{ asset('front/assets/js/vendor/jquery-3.6.0.min.js') }}"></script>#}
  816.         {#<script src="{{ asset('front/assets/js/vendor/jquery-migrate-3.3.0.min.js') }}"></script>#}
  817.         {#<script src="{{ asset('front/assets/js/vendor/bootstrap.bundle.min.js') }}"></script>#}
  818.        <script src="{{ asset('assets/jquery/jquery.min.js') }}"></script>
  819.         {# #SECTION: Bootstrap 5 – Bundle (Popper inclus) #}
  820.         <script src="{{ asset('assets/bootstrap5/js/bootstrap.bundle.min.js') }}"></script>
  821.         <script src="{{ asset('front/assets/js/plugins/slick.js') }}"></script>
  822.         <script src="{{ asset('front/assets/js/plugins/jquery.syotimer.min.js') }}"></script>
  823.         <script src="{{ asset('front/assets/js/plugins/wow.js') }}"></script>
  824.         <script src="{{ asset('front/assets/js/plugins/jquery-ui.js') }}"></script>
  825.         <script src="{{ asset('front/assets/js/plugins/perfect-scrollbar.js') }}"></script>
  826.         <script src="{{ asset('front/assets/js/plugins/magnific-popup.js') }}"></script>
  827.         <script src="{{ asset('front/assets/js/plugins/select2.min.js') }}"></script>
  828.         <script src="{{ asset('front/assets/js/plugins/waypoints.js') }}"></script>
  829.         <script src="{{ asset('front/assets/js/plugins/counterup.js') }}"></script>
  830.         <script src="{{ asset('front/assets/js/plugins/jquery.countdown.min.js') }}"></script>
  831.         <script src="{{ asset('front/assets/js/plugins/images-loaded.js') }}"></script>
  832.         <script src="{{ asset('front/assets/js/plugins/isotope.js') }}"></script>
  833.         <script src="{{ asset('front/assets/js/plugins/scrollup.js') }}"></script>
  834.         <script src="{{ asset('front/assets/js/plugins/jquery.vticker-min.js') }}"></script>
  835.         <script src="{{ asset('front/assets/js/plugins/jquery.theia.sticky.js') }}"></script>
  836.         <script src="{{ asset('front/assets/js/plugins/jquery.elevatezoom.js') }}"></script>
  837.         {# Template  JS #}
  838.         <script src="{{ asset('./front/assets/js/main.js') }}"></script>
  839.         {# <script src="{{ asset('./front/assets/js/shop.js') }}"></script>#}
  840.         {# Include Plugin JS file #}
  841.         <script src="{{ asset('front/assets/toast/js/nice-toast-js.min.js') }}" type="text/javascript"></script>
  842.         <script src="{{ asset('front/assets/toast/toast.js') }}" type="text/javascript"></script>
  843.         <script src="{{ asset('bundles/fosjsrouting/js/router.min.js')  }}"></script>
  844.         <script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script>
  845.         <script>
  846.             {% if app.user and app.user.firstName %}
  847.                 window.APP_USER_FIRST_NAME = {{ app.user.firstName|json_encode|raw }};
  848.             {% else %}
  849.                 window.APP_USER_FIRST_NAME = null;
  850.             {% endif %}
  851.             window.APP_USER_ACCOUNT_ROUTE = {{ path('user_account')|json_encode|raw }};
  852.             window.APP_LOGOUT_ROUTE = {{ path('app_logout')|json_encode|raw }};
  853.         </script>
  854.         {# Vue  JS #}
  855.         <script src="{{ asset('front/assets/vue/vue.min.js') }}"></script>
  856.         <script src="{{ asset('front/assets/vue/axios.min.js') }}"></script>
  857.         <script src="{{ asset('front/assets/vue/vue-the-mask.min.js') }}"></script>
  858.         <script src="{{ asset('front/assets/scripts/base.js') }}"></script>
  859.         <script src="{{ asset('front/assets/scripts/product/filter-modal.shared.js') }}"></script>
  860.         <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
  861.     {% endblock %}
  862. </body>
  863. </html>