Découvrez notre magazine 2026

logo herbelin

Herbelin

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
Catégories
Genre
Genre
Métal
Métal
Disponibilité
Disponibilité
Prix
Prix - slider
Prix - inputs

90

En stock

260

En stock

120

En stock

120

En stock

630

En stock

90

En stock

1 900

En stock

500

En stock

950

En stock

180

En stock

910

En stock

600

En stock

380

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