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