templates/FO/FO/menu.html.twig line 1

Open in your IDE?
  1. {% set societe = dtc_societe.getSociete() %}
  2. <div class="col-md-3 left_col">
  3.     <div class="_left_col scroll-view">
  4.         <div class="navbar _nav_title text-center" style="border: 0;">
  5.             <a href="/" class="_site_title" style=""><img style="width:75%;" src="/images/logo_noir.png"></a>
  6.         </div>
  7.         {#
  8.         <div class="navbar nav_title" style="border: 0;">
  9.             <a href="/" class="site_title" style="font-size:1.4em;"><i style="padding-left:0px;border-radius:0%;border:0;" class="icon-kangaroo-silhouette"></i> <span>Pro Outback Import</span></a>
  10.         </div>
  11.         #}
  12.         {% if version_projet != "" and 1!=1 %}
  13.         <div class="navbar " style="border: 0;font-size:1.4em;color:white;padding-top:0;padding-bottom:0px;">
  14.             <span class="badge badge-info">{{ version_projet }}</span>
  15.         </div>
  16.         {% endif %}
  17.         <!-- menu profile quick info -->
  18.         {% if app.user.id is defined  %}
  19.             <div class="profile clearfix">
  20.                 <div class="profile_pic">
  21.                     <img src="/images/avatar.png" style="height:55px;" class="img-circle profile_img">
  22.                 </div>
  23.                 <div class="profile_info">
  24.                     <span>Bonjour,</span>
  25.                     <h2 class="orange" style="color:#fbb911;">{{ app.user.prenom }} {{ app.user.nom }}</h2>
  26.                 </div>
  27.             </div>
  28.         {% endif %}
  29.         <!-- /menu profile quick info -->
  30.         <!-- sidebar menu -->
  31.         <div id="sidebar-menu" class="main_menu_side hidden-print main_menu">
  32.             <div class="menu_section">
  33.                 <h3>General</h3>
  34.                 <ul class="nav side-menu">
  35.                     <li><a href="/"><i class="fa fa-home"></i> Accueil </a> </li>
  36.                     <li><a href="{{ path ("dtc_article_liste") }}"><i class="fa fa-shopping-cart"></i> Catalogue </a> </li>
  37.                     {#
  38.                     <li><a><i class="fa fa-shopping-cart"></i> Catalogue <span class="fa fa-chevron-down"></span></a>
  39.                         <ul class="nav child_menu">
  40.                             <li><a href="{{ path ("dtc_article_liste") }}">Produits</a></li>
  41.                         </ul>
  42.                     </li>
  43.                     #}
  44.                     <li><a><i class="fa fa-clipboard"></i> Commandes <span class="fa fa-chevron-down"></span></a>
  45.                         <ul class="nav child_menu">
  46.                             <li><a href="{{ path ("dtc_devis_liste") }}">Devis</a></li>
  47.                             <li><a href="{{ path ("dtc_commande_liste") }}">Commandes</a></li>
  48.                             <li><a href="{{ path ("dtc_bon_livraison_liste") }}">Bons de livraison</a></li>
  49.                             <li><a href="{{ path ("dtc_facture_liste") }}">Factures</a></li>
  50.                             <li><a href="{{ path ("dtc_sav") }}">SAV</a></li>
  51.                         </ul>
  52.                     </li>
  53.                     <li><a><i class="fa fa-download"></i> Téléchargements <span class="fa fa-chevron-down"></span></a>
  54.                         <ul class="nav child_menu">
  55.                            {#  <li><a href="{{ path ("dtc_telechargement_prix_liste") }}">Prix</a></li> #}
  56.                             {% if dtc_article.getCatalogues() > 0 %}
  57.                             <li><a href="{{ path ("dtc_telechargement_catalogue_liste") }}">Catalogues</a></li>
  58.                             {% endif %}
  59.                             {% if dtc_article.getFichiersCsv() > 0 %}
  60.                                 <li><a href="{{ path ("dtc_telechargement_fiche_liste") }}">Fichiers CSV</a></li>
  61.                             {% endif %}
  62.                         </ul>
  63.                     </li>
  64.                     <li><a href="{{ path ("dtc_contact") }}"><i class="fa fa-envelope"></i> Contact </a>
  65.                     <li><a href="{{ path ("dtc_faq") }}"><i class="fa fa-question"></i> Aide </a>
  66.                 </ul>
  67.             </div>
  68.             <div class="menu_section " style="margin-bottom:20px;">
  69.                 <h3>Paramètres</h3>
  70.                 <ul class="nav side-menu side-menu-2" style="margin-top:15px;">
  71.                     <li><a><i class="fa fa-gears"></i> Paramètres <span class="fa fa-chevron-down"></span></a>
  72.                         <ul class="nav child_menu">
  73.                             <li><a href="{{ path ("dtc_utilisateur_profil") }}">Données personnelles</a></li>
  74.                           {#   <li><a href="{{ path ("dtc_remise_liste") }}">Remises</a></li>#}
  75.                             <li><a href="{{ path ("dtc_adresse_liste") }}">Adresses</a></li>
  76.                             {% if app.user.client.id is defined and app.user.client.statutApi %}
  77.                             <li><a href="{{ path ("dtc_client_export_csv") }}">Export CSV</a></li>
  78.                             <li><a href="{{ path ("dtc_client_api") }}">API</a></li>
  79.                             {% endif %}
  80.                         </ul>
  81.                     </li>
  82.                     {#
  83.                     <li><a><i class="fa fa-gears"></i> Paramètres <span class="fa fa-chevron-down"></span></a>
  84.                         <ul class="nav child_menu">
  85.                             <li><a href="#level1_1">Level One</a>
  86.                             <li><a>Level One<span class="fa fa-chevron-down"></span></a>
  87.                                 <ul class="nav child_menu">
  88.                                     <li class="sub_menu"><a href="level2.html">Level Two</a>
  89.                                     </li>
  90.                                     <li><a href="#level2_1">Level Two</a>
  91.                                     </li>
  92.                                     <li><a href="#level2_2">Level Two</a>
  93.                                     </li>
  94.                                 </ul>
  95.                             </li>
  96.                             <li><a href="#level1_2">Level One</a>
  97.                             </li>
  98.                         </ul>
  99.                     </li>
  100.                         <li><a href="{{ path('dtc_utilisateur_profil') }}"><i class="fa fa-gears"></i> Paramètres</a></li>
  101.                     #}
  102.                 </ul>
  103.             </div>
  104.             <div class="menu_section">
  105.                 <style>
  106.                     /* Style de base pour tous les drapeaux */
  107.                 </style>
  108.                 <script type="text/javascript">
  109.                     function changeLanguage(lang) {
  110.                         var selectField = document.querySelector("select.goog-te-combo");
  111.                         if (selectField) {
  112.                             selectField.value = lang;
  113.                             selectField.dispatchEvent(new Event("change"));
  114.                         }
  115.                     }
  116.                     function googleTranslateElementInit() {
  117.                         new google.translate.TranslateElement({
  118.                             pageLanguage: 'fr'
  119.                         }, 'google_translate_element');
  120.                     }
  121.                 </script>
  122.                 <script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
  123.                 <div id="google_translate_element" style="display:none"></div>
  124.                 <h3>Langue</h3>
  125.                 <ul class="nav side-menu" style="margin-top:15px;">
  126.                     <li style="text-align:center;">
  127.                         <span style="cursor:pointer;display:inline;padding-right:5px;" href="#" onclick="changeLanguage('en')"><span style="margin-bottom:10px;" class="flag flag-gb"></span></span>
  128.                         <span style="cursor:pointer;display:inline;padding-left:5px;padding-right:5px;" href="#" onclick="changeLanguage('fr')"><span style="margin-bottom:10px;" class="flag flag-fr"></span></span>
  129.                         <span style="cursor:pointer;display:inline;padding-left:5px;padding-right:5px;" href="#" onclick="changeLanguage('es')"><span style="margin-bottom:10px;" class="flag flag-es"></span></span>
  130.                     </li>
  131.                 </ul>
  132.             </div>
  133.         </div>
  134.         <!-- /sidebar menu -->
  135.         <!-- /menu footer buttons -->
  136.         <div class="sidebar-footer hidden-small">
  137.             {#
  138.             <a data-toggle="tooltip" data-placement="top" title="Settings">
  139.                 <span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
  140.             </a>
  141.             <a data-toggle="tooltip" data-placement="top" title="FullScreen">
  142.                 <span class="glyphicon glyphicon-fullscreen" aria-hidden="true"></span>
  143.             </a>
  144.             <a data-toggle="tooltip" data-placement="top" title="Lock">
  145.                 <span class="glyphicon glyphicon-eye-close" aria-hidden="true"></span>
  146.             </a>
  147.             <span style="width:75%;display:block;float:left;">
  148.                 &nbsp;
  149.             </span>
  150.             #}
  151.             <a data-toggle="tooltip" data-placement="top" title="Aide" href="{{ path('dtc_faq') }}">
  152.                 <span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span>
  153.             </a>
  154.             <a data-toggle="tooltip" data-placement="top" title="Contact" href="{{ path('dtc_contact') }}">
  155.                 <span class="glyphicon glyphicon-envelope" aria-hidden="true"></span>
  156.             </a>
  157.             <a data-toggle="tooltip" data-placement="top" title="Profil" href="{{ path('dtc_utilisateur_profil') }}">
  158.                 <span class="glyphicon glyphicon-cog" aria-hidden="true"></span>
  159.             </a>
  160.             <a data-toggle="tooltip" data-placement="top" title="Se déconnecter" href="{{ path('logout') }}">
  161.                 <span class="glyphicon glyphicon-off" aria-hidden="true"></span>
  162.             </a>
  163.         </div>
  164.         <!-- /menu footer buttons -->
  165.     </div>
  166. </div>
  167. {% set now = "now"|date("Y-m-d H:i:s") %}
  168. {% if societe.noteService != ""
  169.     and societe.isStatutTexteBandeau
  170.     and (societe.dateDebutTexteBandeau is not empty and societe.dateDebutTexteBandeau|date("Y-m-d H:i:s") <= now)
  171.     and (societe.dateFinTexteBandeau is not empty and societe.dateFinTexteBandeau|date("Y-m-d H:i:s") >= now)
  172. %}
  173.     <div style="background:yellow;">
  174.         <div class="banner" aria-label="" style="_margin-left:230px;">
  175.             <div class="track" id="track">
  176.                 <div class="item" style="text-align:center;">
  177.                     {{ societe.noteService }}&nbsp;&nbsp;&nbsp;
  178.                     {{ societe.noteService }}&nbsp;&nbsp;&nbsp;
  179.                     {{ societe.noteService }}
  180.                 </div>
  181.                 <input id="speed" type="hidden" value="30" min="10">
  182.             </div>
  183.         </div>
  184.     </div>
  185. {% endif %}
  186. <style>
  187.     .pulse {
  188.         animation: pulse 0.4s ease;
  189.     }
  190.     @keyframes pulse {
  191.         0%   { transform: scale(1); }
  192.         50%  { transform: scale(1.15); }
  193.         100% { transform: scale(1); }
  194.     }
  195. </style>
  196. {% if app.user.type.id is defined and (app.user.type.id == 1 or app.user.type.id == 2 or app.user.type.id == 3) %}
  197.     <div id="bandeau_admin" class="dark"  style="background:#d8d8d8;padding:10px;">
  198.         <div id="contenu_bandeau_admin">
  199.         {% if app.user.client.id is defined %}
  200.         <span data-link="{{ path ("dtc_change_client_modal", {} ) }}" class="droite btn btn-success btn-sm open-modal-form" data-taille="" data-target="#blocModal" data-toggle="modal">Changer de client</span>
  201.         {% else %}
  202.             <span data-link="{{ path ("dtc_change_client_modal", {} ) }}" class="droite btn btn-success btn-sm open-modal-form" data-taille="" data-target="#blocModal" data-toggle="modal">Choisir un client</span>
  203.         {% endif %}
  204.         <b>{{ app.user.prenom }} {{ app.user.nom }} ADMIN</b>.
  205.         {% if app.user.client.id is defined %}
  206.             <div id="client_rattache">CLIENT : <b id="">{{ app.user.client.reference }} - {{ app.user.client.nom }}</b>.
  207.                 {% if app.user.type.id == 1 or app.user.type.id == 2 or app.user.type.id == 3 %}
  208.                 | <a class="dark" href="{{ path ("dtc_client_stats", {} ) }}">Suivi activités</a>
  209.                 {% endif %}
  210.             </div>
  211.         {% else %}
  212.             <div id="client_rattache"><span class="fa fa-warning text-danger"></span> MERCI DE SÉLECTIONNER UN CLIENT. <span class="fa fa-warning text-danger"></div>
  213.         {% endif %}
  214.         <div class="both"></div>
  215.         </div>
  216.     </div>
  217. {% endif %}
  218. <script>
  219.     $(document).ready(function(){
  220.         $selectArticleRechercheTop = $("#dtc_article_recherche_top_select2").select2({
  221.             ajax: {
  222.                 url: Routing.generate('dtc_article_recherche'),
  223.                 dataType: 'json',
  224.                 delay: 250,
  225.                 data: function (params) { return {  q: params.term,page: params.page}; },
  226.                 processResults: function (data, params) {
  227.                     params.page = params.page || 1;
  228.                     return {  results: data.items,  pagination: { more: (params.page * 10) < data.total_count }};},
  229.                 cache: true
  230.             },
  231.             escapeMarkup: function (markup) { return markup; },minimumInputLength: 0,
  232.             templateResult:formatRepoSelect2RechercheTop,
  233.             templateSelection: formatRepoSelect2RechercheTopSelection,
  234.             minimumInputLength: 3,
  235.             placeholder: 'Rechercher un produit, une référence.',
  236.             language: {
  237.                 inputTooShort: function(args) {
  238.                     var remainingChars = args.minimum - args.input.length;
  239.                     return 'Merci de saisir au moins ' + args.minimum + ' caractères';
  240.                 },
  241.                 searching: function() {
  242.                     return "Recherche en cours…"; // ton texte personnalisé
  243.                 },
  244.                 noResults: function() {
  245.                     return "Aucun résultat trouvé";
  246.                 },
  247.                 errorLoading: function () {
  248.                     return "Les résultats n'ont pas pu être chargés.";
  249.                 }
  250.             },
  251.         });
  252.         var isEnterKey = false;
  253.         var url_fiche_produit_select2 = "";
  254.         $('#dtc_article_recherche_top_select2').on('select2:open', function(e) {
  255.             // On récupère l'input de recherche interne du dropdown
  256.             let searchField = $('.select2-container--open .select2-search__field');
  257.             // On retire tout ancien handler keydown pour éviter les doublons
  258.             searchField.off('keydown').on('keydown', function(e) {
  259.                 if (e.key === "Enter" || e.keyCode === 13) {
  260.                     e.preventDefault(); // empêche la sélection par défaut
  261.                     isEnterKey = true;
  262.                     let userInput = $(this).val();
  263.                     if (url_fiche_produit_select2 === "") {
  264.                         var url = Routing.generate('dtc_article_liste', {mc: userInput});
  265.                         window.location.href = url;
  266.                         e.stopImmediatePropagation();
  267.                     }
  268.                     return false;
  269.                 }
  270.             });
  271.         });
  272.         $("#dtc_article_recherche_top_select2").on('change', function(e) {
  273.             if (isEnterKey) {
  274.             } else {
  275.                 var valeur = $(this).val();
  276.                 var selectedData = $(this).select2('data')[0]; // récupère le premier item sélectionné
  277.                 var slug = selectedData.slug;
  278.                 var url = Routing.generate('dtc_article_afficher', {id: valeur,slug:slug});
  279.                 url_fiche_produit_select2 = url;
  280.                 window.location.href = url;
  281.                 e.stopImmediatePropagation();
  282.                 return false;
  283.             }
  284.             isEnterKey = false;
  285.         });
  286.     });
  287. </script>
  288. <!-- top navigation -->
  289. <div class="top_nav">
  290.     <div class="nav_menu" style="margin-bottom:0px;">
  291.         <div class="nav toggle" style="">
  292.             {#
  293.             <div style="margin-top:15px;padding-left : 0px;padding-left:5px;" class="gauche" id="icon-kangaroo-mobile">
  294.                 <a href="/" style="padding:0px;"><i style="font-size:2em;" class="icon-kangaroo-silhouette"></i></a>
  295.             </div>
  296.             #}
  297.             <a style="color:white !important;" id="menu_toggle"><i class="fa fa-bars"></i></a>
  298.             <a id="loupe_search" class="visible_mobile" href="#" data-toggle="modal" data-target="#searchModal" class="ml-2 pl-0" style="padding-left:0px;">
  299.                 <i class="fa fa-search"></i>
  300.             </a>
  301.         </div>
  302.         <nav class="nav navbar-nav">
  303.             <div class="_off" id="bloc_select2_recheche_top" style="float:left;width:calc(100% - 350px);position:absolute;">
  304.                 <div id="dtc_article_recherche_top_select2_conteneur" style="padding-top:9px;">
  305.                     <select style="width:100%;" id="dtc_article_recherche_top_select2"></select>
  306.                 </div>
  307.             </div>
  308.             <ul style="padding-left:0px;" class=" navbar-right">
  309.                 <li class="nav-item dropdown open" style="padding-left: 15px;">
  310.                     {% if app.user.id is defined  %}
  311.                         <a href="javascript:;" class="user-profile dropdown-toggle" aria-haspopup="true" id="navbarDropdown" data-toggle="dropdown" aria-expanded="false">
  312.                             <img src="/images/avatar.png" alt="">
  313.                             <span style="white-space:nowrap;" class="masquer_mobile_absolute">{{ app.user.prenom }} {{ app.user.nom }}</span>
  314.                         </a>
  315.                     {% else %}
  316.                         <a href="/login" class="user-profile">
  317.                             <img src="/images/avatar.png" alt="">
  318.                             <span style="white-space:nowrap;" class="masquer_mobile_absolute">Se connecter</span>
  319.                         </a>
  320.                     {% endif %}
  321.                     <div class="dropdown-menu dropdown-usermenu pull-right" aria-labelledby="navbarDropdown">
  322.                         {% if app.user.id is defined  %}
  323.                         <a class="dropdown-item"  href="{{ path('dtc_utilisateur_profil') }}"><i style="color:#34495E;font-size:1.35em;" class="fa fa-user pull-right"></i>  {{ app.user.prenom }} {{ app.user.nom }}</a>
  324.                         {% endif %}
  325.                         <a class="dropdown-item"  href="{{ path('dtc_adresse_liste') }}"><i style="color:#34495E;font-size:1.35em;" class="fa fa-book pull-right"></i> Adresses</a>
  326.                         {# <a class="dropdown-item"  href="{{ path('dtc_remise_liste') }}"><i style="color:#34495E;font-size:1.35em;" class=" pull-right">%</i> Remises</a>#}
  327.                         <a class="dropdown-item"  href="{{ path('logout') }}"><i style="color:#34495E;font-size:1.35em;" class="fa fa-power-off pull-right"></i> Déconnexion</a>
  328.                         {#
  329.                         <a class="dropdown-item"  href="javascript:;">
  330.                             <span class="badge bg-red pull-right">50%</span>
  331.                             <span>Settings</span>
  332.                         </a>
  333.                         #}
  334.                     </div>
  335.                 </li>
  336.                 {% set panier = dtc_panier.getPanier() %}
  337.                 <li role="presentation" class="nav-item dropdown open">
  338.                     <a style="color:white !important;" href="javascript:;" class="dropdown-toggle info-number" id="navbarDropdown1" data-toggle="dropdown" aria-expanded="false">
  339.                         <i style="" class="fa fa-shopping-cart"></i>
  340.                         <span style="font-weight:bold;position:inherit;" id="panier-count" class="badge bg-red {% if panier.id is defined and panier.articleCommande|length > 0 %}bounce{% endif %}">{% if panier.id is defined and panier.articleCommande|length > 0 %}{{ panier.articleCommande|length }}{% else %}0{% endif %}</span>
  341.                     </a>
  342.                     <ul id="liste-top-panier" class="dropdown-menu list-unstyled msg_list" role="menu" aria-labelledby="navbarDropdown1">
  343.                         {% if panier.id is defined and panier.articleCommande|length > 0 %}
  344.                         {% for p in panier.articleCommande %}
  345.                         <li class="nav-item">
  346.                             {% set slug = dtc_article.getslugifArticle(p.article) %}
  347.                             <a class="dropdown-item" href="{{ path("dtc_article_afficher" , { 'id': p.article.id,'slug':slug }) }}">
  348.                                 <span class="image">
  349.                                     {% set images = dtc_image_article.getImageDefaut(p.article.id) %}
  350.                                     {% if images[0] is defined %}
  351.                                        {#  <img src="{{ asset(images[0].getUploadDir ~ '/' ~ p.article.id ~ '/' ~ images[0].url) | imagine_filter('400x300') }}" style="width:25%;">#}
  352.                                         <img src="{{ url_image_distant }}/image/800/600/{{ images[0].ulid }}" style="width:25%;">
  353.                                     {% else %}
  354.                                         <img src="{{ asset('images/defaut-img-product.jpg') }}" style="width:25%;">
  355.                                     {% endif %}
  356.                                  </span>
  357.                                 <div class="gauche">
  358.                                 <div>Référence : {{ p.reference }}</div>
  359.                                 <div class="message">Tarif :  {{ p.prixAvecRemise|price|raw }}&nbsp;&euro; HT</div>
  360.                                 <div class="message">Quantité : {{ p.quantite }}</div>
  361.                                 </div>
  362.                             </a>
  363.                         </li>
  364.                         {% endfor %}
  365.                         {% endif %}
  366.                         <li class="nav-item">
  367.                             <div class="text-center">
  368.                                 <a href="{{ path('dtc_panier_afficher') }}" class="btn btn-warning d-flex justify-content-center align-items-center" style="width:100%;">
  369.                                     <i class="fa fa-shopping-cart mr-2" style="font-size:0.9em;"></i>
  370.                                     Voir le panier
  371.                                 </a>
  372.                             </div>
  373.                         </li>
  374.                     </ul>
  375.                 </li>
  376.             </ul>
  377.         </nav>
  378.     </div>
  379.     {% set current_path = app.request.attributes.get('_route') %}
  380.     {% set tableau_fil = "" %}
  381.     {% set tableau_fil = "" %}
  382.     {% set objet = "" %}
  383.     {% if current_path == "dtc_article_liste" %}
  384.         {% set tableau_fil = "DTCArticlesBundle:Article" %}
  385.         {% set type_fil = "liste" %}
  386.     {% elseif current_path == "dtc_article_afficher" %}
  387.         {% set tableau_fil = "DTCArticlesBundle:Article" %}
  388.         {% set type_fil = article.libelle %}
  389.         {% set objet = article %}
  390.     {% endif %}
  391.     {% if tableau_fil != "" %}
  392.         {% include 'FO/FO/fil_ariane.html.twig' with( {'tableau':tableau_fil ,'type':type_fil,'objet':objet} )%}
  393.     {% endif %}
  394.     {% if societe.noteService != "" %}
  395.     <script>
  396.         (function(){
  397.             const track = document.getElementById('track');
  398.             const speedInput = document.getElementById('speed');
  399.             const applyBtn = document.getElementById('apply');
  400.             // s'assurer qu'on a au moins deux copies consécutives du contenu pour une boucle continue
  401.             function ensureDouble(){
  402.                 const children = Array.from(track.children);
  403.                 // si la piste n'a qu'une seule série, on la clone pour avoir une répétition
  404.                 if(children.length === 1){
  405.                     const clone = children[0].cloneNode(true);
  406.                     track.appendChild(clone);
  407.                 }
  408.             }
  409.             // calcule et applique la durée d'animation pour que la vitesse soit constante
  410.             function applySpeed(pxPerSecond){
  411.                 // largeur totale de la piste (les deux répétitions)
  412.                 // on utilise scrollWidth pour prendre en compte le contenu non visible
  413.                 const totalWidth = track.scrollWidth;
  414.                 // durée en secondes = (largeur à parcourir (en px) / vitesse en px/s)
  415.                 // la piste animée parcourt 50% de sa largeur (de 0 à -50%) avant de boucler
  416.                 // donc distance parcourue = totalWidth * 0.5
  417.                 const distancePx = totalWidth * 0.5;
  418.                 const durationSec = Math.max(1, distancePx / pxPerSecond); // minimum 1s
  419.                 // appliquer la durée via variable CSS
  420.                 track.style.setProperty('--duration', durationSec + 's');
  421.             }
  422.             // initialisation
  423.             ensureDouble();
  424.             // appliquer vitesse initiale tirée du champ
  425.             applySpeed(Number(speedInput.value) || 120);
  426.             // si la fenêtre est redimensionnée, recalculer la durée
  427.             let resizeTimer;
  428.             window.addEventListener('resize', ()=>{
  429.                 clearTimeout(resizeTimer);
  430.                 resizeTimer = setTimeout(()=> applySpeed(Number(speedInput.value) || 120), 120);
  431.             });
  432.             // accessible: permet de modifier le texte depuis Javascript si besoin
  433.             window.setMarqueeText = function(newText){
  434.                 // remplace le texte dans les items existants
  435.                 const items = track.querySelectorAll('.item');
  436.                 if(items.length === 0){
  437.                     const d = document.createElement('div'); d.className='item'; d.textContent=newText; track.appendChild(d);
  438.                 } else {
  439.                     items.forEach(it => it.textContent = newText);
  440.                 }
  441.                 // si on avait une seule série, s'assurer d'une répétition
  442.                 ensureDouble();
  443.                 // recalculer durée
  444.                 applySpeed(Number(speedInput.value) || 120);
  445.             };
  446.         })();
  447.     </script>
  448.     {% endif %}
  449. </div>
  450. <!-- /top navigation -->