```
✨ feat(shop/events): Ajoute les pages boutique et événements, en construction.
```
This commit is contained in:
126
assets/app.js
126
assets/app.js
@@ -1,27 +1,117 @@
|
||||
import './app.scss'
|
||||
import * as Turbo from "@hotwired/turbo"
|
||||
|
||||
/**
|
||||
* Fonction d'initialisation pour les composants qui DOIVENT être réinitialisés
|
||||
* après un chargement Turbo (comme les compteurs d'articles, les états initiaux).
|
||||
* Le menu mobile et le panier sont gérés par délégation d'événements.
|
||||
*/
|
||||
function initializeUI() {
|
||||
// --- 2. Gestion du Panier Latéral (Off-Canvas) ---
|
||||
// Les fonctions open/close ont besoin de l'accès direct aux éléments,
|
||||
// mais les listeners d'ouverture/fermeture seront gérés par délégation en bas.
|
||||
const cartSidebar = document.getElementById('cartSidebar');
|
||||
const cartBackdrop = document.getElementById('cartBackdrop');
|
||||
const closeCartButton = document.getElementById('closeCartButton');
|
||||
|
||||
// Mettez les fonctions ici pour qu'elles soient toujours définies si les éléments existent
|
||||
if (cartSidebar && cartBackdrop && closeCartButton) {
|
||||
// ... (Fonctions openCart et closeCart inchangées)
|
||||
function openCart() {
|
||||
document.body.style.overflow = 'hidden';
|
||||
cartBackdrop.classList.remove('hidden');
|
||||
cartSidebar.classList.remove('translate-x-full');
|
||||
cartSidebar.classList.add('translate-x-0');
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const button = document.querySelector('[aria-controls="mobile-menu"]');
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
if (typeof navigator.serviceWorker !== 'undefined') {
|
||||
navigator.serviceWorker.register('pwabuilder-sw.js')
|
||||
}
|
||||
// Assurez-vous que le menu est initialement caché
|
||||
if (menu) {
|
||||
menu.classList.add('hidden');
|
||||
function closeCart() {
|
||||
document.body.style.overflow = '';
|
||||
cartSidebar.classList.remove('translate-x-0');
|
||||
cartSidebar.classList.add('translate-x-full');
|
||||
setTimeout(() => {
|
||||
cartBackdrop.classList.add('hidden');
|
||||
}, 300);
|
||||
}
|
||||
|
||||
// Stocker les fonctions dans une variable globale accessible par l'écouteur du document
|
||||
window.openCart = openCart;
|
||||
window.closeCart = closeCart;
|
||||
}
|
||||
|
||||
if (button && menu) {
|
||||
button.addEventListener('click', function() {
|
||||
// Bascule la classe 'hidden' pour afficher/masquer le menu
|
||||
menu.classList.toggle('hidden');
|
||||
|
||||
// Bascule l'état ARIA pour l'accessibilité
|
||||
const isExpanded = this.getAttribute('aria-expanded') === 'true' || false;
|
||||
this.setAttribute('aria-expanded', !isExpanded);
|
||||
});
|
||||
// --- 3. Logique Panier Mock (Affichage du compteur) ---
|
||||
function updateCartDisplay(count) {
|
||||
// ... (Logique inchangée)
|
||||
const desktopCounter = document.getElementById('cartCountDesktop');
|
||||
const mobileCounter = document.getElementById('cartCountMobile');
|
||||
|
||||
if (desktopCounter) desktopCounter.textContent = count;
|
||||
if (mobileCounter) mobileCounter.textContent = count;
|
||||
}
|
||||
})
|
||||
|
||||
// Simuler un panier non-vide au chargement (Mettre 0 pour un panier vide réel)
|
||||
updateCartDisplay(0);
|
||||
}
|
||||
|
||||
// --- INITIALISATION DES COMPOSANTS APRÈS TURBO/CHARGEMENT ---
|
||||
document.addEventListener('DOMContentLoaded', initializeUI);
|
||||
document.addEventListener('turbo:load', initializeUI);
|
||||
|
||||
|
||||
// ====================================================================
|
||||
// --- DÉLÉGATION D'ÉVÉNEMENTS (Gestion des clics une seule fois) ---
|
||||
// ====================================================================
|
||||
|
||||
document.addEventListener('click', (event) => {
|
||||
const target = event.target;
|
||||
|
||||
// 1. GESTION DU MENU MOBILE (Burger)
|
||||
const mobileMenuButton = document.getElementById('mobileMenuButton');
|
||||
const mobileMenu = document.getElementById('mobile-menu');
|
||||
|
||||
// On vérifie si la cible cliquée est le bouton ou un de ses enfants
|
||||
if (mobileMenuButton && mobileMenu && (target === mobileMenuButton || mobileMenuButton.contains(target))) {
|
||||
event.preventDefault(); // Empêche l'action par défaut du bouton
|
||||
const isExpanded = mobileMenuButton.getAttribute('aria-expanded') === 'true';
|
||||
mobileMenuButton.setAttribute('aria-expanded', !isExpanded);
|
||||
mobileMenu.classList.toggle('hidden');
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. GESTION DE L'OUVERTURE ET FERMETURE DU PANIER
|
||||
const openCartDesktop = document.getElementById('openCartDesktop');
|
||||
const openCartMobile = document.getElementById('openCartMobile');
|
||||
const closeCartButton = document.getElementById('closeCartButton');
|
||||
const cartBackdrop = document.getElementById('cartBackdrop');
|
||||
|
||||
// Ouverture (Desktop ou Mobile)
|
||||
if (window.openCart && (
|
||||
(openCartDesktop && (target === openCartDesktop || openCartDesktop.contains(target))) ||
|
||||
(openCartMobile && (target === openCartMobile || openCartMobile.contains(target)))
|
||||
)) {
|
||||
event.preventDefault();
|
||||
window.openCart();
|
||||
return;
|
||||
}
|
||||
|
||||
// Fermeture (Bouton interne)
|
||||
if (window.closeCart && closeCartButton && (target === closeCartButton || closeCartButton.contains(target))) {
|
||||
event.preventDefault();
|
||||
window.closeCart();
|
||||
return;
|
||||
}
|
||||
|
||||
// Fermeture (Cliquer sur le fond/backdrop)
|
||||
if (window.closeCart && target === cartBackdrop) {
|
||||
window.closeCart();
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
// --- GESTION GLOBALE DE LA TOUCHE ESC (Une seule fois) ---
|
||||
document.addEventListener('keydown', (event) => {
|
||||
const cartSidebar = document.getElementById('cartSidebar');
|
||||
if (cartSidebar && window.closeCart && event.key === 'Escape' && !cartSidebar.classList.contains('translate-x-full')) {
|
||||
window.closeCart();
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user