burger menu nav principal

This commit is contained in:
2025-10-03 14:04:22 +02:00
parent c4f12aab1d
commit d4c0650153
6 changed files with 396 additions and 11 deletions
+184 -7
View File
@@ -340,8 +340,9 @@ header[role=banner] .region-header #block-reha-logoministere img {
}
@media (max-width: 891px) {
header[role=banner] .region-header #block-reha-logoministere {
padding-left: 5%;
padding-left: 3%;
padding-top: 0%;
width: 80px;
}
}
header[role=banner] .region-header #block-reha-logoreha {
@@ -349,19 +350,29 @@ header[role=banner] .region-header #block-reha-logoreha {
height: 110px;
padding-left: 1rem;
}
header[role=banner] .region-header #block-reha-logoreha .field--name-field-logo {
height: 110px;
}
header[role=banner] .region-header #block-reha-logoreha .field--name-field-logo .field__item {
height: 110px;
@media (max-width: 891px) {
header[role=banner] .region-header #block-reha-logoreha {
height: fit-content;
padding-left: 0;
}
}
header[role=banner] .region-header #block-reha-logoreha .field--name-field-logo .field__item img {
max-height: 92px;
width: auto;
}
@media (max-width: 891px) {
header[role=banner] .region-header #block-reha-logoreha .field--name-field-logo .field__item img {
max-height: 60px;
}
}
header[role=banner] .region-header #block-reha-navigationprincipale {
grid-column: 3/span 6;
}
@media (max-width: 891px) {
header[role=banner] .region-header #block-reha-navigationprincipale {
padding-left: 1rem;
}
}
header[role=banner] .region-header #block-reha-navigationprincipale ul {
display: flex;
flex-direction: row;
@@ -369,7 +380,7 @@ header[role=banner] .region-header #block-reha-navigationprincipale ul {
}
@media (max-width: 1100px) {
header[role=banner] .region-header #block-reha-navigationprincipale ul {
flex-direction: column;
width: fit-content;
}
}
header[role=banner] .region-header #block-reha-navigationprincipale ul li.has-active {
@@ -1479,6 +1490,172 @@ aside.layout-sidebar-second footer.view-footer p {
padding-right: 0.5rem;
}
/* themes/custom/reha/assets/css/menu-burger-auto.css */
.rb-sr {
position: absolute !important;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
/* Bouton burger */
.rb-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
border: 1px solid #ddd;
background: #fff;
color: #111;
border-radius: 0.75rem;
padding: 0.6rem 0.8rem;
cursor: pointer;
}
/* Icône */
.rb-burger {
display: inline-flex;
flex-direction: column;
gap: 6px;
}
.rb-line {
width: 22px;
height: 2px;
background: currentColor;
display: block;
transition: transform 0.2s ease, opacity 0.2s ease;
}
/* Anim "X" */
.rb-toggle.is-active .rb-line:nth-child(1) {
transform: translateY(8px) rotate(45deg);
}
.rb-toggle.is-active .rb-line:nth-child(2) {
opacity: 0;
}
.rb-toggle.is-active .rb-line:nth-child(3) {
transform: translateY(-8px) rotate(-45deg);
}
/* Liste (mobile) */
#main-nav.rb-list {
list-style: none;
padding: 0;
margin: 0.75rem 0 0 0;
display: grid;
gap: 0.25rem;
}
#main-nav.rb-list a {
display: block;
padding: 0.75rem 1rem;
border-radius: 0.5rem;
text-decoration: none;
background: #fff;
color: #111;
}
#main-nav.rb-list a:focus-visible {
outline: 2px solid #5b9aff;
outline-offset: 2px;
}
/* Desktop / tablette */
@media (min-width: 768px) {
.rb-toggle {
display: none;
}
#main-nav.rb-list {
display: flex;
gap: 0.5rem;
margin-top: 0;
}
#main-nav.rb-list a {
background: transparent;
padding: 0.5rem 0.75rem;
}
#main-nav.rb-list a:hover {
text-decoration: underline;
}
}
/* Impression : menu toujours visible */
@media print {
.rb-toggle {
display: none !important;
}
#main-nav.rb-list {
display: block !important;
}
}
/* 1) Garantir que lattribut hidden cache bien l’élément,
même si un autre CSS met un display:... */
#main-nav[hidden] {
display: none !important;
}
/* 2) Fallback ultra simple : on cache le menu en mobile,
et on laffiche quand le bouton est actif.
(Le JS insère le bouton juste AVANT le <ul>, donc ladjacence fonctionne) */
@media (max-width: 767px) {
#main-nav.rb-list {
display: none !important;
}
.rb-toggle.is-active + #main-nav.rb-list {
display: grid !important;
}
}
/* --- Empêcher le menu d'impacter la mise en page du header (mobile) --- */
@media (max-width: 767.98px) {
/* Le conteneur nav sert d'ancre pour le positionnement absolu */
#block-reha-navigationprincipale {
position: relative;
overflow: visible; /* au cas où un parent a overflow:hidden */
/* optionnel : si le header a text-align:center et que tu veux
que le bouton reste à gauche, décommente la ligne suivante */
/* text-align: initial; */
}
/* Par défaut, menu masqué quand le bouton n'est pas actif */
#block-reha-navigationprincipale .rb-toggle + #main-nav.rb-list {
display: none !important;
}
/* Quand on ouvre: on montre le menu en position absolue, hors du flux */
#block-reha-navigationprincipale .rb-toggle.is-active + #main-nav.rb-list {
display: grid !important;
}
/* Sortir le UL du flux et de tout align center, en overlay sous la barre */
#block-reha-navigationprincipale #main-nav.rb-list {
position: absolute;
top: 100%; /* juste sous la barre de nav */
left: 0;
right: 0; /* pleine largeur du nav */
z-index: 1000;
text-align: left; /* ignore tout text-align:center parent */
margin: 0;
padding: 0.5rem;
background: #fff;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
}
#block-reha-navigationprincipale #main-nav.rb-list a {
display: block;
}
}
/* --- Desktop : on remet le menu dans le flux normal --- */
@media (min-width: 768px) {
#block-reha-navigationprincipale #main-nav.rb-list {
position: static;
box-shadow: none;
padding: 0;
}
}
/*pages*/
.home-page-layout-content {
width: 100%;
+84
View File
@@ -0,0 +1,84 @@
/* themes/custom/reha/assets/js/menu-burger-auto.js */
(function (Drupal) {
console.log("helloBurger");
Drupal.behaviors.rehaAutoBurger = {
attach: function (context) {
const root = context.querySelector('#block-reha-navigationprincipale');
if (!root) return;
const menu = root.querySelector('#main-nav');
if (!menu) return;
// Éviter le double-init
if (root.dataset.burgerInit === '1') return;
root.dataset.burgerInit = '1';
// Crée le bouton
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'rb-toggle';
btn.setAttribute('aria-expanded', 'false');
btn.setAttribute('aria-controls', 'main-nav');
btn.innerHTML = `
<span class="rb-sr">Ouvrir le menu</span>
<span aria-hidden="true" class="rb-burger">
<span class="rb-line"></span><span class="rb-line"></span><span class="rb-line"></span>
</span>
`;
// Insère le bouton avant la liste
menu.parentNode.insertBefore(btn, menu);
// Marque le menu comme repliable
menu.classList.add('rb-list');
// Masqué par défaut en mobile (le CSS gère desktop)
menu.hidden = true;
// Helpers
function openMenu() {
btn.setAttribute('aria-expanded', 'true');
btn.classList.add('is-active');
menu.hidden = false;
const first = menu.querySelector('a');
if (first) first.focus();
}
function closeMenu() {
btn.setAttribute('aria-expanded', 'false');
btn.classList.remove('is-active');
menu.hidden = true;
btn.focus();
}
function toggleMenu() {
(btn.getAttribute('aria-expanded') === 'true') ? closeMenu() : openMenu();
}
// Événements
btn.addEventListener('click', toggleMenu);
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && btn.getAttribute('aria-expanded') === 'true') closeMenu();
});
document.addEventListener('click', (e) => {
if (btn.getAttribute('aria-expanded') !== 'true') return;
if (!root.contains(e.target)) closeMenu();
});
// Responsif : desktop >= 768px => menu toujours visible
const mql = window.matchMedia('(min-width: 768px)');
function handleMQ(e) {
if (e.matches) {
// Desktop
menu.hidden = false;
btn.setAttribute('aria-expanded', 'false');
btn.classList.remove('is-active');
} else {
// Mobile
if (btn.getAttribute('aria-expanded') !== 'true') menu.hidden = true;
}
}
if (mql.addEventListener) mql.addEventListener('change', handleMQ);
else mql.addListener(handleMQ);
handleMQ(mql);
}
};
})(Drupal);