menu mobile
All checks were successful
Build & Deploy / Validation, build et push (push) Successful in 9m27s
All checks were successful
Build & Deploy / Validation, build et push (push) Successful in 9m27s
This commit is contained in:
parent
a302812e84
commit
7fb5a901ad
3 changed files with 128 additions and 11 deletions
16
app/assets/controllers/header-mobile_controller.js
Normal file
16
app/assets/controllers/header-mobile_controller.js
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { Controller } from '@hotwired/stimulus';
|
||||||
|
|
||||||
|
export default class extends Controller {
|
||||||
|
static targets = ['menu'];
|
||||||
|
|
||||||
|
toggle() {
|
||||||
|
this.menuTarget.classList.toggle('open');
|
||||||
|
this.element.querySelector('.hamburger').classList.toggle('open');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fermer le menu quand on clique sur un lien
|
||||||
|
close() {
|
||||||
|
this.menuTarget.classList.remove('open');
|
||||||
|
this.element.querySelector('.hamburger').classList.remove('open');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -348,11 +348,97 @@ header .header-dropdown .dropdown-link::after { display: none !important; }
|
||||||
border-color: rgba(255, 255, 255, 0.5);
|
border-color: rgba(255, 255, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── MOBILE ────────────────────────────────────────────────────── */
|
/* ── HAMBURGER (MOBILE) ────────────────────────────────────────── */
|
||||||
|
.hamburger {
|
||||||
|
display: none;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 5px;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0;
|
||||||
|
width: 28px;
|
||||||
|
height: 24px;
|
||||||
|
margin: 0 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hamburger span {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 2.5px;
|
||||||
|
background: var(--text-light);
|
||||||
|
border-radius: 2px;
|
||||||
|
transition: all var(--duration-normal) ease;
|
||||||
|
}
|
||||||
|
[data-theme="dark"] .hamburger span {
|
||||||
|
background: var(--text-dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animation : croix quand ouvert */
|
||||||
|
.hamburger.open span:nth-child(1) {
|
||||||
|
transform: rotate(45deg) translate(4px, 4px);
|
||||||
|
}
|
||||||
|
.hamburger.open span:nth-child(2) {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.hamburger.open span:nth-child(3) {
|
||||||
|
transform: rotate(-45deg) translate(7px, -7px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── MOBILE : transformer nav en panneau ────────────────────────── */
|
||||||
@media (max-width: 640px) {
|
@media (max-width: 640px) {
|
||||||
header nav { display: none !important; }
|
.hamburger {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
header nav {
|
||||||
|
position: fixed;
|
||||||
|
top: 72px;
|
||||||
|
left: -100%;
|
||||||
|
width: 100%;
|
||||||
|
height: calc(100vh - 72px);
|
||||||
|
background: rgba(255, 255, 255, 0.75);
|
||||||
|
backdrop-filter: blur(var(--blur-md));
|
||||||
|
-webkit-backdrop-filter: blur(var(--blur-md));
|
||||||
|
border-top: 1px solid var(--border-light);
|
||||||
|
|
||||||
|
flex-direction: column !important;
|
||||||
|
gap: 0.5rem !important;
|
||||||
|
padding: 2rem 1.5rem !important;
|
||||||
|
z-index: 99;
|
||||||
|
transition: left var(--duration-normal) ease;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
[data-theme="dark"] header nav {
|
||||||
|
background: rgba(12, 10, 18, 0.95);
|
||||||
|
border-top-color: var(--border-dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
header nav.open {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
header { padding: 0 1rem !important; }
|
header { padding: 0 1rem !important; }
|
||||||
.header-left { gap: 0; }
|
.header-left { gap: 0.5rem; }
|
||||||
|
|
||||||
|
/* Adapter les liens pour mobile */
|
||||||
|
header nav .nav-link {
|
||||||
|
padding: 0.75rem 1rem !important;
|
||||||
|
border-radius: 10px !important;
|
||||||
|
border: 1px solid var(--border-light) !important;
|
||||||
|
background: transparent !important;
|
||||||
|
font-size: 0.95rem !important;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
[data-theme="dark"] header nav .nav-link {
|
||||||
|
border-color: var(--border-dark) !important;
|
||||||
|
}
|
||||||
|
header nav .nav-link:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.05) !important;
|
||||||
|
}
|
||||||
|
[data-theme="dark"] header nav .nav-link:hover {
|
||||||
|
background: rgba(255, 255, 255, 0.07) !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── MESSAGE D'ERREUR DANS LE DROPDOWN ─────────────────────────── */
|
/* ── MESSAGE D'ERREUR DANS LE DROPDOWN ─────────────────────────── */
|
||||||
|
|
|
||||||
|
|
@ -5,35 +5,50 @@
|
||||||
|
|
||||||
{% set current_route = app.request.attributes.get('_route') %}
|
{% set current_route = app.request.attributes.get('_route') %}
|
||||||
|
|
||||||
<header>
|
<header data-controller="header-mobile">
|
||||||
|
|
||||||
{# ── Gauche : Logo + Navigation ───────────────────────────── #}
|
{# ── Gauche : Logo + Navigation ───────────────────────────── #}
|
||||||
<div class="header-left">
|
<div class="header-left">
|
||||||
|
<button class="hamburger" data-action="click->header-mobile#toggle" aria-label="Menu">
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
<a href="{{ path('app_accueil') }}" class="logo">
|
<a href="{{ path('app_accueil') }}" class="logo">
|
||||||
<img src="{{ asset('images/logo/logo-light.svg') }}" alt="Logo" class="logo-light">
|
<img src="{{ asset('images/logo/logo-light.svg') }}" alt="Logo" class="logo-light">
|
||||||
<img src="{{ asset('images/logo/logo-dark.svg') }}" alt="Logo" class="logo-dark">
|
<img src="{{ asset('images/logo/logo-dark.svg') }}" alt="Logo" class="logo-dark">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<nav>
|
<nav data-header-mobile-target="menu">
|
||||||
<a href="{{ path('app_accueil') }}"
|
<a href="{{ path('app_accueil') }}"
|
||||||
class="nav-link {{ current_route == 'app_accueil' ? 'active' }}">
|
class="nav-link {{ current_route == 'app_accueil' ? 'active' }}"
|
||||||
|
data-action="click->header-mobile#close"
|
||||||
|
>
|
||||||
Accueil
|
Accueil
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ path('app_modpack') }}"
|
<a href="{{ path('app_modpack') }}"
|
||||||
class="nav-link {{ current_route == 'app_modpack' ? 'active' }}">
|
class="nav-link {{ current_route == 'app_modpack' ? 'active' }}"
|
||||||
|
data-action="click->header-mobile#close"
|
||||||
|
>
|
||||||
Modpack
|
Modpack
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ path('app_accueil') }}"
|
<a href="{{ path('app_accueil') }}"
|
||||||
class="nav-link {{ current_route == 'app_home' ? 'active' }}">
|
class="nav-link {{ current_route == 'app_home' ? 'active' }}"
|
||||||
|
data-action="click->header-mobile#close"
|
||||||
|
>
|
||||||
Statistiques
|
Statistiques
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ path('app_accueil') }}"
|
<a href="{{ path('app_accueil') }}"
|
||||||
class="nav-link {{ current_route == 'app_home' ? 'active' }}">
|
class="nav-link {{ current_route == 'app_home' ? 'active' }}"
|
||||||
|
data-action="click->header-mobile#close"
|
||||||
|
>
|
||||||
Actualité
|
Actualité
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ path('app_maps') }}"
|
<a href="{{ path('app_maps') }}"
|
||||||
class="nav-link {{ current_route == 'app_maps' ? 'active' }}">
|
class="nav-link {{ current_route == 'app_maps' ? 'active' }}"
|
||||||
|
data-action="click->header-mobile#close"
|
||||||
|
>
|
||||||
Maps
|
Maps
|
||||||
</a>
|
</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue