feat(shop/events): Ajoute les pages boutique et événements, en construction.
```
This commit is contained in:
Serreau Jovann
2025-11-17 09:13:03 +01:00
parent 67a05e8213
commit 14dae09a2a
10 changed files with 309 additions and 235 deletions

View File

@@ -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();
}
});