Découvrez notre magazine 2026

Chaînes

document.addEventListener('DOMContentLoaded', function() { makeCollapsible(); // Gestion des popups Elementor (lorsqu'elles s'ouvrent) jQuery(document).on('elementor/popup/show', function(event, id, instance) { if (id) { makeCollapsible(); } }); // Nettoyage des filtres vides et inutiles cleanFilters(); }); // Écouteur d'événement alternatif pour les popups Elementor window.addEventListener('elementor/popup/show', function(event, id, instance) { if (id) { makeCollapsible(); } }); /** * Fonction pour rendre les filtres pliables/dépliables */ function makeCollapsible() { jQuery(function($) { // Pour les checkboxes - masque les listes de cases à cocher non-appliquées avec animation $('.jet-checkboxes-list:not(.collapsible-applied)').slice(0).slideUp( 500, function() { $(this).addClass('collapsible-applied'); } ); // Pour le filtre range - masque les curseurs de plage non-appliqués avec animation $('.jet-range:not(.collapsible-applied)').slice(0).slideUp( 500, function() { $(this).addClass('collapsible-applied'); } ); // Gestionnaire de clic sur les labels de filtre $('.jet-filter-label').off('click').on('click', function(e) { e.stopPropagation(); // Empêche la propagation de l'événement var $clickedLabel = $(this); var $nextElement = $clickedLabel.next(); // Ferme tous les autres filtres ouverts $('.jet-filter-label').not($clickedLabel).each(function() { var $otherLabel = $(this); var $otherContent = $otherLabel.next(); if ($otherContent.is(':visible')) { $otherContent.slideUp(); $otherLabel.removeClass('noicon'); } }); // Bascule l'état du filtre cliqué (ouvert/fermé) $nextElement.slideToggle(); $clickedLabel.toggleClass('noicon'); }); // Ferme les filtres lorsqu'on clique en dehors $(document).on('click', function(e) { if (!$(e.target).closest('.jet-filter').length) { $('.jet-checkboxes-list:visible, .jet-range:visible').slideUp(); $('.jet-filter-label.noicon').removeClass('noicon'); } }); }); } /** * Fonction pour supprimer les filtres vides et inutiles * Utilise jQuery pour s'assurer de la compatibilité et de la précision */ function cleanFilters() { jQuery(function($) { // Logs pour le débogage console.log('Début du nettoyage des filtres'); // Traiter chaque filtre dans le groupe de filtres $('.jet-filters-group .jet-filter').each(function() { var $filter = $(this); var $label = $filter.find('.jet-filter-label'); var filterName = $label.text().trim(); // Cas 1: Filtre qui n'a qu'un label (sans contenu) if ($filter.children().length === 1 && $filter.children().first().hasClass('jet-filter-label')) { console.log('Suppression du filtre vide:', filterName); $filter.remove(); return; // Passe au filtre suivant } // Cas 2: Filtres avec une seule option ou options déjà sélectionnées sans alternatives var $visibleRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide)'); var $checkedInputs = $filter.find('.jet-checkboxes-list__input:checked'); var $uncheckableRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide):not(:has(.jet-checkboxes-list__input:checked))'); // Si nous avons exactement une option cochée et aucune autre option visible non cochée if ($checkedInputs.length === 1 && $uncheckableRows.length === 0) { console.log('Suppression du filtre avec une seule option cochée:', filterName); $filter.remove(); return; } // Si nous avons exactement une option visible au total if ($visibleRows.length === 1) { console.log('Suppression du filtre avec une seule option visible:', filterName); $filter.remove(); return; } }); console.log('Fin du nettoyage des filtres'); }); // Observer les changements dans le DOM pour détecter de nouveaux filtres setupMutationObserver(); } /** * Configure un observateur de mutations pour détecter les nouveaux filtres * ajoutés au DOM après le chargement initial */ function setupMutationObserver() { jQuery(function($) { // Fonction pour nettoyer à nouveau les filtres const reCheckFilters = function() { $('.jet-filters-group .jet-filter').each(function() { var $filter = $(this); // Cas 1: Filtre qui n'a qu'un label (sans contenu) if ($filter.children().length === 1 && $filter.children().first().hasClass('jet-filter-label')) { $filter.remove(); return; } // Cas 2: Filtres avec une seule option ou options déjà sélectionnées sans alternatives var $visibleRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide)'); var $checkedInputs = $filter.find('.jet-checkboxes-list__input:checked'); var $uncheckableRows = $filter.find('.jet-checkboxes-list__row:not(.jet-filter-row-hide):not(:has(.jet-checkboxes-list__input:checked))'); // Si nous avons exactement une option cochée et aucune autre option visible non cochée if ($checkedInputs.length === 1 && $uncheckableRows.length === 0) { $filter.remove(); return; } // Si nous avons exactement une option visible au total if ($visibleRows.length === 1) { $filter.remove(); return; } }); }; // Créer un observateur MutationObserver if (window.MutationObserver) { const observer = new MutationObserver(function(mutations) { let shouldRecheckFilters = false; mutations.forEach(function(mutation) { if (mutation.addedNodes.length > 0) { for (let i = 0; i < mutation.addedNodes.length; i++) { const node = mutation.addedNodes[i]; if (node.nodeType === 1 && ( (node.classList && (node.classList.contains('jet-filter') || node.classList.contains('jet-filters-group'))) || $(node).find('.jet-filter, .jet-filters-group').length )) { shouldRecheckFilters = true; break; } } } }); if (shouldRecheckFilters) { // Attendre un court instant pour que tous les filtres soient correctement rendus setTimeout(reCheckFilters, 150); } }); // Configurer l'observer observer.observe(document.body, { childList: true, subtree: true }); } }); }
Filtrer par
Catégories
Genre
Genre
Métal
Métal
Disponibilité
Disponibilité
Prix
Prix - slider
Prix - inputs

320

En stock

430

En stock

260

En stock

420

En stock

990

En stock

880

En stock

1 590

En stock

720

En stock

195

En stock

670

En stock

460

En stock

1 890

En stock

2 190

En stock

1 600

En stock

750

En stock

750

En stock

Paiement sécurisé

Vos paiements sont effectués en toute sécurité, pour une expérience d’achat simple et sereine.

Satisfait ou remboursé

Parce que votre satisfaction nous tient à cœur, vous disposez de 14 jours pour retourner votre commande en toute simplicité.

Authenticité garantie

Chaque création est soigneusement sélectionnée pour son authenticité, son origine et la qualité de son savoir-faire.

Expédition sous 72h

Vos commandes sont préparées avec soin et expédiées sous 72h.

Rechercher