1(function ($, Drupal, drupalSettings, once) { 2 3 'use strict'; 4 5 /** 6 * Fix aria LabelledBy sur le menu mobile uniquement 7 */ 8 Drupal.behaviors.dsLabelByMenuMobile = { 9 attach: function (context) { 10 const labelBy = document.querySelector('#header-navigation').getAttribute('aria-labelledby'); 11 12 function reportWindowSize() { 13 if (window.screen.width < 992) { 14 document.querySelector('#header-navigation').setAttribute('aria-labelledby', labelBy); 15 } else { 16 document.querySelector('#header-navigation').removeAttribute('aria-labelledby'); 17 } 18 } 19 20 window.onload = reportWindowSize; 21 window.onresize = reportWindowSize; 22 } 23 }; 24 25 /** 26 * ajoute title/aria-label "Retirer le fichier XXX" sur les boutons "Retirer". 27 */ 28 Drupal.behaviors.WebformRemoveButtonTitle = { 29 attach: function (context) { 30 $('input[type="submit"][data-drupal-selector$="-remove-button"]', context).each(function () { 31 const $btn = $(this); 32 const name = $btn.closest('.form-managed-file').find('.file a').text().trim(); 33 const label = name ? `Retirer le fichier ${name}` : 'Retirer le fichier'; 34 $btn.attr({ title: label }); 35 }); 36 } 37 }; 38 39 /** 40 * Suppression role contentinfo sur les messages d'erreurs 41 */ 42 Drupal.behaviors.dsRemoveContentinfo = { 43 attach: function (context) { 44 // Cibler uniquement les messages d'erreur avec role="contentinfo" 45 once('remove-role-contentinfo', '.messages.messages--error', context).forEach(function (el) { 46 if (el.getAttribute('role') === 'contentinfo') { 47 el.removeAttribute('role'); 48 } 49 }); 50 } 51 }; 52 53 /** 54 * Ajout de tabindex="-1" et focus sur le message de statut après envoi du formulaire. 55 */ 56 Drupal.behaviors.dsWebformFocus = { 57 attach: function (context) { 58 once('wf-a11y', '.messages--status, [data-drupal-messages]', context).forEach((msg) => { 59 msg.setAttribute('tabindex', '-1'); 60 requestAnimationFrame(() => { msg.focus() }); 61 }); 62 } 63 }; 64 65 /** 66 * Met le focus sur le bouton "Menu principal" quand la modale "Paramètres dâaffichage" se ferme. 67 */ 68 Drupal.behaviors.dsFocusBackToMenu = { 69 attach() { 70 const modal = document.getElementById('fr-theme-modal'); 71 if (!modal || modal.dataset.a11yInit) return; 72 modal.dataset.a11yInit = '1'; 73 74 const menuBtn = 75 document.querySelector('[data-fr-js-modal-button][aria-controls="header-navigation"]') || 76 document.querySelector('.fr-header__navbar .fr-btn--menu') || 77 document.querySelector('.fr-btn--menu'); 78 if (!menuBtn) return; 79 80 const focusMenu = () => setTimeout(() => menuBtn.focus({ preventScroll: true }), 50); 81 82 modal.addEventListener('click', (e) => { 83 if (e.target.closest('.fr-btn--close')) focusMenu(); 84 }); 85 86 modal.addEventListener('close', focusMenu); 87 modal.addEventListener('dsfr.modal.close', focusMenu); 88 document.addEventListener('keydown', (e) => { 89 if ((e.key === 'Escape') && modal.hasAttribute('open')) { 90 focusMenu(); 91 } 92 }, true); 93 } 94 }; 95 96})(jQuery, Drupal, drupalSettings, once);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.