<!doctype html>
<html lang="fr">
<head >
<meta charset="utf-8"/>
<meta name="title" content="WURTH MODYF - Vêtements de travail professionnels & chaussures de sécurité"/>
<meta name="description" content="WURTH MODYF - Vêtements de travail professionnels & chaussures de sécurité"/>
<meta name="robots" content="INDEX,FOLLOW"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<title>WURTH MODYF - Vêtements de travail professionnels & chaussures de sécurité</title>
<link rel="stylesheet" type="text/css" media="all" href="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Netreviews_Avisverifies/css/netreviews.min.css" />
<link rel="stylesheet" type="text/css" media="all" href="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Netreviews_Avisverifies/css/netreviews_category.min.css" />
<link rel="stylesheet" type="text/css" media="all" href="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/css/styles.min.css" />
<link rel="stylesheet" type="text/css" media="all" href="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/GetResponse_GetResponseIntegration/css/getresponse-styles.min.css" />
<link rel="stylesheet" type="text/css" media="all" href="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/StripeIntegration_Payments/css/wallets.min.css" />
<link rel="stylesheet" type="text/css" media="all" href="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Vipps_Payment/css/vipps_styles.min.css" />
<link rel="stylesheet" type="text/css" media="all" href="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Bss_HyvaCompatBase/css/splide/splide.min.css" />
<script type="text/javascript" src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Smile_ElasticsuiteTracker/js/tracking.min.js"></script>
<script type="text/javascript" src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Modyf_Theme/js/nice-select2.min.js"></script>
<script type="text/javascript" src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Modyf_Theme/js/global-variables.min.js"></script>
<script type="text/javascript" src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Bss_HyvaCompatBase/js/splidejs/splide.min.js"></script>
<script type="text/javascript" defer="defer" src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Hyva_MagentoDataServices/js/storefront-event-collector.min.js"></script>
<script type="text/javascript" defer="defer" src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Hyva_MagentoDataServices/js/storefront-events-sdk.min.js"></script>
<script type="text/javascript" defer="defer" src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Hyva_MagentoProductRecommendations/js/recs-sdk.min.js"></script>
<link rel="canonical" href="https://www.modyf.fr/" />
<link rel="icon" type="image/x-icon" href="https://www.modyf.fr/media/favicon/stores/1/favicon.png" />
<link rel="shortcut icon" type="image/x-icon" href="https://www.modyf.fr/media/favicon/stores/1/favicon.png" />
<meta name="p:domain_verify" content="5437b0a85d5dd597cb30735c1a25c45a" />
<link rel="manifest" href="/documents/manifest.webmanifest" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="preconnect" href="https://tracking.modyf.fr" />
<!-- Google Tag Manager -->
<script>
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
"gtm.start": new Date().getTime(),
event: "gtm.js",
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != "dataLayer" ? "&l=" + l : "";
j.async = true;
j.src =
"https://tracking.modyf.fr/ix6iyyygj722mrv.js?aw=" +
i.replace(/^GTM-/, "") +
dl;
f.parentNode.insertBefore(j, f);
})(window, document, "script", "dataLayer", "GTM-P9L9DSH");
</script>
<!-- End Google Tag Manager -->
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "WebSite",
"url": "https://www.modyf.fr",
"potentialAction": {
"@type": "SearchAction",
"target": "https://www.modyf.fr/catalogsearch/result/?q={search_term}",
"query-input": "required name=search_term"
}
}
</script>
<!-- GR analytics --
<script>
(function (m, o, n, t, e, r, _) {
m["__GetResponseAnalyticsObject"] = e;
m[e] =
m[e] ||
function () {
(m[e].q = m[e].q || []).push(arguments);
};
r = o.createElement(n);
_ = o.getElementsByTagName(n)[0];
r.async = 1;
r.src = t;
r.setAttribute("crossorigin", "use-credentials");
_.parentNode.insertBefore(r, _);
})(
window,
document,
"script",
"https://news.modyf.com/script/cc5fde29-9ba3-4b5e-b606-19fd17516953/ga.js",
"GrTracking",
);
</script-->
<!-- Recostream (reco.js) -->
<script
async
src="https://recostream.com/recojs?id=RS-00513-103939463"
></script>
<style>
#html-body #botmind-iframe {
z-index: 99;
}
nav[x-ref="nav-desktop"] ul > li {
margin-bottom: 0;
}
.page-layout-hierarchy-cms-page .columns .cms-menu {
margin-top: -67px;
}
.page-with-filter
.filter-option
.filter-options-content
.shoe_sizeFilter
.items {
grid-template-columns: repeat(5, 1fr);
margin-bottom: 20px;
display: grid;
flex-wrap: wrap;
justify-content: flex-start;
margin-top: 15px;
gap: 3%;
}
.page-with-filter
.filter-option
.filter-options-content
.shoe_sizeFilter
.items
.item {
margin: 0;
height: auto;
width: auto;
aspect-ratio: 1 / 1;
}
.page-with-filter .sidebar .sizeFilter .items .item .label .seo-url {
padding: 1px;
line-height: 1;
}
@media (max-width: 1049px) {
.catalog-product-view header .header.content {
z-index: 10;
}
.catalog-product-view #botmind-iframe {
z-index: 2;
}
}
</style>
<!--script>
window.ftldataLayer = window.ftldataLayer || [];
window.ftltag = window.ftltag || function() {
ftldataLayer.push(arguments);
};
ftltag('config', {clientId: '589', shopCountry: 'FR'});
</script>
<script async type="module" src="https://recommender.fitle.com/ftltag.js"></script-->
<style>
.product-options-bottom #scalapay-widget {
order: 3;
}
</style>
<script>
window.addEventListener(
"init-external-scripts",
() => {
//Fitle
window.ftldataLayer = window.ftldataLayer || [];
window.ftltag =
window.ftltag ||
function () {
ftldataLayer.push(arguments);
};
ftltag("config", { clientId: "589", shopCountry: "FR" });
const ftltagscript = document.createElement("script");
ftltagscript.src = "https://recommender.fitle.com/ftltag.js";
ftltagscript.async = true;
ftltagscript.type = "module";
document.head.append(ftltagscript);
//Recostream (reco.js)
/*const Recostreamscript = document.createElement('script')
Recostreamscript.src = 'https://recostream.com/recojs?id=RS-00513-103939463';
Recostreamscript.async = true;
document.head.append(Recostreamscript);*/
//accessiway
const url = window.location.href; // Récupère l'URL actuelle
if (!url.includes("quel-pantalon-choisir")) {
(function () {
var s = document.createElement("script"),
e = !document.body ? document.querySelector("head") : document.body;
s.src = "https://eu.acsbapp.com/apps/app/dist/js/app.js";
s.defer = true;
s.onload = function () {
acsbJS.init({
statementLink: "#",
footerHtml:
'<a href="https://www.accessiway.fr/" target="_blank">AccessiWay. The Web Accessibility Solution</a>',
hideMobile: false,
hideTrigger: false,
language: "fr",
position: "left",
leadColor: "#818a8f",
triggerColor: "#cc0000",
triggerRadius: "50%",
triggerPositionX: "left",
triggerPositionY: "bottom",
triggerIcon: "people",
triggerSize: "medium",
triggerOffsetX: 20,
triggerOffsetY: 20,
mobile: {
triggerSize: "medium",
triggerPositionX: "right",
triggerPositionY: "bottom",
triggerOffsetX: 0,
triggerOffsetY: 10,
triggerRadius: "50% 0% 0% 50%",
},
});
};
e.appendChild(s);
})();
}
},
{ once: true, passive: true },
);
</script>
<style>
@media screen and (max-width: 768px) {
.checkout-cart-index .top-cart-summary {
min-height: 260px;
}
.w-full.order-3 {
display: none;
}
.checkout-cart-index .cart-summary {
min-height: 700px;
}
}
</style>
<script>
if (
window.location.href.indexOf("checkout/cart/index/") != -1 &&
window.innerWidth < 768
) {
document.addEventListener("DOMContentLoaded", (event) => {
document.querySelector(".w-full.order-3").style.display = "block";
});
}
</script>
<link rel="alternate" hreflang="fr" href="https://www.modyf.fr/" /> <link rel="alternate" hreflang="de-at" href="https://www.modyf.at/" /> <link rel="alternate" hreflang="nl-be" href="https://www.modyf.be/nl/" /> <link rel="alternate" hreflang="fr-be" href="https://www.modyf.be/fr/" /> <link rel="alternate" hreflang="de" href="https://www.modyf.de/" /> <link rel="alternate" hreflang="de-it" href="https://www.modyf.it/de/" /> <link rel="alternate" hreflang="it" href="https://www.modyf.it/" /> <link rel="alternate" hreflang="nl" href="https://www.modyf.nl/" /> <link rel="alternate" hreflang="es" href="https://www.modyf.es/" /> <link rel="alternate" hreflang="no" href="https://www.modyf.no/" /> <link rel="alternate" hreflang="pt" href="https://www.modyf.pt/" />
<!-- GetResponse Analytics -->
<script type="text/javascript">
(function(m, o, n, t, e, r, _){
m['__GetResponseAnalyticsObject'] = e;m[e] = m[e] || function() {(m[e].q = m[e].q || []).push(arguments)};
r = o.createElement(n);_ = o.getElementsByTagName(n)[0];r.async = 1;r.src = t;r.setAttribute('crossorigin', 'use-credentials');_.parentNode .insertBefore(r, _);
})(window, document, 'script', 'https://news.modyf.com/script/576ddcbd-dabf-46e0-8022-774494e0c62a/ga.js', 'GrTracking');
</script>
<!-- End GetResponse Analytics -->
<script>
'use strict';
function initGetresponseTrackingCode() {
return {
getResponseTrackingCode: false,
initResponseTrackingCode() {
window.addEventListener('load', function() {
let trackingCodeEnabled = typeof gaSetUserId !== 'undefined' && typeof gaSetUserId === 'function';
if (!trackingCodeEnabled) {
return;
}
if (typeof GrViewCategoryItem !== 'undefined') {
GrTracking('importScript', 'ec');
GrTracking('viewCategory', GrViewCategoryItem);
}
if (typeof GrViewProductItem !== 'undefined') {
GrTracking('importScript', 'ec');
GrTracking('viewItem', GrViewProductItem);
}
if (typeof GrOrderPlaced !== 'undefined') {
GrTracking('importScript', 'ec');
GrTracking('orderPlaced', GrOrderPlaced);
}
});
},
responseTrackingCode() {
let trackingCodeEnabled = typeof gaSetUserId !== 'undefined' && typeof gaSetUserId === 'function',
cartData = document.getElementById('tracking-code-cart').getAttribute('cart');
if (cartData) {
cartData = JSON.parse(cartData);
}
if (cartData !== null && Object.keys(cartData).length > 0 && trackingCodeEnabled) {
GrTracking('importScript', 'ec');
GrTracking('cartUpdate', cartData);
hyva.setCookie('mage-cache-sessid', '', -1, true);
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
}
let customerEmailNode = document.getElementById('customer-email-address'),
customerEmail = customerEmailNode.getAttribute('customer-email'),
gaIsValuable = hyva.getCookie('gaIsValuable');
trackingCodeEnabled = typeof gaSetUserId !== 'undefined' && typeof gaSetUserId === 'function';
if (customerEmail !== null && trackingCodeEnabled && gaIsValuable !== '1') {
gaSetUserId(customerEmail);
GrTracking('setUserId', customerEmail);
}
},
receiveResponseTrackingCode(data) {
if (data['getresponse-tracking-code']) {
this.getResponseTrackingCode = data['getresponse-tracking-code'];
}
}
}
}
</script>
<div class="getresponse-tracking-code-section"
x-data="initGetresponseTrackingCode()"
@private-content-loaded.window="receiveResponseTrackingCode($event.detail.data)"
x-init="initResponseTrackingCode(); $nextTick(() => responseTrackingCode())"
>
<div id="customer-email-address" x-bind:customer-email="getResponseTrackingCode.customerEmail"></div>
<div id="tracking-code-cart" x-bind:cart="getResponseTrackingCode.cart"></div>
</div><script>
'use strict';
function initGetresponseRecommendation() {
return {
responseRecommendation: false,
getResponseRecommendation() {
const recommendationNode = document.getElementById('getresponse-recommendation');
const getResponseShopId = recommendationNode.getAttribute('getresponse-shop-id');
const productIdAddedToWishList = recommendationNode.getAttribute('product-id-added-to-wishlist');
const productIdRemovedFromWishList = recommendationNode.getAttribute('product-id-removed-from-wishlist');
if (getResponseShopId === null) {
return false;
}
if (productIdAddedToWishList && !productIdRemovedFromWishList) {
const likeItemObject = {
shop: {id: getResponseShopId},
product: {id: productIdAddedToWishList}
};
GrTracking('importScript', 'ec');
GrTracking('likeItem', likeItemObject);
hyva.setCookie('mage-cache-sessid', '', -1, true);
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
}
if (productIdRemovedFromWishList && !productIdAddedToWishList) {
const unlikeItemObject = {
shop: {id: getResponseShopId},
product: {id: productIdRemovedFromWishList}
};
GrTracking('importScript', 'ec');
GrTracking('unlikeItem', unlikeItemObject);
hyva.setCookie('mage-cache-sessid', '', -1, true);
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
}
},
receiveResponseRecommendation(data) {
if (data['getresponse-recommendation']) {
this.responseRecommendation = data['getresponse-recommendation'];
}
}
}
}
</script>
<div class="getresponse-recommendation-section"
x-data="initGetresponseRecommendation()"
@private-content-loaded.window="receiveResponseRecommendation($event.detail.data)"
x-init="$nextTick(() => getResponseRecommendation())"
>
<div id="getresponse-recommendation"
x-bind:getresponse-shop-id="responseRecommendation && responseRecommendation.getResponseShopId"
x-bind:product-id-added-to-wishlist="responseRecommendation && responseRecommendation.productIdAddedToWishList"
x-bind:product-id-removed-from-wishlist="responseRecommendation && responseRecommendation.productIdRemovedFromWishList"
></div>
</div> <script data-rocketjavascript="false"> var MagefanWebP = { _canUseWebP: null, getUserAgentInfo: function(){ try { var ua = navigator.userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; if (/trident/i.test(M[1])) { tem = /\brv[ :]+(\d+)/g.exec(ua) || []; return ['IE', (tem[1] || '')]; } if (M[1] === 'Chrome') { tem = ua.match(/\b(OPR|Edge)\/(\d+)/); if (tem != null) { tem = tem.slice(1); tem[0] = tem[0].replace('OPR', 'Opera'); return tem; } } M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']; if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]); return M; } catch (e) { return ['', 0]; } }, canUseWebP: function(){ if (null !== this._canUseWebP){ return this._canUseWebP; } try { var elem = document.createElement('canvas'); if (!!(elem.getContext && elem.getContext('2d'))) { var r = (elem.toDataURL('image/webp').indexOf('data:image/webp') == 0); if (!r) { var ua = this.getUserAgentInfo(); if (ua && ua.length > 1) { ua[0] = ua[0].toLowerCase(); if ('firefox' == ua[0] && parseInt(ua[1]) >= 65) { this._canUseWebP = true; return this._canUseWebP; } if ('edge' == ua[0] && parseInt(ua[1]) >= 18) { this._canUseWebP = true; return this._canUseWebP; } if ('safari' == ua[0]) { if (navigator.platform.includes('Mac')) { if (parseInt(ua[1]) >= 16) { this._canUseWebP = true; } } else { if (parseInt(ua[1]) >= 15) { this._canUseWebP = true; } } return this._canUseWebP; } } } this._canUseWebP = r; return this._canUseWebP; } this._canUseWebP = false; return this._canUseWebP; } catch (e) { console.log(e); this._canUseWebP = false; return this._canUseWebP; } }, getOriginWebPImage: function(src) { if (src.indexOf('mf_webp') == -1) { return src; } var array = src.split('/'); var imageFormat = ''; for (var i = 0; i < array.length; i++) { if (array[i] == 'mf_webp') { imageFormat = array[i + 1]; array.splice(i, 3); break; } } src = array.join('/'); return src.replace('.webp', '.' + imageFormat); }, getWebUrl: function (imageUrl) { /* @var string */ imageUrl = imageUrl.trim(); var baseUrl = 'https://www.modyf.fr/'; var imageFormat = imageUrl.split('.').pop(); if ('webp' === imageFormat) { return imageUrl; } var mediaBaseUrl = 'https://www.modyf.fr/media/'; var staticBaseUrl = 'https://www.modyf.fr/static/'; if (imageUrl.indexOf(mediaBaseUrl) == -1 && imageUrl.indexOf(staticBaseUrl) == -1) { mediaBaseUrl = baseUrl + 'media/'; staticBaseUrl = baseUrl + 'static/'; if (imageUrl.indexOf(mediaBaseUrl) == -1 && imageUrl.indexOf(staticBaseUrl) == -1) { return false; } } var imagePath = imageUrl; imagePath = imagePath.replace(mediaBaseUrl, 'media/'); imagePath = imagePath.replace(staticBaseUrl, 'static/'); imagePath = imagePath.replace(baseUrl + 'pub/media/', 'media/'); imagePath = imagePath.replace(baseUrl + 'pub/static/', 'static/'); imagePath = imagePath.replace(/\.(jpe?g|png|gif)$/i, '.webp'); imagePath = mediaBaseUrl + 'mf_webp/' + imageFormat + '/' + imagePath; imagePath = imagePath.replace('%20', ' '); imagePath = imagePath.replace(/version\d{10}\//g, ''); return imagePath; } }; /* MagicToolboxContainer Fix */ function MagefanWebPMagicToolboxContainerFix() { if (!MagefanWebP.canUseWebP()) { (function(){ var i; var els = document.querySelectorAll('.MagicToolboxContainer a, .MagicToolboxContainer img'); if (!els) return; var el; for (i=0; i<els.length; i++) { el = els[i]; if (el.href) { el.href = MagefanWebP.getOriginWebPImage(el.href); } if (el.getAttribute('webpimg')) { el.src = MagefanWebP.getOriginWebPImage(el.getAttribute('webpimg')); } else { if (el.src) { el.src = MagefanWebP.getOriginWebPImage(el.src); } } if (el.dataset && el.dataset.image) { el.dataset.image = MagefanWebP.getOriginWebPImage(el.dataset.image); } } })(); } else { replacePixelMagicToolbox(); checkIfPixelReplaced(); } } function replacePixelMagicToolbox() { (function() { var i, els = document.querySelectorAll('.MagicToolboxContainer img'); if (!els) return; var el; for (i=0; i<els.length; i++) { el = els[i]; if (el.getAttribute('webpimg')) { el.src = el.getAttribute('webpimg'); } } })(); } function checkIfPixelReplaced() { var intervalCounter = 0, waitForMagicToolbox = setInterval(function() { if (document.querySelectorAll('figure img[src$="/p.jpg"]').length) { replacePixelMagicToolbox(); clearInterval(waitForMagicToolbox); } if (intervalCounter > 10) { clearInterval(waitForMagicToolbox); } intervalCounter++; }, 500); } function updateBodyClassAndFallbackToOriginalImagesIfNoWebPSupport() { if (!MagefanWebP.canUseWebP()) { document.body.className += ' no-webp '; (function(){ var i; var els = document.querySelectorAll('a[href$=".webp"]'); if (!els) return; var el; for (i=0; i<els.length; i++) { el = els[i]; if (el.href) { el.href = MagefanWebP.getOriginWebPImage(el.href); } } })(); } else { document.body.className += ' webp-supported '; } } document.addEventListener('DOMContentLoaded', updateBodyClassAndFallbackToOriginalImagesIfNoWebPSupport); document.addEventListener('breeze:load', updateBodyClassAndFallbackToOriginalImagesIfNoWebPSupport); </script> <script> document.addEventListener('DOMContentLoaded', function(e){ if (!MagefanWebP.canUseWebP()) { /* Replace some custom webp images with original one if webp is not supported */ /* Can add <a> tag in future as well */ setInterval(function(){ document.querySelectorAll("img[src$='.webp']:not(.no-origin-webp-img)").forEach(function(el){ var scr = el.getAttribute('src'); var newScr = MagefanWebP.getOriginWebPImage(scr); if (scr != newScr) { el.setAttribute('src', newScr); } else { el.classList.add('no-origin-webp-img'); } }); }, 1000); } function processLazyPictureImg(img) { var src = img.getAttribute('src'); var keys = ['original', 'src', 'lazyload']; var original, _original; for (var i=0;i<keys.length;i++) { _original = img.getAttribute('data-' + keys[i]); if (_original) { original = _original; break; } } if (original == src) { if (img.getAttribute('data-mf-lazy-picture-img')) return; img.setAttribute('data-mf-lazy-picture-img', 1); img.parentElement.querySelectorAll('source').forEach(function(el){ var srcset = el.getAttribute('srcset'); var originalset = el.getAttribute('data-originalset'); if (originalset && (originalset != srcset)) { el.setAttribute('srcset', originalset); el.classList.remove('lazyload'); } }); var lazyLoader = img.closest('.lazy-loader'); if (lazyLoader) { lazyLoader.classList.remove('lazy-loader'); } document.querySelectorAll("picture img[src='"+src+"']").forEach(function(img){ processLazyPictureImg(img); }); } } document.querySelectorAll('picture img[data-original],picture img[data-src],picture img[data-lazyload]').forEach(function(el){ el.addEventListener('load', function(e){ processLazyPictureImg(e.target); }); processLazyPictureImg(el); }); }); </script> <style> picture.mfwebp source.lazyload, picture.mfwebp source.lazy {background:none;content:none;}</style> <script>
var STORE_TRANSLATIONS = {"Incl. Tax":"TTC (frais de port inclus)"," (free ":" (gratuit ","For example:":"Par exemple:","Sie sind nur noch":"Vous n'\u00eates qu'\u00e0","Item details":"D\u00e9tails de l'article ","Create your account in 1 minute to order and benefit from all your exclusive advantages.":"Cr\u00e9ez votre compte en 1 minute pour commander et b\u00e9n\u00e9ficier de tous vos avantages exclusifs","Enter SKU:quantity per row":"Entrez le SKU\u00a0: quantit\u00e9 par ligne","Best Selling articles":"Meilleures ventes ","Private":"Particulier","Validate and choose the delivery method":"Valider et choisir le mode de livraison","Do you have a promo code?":"Avez-vous un code avantage ?","If you have any further questions, please contact us on %1.":"Si vous avez d'autre questions, merci de nous contacter au 03 88 98 83 80.","Filled Lines Number":"Nombre de lignes remplies ","Load more products":"Afficher les articles suivants ","Fast order":"Commande rapide ","I register":"Je m'inscris","Please, visit <a href=\"%store_url\">%store_name<\/a> to proceed with the payment.":"Pour d\u00e9clencher l\u2019exp\u00e9dition de vos articles, merci de bien vouloir nous faire parvenir votre ch\u00e8que ou virement dans les meilleurs d\u00e9lais. Vous retrouverez toutes les informations de paiement dans l'email de confirmation de votre commande.","With VAT":"TTC","Log in":"Se connecter ","Read More":"En savoir plus ","(with VAT):":"(avec TVA) : ","We only have ":"Il n'y a seulement que","Excl. Tax":"HT (frais de ports inclus)","The remaining quantities will be available from ":"Les quantit\u00e9s restantes seront disponibles \u00e0 partir du ","Sorting:":"Trier par : ","W\u00fcrth MODYF France does not offer services or deliveries for this area. If you are interested in our products, you can contact W\u00fcrth Caraibes":"W\u00fcrth MODYF France ne propose pas de prestations ni de livraisons pour cette zone. Si vous \u00eates int\u00e9ress\u00e9 par nos produits, vous pouvez contacter W\u00fcrth Cara\u00efbes","Search product name, SKU or Display number":"Mot-cl\u00e9, article, r\u00e9f catalogue... ","at least %1 characters":"au minimum 10 caract\u00e8res","Use as address shipping":"Utiliser comme adresse de livraison","Discover more products":"D\u00e9couvrir plus de produits ","For more information, you can contact your Customer Service on 03 88 98 83 80.":"Cependant vous pouvez tout de m\u00eame passer commande. Vous serez livr\u00e9 apr\u00e8s cette date. Pour plus d'informations, vous pouvez contacter votre service clients au 03 88 98 83 80.","My adresses":"Mes adresses","Categories":"Cat\u00e9gories "," items in stock, please change the quantity to ":"article(s) en stock. Merci de changer la quantit\u00e9 \u00e0 ","Company":"Soci\u00e9t\u00e9 ","Size chart":"Tableaux des tailles "," item (s) in your basket.":"article(s) dans votre panier.","Material":"Mati\u00e8res ","%s amount left to be added to the order to have the free shipping applied.":"Il ne vous manque plus que %s TTC pour b\u00e9n\u00e9ficier de la livraison gratuite.","Inquire about customization":"Personnaliser ce produit","Sub Total":"Sous-total TTC","For private customers, companies and administrations":"Pour les clients priv\u00e9s, les entreprises et les administrations","The return request has been already submitted for this order":"Votre demande de retour est accept\u00e9e. Un email de Chronopost vous a \u00e9t\u00e9 envoy\u00e9 sur l'adresse email de votre compte client. Vous pouvez retrouver les instructions de retour <a href=\"\/retour\">ici<\/a> ou contactez notre service client en cas de difficut\u00e9s.","Characteristic":"Caract\u00e9ristiques","Subtotal (Excl.Tax)":"Sous-total HT","Out of stock":"\u00c9puis\u00e9 ","Care instructions":"Entretien ","Discount (%1)":"Remise HT (%1)","Order now and receive it from ":"Commandez maintenant et recevez votre article \u00e0 partir du","For more information, you can contact your Customer Service on %1":"Pour plus d'informations, vous pouvez contacter le service client au %1","Data Sheets":"Fiche technique PDF ","Available from %1":"Disponible \u00e0 partir du %1","Recommended for you":"Recommand\u00e9 pour vous ","Add to List":"Ajouter \u00e0 la liste ","without delivery costs, without VAT":"sans frais de livraison HT","Gift Card":"Carte cadeau ","Log In":"S'identifier","of page":"page sur ","Comment...":"Commenter...","Download .csv sample":"T\u00e9l\u00e9charger l'exemple .csv ","of pages %1":"page sur %1","No shipping fees above 50\u20ac":"Frais de ports offerts d\u00e8s 60\u20ac TTC d'achats hors TNT express"," or less.":" ou moins","My Submissions":"Mes demandes de devis","For more information, you can contact your Customer Service on %1.":"Pour plus d'informations, vous pouvez contacter votre service client au %1.","Do you have a gift card ?":"Avez-vous une carte cadeau ? ","If you have any further questions, please contact us on 0800 66393 11.":"Pour plus d'informations, vous pouvez contacter votre service client\u00e8le au 03 88 98 83 80.","Order overview":"Aper\u00e7u de la commande ","Total Qty":"Quantit\u00e9 totale ","Register my address":"Enregistrer mon adresse","Soon in stock":"Bient\u00f4t en stock","Fast Order":"Commande Rapide","Add to Cart":"Ajouter au panier ","Stock alert":"Suite \u00e0 votre inscription \u00e0 l'alerte stock, nous vous informons que ces produits sont \u00e0 nouveau disponibles :","Suggested Terms":"Termes sugg\u00e9r\u00e9s ","Read more":"Lire la suite ","Including %1 of the following 4 elements:":"Dont %1 des 4 \u00e9l\u00e9ments suivants :"}</script><!-- added by Trusted Shops app: Start --><script src="https://integrations.etrusted.com/applications/widget.js/v2" async defer></script><!-- End --> <script>
var BASE_URL = 'https://www.modyf.fr/';
var THEME_PATH = 'https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR';
var COOKIE_CONFIG = {
"expires": null,
"path": "\u002F",
"domain": ".www.modyf.fr",
"secure": true,
"lifetime": "3600",
"cookie_restriction_enabled": false };
var CURRENT_STORE_CODE = 'fr_fr';
var CURRENT_WEBSITE_ID = '2';
window.hyva = window.hyva || {}
window.cookie_consent_groups = window.cookie_consent_groups || {}
window.cookie_consent_groups['necessary'] = true;
window.cookie_consent_config = window.cookie_consent_config || {};
window.cookie_consent_config['necessary'] = [].concat(
window.cookie_consent_config['necessary'] || [],
[
'user_allowed_save_cookie',
'form_key',
'mage-messages',
'private_content_version',
'mage-cache-sessid',
'last_visited_store',
'section_data_ids'
]
);</script> <script>
(function( hyva, undefined ) {
function lifetimeToExpires(options, defaults) {
const lifetime = options.lifetime || defaults.lifetime;
if (lifetime) {
const date = new Date;
date.setTime(date.getTime() + lifetime * 1000);
return date;
}
return null;
}
function generateRandomString() {
const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
length = 16;
let formKey = '',
charactersLength = allowedCharacters.length;
for (let i = 0; i < length; i++) {
formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))]
}
return formKey;
}
const sessionCookieMarker = {noLifetime: true}
const cookieTempStorage = {};
const internalCookie = {
get(name) {
const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
},
set(name, value, days, skipSetDomain) {
let expires,
path,
domain,
secure,
samesite;
const defaultCookieConfig = {
expires: null,
path: '/',
domain: null,
secure: false,
lifetime: null,
samesite: 'lax'
};
const cookieConfig = window.COOKIE_CONFIG || {};
expires = days && days !== sessionCookieMarker
? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig)
: lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires;
path = cookieConfig.path || defaultCookieConfig.path;
domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain);
secure = cookieConfig.secure || defaultCookieConfig.secure;
samesite = cookieConfig.samesite || defaultCookieConfig.samesite;
document.cookie = name + "=" + encodeURIComponent(value) +
(expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') +
(path ? '; path=' + path : '') +
(domain ? '; domain=' + domain : '') +
(secure ? '; secure' : '') +
(samesite ? '; samesite=' + samesite : 'lax');
},
isWebsiteAllowedToSaveCookie() {
const allowedCookies = this.get('user_allowed_save_cookie');
if (allowedCookies) {
const allowedWebsites = JSON.parse(unescape(allowedCookies));
return allowedWebsites[CURRENT_WEBSITE_ID] === 1;
}
return false;
},
getGroupByCookieName(name) {
const cookieConsentConfig = window.cookie_consent_config || {};
let group = null;
for (let prop in cookieConsentConfig) {
if (!cookieConsentConfig.hasOwnProperty(prop)) continue;
if (cookieConsentConfig[prop].includes(name)) {
group = prop;
break;
}
}
return group;
},
isCookieAllowed(name) {
const cookieGroup = this.getGroupByCookieName(name);
return cookieGroup
? window.cookie_consent_groups[cookieGroup]
: this.isWebsiteAllowedToSaveCookie();
},
saveTempStorageCookies() {
for (const [name, data] of Object.entries(cookieTempStorage)) {
if (this.isCookieAllowed(name)) {
this.set(name, data['value'], data['days'], data['skipSetDomain']);
delete cookieTempStorage[name];
}
}
}
};
hyva.getCookie = (name) => {
const cookieConfig = window.COOKIE_CONFIG || {};
if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null;
}
return internalCookie.get(name);
}
hyva.setCookie = (name, value, days, skipSetDomain) => {
const cookieConfig = window.COOKIE_CONFIG || {};
if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
cookieTempStorage[name] = {value, days, skipSetDomain};
return;
}
return internalCookie.set(name, value, days, skipSetDomain);
}
hyva.setSessionCookie = (name, value, skipSetDomain) => {
return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain)
}
hyva.getBrowserStorage = () => {
const browserStorage = window.localStorage || window.sessionStorage;
if (!browserStorage) {
console.warn('Browser Storage is unavailable');
return false;
}
try {
browserStorage.setItem('storage_test', '1');
browserStorage.removeItem('storage_test');
} catch (error) {
console.warn('Browser Storage is not accessible', error);
return false;
}
return browserStorage;
}
hyva.postForm = (postParams) => {
const form = document.createElement("form");
let data = postParams.data;
if (! postParams.skipUenc && ! data.uenc) {
data.uenc = btoa(window.location.href);
}
form.method = "POST";
form.action = postParams.action;
Object.keys(postParams.data).map(key => {
const field = document.createElement("input");
field.type = 'hidden'
field.value = postParams.data[key];
field.name = key;
form.appendChild(field);
});
const form_key = document.createElement("input");
form_key.type = 'hidden';
form_key.value = hyva.getFormKey();
form_key.name="form_key";
form.appendChild(form_key);
document.body.appendChild(form);
form.submit();
}
hyva.getFormKey = function () {
let formKey = hyva.getCookie('form_key');
if (!formKey) {
formKey = generateRandomString();
hyva.setCookie('form_key', formKey);
}
return formKey;
}
hyva.formatPrice = (value, showSign, options = {}) => {
const groupSeparator = options.groupSeparator;
const decimalSeparator = options.decimalSeparator
delete options.groupSeparator;
delete options.decimalSeparator;
const formatter = new Intl.NumberFormat(
'fr\u002DFR',
Object.assign({
style: 'currency',
currency: 'EUR',
signDisplay: showSign ? 'always' : 'auto'
}, options)
);
return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ?
formatter.formatToParts(value).map(({type, value}) => {
switch (type) {
case 'currency':
return '\u20AC' || value;
case 'minusSign':
return '- ';
case 'plusSign':
return '+ ';
case 'group':
return groupSeparator !== undefined ? groupSeparator : value;
case 'decimal':
return decimalSeparator !== undefined ? decimalSeparator : value;
default :
return value;
}
}).reduce((string, part) => string + part) :
formatter.format(value);
}
const formatStr = function (str, nStart) {
const args = Array.from(arguments).slice(2);
return str.replace(/(%+)([0-9]+)/g, (m, p, n) => {
const idx = parseInt(n) - nStart;
if (args[idx] === null || args[idx] === void 0) {
return m;
}
return p.length % 2
? p.slice(0, -1).replace('%%', '%') + args[idx]
: p.replace('%%', '%') + n;
})
}
hyva.str = function (string) {
const args = Array.from(arguments);
args.splice(1, 0, 1);
return formatStr.apply(undefined, args);
}
hyva.strf = function () {
const args = Array.from(arguments);
args.splice(1, 0, 0);
return formatStr.apply(undefined, args);
}
/**
* Take a html string as `content` parameter and
* extract an element from the DOM to replace in
* the current page under the same selector,
* defined by `targetSelector`
*/
hyva.replaceDomElement = (targetSelector, content) => {
const parser = new DOMParser();
const doc = parser.parseFromString(content, 'text/html');
const contentNode = doc.querySelector(targetSelector);
if (!contentNode || !document.querySelector(targetSelector)) {
return;
}
hyva.activateScripts(contentNode);
document.querySelector(targetSelector).replaceWith(contentNode);
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
hyva.initMessages();
}
hyva.removeScripts = (contentNode) => {
const scripts = contentNode.getElementsByTagName('script');
for (let i = 0; i < scripts.length; i++) {
scripts[i].parentNode.removeChild(scripts[i]);
}
const templates = contentNode.getElementsByTagName('template');
for (let i = 0; i < templates.length; i++) {
const container = document.createElement('div');
container.innerHTML = templates[i].innerHTML;
hyva.removeScripts(container);
templates[i].innerHTML = container.innerHTML;
}
}
hyva.activateScripts = (contentNode) => {
const scripts = Array.from(contentNode.getElementsByTagName('script'));
for (const original of scripts) {
const script = document.createElement('script');
original.type && (script.type = original.type);
script.innerHTML = original.innerHTML;
original.parentNode.removeChild(original)
document.head.appendChild(script);
}
return contentNode;
}
const replace = {['+']: '-', ['/']: '_', ['=']: ','};
hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]);
let currentTrap;
const focusableElements = (rootElement) => {
const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]';
return Array.from(rootElement.querySelectorAll(selector))
.filter(el => {
return el.style.display !== 'none'
&& !el.disabled
&& el.tabIndex !== -1
&& (el.offsetWidth || el.offsetHeight || el.getClientRects().length)
})
}
const focusTrap = (e) => {
const isTabPressed = e.key === 'Tab' || e.keyCode === 9;
if (!isTabPressed) return;
const focusable = focusableElements(currentTrap)
const firstFocusableElement = focusable[0]
const lastFocusableElement = focusable[focusable.length - 1]
e.shiftKey
? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault())
: document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault())
};
hyva.releaseFocus = (rootElement) => {
if (currentTrap && (!rootElement || rootElement === currentTrap)) {
currentTrap.removeEventListener('keydown', focusTrap)
currentTrap = null
}
}
hyva.trapFocus = (rootElement) => {
if (!rootElement) return;
hyva.releaseFocus()
currentTrap = rootElement
rootElement.addEventListener('keydown', focusTrap)
const firstElement = focusableElements(rootElement)[0]
firstElement && firstElement.focus()
}
hyva.safeParseNumber = (rawValue) => {
const number = rawValue ? parseFloat(rawValue) : null;
return Array.isArray(number) || isNaN(number) ? rawValue : number;
}
const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('');
hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => {
const camelCase = toCamelCase(name);
const key = '__hyva_bool_' + name
return new Proxy(Object.assign(
additionalMethods,
{
[key]: !!value,
[name]() {return !!this[key]},
['!' + name]() {return !this[key]},
['not' + camelCase]() {return !this[key]},
['toggle' + camelCase]() {this[key] = !this[key]},
[`set${camelCase}True`]() {this[key] = true},
[`set${camelCase}False`]() {this[key] = false},
}
), {
set(target, prop, value) {
return prop === name
? (target[key] = !!value)
: Reflect.set(...arguments);
}
})
}
hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true})
window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true});
window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies())
}( window.hyva = window.hyva || {} ));</script> <script type="speculationrules">
{
"tag": "Hyva Theme",
"prefetch": [{
"source": "document",
"where": {
"and": [
{ "href_matches": "/*" },
{ "not": {
"href_matches": ["/customer/*","*/customer/*","/search/*","*/search/*","/sales/*","*/sales/*","/wishlist/*","*/wishlist/*","/checkout/*","*/checkout/*","/paypal/*","*/paypal/*"] }},
{ "not": {
"selector_matches": [".no-preload", ".do-not-prerender", "[download]", "[rel~=nofollow]", "[target]"]
}}
]
},
"eagerness": "moderate"
}]
}</script> <script>
window.addEventListener('load', function () {
window.magentoStorefrontEvents = magentoStorefrontEvents;
magentoStorefrontEvents.context.setStorefrontInstance(
{"storeUrl":"https:\/\/www.modyf.fr\/","websiteId":2,"websiteCode":"modyf_fr","storeId":2,"storeCode":"fr","storeViewId":2,"storeViewCode":"fr_fr","websiteName":"France","storeName":"French Store","storeViewName":"French","baseCurrencyCode":"EUR","storeViewCurrencyCode":"EUR","catalogExtensionVersion":"103.3.14","environmentId":"57f0c44c-dae0-4e4c-9a92-6c61b10c4a3a","environment":"Production","storefrontTemplate":"Hyva"} );
magentoStorefrontEvents.context.setMagentoExtension({
magentoExtensionVersion: "7.6.1",
});
magentoStorefrontEvents.context.setDataServicesExtension({
version: "7.6.1",
});
magentoStorefrontEvents.context.setPage({
pageType: "Default"
});
magentoStorefrontEvents.context.setContext("pageExtended", {
action: "page-view"
});
let shopperId = "guest";
magentoStorefrontEvents.context.setShopper({ shopperId: shopperId });
magentoStorefrontEvents.publish.pageView();
});
function getCustomerIdFromDataServices() {
let customerId = hyva.getCookie("dataservices_customer_id");
return customerId ? decodeURI(customerId).replace(/[^\w\s]/gi, "") : null;
}
function getCustomerGroupFromDataServices() {
try {
const decodedString = decodeURIComponent(hyva.getCookie("dataservices_customer_group"));
return decodedString ? JSON.parse(decodedString) : null;
} catch (error) {
console.error("Failed to parse customer group data:", error);
return null;
}
}</script> <!-- GOOGLE TAG MANAGER -->
<div class="hidden"
x-data="googleTagManagerInit()"
@private-content-loaded.window="receiveCustomerData($event.detail.data); $nextTick(() => googleTagManager())"
></div>
<script>
function googleTagManagerInit() {
return {
hasGoogleTagManagerRun: false,
customer: false,
cart: false,
blockNames: [
'category.products.list',
'product.info.upsell',
'catalog.product.related',
'checkout.cart.crosssell',
'search_result_list',
'product.widget'
],
dlCurrencyCode: window.dlCurrencyCode || '',
dataLayer: window.dataLayer || [],
staticImpressions: window.staticImpressions || [],
staticPromotions: window.staticPromotions || [],
updatedImpressions: window.updatedImpressions || [],
updatedPromotions: window.updatedPromotions || [],
localStorageCartData: '',
addToCartProduct: '',
removeFromCartItemId: '',
removeFromCartProduct: '',
getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
return null;
},
googleTagManager() {
if (!this.hasGoogleTagManagerRun) {
let self = this,
allowServices = false,
allowedCookies,
allowedWebsites,
config = {"isCookieRestrictionModeEnabled":false,"currentWebsite":2,"cookieName":"user_allowed_save_cookie","gtmAccountId":"GTM-P9L9DSH","storeCurrencyCode":"EUR","ordersData":[],"pageType":"home"};
if (config.isCookieRestrictionModeEnabled) {
allowedCookies = this.getCookie(config.cookieName);
if (allowedCookies !== null) {
allowedWebsites = JSON.parse(allowedCookies);
if (allowedWebsites[config.currentWebsite] === 1) {
allowServices = true;
}
}
} else {
allowServices = true;
}
if (allowServices) {
if (!window.dataLayer) {
window.dataLayer = [];
}
window.dataLayer.originalPush = Array.prototype.push.bind(window.dataLayer);
window.dataLayer.containsEvent = function (eventName) {
for (let i = 0; i < this.length; i++) {
if (this[i].event && this[i].event === eventName) {
return true;
}
}
return false;
};
window.dataLayer.bindToEvent = function (eventName, callBack) {
if (this.containsEvent(eventName)) {
callBack();
return;
}
document.addEventListener('datalayer.push', function (event) {
const dataLayerElement = event.detail;
if (!dataLayerElement.event || dataLayerElement.event !== eventName) {
return;
}
callBack();
});
};
window.dlCurrencyCode = config.storeCurrencyCode;
let customer = this.customer,
cart = this.cart,
cartValue = 0,
email = '',
userId = '',
isNewCustomer = '',
userType = 'b2c',
orderType = 'guest',
isNewsletterSubscriber = '',
cookiesAccepted = false,
isSuccessPage = false;
if (document.body.classList.contains('checkout-onepage-success')) {
isSuccessPage = true;
}
if (customer.email) {
email = customer.email;
userId = customer.userId;
isNewCustomer = customer.isNewCustomer;
orderType = customer.orderType;
userType = customer.userType;
isNewsletterSubscriber = customer.isNewsletterSubscriber;
}
if (cart.data_id) {
cartValue = cart.subtotalAmount ? cart.subtotalAmount : 0;
}
if (this.getCookie(config.cookieName)) {
cookiesAccepted = true;
}
if (isSuccessPage) {
window.dataLayer.push({
'baseData': [{
'email': email,
'pageType': config.pageType,
'cookiesAccepted': cookiesAccepted,
'country': config.country,
'orderType': orderType,
'userType': userType,
'userId': userId,
'isNewsletterSubscriber': isNewsletterSubscriber,
'isNewCustomer': isNewCustomer,
'language': config.language,
'cartValue': cartValue
}]
});
} else {
window.dataLayer.push({
'baseData': [{
'email': email,
'pageType': config.pageType,
'cookiesAccepted': cookiesAccepted,
'country': config.country,
'userType': userType,
'userId': userId,
'isNewsletterSubscriber': isNewsletterSubscriber,
'isNewCustomer': isNewCustomer,
'language': config.language,
'cartValue': cartValue
}]
});
}
document.addEventListener('ga:inited', function () {
self.googleAnalyticsUniversal();
});
if (isSuccessPage) {
const gtmPurchaseEvent = new Event('gtm_purchase');
document.dispatchEvent(gtmPurchaseEvent);
} else {
const gaInitedEvent = new Event('ga:inited');
document.dispatchEvent(gaInitedEvent);
const gtmScriptEvent = new Event('gtm_script');
document.dispatchEvent(gtmScriptEvent);
}
document.addEventListener('googleAnalyticsUniversalEvent', function (e) {
self.googleAnalyticsUniversalEvent(e.detail);
});
}
document.addEventListener('gtm_product-addtocart-success', function (event) {
self.localStorageCartData = event.detail;
self.addToCart();
});
document.addEventListener('gtm_product-remove-from-cart', function (event) {
self.removeFromCartItemId = event.detail.itemId;
self.removeFromCart();
});
self.hasGoogleTagManagerRun = true;
}
},
receiveCustomerData(data) {
if (data.customer.email) {
this.customer = data.customer;
}
if (data.cart) {
this.cart = data.cart;
}
},
googleAnalyticsUniversal() {
let pageImpressions = this.mergeImpressions(),
dlImpressionsUA = {
'event': 'productImpression',
'ecommerce': {
'currencyCode': window.dlCurrencyCode,
'impressions': []
}
},
dlImpressionsGA4 = {
'event': 'view_item_list',
'ecommerce': {
'items': []
}
},
impressionCounter = 0;
for (const blockName in pageImpressions) {
// Skip inherited properties and the 'length' property
if (blockName === 'length' || !Object.prototype.hasOwnProperty.call(pageImpressions, blockName)) {
continue;
}
for (let i = 0; i < pageImpressions[blockName].length; i++) {
const impression = pageImpressions[blockName][i];
// Enhanced Ecommerce (UA)
dlImpressionsUA.ecommerce.impressions.push({
name: impression.name,
id: impression.id,
price: impression.price,
brand: impression.brand,
category: impression.category,
variant: impression.variant,
list: impression.list,
position: impression.position,
metric1: impression.metric1
});
// Ecommerce (GA4)
dlImpressionsGA4.ecommerce.items.push({
item_name: impression.name,
item_id: impression.id,
price: impression.price,
item_brand: impression.brand,
item_category: impression.item_category,
item_category2: impression.item_category2,
item_variant: impression.variant,
item_list_name: impression.list,
index: impression.position,
item_price_vat: impression.metric1
});
impressionCounter++;
this.bindImpressionClick(
impression.name,
impression.id,
impression.price,
impression.brand,
impression.category,
impression.item_category,
impression.item_category2,
impression.variant,
impression.list,
impression.position,
impression.metric1,
blockName,
impression.listPosition,
impression.type
);
}
}
if (window.dataLayer && impressionCounter > 0) {
setTimeout(() => {
window.dataLayer.push(dlImpressionsUA);
window.dataLayer.push(dlImpressionsGA4);
}, 2000);
}
},
googleAnalyticsUniversalEvent(products) {
let dlImpressionsUA = {
'event': 'productImpression',
'ecommerce': {
'currencyCode': window.dlCurrencyCode,
'impressions': []
}
},
dlImpressionsGA4 = {
'event': 'view_item_list',
'ecommerce': {
'items': []
}
},
impressionCounter = 0;
products.forEach((product) => {
// Enhanced Ecommerce (UA)
dlImpressionsUA.ecommerce.impressions.push({
name: product.name,
id: product.id,
price: product.price,
brand: product.brand,
category: product.category,
variant: product.variant,
list: product.list,
position: product.position,
metric1: product.metric1
});
// Ecommerce (GA4)
dlImpressionsGA4.ecommerce.items.push({
item_name: product.name,
item_id: product.id,
price: product.price,
item_brand: product.brand,
item_category: product.item_category,
item_category2: product.item_category2,
item_variant: product.variant,
item_list_name: product.list,
index: product.position,
item_price_vat: product.metric1
});
impressionCounter++;
this.bindImpressionClick(
product.name,
product.id,
product.price,
product.brand,
product.category,
product.item_category,
product.item_category2,
product.variant,
product.list,
product.position,
product.metric1,
'recommendedProducts',
product.listPosition,
product.type
);
});
if (window.dataLayer && impressionCounter > 0) {
setTimeout(() => {
window.dataLayer.push(dlImpressionsUA);
window.dataLayer.push(dlImpressionsGA4);
}, 2000);
}
},
mergeImpressions() {
let pageImpressions = [];
this.blockNames.forEach(function (blockName) {
// Check if there is a new block generated by FPC placeholder update
if (this.updatedImpressions && this.updatedImpressions[blockName]) {
pageImpressions[blockName] = this.updatedImpressions[blockName];
} else if (this.staticImpressions && this.staticImpressions[blockName]) {
// Use static data otherwise
pageImpressions[blockName] = this.staticImpressions[blockName];
} else if (window.staticImpressions && window.staticImpressions[blockName]) {
pageImpressions[blockName] = window.staticImpressions[blockName];
}
});
return pageImpressions;
},
getProductLink(eventBlock, listPosition, type) {
let productLink = document.querySelectorAll(`${eventBlock} .item:nth-child(${listPosition + 1}) a`);
if (type === 'configurable' || type === 'bundle' || type === 'grouped') {
productLink = [
...document.querySelectorAll(`${eventBlock} .item:nth-child(${listPosition + 1}) .tocart`),
...document.querySelectorAll(`${eventBlock} .item:nth-child(${listPosition + 1}) a`)
];
}
return productLink;
},
getProductWidgetLink(eventBlock, listPosition) {
return document.querySelectorAll(`${eventBlock} .product-item:nth-child(${listPosition + 1}) a`);
},
activeOnProducts(name, id, price, brand, category, item_category, item_category2, variant, list, position, metric1) {
// Enhanced Ecommerce (UA)
window.dataLayer.push({
'event': 'productClick',
'ecommerce': {
'click': {
'products': [
{
'name': name,
'id': id,
'price': price,
'brand': brand,
'category': category,
'variant': variant,
'position': position,
'metric1': metric1
}
]
}
}
});
// Ecommerce (GA4)
window.dataLayer.push({
'event': 'select_item',
'ecommerce': {
'items': [
{
'item_name': name,
'item_id': id,
'item_brand': brand,
'item_category': item_category,
'item_category2': item_category2,
'item_variant': variant,
'index': position,
'price': price,
'item_price_vat': metric1
}
]
}
});
},
bindImpressionClick(name, id, price, brand, category, item_category, item_category2, variant, list, position, metric1, blockType, listPosition, type) {
let productLink = [],
eventBlock = '';
// Determine the event block and product links based on blockType
switch (blockType) {
case 'catalog.product.related':
eventBlock = '.products-related .products';
productLink = this.getProductLink(eventBlock, listPosition, type);
break;
case 'product.info.upsell':
eventBlock = '.products-upsell .products';
productLink = this.getProductLink(eventBlock, listPosition, type);
break;
case 'checkout.cart.crosssell':
eventBlock = '.products-crosssell .products';
productLink = this.getProductLink(eventBlock, listPosition, type);
break;
case 'category.products.list':
case 'search_result_list':
eventBlock = '.products .products';
productLink = this.getProductLink(eventBlock, listPosition, type);
break;
case 'product.widget':
eventBlock = '.block-products-list';
productLink = this.getProductWidgetLink(eventBlock, listPosition);
break;
}
// Bind click events to each product link
productLink.forEach((element) => {
element.addEventListener('click', () => {
this.activeOnProducts(
name,
id,
price,
brand,
category,
item_category,
item_category2,
variant,
list,
position,
metric1
);
});
});
},
addToCart() {
let self = this;
for (let product of this.cart.items) {
let productId = self.localStorageCartData.data.productId;
if (self.localStorageCartData.data.configurableProductId) {
productId = self.localStorageCartData.data.configurableProductId;
}
if (product.product_id === productId) {
self.addToCartProduct = product;
break;
}
}
if (self.addToCartProduct) {
// Enhanced Ecommerce (UA)
window.dataLayer.push({
event: 'addToCart',
ecommerce: {
currencyCode: window.dlCurrencyCode,
add: {
products: [{
name: self.addToCartProduct.product_name,
id: self.addToCartProduct.product_sku,
price: self.addToCartProduct.product_price_exl_tax_value,
brand: self.addToCartProduct.product_brand,
category: self.addToCartProduct.product_category,
variant: self.addToCartProduct.product_color,
metric1: self.addToCartProduct.product_price_inc_tax_value,
dimension2: self.addToCartProduct.product_native_size,
metric2: self.addToCartProduct.product_width,
quantity: self.localStorageCartData.data.qty
}]
}
}
});
// Ecommerce (GA4)
window.dataLayer.push({
event: 'add_to_cart',
ecommerce: {
items: [{
item_name: self.addToCartProduct.product_name,
item_id: self.addToCartProduct.product_sku,
price: self.addToCartProduct.product_price_exl_tax_value,
item_brand: self.addToCartProduct.product_brand,
item_category: self.addToCartProduct.product_item_category,
item_category2: self.addToCartProduct.product_item_category2,
item_variant: self.addToCartProduct.product_color,
item_price_vat: self.addToCartProduct.product_price_inc_tax_value,
index: '1',
quantity: self.localStorageCartData.data.qty,
item_width: self.addToCartProduct.product_width,
item_size: self.addToCartProduct.product_native_size
}]
}
});
}
},
removeFromCart() {
let self = this;
for (let product of this.cart.items) {
let productId = self.removeFromCartItemId;
if (product.item_id === productId) {
self.removeFromCartProduct = product;
break;
}
}
if (self.removeFromCartProduct) {
// Enhanced Ecommerce (UA)
window.dataLayer.push({
'event': 'removeFromCart',
'ecommerce': {
'currencyCode': window.dlCurrencyCode,
'remove': {
'products': [{
'name': self.removeFromCartProduct.product_name,
'id': self.removeFromCartProduct.product_sku,
'price': self.removeFromCartProduct.product_price_exl_tax_value,
'brand': self.removeFromCartProduct.product_brand,
'category': self.removeFromCartProduct.product_category,
'variant': self.removeFromCartProduct.product_color,
'metric1': self.removeFromCartProduct.product_price_inc_tax_value,
'dimension2': self.removeFromCartProduct.product_native_size,
'metric2': self.removeFromCartProduct.product_width,
'quantity': self.removeFromCartProduct.qty
}]
}
}
});
// Ecommerce (GA4)
window.dataLayer.push({
'event': 'remove_from_cart',
'ecommerce': {
'items': [{
'item_name': self.removeFromCartProduct.product_name,
'item_id': self.removeFromCartProduct.product_sku,
'price': self.removeFromCartProduct.product_price_exl_tax_value,
'item_brand': self.removeFromCartProduct.product_brand,
'item_category': self.removeFromCartProduct.product_item_category,
'item_category2': self.removeFromCartProduct.product_item_category2,
'item_variant': self.removeFromCartProduct.product_color,
'item_price_vat': self.removeFromCartProduct.product_price_inc_tax_value,
'index': self.removeFromCartProduct.product_position,
'quantity': self.removeFromCartProduct.qty,
'item_width': self.removeFromCartProduct.product_width,
'item_size': self.removeFromCartProduct.product_native_size
}]
}
});
}
}
}
}
</script>
<!-- END GOOGLE TAG MANAGER -->
</head>
<body id="html-body" class="cms-home cms-index-index page-layout-1column">
<noscript><style> /*Critical css start*/ .page-main, .breadcrumbs { visibility: visible; opacity: 1; } .modals-wrapper, .ampromo-overlay, .page-main .no-js-widget-wrapper { display: block; } /*Critical css end*/</style></noscript><input name="form_key" type="hidden" value="njoHEetKjnTraCzD" /><script>
document.body.addEventListener('touchstart', () => {}, {passive: true})
</script>
<script>
'use strict';
(function(hyva) {
const formValidationRules = {
required(value, options, field, context) {
const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element,
msg = 'Ce\u0020champ\u0020est\u0020obligatoire.';
if (el.type === 'radio' || el.type === 'checkbox') {
return (value === undefined || value.length === 0) ? msg : true;
}
el.setAttribute('required', '');
el.checkValidity();
return el.validity.valueMissing ? msg : true;
},
maxlength(value, options, field, context) {
const n = Number(options)
if (value.length > n) {
return n === 1
? hyva.strf('Veuillez\u0020ne\u0020pas\u0020saisir\u0020plus\u0020d\u0027un\u0020caract\u00E8re.')
: hyva.strf('Veuillez\u0020ne\u0020pas\u0020saisir\u0020plus\u0020de\u0020\u00250\u0020caract\u00E8res.', options)
}
return true;
},
minlength(value, options, field, context) {
const n = Number(options)
if (value.length > 0 && value.length < n) {
return n === 1
? hyva.strf('Veuillez\u0020saisir\u0020au\u0020moins\u00201\u0020caract\u00E8re.')
: hyva.strf('Veuillez\u0020saisir\u0020au\u0020minimum\u0020\u00250\u0020caract\u00E8res.', options)
}
return true;
},
max(value, options, field, context) {
field.element.setAttribute('max', options);
field.element.checkValidity();
if (field.element.validity.rangeOverflow) {
return hyva.strf('Veuillez\u0020saisir\u0020une\u0020valeur\u0020inf\u00E9rieure\u0020ou\u0020\u00E9gale\u0020\u00E0\u0020\u0022\u00250\u0022.', options);
}
return true;
},
min(value, options, field, context) {
field.element.setAttribute('min', options);
field.element.checkValidity();
if (field.element.validity.rangeUnderflow) {
return hyva.strf('Veuillez\u0020saisir\u0020une\u0020valeur\u0020sup\u00E9rieure\u0020ou\u0020\u00E9gale\u0020\u00E0\u0020\u0022\u00250\u0022.', options);
}
return true;
},
step(value, options, field, context) {
field.element.setAttribute('step', options);
field.element.checkValidity();
if (field.element.validity.stepMismatch) {
const val = Number(value);
const step = Number(options);
const msg = 'Veuillez\u0020saisir\u0020une\u0020valeur\u0020valide.\u0020Les\u0020deux\u0020valeurs\u0020valides\u0020les\u0020plus\u0020proches\u0020sont\u0020\u0022\u00250\u0022\u0020et\u0020\u0022\u00251\u0022.';
return hyva.strf(msg, Math.floor(val / step) * step, Math.ceil(val / step) * step);
}
return true;
},
pattern(value, options, field, context) {
field.element.setAttribute('pattern', options);
field.element.checkValidity();
if (field.element.validity.patternMismatch) {
return field.element.title
? hyva.strf('Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9\u0020\u003A\u0020\u00250.', field.element.title)
: 'Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9.'
}
return true;
},
email(value, options, field, context) {
const rule = /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i;
if (value.length > 0 && !rule.test(value)) {
return 'Veuillez\u0020entrer\u0020une\u0020adresse\u0020email\u0020valide\u0020\u0028Ex\u00A0\u003A\u0020johndoe\u0040domain.com\u0029.';
}
return true;
},
password(value, options, field, context) {
const rule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/;
if (value.length > 0 && !rule.test(value)) {
return 'Veuillez\u0020indiquer\u0020au\u0020moins\u0020une\u0020majuscule,\u0020une\u0020minuscule,\u0020un\u0020chiffre\u0020et\u0020un\u0020caract\u00E8re\u0020sp\u00E9cial\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026amp\u003B\u002A\u002D\u0029.';
}
return true;
},
equalTo(value, options, field, context) {
const dependencyField = context.fields[options].element;
if (value !== dependencyField.value) {
const dependencyFieldName =
dependencyField.label ||
dependencyField.title ||
(dependencyField.labels && dependencyField.labels[0] && dependencyField.labels[0].innerText) ||
dependencyField.name;
return hyva.strf('Entrez\u0020\u00E0\u0020nouveau\u0020la\u0020m\u00EAme\u0020valeur.', dependencyFieldName);
}
return true;
}
};
function raceSome(promises, pred) {
return new Promise((resolve, reject) => {
if (promises.length === 0) {
return resolve();
}
let settled = false, nDone = 0;
const resolveIf = v => {
if (!settled && (pred(v) || ++nDone === promises.length)) {
settled = true;
resolve(v);
}
return v;
}
promises.map(promise => {
promise.then(resolveIf).catch(reason => {
settled = true;
reject(reason)
});
return promise;
});
});
}
const INPUT_ATTRIBUTE_RULES = {min: 'min', max: 'max', required: 'required', minlength: 'minlength', maxlength: 'maxlength', step: 'step', pattern: 'pattern'}
const INPUT_TYPE_RULES = {email: 'email'}
function getRules(element) {
let rules = {};
Object.keys(INPUT_ATTRIBUTE_RULES).forEach(attrName => {
if (element.hasAttribute(attrName)) {
rules[INPUT_ATTRIBUTE_RULES[attrName]] = element.getAttribute(attrName);
}
})
if (INPUT_TYPE_RULES[element.type]) {
rules[INPUT_TYPE_RULES[element.type]] = true;
}
if (element.dataset.validate) {
try {
Object.assign(rules, JSON.parse(element.dataset.validate));
} catch (error) {
console.error('Validator error. Cannot parse data-validate attribute of element:\n', element);
}
}
return rules;
}
function isInvalidRuleResult(ruleState) {
return typeof ruleState === 'string' || !ruleState || (ruleState.type && ruleState.content);
}
async function runValidateFn(rule, options, value, field) {
return formValidationRules[rule](value, options, field, this);
}
function generateId() {
let id;
do {
id = `${this.idPrefix}-${++this.idSeq}`;
} while (document.getElementById(id));
return id;
}
function isVisible(element) {
const el = element.type !== 'hidden' ? element : (element.parentElement || {});
return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length)
}
function elementWillValidate(element) {
return (element.willValidate || element.type === 'hidden')
&& element.tagName !== 'BUTTON'
&& element.disabled === false
&& !(element.tagName === 'INPUT' && element.type === 'submit')
&& (element.hasAttribute('data-validate-hidden') || isVisible(element))
}
function createMessageContainer(el, fieldWrapperClassName) {
if (! el.parentElement) {
return;
}
const refocus = document.activeElement === el;
const wrapper = document.createElement('div');
wrapper.classList.add.apply(wrapper.classList, fieldWrapperClassName.split(' '));
el.parentElement.insertBefore(wrapper, el);
wrapper.appendChild(el);
refocus && document.activeElement !== el && el.focus();
return wrapper;
}
function containerNotFound(selector, el) {
const msg = `Cannot find message container element ${selector} of ${el.name}`;
console.error(msg, el);
throw msg;
}
function createTextInputFrom(el) {
const text = document.createElement('INPUT');
text.type = 'text';
text.value = el.value;
return text;
}
function classNamesToSelector(classNames) {
return classNames.split(' ')
.filter(className => className.length > 0)
.map(className => `.${className}`)
.join('')
}
function hasMessagesWrapper(field, messagesWrapperClassName) {
return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
}
function getMessagesWrapper(field, messagesWrapperClassName) {
if (hasMessagesWrapper.call(this, field, messagesWrapperClassName)) {
return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
}
const msgWrapper = document.createElement('ul');
const msgId = generateId.call(this);
msgWrapper.id = msgId;
field.element.setAttribute('aria-errormessage', msgId);
field.element.setAttribute('aria-describedby', msgId);
msgWrapper.classList.add.apply(msgWrapper.classList, messagesWrapperClassName.split(' '));
if (field.validateOnChange) {
msgWrapper.setAttribute('aria-live', 'polite');
}
this.getMessageContainer(field).appendChild(msgWrapper);
return msgWrapper;
}
function getCheckedValues(field) {
const name = field.element.name.replace(/([\\"])/g, '\\$1');
const elements = field.element.form.querySelectorAll('input[name="' + name + '"]:checked');
return Array.from(elements).map(el => el.value);
}
function escapeHtml(s) {
const div = document.createElement('div')
div.innerText = s;
return div.innerHTML;
}
function formValidation(formElement, options) {
// Disable browser default validation
if (formElement.tagName === 'FORM') {
formElement.setAttribute('novalidate', '');
} else {
console.error('formValidation can be initialized only on FORM element', formElement);
return;
}
options = Object.assign({
fieldWrapperClassName: 'field field-reserved',
messagesWrapperClassName: 'messages',
validClassName: 'field-success',
invalidClassName: 'field-error',
pageMessagesWrapperSelector: null,
scrollToFirstError: true,
}, options || {});
return {
state: {
valid: false,
},
fields: {},
idSeq: 0,
idPrefix: formElement.id || 'vld-msg',
setupFields(elements) {
this.fields = {};
Array.from(elements).forEach(element => {
if (elementWillValidate(element)) {
this.setupField(element);
}
});
},
setupField(element) {
if (! element) return;
const onChange = !!element.dataset.onChange;
if (elementWillValidate(element)) {
const rules = getRules(element);
if (Object.keys(rules).length > 0) {
if (this.fields[element.name]) {
Object.assign(this.fields[element.name].rules, rules);
} else {
this.fields[element.name] = {
element,
rules: rules,
validateOnChange: onChange,
state: {
valid: null,
rules: {}
}
}
}
}
} else {
console.error('Element will not validate', element);
}
},
onSubmit(event) {
if (event.target.tagName === 'FORM') {
event.preventDefault();
this.validate()
.then(() => event.target.submit())
.catch(invalidElements => {});
}
},
onChange(event) {
event.target.dataset.onChange = 'true';
if (!Object.keys(this.fields).length) {
this.setupFields(formElement.elements);
}
if (!Object.keys(this.fields).includes(event.target.name)) {
this.setupField(event.target);
}
const field = this.fields[event.target.name];
this.validateField(field);
field && field.element.removeAttribute('data-on-change')
},
validateSafe() {
return new Promise(resolve => this.validate().then(() => resolve(true)).catch(() => {}))
},
validate() {
if (!Object.keys(this.fields).length || !Object.keys(this.fields).length !== formElement.elements.length) {
this.setupFields(formElement.elements);
}
return new Promise(async (resolve, reject) => {
if (formElement.elements) {
await raceSome(this.validateFields(), result => result !== true)
const invalidFields = Object.values(this.fields).filter(field => !field.state.valid);
this.state.valid = invalidFields.length === 0;
if (this.state.valid) {
resolve();
} else {
if (options.scrollToFirstError && invalidFields.length > 0) {
invalidFields[0].element.focus()
invalidFields[0].element.select && invalidFields[0].element.select();
}
reject(invalidFields.map(field => field.element));
}
}
});
},
validateFields() {
const fields = Object.values(this.fields);
fields.forEach(field => {
this.getMessageContainer(field).classList.remove(options.validClassName, options.invalidClassName)
});
return fields.map(field => this.validateField(field))
},
validateField(field) {
if (! field || ! elementWillValidate(field.element)) {
return new Promise(resolve => resolve(true))
}
let value;
if (field.element.type === 'checkbox') {
value = getCheckedValues(field);
} else if (field.element.type === 'radio') {
value = getCheckedValues(field)[0] || undefined;
} else if (field.element.tagName === 'SELECT' && field.element.multiple) {
value = Array.from(field.element.selectedOptions).map(opt => opt.value);
} else {
value = field.element.value;
}
const rules = field.rules || {};
field.state.valid = true;
this.showFieldState(field);
const fieldValidations = Object.keys(rules).filter(rule => formValidationRules[rule]).map(async rule => {
return runValidateFn.call(this, rule, rules[rule], value, field).then(result => {
field.state.rules[rule] = result;
return result;
})
});
return new Promise(resolve => {
Promise.all(fieldValidations).then(results => {
field.state.valid = !elementWillValidate(field.element) || rules.length === 0 || !results.some(isInvalidRuleResult)
this.showFieldState(field);
resolve(field.state.valid);
})
});
},
getMessagesByField(field) {
const messages = [];
const invalidRules = Object.keys(field.state.rules).filter(rule => isInvalidRuleResult(field.state.rules[rule]));
field.rules && Object.keys(field.rules).forEach((rule) => {
if (invalidRules.includes(rule)) {
const customMessage = field.element.getAttribute('data-msg-' + rule);
const message = customMessage ? customMessage : field.state.rules[rule];
const ruleOptions = JSON.parse(JSON.stringify(field.rules[rule]));
if (typeof message === 'undefined' || message === null || (typeof message !== 'string' && ! message.type)) {
messages.push(hyva.strf('Validation rule "%0" failed.', rule));
} else if (Array.isArray(ruleOptions)) {
ruleOptions.unshift(message.type ? message.content : message);
const content = hyva.strf.apply(null, ruleOptions);
messages.push(message.type ? {type: message.type, content} : content);
} else {
const content = hyva.strf(message.type ? message.content : message, ruleOptions)
messages.push(message.type ? {type: message.type, content} : content);
}
}
});
return messages;
},
/** @deprecated */
getFieldWrapper(field) {
return this.getMessageContainer(field)
},
getMessageContainer(field) {
let container;
const pageSelector = field.element.getAttribute('data-validation-container') || options.pageMessagesContainerSelector;
if (pageSelector) {
container = document.querySelector(pageSelector)
|| containerNotFound(pageSelector, field.element)
} else {
const containerSelector = classNamesToSelector(options.fieldWrapperClassName);
container = field.element.closest(containerSelector)
|| createMessageContainer(field.element, options.fieldWrapperClassName)
|| containerNotFound(containerSelector, field.element);
}
return container;
},
showFieldState(field) {
const container = this.getMessageContainer(field),
hasErrorMessages = hasMessagesWrapper.call(this, field, options.messagesWrapperClassName),
messages = this.getMessagesByField(field).map(m => {
return m.type !== 'html' ? escapeHtml(m.type ? m.content : m) : m.content;
});
container.classList.toggle(options.validClassName, field.state.valid && ! hasErrorMessages);
container.classList.toggle(options.invalidClassName, !field.state.valid || hasErrorMessages);
this.createHtmlErrorMessage(field, messages);
if (field.state.valid) {
field.element.removeAttribute('aria-invalid');
} else {
field.element.setAttribute('aria-invalid', 'true');
if (! document.activeElement) {
field.element.focus();
}
}
},
removeMessages(field, messagesClass) {
if (! hasMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName)) {
return;
}
const msgWrapper = getMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName);
const messages = msgWrapper.querySelectorAll(`[data-msg-field='${field.element.name}']`);
Array.from(messages).forEach(msg => msg.remove());
if (msgWrapper && msgWrapper.childElementCount === 0) {
field.element.removeAttribute('aria-errormessage');
field.element.removeAttribute('aria-describedby');
msgWrapper.remove();
}
},
createErrorMessage(field, messages) {
const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
this.createHtmlErrorMessage(field, htmlMessages);
},
createHtmlErrorMessage(field, messages) {
this.removeMessages(field, options.messagesWrapperClassName);
field.element.removeAttribute('aria-errormessage');
field.element.removeAttribute('aria-describedby');
if (!field.state.valid) {
const msgWrapper = this.addHtmlMessages(field, options.messagesWrapperClassName, messages);
field.element.setAttribute('aria-errormessage', msgWrapper.id);
field.element.setAttribute('aria-describedby', msgWrapper.id);
}
},
/** @deprecated */
createMessage(field, message) {
return this.addMessages(field, options.messagesWrapperClassName, message);
},
addMessages(field, messagesClass, messages) {
const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
return this.addHtmlMessages(field, messagesClass, htmlMessages);
},
addHtmlMessages(field, messagesClass, htmlMessages) {
const msgWrapper = getMessagesWrapper.call(this, field, messagesClass);
(Array.isArray(htmlMessages) ? htmlMessages : [htmlMessages]).forEach((htmlMessage) => {
const li = document.createElement('li');
li.innerHTML = htmlMessage;
li.setAttribute('data-msg-field', field.element.name);
msgWrapper.appendChild(li);
});
return msgWrapper;
},
setField(name, value) {
this.fields[name].element.value = value;
this.fields[name].element.dispatchEvent((new Event('input')));
this.validateField(this.fields[name]);
}
}
}
hyva.formValidation = formValidation;
hyva.formValidation.rules = formValidationRules;
hyva.formValidation.setInputAttributeRuleName = (attrName, ruleName) => INPUT_ATTRIBUTE_RULES[attrName] = ruleName || attrName;
hyva.formValidation.setInputTypeRuleName = (typeName, ruleName) => INPUT_TYPE_RULES[typeName] = ruleName || typeName;
hyva.formValidation.addRule = (name, validator) => formValidationRules[name] = validator;
}(window.hyva = window.hyva || {}));
</script><script>
!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():t.autoComplt=t.returnExports=e()}(this,function(){"use strict";Array.prototype.indexOf||(Array.prototype.indexOf=function(t,e){if(void 0===this||null===this)throw new TypeError('"this" is null or not defined');var o=this.length>>>0;for(e=+e||0,Math.abs(e)===1/0&&(e=0),0>e&&(e+=o,0>e&&(e=0));o>e;e++)if(this[e]===t)return e;return-1});var t=function(){var t=-1;if("Microsoft Internet Explorer"==navigator.appName){var e=navigator.userAgent,o=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");null!=o.exec(e)&&(t=+RegExp.$1)}return-1===t?NaN:t},e=function(){var e=window.navigator.userAgent.toLowerCase();return e.search(/mobile|windows phone/)>=0?i.modeMobile:t()<=9?i.modePC:o().windowWidth>i.modeMobileW?i.modePC:i.modeMobile},o=function(){return window.innerWidth?{windowWidth:window.innerWidth,windowHeight:window.innerHeight}:document.documentElement.offsetHeight?{windowWidth:document.documentElement.offsetWidth,windowHeight:document.documentElement.offsetHeight}:document.body.offsetHeight?{windowWidth:document.body.offsetWidth,windowHeight:document.body.offsetHeight}:document.documentElement.clientHeight?{windowWidth:document.documentElement.clientWidth,windowHeight:document.documentElement.clientHeight}:document.body.clientHeight?{windowWidth:document.body.clientWidth,windowHeight:document.body.clientHeight}:{windowWidth:-1,windowHeight:-1}},i=function(t){return i=t,t.modePC="modePC",t.modeMobile="modeMobile",t.modeMobileW=768,t.autoCompltListClass="autoComplt-list",t.autoCompltHintClass="autoComplt-hint",t.autoCompltHintSelectedClass="autoComplt-hint-selected",t.maxHintNum=e()===i.modePC?10:5,t.autoCompltDelay=250,t.hiddenArg_close_list_n_make_final_selection="hiddenArg_close_list_n_make_final_selection",t.listStatus={attr:"data-listStatus",open:"open"},t.keyCode={up:38,down:40,esc:27,enter:13},t.defaultStyles={autoCompltList:{maxHeight:"none",border:"1px solid #aaa",padding:"0",margin:"0",zIndex:99,overflowX:"hidden",overflowY:"auto",display:"none",position:"absolute",backgroundColor:"#fff"},autoCompltHint:{height:"1.5em",padding:e()===i.modePC?"2px 6px 2px 10px":"6px 6px 6px 10px",margin:"6px 0",overflow:"hidden",listStyleType:"none",color:"#000",backgroundColor:"#fff",cursor:"default",fontSize:"1em"},autoCompltHintSelected:{color:"#fff",backgroundColor:"#3399ff"}},t.adjStyleAttrs={autoCompltList:["border","maxHeight","backgroundColor"],autoCompltHint:["height","padding","margin","color","backgroundColor","fontSize"],autoCompltHintSelected:["color","backgroundColor"]},t.listenersSupported=["select"],i}({}),n=function(t){return t||(t=window.event),t.target||(t.target=t.srcElement),t.stopBubble=function(){this.cancelBubble=!0,this.stopPropoagation&&this.stopPropoagation()},t.stopDefault=function(){return this.preventDefault&&this.preventDefault(),this.returnValue=!1,!1},t},l=function(t,e,o){t.addEventListener?t.addEventListener(e,o):t.attachEvent&&t.attachEvent("on"+e,o)},s=function(t,e,o){t.removeEventListener?t.removeEventListener(e,o):t.detachEvent&&t.detachEvent("on"+e,o)},u=function(t,e){var o=null;if(window.getComputedStyle)o=window.getComputedStyle(t)[e]||null;else if(t.currentStyle){o=t.currentStyle&&t.currentStyle[e];var i,n,l=t.style;null==o&&l&&l[e]&&(o=l[e]),i=l.left,n=t.runtimeStyle&&t.runtimeStyle.left,n&&(t.runtimeStyle.left=t.currentStyle.left),l.left="fontSize"===e?"1em":o,o=l.pixelLeft+"px",l.left=i,n&&(t.runtimeStyle.left=n)}return o},a={buildElem:function(t){var e=document.createElement("DIV");return e.innerHTML=t,e.firstChild.cloneNode(!0)},buildHint:function(t,e){return"string"==typeof t&&t?(t=this.buildElem('<li class="'+i.autoCompltHintClass+'">'+t+"</li>"),t.style.height=t.style.lineHeight=e.autoCompltHint.height,t.style.padding=e.autoCompltHint.padding,t.style.margin=e.autoCompltHint.margin,t.style.overflow=e.autoCompltHint.overflow,t.style.listStyleType=e.autoCompltHint.listStyleType,t.style.color=e.autoCompltHint.color,t.style.backgroundColor=e.autoCompltHint.backgroundColor,t.style.cursor=e.autoCompltHint.cursor,t.style.fontSize=e.autoCompltHint.fontSize,t):null},buildList:function(t){var e=this.buildElem('<ul class="'+i.autoCompltListClass+'"></ul>');return e.style.maxHeight=t.autoCompltList.maxHeight,e.style.border=t.autoCompltList.border,e.style.padding=t.autoCompltList.padding,e.style.margin=t.autoCompltList.margin,e.style.zIndex=t.autoCompltList.zIndex,e.style.overflowX=t.autoCompltList.overflowX,e.style.overflowY=t.autoCompltList.overflowY,e.style.display=t.autoCompltList.display,e.style.position=t.autoCompltList.position,e.style.backgroundColor=t.autoCompltList.backgroundColor,e}},r=function(t){this.uiElem=null,this.assocInput=t,this.mouseOnList=!1,this.onMouseSelectionListener=null,this.maxHintNum=i.maxHintNum,this.styles=JSON.parse(JSON.stringify(i.defaultStyles))};r.prototype.genList=function(){if(!this.uiElem){var t=this;this.uiElem=a.buildList(this.styles),l(this.uiElem,"mouseover",function(e){e=n(e),t.isHint(e.target)&&(t.pick(e.target),t.autoScroll())}),l(this.uiElem,"mouseout",function(e){t.unpick()}),l(this.uiElem,"mousedown",function(e){t.mouseOnList=!0,setTimeout(function(){t.assocInput.focus()},50)}),l(this.uiElem,"mouseup",function(e){e=n(e),t.isHint(e.target)&&(t.pick(e.target),"function"==typeof t.onMouseSelectionListener&&t.onMouseSelectionListener())}),document.body.appendChild(this.uiElem)}},r.prototype.isHint=function(t){if(t&&"object"==typeof t&&1===t.nodeType){var e=" "+t.className+" ";return e.indexOf(" "+i.autoCompltHintClass+" ")>=0}return!1},r.prototype.putHints=function(t){var e=0;if(t instanceof Array){var o,i,n=[];for(i=Math.min(t.length,this.maxHintNum),o=0;i>o;o++)n.push(a.buildHint(t[o],this.styles)),n[n.length-1]||n.pop();if(n.length>0){var l=document.createDocumentFragment();for(o=0,e=n.length;e>o;o++)l.appendChild(n[o]);this.clearHints(),this.genList(),this.uiElem.appendChild(l)}}return e},r.prototype.clearHints=function(){this.uiElem&&(this.uiElem.innerHTML="")},r.prototype.isOpen=function(){return this.uiElem?this.uiElem.getAttribute(i.listStatus.attr)==i.listStatus.open:!1},r.prototype.open=function(){var t;if(this.uiElem&&(t=this.uiElem.querySelectorAll("."+i.autoCompltHintClass))&&t.length){var e,o;for(o=this.assocInput.getBoundingClientRect(),this.uiElem.style.top=(document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)+o.bottom+"px",this.uiElem.style.left=o.left+"px",o=o.right-o.left-parseFloat(u(this.uiElem,"borderLeftWidth"))-parseFloat(u(this.uiElem,"borderRightWidth")),this.uiElem.style.width=o+"px",e=0,o=0;e<t.length;e++)o+=parseFloat(u(t[e],"height"))+parseFloat(u(t[e],"paddingTop"))+parseFloat(u(t[e],"paddingBottom")),t[e+1]&&(o+=Math.max(parseFloat(u(t[e],"marginBottom")),parseFloat(u(t[e+1],"marginTop"))));o+=parseFloat(u(t[0],"marginTop"))+parseFloat(u(t[t.length-1],"marginBottom")),this.uiElem.style.height=o+1+"px",this.uiElem.setAttribute(i.listStatus.attr,i.listStatus.open),this.uiElem.style.display="block"}},r.prototype.close=function(){this.uiElem&&(this.mouseOnList=!1,this.uiElem.parentNode.removeChild(this.uiElem),this.uiElem=null)},r.prototype.autoScroll=function(){var t=this.getPicked();if(t){var e,o=0,i=0,n=t.clientHeight,l=parseFloat(u(t,"marginTop")),s=parseFloat(u(t,"marginBottom"));for(e=t.previousSibling,i=n+(e?Math.max(l,s):l);e;)o+=n,e=e.previousSibling,o+=e?Math.max(l,s):l;(this.uiElem.clientHeight+this.uiElem.scrollTop-o<i||o-this.uiElem.scrollTop<i)&&(this.uiElem.scrollTop=o)}},r.prototype.pick=function(t){if(this.uiElem){var e=null;if(this.isHint(t))e=t;else if("number"==typeof t&&(t>=0||-1===t)){var o=this.uiElem.querySelectorAll("."+i.autoCompltHintClass);o.length>0&&(e=+t,e=-1===e||e>o.length-1?o.length-1:e,e=o[e])}null!==e&&(this.unpick(),e.className+=" "+i.autoCompltHintSelectedClass,e.style.color=this.styles.autoCompltHintSelected.color,e.style.backgroundColor=this.styles.autoCompltHintSelected.backgroundColor)}},r.prototype.unpick=function(){if(this.uiElem){var t=this.getPicked();t&&(t.className=i.autoCompltHintClass,t.style.color=this.styles.autoCompltHint.color,t.style.backgroundColor=this.styles.autoCompltHint.backgroundColor)}},r.prototype.getPicked=function(){return this.uiElem?this.uiElem.querySelector("."+i.autoCompltHintSelectedClass)||null:null};var c={enable:function(t,o){if(t&&"object"==typeof t&&"string"==typeof t.tagName&&"input"==t.tagName.toLowerCase()&&"text"==t.type&&1===t.nodeType&&!t.autoComplt){t.autoComplt={};var u=i.autoCompltDelay,a=!0,c="",p=null,m=null,d=new r(t),f=function(){if(t.value.length>0&&a&&"function"==typeof p&&c!==t.value){var e={that:t,compltTarget:c=t.value,compltTargetMatchCurrentTarget:function(){return e.compltTarget===c},call:function(){e.compltTargetMatchCurrentTarget()&&p.call(e.that,e.compltTarget,e.openHint)},openHint:function(t){e.compltTargetMatchCurrentTarget()&&(d.putHints(t)?d.open():e.that.autoComplt.close())}};setTimeout(e.call,u)}},h=function(){if(a){var e=d.getPicked();e?t.value=e.innerHTML:t.value=c}},y=function(e){d.mouseOnList?(t.focus(),d.mouseOnList=!1):d.isOpen()&&t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection)},g=function(o){if(e()!==i.modeMobile&&(o=n(o),a))if("keydown"!=o.type||!d.isOpen()||o.keyCode!==i.keyCode.up&&o.keyCode!==i.keyCode.down){if("keyup"==o.type){var l=!1;switch(o.keyCode){case i.keyCode.up:case i.keyCode.down:d.isOpen()||(l=!0);break;case i.keyCode.esc:d.isOpen()&&(t.value=c,t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection));break;case i.keyCode.enter:d.isOpen()&&(h(),t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection));break;default:l=!0}l&&(t.value.length>0?f():t.autoComplt.close())}}else{var s=d.getPicked();o.keyCode===i.keyCode.up?s?s.previousSibling?d.pick(s.previousSibling):d.unpick():d.pick(-1):o.keyCode===i.keyCode.down&&(s?s.nextSibling?d.pick(s.nextSibling):d.unpick():d.pick(0)),d.autoScroll(),h()}},C=function(o){e()!==i.modePC&&(t.value.length>0?f():t.autoComplt.close())},H=function(e){null!=m&&"function"==typeof m[e]&&m[e].call(t)};return t.autoComplt.setHintsFetcher=function(t){return null===t||"function"==typeof t?(p=t,!0):!1},t.autoComplt.setListener=function(t,e){return(null===e||"function"==typeof e)&&i.listenersSupported.indexOf(t)>=0?(null==m&&(m={}),m[t]=e,!0):!1},t.autoComplt.setStyles=function(t,e){var o,n,l=!1;switch(t){case i.autoCompltListClass:o=d.styles.autoCompltList,n=i.adjStyleAttrs.autoCompltList;break;case i.autoCompltHintClass:o=d.styles.autoCompltHint,n=i.adjStyleAttrs.autoCompltHint;break;case i.autoCompltHintSelectedClass:o=d.styles.autoCompltHintSelected,n=i.adjStyleAttrs.autoCompltHintSelected}if(e instanceof Object&&o&&n)for(var s=0;s<n.length;s++)("string"==typeof e[n[s]]||"number"==typeof e[n[s]])&&(l||(l={}),l[n[s]]=o[n[s]]=e[n[s]]);return l},t.autoComplt.config=function(t){var e=!1;if(t instanceof Object){var o;void 0!==t.delay&&(o=Math.floor(t.delay))>0&&(e||(e={}),u=e.delay=o),void 0!==t.maxHintNum&&(o=Math.floor(t.maxHintNum))>0&&(e||(e={}),d.maxHintNum=e.maxHintNum=o)}return e},t.autoComplt.close=function(){c="",d.close(),a&&""!==t.value&&arguments[0]===i.hiddenArg_close_list_n_make_final_selection&&H("select")},t.autoComplt.enable=function(){a=!0},t.autoComplt.disable=function(){a=!1,this.close()},t.autoComplt.destroy=function(){s(t,"blur",y),s(t,"keyup",g),s(t,"keydown",g),this.disable(),delete t.autoComplt},d.onMouseSelectionListener=function(){h(),t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection)},l(t,"blur",y),l(t,"keyup",g),l(t,"keydown",g),l(t,"input",C),o instanceof Object&&(t.autoComplt.config(o),t.autoComplt.setHintsFetcher(o.hintsFetcher)),t}return null}};return c});</script><div class="page-wrapper"> <div class="header-banner hidden mx-auto max-w-layout_max_width relative w-full">
<style>#html-body [data-pb-style=JG5G87X]{justify-content:flex-start;display:flex;flex-direction:column;background-color:#99a47e;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=QK4L2OB]{min-height:50px}#html-body [data-pb-style=PQ0O6FQ]{background-position:center center;background-size:cover;background-repeat:no-repeat;text-align:center;min-height:0}#html-body [data-pb-style=UFO6SE3]{min-height:0;padding-top:0;padding-bottom:0;background-color:transparent}#html-body [data-pb-style=US2UI24]{background-color:#fdd179;background-position:center center;background-size:cover;background-repeat:no-repeat;text-align:center;min-height:0}#html-body [data-pb-style=Q1W69WJ]{min-height:0;padding-top:0;padding-bottom:0;background-color:transparent}#html-body [data-pb-style=JNU9AIS],#html-body [data-pb-style=TH8YQBN]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=TH8YQBN]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=JNU9AIS]{align-self:stretch}#html-body [data-pb-style=VN8U36E]{display:flex;width:100%}#html-body [data-pb-style=HDI6W1K]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:50%;align-self:stretch}#html-body [data-pb-style=FT42HUI]{display:inline-block}#html-body [data-pb-style=L1LHSRF]{text-align:center}#html-body [data-pb-style=XXV6NOH]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:50%;align-self:stretch}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div class="panelTrigger" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="inner" data-pb-style="JG5G87X"><div class="pagebuilder-slider banner" data-content-type="slider" data-appearance="default" data-autoplay="true" data-autoplay-speed="4000" data-fade="true" data-infinite-loop="true" data-show-arrows="false" data-show-dots="false" data-element="main" data-pb-style="QK4L2OB"><div data-content-type="slide" data-slide-name="" data-appearance="poster" data-show-button="never" data-show-overlay="never" data-element="main"><div data-element="empty_link"><div class="pagebuilder-slide-wrapper background-image-69b8dc69bc3e6" data-background-images='{\"desktop_image\":\"https://www.modyf.fr/media/catalog/category/N1-Printemps.jpg\"}' data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="wrapper" data-pb-style="PQ0O6FQ"><div class="pagebuilder-overlay pagebuilder-poster-overlay" data-overlay-color="" aria-label="" title="" data-element="overlay" data-pb-style="UFO6SE3"><div class="pagebuilder-poster-content"><div data-element="content"><p class="p1"><span style="color: #fff;">Offres exclusives sur sélection de Printemps<span class="desktop"> jusqu'au 31 mars</span></span></p></div></div></div></div><style type="text/css">.webp-supported .background-image-69b8dc69bc3e6 {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/catalog/category/N1-Printemps.webp);} .no-webp .background-image-69b8dc69bc3e6 {background-image: url(https://www.modyf.fr/media/catalog/category/N1-Printemps.jpg);}</style></div></div><div data-content-type="slide" data-slide-name="" data-appearance="poster" data-show-button="never" data-show-overlay="never" data-element="main"><div data-element="empty_link"><div class="pagebuilder-slide-wrapper" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-element="wrapper" data-pb-style="US2UI24"><div class="pagebuilder-overlay pagebuilder-poster-overlay" data-overlay-color="" aria-label="" title="" data-element="overlay" data-pb-style="Q1W69WJ"><div class="pagebuilder-poster-content"><div data-element="content"><p class="p2"><span style="color: #000;">Livraison offerte pour toute commande !</span></p></div></div></div></div></div></div></div></div></div><div data-content-type="row" data-appearance="contained" data-element="main"><div class="ppanel" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="TH8YQBN"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="JNU9AIS"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="VN8U36E"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="HDI6W1K"><div data-content-type="text" data-appearance="default" data-element="main"><p class="panelTitle">L'offre du moment :</p>
<p>Offres exclusives sur sélection de Printemps jusqu'au 31 mars</p></div><div data-content-type="buttons" data-appearance="inline" data-same-width="false" data-element="main"><div data-content-type="button-item" data-appearance="default" data-element="main" data-pb-style="FT42HUI"><a class="pagebuilder-button-primary" href="/selection-printemps" target="" data-link-type="default" data-element="link" data-pb-style="L1LHSRF"><span data-element="link_text">Voir la sélection</span></a></div></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="XXV6NOH"><div data-content-type="text" data-appearance="default" data-element="main"><p class="panelTitle">Livraison offerte</p>
<p>Profitez de la livraison offerte sur toutes vos commandes (hors TNT Express) !</p></div></div></div></div></div></div><div class="white" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
/*.cms-home .banner, .cms-home .header-banner{ display: none!important; }*/
.slick-initialized.slick-slider.banner .slick-prev, .slick-initialized.slick-slider.banner .slick-next{
height: 40px;
width: 40px;
background: none;
}
.banner .pagebuilder-slide-wrapper [data-element=content]{
display: flex; align-items: center; justify-content: center;
}
.banner p{
margin-bottom: 0;
display: flex;
align-items: center;
}
.banner p::after{
content:"";
height: 16px;
width: 16px;
margin-left: 10px;
transition: 0.3s;
}
.banner img{display: inline!important;}
.banner.open p::after{transform: rotate(180deg);}
.banner p.p1::after{
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Calque_1' x='0px' y='0px' viewBox='0 0 20 17.1' style='enable-background:new 0 0 20 17.1;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23ffffff;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M10,8.3l5.6-4l2.2,3.2L10,12.9L2.3,7.5l2.3-3.3L10,8.3z'/%3E%3C/g%3E%3C/svg%3E");
}
.banner p.p2::after{
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Calque_1' x='0px' y='0px' viewBox='0 0 20 17.1' style='enable-background:new 0 0 20 17.1;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23000000;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M10,8.3l5.6-4l2.2,3.2L10,12.9L2.3,7.5l2.3-3.3L10,8.3z'/%3E%3C/g%3E%3C/svg%3E");
}
.banner p a{ text-decoration: underline; }
.banner p.p3::after{
background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_2056_310)'%3E%3Cpath d='M3.29297 12H18.293' stroke='white' stroke-width='2' stroke-miterlimit='10'/%3E%3Cpath d='M14.293 17L19.293 12L14.293 6.99997' stroke='white' stroke-width='2' stroke-miterlimit='10'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_2056_310'%3E%3Crect width='17.414' height='11.414' fill='white' transform='translate(3.29297 6.29297)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
background-position: center;
height: 24px;
width: 24px;
}
.panelTrigger{ cursor: pointer; color: inherit; }
.ppanel{
background-color: #ffffff;
position: absolute;
top: 50px;
width: 100%;
z-index: 999;
box-shadow: 0 7px 15px #00000014;
max-height: 0;
overflow: hidden;
transition: 0.5s ease-out;
display: flex;
align-items: center;
flex-direction: row!important;
justify-content: center!important;
}
.ppanel p{ line-height: normal;}
.ppanel p.panelTitle{ text-transform: uppercase; font-family: "wuerthbold", sans-serif; font-size: 14px;}
.ppanel.open{ max-height: 500px; }
.ppanel .pagebuilder-column-group{ max-width: 1500px; }
.ppanel .pagebuilder-column{ padding: 34px; }
.header-banner .close-banner{
background-color: #1c2933;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='%23dcdfe4' stroke-width='2'%3E%3Cpath d='M6 18L18 6M18 18L6 6'/%3E%3C/g%3E%3C/svg%3E");
}
#closePanel{
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Calque_1' x='0px' y='0px' viewBox='0 0 20 17.1' style='enable-background:new 0 0 20 17.1;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23000000;%7D%0A%3C/style%3E%3Cg%3E%3Cpath class='st0' d='M10,8.3l5.6-4l2.2,3.2L10,12.9L2.3,7.5l2.3-3.3L10,8.3z'/%3E%3C/g%3E%3C/svg%3E");
transform: rotate(180deg);
height: 16px;
width: 16px;
position: absolute;
top: 20px;
right: 20px;
cursor: pointer;
}
@media screen and (max-width: 768px) {
.banner p{ display: block; line-height: 19px;}
.ppanel .pagebuilder-column-line{ flex-flow: column; }
.ppanel .pagebuilder-column-line .pagebuilder-column{ width: 100%!important; }
}
</style>
<script>
var panelTriggers = document.querySelectorAll(".panelTrigger");
var accpanel = document.querySelector(".header-banner .ppanel");
var banner = document.querySelector(".banner");
document.addEventListener("DOMContentLoaded", function () {
panelTriggers.forEach(trigger => {
trigger.addEventListener('click', function(event) {
accpanel.classList.toggle('open');
banner.classList.toggle('open');
console.log(accpanel.classList);
});
});
if(document.getElementById("closePanel")){
document.getElementById("closePanel").addEventListener('click', function(event) {
accpanel.classList.toggle('open');
banner.classList.toggle('open');
});
}
});
</script>
<!--script>
(function () {
var countlb = new Date("Mar 02, 2025 23:59:59").getTime();
var x = setInterval(function () {
var now = new Date().getTime();
var distance = countlb - now;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
if(seconds == 1) document.querySelector(".countdownContainer #ss").classList.remove("plural");
else document.querySelector(".countdownContainer #ss").classList.add("plural");
if(hours == 1) document.querySelector(".countdownContainer #hh").classList.remove("plural");
else document.querySelector(".countdownContainer #hh").classList.add("plural");
if(minutes == 1) document.querySelector("#mm").classList.remove("plural");
else document.querySelector(".countdownContainer #mm").classList.add("plural");
if(days == 1) document.querySelector(".countdownContainer #jj").classList.remove("plural");
else document.querySelector(".countdownContainer #jj").classList.add("plural");
if(days == 0){
document.querySelector(".countdownContainer #jj").style.display="none";
}
document.querySelector(".countdownContainer #jj .number").innerHTML = days;
document.querySelector(".countdownContainer #hh .number").innerHTML = hours;
document.querySelector(".countdownContainer #mm .number").innerHTML = minutes;
document.querySelector(".countdownContainer #ss .number").innerHTML = seconds;
document.querySelector(".countdownContainer").classList.remove("inactif");
if (distance < 0) {
clearInterval(x);
document.querySelector(".countdownContainer").classList.add("inactif");
}
}, 1000);
})();
</script--></div> <span class="close-banner svg-icon-mixin svg-icon__cross__mixin cursor-pointer absolute right-[16px] top-1/2 translate-y-[-50%]"></span>
</div>
<script>
let headerBanner = document.querySelector('.header-banner');
if (!hyva.getCookie('hide_header_banner')) {
headerBanner.style.display = 'block';
}
document.querySelector('.close-banner').addEventListener('click', function() {
headerBanner.style.display = 'none';
hyva.setCookie('hide_header_banner', true, { domain: '' });
});
</script>
<div class="header-top-links desktop"><style>#html-body [data-pb-style=BTB1T1J],#html-body [data-pb-style=FENXTM8]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=FENXTM8]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=BTB1T1J]{align-self:stretch}#html-body [data-pb-style=PNYA1VB]{display:flex;width:100%}#html-body [data-pb-style=IY3QG2L],#html-body [data-pb-style=S3EJKTI]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:50%;align-self:stretch}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="FENXTM8"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.header-top-links.desktop{max-height:40px;}
body .header-top-links p{margin-bottom:0}body .header-top-links p span.atc{font-family:WuerthBold,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;line-height:16px;color:#000;text-transform:uppercase;text-decoration:none}
body#html-body .header-top-links .pagebuilder-column.left, body#html-body .header-top-links .pagebuilder-column.right{
padding: 0px;
width: auto;
}
body#html-body .header-top-links .pagebuilder-column.left{display:none;}
@media (min-width: 1600px) {
body#html-body .header-top-links .pagebuilder-column.left{display:flex;}
}
body#html-body .header-top-links .pagebuilder-column-line, body#html-body .header-top-links .pagebuilder-column-group{
justify-content: space-between;
}
body#html-body .header-top-links .pagebuilder-column.left p{
text-align: left;
text-transform: uppercase;
font-size: 14px;
color: black;
}
body .header-top-links p span.atc.bg{
color: #fff;
position: relative;
z-index: 2;
}
body .header-top-links p span.atc.bg::before{
display: block;
content: "";
position: absolute;
width: 100%;
background: #cc0000;
height: 100%;
padding: 5px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1;
mix-blend-mode: color;
}
body#html-body .header-top-links .pagebuilder-column.left p strong{
font-family: WuerthBold,"Helvetica Neue",Helvetica,Arial,sans-serif;;
}
.persoBG span, .redBG span{
position: relative;
color: #fff;
}
.persoBG span em, .redBG span em{
position: relative;
z-index: 2;
color: #fff;
}
.persoBG span em::before, .redBG span em::before{
display: inline-block;
vertical-align: bottom;
content:"";
margin-right: 5px;
width: 20px;
height: 28px;
background-position: center;
background-repeat: no-repeat;
background-size: contain;
background-image: url("data:image/svg+xml,%3Csvg width='33' height='34' viewBox='0 0 33 34' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1447_4015)'%3E%3Cpath d='M16.1278 3.96197L8.9993 5.87205C8.03373 6.13078 7.46071 7.12327 7.71944 8.08884L13.5118 29.7063C13.7705 30.6718 14.763 31.2448 15.7286 30.9861L22.8571 29.076C23.8227 28.8173 24.3957 27.8248 24.137 26.8593L18.3446 5.24183C18.0859 4.27626 17.0934 3.70324 16.1278 3.96197Z' fill='%231D1D1B' stroke='white' stroke-miterlimit='10'/%3E%3Cpath d='M18.5945 6.40681L8.08524 9.22276C7.11967 9.48149 6.54665 10.474 6.80538 11.4395L11.0448 27.2614C11.3036 28.227 12.296 28.8 13.2616 28.5413L23.7709 25.7253C24.7365 25.4666 25.3095 24.4741 25.0508 23.5085L20.8113 7.68667C20.5526 6.7211 19.5601 6.14808 18.5945 6.40681Z' fill='%231D1D1B' stroke='white' stroke-miterlimit='10'/%3E%3Cpath d='M7.02295 12.2509L21.0289 8.49804' stroke='white' stroke-miterlimit='10'/%3E%3Cpath d='M7.79932 15.1487L21.8052 11.3958' stroke='white' stroke-miterlimit='10'/%3E%3Cpath d='M10.9053 26.7398L24.9112 22.9869' stroke='white' stroke-miterlimit='10'/%3E%3Cpath d='M24.5262 1.69091C25.7265 2.38387 26.1354 3.91004 25.4425 5.11029C24.7495 6.31054 8.39697 31.6358 7.95865 31.3909C7.52033 31.146 20.4236 3.80479 21.1165 2.60454C21.8095 1.40429 23.3357 0.995355 24.5359 1.68832L24.5262 1.69091Z' fill='%231D1D1B' stroke='white' stroke-miterlimit='10' stroke-linecap='square'/%3E%3Cpath d='M21.9826 14.2989L9.42554 17.6635L11.1079 23.942L23.6649 20.5774L21.9826 14.2989Z' fill='%231D1D1B'/%3E%3Cpath d='M10.1287 23.842L24.1346 20.0892' stroke='white' stroke-miterlimit='10'/%3E%3Cpath d='M23.1764 16.0495C31.7538 13.7512 22.9683 3.68198 22.9683 3.68198' stroke='white' stroke-miterlimit='10' stroke-linecap='round'/%3E%3Cpath d='M8.57568 18.0465L22.5816 14.2936' stroke='white' stroke-miterlimit='10'/%3E%3Cpath d='M9.35229 20.9443L23.3582 17.1914' stroke='white' stroke-miterlimit='10'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1447_4015'%3E%3Crect width='25.43' height='27.75' fill='white' transform='translate(0.842041 6.76367) rotate(-15)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
}
.redBG span em::before{
display: none;
}
.persoBG span::after,.redBG span::after{
content: "";
z-index: 1;
position: absolute;
top: 0;
display: block;
width: calc(100% + 40px);
height: calc(100% + 24px);
transform: translate(-20px, -14px);
background: #1D1D1B;
}
.redBG span::after{
background: #cc0000;
}
body .header-top-links p.noafter::after{
content:"";
}
@media screen and (max-width: 1600px) {
body#html-body .header-top-links .pagebuilder-column.left p span.s2{display:none;}
body#html-body .header-top-links .pagebuilder-column.right{width:100%;}
}
@media screen and (max-width: 1300px) {
body#html-body .header-top-links .pagebuilder-column.left p span{display:none;}
body .header-top-links p:not(:last-child):after{ margin: 0 0.5vw; }
}
</style></div><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="BTB1T1J"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="PNYA1VB"><div class="pagebuilder-column left" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="S3EJKTI"><div data-content-type="text" data-appearance="default" data-element="main"><p class="text-[14px]"><span class="s1">Vêtements <span class="s2">de travail </span></span>pour <strong>professionnels</strong>, <strong>collectivités</strong> et <strong>particuliers</strong></p></div></div><div class="pagebuilder-column right" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="IY3QG2L"><div data-content-type="text" data-appearance="default" data-element="main"><!--p class="redBG noafter"><span class="atc" data-atc="L2RlbWFuZGUtZGUtY2F0YWxvZ3Vl"><em>Catalogue 2025 - 2026</em></span></p-->
<p><span class="atc" data-atc="L2RlbWFuZGUtZGUtY2F0YWxvZ3Vl">Catalogue 2025 - 2026</span></p>
<p><span class="atc" data-atc="L2dyYW5kcy1jb21wdGVz">Grands Comptes</span></p>
<p><span class="atc" data-atc="L3BlcnNvbm5hbGlzYXRpb24=">Personnalisation</span></p>
<p><span class="atc" data-atc="L25ld3NsZXR0ZXI=">Newsletter -10€</span></p>
<p><span class="atc" data-atc="L25vdXMtY29udGFjdGVy">Contact</span></p>
<p><span class="atc" data-atc="L2VudHJlcHJpc2U=">Entreprise</span></p>
<p><span class="atc" data-atc="aHR0cHM6Ly9ibG9nLm1vZHlmLmZy" data-target="_blank">Blog</span></p></div></div></div></div></div></div></div><header class="page-header"><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white contentarea"
href="#contentarea">
<span>
Aller au contenu </span>
</a><div class="header content"> </div><script>
function initHeader () {
return {
searchOpen: false,
cart: {},
isCartOpen: false,
getData(data) {
if (data.cart) { this.cart = data.cart }
},
isCartEmpty() {
return !this.cart.summary_count
},
toggleCart(event) {
if (event.detail && event.detail.isOpen !== undefined) {
this.isCartOpen = event.detail.isOpen
} else {
this.isCartOpen = true
}
}
}
}
function initCompareHeader() {
return {
compareProducts: null,
itemCount: 0,
receiveCompareData(data) {
if (data['compare-products']) {
this.compareProducts = data['compare-products'];
this.itemCount = this.compareProducts.count;
}
}
}
}
</script>
<div id="header"
class="relative z-30 w-full"
x-data="initHeader()"
@private-content-loaded.window="getData(event.detail.data)"
>
<div class="w-full mx-auto mt-0 pt-[13px] px-[20px] pb-[10px] relative max-w-layout_max_width mobile_tablet:flex mobile_tablet:flex-wrap mobile_tablet:items-center mobile_tablet:justify-between desktop:flex-nowrap desktop:pt-[24px] desktop:pb-0 desktop:pr-[65px] desktop:pl-[251px] bg-modyf-white">
<!--Logo-->
<a class="logo z-[31] mobile_tablet:modyf-absolute-centering-horizontall-mixin top-[10px] desktop:order-none desktop:absolute desktop:left-[65px] desktop:top-0"
href="https://www.modyf.fr/"
title="Wurth MODYF.fr : vêtements de travail et chaussures de sécurité"
aria-label="store logo">
<img src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/wurth-modyf.svg" loading="lazy"
class="desktop shadow-modyf_box_shadow"
title="Wurth MODYF.fr : vêtements de travail et chaussures de sécurité"
alt="Wurth MODYF.fr : vêtements de travail et chaussures de sécurité"
width="152" height="206" />
<img src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/mobile/wurth-modyf.png" loading="lazy"
class="mobile-tablet"
title="Wurth MODYF.fr : vêtements de travail et chaussures de sécurité"
alt="Wurth MODYF.fr : vêtements de travail et chaussures de sécurité"
width="84" height="30" />
</a>
<div class="flex items-center gap-2 md:gap-1 order-3 desktop:justify-between">
<!--Search-->
<div class="absolute left-0 top-[99%] border-t shadow-sm bg-container-lighter border-container-lighter w-full desktop:!block desktop:static desktop:w-[calc(100%_-_370px)] mobile_tablet:z-[-1]"
id="search-content"
x-cloak x-show="searchOpen"
@click.outside="searchOpen = false"
@keydown.escape=" searchOpen = false; $refs.searchButton.focus();"
>
<script>
function initMiniSearchComponent() {
"use strict";
return {
show: false,
formSelector: "#search_mini_form",
url: "https\u003A\u002F\u002Fwww.modyf.fr\u002Fsearch\u002Fajax\u002Fsuggest\u002F",
destinationSelector: "#search_autocomplete",
templates: {"term":{"title":"Termes sugg\u00e9r\u00e9s","template":"Hyva_SmileElasticsuite::core\/autocomplete\/term.phtml"},"product":{"title":"Produits","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/product.phtml"},"category":{"title":"Cat\u00e9gories ","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/category.phtml"},"product_attribute":{"title":"Attributs","template":"Hyva_SmileElasticsuite::catalog\/autocomplete\/product_attribute.phtml","titleRenderer":"renderEsAutocompleteTitleAttribute"},"cms_page":{"title":"Informations","template":"Hyva_SmileElasticsuite::cms-search\/autocomplete\/cms.phtml"}},
priceFormat: {"pattern":"%s\u00a0\u20ac","precision":2,"requiredPrecision":2,"decimalSymbol":",","groupSymbol":"\u202f","groupLength":3,"integerRequired":false},
minSearchLength: 2,
searchResultsByType: {},
currentRequest: null,
productsCountTitle: 0,
/**
* Get search results.
*/
getSearchResults: function () {
let value = document.querySelector('#search').value.trim();
if (value.length < parseInt(this.minSearchLength, 10)) {
this.searchResultsByType = [];
this.show = false;
return false;
}
let url = this.url + '?' + new URLSearchParams({
q: document.querySelector('#search').value,
_: Date.now()
}).toString();
if (this.currentRequest !== null) {
this.currentRequest.abort();
}
this.currentRequest = new AbortController();
fetch(url, {
method: 'GET',
signal: this.currentRequest.signal,
}).then((response) => {
if (response.ok) {
return response.json();
}
}).then((data) => {
this.show = data.length > 0;
if (this.show) {
document.body.classList.add('search_autocomplete_show');
this.calcSearchAutocompleteWidth();
}
for (let element of data) {
if (element.type === 'num_products') {
this.productsCountTitle = element.count_title;
break;
}
}
this.searchResultsByType = data.reduce((acc, result) => {
if (! acc[result.type]) acc[result.type] = [];
acc[result.type].push(result);
return acc;
}, {});
}).catch((error) => {
;
});
},
/**
* Toggle list.
*/
toggleList(index) {
const element = document.querySelector('.search-result-' + index);
element.classList.toggle('mobile_tablet:hidden');
},
/**
* Calc search autocomplete width.
*/
calcSearchAutocompleteWidth() {
if (window.innerWidth > window.modyf.desktopMedia) {
let menuCartIcon = document.getElementById('menu-cart-icon'),
searchElement = document.getElementById('search'),
searchAutocomplete = document.getElementById('search_autocomplete'),
menuCartIconLeft = menuCartIcon.getBoundingClientRect().left,
menuCartIconWidth = menuCartIcon.offsetWidth,
searchLeft = searchElement.getBoundingClientRect().left,
searchAutocompleteWidth = menuCartIconLeft + menuCartIconWidth - searchLeft;
searchAutocomplete.style.width = searchAutocompleteWidth + 'px';
}
},
}
}
</script>
<div id="elasticsuite-search-container" class="text-black relative" x-show="true">
<div x-data="initMiniSearchComponent()" @click.away="show = false">
<div class="back-overlay"
x-show="searchOpen || show"
x-cloak=""
@click="searchOpen = false; show = false; document.body.classList.remove('search_autocomplete_show')">
</div>
<form class="form minisearch"
id="search_mini_form"
action="https://www.modyf.fr/catalogsearch/result/"
method="get"
role="search"
>
<div class="relative z-20">
<label class="sr-only" for="search">
Rechercher dans tout le magasin... </label>
<input id="search"
x-on:input.debounce="getSearchResults()"
x-ref="searchInput"
type="search"
class="w-full py-0 pr-[10px] pl-[59px] font-wuerth-bold text-modyf-darkest_grey2 bg-modyf-lightest_grey border-none placeholder-modyf-darkest_grey2 desktop:pr-[20px]"
autocapitalize="off" autocomplete="off" autocorrect="off"
name="q"
value=""
placeholder="Rechercher dans tout le magasin..."
maxlength="128"
@search-open.window.debounce.10=" $el.focus(); $el.select(); "
/>
<button type="submit"
title="Chercher"
class="action search absolute left-[24px] modyf-absolute-centering-verticall-mixin"
aria-label="Search"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="18" height="18" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
</svg>
</button>
</div>
<div id="search_autocomplete" class="search-autocomplete relative w-full mobile_tablet:!w-full" x-show="show" style="display:none;">
<div class="absolute bg-white z-50 w-full desktop:flex desktop:flex-wrap">
<button
@click.prevent="searchOpen = false; show = false;"
class="mobile_tablet:hidden absolute right-[23px] top-[23px] z-50"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px]" role="img"><g fill="none" fill-rule="evenodd" stroke="rgba(0,0,0,0.99)" stroke-width="2"><path d="M6 18L18 6M18 18L6 6"/></g><title>cross-black-icon</title></svg>
</button>
<div class="desktop:w-[40%]">
<div class="px-[20px] pt-[20px] pb-[16px] text-[16px] leading-[18px] text-modyf-darkest_grey uppercase desktop:mt-[21px] desktop:mb-[10px]">
<span class="font-wuerth-bold font-bold">Produits</span>
<span class="font-wuerth-book" x-text="productsCountTitle"></span>
</div>
<template x-for="searchResult in searchResultsByType.product">
<div class="hover:bg-gray-100">
<template x-if="searchResult.type == 'product'">
<a class="w-full block" :href="searchResult.url" :title="searchResult.title">
<div class="px-[20px] py-[2] mb-[5px] flex justify-start items-top desktop:py-[4px] desktop:mb-[16px]">
<div class="w-[90px] min-w-[90px] pr-[21px] box-content">
<img :src="searchResult.image" class="w-[89px] h-[67px]" />
</div>
<div>
<template x-if="searchResult.modyf_collection">
<span class="text-[11px] uppercase font-wuerth-bold text-modyf-darkest_grey bg-modyf-light_grey px-[10px] py-[5px] mb-[6px] tracking-[0.3px] inline-block"
x-html="searchResult.modyf_collection"></span>
</template>
<div class="text-[12px] desktop:text-[14px] font-wuerth-bold leading-[20px]"
x-text="searchResult.title">
</div>
<div class="mt-[10px]" x-html="searchResult.price"></div>
</div>
</div>
</a>
</template> </div>
</template>
</div>
<div class="desktop:w-[60%] desktop:flex desktop:flex-wrap">
<template x-for="searchResultByType in Object.values(searchResultsByType)">
<div class="desktop:w-[50%]"
:class="{ ['hidden']: searchResultByType[0].type === 'product' || searchResultByType[0].type === 'num_products'}">
<template x-if="searchResultByType[0].type !== 'product' && searchResultByType.hasOwnProperty(0) && templates[searchResultByType[0].type] && templates[searchResultByType[0].type].titleRenderer === undefined">
<div class="pl-[20px] pr-[45px] pt-[19px] text-[16px] leading-[18px] text-modyf-darkest_grey uppercase font-wuerth-bold font-bold mt-[11px] mb-[15px] relative desktop:mt-[21px] desktop:mb-[15px] desktop:p-[19px_11px_0]"
@click="toggleList(searchResultByType[0].type)">
<span x-text="templates[searchResultByType[0].type].title"></span>
<span class="absolute right-[20px] bottom-[2px] desktop:hidden">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 14 14" class="plus-icon w-[15px] h-[15px]" role="img"><path id="Rectangle" d="M0-.5H14v2H0Z" transform="translate(0 6.5)" fill="#c3c8c8"/><path id="Rectangle-2" data-name="Rectangle" d="M0-.5H14v2H0Z" transform="translate(7.5) rotate(90)" fill="#c3c8c8"/><title>plus-icon</title></svg>
</span>
</div>
</template>
<template x-if="searchResultByType[0].type !== 'product' && searchResultByType.hasOwnProperty(0) && templates[searchResultByType[0].type] && templates[searchResultByType[0].type].titleRenderer !== undefined">
<div class="pl-[20px] pr-[45px] pt-[19px] text-[16px] leading-[18px] text-modyf-darkest_grey uppercase font-wuerth-bold font-bold mt-[11px] mb-[15px]"
@click="toggleList(searchResultByType[0].type)">
<span x-text="templates[searchResultByType[0].type].title"></span>
<span class="absolute right-[20px] bottom-[2px] desktop:hidden">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 14 14" class="plus-icon w-[15px] h-[15px]" role="img"><path id="Rectangle_2" d="M0-.5H14v2H0Z" transform="translate(0 6.5)" fill="#c3c8c8"/><path id="Rectangle-2_2" data-name="Rectangle" d="M0-.5H14v2H0Z" transform="translate(7.5) rotate(90)" fill="#c3c8c8"/><title>plus-icon</title></svg>
</span>
</div>
</template>
<div :class="{ ['mobile_tablet:hidden search-result-' + searchResultByType[0].type]: searchResultByType[0].type !== 'product' }">
<template x-for="searchResult in searchResultByType">
<div class="hover:bg-gray-100">
<template x-if="searchResult.type == 'term'">
<a class="w-full block px-[20px] py-[6px] text-[16px] leading-[18px] desktop:px-[11px]"
x-bind:href="'https://www.modyf.fr/catalogsearch/result/?q=' + searchResult.title"
:title="searchResult.title">
<span x-text="searchResult.title"></span>
<span x-text="'(' + searchResult.num_results + ')'"></span>
</a>
</template>
<template x-if="searchResult.type == 'category'">
<a class="w-full block px-[20px] py-[6px] text-[16px] leading-[18px] desktop:px-[11px]"
:href="searchResult.url"
:title="searchResult.title">
<span x-text="searchResult.title"></span>
</a>
</template> <template x-if="searchResult.type == 'product_attribute'"><a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title"><span class="text-sm" x-text="searchResult.title"></span> <span class="text-xs uppercase text-gray-500" x-text="searchResult.attribute_label" style="vertical-align: super;"></span></a></template><script>
function renderEsAutocompleteTitleAttribute(data)
{
data = data.filter(function(item) {
return item.type === 'product_attribute';
}).map(function(item) {
return item['attribute_label']
}).reduce(function(prev, item) {
if (item in prev) {
prev[item]++;
} else {
prev[item] = 1;
}
return prev;
}, {});
data = Object.entries(data).sort(function(item1, item2) {
return item2[1] - item1[1]
}).map(function(item) {return item[0]});
if (data.length > 2) {
data = data.slice(0, 2);
data.push('...');
}
return data.join(', ');
}</script>
<template x-if="searchResult.type == 'cms_page'">
<a class="w-full block px-[20px] py-[6px] text-[16px] leading-[18px] desktop:px-[11px]"
:href="searchResult.url"
:title="searchResult.title">
<span x-text="searchResult.title"></span>
</a>
</template> </div>
</template>
</div>
</div>
</template>
</div>
<button type="submit"
class="btn btn-secondary w-[calc(100%_-_38px)] px-[20px] py-[24px] mt-[33px] mb-[19px] mx-auto justify-center desktop:w-[270px] desktop:max-w-[25%] desktop:p-[25px_30px_23px] desktop:m-[0_20px_20px_auto]">
Voir tous les produits </button>
</div>
</div>
</form>
</div>
</div> </div>
<div>
<!--Search Icon-->
<button
id="menu-search-icon"
class="rounded mobile-tablet absolute left-0 top-[13px] ml-[68px]"
@click.prevent=" searchOpen = !searchOpen; $dispatch('search-open'); "
aria-label="Afficher/Masquer le formulaire de recherche"
aria-haspopup="true"
:aria-expanded="searchOpen"
x-ref="searchButton"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="21" height="21" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
</svg>
</button>
<!-- Additional Header Elements -->
<!--Customer Icon & Dropdown-->
<script>
function initAuthentication() {
return {
open: false,
forceAuthentication: false,
accountUrl: 'https://www.modyf.fr/customer/account/',
errors: 0,
hasCaptchaToken: 0,
displayErrorMessage: false,
errorMessages: [],
showPassword: false,
setErrorMessages: function setErrorMessages(messages) {
this.errorMessages = [messages];
this.displayErrorMessage = this.errorMessages.length;
},
submitForm: function () {
this.validate()
.then(() => {
// Do not rename $form, the variable is expected to be declared in the recaptcha output
const $form = document.querySelector('#login-form');
if (this.errors === 0) {
this.dispatchLoginRequest($form);
}
})
.catch((invalid) => {
if (invalid.length > 0) {
invalid[0].focus();
}
});
},
onPrivateContentLoaded: function (data) {
const isLoggedIn = data.customer && data.customer.firstname;
if (data.cart && !isLoggedIn) {
this.forceAuthentication = !data.cart.isGuestCheckoutAllowed;
}
},
redirectIfAuthenticated: function (event) {
if (event.detail && event.detail.url) {
this.accountUrl = event.detail.url;
}
if (!this.forceAuthentication) {
window.location.href = this.accountUrl;
}
},
dispatchLoginRequest: function(form) {
this.isLoading = true;
const username = this.$refs['customer-email'].value;
const password = this.$refs['customer-password'].value;
const formKey = hyva.getFormKey();
const bodyFields = {
'username': username,
'password': password,
'formKey': formKey
};
const fieldName = '';
const recaptchaField = fieldName && form[fieldName];
if (recaptchaField) {
bodyFields[fieldName] = recaptchaField.value;
}
fetch('https://www.modyf.fr/customer/ajax/login/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
},
body: JSON.stringify(bodyFields)
}
).then(response => {
return response.json()
}
).then(data=> {
this.isLoading = false;
if (data.errors) {
dispatchMessages([{
type: 'error',
text: data.message
}], 5000);
this.errors = 1;
this.hasCaptchaToken = 0;
} else {
window.location.href = this.accountUrl;
}
});
}
}
}
</script>
<section id="authentication-popup"
class="relative inline-block"
x-data="initAuthentication()"
@private-content-loaded.window="onPrivateContentLoaded($event.detail.data)"
@toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)"
@toggle-authentication-popup.window="open = true"
@keydown.window.escape="open = false"
>
<button
type="button"
id="customer-menu"
class="block"
@click="open = !open"
:aria-expanded="open ? 'true' : 'false'"
aria-label="Compte"
aria-haspopup="true"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px] desktop:w-[30px] desktop:h-[30px] desktop:m-auto" role="img"><g fill="none" fill-rule="evenodd" stroke="rgba(0,0,0,0.99)" stroke-linecap="square" stroke-width="2" transform="translate(6 4)"><circle cx="6" cy="4" r="4"/><path d="M0 15c0-1.528 0-4 1.75-4h8.57C12 11 12 12.342 12 15"/></g><title>customer-icon</title></svg>
<span class="desktop text-[12px] text-modyf-black font-wuerth-bold pt-[33px] cursor-pointer">
S'identifier </span>
</button>
<div
class="backdrop z-[998]"
aria-hidden="true"
x-cloak
x-show="open"
@click="open = false"
></div>
<div role="dialog"
aria-modal="true"
@click.outside="open = false"
class="mobile:inset-y-0 right-0 !fixed max-w-[89%] z-[998] tablet_desktop:left-0 tablet_desktop:right-0 tablet_desktop:m-auto tablet_desktop:absolute tablet_desktop:max-w-[423px]"
x-cloak
x-show="open"
:class="open == true ? 'opacity-100 visible mobile:[transition:opacity_.3s_ease] !flex' : 'opacity-0 invisible [transition:visibility_0s_.3s,opacity_.3s_ease] !flex'"
>
<div class="relative w-screen tablet_desktop:w-full pt-[35px] bg-container-lighter [transition:transform_.3s_ease-in-out] tablet_desktop:[transition:transform_.2s_ease] tablet_desktop:pt-[48px]"
x-cloak=""
:class="open == true ? 'mobile:translate-x-[0] tablet_desktop:translate-y-[0]' : 'mobile:translate-x-[100%] tablet_desktop:translate-y-[-200%]'"
>
<div
x-show="open"
x-cloak=""
class="absolute top-[10px] right-[10px] tablet_desktop:top-[30px] tablet_desktop:right-[30px]">
<button
type="button"
@click="open = false;"
aria-label="Fermer le panneau"
class=""
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px]" role="img"><g fill="none" fill-rule="evenodd" stroke="rgba(0,0,0,0.99)" stroke-width="2"><path d="M6 18L18 6M18 18L6 6"/></g><title>cross-black-icon</title></svg>
</button>
</div>
<div class="flex flex-col h-full space-y-6 bg-white overflow-y-auto">
<div class="block-customer-login bg-container px-[15px] pb-[30px] screen__xs:px-[50px] screen__xs:pb-[50px]">
<p id="authenticate-customer-login" class="mb-[26px]">
<strong class="text-[24px] text-modyf-black font-wuerth-bold desktop:text-[26px]">
Déjà client ? </strong>
</p>
<form class="form form-login login-popup"
method="post"
@submit.prevent="submitForm();"
id="login-form"
x-data="Object.assign(hyva.formValidation($el))"
>
<div class="fieldset login">
<div class="field email required mb-[15px]">
<div class="control">
<input name="username"
id="form-login-username"
x-ref="customer-email"
@change="errors = 0"
type="email"
required
autocomplete="off"
class="form-input input-text w-full bg-modyf-lightest_grey"
placeholder="E-mail"
@input.debounce="onSubmit"
>
</div>
</div>
<div class="field password required mb-[15px] relative">
<div class="control">
<input name="password"
id="form-login-password"
type="password"
class="form-input input-text w-full bg-modyf-lightest_grey pr-[50px]"
required
x-ref="customer-password"
autocomplete="off"
@change="errors = 0"
placeholder="Mot de passe"
:type="showPassword ? 'text' : 'password'"
@input.debounce="onChange"
>
<button
type="button"
x-on:click="showPassword = !showPassword"
:aria-pressed="showPassword ? 'true' : 'false'"
class="absolute top-[8px] right-[8px] cursor-pointer"
:aria-label="showPassword ? 'Masquer\u0020le\u0020mot\u0020de\u0020passe' : 'Afficher\u0020le\u0020mot\u0020de\u0020passe'"
>
<template x-if="!showPassword">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewbox="0 0 34 34" class="w-[34px] h-[34px]" role="img">
<defs>
<clippath id="clip-path">
<rect id="Rectangle_102" data-name="Rectangle 102" width="34" height="34" transform="translate(-0.319 -0.319)" fill="none"/>
</clippath>
</defs>
<g id="Groupe_421" data-name="Groupe 421" transform="translate(0.319 0.319)">
<rect id="Rectangle_101" data-name="Rectangle 101" width="34" height="34" transform="translate(-0.319 -0.319)" fill="none"/>
<g id="Groupe_420" data-name="Groupe 420">
<g id="Groupe_419" data-name="Groupe 419" clip-path="url(#clip-path)">
<path id="Tracé_179" data-name="Tracé 179" d="M27.9,12.568a1.477,1.477,0,0,1-.156.661,14.54,14.54,0,0,1-12.9,8.041,14.535,14.535,0,0,1-12.9-8.041,1.48,1.48,0,0,1,0-1.322,14.543,14.543,0,0,1,12.9-8.041,14.535,14.535,0,0,1,12.9,8.041,1.483,1.483,0,0,1,.156.661m-2.267,0A12.331,12.331,0,0,0,14.851,6.043,12.331,12.331,0,0,0,4.067,12.568a12.331,12.331,0,0,0,10.784,6.526,12.329,12.329,0,0,0,10.784-6.526" transform="translate(1.989 4.272)" fill="#818a8f"/>
<path id="Tracé_180" data-name="Tracé 180" d="M13.423,13.709a4.944,4.944,0,0,1-2.758.823A5.082,5.082,0,0,1,6.413,6.68Z" transform="translate(6.179 7.382)" fill="#818a8f"/>
<path id="Tracé_181" data-name="Tracé 181" d="M15.307,10.663a5.063,5.063,0,0,1-.821,2.779,5.243,5.243,0,0,1-1.495,1.474L5.982,7.884A4.918,4.918,0,0,1,7.456,6.411a5.012,5.012,0,0,1,2.779-.821,5.076,5.076,0,0,1,5.073,5.073" transform="translate(6.61 6.177)" fill="#818a8f"/>
<path id="Tracé_182" data-name="Tracé 182" d="M25.015,23.539l-1.495,1.474-6.9-6.9-7.01-7.031-6.9-6.9L4.175,2.7l6.9,6.9,7.031,7.031Z" transform="translate(2.985 2.983)" fill="#818a8f" opacity="0"/>
</g>
</g>
</g>
<title>pass-eye-icon</title></svg>
</template>
<template x-if="showPassword">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewbox="0 0 34 34" class="w-[34px] h-[34px]" role="img">
<defs>
<clippath id="clip-path_2">
<rect id="Rectangle_102_2" data-name="Rectangle 102" width="34" height="34" transform="translate(-0.319 -0.319)" fill="none"/>
</clippath>
</defs>
<g id="eye" transform="translate(0.319 0.319)">
<rect id="Rectangle_101_2" data-name="Rectangle 101" width="34" height="34" transform="translate(-0.319 -0.319)" fill="none"/>
<g id="Groupe_420_2" data-name="Groupe 420">
<g id="Groupe_419_2" data-name="Groupe 419" clip-path="url(#clip-path_2)">
<path id="Tracé_179_2" data-name="Tracé 179" d="M27.9,12.568a1.477,1.477,0,0,1-.156.661,14.54,14.54,0,0,1-12.9,8.041,14.535,14.535,0,0,1-12.9-8.041,1.48,1.48,0,0,1,0-1.322,14.543,14.543,0,0,1,12.9-8.041,14.535,14.535,0,0,1,12.9,8.041,1.483,1.483,0,0,1,.156.661m-2.267,0A12.331,12.331,0,0,0,14.851,6.043,12.331,12.331,0,0,0,4.067,12.568a12.331,12.331,0,0,0,10.784,6.526,12.329,12.329,0,0,0,10.784-6.526" transform="translate(1.989 4.272)" fill="#818a8f"/>
<path id="Tracé_180_2" data-name="Tracé 180" d="M13.423,13.709a4.944,4.944,0,0,1-2.758.823A5.082,5.082,0,0,1,6.413,6.68Z" transform="translate(6.179 7.382)" fill="#818a8f" opacity="0.5"/>
<path id="Tracé_181_2" data-name="Tracé 181" d="M15.307,10.663a5.063,5.063,0,0,1-.821,2.779,5.243,5.243,0,0,1-1.495,1.474L5.982,7.884A4.918,4.918,0,0,1,7.456,6.411a5.012,5.012,0,0,1,2.779-.821,5.076,5.076,0,0,1,5.073,5.073" transform="translate(6.61 6.177)" fill="#818a8f" opacity="0.5"/>
<path id="Tracé_182_2" data-name="Tracé 182" d="M25.015,23.539l-1.495,1.474-6.9-6.9-7.01-7.031-6.9-6.9L4.175,2.7l6.9,6.9,7.031,7.031Z" transform="translate(2.985 2.983)" fill="#818a8f"/>
</g>
</g>
</g>
<title>pass-eye-close-icon</title></svg>
</template>
</button>
</div>
</div>
<input name="context" type="hidden" value="checkout" />
<div class="screen__xs:flex screen__xs:items-center screen__xs:justify-between">
<div class="remember-row">
<div id="popup-remember-me-box" class="field choice persistent"> <input type="checkbox" name="persistent_remember_me" class="checkbox" id="popup_remember_mekhJBK4NmaE" checked="checked" title="Se souvenir de moi" /><label for="popup_remember_mekhJBK4NmaE" class="label"><span>Se souvenir de moi</span></label></div> </div>
<div class="mt-[15px] screen__xs:mt-1">
<span class="action remind atc leading-[26px] text-[16px] underline text-modyf-darkest_grey2"
data-atc="aHR0cHM6Ly93d3cubW9keWYuZnIvY3VzdG9tZXIvYWNjb3VudC9mb3Jnb3RwYXNzd29yZC8=">
Mot de passe oublié ? </span>
</div>
</div>
<div class="actions-toolbar flex justify-between !pt-0 items-center mt-[30px] !border-0 tablet_desktop:mt-[39px]">
<button type="submit" class="block w-full btn btn-primary disabled:opacity-75"
>
Se connecter </button>
</div>
</div>
</form>
<div class="bottom-login-content mt-[20px] text-center tablet_desktop:mt-[31px]">
<span data-atc="aHR0cHM6Ly93d3cubW9keWYuZnIvY3VzdG9tZXIvYWNjb3VudC9sb2dpbi8="
class="action create atc call-to-action-arrow-mixin mb-[20px] inline-block screen__xs:mb-[38px]">
Créer un compte </span>
<div class="login-description mb-[20px] leading-[18px]">
Pour les clients privés, les entreprises et les administrations </div>
</div> </div>
<div>
</div>
</div>
</div>
</div>
</section>
<!-- BLOCK minifastorder.general --><!-- /BLOCK minifastorder.general -->
<div class="inline-block relative">
<!--Cart Icon-->
<a id="menu-cart-icon"
class="relative inline-block ml-[15px] desktop:ml-[20px]"
@mouseenter="() => { $dispatch('toggle-cart', { isOpen: true }) }"
@mouseleave = "() => { $dispatch('toggle-cart', { isOpen: false }) }"
@toggle-cart.window="toggleCart($event)"
:aria-expanded="isCartOpen"
aria-haspopup="dialog"
x-ref="cartButton"
:aria-disabled="isCartEmpty()"
:aria-label="` Afficher/Masquer le panier, ${isCartEmpty() ? 'Le panier est vide' : cart.summary_count > 1 ? hyva.str('%1 articles', cart.summary_count) : hyva.str('%1 item', cart.summary_count) }`"
href="https://www.modyf.fr/checkout/cart/index/"
title="Voir le panier"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px] desktop:w-[30px] desktop:h-[30px] desktop:m-auto" role="img"><g fill="none" fill-rule="evenodd" stroke="rgba(0,0,0,0.99)" stroke-width="2"><path d="M7 17h8l2.734-12.712L20 4"/><path stroke-linecap="round" stroke-linejoin="round" d="M8.5 19.125a.375.375 0 1 1 0 .75.375.375 0 0 1 0-.75M14.5 19.125a.375.375 0 1 1 0 .75.375.375 0 0 1 0-.75"/><path d="M15.768 14H6.864L5 7h12"/></g><title>cart-icon</title></svg>
<span class="desktop text-[12px] text-modyf-black font-wuerth-bold pt-[33px] cursor-pointer">
Mon panier </span>
<span
x-text="cart.summary_count"
x-show="!isCartEmpty()"
x-cloak
class="bg-modyf-red text-modyf-white leading-[15px] rounded-full inline-block m-auto h-[16px] w-[16px] overflow-hidden text-center absolute right-[-9px] top-[-5px] desktop:right-[10px] desktop:top-[-8px] text-[10px]"
aria-hidden="true"
></span>
</a>
<!--Cart Drawer-->
<script>
function initCartDrawer() {
return {
open: false,
minicartMouseenter: false,
isLoading: false,
cart: {},
maxItemsToDisplay: 10,
itemsCount: 0,
getData(data) {
if (data.cart) {
this.cart = data.cart;
this.itemsCount = data.cart.items && data.cart.items.length || 0;
this.setCartItems();
}
this.isLoading = false;
},
cartItems: [],
getItemCountTitle() {
return hyva.strf('\u00250\u0020des\u0020\u00251\u0020produits\u0020dans\u0020le\u0020panier\u0020affich\u00E9s', this.maxItemsToDisplay, this.itemsCount)
},
setCartItems() {
this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || [];
if (this.maxItemsToDisplay > 0) {
this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10));
}
},
deleteItemFromCart(itemId) {
document.querySelector('#main-css-loader').classList.remove('hidden')
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + 'checkout/sidebar/removeItem/';
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&item_id=" + itemId,
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(response => {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
const gtmScriptEvent = new CustomEvent('gtm_product-remove-from-cart', {
detail: {
itemId: itemId
},
});
document.dispatchEvent(gtmScriptEvent);
if (window.location.href.includes('checkout/cart')) {
window.location.reload();
}
return response.json();
} else {
window.dispatchMessages && window.dispatchMessages([{
type: 'warning',
text: 'Impossible\u0020de\u0020retirer\u0020l\u0027article\u0020du\u0020panier.'
}]);
document.querySelector('#main-css-loader').classList.add('hidden')
}
}).then(result => {
window.dispatchMessages && window.dispatchMessages([{
type: result.success ? 'success' : 'error',
text: result.success
? 'Vous\u0020avez\u0020supprim\u00E9\u0020l\u0027\u00E9l\u00E9ment.'
: result.error_message
}], result.success ? 5000 : 0)
window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
document.querySelector('#main-css-loader').classList.add('hidden');
});
},
toggleCartDrawer(event) {
if (event.detail && event.detail.isOpen !== undefined) {
if (event.detail.isOpen) {
this.openCartDrawer();
} else {
setTimeout(() => {
if (!event.detail.isOpen && !this.minicartMouseenter) {
this.open = false;
}
}, 1000);
}
} else {
this.openCartDrawer()
}
},
openCartDrawer() {
this.open = true;
},
closeCartDrawer() {
if (this.minicartMouseenter) {
setTimeout(() => {
this.$dispatch('toggle-cart', { isOpen: false });
this.minicartMouseenter = false;
}, 1000);
} else {
this.$dispatch('toggle-cart', { isOpen: false });
}
},
getSectionDataExtraActions() {
if (!this.cart.extra_actions) {
return '';
}
const contentNode = document.createElement('div');
contentNode.innerHTML = this.cart.extra_actions;
hyva.activateScripts(contentNode);
return contentNode.innerHTML;
}
}
}
</script>
<section x-cloak
x-show="cart"
id="cart-drawer"
x-data="initCartDrawer()"
@private-content-loaded.window="getData($event.detail.data)"
@toggle-cart.window="toggleCartDrawer($event)"
@keydown.escape="closeCartDrawer"
>
<div role="dialog"
aria-labelledby="cart-drawer-title"
aria-modal="true"
x-show="open"
:aria-hidden="!open"
@mouseenter="minicartMouseenter = true"
@mouseleave="closeCartDrawer()"
class="mini-cart absolute z-40 top-[118px] right-[-15px] mt-[4px] bg-modyf-white desktop">
<div class="relative w-[390px] py-[25px] px-[20px] border border-modyf-lightest_grey shadow-modyf_customer_menu_box_shadow"
x-show="open"
x-ref="cartDialogContent"
role="region"
:tabindex="open ? 0 : -1"
aria-label="Mon panier"
>
<div class="flex flex-col h-full max-h-screen">
<template x-if="!itemsCount">
<div class="font-wuerth-bold font-bold text-[14px] text-center pt-[30px] pb-[20px]">
Votre panier est vide. </div>
</template>
<template x-if="itemsCount">
<div class="relative bg-white overflow-y-auto overscroll-y-contain h-[200px] mx-[-20px] p-[15px]">
<template x-for="item in cartItems">
<div class="flex items-start space-x-4 transition duration-150 ease-in-out pb-[20px] [&:not(:first-of-type)]:pt-[20px] [&:not(:first-of-type)]:border-t [&:not(:first-of-type)]:border-modyf-lightest_grey">
<a :href="item.product_url"
class="w-1/4 max-w-[75px]"
:aria-label="hyva.strf('Produit\u0020\u0022\u00250\u0022', item.product_name)"
>
<img
:src="item.product_image.src"
:width="item.product_image.width"
:height="item.product_image.height"
loading="lazy"
class="w-[75px]"
alt=""
/>
</a>
<div class="w-3/4">
<div class="flex justify-between items-start">
<div>
<template x-if="item.modyf_collection">
<span class="inline-block mb-[9px] py-[5px] px-[10px] font-wuerth-bold text-[11px] text-modyf-darkest_grey uppercase bg-modyf-light_grey"
x-text="item.modyf_collection"
>
</span>
</template>
<a :href="item.product_url"
class="hover:underline leading-normal hyphens-auto"
:aria-label="hyva.strf('Produit\u0020\u0022\u00250\u0022', item.product_name)"
>
<span class="line-clamp-2 max-w-[185px] font-wuerth-bold leading-normal text-[18px]" x-html="item.product_name"></span>
</a>
</div>
<button type="button"
class="text-modyf-darkest_grey2 flex items-center text-[14px]"
@click="deleteItemFromCart(item.item_id)"
:aria-label="hyva.strf('Supprimer\u0020le\u0020produit\u0020\u0022\u00250\u0022\u0020du\u0020panier', item.product_name)"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="15" height="15" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
Retirer </button>
</div>
<div class="inline-block justify-start items-end !mt-[10px]">
<div class="price-box inline-block">
<span x-html="item.product_price"></span>
</div>
<div class="ml-[15px] inline-block">
<template x-for="option in item.options">
<span class="text-modyf-darkest_grey2 mr-[5px]">
<span x-html="option.value"></span>
</span>
</template>
</div>
</div>
<template x-if="item.product_color">
<div class="text-modyf-darkest_grey2 inline-block">
<span x-text="item.product_color"></span>
</div>
</template>
<div class="mt-[10px] text-[14px]">
<span>Qté:</span>
<span x-html="item.qty"></span>
</div>
</div>
</div>
</template>
</div>
</template>
<template x-if="itemsCount">
<div>
<a href="https://www.modyf.fr/checkout/cart/"
class="block btn btn-primary text-center mt-[15px] py-[14px] px-[17px]"
>
Voir mon panier </a>
</div>
</template>
</div>
<button
type="button"
@click="open = false"
aria-label="Fermer le minicart"
class="absolute top-[5px] right-[10px] transition-colors text-black hover:text-modyf-hover_grey"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
</div>
<div
class="z-50 fixed inset-0 grid place-items-center bg-white/70 text-slate-800"
x-cloak
x-show="isLoading"
x-transition.opacity.duration.200ms
>
<div class="flex gap-10 items-center p-4">
<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 57 57" width="57" height="57" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
<style>
@keyframes spinner-ball-triangle1 {
0% { transform: translate(0%, 0%); }
33% { transform: translate(38%, -79%); }
66% { transform: translate(77%, 0%); }
100% { transform: translate(0%, 0%); }
}
@keyframes spinner-ball-triangle2 {
0% { transform: translate(0%, 0%); }
33% { transform: translate(38%, 79%); }
66% { transform: translate(-38%, 79%); }
100% { transform: translate(0%, 0%); }
}
@keyframes spinner-ball-triangle3 {
0% { transform: translate(0%, 0%); }
33% { transform: translate(-77%, 0%); }
66% { transform: translate(-38%, -79%); }
100% { transform: translate(0%, 0%); }
}
</style>
<circle cx="5" cy="50" r="5" style="animation: spinner-ball-triangle1 2.2s linear infinite"/>
<circle cx="27" cy="5" r="5" style="animation: spinner-ball-triangle2 2.2s linear infinite"/>
<circle cx="49" cy="50" r="5" style="animation: spinner-ball-triangle3 2.2s linear infinite"/>
</svg>
<span class="text-xl select-none">
Chargement en cours... </span>
</div>
</div> </div>
</section> </div>
<div class="inline-block relative">
<script>
function initMiniQuoteDrawer() {
return {
open: false,
quoteData: {},
quoteItems: [],
quoteItemId: false,
async reloadMiniQuote () {
window.dispatchEvent(new CustomEvent("miniquote-reload", {detail: {onReload: true}}));
return new Promise((resolve, reject) => {
fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent('quote')}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
}).then(response => response.json())
.then(
data => {
if (data) {
try {
const browserStorage = hyva.getBrowserStorage();
const private_content_key = 'mage-cache-storage'
const private_content_expire_key = 'mage-cache-timeout';
const private_content_version_key = 'private_content_version';
const section_data_ids_key = 'section_data_ids';
const ttl = 3600;
// merge new data preserving non-invalidated sections
const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}');
const newSectionData = Object.assign(oldSectionData, data);
const privateContentEvent = new CustomEvent("private-content-loaded", {
detail: {
data: newSectionData
}
});
window.dispatchEvent(privateContentEvent);
// don't persist messages, they've been dispatched already
if (newSectionData.messages && newSectionData.messages.messages ) {
newSectionData.messages.messages = [];
}
browserStorage.setItem(private_content_key, JSON.stringify(newSectionData));
const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString();
browserStorage.setItem(private_content_expire_key, expiresAt);
const newCookieVersion = hyva.getCookie(private_content_version_key);
browserStorage.setItem(private_content_version_key, newCookieVersion);
// We don't need the section_data_ids in Hyvä, but we store them for compatibility
// with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout
hyva.setCookie(
section_data_ids_key,
JSON.stringify(
Object.keys(data).reduce((sectionDataIds, sectionKey) => {
sectionDataIds[sectionKey] = data[sectionKey]['data_id'];
return sectionDataIds;
}, {})
),
false,
true
);
resolve(newSectionData?.quote);
} catch (error) {
reject("Couldn't store quote section data. Error: " + error.message);
}
} else {
reject("No\u0020Quote\u0020section\u0020data.");
}
window.dispatchEvent(new CustomEvent("miniquote-reload", {detail: {onReload: false}}));
}
);
});
},
getQuoteData(data) {
if (data.quote) {
this.quoteData = data.quote
this.setCartItems();
}
},
setCartItems() {
if (this.quoteData.items) {
this.quoteItems = this.quoteData && this.quoteData.items.sort(function(a,b) { return a.item_id - b.item_id }) || {}
}
},
deleteItemFromQuote(itemId) {
fetch('https://www.modyf.fr/quoteextension/quote/clearQuote/', {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key="+ hyva.getFormKey() + "&item_id="+itemId,
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Impossible de retirer l'article du panier."
}], 5000
);
}
}).then(function (response) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: response.success ? "success" : "error",
text: response.success
? "Vous avez supprimé l'élément."
: response.error_message
}], 5000
);
const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data");
window.dispatchEvent(reloadCustomerDataEvent);
});
},
clearQuoteLoading: false,
clearQuote() {
if (this.quoteItemId) {
this.deleteItemFromQuote(this.quoteItemId);
this.quoteItemId = false;
window.dispatchEvent(new CustomEvent('close-modal-69b8dc69c1ab7'));
} else {
this.clearQuoteLoading = true;
let endpoint = 'https://www.modyf.fr/quoteextension/quote/clearquote/';
let configs = {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": new URLSearchParams({form_key: hyva.getFormKey(), removeAll: 1}),
"method": "POST",
"mode": "cors",
"credentials": "include"
};
fetch (endpoint, configs).then(response => responseSerialize(response)).then(data => {
window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
}).finally(() => {
this.clearQuoteLoading = false;
window.dispatchEvent(new CustomEvent('close-modal-69b8dc69c1ab7'));
})
}
}
}
}
</script>
<section id="mini-quote-drawer"
x-data="initMiniQuoteDrawer()"
@private-content-loaded.window="getQuoteData(event.detail.data)"
@toggle-quote.window="open=true;"
@keydown.window.escape="open=false"
@reload-miniquote.window="await reloadMiniQuote(event.detail)"
@clear-quote.window="clearQuote()"
class="mini-quote-drawer"
>
<div role="dialog" x-cloak
aria-labelledby="cart-drawer-title"
aria-modal="true"
@click.outside="open = false"
class="absolute z-30 right-[-15px] mt-[4px] bg-modyf-white">
<div class="relative w-[290px] tablet_desktop:w-[390px] py-[25px] px-[20px] border border-modyf-grey10 shadow-modyf_customer_menu_box_shadow before:border-[6px] before:border-t-transparent before:border-r-transparent before:border-l-transparent before:border-b-modyf-white before:z-[99] before:right-[26px] before:top-[-12px] before:content-[''] before:block before:h-0 before:w-0 before:absolute after:border-[7px] after:border-t-transparent after:border-r-transparent after:border-l-transparent after:border-b-modyf-grey10 after:z-[98] after:right-[25px] after:top-[-14px] after:content-[''] after:block after:h-0 after:w-0 after:absolute"
x-show="open"
>
<button
type="button"
@click="open = false"
aria-label="Fermer le minicart"
class="absolute top-[5px] right-[10px] transition-colors text-black hover:text-modyf-hover_grey"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
<div class="flex flex-col">
<template x-if="!quoteData || quoteData.summary_count < 1">
<strong class="font-wuerth-bold font-bold block text-[14px] pt-[30px] pb-[20px] text-center mb-[15px]">
Vous n'avez pas de produits dans votre devis. </strong>
</template>
<template x-if="quoteData && quoteData.summary_count">
<div class="pb-[20px]">
<div class="mx-[10px] mb-[10px] text-[14px]">
<span class="font-bold" x-text="quoteData.summary_count"></span>
<span>Article dans le devis</span>
</div>
<template x-for="item in quoteItems">
<div class="flex items-start [&:not(:last-child)]:pb-[20px] [&:not(:last-child)]:mb-[20px] [&:not(:last-child)]:border-b [&:not(:last-child)]:border-lightest_grey">
<a :href="item.product_url" class="w-[88px]">
<img
:src="item.product_image.src"
:width="item.product_image.width"
:height="item.product_image.height"
loading="lazy"
class="w-[75px]"
/>
</a>
<div class="w-3/4 space-y-2">
<div class="w-full max-w-[185px]">
<a :href="item.product_url">
<span class="font-wuerth-bold text-[18px] leading-none hover:underline"
x-html="item.product_name"
>
</span>
</a>
</div>
<template x-for="option in item.options">
<div class="!mt-0 text-modyf-darkest_grey2">
<span x-text="option.label"></span>
<span x-html="option.value"></span>
</div>
</template>
<p><span x-html="item.product_price"></span></p>
<div class="mt-[10px] flex justify-between items-center">
<div class="text-[14px]">
<span>Qté:</span>
<span x-html="item.qty"></span>
</div>
<button type="button"
class="text-modyf-darkest_grey2 flex items-center text-[14px]"
@click="quoteItemId = item.item_id; $dispatch('open-modal-69b8dc69c1ab7')"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="15" height="15" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
Retirer </button>
</div>
</div>
</div>
</template>
</div>
</template>
<template x-if="quoteData && quoteData.summary_count">
<div class="relative mt-[15px]">
<div class="w-full flex justify-between items-start">
<a class="action__clear-quote btn btn-secondary inline-flex w-[48.5%] text-center"
@click.prevent.stop="$dispatch('open-modal-69b8dc69c1ab7')"
href="https://www.modyf.fr/quoteextension/quote/clearquote/">
<span class="w-4 border-2 border-gray-300 border-t-gray-600 rounded-full square animate-spin mr-2" x-cloak x-show="clearQuoteLoading"></span>
<span x-html="clearQuoteLoading ? 'Clearing...' : 'Supprimer le devis'">
Supprimer le devis </span>
</a>
<a href="https://www.modyf.fr/quoteextension/quote/"
class="inline-flex btn btn-primary w-[48.5%] text-center">
Modifier le devis </a>
</div>
</div>
</template>
</div>
</div>
</div>
</section>
<script>
'use strict';
function initModal69b8dc69c1ab7() {
return {
show: false,
eventListeners: {
['@open-modal-69b8dc69c1ab7.window'] ($event) {
this.show = true;
},
['@close-modal-69b8dc69c1ab7.window'] ($event) {
this.show = false;
}
}
}
}
</script>
<div x-data="initModal69b8dc69c1ab7()"
x-cloak
x-show.transition.origin.top="show"
x-bind="eventListeners"
class="modal-wrapper clear-quote-confirm-modal w-full h-full fixed top-0 z-40 left-0">
<div class="overlay bg-gray-600 absolute opacity-50 w-full h-full"></div>
<div class="modal-container w-full h-full relative">
<div @click.outside="show = false"
class="modal mx-auto card pt-[42px] pb-[30px] px-[30px] mt-24 shadow-lg animate__animated w-3/4 max-w-[500px]"
:class="{animate__fadeInDown: show}">
<button
type="button"
@click="show = false; quoteItemId = false"
aria-label="Fermer le minicart"
class="absolute top-[20px] right-[20px] transition-colors text-black hover:text-modyf-hover_grey"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
</svg>
</button>
<div class="modal-content">
<span class="text-[14px] leading-[20px]">Are you sure you would like to remove all items from the quote?</span>
</div>
<div class="modal-actions pt-[30px]">
<a href="#" class="btn btn-secondary inline-flex"
@click.prevent="$dispatch('close-modal-69b8dc69c1ab7')">Annuler</a>
<a href="#" class="btn btn-primary inline-flex" @click.prevent="$dispatch('clear-quote')">
<span>OK</span>
</a>
</div>
</div>
</div>
</div> </div>
</div>
</div>
<!--Main Navigation-->
<nav
x-data="initMenuMobile_69b8dc1f8aadc()"
@keydown.window.escape="closeMenu()"
class="z-50 order-2 navigation desktop:hidden h-[24px] w-[24px]"
aria-label="Navigation sur le site"
role="navigation"
>
<!-- mobile -->
<button
class="mt-[-2px]"
x-ref="mobileMenuTrigger"
@click="openMenu()"
:class="{'overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full' : open}"
type="button"
aria-label="Ouvrir le menu"
aria-haspopup="menu"
:aria-expanded="open"
:hidden="open"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" :class="{ 'hidden' : open, 'block': !open }" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/>
</svg>
</button>
<button
@click="closeMenu()"
:hidden="!open"
class="fixed left-[15px] top-[15px] z-30"
aria-label="Fermer le menu"
type="button"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px]" role="img"><g fill="none" fill-rule="evenodd" stroke="rgb(255, 255, 255)" stroke-width="2"><path d="M6 18L18 6M18 18L6 6"/></g><title>cross-white-icon</title></svg>
</button>
<div class="back-overlay" x-show="open" x-cloak="" @click="closeMenu()"></div>
<div
x-ref="mobileMenuNavLinks"
class="fixed top-0 right-0 h-full hidden flex-col border-t border-container bg-modyf-lightest_grey overflow-y-auto overflow-x-hidden w-[calc(100%_-_54px)] z-100"
:class="{ 'flex': open, 'hidden': !open }"
:aria-hidden="open ? 'false' : 'true'"
role="dialog"
aria-modal="true"
>
<ul
class="flex flex-col bg-modyf-white"
aria-label="Liens de navigation du site"
>
<li
data-child-id="category-node-6798-main"
class="level-0"
>
<div
class="flex items-center transition-transform duration-150 ease-in-out transform"
>
<a
class="flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black"
href="https://www.modyf.fr/vetements-professionnels"
title="Vêtements de travail"
data-link-id="category-node-6798"
>
Vêtements de travail </a>
<button
@click="toggleSubcategory('category-node-6798')"
class="cursor-pointer absolute w-full h-full"
aria-label="Ouvrir Vêtements de travail sous-catégories"
aria-haspopup="true"
data-button-id="category-node-6798"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey absolute right-[20px] top-0 bottom-0 m-auto" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</button>
</div>
<div
data-child-id="category-node-6798"
class="hidden w-full h-full"
>
<ul aria-label="Sous-catégories">
<li>
<button
type="button"
class="flex items-center px-[20px] py-[15px] border-b cursor-pointer bg-container border-modyf-lightest_grey w-full"
@click="toggleSubcategory('category-node-6798')"
aria-label="Retour aux catégories principales"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/>
</svg>
<span class="ml-4 font-wuerth-bold text-[16px] text-modyf-black !mx-auto">
Vêtements de travail </span>
</button>
</li>
<li class="w-full px-[20px] py-[15px] border-b bg-modyf-white">
<a
href="https://www.modyf.fr/vetements-professionnels"
title="Vêtements de travail"
class="border-modyf-lightest_grey cursor-pointer bg-modyf-white font-wuerth-bold text-[16px] text-modyf-black call-to-action-arrow-mixin"
>
Tous les Vêtements de travail </a>
</li>
</ul>
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=PSP1OJV]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="PSP1OJV"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>.custom-menu ul{display:block!important}.mobileOnly{display:none}.full-width-block{height:auto!important}.navigation .level0 .custom-menu *{box-sizing:border-box}.navigation .level0 .custom-menu{padding:0;display:flex;justify-content:space-around;flex-flow:row;max-width:1680px;margin:0 auto;background-color:#fff;box-sizing:border-box}.inner-wrapper{display:flex;margin:0 auto;width:100%;max-width:1320px}.navigation .level0 .custom-menu.col5 .col{width:264px;padding:0 25px}.navigation .level0 .custom-menu.col6 .col{width:220px;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2{width:490px;max-width:100%;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2 ul.open ul{display:flex!important;flex-flow:column wrap;max-height:290px}.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{list-style:none;padding-left:0;margin:0 0 25px}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{margin-bottom:1rem}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{background-color:#c3c8c8;color:#fff;text-align:center;text-transform:uppercase;font-weight:700;font-size:14px;font-family:wuerthbold;margin-bottom:1rem;padding:0;position:relative;background-size:cover;background-repeat:no-repeat;background-position:right}.navigation .level0 .custom-menu ol.ctas li.hiver,.navigation .level0 .custom-menu ul.ctas li.hiver{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tenue-thermique.jpg)}.navigation .level0 .custom-menu ol.ctas li.ete,.navigation .level0 .custom-menu ul.ctas li.ete{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tee-shirt-travail.jpg)}.navigation .level0 .custom-menu ol.ctas li.pluie,.navigation .level0 .custom-menu ul.ctas li.pluie{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/vetement-pluie.jpg)}.navigation .level0 .custom-menu ol.ctas li a,.navigation .level0 .custom-menu ul.ctas li a{text-decoration:none;color:inherit;margin-bottom:0;padding:25px 7px;z-index:3;position:relative}.navigation .level0 .custom-menu img{max-width:100%}body .navigation li.level0 .submenu span.atc{display:inline-block;padding:0;margin-bottom:10px}.navigation .all-category{background-color:#fff}.navigation .all-category a,.navigation .seeAll a,.navigation .submenu:not(:first-child) ul>li.seeAll a{position:relative;font-family:wuerthbold;display:inline-block;text-transform:none}.all-category a{text-align:center}.navigation .all-category a::after,.seeAll a::after{width:24px;height:24px;background-size:cover;background-position:center;background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='rgba(204,0,0,0.99)' stroke-width='2'%3E%3Cpath d='M4 12h14M15 17l5-5-5-5'/%3E%3C/g%3E%3C/svg%3E%0A");content:'';display:inline-block;position:absolute;top:50%;transform:translateY(-50%);right:0}.seeAll a:hover{color:#c00}
.navigation li.level0 .submenu a.new::after {
content: "nouveau";
font-family: 'WuerthBold';
background: #c00;
padding: 2px 4px;
color: #fff;
display: inline-block;
font-size: 8px;
text-transform: uppercase;
vertical-align: super;
margin-left: 5px;
}
@media (max-width:1049px){.desktopOnly,.level1 ol,.level1 ul{display:none}
.custom-menu .level1 ul{display:none!important}.mobileOnly,.rm-expand{display:block}.custom-menu ul.open{display:block!important}.custom-menu .inner-wrapper,.navigation .level0 .custom-menu{flex-flow:column wrap}.navigation .level0 .custom-menu.col5 .col,.navigation .level0 .custom-menu.col6 .col,.navigation .level0 .custom-menu.col6 .colx2{width:100%;padding:0}.custom-menu ol li.title,.custom-menu ul li.title,.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{margin-bottom:0}.navigation .level0 .custom-menu li{border-bottom:1px solid #efefef}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{padding:15px 20px 15px 30px;margin-bottom:0}.navigation .level0 .custom-menu ol li.title a,.navigation .level0 .custom-menu ul li.title a{padding:0}body .navigation li.level0 .submenu span.atc{padding:15px 40px 15px 60px;margin-bottom:0}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{margin:10px 20px}.navigation>ul .level0 .custom-menu .level1 a{border-bottom:0}.navigation .level0 .custom-menu .level1 li.level2{border:none}.level1 ol,.level1 ul{background-color:#fcfcfc}.navigation .level0 .custom-menu.col6 .colx2 ul ul{display:none;flex-flow:column;background-color:#fcfcfc;max-height:none}.title strong{position:relative;display:flex;justify-content:space-between;align-items:center}.rm-expand{width:24px;height:24px;background-position:center;background-repeat:no-repeat}.rm-expand.close{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 6.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(7.5) rotate(90)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}.rm-expand.open{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='2' viewBox='0 0 14 2'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 0.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(14 1.5) rotate(180)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}}</style>
<div class="custom-menu col6">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Bas de travail</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/pantalons-de-travail">Pantalons de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/pantalons-de-travail/jeans">Jeans de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/bermudas-de-travail">Bermudas de travail</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Hauts de travail</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/pulls-de-travail-et-sweats">Pull de travail et sweats</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/t-shirts-de-travail">T-shirts de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/polos-de-travail">Polo de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/chemises-de-travail">Chemises de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Vestes et gilets</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/vestes-de-travail">Vestes de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/gilets-de-travail">Gilets de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/blousons-parkas-de-travail">Blousons et parkas</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-pluie-hiver/softshell">Softshell</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-pluie-hiver/polaires-travail">Polaires de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Vêtements normés</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a
href="https://www.modyf.fr/vetements-professionnels/haute-visibilite">Haute-visibilité</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/multinormes">Multinormes</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Combinaisons et bleus de travail</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/bleu-de-travail">Bleus de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/combinaisons">Combinaisons de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/bleu-de-travail/salopettes-cottes">Salopette de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="ctas">
<li class="hiver ui-menu-item first"><a href="https://www.modyf.fr/vetements-pluie-hiver/vetements-thermiques">VÊTEMENTS HIVER</a></li>
<li class="ete ui-menu-item"><a href="https://www.modyf.fr/tenue-ete">VÊTEMENTS ÉTÉ</a></li>
<li class="pluie ui-menu-item"><a href="https://www.modyf.fr/vetements-pluie-hiver/tenues-impermeables">VÊTEMENTS PLUIE</a></li>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Nos Gammes</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/collections/star">Star</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/stretch-evolution">Stretch Evolution</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/fluo">Fluo</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/cetus">Cetus</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/stretch-x">Stretch X</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/office">Office</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/classic">Classic</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/x-finity">X-Finity</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/made-in-france">Made in France</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/fusion">Fusion</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/urban">Urban</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/temper" class="new">Temper</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-itemparent ui-menu-item"><strong>Genre</strong></li>
<ul>
<li class="level2 ui-menu-item first"><span class="atc" data-atc="L3ZldGVtZW50cy1wcm9mZXNzaW9ubmVscz9nZW5kZXI9aG9tbWU=">Homme</span></li>
<li class="level2 ui-menu-item"><span class="atc" data-atc="L3ZldGVtZW50cy1wcm9mZXNzaW9ubmVscz9nZW5kZXI9dW5pc2V4ZQ==">Mixte</span></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/collection-femme">Femme</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title category-item ui-menu-item parent"><strong>Marque</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/marque-modyf/habits-professionnels">Würth MODYF</a></li>
</ul>
</ul>
</div>
</div>
</div></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><script>
document.addEventListener("DOMContentLoaded", function () {
const seeAll = "Tout voir";
const userAgent = navigator.userAgent;
const deviceType = /iPad/.test(userAgent)
? "t"
: /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(userAgent)
? "m"
: "d";
if (deviceType === "d") return;
const mobileMenu = document.querySelector('[x-ref="mobileMenuNavLinks"]');
if (!mobileMenu) return;
if (mobileMenu.dataset.processed === "true") return;
mobileMenu.dataset.processed = "true";
mobileMenu.querySelectorAll('.level1 .title strong').forEach(strongEl => {
const span = document.createElement('span');
span.className = 'rm-expand close';
strongEl.appendChild(span);
});
mobileMenu.querySelectorAll('.level1 .title > a').forEach(aEl => {
const href = aEl.getAttribute('href');
aEl.setAttribute('href', '#');
const level1 = aEl.closest('ul.level1');
const level2 = level1?.querySelector('ul');
if (level2 && !level2.querySelector('.seeAll')) {
const seeAllLi = document.createElement('li');
seeAllLi.className = 'level2 ui-menu-item seeAll';
seeAllLi.innerHTML = `<a href="${href}">${seeAll}</a>`;
level2.insertBefore(seeAllLi, level2.firstChild);
}
});
mobileMenu.querySelectorAll('.level1 .title').forEach(titleEl => {
titleEl.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const expander = titleEl.querySelector('span.rm-expand');
if (expander) expander.click();
});
});
mobileMenu.querySelectorAll('.rm-expand').forEach(expander => {
expander.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const parentUl = expander.closest('ul.level1');
const subMenu = parentUl?.querySelector('ul');
if (expander.classList.contains('close')) {
subMenu?.classList.add('open');
expander.classList.remove('close');
expander.classList.add('open');
expander.innerHTML = '';
} else {
subMenu?.classList.remove('open');
expander.classList.remove('open');
expander.classList.add('close');
expander.innerHTML = '';
}
});
});
mobileMenu.querySelectorAll('.level2 a').forEach(aEl => {
aEl.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
window.location = aEl.getAttribute('href');
});
});
});
</script>
<!--script>
var seeAll = "Tout voir";
require(['jquery', 'jquery/ui', 'domReady!'], function (jQuery) {
var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
if(deviceType!="d"){
jQuery('.level1 .title strong').each(function(){
jQuery(this).append('<span class="rm-expand close"></span>');
});
jQuery('.level1 .title>a').each(function(){
var src = jQuery(this).attr("href");
console.log(src);
jQuery(this).attr("href","#")
jQuery(this).parents("ul.level1").find("ul").prepend('<li class="level2 ui-menu-item seeAll"><a href="'+src+'">'+seeAll+'</a></li>');
});
jQuery('.level1 .title').click(function (e) {
e.preventDefault();
e.stopPropagation();
jQuery(this).find("span.rm-expand").trigger("click");
return false;
});
jQuery('.rm-expand').click(function () {
if (jQuery(this).hasClass('close')) {
jQuery(this).parents("ul.level1").find("ul").addClass("open");
jQuery(this).addClass('open');
jQuery(this).removeClass('close');
jQuery(this).html('');
}
else {
jQuery(this).parents("ul.level1").find("ul").removeClass("open");
jQuery(this).removeClass('open');
jQuery(this).addClass('close');
jQuery(this).html('');
}
return false;
});
jQuery('.level2 a').click(function (e) {
e.preventDefault();
e.stopPropagation();
console.log("test");
window.location = jQuery(this).attr("href");
return false;
});
}
});
</script--></div></div></div> </li>
</ul>
</div>
</li>
<li
data-child-id="category-node-6860-main"
class="level-0"
>
<div
class="flex items-center transition-transform duration-150 ease-in-out transform"
>
<a
class="flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black"
href="https://www.modyf.fr/chaussures-de-securite"
title="Chaussures de sécurité"
data-link-id="category-node-6860"
>
Chaussures de sécurité </a>
<button
@click="toggleSubcategory('category-node-6860')"
class="cursor-pointer absolute w-full h-full"
aria-label="Ouvrir Chaussures de sécurité sous-catégories"
aria-haspopup="true"
data-button-id="category-node-6860"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey absolute right-[20px] top-0 bottom-0 m-auto" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</button>
</div>
<div
data-child-id="category-node-6860"
class="hidden w-full h-full"
>
<ul aria-label="Sous-catégories">
<li>
<button
type="button"
class="flex items-center px-[20px] py-[15px] border-b cursor-pointer bg-container border-modyf-lightest_grey w-full"
@click="toggleSubcategory('category-node-6860')"
aria-label="Retour aux catégories principales"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/>
</svg>
<span class="ml-4 font-wuerth-bold text-[16px] text-modyf-black !mx-auto">
Chaussures de sécurité </span>
</button>
</li>
<li class="w-full px-[20px] py-[15px] border-b bg-modyf-white">
<a
href="https://www.modyf.fr/chaussures-de-securite"
title="Chaussures de sécurité"
class="border-modyf-lightest_grey cursor-pointer bg-modyf-white font-wuerth-bold text-[16px] text-modyf-black call-to-action-arrow-mixin"
>
Tous les Chaussures de sécurité </a>
</li>
</ul>
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=CIWUCEX]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="CIWUCEX"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="custom-menu col6">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Types</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/basses">Chaussures de sécurité basses</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-de-securite/montantes">Chaussures de sécurité montantes</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/baskets">Baskets de sécurité</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-de-securite/baskets/speciales-femmes">Baskets de sécurité femme</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/bottes">Bottes de sécurité</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/bottes/bottes-de-securite-fourrees">Bottes de sécurité fourrées</a></li>
<!--li class="level2 ui-menu-item"><a href="">Sandales de sécurité </a></li-->
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Normes</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/s1p">Chaussures S1P</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/s2">Chaussures S2</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/s3">Chaussures S3</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/src">Chaussures SRC</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/chaussures-esd">Chaussures ESD</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/ci">Chaussures CI</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/hi">Chaussures HI</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/hro">Chaussures HRO</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Spécificités</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-securite-legeres">Chaussures légères</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite-sans-lacets">Chaussures de sécurité sans lacets</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite-blanches">Chaussures de sécurité blanches</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/sans-metal">Chaussures sans métal</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/coque-en-345-347">Chaussures coquées</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-impermeables">Chaussures de sécurité imperméables</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-de-securite/anti-transpiration">Chaussures de sécurité anti-transpiration</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/hiver">Chaussures de sécurité Hiver</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Marque</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/marque-modyf/chaussures-de-securite">Würth MODYF</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/puma-safety-shoes">Puma Safety Shoes</a></li>
</ul>
</ul>
<ul>
<li class="title ui-menu-item"><a href="https://www.modyf.fr/accessoires/accessoires-chaussures"><strong>Accessoires pour chaussures</strong></a></li>
</ul>
</div>
<div class="colx2">
<ul>
<li class="ui-menu-item">
<a href="/shoefinder">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/custom-cms-menu/trouver-mes-chaussures-de-securite-23-24.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/custom-cms-menu/trouver-mes-chaussures-de-securite-23-24.jpg" alt="Trouver les chaussures de sécurité faites pour mon métier" loading="lazy" /></picture>
</a>
</li>
</ul>
</div>
</div>
</div>
</div></div></div> </li>
</ul>
</div>
</li>
<li
data-child-id="category-node-6625-main"
class="level-0"
>
<div
class="flex items-center transition-transform duration-150 ease-in-out transform"
>
<a
class="flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black"
href="https://www.modyf.fr/tenue-ete"
title="Tenues printemps/été"
data-link-id="category-node-6625"
>
Tenues printemps/été </a>
<button
@click="toggleSubcategory('category-node-6625')"
class="cursor-pointer absolute w-full h-full"
aria-label="Ouvrir Tenues printemps/été sous-catégories"
aria-haspopup="true"
data-button-id="category-node-6625"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey absolute right-[20px] top-0 bottom-0 m-auto" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</button>
</div>
<div
data-child-id="category-node-6625"
class="hidden w-full h-full"
>
<ul aria-label="Sous-catégories">
<li>
<button
type="button"
class="flex items-center px-[20px] py-[15px] border-b cursor-pointer bg-container border-modyf-lightest_grey w-full"
@click="toggleSubcategory('category-node-6625')"
aria-label="Retour aux catégories principales"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/>
</svg>
<span class="ml-4 font-wuerth-bold text-[16px] text-modyf-black !mx-auto">
Tenues printemps/été </span>
</button>
</li>
<li class="w-full px-[20px] py-[15px] border-b bg-modyf-white">
<a
href="https://www.modyf.fr/tenue-ete"
title="Tenues printemps/été"
class="border-modyf-lightest_grey cursor-pointer bg-modyf-white font-wuerth-bold text-[16px] text-modyf-black call-to-action-arrow-mixin"
>
Tous les Tenues printemps/été </a>
</li>
</ul>
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=WCH0JJB]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="WCH0JJB"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>.custom-menu ul{display:block!important}.mobileOnly{display:none}.full-width-block{height:auto!important}.navigation .level0 .custom-menu *{box-sizing:border-box}.navigation .level0 .custom-menu{padding:0;display:flex;justify-content:space-around;flex-flow:row;max-width:1680px;margin:0 auto;background-color:#fff;box-sizing:border-box}.inner-wrapper{display:flex;margin:0 auto;width:100%;max-width:1320px}.navigation .level0 .custom-menu.col5 .col{width:264px;padding:0 25px}.navigation .level0 .custom-menu.col6 .col{width:220px;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2{width:490px;max-width:100%;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2 ul.open ul{display:flex!important;flex-flow:column wrap;max-height:290px}.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{list-style:none;padding-left:0;margin:0 0 25px}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{margin-bottom:1rem}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{background-color:#c3c8c8;color:#fff;text-align:center;text-transform:uppercase;font-weight:700;font-size:14px;font-family:wuerthbold;margin-bottom:1rem;padding:0;position:relative;background-size:cover;background-repeat:no-repeat;background-position:right}.navigation .level0 .custom-menu ol.ctas li.hiver,.navigation .level0 .custom-menu ul.ctas li.hiver{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tenue-thermique.jpg)}.navigation .level0 .custom-menu ol.ctas li.ete,.navigation .level0 .custom-menu ul.ctas li.ete{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tee-shirt-travail.jpg)}.navigation .level0 .custom-menu ol.ctas li.pluie,.navigation .level0 .custom-menu ul.ctas li.pluie{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/vetement-pluie.jpg)}.navigation .level0 .custom-menu ol.ctas li a,.navigation .level0 .custom-menu ul.ctas li a{text-decoration:none;color:inherit;margin-bottom:0;padding:25px 7px;z-index:3;position:relative}.navigation .level0 .custom-menu img{max-width:100%}body .navigation li.level0 .submenu span.atc{display:inline-block;padding:0;margin-bottom:10px}.navigation .all-category{background-color:#fff}.navigation .all-category a,.navigation .seeAll a,.navigation .submenu:not(:first-child) ul>li.seeAll a{position:relative;font-family:wuerthbold;display:inline-block;text-transform:none}.all-category a{text-align:center}.navigation .all-category a::after,.seeAll a::after{width:24px;height:24px;background-size:cover;background-position:center;background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='rgba(204,0,0,0.99)' stroke-width='2'%3E%3Cpath d='M4 12h14M15 17l5-5-5-5'/%3E%3C/g%3E%3C/svg%3E%0A");content:'';display:inline-block;position:absolute;top:50%;transform:translateY(-50%);right:0}.seeAll a:hover{color:#c00}@media (max-width:1049px){.desktopOnly,.level1 ol,.level1 ul{display:none}.custom-menu .level1 ul{display:none!important}.mobileOnly,.rm-expand{display:block}.custom-menu ul.open{display:block!important}.custom-menu .inner-wrapper,.navigation .level0 .custom-menu{flex-flow:column wrap}.navigation .level0 .custom-menu.col5 .col,.navigation .level0 .custom-menu.col6 .col,.navigation .level0 .custom-menu.col6 .colx2{width:100%;padding:0}.custom-menu ol li.title,.custom-menu ul li.title,.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{margin-bottom:0}.navigation .level0 .custom-menu li{border-bottom:1px solid #efefef}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{padding:15px 20px 15px 30px;margin-bottom:0}.navigation .level0 .custom-menu ol li.title a,.navigation .level0 .custom-menu ul li.title a{padding:0}body .navigation li.level0 .submenu span.atc{padding:15px 40px 15px 60px;margin-bottom:0}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{margin:10px 20px}.navigation>ul .level0 .custom-menu .level1 a{border-bottom:0}.navigation .level0 .custom-menu .level1 li.level2{border:none}.level1 ol,.level1 ul{background-color:#fcfcfc}.navigation .level0 .custom-menu.col6 .colx2 ul ul{display:none;flex-flow:column;background-color:#fcfcfc;max-height:none}.title strong{position:relative;display:flex;justify-content:space-between;align-items:center}.rm-expand{width:24px;height:24px;background-position:center;background-repeat:no-repeat}.rm-expand.close{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 6.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(7.5) rotate(90)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}.rm-expand.open{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='2' viewBox='0 0 14 2'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 0.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(14 1.5) rotate(180)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}}</style>
<div class="custom-menu col6">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item first parent"><strong>Nos vêtements d'été</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/tenue-ete/pantalons-de-travail-ete">Pantalons de travail été</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/bermudas-de-travail">Shorts de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/t-shirts-de-travail">Tee-shirts de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/polos-de-travail">Polos de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/haute-visibilite/t-shirts-et-polos">Tee-shirts et Polos Haute-visibilité</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/chemises-de-travail">Chemises de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/tenue-ete/gilet-de-travail-ete">Gilets de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item first parent"><strong>Nos chaussures d'été </strong> </li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/chaussures-de-securite/baskets">Baskets de sécurité</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item first parent"><strong>Nos accessoires d'été </strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/accessoires/chapeaux/casquettes-entreprise">Casquettes</a></li>
</ul>
</ul>
</div>
</div>
</div>
</div></div></div> </li>
</ul>
</div>
</li>
<li
data-child-id="category-node-6937-main"
class="level-0"
>
<div
class="flex items-center transition-transform duration-150 ease-in-out transform"
>
<a
class="flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black"
href="https://www.modyf.fr/accessoires"
title="Accessoires"
data-link-id="category-node-6937"
>
Accessoires </a>
<button
@click="toggleSubcategory('category-node-6937')"
class="cursor-pointer absolute w-full h-full"
aria-label="Ouvrir Accessoires sous-catégories"
aria-haspopup="true"
data-button-id="category-node-6937"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey absolute right-[20px] top-0 bottom-0 m-auto" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</button>
</div>
<div
data-child-id="category-node-6937"
class="hidden w-full h-full"
>
<ul aria-label="Sous-catégories">
<li>
<button
type="button"
class="flex items-center px-[20px] py-[15px] border-b cursor-pointer bg-container border-modyf-lightest_grey w-full"
@click="toggleSubcategory('category-node-6937')"
aria-label="Retour aux catégories principales"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/>
</svg>
<span class="ml-4 font-wuerth-bold text-[16px] text-modyf-black !mx-auto">
Accessoires </span>
</button>
</li>
<li class="w-full px-[20px] py-[15px] border-b bg-modyf-white">
<a
href="https://www.modyf.fr/accessoires"
title="Accessoires"
class="border-modyf-lightest_grey cursor-pointer bg-modyf-white font-wuerth-bold text-[16px] text-modyf-black call-to-action-arrow-mixin"
>
Tous les Accessoires </a>
</li>
</ul>
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=DBMVN83]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="DBMVN83"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="custom-menu col5">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Accessoires pour les pieds</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/chaussettes">Chaussettes de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/accessoires-chaussures/semelles">Semelles</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/accessoires-chaussures/lacets">Lacets</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Accessoires pour le corps</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/genouilleres">Genouillères de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/sous-vetements">Sous-vêtements</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/ceintures">Ceintures</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/porte-outils">Ceintures porte-outils</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/chapeaux">Casquettes et bonnets</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/sac-bagages">Sacs et bagages</a></li>
</ul>
</ul>
</div>
<!--div class="col">
<ul>
<li class="title category-item parent"><strong>Accessoires divers</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="">Tapis d'entrée</a></li>
<li class="level2 ui-menu-item"><a href="">Masques de protection</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/sac-bagages">Sacs et bagages</a></li>
<li class="level2 ui-menu-item"><a href="">Produits d'entretien </a></li>
</ul>
</ul>
</div-->
<!--div class="col">
<ul>
<li class="ui-menu-item">
<a href="https://www.modyf.fr/sneaker-100998-2">
<picture class="mfwebp"> <source type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/custom-cms-menu/chaussettes-ete.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/custom-cms-menu/chaussettes-ete.jpg" alt="Chaussettes sneakers de travail Würth MODYF blanches/vertes" /></picture>
</a>
</li>
</ul>
</div-->
<div class="col">
<ul>
<li class="level2 ui-menu-item">
<a href="https://www.modyf.fr/hiver-100740-2">
<picture class="mfwebp"> <source type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/custom-cms-menu/chaussettes-hiver.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/custom-cms-menu/chaussettes-hiver.jpg" alt="Chaussettes de travail hiver montantes Würth MODYF noires/rouges" /></picture>
</a>
</li>
</ul>
</div>
</div>
</div></div></div></div> </li>
</ul>
</div>
</li>
<li
data-child-id="category-node-6989-main"
class="level-0"
>
<div
class="flex items-center transition-transform duration-150 ease-in-out transform"
>
<a
class="flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black"
href="https://www.modyf.fr/metiers"
title="Métiers"
data-link-id="category-node-6989"
>
Métiers </a>
<button
@click="toggleSubcategory('category-node-6989')"
class="cursor-pointer absolute w-full h-full"
aria-label="Ouvrir Métiers sous-catégories"
aria-haspopup="true"
data-button-id="category-node-6989"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey absolute right-[20px] top-0 bottom-0 m-auto" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/>
</svg>
</button>
</div>
<div
data-child-id="category-node-6989"
class="hidden w-full h-full"
>
<ul aria-label="Sous-catégories">
<li>
<button
type="button"
class="flex items-center px-[20px] py-[15px] border-b cursor-pointer bg-container border-modyf-lightest_grey w-full"
@click="toggleSubcategory('category-node-6989')"
aria-label="Retour aux catégories principales"
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" class="text-modyf-grey" width="22" height="20" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/>
</svg>
<span class="ml-4 font-wuerth-bold text-[16px] text-modyf-black !mx-auto">
Métiers </span>
</button>
</li>
<li class="w-full px-[20px] py-[15px] border-b bg-modyf-white">
<a
href="https://www.modyf.fr/metiers"
title="Métiers"
class="border-modyf-lightest_grey cursor-pointer bg-modyf-white font-wuerth-bold text-[16px] text-modyf-black call-to-action-arrow-mixin"
>
Tous les Métiers </a>
</li>
</ul>
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=OUIW5LA]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="OUIW5LA"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="custom-menu col5">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment"><strong>Vêtements BTP et chantiers</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment/macon-travaux-maconnerie">Maçon</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment/couvreur-zingueur">Couvreur-zingueur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment/travaux-publics">Travaux Publics</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique"><strong>Vêtements pour la Logistique et le transport</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique/transporteur">Transporteur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique/chauffeur-livreur">Chauffeur Livreur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique/cariste">Cariste</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts"><strong>Vêtements pour Espaces-Verts</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts/agriculteur">Agriculteur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts/jardinier">Jardinier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts/horticulteur">Horticulteur </a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie"><strong>Vêtements pour l'industrie</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie/technicien">Technicien</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie/ouvrier">Ouvrier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie/service-maintenance">Service de maintenance</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire"><strong>Tenues pour Installateurs</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire/electricien">Électricien</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire/plombier">Plombier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire/serrurier">Serrurier</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal"><strong>Vêtements pour l'industrie du métal</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal/soudeur-soudage">Soudeur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal/chaudronnier">Chaudronnier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal/ferronier">Ferronnier</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile"><strong>Tenues pour l'Automobile</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile/mecanique-mecanicien">Mécanicien</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile/depanneur">Dépanneur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile/carrossier">Carrossier</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/artisanat"><strong>Tenues pour l'artisanat</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisanat/travaux-interieur">Travaux d'intérieur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisanat/travaux-exterieur">Travaux d'extérieur</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois"><strong>Vêtements pour Artisan du bois</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/charpentier">Charpentier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/menuisier">Menuisier</a></li>
<!--li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/ebeniste">Ébéniste</a></li-->
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/bucheron">Bûcheron</a></li>
<!--li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/elagueur">Élagueur</a></li-->
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/administration"><strong>Vêtements pour l'Administration</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/administration/employe-mairie">Employés de mairie</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/administration/collectivites">Collectivités</a></li>
</ul>
</ul>
</div>
</div>
</div>
</div></div></div> </li>
</ul>
</div>
</li>
<li
data-child-id="category-node-7106-main"
class="level-0"
>
<div
class="flex items-center transition-transform duration-150 ease-in-out transform"
>
<a
class="flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black"
href="https://www.modyf.fr/collections"
title="Collections"
data-link-id="category-node-7106"
>
Collections </a>
</div>
</li>
<li
data-child-id="category-node-6958-main"
class="level-0"
>
<div
class="flex items-center transition-transform duration-150 ease-in-out transform"
>
<a
class="flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black"
href="https://www.modyf.fr/destockage"
title="Déstockage"
data-link-id="category-node-6958"
>
Déstockage </a>
</div>
</li>
</ul>
<div class="header-top-links-mobile border-t border-modyf-black">
<nav class="navigation header-top-links-mobile">
<style>#html-body [data-pb-style=KFI3HWX]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
body .navigation.header-top-links-mobile p{margin-bottom:0;border-bottom:1px solid #ddd}.header-top-links-mobile a{line-height:normal}.header-top-links-mobile p span.atc{font-family:WuerthBold,'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:12px;letter-spacing:0;color:#000;text-transform:uppercase;background-color:#efefef;padding:19px 0 20px 20px;display:block;line-height:normal}
</style></div><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="KFI3HWX"><div data-content-type="text" data-appearance="default" data-element="main"><p><span id="K3GES5R" class="atc" data-atc="L2RlbWFuZGUtZGUtY2F0YWxvZ3Vl">Catalogue 2025-2026</span></p>
<p><span class="atc" data-atc="L2dyYW5kcy1jb21wdGVz">Grands Comptes</span></p>
<p><a tabindex="0" href="https://www.modyf.fr/personnalisation">Personnalisation</a></p>
<p><span class="atc" data-atc="L25ld3NsZXR0ZXI=">Newsletter -10€</span></p>
<p><span class="atc" data-atc="L2VudHJlcHJpc2U=" data-target="_blank">Entreprise</span></p>
<p><span class="atc" data-atc="L25vdXMtY29udGFjdGVy">Contact</span></p>
<p><a tabindex="0" href="https://blog.modyf.fr">Blog</a></p></div></div></div> </nav>
</div>
</div>
</nav>
<script>
'use strict';
const initMenuMobile_69b8dc1f8aadc = () => {
return {
mobilePanelActiveId: null,
mobilePanelActiveIdLvl3: null,
open: false,
openMenu() {
this.open = true
this.$nextTick(() => hyva.trapFocus(this.$refs['mobileMenuNavLinks']));
// Prevent from body scrolling while mobile menu opened
document.body.style.position = 'fixed';
},
closeMenu() {
document.body.style.position = '';
if (this.open) {
this.$nextTick(() => this.$refs['mobileMenuTrigger'].focus() || hyva.releaseFocus());
}
this.open = false
this.mobilePanelActiveId = null
},
toggleSubcategory(index) {
const element = document.querySelector('[data-child-id=' + index + ']');
const link = document.querySelector('[data-link-id=' + index + ']');
const button = document.querySelector('[data-button-id=' + index + ']');
element.classList.toggle('hidden');
link.classList.toggle('hidden');
button.classList.toggle('hidden');
this.scrollWindowTo(element);
},
toggleSubcategoryLvl3(index) {
const element = document.querySelector('[data-child-id=' + index + ']');
const button = document.querySelector('[data-button-id=' + index + ']');
element.classList.toggle('hidden');
button.classList.toggle('show-submenu');
},
scrollWindowTo(el) {
el.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
}
}
</script>
<nav
class="navigation hidden desktop:block"
aria-label="Menu principal"
x-data="initMenuDesktop_69b8dc1feaec7()"
x-ref="nav-desktop"
@load.window="setActiveMenu($root)"
>
<ul class="flex justify-start flex-wrap gap-x-[30px] pt-[24px]">
<li
class="level-0"
x-data="{ open: false, canHover(func) { const isHoverableDevice = window.matchMedia('(hover: hover) and (pointer: fine)').matches; if (!isHoverableDevice) return; func(); } }"
@click.outside="open = false"
@mouseenter="canHover(() => { open = true })"
@mouseleave="canHover(() => { open = false })"
@keydown.escape="open = false"
>
<span class="flex items-center text-md">
<a class="font-wuerth-bold text-[18px] leading-[28px] text-modyf-black level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red"
href="https://www.modyf.fr/vetements-professionnels"
title="Vêtements de travail"
@focus="hoverPanelActiveId = 0"
>
Vêtements de travail </a>
</span>
<div
id="desktop-menu-category-6798"
class="z-30 absolute inset-x-0 gap-8 px-[5%] pt-[85px] min-h-64 border-t border-modyf-lightest_grey bg-white shadow-md overflow-auto"
x-show="open === true"
x-transition
x-cloak
>
<div id="$menuId" class="grow flex justify-between desktop:max-w-[1290px] desktop:m-auto">
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=PSP1OJV]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="PSP1OJV"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>.custom-menu ul{display:block!important}.mobileOnly{display:none}.full-width-block{height:auto!important}.navigation .level0 .custom-menu *{box-sizing:border-box}.navigation .level0 .custom-menu{padding:0;display:flex;justify-content:space-around;flex-flow:row;max-width:1680px;margin:0 auto;background-color:#fff;box-sizing:border-box}.inner-wrapper{display:flex;margin:0 auto;width:100%;max-width:1320px}.navigation .level0 .custom-menu.col5 .col{width:264px;padding:0 25px}.navigation .level0 .custom-menu.col6 .col{width:220px;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2{width:490px;max-width:100%;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2 ul.open ul{display:flex!important;flex-flow:column wrap;max-height:290px}.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{list-style:none;padding-left:0;margin:0 0 25px}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{margin-bottom:1rem}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{background-color:#c3c8c8;color:#fff;text-align:center;text-transform:uppercase;font-weight:700;font-size:14px;font-family:wuerthbold;margin-bottom:1rem;padding:0;position:relative;background-size:cover;background-repeat:no-repeat;background-position:right}.navigation .level0 .custom-menu ol.ctas li.hiver,.navigation .level0 .custom-menu ul.ctas li.hiver{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tenue-thermique.jpg)}.navigation .level0 .custom-menu ol.ctas li.ete,.navigation .level0 .custom-menu ul.ctas li.ete{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tee-shirt-travail.jpg)}.navigation .level0 .custom-menu ol.ctas li.pluie,.navigation .level0 .custom-menu ul.ctas li.pluie{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/vetement-pluie.jpg)}.navigation .level0 .custom-menu ol.ctas li a,.navigation .level0 .custom-menu ul.ctas li a{text-decoration:none;color:inherit;margin-bottom:0;padding:25px 7px;z-index:3;position:relative}.navigation .level0 .custom-menu img{max-width:100%}body .navigation li.level0 .submenu span.atc{display:inline-block;padding:0;margin-bottom:10px}.navigation .all-category{background-color:#fff}.navigation .all-category a,.navigation .seeAll a,.navigation .submenu:not(:first-child) ul>li.seeAll a{position:relative;font-family:wuerthbold;display:inline-block;text-transform:none}.all-category a{text-align:center}.navigation .all-category a::after,.seeAll a::after{width:24px;height:24px;background-size:cover;background-position:center;background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='rgba(204,0,0,0.99)' stroke-width='2'%3E%3Cpath d='M4 12h14M15 17l5-5-5-5'/%3E%3C/g%3E%3C/svg%3E%0A");content:'';display:inline-block;position:absolute;top:50%;transform:translateY(-50%);right:0}.seeAll a:hover{color:#c00}
.navigation li.level0 .submenu a.new::after {
content: "nouveau";
font-family: 'WuerthBold';
background: #c00;
padding: 2px 4px;
color: #fff;
display: inline-block;
font-size: 8px;
text-transform: uppercase;
vertical-align: super;
margin-left: 5px;
}
@media (max-width:1049px){.desktopOnly,.level1 ol,.level1 ul{display:none}
.custom-menu .level1 ul{display:none!important}.mobileOnly,.rm-expand{display:block}.custom-menu ul.open{display:block!important}.custom-menu .inner-wrapper,.navigation .level0 .custom-menu{flex-flow:column wrap}.navigation .level0 .custom-menu.col5 .col,.navigation .level0 .custom-menu.col6 .col,.navigation .level0 .custom-menu.col6 .colx2{width:100%;padding:0}.custom-menu ol li.title,.custom-menu ul li.title,.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{margin-bottom:0}.navigation .level0 .custom-menu li{border-bottom:1px solid #efefef}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{padding:15px 20px 15px 30px;margin-bottom:0}.navigation .level0 .custom-menu ol li.title a,.navigation .level0 .custom-menu ul li.title a{padding:0}body .navigation li.level0 .submenu span.atc{padding:15px 40px 15px 60px;margin-bottom:0}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{margin:10px 20px}.navigation>ul .level0 .custom-menu .level1 a{border-bottom:0}.navigation .level0 .custom-menu .level1 li.level2{border:none}.level1 ol,.level1 ul{background-color:#fcfcfc}.navigation .level0 .custom-menu.col6 .colx2 ul ul{display:none;flex-flow:column;background-color:#fcfcfc;max-height:none}.title strong{position:relative;display:flex;justify-content:space-between;align-items:center}.rm-expand{width:24px;height:24px;background-position:center;background-repeat:no-repeat}.rm-expand.close{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 6.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(7.5) rotate(90)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}.rm-expand.open{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='2' viewBox='0 0 14 2'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 0.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(14 1.5) rotate(180)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}}</style>
<div class="custom-menu col6">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Bas de travail</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/pantalons-de-travail">Pantalons de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/pantalons-de-travail/jeans">Jeans de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/bermudas-de-travail">Bermudas de travail</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Hauts de travail</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/pulls-de-travail-et-sweats">Pull de travail et sweats</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/t-shirts-de-travail">T-shirts de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/polos-de-travail">Polo de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/chemises-de-travail">Chemises de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Vestes et gilets</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/vestes-de-travail">Vestes de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/gilets-de-travail">Gilets de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/blousons-parkas-de-travail">Blousons et parkas</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-pluie-hiver/softshell">Softshell</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-pluie-hiver/polaires-travail">Polaires de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Vêtements normés</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a
href="https://www.modyf.fr/vetements-professionnels/haute-visibilite">Haute-visibilité</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/multinormes">Multinormes</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Combinaisons et bleus de travail</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/bleu-de-travail">Bleus de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/combinaisons">Combinaisons de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/bleu-de-travail/salopettes-cottes">Salopette de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="ctas">
<li class="hiver ui-menu-item first"><a href="https://www.modyf.fr/vetements-pluie-hiver/vetements-thermiques">VÊTEMENTS HIVER</a></li>
<li class="ete ui-menu-item"><a href="https://www.modyf.fr/tenue-ete">VÊTEMENTS ÉTÉ</a></li>
<li class="pluie ui-menu-item"><a href="https://www.modyf.fr/vetements-pluie-hiver/tenues-impermeables">VÊTEMENTS PLUIE</a></li>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent ui-menu-item"><strong>Nos Gammes</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/collections/star">Star</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/stretch-evolution">Stretch Evolution</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/fluo">Fluo</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/cetus">Cetus</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/stretch-x">Stretch X</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/office">Office</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/classic">Classic</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/x-finity">X-Finity</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/made-in-france">Made in France</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/fusion">Fusion</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/urban">Urban</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/collections/temper" class="new">Temper</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-itemparent ui-menu-item"><strong>Genre</strong></li>
<ul>
<li class="level2 ui-menu-item first"><span class="atc" data-atc="L3ZldGVtZW50cy1wcm9mZXNzaW9ubmVscz9nZW5kZXI9aG9tbWU=">Homme</span></li>
<li class="level2 ui-menu-item"><span class="atc" data-atc="L3ZldGVtZW50cy1wcm9mZXNzaW9ubmVscz9nZW5kZXI9dW5pc2V4ZQ==">Mixte</span></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/collection-femme">Femme</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title category-item ui-menu-item parent"><strong>Marque</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/marque-modyf/habits-professionnels">Würth MODYF</a></li>
</ul>
</ul>
</div>
</div>
</div></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><script>
document.addEventListener("DOMContentLoaded", function () {
const seeAll = "Tout voir";
const userAgent = navigator.userAgent;
const deviceType = /iPad/.test(userAgent)
? "t"
: /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(userAgent)
? "m"
: "d";
if (deviceType === "d") return;
const mobileMenu = document.querySelector('[x-ref="mobileMenuNavLinks"]');
if (!mobileMenu) return;
if (mobileMenu.dataset.processed === "true") return;
mobileMenu.dataset.processed = "true";
mobileMenu.querySelectorAll('.level1 .title strong').forEach(strongEl => {
const span = document.createElement('span');
span.className = 'rm-expand close';
strongEl.appendChild(span);
});
mobileMenu.querySelectorAll('.level1 .title > a').forEach(aEl => {
const href = aEl.getAttribute('href');
aEl.setAttribute('href', '#');
const level1 = aEl.closest('ul.level1');
const level2 = level1?.querySelector('ul');
if (level2 && !level2.querySelector('.seeAll')) {
const seeAllLi = document.createElement('li');
seeAllLi.className = 'level2 ui-menu-item seeAll';
seeAllLi.innerHTML = `<a href="${href}">${seeAll}</a>`;
level2.insertBefore(seeAllLi, level2.firstChild);
}
});
mobileMenu.querySelectorAll('.level1 .title').forEach(titleEl => {
titleEl.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const expander = titleEl.querySelector('span.rm-expand');
if (expander) expander.click();
});
});
mobileMenu.querySelectorAll('.rm-expand').forEach(expander => {
expander.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
const parentUl = expander.closest('ul.level1');
const subMenu = parentUl?.querySelector('ul');
if (expander.classList.contains('close')) {
subMenu?.classList.add('open');
expander.classList.remove('close');
expander.classList.add('open');
expander.innerHTML = '';
} else {
subMenu?.classList.remove('open');
expander.classList.remove('open');
expander.classList.add('close');
expander.innerHTML = '';
}
});
});
mobileMenu.querySelectorAll('.level2 a').forEach(aEl => {
aEl.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
window.location = aEl.getAttribute('href');
});
});
});
</script>
<!--script>
var seeAll = "Tout voir";
require(['jquery', 'jquery/ui', 'domReady!'], function (jQuery) {
var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
if(deviceType!="d"){
jQuery('.level1 .title strong').each(function(){
jQuery(this).append('<span class="rm-expand close"></span>');
});
jQuery('.level1 .title>a').each(function(){
var src = jQuery(this).attr("href");
console.log(src);
jQuery(this).attr("href","#")
jQuery(this).parents("ul.level1").find("ul").prepend('<li class="level2 ui-menu-item seeAll"><a href="'+src+'">'+seeAll+'</a></li>');
});
jQuery('.level1 .title').click(function (e) {
e.preventDefault();
e.stopPropagation();
jQuery(this).find("span.rm-expand").trigger("click");
return false;
});
jQuery('.rm-expand').click(function () {
if (jQuery(this).hasClass('close')) {
jQuery(this).parents("ul.level1").find("ul").addClass("open");
jQuery(this).addClass('open');
jQuery(this).removeClass('close');
jQuery(this).html('');
}
else {
jQuery(this).parents("ul.level1").find("ul").removeClass("open");
jQuery(this).removeClass('open');
jQuery(this).addClass('close');
jQuery(this).html('');
}
return false;
});
jQuery('.level2 a').click(function (e) {
e.preventDefault();
e.stopPropagation();
console.log("test");
window.location = jQuery(this).attr("href");
return false;
});
}
});
</script--></div></div></div> </li>
</ul>
</div>
</div>
</li>
<li
class="level-0"
x-data="{ open: false, canHover(func) { const isHoverableDevice = window.matchMedia('(hover: hover) and (pointer: fine)').matches; if (!isHoverableDevice) return; func(); } }"
@click.outside="open = false"
@mouseenter="canHover(() => { open = true })"
@mouseleave="canHover(() => { open = false })"
@keydown.escape="open = false"
>
<span class="flex items-center text-md">
<a class="font-wuerth-bold text-[18px] leading-[28px] text-modyf-black level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red"
href="https://www.modyf.fr/chaussures-de-securite"
title="Chaussures de sécurité"
@focus="hoverPanelActiveId = 0"
>
Chaussures de sécurité </a>
</span>
<div
id="desktop-menu-category-6860"
class="z-30 absolute inset-x-0 gap-8 px-[5%] pt-[85px] min-h-64 border-t border-modyf-lightest_grey bg-white shadow-md overflow-auto"
x-show="open === true"
x-transition
x-cloak
>
<div id="$menuId" class="grow flex justify-between desktop:max-w-[1290px] desktop:m-auto">
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=CIWUCEX]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="CIWUCEX"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="custom-menu col6">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Types</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/basses">Chaussures de sécurité basses</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-de-securite/montantes">Chaussures de sécurité montantes</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/baskets">Baskets de sécurité</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-de-securite/baskets/speciales-femmes">Baskets de sécurité femme</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/bottes">Bottes de sécurité</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/bottes/bottes-de-securite-fourrees">Bottes de sécurité fourrées</a></li>
<!--li class="level2 ui-menu-item"><a href="">Sandales de sécurité </a></li-->
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Normes</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/s1p">Chaussures S1P</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/s2">Chaussures S2</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/s3">Chaussures S3</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/src">Chaussures SRC</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/chaussures-esd">Chaussures ESD</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/ci">Chaussures CI</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/hi">Chaussures HI</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/hro">Chaussures HRO</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Spécificités</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-securite-legeres">Chaussures légères</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite-sans-lacets">Chaussures de sécurité sans lacets</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite-blanches">Chaussures de sécurité blanches</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/sans-metal">Chaussures sans métal</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/coque-en-345-347">Chaussures coquées</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-impermeables">Chaussures de sécurité imperméables</a></li>
<li class="level2 ui-menu-item border"><a href="https://www.modyf.fr/chaussures-de-securite/anti-transpiration">Chaussures de sécurité anti-transpiration</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/chaussures-de-securite/hiver">Chaussures de sécurité Hiver</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Marque</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/marque-modyf/chaussures-de-securite">Würth MODYF</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/puma-safety-shoes">Puma Safety Shoes</a></li>
</ul>
</ul>
<ul>
<li class="title ui-menu-item"><a href="https://www.modyf.fr/accessoires/accessoires-chaussures"><strong>Accessoires pour chaussures</strong></a></li>
</ul>
</div>
<div class="colx2">
<ul>
<li class="ui-menu-item">
<a href="/shoefinder">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/custom-cms-menu/trouver-mes-chaussures-de-securite-23-24.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/custom-cms-menu/trouver-mes-chaussures-de-securite-23-24.jpg" alt="Trouver les chaussures de sécurité faites pour mon métier" loading="lazy" /></picture>
</a>
</li>
</ul>
</div>
</div>
</div>
</div></div></div> </li>
</ul>
</div>
</div>
</li>
<li
class="level-0"
x-data="{ open: false, canHover(func) { const isHoverableDevice = window.matchMedia('(hover: hover) and (pointer: fine)').matches; if (!isHoverableDevice) return; func(); } }"
@click.outside="open = false"
@mouseenter="canHover(() => { open = true })"
@mouseleave="canHover(() => { open = false })"
@keydown.escape="open = false"
>
<span class="flex items-center text-md">
<a class="font-wuerth-bold text-[18px] leading-[28px] text-modyf-black level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red"
href="https://www.modyf.fr/tenue-ete"
title="Tenues printemps/été"
@focus="hoverPanelActiveId = 0"
>
Tenues printemps/été </a>
</span>
<div
id="desktop-menu-category-6625"
class="z-30 absolute inset-x-0 gap-8 px-[5%] pt-[85px] min-h-64 border-t border-modyf-lightest_grey bg-white shadow-md overflow-auto"
x-show="open === true"
x-transition
x-cloak
>
<div id="$menuId" class="grow flex justify-between desktop:max-w-[1290px] desktop:m-auto">
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=WCH0JJB]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="WCH0JJB"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>.custom-menu ul{display:block!important}.mobileOnly{display:none}.full-width-block{height:auto!important}.navigation .level0 .custom-menu *{box-sizing:border-box}.navigation .level0 .custom-menu{padding:0;display:flex;justify-content:space-around;flex-flow:row;max-width:1680px;margin:0 auto;background-color:#fff;box-sizing:border-box}.inner-wrapper{display:flex;margin:0 auto;width:100%;max-width:1320px}.navigation .level0 .custom-menu.col5 .col{width:264px;padding:0 25px}.navigation .level0 .custom-menu.col6 .col{width:220px;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2{width:490px;max-width:100%;padding:0 25px}.navigation .level0 .custom-menu.col6 .colx2 ul.open ul{display:flex!important;flex-flow:column wrap;max-height:290px}.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{list-style:none;padding-left:0;margin:0 0 25px}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{margin-bottom:1rem}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{background-color:#c3c8c8;color:#fff;text-align:center;text-transform:uppercase;font-weight:700;font-size:14px;font-family:wuerthbold;margin-bottom:1rem;padding:0;position:relative;background-size:cover;background-repeat:no-repeat;background-position:right}.navigation .level0 .custom-menu ol.ctas li.hiver,.navigation .level0 .custom-menu ul.ctas li.hiver{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tenue-thermique.jpg)}.navigation .level0 .custom-menu ol.ctas li.ete,.navigation .level0 .custom-menu ul.ctas li.ete{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/tee-shirt-travail.jpg)}.navigation .level0 .custom-menu ol.ctas li.pluie,.navigation .level0 .custom-menu ul.ctas li.pluie{background-image:url(https://www.modyf.fr/media/FR/custom-cms-menu/vetement-pluie.jpg)}.navigation .level0 .custom-menu ol.ctas li a,.navigation .level0 .custom-menu ul.ctas li a{text-decoration:none;color:inherit;margin-bottom:0;padding:25px 7px;z-index:3;position:relative}.navigation .level0 .custom-menu img{max-width:100%}body .navigation li.level0 .submenu span.atc{display:inline-block;padding:0;margin-bottom:10px}.navigation .all-category{background-color:#fff}.navigation .all-category a,.navigation .seeAll a,.navigation .submenu:not(:first-child) ul>li.seeAll a{position:relative;font-family:wuerthbold;display:inline-block;text-transform:none}.all-category a{text-align:center}.navigation .all-category a::after,.seeAll a::after{width:24px;height:24px;background-size:cover;background-position:center;background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='rgba(204,0,0,0.99)' stroke-width='2'%3E%3Cpath d='M4 12h14M15 17l5-5-5-5'/%3E%3C/g%3E%3C/svg%3E%0A");content:'';display:inline-block;position:absolute;top:50%;transform:translateY(-50%);right:0}.seeAll a:hover{color:#c00}@media (max-width:1049px){.desktopOnly,.level1 ol,.level1 ul{display:none}.custom-menu .level1 ul{display:none!important}.mobileOnly,.rm-expand{display:block}.custom-menu ul.open{display:block!important}.custom-menu .inner-wrapper,.navigation .level0 .custom-menu{flex-flow:column wrap}.navigation .level0 .custom-menu.col5 .col,.navigation .level0 .custom-menu.col6 .col,.navigation .level0 .custom-menu.col6 .colx2{width:100%;padding:0}.custom-menu ol li.title,.custom-menu ul li.title,.navigation .level0 .custom-menu ol,.navigation .level0 .custom-menu ul{margin-bottom:0}.navigation .level0 .custom-menu li{border-bottom:1px solid #efefef}.navigation .level0 .custom-menu ol li.title,.navigation .level0 .custom-menu ul li.title{padding:15px 20px 15px 30px;margin-bottom:0}.navigation .level0 .custom-menu ol li.title a,.navigation .level0 .custom-menu ul li.title a{padding:0}body .navigation li.level0 .submenu span.atc{padding:15px 40px 15px 60px;margin-bottom:0}.navigation .level0 .custom-menu ol.ctas li,.navigation .level0 .custom-menu ul.ctas li{margin:10px 20px}.navigation>ul .level0 .custom-menu .level1 a{border-bottom:0}.navigation .level0 .custom-menu .level1 li.level2{border:none}.level1 ol,.level1 ul{background-color:#fcfcfc}.navigation .level0 .custom-menu.col6 .colx2 ul ul{display:none;flex-flow:column;background-color:#fcfcfc;max-height:none}.title strong{position:relative;display:flex;justify-content:space-between;align-items:center}.rm-expand{width:24px;height:24px;background-position:center;background-repeat:no-repeat}.rm-expand.close{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 6.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(7.5) rotate(90)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}.rm-expand.open{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='2' viewBox='0 0 14 2'%3E%3Cpath id='Rectangle' d='M0-.5H14v2H0Z' transform='translate(0 0.5)' fill='%23c3c8c8'/%3E%3Cpath id='Rectangle-2' data-name='Rectangle' d='M0-.5H14v2H0Z' transform='translate(14 1.5) rotate(180)' fill='%23c3c8c8'/%3E%3C/svg%3E%0A")}}</style>
<div class="custom-menu col6">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item first parent"><strong>Nos vêtements d'été</strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/tenue-ete/pantalons-de-travail-ete">Pantalons de travail été</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/bermudas-de-travail">Shorts de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/t-shirts-de-travail">Tee-shirts de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/polos-de-travail">Polos de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/vetements-professionnels/haute-visibilite/t-shirts-et-polos">Tee-shirts et Polos Haute-visibilité</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/vetements-professionnels/chemises-de-travail">Chemises de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/tenue-ete/gilet-de-travail-ete">Gilets de travail</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item first parent"><strong>Nos chaussures d'été </strong> </li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/chaussures-de-securite/baskets">Baskets de sécurité</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item first parent"><strong>Nos accessoires d'été </strong></li>
<ul>
<li class="level2 ui-menu-item first"><a href="https://www.modyf.fr/accessoires/chapeaux/casquettes-entreprise">Casquettes</a></li>
</ul>
</ul>
</div>
</div>
</div>
</div></div></div> </li>
</ul>
</div>
</div>
</li>
<li
class="level-0"
x-data="{ open: false, canHover(func) { const isHoverableDevice = window.matchMedia('(hover: hover) and (pointer: fine)').matches; if (!isHoverableDevice) return; func(); } }"
@click.outside="open = false"
@mouseenter="canHover(() => { open = true })"
@mouseleave="canHover(() => { open = false })"
@keydown.escape="open = false"
>
<span class="flex items-center text-md">
<a class="font-wuerth-bold text-[18px] leading-[28px] text-modyf-black level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red"
href="https://www.modyf.fr/accessoires"
title="Accessoires"
@focus="hoverPanelActiveId = 0"
>
Accessoires </a>
</span>
<div
id="desktop-menu-category-6937"
class="z-30 absolute inset-x-0 gap-8 px-[5%] pt-[85px] min-h-64 border-t border-modyf-lightest_grey bg-white shadow-md overflow-auto"
x-show="open === true"
x-transition
x-cloak
>
<div id="$menuId" class="grow flex justify-between desktop:max-w-[1290px] desktop:m-auto">
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=DBMVN83]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="DBMVN83"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="custom-menu col5">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Accessoires pour les pieds</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/chaussettes">Chaussettes de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/accessoires-chaussures/semelles">Semelles</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/accessoires-chaussures/lacets">Lacets</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title category-item parent"><strong>Accessoires pour le corps</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/genouilleres">Genouillères de travail</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/sous-vetements">Sous-vêtements</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/ceintures">Ceintures</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/porte-outils">Ceintures porte-outils</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/chapeaux">Casquettes et bonnets</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/sac-bagages">Sacs et bagages</a></li>
</ul>
</ul>
</div>
<!--div class="col">
<ul>
<li class="title category-item parent"><strong>Accessoires divers</strong></li>
<ul>
<li class="level2 ui-menu-item"><a href="">Tapis d'entrée</a></li>
<li class="level2 ui-menu-item"><a href="">Masques de protection</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/accessoires/sac-bagages">Sacs et bagages</a></li>
<li class="level2 ui-menu-item"><a href="">Produits d'entretien </a></li>
</ul>
</ul>
</div-->
<!--div class="col">
<ul>
<li class="ui-menu-item">
<a href="https://www.modyf.fr/sneaker-100998-2">
<picture class="mfwebp"> <source type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/custom-cms-menu/chaussettes-ete.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/custom-cms-menu/chaussettes-ete.jpg" alt="Chaussettes sneakers de travail Würth MODYF blanches/vertes" /></picture>
</a>
</li>
</ul>
</div-->
<div class="col">
<ul>
<li class="level2 ui-menu-item">
<a href="https://www.modyf.fr/hiver-100740-2">
<picture class="mfwebp"> <source type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/custom-cms-menu/chaussettes-hiver.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/custom-cms-menu/chaussettes-hiver.jpg" alt="Chaussettes de travail hiver montantes Würth MODYF noires/rouges" /></picture>
</a>
</li>
</ul>
</div>
</div>
</div></div></div></div> </li>
</ul>
</div>
</div>
</li>
<li
class="level-0"
x-data="{ open: false, canHover(func) { const isHoverableDevice = window.matchMedia('(hover: hover) and (pointer: fine)').matches; if (!isHoverableDevice) return; func(); } }"
@click.outside="open = false"
@mouseenter="canHover(() => { open = true })"
@mouseleave="canHover(() => { open = false })"
@keydown.escape="open = false"
>
<span class="flex items-center text-md">
<a class="font-wuerth-bold text-[18px] leading-[28px] text-modyf-black level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red"
href="https://www.modyf.fr/metiers"
title="Métiers"
@focus="hoverPanelActiveId = 0"
>
Métiers </a>
</span>
<div
id="desktop-menu-category-6989"
class="z-30 absolute inset-x-0 gap-8 px-[5%] pt-[85px] min-h-64 border-t border-modyf-lightest_grey bg-white shadow-md overflow-auto"
x-show="open === true"
x-transition
x-cloak
>
<div id="$menuId" class="grow flex justify-between desktop:max-w-[1290px] desktop:m-auto">
<ul class="level0">
<li class="submenu full_width_block">
<style>#html-body [data-pb-style=OUIW5LA]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="OUIW5LA"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="custom-menu col5">
<div class="inner-wrapper">
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment"><strong>Vêtements BTP et chantiers</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment/macon-travaux-maconnerie">Maçon</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment/couvreur-zingueur">Couvreur-zingueur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/chantier-batiment/travaux-publics">Travaux Publics</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique"><strong>Vêtements pour la Logistique et le transport</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique/transporteur">Transporteur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique/chauffeur-livreur">Chauffeur Livreur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/logistique/cariste">Cariste</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts"><strong>Vêtements pour Espaces-Verts</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts/agriculteur">Agriculteur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts/jardinier">Jardinier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/espaces-verts/horticulteur">Horticulteur </a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie"><strong>Vêtements pour l'industrie</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie/technicien">Technicien</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie/ouvrier">Ouvrier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie/service-maintenance">Service de maintenance</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire"><strong>Tenues pour Installateurs</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire/electricien">Électricien</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire/plombier">Plombier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/installateur-sanitaire/serrurier">Serrurier</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal"><strong>Vêtements pour l'industrie du métal</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal/soudeur-soudage">Soudeur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal/chaudronnier">Chaudronnier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/industrie-metal/ferronier">Ferronnier</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile"><strong>Tenues pour l'Automobile</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile/mecanique-mecanicien">Mécanicien</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile/depanneur">Dépanneur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/automobile/carrossier">Carrossier</a></li>
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/artisanat"><strong>Tenues pour l'artisanat</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisanat/travaux-interieur">Travaux d'intérieur</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisanat/travaux-exterieur">Travaux d'extérieur</a></li>
</ul>
</ul>
</div>
<div class="col">
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois"><strong>Vêtements pour Artisan du bois</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/charpentier">Charpentier</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/menuisier">Menuisier</a></li>
<!--li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/ebeniste">Ébéniste</a></li-->
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/bucheron">Bûcheron</a></li>
<!--li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/artisan-bois/elagueur">Élagueur</a></li-->
</ul>
</ul>
<ul class="level1">
<li class="title ui-menu-item"><a href="https://www.modyf.fr/metiers/administration"><strong>Vêtements pour l'Administration</strong></a></li>
<ul>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/administration/employe-mairie">Employés de mairie</a></li>
<li class="level2 ui-menu-item"><a href="https://www.modyf.fr/metiers/administration/collectivites">Collectivités</a></li>
</ul>
</ul>
</div>
</div>
</div>
</div></div></div> </li>
</ul>
</div>
</div>
</li>
<li>
<a
href="https://www.modyf.fr/collections"
title="Collections"
class="font-wuerth-bold text-[18px] leading-[28px] text-modyf-black level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red"
>
Collections </a>
</li>
<li>
<a
href="https://www.modyf.fr/destockage"
title="Déstockage"
class="font-wuerth-bold text-[18px] leading-[28px] text-modyf-black level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red"
>
Déstockage </a>
</li>
</ul>
</nav>
<script>
const initMenuDesktop_69b8dc1feaec7 = () => {
return {
setActiveMenu(menuNode) {
Array.from(menuNode.querySelectorAll('a')).filter(link => {
return link.href === window.location.href.split('?')[0];
}).map(item => {
item.setAttribute('aria-current', 'page');
let menuLevelCount = 0;
while (menuLevelCount < 3) {
let selector = `.level-${menuLevelCount}`;
item.closest(selector)
&& item.closest(selector).querySelector('button')
&& item.closest(selector).querySelector('button').setAttribute('data-has-current', '');
menuLevelCount++;
}
});
}
}
}
</script> </div>
</div></header><div class="page messages"><script>
window.defaultSuccessMessageTimeout = 8000;
function initMessages() {
"use strict";
return {
messages: window.mageMessages || [],
isEmpty() {
return this.messages.reduce(
function (isEmpty, message) {
return isEmpty && message === undefined
}, true
)
},
removeMessage(messageIndex) {
this.messages[messageIndex] = undefined;
},
addMessages(messages, hideAfter) {
messages.map((message) => {
this.messages = this.messages.concat(message);
hideAfter = window.defaultSuccessMessageTimeout ?
window.defaultSuccessMessageTimeout : false;
if (hideAfter) {
this.setHideTimeOut(this.messages.length -1, hideAfter);
}
});
},
setHideTimeOut(messageIndex, hideAfter) {
setTimeout((messageIndex) => {
this.removeMessage(messageIndex);
}, hideAfter, messageIndex);
},
eventListeners: {
['@messages-loaded.window'](event) {
this.addMessages(event.detail.messages, event.detail.hideAfter)
},
['@private-content-loaded.window'](event) {
const data = event.detail.data;
if (
data.messages &&
data.messages.messages &&
data.messages.messages.length
) {
this.addMessages(data.messages.messages);
}
},
['@clear-messages.window']() {
this.messages = [];
}
}
}
}
</script>
<section id="messages"
x-data="initMessages()"
x-bind="eventListeners"
aria-live="assertive"
role="alert"
>
<template x-if="!isEmpty()">
<div class="w-full">
<div class="messages container mx-auto">
<template x-for="(message, index) in messages" :key="index">
<div>
<template x-if="message">
<div class="message" :class="message.type"
:ui-id="'message-' + message.type"
>
<span class="desktop:text-[16px]" x-html="message.text"></span>
</div>
</template>
</div>
</template>
</div>
</div>
</template>
</section></div><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div><div class="columns"><div class="column main"><div data-role="main-css-loader" id="main-css-loader" class="loading-mask hidden">
<div class="loader">
<img src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/loader-1.gif" loading="lazy"
alt="Chargement en cours...">
</div>
<script type="text/javascript">var elemwGDsThGI = document.querySelector('div.loader img');
if (elemwGDsThGI) {
elemwGDsThGI.style.position = 'absolute';
}</script></div><div x-data="recommendedProducts_above_main_content()"
x-init="initProductRecBlock()"
id="recs_block_above_main_content"
class="block block-static-block product-recommendations-wrapper" x-cloak>
<template x-if="productBanners">
<div class="block-content desktop:px-[63px]" x-effect="productBanners.length && $nextTick(() => afterRender())">
<template x-for="banner in productBanners">
<div class="products wrapper products-grid product-slider product-recommendations-list"
x-intersect.once="scrollViewEvent(banner.unitId)"
>
<div class="block-title px-[22px] leading-[30px] mb-[28px] tablet:px-[45px]"
>
<h3 x-text='banner.storefrontLabel'
class="text-center block text-[32px] leading-[32px] text-modyf-black font-wuerth-bold"
></h3>
</div>
<div class="splide px-[8px] tablet:px-[45px]"
:class="'slider-' + banner.unitId"
>
<div class="relative splide__track mobile_tablet:pb-[60px] desktop:pb-[54px]">
<div class="products list items product-items relative splide__list">
<template x-for="product in banner.products">
<div class="item product product-item splide__slide pb-[20px]">
<div class="product-item-info p-[10px] relative text-center box-border desktop:px-[35px] desktop:py-[30px] desktop:hover:shadow-modyf_product_item_shadow desktop:hover:bg-modyf-white"
>
<form method="post"
x-bind:action="createAddToCartUrl(product.productId)"
@submit.prevent="validateAndSubmit($event.target, banner.unitId, product.productId)"
class="item product product-item product_addtocart_form flex flex-col w-full"
>
<input name="form_key" type="hidden" :value="hyva.getFormKey()"/>
<input type="hidden" name="product" x-bind:value="product.productId">
<input type="hidden" name="qty" value="1">
<input type="hidden" name="sku" x-bind:value="product.sku">
<a @click="recsClickEvent(banner.unitId, product.productId, product.url)"
class="product photo product-item-photo flex justify-center cursor-pointer w-full h-[168px] align-center desktop:h-auto desktop:w-[240px] desktop:m-auto desktop:inline-block desktop:max-w-full desktop:pb-[125%] desktop:overflow-hidden desktop:relative desktop:z-[1]"
tabindex="-1">
<img class="object-contain desktop:block desktop:absolute desktop:w-auto desktop:m-auto desktop:top-0 desktop:bottom-0 desktop:right-0 desktop:left-0"
loading="lazy"
x-bind:alt="product.smallImage?.label"
x-bind:title="product.smallImage?.label"
x-bind:src="product.smallImage?.url">
</a>
<div class="product-item-labels absolute top-[10px] left-[10px] desktop:top-[25px] desktop:left-[25px]"
>
<template x-if="product.attributes.publication_date && checkIfIsNew(product.attributes.publication_date[0])">
<div>
<span class="new-label px-[10px] py-[3px] text-[11px] font-wuerth-bold text-modyf-white uppercase bg-modyf-red mb-[10px] float-left leading-normal desktop:px-[20px] desktop:py-[8px]"
>
Nouveau </span>
</div>
</template>
<template x-if="product.attributes.discount_percent">
<div>
<span class="px-[10px] py-[3px] text-[11px] font-wuerth-bold text-modyf-white uppercase bg-modyf-red mb-[10px] float-left leading-normal desktop:px-[20px] desktop:py-[8px]"
x-text="product.attributes.discount_percent + '%'"
></span>
</div>
</template>
</div>
<div class="product details product-item-details product-info flex flex-col flex-grow">
<div class="product-item-collection mb-[10px] min-h-[27px] desktop:min-h-[32px]"
>
<template x-if="product.attributes.modyf_collection && product.attributes.modyf_collection.length">
<template x-for="collection in product.attributes.modyf_collection">
<span class="text-[11px] uppercase font-wuerth-bold text-modyf-darkest_grey bg-modyf-light_grey inline-block px-[10px] py-[5px] desktop:px-[16px] desktop:py-[8px]"
x-text="collection"
></span>
</template>
</template>
</div>
<div class="my-[5px] break-words text-[14px] leading-[15px] overflow-hidden h-[40px] font-wuerth-bold tablet_desktop:h-[47px]"
>
<a class="product-item-link block leading-[15px] cursor-pointer my-[5px] overflow-hidden h-[47px] tablet:h-[32px] desktop:hover:underline desktop:text-[18px] desktop:leading-[21px] desktop:h-[45px]"
@click="recsClickEvent(banner.unitId, product.productId, product.url)"
x-text="product.name"></a>
</div>
<div class="reviews-container min-h-[15px] mb-[5px]">
<template x-if="product.attributes && product.attributes.reviews_summary && product.attributes.reviews_summary.length">
<div class="reviews-summary-wrapper" x-html="getRecommendationsRating(product.attributes.reviews_summary)"></div>
</template>
</div>
<div class="price-container min-h-[54px] desktop:min-h-[72px]">
<template x-if="product.prices">
<div class="pt-1 text-gray-900 price-box price-final_price"
x-bind:data-product-id="product.productId"
>
<span class="normal-price inline-block">
<span class="price-container price-final_price">
<span x-show="product.prices.minimum.final !== product.prices.maximum.final"
class="price-label">À partir de</span>
<span id="product-price" class="price-wrapper">
<span class="price text-[18px] leading-[24px] font-bold desktop:!text-[26px] desktop:!leading-[35px] desktop:!font-normal"
x-text="hyva.formatPrice(product.prices.minimum.final)"
:class="{ 'text-modyf-red': product.prices.minimum.regular > product.prices.minimum.final }"
>
</span>
</span>
</span>
</span>
<template x-if="product.prices.minimum.regular > product.prices.minimum.final">
<span class="regular-price inline-block">
<span class="price-final_price">
<span id="product-price" class="price-wrapper">
<span class="price text-modyf-darkest_grey3 line-through !text-[13px] !leading-[24px] !font-normal"
x-text="hyva.formatPrice(product.prices.minimum.regular)"
></span>
</span>
</span>
</span>
</template>
<p class="price-vat-label !text-[13px] !leading-[18px] text-modyf-darkest_grey3 mt-[-5px] desktop:mt-[5px]"
>
TTC </p>
</div>
</template>
</div>
<template x-if="product.attributes.model_group && product.attributes.model_group.length && !isCartPage">
<div class="relative">
<template x-if="product.attributes.model_group.length > maxColorsDesktop">
<div class="product-item-colors-label desktop">
<span x-text="product.attributes.model_group.length"></span>
<span class="text-[13px] leading-[18px] text-modyf-darkest_grey3">
Colors </span>
</div>
</template>
<div :class="getMaxColorClasses(product.attributes.model_group, maxColorsDesktop, maxColorsMobile)">
<template x-for="colorItem in product.attributes.model_group.map(colorStr => JSON.parse(colorStr))">
<a class="w-[10px] h-[10px] mr-[4px] inline-block box-border desktop:w-[15px] desktop:h-[15px] desktop:mr-[6px]"
:href="colorItem.url"
:class="{ ['color ' + colorItem.color_id]: true, 'border-2 border-modyf-grey': !colorItem.swatch_color }"
:title="colorItem.color_value"
:style="'background-color: ' + colorItem.swatch_color">
</a>
</template>
</div>
<template x-if="product.attributes.model_group.length > maxColorsMobile">
<span class="more-colors mobile-tablet text-[13px] leading-[18px] text-modyf-darkest_grey3 align-text-bottom">
+ more </span>
</template>
</div>
</template>
<template x-if="product.addToCartAllowed && isCartPage">
<div>
<div class="swatch-conf-container my-[10px]">
<template x-if="product.attributes.swatch_options && product.attributes.swatch_options.length">
<div>
<div class="swatch-conf-wrapper"
x-init="$nextTick(() => { $el.querySelectorAll('select').forEach(select => { const instance = NiceSelect.bind(select); selects[select.dataset.elementCode] = instance; }); })">
<div class="swatch-opt-wrapper" data-rendered="true">
<template x-for="(attr, index) in objectToArray(product)">
<div class="relative"
:class="{ 'hidden-attribute': isAttributeToHide(attr, product) }"
:style="{ zIndex: product.attributes.swatch_options.length - index }">
<template x-if="!isAttributeToHide(attr, product)">
<div class="swatch-attribute"
:data-attribute-id="attr.id"
:data-attribute-code="attr.code"
:id="'swatch-attribute-' + product.productId"
:class="attr.code">
<div class="clearfix">
<div class="field required custom-select-attribute relative">
<label class="absolute m-0 top-[10px] left-[10px] normal-case z-[2] font-wuerth-book font-normal text-[14px] leading-[28px] after:!hidden"
>
<span x-text="attr.label"></span>
<span class="size-guide-button-wrapper text-modyf-darkest_grey2 ml-[5px] underline cursor-pointer"
@click.prevent="openPopups[product.productId] = true"
></span>
</label>
<div class="control">
<select
:name="'super_attribute[' + attr.id + ']'"
:data-element-target="attr.id + '_' + product.productId"
:data-element-code="attr.code + '_' + product.productId"
:class="attr.code"
x-model="selectedAttributes[attr.id + '_' + product.productId]"
@change="validateField(attr.id + '_' + product.productId); updateSelectOptions($event.target)"
:disabled="selectAttributesArray.length === 2 && selectAttributesArray[selectAttributesArray.length - 1].code === attr.code && product.attributes.size_mode != sizeModeDefault"
x-init="$nextTick(() => { updateHiddenSelectOptions($el) })"
>
<option value=""></option>
<template x-for="option in attr.options">
<option
x-show="option.products.length"
:value="option.id"
:data-options-id="option.id"
:data-products="JSON.stringify(option.products)"
x-text="option.label">
</option>
</template>
</select>
</div>
<div class="flex justify-between items-center">
<div x-show="errors[attr.id + '_' + product.productId]"
class="leading-[28px] text-[13px] text-modyf-red absolute right-0 left-0 bottom-[-5px]"
>
Ce champ est obligatoire. </div>
</div>
</div>
</div>
</div>
</template>
<template x-if="isAttributeToHide(attr, product)">
<div>
<input type="hidden"
:value="attr.options[0]?.id"
:name="'super_attribute[' + attr.id + ']'"
:data-products="JSON.stringify(attr.options[0].products)" />
</div>
</template>
</div>
</template>
</div>
</div>
</div>
</template>
</div>
<div
class="mt-auto pt-3 flex flex-wrap justify-center items-center w-full">
<button class="w-full btn text-[13px] justify-center h-[50px] action tocart"
aria-label="Add to Cart">
<span>Ajouter au panier </span>
</button>
</div>
</div>
</template>
<template x-if="!product.addToCartAllowed && isCartPage">
<div class="stock unavailable">
<span>Épuisé </span>
</div>
</template>
<div class="product-item-inner absolute right-[10px] top-[10px] desktop:right-[25px] desktop:top-[25px] desktop:hidden"
x-show="product.productId && product.addToCartAllowed"
>
<div class="product-item-actions">
<div class="actions-primary"></div>
<div class="actions-secondary" data-role="add-to-links">
<template x-if="isCompareEnable(product) === '1'">
<div class="action tocompare svg-icon-mixin svg-icon__compare__mixin mb-[5px]"
data-action="add-to-wishlist"
@click.prevent="addToWishlistCompare(product.productId, 'catalog/product_compare/add')">
<span class="sr-only">Ajouter au comparateur</span>
</div>
</template>
<template x-if="isWishlistEnable(product) === '1'">
<span class="action towishlist before:text-[16px] before:text-modyf-grey before:content-['\e600'] before:font-luma-icons desktop:before:text-[20px]"
data-action="add-to-wishlist"
@click.prevent="addToWishlistCompare(product.productId, 'wishlist/index/add')">
<span class="sr-only">Ajouter à la liste d'achats</span>
</span>
</template>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</template>
</div>
</div>
</div>
<template x-for="product in banner.products">
<template x-if="product.attributes.size_guide_url">
<div>
<div role="dialog"
aria-modal="true"
@click.outside="openPopups[product.productId] = false"
class="mobile:inset-y-0 mobile:left-[44px] right-0 !fixed z-[999] tablet_desktop:left-0 tablet_desktop:right-0 tablet_desktop:m-auto tablet_desktop:max-h-[90%] tablet_desktop:w-3/4 tablet_desktop:absolute tablet_desktop:max-w-[1680px] tablet_desktop:modyf-absolute-centering-verticall-mixin"
x-cloak
x-show="openPopups[product.productId]"
:class="openPopups[product.productId] == true ? 'opacity-100 visible mobile:[transition:opacity_.3s_ease] !flex' : 'opacity-0 invisible [transition:visibility_0s_.3s,opacity_.3s_ease] !flex'">
<div class="relative w-screen pt-[42px] bg-container-lighter overflow-auto [transition:transform_.3s_ease-in-out] shadow-modyf_stock_alert_popup_shadow tablet_desktop:[transition:transform_.2s_ease] tablet_desktop:w-full"
x-cloak=""
:class="openPopups[product.productId] == true ? 'mobile:translate-x-[0] tablet_desktop:translate-y-[0]' : 'mobile:translate-x-[100%] tablet_desktop:translate-y-[-200%]'">
<div
x-show="openPopups[product.productId]"
x-cloak=""
class="absolute top-[10px] right-[10px] tablet_desktop:top-[30px] tablet_desktop:right-[30px]">
<button
type="button"
@click="openPopups[product.productId] = false;"
aria-label="Fermer le panneau"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px]" role="img"><g fill="none" fill-rule="evenodd" stroke="rgba(0,0,0,0.99)" stroke-width="2"><path d="M6 18L18 6M18 18L6 6"/></g><title>cross-black-icon</title></svg>
</button>
</div>
<div class="content p-[20px] text-left desktop:px-[50px] desktop:pb-[50px] desktop:pt-0 tablet_desktop:overflow-y-auto">
<div class="cms-block-container"
:id="'size-guide-' + product.productId"
x-html="getSizeGuideHtml(product.attributes.size_guide_url[0], product.productId)"
></div>
</div>
</div>
</div>
<div class="backdrop z-[998]"
aria-hidden="true"
x-cloak
x-show="openPopups[product.productId]"
@click="openPopups[product.productId] = false"
></div>
</div>
</template>
</template>
</div>
</template>
</div>
</template>
</div>
<script>
function recommendedProducts_above_main_content() {
return {
productBanners: [],
pagePreconfiguredDeferred: {},
bannerPlacement: 'above-main-content',
maxColorsDesktop: 10,
maxColorsMobile: 5,
isCartPage: document.body.classList.contains('checkout-cart-index'),
selectedAttributes: {},
errors: {},
addToCartButtonTextWhileAdding: 'En\u0020cours\u0020d\u0027ajout...',
swatchHeight: 0,
sizeGuideButtonText: 'Tableaux\u0020des\u0020tailles\u0020',
openPopups: {},
gtmProductImpressionsAjaxUrl: 'https://www.modyf.fr/google-tag-manager/ajax/collectData/',
gtmProductRecommendations: [],
selectAttributesArray: [],
selects: {},
serviceSizeCode: 'service_size',
sizeModeDefault: 'size',
initProductRecBlock: function (placement) {
let self = this;
window.addEventListener('recsResponseReceivedEvent', (function () {
let recsData = window.magentoStorefrontEvents.context.getRecommendations();
self.renderProductRecs(recsData);
}));
},
renderProductRecs: function (recsData) {
let self = this;
recsData.units.sort((a, b) => a.displayOrder - b.displayOrder);
recsData.units.forEach(function (unit, index) {
if (unit.pagePlacement === self.bannerPlacement) {
self.productBanners.push(unit);
/** @todo move event outside of recsResponseReceived event **/
window.magentoStorefrontEvents.publish.recsUnitRender(
unit.unitId, magentoStorefrontEvents.context
);
self.gtmProductImpressions(unit.products)
}
});
},
gtmProductImpressions: function (products) {
if (!Array.isArray(products) || products.length === 0) {
return;
}
let self = this,
postData = new URLSearchParams();
products.forEach((product, index) => {
postData.append(`ids[${index}]`, product.productId);
});
postData.append('type', 'impression');
postData.append('list', '');
postData.append('isAjax', 'true');
fetch(this.gtmProductImpressionsAjaxUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
body: postData
})
.then(response => response.json())
.then(data => {
if (Array.isArray(data) && data.length) {
const event = new CustomEvent('googleAnalyticsUniversalEvent', {
detail: data
});
document.dispatchEvent(event);
data.forEach(product => {
self.gtmProductRecommendations.push(product);
});
}
})
.catch(error => console.error('Error:', error));
},
addToCartRecsEvent: function (e, unitId, productId) {
// requires recommendationsContext to be set
magentoStorefrontEvents.publish.recsItemAddToCartClick(
unitId, productId, magentoStorefrontEvents.context
);
},
scrollViewEvent: function (unitId) {
magentoStorefrontEvents.publish.recsUnitView(
unitId, magentoStorefrontEvents.context
);
},
recsClickEvent: function (unitId, productId, productUrl) {
magentoStorefrontEvents.publish.recsItemClick(
unitId, productId, magentoStorefrontEvents.context
);
// Timeout to prevent submission before event has fired.
setTimeout(() => window.location.href = productUrl, 500);
},
createAddToCartUrl: function (productId) {
const currentLocationUENC = encodeURIComponent(
this.encodeUenc(BASE_URL),
);
return BASE_URL +
'checkout/cart/add/uenc/' +
currentLocationUENC +
'/product/' +
productId
},
encodeUenc: function (value) {
const regex = /=/gi;
return btoa(value).replace(regex, ',');
},
checkIfIsNew: function (publication) {
if (!publication) return false;
let current = new Date(),
publ = new Date(publication),
period = 60 * 24 * 60 * 60 * 1000;
current = current.getTime();
publ = publ.getTime();
return (current - period) <= publ;
},
getRecommendationsRating: function (value) {
let result = '',
percent = 20,
title = `${parseFloat(value[0]).toFixed(2)}/5`;
if (parseInt(value[0]) === parseFloat(value[0])) {
title = `${value[0]}/5`;
}
if (value && value.length) {
value = Number(value[0]) * 20;
}
for (let i = 0; i < 5; i++) {
if (value >= 20) {
result += `<span class="nr-icon nr-star gold !text-[12px]" style="width: ${percent}%"></span>`;
value -= 20;
} else {
percent = 20 - value;
result += `<span class="nr-icon nr-star gold !text-[12px]" style="width: ${percent}%"></span>`;
}
}
result = `<div class="netreviews-stars">
<span>
<div class="netreviews_bg_stars_big listStars float-none w-[60px] min-w-[60px] max-w-[60px] h-[15px] min-h-[15px] max-h-[15px] !my-0" title="${title}">
<div class="recommendation-stars-wrapper !text-[0px] flex">
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
</div>
<div class="recommendation-stars-wrapper !text-[0px] flex">
${result}
</div>
</div>
</span>
</div>`;
return result;
},
getMaxColorClasses: function (arr, desktopLimit, mobileLimit) {
if (!arr || !desktopLimit || !mobileLimit) return false;
let result = 'product-item-colors';
if (arr.length > desktopLimit) result += ' max-colors';
if (arr.length > mobileLimit) result += ' max-color-mobile';
return result;
},
addToWishlistCompare(productId, actionUrl) {
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + actionUrl;
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(),
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Impossible\u0020d\u0027ajouter\u0020un\u0020article\u0020\u00E0\u0020la\u0020liste\u0020de\u0020souhaits."
}], 5000
);
}
}).then(function (response) {
if (!response) { return }
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: (response.success) ? "success" : "error",
text: (response.success)
? "Produit\u0020a\u0020\u00E9t\u00E9\u0020ajout\u00E9\u0020\u00E0\u0020votre\u0020liste\u0020d\u0027achats."
: response.error_message
}], 5000
);
const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data");
window.dispatchEvent(reloadCustomerDataEvent);
}).catch(function (error) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "error",
text: error
}], 5000
);
});
},
initSlider() {
let desktopPerPage = 4,
tabletPerPage = 3,
mobilePerPage = 2;
if (this.isCartPage) {
desktopPerPage = 3;
mobilePerPage = 1;
}
this.productBanners.forEach(async (banner) => {
let splide = new Splide( '.slider-' + banner.unitId, {
perPage: desktopPerPage,
perMove: desktopPerPage,
arrows: false,
breakpoints: {
1049: {
perPage: tabletPerPage,
perMove: tabletPerPage,
},
768: {
perPage: mobilePerPage,
perMove: mobilePerPage,
},
}
});
splide.mount();
});
},
afterRender() {
this.initSlider();
this.updateListHeight();
document.querySelectorAll('select[data-element-target]').forEach(select => {
let attrId = select.getAttribute('data-element-target');
this.selectedAttributes[attrId] = ''
});
},
validateAndSubmit(form, unitId, productId) {
let self = this,
isValid = true;
form.querySelectorAll('select[data-element-target]').forEach(select => {
let productId = select.getAttribute('data-element-target');
if (!this.selectedAttributes[productId]) {
this.errors[productId] = true;
isValid = false;
}
});
if (isValid) {
this.disableAddToCartButton(form);
// Submit if valid
this.addToCartRecsEvent(form, unitId, productId);
let formData = new URLSearchParams(new FormData(form));
fetch(form.getAttribute('action'), {
method: 'POST',
body: formData,
cache: 'no-cache',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(res => {
let product,
addToCartFormData = new FormData(form);
if (self.gtmProductRecommendations.length) {
self.gtmProductRecommendations.forEach(gtmProduct => {
if (gtmProduct.id === addToCartFormData.get('sku')) {
product = gtmProduct;
}
});
}
if (product && window.dataLayer) {
// Enhanced Ecommerce (UA)
dataLayer.push({
'event': 'addToCart',
'ecommerce': {
'currencyCode': window.dlCurrencyCode,
'add': {
'products': [{
'name': product.name,
'id': product.id,
'price': product.price,
'brand': product.brand,
'category': product.category,
'variant': product.variant,
'metric1': product.metric1,
'dimension2': product.dimension2,
'metric2': product.metric2,
'quantity': '1'
}]
}
}
});
// Ecommerce (GA4)
dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'items': [{
'item_name': product.name,
'item_id': product.id,
'price': product.price,
'item_brand': product.brand,
'item_category': product.category,
'item_variant': product.variant,
'index': product.position,
'item_price_vat': product.metric1,
'quantity': '1',
'item_width': product.metric2,
'item_size': product.dimension2
}]
}
});
}
if (res.backUrl) {
window.location.replace(res.backUrl);
} else {
window.location.reload();
}
})
.catch(error => {
console.error('Error:', error);
});
}
},
validateField(attrId) {
if (!this.selectedAttributes[attrId]) {
this.errors[attrId] = true;
} else {
delete this.errors[attrId];
}
},
isWishlistEnable(product) {
let wishlistActive = '';
if (product.attributes.config && typeof product.attributes.config[0] === 'string') {
try {
wishlistActive = JSON.parse(product.attributes.config).wishlistActive;
} catch (e) {
console.error('Invalid JSON:', e);
return false;
}
}
return wishlistActive;
},
isCompareEnable(product) {
let compareActive = '';
if (product.attributes.config && typeof product.attributes.config[0] === 'string') {
try {
compareActive = JSON.parse(product.attributes.config).compareActive;
} catch (e) {
console.error('Invalid JSON:', e);
return false;
}
}
return compareActive;
},
disableAddToCartButton(form) {
let addToCartButton = form.querySelector('.action.tocart');
if (addToCartButton) {
addToCartButton.setAttribute('disabled', 'true');
let spanElement = addToCartButton.querySelector('span');
if (spanElement) {
spanElement.textContent = this.addToCartButtonTextWhileAdding;
}
addToCartButton.setAttribute('title', this.addToCartButtonTextWhileAdding);
}
},
updateListHeight() {
let self = this,
productRecommendationsList = document.querySelectorAll('.product-recommendations-list');
productRecommendationsList.forEach(list => {
let swatchWrappers = list.querySelectorAll('.product-items .swatch-conf-container');
swatchWrappers.forEach(wrapper => {
let swatchHeight = wrapper.offsetHeight;
if (swatchHeight > self.swatchHeight) {
self.swatchHeight = swatchHeight;
}
});
// Set the height after calculating the max height
setTimeout(() => {
swatchWrappers.forEach(wrapper => {
wrapper.style.height = `${self.swatchHeight}px`;
});
}, 5);
});
},
getSizeGuideHtml(sizeGuideUrl, productId) {
let self = this,
url = `/productrecommendations/ajax/loadBlockSizeGuide`;
fetch(url + `?isAjax=true&block_id=${sizeGuideUrl}`)
.then(response => response.json())
.then(data => {
if (data.success) {
const sizeGuideBlockContent = document.getElementById(`size-guide-${productId}`);
if (sizeGuideBlockContent) {
sizeGuideBlockContent.innerHTML = data.html;
const swatchAttribute = document.querySelector('.service_size#swatch-attribute-' + productId);
if (swatchAttribute) {
const sizeGuideButtonWrapper = swatchAttribute.querySelector('.size-guide-button-wrapper');
if (sizeGuideButtonWrapper) {
const sizeGuideButton = document.createElement('span');
sizeGuideButton.className = `size-guide-button size-guide-button-${productId}`;
sizeGuideButton.dataset.popup = `#size-guide-${productId}`;
sizeGuideButton.textContent = self.sizeGuideButtonText;
sizeGuideButtonWrapper.appendChild(sizeGuideButton);
}
}
}
}
})
.catch(error => console.error('Error loading size guide:', error));
},
objectToArray(product) {
let attributesObj = JSON.parse(product.attributes.swatch_options).attributes;
this.selectAttributesArray = Object.values(attributesObj).map(attribute => {
let optionsArray = attribute.options;
if (optionsArray && !Array.isArray(optionsArray)) {
optionsArray = Object.values(optionsArray);
}
return {
...attribute,
options: optionsArray
};
}).sort((a, b) => Number(a.position) - Number(b.position));
return this.selectAttributesArray;
},
updateSelectOptions(select) {
let wrapper = select.closest('.swatch-opt-wrapper'),
selects = wrapper.querySelectorAll('select'),
lastSelect = selects[selects.length - 1];
if (lastSelect !== select) {
let availableProducts = JSON.parse(select.selectedOptions[0].getAttribute('data-products')),
productsOption;
Array.from(lastSelect.options).forEach((option, index) => {
productsOption = JSON.parse(option.getAttribute('data-products'));
if (productsOption) {
option.disabled = !productsOption.some(product => availableProducts.includes(product));
}
});
lastSelect.selectedIndex = -1;
lastSelect.disabled = false;
this.selects[lastSelect.dataset.elementCode].update();
lastSelect.nextElementSibling.querySelector('.current').textContent = '';
}
},
updateHiddenSelectOptions(select) {
let wrapper = select.closest('.swatch-opt-wrapper'),
hiddenInput = wrapper.querySelectorAll('input');
if (hiddenInput.length) {
let availableProducts = JSON.parse(hiddenInput[0].getAttribute('data-products')),
productsOption;
Array.from(select.options).forEach((option, index) => {
productsOption = JSON.parse(option.getAttribute('data-products'));
if (productsOption) {
option.disabled = !productsOption.some(product => availableProducts.includes(product));
}
});
this.selects[select.dataset.elementCode].update();
}
},
isAttributeToHide(attr, product) {
return product.attributes.size_mode == this.sizeModeDefault && attr.code !== this.serviceSizeCode;
},
}
}
</script> <script> /* e.g. hyva theme */ document.addEventListener('DOMContentLoaded', function(){ var items = document.getElementsByClassName('mfblogunveil'); var el, url; if (items.length) { for (var i=0; i<items.length;i++) { el = items[i]; url = el.getAttribute('data-original'); if (!url) { continue; }; if ('IMG' == el.tagName) { el.src = url; } else { el.style.backgroundImage = "url('" + url + "')"; } } } }); </script> <style>#html-body [data-pb-style=ME7VAXP]{display:flex;flex-direction:column}</style><div data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="ME7VAXP"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><link rel="preload" as="image" href="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/slide/SLIDE-SOLDES-HIVER-MOBILE-PH2.webp" media="(max-width: 767px)" fetchpriority="high">
<link rel="preload" as="image" href="https://www.modyf.fr/media/FR/home/slide/SLIDE-SOLDES-HIVER-DESKTOP-PH2.jpg" media="(min-width: 768px)" fetchpriority="high">
<style>
.pagebuilder-slide-wrapper .pagebuilder-overlay{padding:0px!important;}
.t2s-widget-top{ background-color:#fff; margin-bottom: 0px;}
.t2s-sliders-tabs{display:none;}
.t2s-main-title{text-align: center; font-size: 32px; margin-bottom: 0px;}
@media only screen and (max-width: 767px){
.t2s-widget-top{padding-left:0px;}
}
</style></div><div data-content-type="text" data-appearance="default" data-element="main"><div></div>
<div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.header-banner{display: none!important;}
#slide * { box-sizing: border-box; }
#slide {
box-sizing: border-box;
position: relative;
width: 100%;
max-width: 1680px;
aspect-ratio: 14 / 5;
display: flex;
}
#slide video{
width: 100%;
}
p.preslide{
background-color:#fdd179;
color:#000;
text-align:center;
padding:5px;
margin-bottom: 0px;
}
@media screen and (max-width: 767px) {
#slide{
aspect-ratio: auto;
}
}
</style>
<p class="preslide">Livraison offerte pour toute commande ! <small>(hors TNT express)</small></p>
<a id="slide" href="https://www.modyf.fr/selection-printemps">
<video autoplay muted loop playsinline poster="https://www.modyf.fr/documents/video/SLIDE-OP-PRINTEMPS-DESKTOP.jpg">
<source src="https://www.modyf.fr/documents/video/SLIDE-OP-PRINTEMPS-MOBILE.webm" type="video/webm" media="(max-width: 767px)">
<source src="https://www.modyf.fr/documents/video/SLIDE-OP-PRINTEMPS-DESKTOP.webm" type="video/webm" media="(min-width: 768px)">
Votre navigateur ne supporte pas la lecture de vidéos.
</source></source></video>
</a></div></div>
<div><style>#html-body [data-pb-style=NFWJYCO],#html-body [data-pb-style=YQ7G9JQ]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=NFWJYCO]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=YQ7G9JQ]{align-self:stretch}#html-body [data-pb-style=R22FTJ7]{display:flex;width:100%}#html-body [data-pb-style=LDPCGO0]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:25%;align-self:stretch}#html-body [data-pb-style=D9QRAPN]{border-style:none}#html-body [data-pb-style=S8LB6MS],#html-body [data-pb-style=TBLT5MN]{max-width:100%;height:auto}#html-body [data-pb-style=RO4TD7G]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:25%;align-self:stretch}#html-body [data-pb-style=OR12BJ5]{border-style:none}#html-body [data-pb-style=C9T0CIE],#html-body [data-pb-style=JW3DHTS]{max-width:100%;height:auto}#html-body [data-pb-style=AABG12I]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:25%;align-self:stretch}#html-body [data-pb-style=JPVTMK7]{border-style:none}#html-body [data-pb-style=IIQIDTB],#html-body [data-pb-style=XU21V2Q]{max-width:100%;height:auto}#html-body [data-pb-style=S3U56JU]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:25%;align-self:stretch}#html-body [data-pb-style=EUCLIMU]{border-style:none}#html-body [data-pb-style=FX37V3X],#html-body [data-pb-style=XI3OMRV]{max-width:100%;height:auto}@media only screen and (max-width: 768px) { #html-body [data-pb-style=D9QRAPN],#html-body [data-pb-style=EUCLIMU],#html-body [data-pb-style=JPVTMK7],#html-body [data-pb-style=OR12BJ5]{border-style:none} }</style><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
body#html-body .categs{
padding: 50px 0
}
body#html-body .categs .pagebuilder-column-line{
justify-content: space-between;
}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ{
flex-flow: row;
background: #efefef;
padding: 0px;
width: 24%;
min-height: 100px;
align-items: center;
justify-content: center;
position: relative;
min-width: auto;
}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ img{ display: block;}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ h2{ margin: 0px; padding: 0px;}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ h2 a{
font-size: 18px;
line-height:24px;
color: #000;
padding-right: 35px;
text-decoration:none;
}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ a::after{
width: 24px;
height: 24px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='rgba(204,0,0,0.99)' stroke-width='2'%3E%3Cpath d='M4 12h14M15 17l5-5-5-5'/%3E%3C/g%3E%3C/svg%3E%0A");
content: '';
display: inline-block;
vertical-align: middle;
margin-left: 10px;
}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ h2 a:hover{ color:#c00; }
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ a::before{
content:"";
top: 0px; left:0px;
height:100%; width: 100%;
position: absolute;
}
@media screen and (max-width: 1680px) {
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ img{ width: 6vw;}
}
@media screen and (max-width: 1337px) {
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ{
width: 49%;
margin-bottom: 2vw;
}
}
@media screen and (max-width: 768px) {
body#html-body .categs{ padding: 20px 0;}
body#html-body .categs .pagebuilder-column-line{
flex-flow: column;
}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ{
width: 90%;
margin: 0 auto;
margin-bottom: 4vw;
justify-content: start;
padding: 0 3%;
min-height: 60px;
}
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ h2 a{ padding-right: 0px; }
body#html-body .categs .pagebuilder-column-group .pagebuilder-column.categ img{width: 14vw; margin-right: 10px;}
}
</style></div><div data-content-type="row" data-appearance="contained" data-element="main"><div class="categs" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="NFWJYCO"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="YQ7G9JQ"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="R22FTJ7"><div class="pagebuilder-column categ" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="LDPCGO0"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="D9QRAPN"><picture class="mfwebp"> <source title="" data-element="desktop_image" data-pb-style="TBLT5MN" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/4-blocs-categ/pantalon-stretch-x.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/home/4-blocs-categ/pantalon-stretch-x.png" alt="" title="" data-element="desktop_image" data-pb-style="TBLT5MN"></picture><picture class="mfwebp"> <source title="" data-element="mobile_image" data-pb-style="S8LB6MS" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/4-blocs-categ/pantalon-stretch-x.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/home/4-blocs-categ/pantalon-stretch-x.png" alt="" title="" data-element="mobile_image" data-pb-style="S8LB6MS"></picture></figure><div data-content-type="text" data-appearance="default" data-element="main"><h2><a href="/vetements-professionnels">Vêtements de travail</a></h2></div></div><div class="pagebuilder-column categ" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="RO4TD7G"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="OR12BJ5"><picture class="mfwebp"> <source title="" data-element="desktop_image" data-pb-style="C9T0CIE" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/4-blocs-categ/caracas.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/home/4-blocs-categ/caracas.png" alt="" title="" data-element="desktop_image" data-pb-style="C9T0CIE"></picture><picture class="mfwebp"> <source title="" data-element="mobile_image" data-pb-style="JW3DHTS" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/4-blocs-categ/caracas.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/home/4-blocs-categ/caracas.png" alt="" title="" data-element="mobile_image" data-pb-style="JW3DHTS"></picture></figure><div data-content-type="text" data-appearance="default" data-element="main"><h2><a href="/chaussures-de-securite">Chaussures de sécurité</a></h2></div></div><div class="pagebuilder-column categ" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="AABG12I"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="JPVTMK7"><picture class="mfwebp"> <source title="" data-element="desktop_image" data-pb-style="IIQIDTB" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/wysiwyg/kurze_arbeitshosen_5.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/wysiwyg/kurze_arbeitshosen_5.png" alt="" title="" data-element="desktop_image" data-pb-style="IIQIDTB"></picture><picture class="mfwebp"> <source title="" data-element="mobile_image" data-pb-style="XU21V2Q" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/wysiwyg/kurze_arbeitshosen_5.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/wysiwyg/kurze_arbeitshosen_5.png" alt="" title="" data-element="mobile_image" data-pb-style="XU21V2Q"></picture></figure><div data-content-type="text" data-appearance="default" data-element="main"><h2><a tabindex="0" href="https://www.modyf.fr/tenue-ete">Vêtements printemps/été</a></h2></div></div><div class="pagebuilder-column categ" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="S3U56JU"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="EUCLIMU"><picture class="mfwebp"> <source title="" data-element="desktop_image" data-pb-style="XI3OMRV" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/.renditions/FR/home/4-blocs-categ/genouilleres-2.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/.renditions/FR/home/4-blocs-categ/genouilleres-2.png" alt="" title="" data-element="desktop_image" data-pb-style="XI3OMRV"></picture><picture class="mfwebp"> <source title="" data-element="mobile_image" data-pb-style="FX37V3X" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/.renditions/FR/home/4-blocs-categ/genouilleres-2.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/.renditions/FR/home/4-blocs-categ/genouilleres-2.png" alt="" title="" data-element="mobile_image" data-pb-style="FX37V3X"></picture></figure><div data-content-type="text" data-appearance="default" data-element="main"><h2><a href="/accessoires">Accessoires</a></h2></div></div></div></div></div></div></div>
<div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.jobSelector {
box-sizing: border-box;
margin: 0 auto;
padding: 40px;
margin-bottom: 50px;
width: 100%;
/*max-width: 1360px;*/
text-align: center;
/*box-shadow: rgba(0, 0, 0, 0.08) 0px 7px 22px;*/
background-color: #000;
background-image: url(https://www.modyf.fr/media/FR/home/trouvez-des-vetements-pour-votre-metier_1.webp);
}
.jobSelector h2 {
margin-bottom: 40px;
margin-top: 0;
color: #fff;
}
.jobSelector .container {
display: flex;
justify-content: space-between;
width: 100%;
max-width: 1360px;
margin: 0 auto;
}
.jobSelector .container .item {
display: flex;
align-items: center;
}
.jobSelector .container .item label {
margin-right: 23px;
color: #fff;
}
.jobSelector .select2, .jobSelector .nice-select {
min-width: 270px;
}
.jobSelector a.searchCta {
color: #fff;
background-color: #c00;
font-size: 18px;
padding: 20px 50px;
font-family: "Wuerthbold", Arial, sans-serif;
}
.jobSelector a.searchCta:hover {
background-color: #e51717;
}
.jobSelector a.searchCta span {
display: flex;
align-items: center;
justify-content: center;
}
.jobSelector a.searchCta span::before {
content: "";
display: inline-block;
margin-right: 10px;
width: 24px;
height: 24px;
background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_1087_791)'%3E%3Cg clip-path='url(%23clip1_1087_791)'%3E%3Cpath d='M9.33597 17.7384C13.9765 17.7384 17.7384 13.9765 17.7384 9.33597C17.7384 4.69547 13.9765 0.933594 9.33597 0.933594C4.69547 0.933594 0.933594 4.69547 0.933594 9.33597C0.933594 13.9765 4.69547 17.7384 9.33597 17.7384Z' stroke='white' stroke-width='2' stroke-miterlimit='10'/%3E%3Cpath d='M14.9375 14.9375L23.3399 23.3399' stroke='white' stroke-width='2' stroke-miterlimit='10'/%3E%3C/g%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_1087_791'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3CclipPath id='clip1_1087_791'%3E%3Crect width='24' height='24' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
}
.jobSelector .select2-search--dropdown {
display: none;
}
.jobSelector .select2 {
text-align: left;
}
@media only screen and (max-width: 1049px) {
.jobSelector .container {
flex-flow: column;
}
.jobSelector .select2, .jobSelector .nice-select {
min-width: auto;
}
.jobSelector .container .item {
margin-bottom: 24px;
}
}
@media only screen and (max-width: 768px) {
.jobSelector {
background-image: url(https://www.modyf.fr/media/FR/home/trouvez-des-vetements-pour-votre-metier-mobile.webp);
}
}
</style>
<div class="jobSelector">
<h2>Trouvez les vêtements adaptés à votre métier en 2 clics</h2>
<div class="container">
<div class="item">
<label for="domaine">Je travaille dans :</label>
<select id="domaine" onchange="updateMetiers()" data-placeholder="test">
<option>Choisissez un domaine</option>
<option value="administration">Administration</option>
<option value="artisanBois">Artisan du bois</option>
<option value="artisanat">Artisanat</option>
<option value="automobile">Automobile</option>
<option value="btp">BTP et Chantier</option>
<option value="espaceVert">Espaces Verts</option>
<option value="industrie">Industrie</option>
<option value="industrieMetal">Industrie du métal</option>
<option value="installateurs">Installateurs</option>
<option value="logistique">Logistique et Transport</option>
</select>
</div>
<div class="item">
<label for="metier">Je suis :</label>
<select id="metier" onchange="redirectToPage()" disabled>
<option>Choisissez un métier</option>
</select>
</div>
<a class="searchCta" href="#" id="go"><span>Rechercher</span></a>
</div>
</div>
<p id="jobDebug" style="display:none;"></p>
<input type="hidden" value="Choisissez un métier" id="jobPlaceholder">
<script>
const domaineSelect = document.getElementById("domaine");
const metierSelect = document.getElementById("metier");
const metiersParDomaine = {
btp: [
["Carreleur / Solier",""],
["Ouvrier BTP", "https://www.modyf.fr/metiers/chantier-batiment/ouvrier-construction"],
["Maçons","https://www.modyf.fr/metiers/chantier-batiment/macon-travaux-maconnerie"],
["Peintre","https://www.modyf.fr/metiers/chantier-batiment/peintre"],
["Plâtrier / plaquiste","https://www.modyf.fr/metiers/chantier-batiment/platrier-plaquiste"],
["Travaux publics","https://www.modyf.fr/metiers/chantier-batiment/travaux-publics"],
["Autre","https://www.modyf.fr/metiers/chantier-batiment"]
],
espaceVert: [
["Agriculteur","https://www.modyf.fr/metiers/espaces-verts/agriculteur"],
["Paysagiste","https://www.modyf.fr/metiers/espaces-verts/jardinier/pantalon-femme"],
["Horticulteur","https://www.modyf.fr/metiers/espaces-verts/horticulteur"],
["Jardinier","https://www.modyf.fr/metiers/espaces-verts/jardinier"],
["Autre","https://www.modyf.fr/metiers/espaces-verts"]
],
installateurs: [
["Chauffagiste","https://www.modyf.fr/metiers/installateur-sanitaire/chauffagiste"],
["Électricien","https://www.modyf.fr/metiers/installateur-sanitaire/electricien"],
["Plombier", "https://www.modyf.fr/metiers/installateur-sanitaire/plombier"],
["Serrurier","https://www.modyf.fr/metiers/installateur-sanitaire/serrurier"],
["Autre","https://www.modyf.fr/metiers/installateur-sanitaire"]
],
automobile: [
["Carrossier","https://www.modyf.fr/metiers/automobile/carrossier"],
["Dépanneur","https://www.modyf.fr/metiers/automobile/depanneur"],
["Garagiste","https://www.modyf.fr/metiers/automobile/garagiste"],
["Mécanicien","https://www.modyf.fr/metiers/automobile/mecanique-mecanicien"],
["Autre","https://www.modyf.fr/metiers/automobile"]
],
artisanBois: [
["Bûcheron", "https://www.modyf.fr/metiers/artisan-bois/bucheron"],
["Charpentier", "https://www.modyf.fr/metiers/artisan-bois/charpentier"],
["Ébeniste", "https://www.modyf.fr/metiers/artisan-bois/ebeniste"],
["Élagueur", "https://www.modyf.fr/metiers/artisan-bois/elagueur"],
["Menuisier", "https://www.modyf.fr/metiers/artisan-bois/menuisier"],
["Autre", "https://www.modyf.fr/metiers/artisan-bois"]
],
logistique: [
["Cariste","https://www.modyf.fr/metiers/logistique/cariste"],
["Chauffeur-livreur","https://www.modyf.fr/metiers/logistique/chauffeur-livreur"],
["Déménageur","https://www.modyf.fr/metiers/logistique/demenageur"],
["Manutentionnaire","https://www.modyf.fr/metiers/logistique/manutentionnaire"],
["Transporteur","https://www.modyf.fr/metiers/logistique/transporteur"],
["Autre","https://www.modyf.fr/metiers/logistique"]
],
industrie: [
["Agroalimentaire","https://www.modyf.fr/metiers/industrie/chaussures-securite-agroalimentaire"],
["Construction industrielle"," "],
["Ouvrier","https://www.modyf.fr/metiers/industrie/ouvrier"],
["Service de maintenance","https://www.modyf.fr/metiers/industrie/service-maintenance"],
["Technicien","https://www.modyf.fr/metiers/industrie/technicien"],
["Autre","https://www.modyf.fr/metiers/industrie"]
],
industrieMetal: [
["Chaudronnier","https://www.modyf.fr/metiers/industrie-metal/chaudronnier"],
["Ferronnier","https://www.modyf.fr/metiers/industrie-metal/ferronier"],
["Soudeur","https://www.modyf.fr/metiers/industrie-metal/soudeur-soudage"],
["Autre","https://www.modyf.fr/metiers/industrie-metal"]
],
artisanat: [
["Travaux d'intérieur", "https://www.modyf.fr/metiers/artisanat/travaux-interieur"],
["Travaux d'extérieur", "https://www.modyf.fr/metiers/artisanat/travaux-exterieur"],
["Autre", "https://www.modyf.fr/metiers/artisanat"]
],
administration: [
["Collectivités", "https://www.modyf.fr/metiers/administration/collectivites"],
["Employé de mairie", "https://www.modyf.fr/metiers/administration/employe-mairie"],
["Autre", "https://www.modyf.fr/metiers/administration"]
]
};
function decodeHtmlEntities(str) {
const textarea = document.createElement("textarea");
textarea.innerHTML = str;
return textarea.value;
}
// Fonction pour mettre à jour la liste des métiers en fonction du domaine sélectionné
function updateMetiers() {
const domaineSelect = document.getElementById("domaine");
const metierSelect = document.getElementById("metier");
const domaine = domaineSelect.value;
var niceMetierSelect = document.querySelector('#metier + .nice-select');
var niceDomaineSelect = document.querySelector('#domaine + .nice-select');
niceDomaineSelect.classList.remove("open");
// Effacer les options actuelles du sélecteur de métiers
metierSelect.innerHTML = "";
metier.innerHTML='<option value="" disabled selected hidden>Choisissez un métier</option>';
if (domaine in metiersParDomaine) {
metiersParDomaine[domaine].forEach(function (metier) {
const option = document.createElement("option");
option.value = metier[1].toLowerCase();
option.text = decodeHtmlEntities(metier[0]);
metierSelect.appendChild(option);
});
}
niceMetierSelect.remove()
metierSelect.removeAttribute("disabled");
NiceSelect.bind(metierSelect, {placeholder: 'Choisissez un métier'});
document.querySelector('#metier + .nice-select').click();
}
// Fonction pour rediriger vers la page du métier choisi
function redirectToPage() {
const metierSelect = document.getElementById("metier");
const metier = metierSelect.value;
if (metier) {
document.getElementById("go").href = metier + "?mtm_campaign=HomeJobSelector";
document.getElementById("jobDebug").innerHTML = metier;
}
}
</script></div></div>
<div><style>#html-body [data-pb-style=JJN27CJ],#html-body [data-pb-style=O1X9SYT]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=JJN27CJ]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=O1X9SYT]{align-self:stretch}#html-body [data-pb-style=HKV5SF4]{display:flex;width:100%}#html-body [data-pb-style=OYNS2QV]{justify-content:flex-start;display:flex;flex-direction:column;width:50%;align-self:stretch}#html-body [data-pb-style=CBL01GQ],#html-body [data-pb-style=OYNS2QV]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=CJEIHGN]{border-radius:0;min-height:300px;background-color:transparent}#html-body [data-pb-style=XL7GL28]{justify-content:flex-start;display:flex;flex-direction:column;width:50%;align-self:stretch}#html-body [data-pb-style=O81PPEE],#html-body [data-pb-style=XL7GL28]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=IG7XCAN]{border-radius:0;min-height:300px;background-color:transparent}</style><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.doubleCateg{ padding: 50px 0;}
.doubleCateg .pagebuilder-column-line{
justify-content: space-evenly;
}
body#html-body .doubleCateg .pagebuilder-column-group .pagebuilder-column{
width: 650px;
padding: 0px;
}
body#html-body .doubleCateg .pagebuilder-banner-wrapper .pagebuilder-overlay{
padding: 20px;
min-height: auto;
height: 300px;
background-color: rgb(0 0 0 / 10%);
}
body#html-body .doubleCateg .right .pagebuilder-banner-wrapper .pagebuilder-overlay{
/*background-color: rgb(0 0 0 / 20%);*/
background-color: rgb(0 0 0 / 20%);
}
body#html-body .doubleCateg .pagebuilder-banner-wrapper{
background-position: center;
background-size: 100%;
transition: 0.3s;
}
body#html-body .doubleCateg .pagebuilder-banner-wrapper:hover{
background-size: 110%;
}
body#html-body .doubleCateg .pagebuilder-banner-wrapper [data-element=content]{
display: flex;
flex-flow: column;
align-items: center;
justify-content: center;
}
.doubleCateg p{
color:#fff;
line-height: normal;
}
.doubleCateg p.title{
font-size: 60px;
text-transform: uppercase;
}
.doubleCateg p.subtitle{
font-size: 20px;
}
.doubleCateg p.subtitle::after{
width: 24px;
height: 24px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='rgba(255,255,255,1)' stroke-width='2'%3E%3Cpath d='M4 12h14M15 17l5-5-5-5'/%3E%3C/g%3E%3C/svg%3E%0A");
content: '';
display: inline-block;
vertical-align: middle;
margin-left: 10px;
}
@media screen and (max-width: 1280px) {
body#html-body .doubleCateg .pagebuilder-column-group .pagebuilder-column{
width: 48%;
}
body#html-body .doubleCateg .pagebuilder-banner-wrapper .pagebuilder-overlay{
height: auto;
padding: 8% 4%;
}
.doubleCateg p.title{
font-size: 4vw;
}
.doubleCateg p.subtitle{
}
}
@media screen and (max-width: 768px) {
.doubleCateg{ padding: 20px 0;}
.doubleCateg .pagebuilder-column-line{ flex-flow: column;}
body#html-body .doubleCateg .pagebuilder-column-group .pagebuilder-column{
width: 90%;
margin: 0 auto;
margin-bottom: 4vw;
}
.doubleCateg p.title {
font-size: 7vw;
}
}
</style></div><div data-content-type="row" data-appearance="contained" data-element="main"><div class="doubleCateg" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="JJN27CJ"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="O1X9SYT"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="HKV5SF4"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="OYNS2QV"><div data-content-type="banner" data-appearance="poster" data-show-button="never" data-show-overlay="never" data-element="main"><a href="https://www.modyf.fr/collections" target="" data-link-type="category" title="" data-element="link"><div class="pagebuilder-banner-wrapper background-image-69b8dc69ce744 background-image-69b8dc69d82bb" data-background-images='{\"desktop_image\":\"https://www.modyf.fr/media/FR/home/2-blocs/nos-collections.jpg\"}' data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="wrapper" data-pb-style="CBL01GQ"><div class="pagebuilder-overlay pagebuilder-poster-overlay" data-overlay-color="" aria-label="" title="" data-element="overlay" data-pb-style="CJEIHGN"><div class="pagebuilder-poster-content"><div data-element="content"><p class="title"><strong>Nos collections</strong></p><p class="subtitle">Je découvre</p></div></div></div></div><style type="text/css">.webp-supported .webp-supported .background-image-69b8dc69ce744 {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/nos-collections.webp);} .no-webp .background-image-69b8dc69ce744 {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/nos-collections.webp);} .no-webp .webp-supported .background-image-69b8dc69ce744 {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/nos-collections.webp);} .no-webp .background-image-69b8dc69ce744 {background-image: url(https://www.modyf.fr/media/FR/home/2-blocs/nos-collections.jpg);}</style><style type="text/css">.webp-supported .background-image-69b8dc69d82bb {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/nos-collections.webp);} .no-webp .background-image-69b8dc69d82bb {background-image: url(https://www.modyf.fr/media/FR/home/2-blocs/nos-collections.jpg);}</style></a></div></div><div class="pagebuilder-column right perso" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="XL7GL28"><div data-content-type="banner" data-appearance="poster" data-show-button="never" data-show-overlay="never" data-element="main"><a href="https://www.modyf.fr/demande-de-catalogue" target="" data-link-type="page" title="" data-element="link"><div class="pagebuilder-banner-wrapper background-image-69b8dc69ce762 background-image-69b8dc69d82cd" data-background-images='{\"desktop_image\":\"https://www.modyf.fr/media/FR/home/2-blocs/BLOC-CATEG-HOME-NEW-CATALOGUE_1.jpg\"}' data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="wrapper" data-pb-style="O81PPEE"><div class="pagebuilder-overlay pagebuilder-poster-overlay" data-overlay-color="" aria-label="" title="" data-element="overlay" data-pb-style="IG7XCAN"><div class="pagebuilder-poster-content"><div data-element="content"><p class="title" style="text-align: center;"><strong id="KVLVGL8">Catalogue 25/26</strong></p><p class="subtitle">Je découvre</p></div></div></div></div><style type="text/css">.webp-supported .webp-supported .background-image-69b8dc69ce762 {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/BLOC-CATEG-HOME-NEW-CATALOGUE_1.webp);} .no-webp .background-image-69b8dc69ce762 {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/BLOC-CATEG-HOME-NEW-CATALOGUE_1.webp);} .no-webp .webp-supported .background-image-69b8dc69ce762 {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/BLOC-CATEG-HOME-NEW-CATALOGUE_1.webp);} .no-webp .background-image-69b8dc69ce762 {background-image: url(https://www.modyf.fr/media/FR/home/2-blocs/BLOC-CATEG-HOME-NEW-CATALOGUE_1.jpg);}</style><style type="text/css">.webp-supported .background-image-69b8dc69d82cd {background-image: url(https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/BLOC-CATEG-HOME-NEW-CATALOGUE_1.webp);} .no-webp .background-image-69b8dc69d82cd {background-image: url(https://www.modyf.fr/media/FR/home/2-blocs/BLOC-CATEG-HOME-NEW-CATALOGUE_1.jpg);}</style></a></div></div></div></div></div></div></div>
<div><style>#html-body [data-pb-style=I47KJ8Y]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=PSDB2VG]{text-align:center}</style><div data-content-type="row" data-appearance="contained" data-element="main"><div class="t2s-pdp-block" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="I47KJ8Y"><div data-content-type="text" data-appearance="default" data-element="main"><!--p> <div class="t2s-widget-wrapper" id="t2s-widget-wrapper" data-mage-init='{"t2sWidget": {"action":"t2srecoeng/ajax/getSpacesSlider", "gtmListOption": "home"}}' style="display: none;"><h2 class="t2s-main-title">Recommandations</h2><div class="t2s-inner-wrappper"><div class="t2s-sliders-wrapper"> <div class="t2s-products-list" id="-1000-2" style="display: none;" data-widget-tabtitle="Pour vous"></div> </div></div></div></p--></div><h2 data-content-type="heading" data-appearance="default" data-element="main" data-pb-style="PSDB2VG">Recommandations</h2><div data-content-type="product_recommendations" data-appearance="default" data-recommendation-id="16dcacfc-db06-4817-a050-f3a01a5daeb2_Most purchased" data-element="main">
<div x-data="pageBuilder_recommendedProducts_69b8dc69cfa78()" x-init="initProductRecBlock()" id="recs_block_page_builder_69b8dc69cfa78" class="block block-static-block product-recommendations-wrapper" x-cloak>
<template x-if="productBanners">
<div class="block-content desktop:px-[63px]" x-effect="productBanners.length && $nextTick(() => afterRender())">
<template x-for="banner in productBanners">
<div class="products wrapper products-grid product-slider product-recommendations-list" x-intersect.once="scrollViewEvent(banner.unitId)">
<div class="block-title px-[22px] leading-[30px] mb-[28px] tablet:px-[45px]">
<h3 x-text="banner.storefrontLabel" class="text-center block text-[32px] leading-[32px] text-modyf-black font-wuerth-bold"></h3>
</div>
<div class="splide px-[8px] tablet:px-[45px]" :class="'slider-' + banner.unitId">
<div class="relative splide__track mobile_tablet:pb-[60px] desktop:pb-[54px]">
<div class="products list items product-items relative splide__list">
<template x-for="product in banner.products">
<div class="item product product-item splide__slide pb-[20px]">
<div class="product-item-info p-[10px] relative text-center box-border desktop:px-[35px] desktop:py-[30px] desktop:hover:shadow-modyf_product_item_shadow desktop:hover:bg-modyf-white">
<form method="post" x-bind:action="createAddToCartUrl(product.productId)" @submit.prevent="validateAndSubmit($event.target, banner.unitId, product.productId)" class="item product product-item product_addtocart_form flex flex-col w-full">
<input name="form_key" type="hidden" :value="hyva.getFormKey()">
<input type="hidden" name="product" x-bind:value="product.productId">
<input type="hidden" name="qty" value="1">
<input type="hidden" name="sku" x-bind:value="product.sku">
<a @click="recsClickEvent(banner.unitId, product.productId, product.url)" class="product photo product-item-photo flex justify-center cursor-pointer w-[135px] h-[168px] align-center desktop:h-auto desktop:w-[240px] desktop:m-auto desktop:inline-block desktop:max-w-full desktop:pb-[125%] desktop:overflow-hidden desktop:relative desktop:z-[1]" tabindex="-1">
<img class="object-contain desktop:block desktop:absolute desktop:w-auto desktop:m-auto desktop:top-0 desktop:bottom-0 desktop:right-0 desktop:left-0" loading="lazy" x-bind:alt="product.smallImage?.label" x-bind:title="product.smallImage?.label" x-bind:src="product.smallImage?.url">
</a>
<div class="product-item-labels absolute top-[10px] left-[10px] desktop:top-[25px] desktop:left-[25px]">
<template x-if="product.attributes.publication_date && checkIfIsNew(product.attributes.publication_date[0])">
<div>
<span class="new-label px-[10px] py-[3px] text-[11px] font-wuerth-bold text-modyf-white uppercase bg-modyf-red mb-[10px] float-left leading-normal desktop:px-[20px] desktop:py-[8px]">
Nouveau </span>
</div>
</template>
<template x-if="product.attributes.discount_percent">
<div>
<span class="px-[10px] py-[3px] text-[11px] font-wuerth-bold text-modyf-white uppercase bg-modyf-red mb-[10px] float-left leading-normal desktop:px-[20px] desktop:py-[8px]" x-text="product.attributes.discount_percent + '%'"></span>
</div>
</template>
</div>
<div class="product details product-item-details product-info flex flex-col flex-grow">
<div class="product-item-collection mb-[10px] min-h-[27px] desktop:min-h-[32px]">
<template x-if="product.attributes.modyf_collection && product.attributes.modyf_collection.length">
<template x-for="collection in product.attributes.modyf_collection">
<span class="text-[11px] uppercase font-wuerth-bold text-modyf-darkest_grey bg-modyf-light_grey inline-block px-[10px] py-[5px] desktop:px-[16px] desktop:py-[8px]" x-text="collection"></span>
</template>
</template>
</div>
<div class="my-[5px] break-words text-[14px] leading-[15px] overflow-hidden h-[40px] font-wuerth-bold tablet_desktop:h-[47px]">
<a class="product-item-link block leading-[15px] cursor-pointer my-[5px] overflow-hidden h-[47px] tablet:h-[32px] desktop:hover:underline desktop:text-[18px] desktop:leading-[21px] desktop:h-[45px]" @click="recsClickEvent(banner.unitId, product.productId, product.url)" x-text="product.name"></a>
</div>
<div class="reviews-container min-h-[15px] mb-[5px]">
<template x-if="product.attributes && product.attributes.reviews_summary && product.attributes.reviews_summary.length">
<div class="reviews-summary-wrapper" x-html="getRecommendationsRating(product.attributes.reviews_summary)"></div>
</template>
</div>
<div class="price-container min-h-[54px] desktop:min-h-[72px]">
<template x-if="product.prices">
<div class="pt-1 text-gray-900 price-box price-final_price" x-bind:data-product-id="product.productId">
<span class="normal-price inline-block">
<span class="price-container price-final_price">
<span x-show="product.prices.minimum.final !== product.prices.maximum.final" class="price-label">À partir de</span>
<span id="product-price" class="price-wrapper">
<span class="price text-[18px] leading-[24px] font-bold desktop:!text-[26px] desktop:!leading-[35px] desktop:!font-normal" x-text="hyva.formatPrice(product.prices.minimum.final)" :class="{ 'text-modyf-red': product.prices.minimum.regular > product.prices.minimum.final }">
</span>
</span>
</span>
</span>
<template x-if="product.prices.minimum.regular > product.prices.minimum.final">
<span class="regular-price inline-block">
<span class="price-final_price">
<span id="product-price" class="price-wrapper">
<span class="price text-modyf-darkest_grey3 line-through !text-[13px] !leading-[24px] !font-normal" x-text="hyva.formatPrice(product.prices.minimum.regular)"></span>
</span>
</span>
</span>
</template>
<p class="price-vat-label !text-[13px] !leading-[18px] text-modyf-darkest_grey3 mt-[-5px] desktop:mt-[5px]">
TTC </p>
</div>
</template>
</div>
<template x-if="product.attributes.model_group && product.attributes.model_group.length && !isCartPage">
<div class="relative">
<template x-if="product.attributes.model_group.length > maxColorsDesktop">
<div class="product-item-colors-label desktop">
<span x-text="product.attributes.model_group.length"></span>
<span class="text-[13px] leading-[18px] text-modyf-darkest_grey3">
Colors </span>
</div>
</template>
<div :class="getMaxColorClasses(product.attributes.model_group, maxColorsDesktop, maxColorsMobile)">
<template x-for="colorItem in product.attributes.model_group.map(colorStr => JSON.parse(colorStr))">
<a class="w-[10px] h-[10px] mr-[4px] inline-block box-border desktop:w-[15px] desktop:h-[15px] desktop:mr-[6px]" :href="colorItem.url" :class="{ ['color ' + colorItem.color_id]: true, 'border-2 border-modyf-grey': !colorItem.swatch_color }" :title="colorItem.color_value" :style="'background-color: ' + colorItem.swatch_color">
</a>
</template>
</div>
<template x-if="product.attributes.model_group.length > maxColorsMobile">
<span class="more-colors mobile-tablet text-[13px] leading-[18px] text-modyf-darkest_grey3 align-text-bottom">
+ more </span>
</template>
</div>
</template>
<template x-if="product.addToCartAllowed && isCartPage">
<div>
<div class="swatch-conf-container my-[10px]">
<template x-if="product.attributes.swatch_options && product.attributes.swatch_options.length">
<div>
<div class="swatch-conf-wrapper" x-init="$nextTick(() => { $el.querySelectorAll('select').forEach(select => { const instance = NiceSelect.bind(select); selects[select.dataset.elementCode] = instance; }); })">
<div class="swatch-opt-wrapper" data-rendered="true">
<template x-for="(attr, index) in objectToArray(product)">
<div class="relative" :style="{ zIndex: product.attributes.swatch_options.length - index }">
<template x-if="attr.options.length > 1">
<div class="swatch-attribute" :data-attribute-id="attr.id" :data-attribute-code="attr.code" :id="'swatch-attribute-' + product.productId" :class="attr.code">
<div class="clearfix">
<div class="field required custom-select-attribute relative">
<label class="absolute m-0 top-[10px] left-[10px] normal-case z-[2] font-wuerth-book font-normal text-[14px] leading-[28px] after:!hidden">
<span x-text="attr.label"></span>
<span class="size-guide-button-wrapper text-modyf-darkest_grey2 ml-[5px] underline cursor-pointer" @click.prevent="openPopups[product.productId] = true"></span>
</label>
<div class="control">
<select :name="'super_attribute[' + attr.id + ']'" :data-element-target="attr.id + '_' + product.productId" :data-element-code="attr.code + '_' + product.productId" :disabled="selectAttributesArray.length === 2 && selectAttributesArray[selectAttributesArray.length - 1].code === attr.code" :class="attr.code" x-model="selectedAttributes[attr.id + '_' + product.productId]" @change="validateField(attr.id + '_' + product.productId); updateSelectOptions($event.target)">
<option value=""></option>
<template x-for="option in attr.options">
<option x-show="option.products.length" :value="option.id" :data-options-id="option.id" :data-products="JSON.stringify(option.products)" x-text="option.label">
</option>
</template>
</select>
</div>
<div class="flex justify-between items-center">
<div x-show="errors[attr.id + '_' + product.productId]" class="leading-[28px] text-[13px] text-modyf-red absolute right-0 left-0 bottom-[-5px]">
Ce champ est obligatoire. </div>
</div>
</div>
</div>
</div>
</template>
<template x-if="attr.options.length === 1">
<div>
<input type="hidden" :value="attr.options[0]?.id" :name="'super_attribute[' + attr.id + ']'">
</div>
</template>
</div>
</template>
</div>
</div>
</div>
</template>
</div>
<div class="mt-auto pt-3 flex flex-wrap justify-center items-center w-full">
<button class="w-full btn text-[13px] justify-center h-[50px] action tocart" aria-label="Add to Cart">
<span>Ajouter au panier </span>
</button>
</div>
</div>
</template>
<template x-if="!product.addToCartAllowed && isCartPage">
<div class="stock unavailable">
<span>Épuisé </span>
</div>
</template>
<div class="product-item-inner absolute right-[10px] top-[10px] desktop:right-[25px] desktop:top-[25px] desktop:hidden" x-show="product.productId && product.addToCartAllowed">
<div class="product-item-actions">
<div class="actions-primary"></div>
<div class="actions-secondary" data-role="add-to-links">
<template x-if="isCompareEnable(product) === '1'">
<div class="action tocompare svg-icon-mixin svg-icon__compare__mixin mb-[5px]" data-action="add-to-wishlist" @click.prevent="addToWishlistCompare(product.productId, 'catalog/product_compare/add')">
<span class="sr-only">Ajouter au comparateur</span>
</div>
</template>
<template x-if="isWishlistEnable(product) === '1'">
<span class="action towishlist before:text-[16px] before:text-modyf-grey before:content-['\e600'] before:font-luma-icons desktop:before:text-[20px]" data-action="add-to-wishlist" @click.prevent="addToWishlistCompare(product.productId, 'wishlist/index/add')">
<span class="sr-only">Ajouter à la liste d'achats</span>
</span>
</template>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</template>
</div>
</div>
</div>
<template x-for="product in banner.products">
<template x-if="product.attributes.size_guide_url">
<div>
<div role="dialog" aria-modal="true" @click.outside="openPopups[product.productId] = false" class="mobile:inset-y-0 mobile:left-[44px] right-0 !fixed z-[999] tablet_desktop:left-0 tablet_desktop:right-0 tablet_desktop:m-auto tablet_desktop:max-h-[90%] tablet_desktop:w-3/4 tablet_desktop:absolute tablet_desktop:max-w-[1680px] tablet_desktop:modyf-absolute-centering-verticall-mixin" x-cloak x-show="openPopups[product.productId]" :class="openPopups[product.productId] == true ? 'opacity-100 visible mobile:[transition:opacity_.3s_ease] !flex' : 'opacity-0 invisible [transition:visibility_0s_.3s,opacity_.3s_ease] !flex'">
<div class="relative w-screen pt-[42px] bg-container-lighter overflow-auto [transition:transform_.3s_ease-in-out] shadow-modyf_stock_alert_popup_shadow tablet_desktop:[transition:transform_.2s_ease] tablet_desktop:w-full" x-cloak="" :class="openPopups[product.productId] == true ? 'mobile:translate-x-[0] tablet_desktop:translate-y-[0]' : 'mobile:translate-x-[100%] tablet_desktop:translate-y-[-200%]'">
<div x-show="openPopups[product.productId]" x-cloak="" class="absolute top-[10px] right-[10px] tablet_desktop:top-[30px] tablet_desktop:right-[30px]">
<button type="button" @click="openPopups[product.productId] = false;" aria-label="Fermer le panneau">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px]" role="img"><g fill="none" fill-rule="evenodd" stroke="rgba(0,0,0,0.99)" stroke-width="2"><path d="M6 18L18 6M18 18L6 6"></path></g><title>cross-black-icon</title></svg>
</button>
</div>
<div class="content p-[20px] text-left desktop:px-[50px] desktop:pb-[50px] desktop:pt-0 tablet_desktop:overflow-y-auto">
<div class="cms-block-container" :id="'size-guide-' + product.productId" x-html="getSizeGuideHtml(product.attributes.size_guide_url[0], product.productId)"></div>
</div>
</div>
</div>
<div class="backdrop z-[998]" aria-hidden="true" x-cloak x-show="openPopups[product.productId]" @click="openPopups[product.productId] = false"></div>
</div>
</template>
</template>
</div>
</template>
</div>
</template>
</div>
<script>
function pageBuilder_recommendedProducts_69b8dc69cfa78() {
"use strict";
const uniqueId = "69b8dc69cfa78";
return {
config: {
unitId: "16dcacfc\u002Ddb06\u002D4817\u002Da050\u002Df3a01a5daeb2_Most\u0020purchased",
systemLocale: "fr-FR",
pageType: "PageBuilder",
defaultStoreViewCode: "fr_fr",
alternateEnvironmentId: "",
environmentId: "57f0c44c\u002Ddae0\u002D4e4c\u002D9a92\u002D6c61b10c4a3a",
},
productBanners: '',
pagePreconfiguredDeferred: {},
maxColorsDesktop: 10,
maxColorsMobile: 5,
isCartPage: document.body.classList.contains('checkout-cart-index'),
selectedAttributes: {},
errors: {},
addToCartButtonTextWhileAdding: 'En\u0020cours\u0020d\u0027ajout...',
swatchHeight: 0,
sizeGuideButtonText: 'Tableaux\u0020des\u0020tailles\u0020',
openPopups: {},
gtmProductImpressionsAjaxUrl: 'https://www.modyf.fr/google-tag-manager/ajax/collectData/',
gtmProductRecommendations: [],
selectAttributesArray: [],
selects: {},
initProductRecBlock: function () {
let self = this;
let storefrontEvents = window.magentoStorefrontEvents;
storefrontEvents.context.setContext("recsContext", {
alternateEnvironmentId: this.config.alternateEnvironmentId
});
this.pagePreconfiguredDeferred = new Promise((resolve, reject) => {
self.pagePreconfiguredDeferred.resolve = resolve;
self.pagePreconfiguredDeferred.reject = reject;
})
window.addEventListener(`pageBuilderRecsRequestSent-${uniqueId}`, () => {
storefrontEvents.publish.recsRequestSent();
});
window.addEventListener(`pageBuilderRecsResponseReceived-${uniqueId}`, event => {
const recommendations = event.detail;
window.magentoStorefrontEvents.context.setRecommendations({ units: recommendations });
this.setProducts(recommendations);
window.magentoStorefrontEvents.publish.recsResponseReceived();
self.productBanners.forEach((recommendation, index) => {
self.gtmProductImpressions(recommendation.products);
});
});
this.recsFetcher();
},
gtmProductImpressions: function (products) {
if (!Array.isArray(products) || products.length === 0) {
return;
}
let self = this,
postData = new URLSearchParams();
products.forEach((product, index) => {
postData.append(`ids[${index}]`, product.productId);
});
postData.append('type', 'impression');
postData.append('list', '');
postData.append('isAjax', 'true');
fetch(this.gtmProductImpressionsAjaxUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
body: postData
})
.then(response => response.json())
.then(data => {
if (Array.isArray(data) && data.length) {
const event = new CustomEvent('googleAnalyticsUniversalEvent', {
detail: data
});
document.dispatchEvent(event);
data.forEach(product => {
self.gtmProductRecommendations.push(product);
});
}
})
.catch(error => console.error('Error:', error));
},
recsFetcher: async function () {
const options = {
unitId: this.config.unitId.substring(0, 36),
pageType: "PageBuilder",
defaultStoreViewCode: this.config.defaultStoreViewCode,
alternateEnvironmentId: this.config.alternateEnvironmentId,
environmentId: this.config.environmentId
}
await this.fetchUnit(options);
},
fetchUnit: async function(options){
let client;
await new Promise((resolve, reject) => {
let interval = setInterval(() => {
client = new RecommendationsClient();
if (client._environmentId !== "") {
clearInterval(interval);
resolve();
}
if (client._pageType ==="Default"){
client._pageType = "PageBuilder";
}
}, 300);
});
const requestEvent = new CustomEvent(`pageBuilderRecsRequestSent-${uniqueId}`);
window.dispatchEvent(requestEvent);
const response = await client.fetchPreconfigured(options);
const responseEvent = new CustomEvent(`pageBuilderRecsResponseReceived-${uniqueId}`, {
detail: [response.data],
});
window.dispatchEvent(responseEvent);
},
addToCartRecsEvent: function (e, unitId, productId) {
// requires recommendationsContext to be set
magentoStorefrontEvents.publish.recsItemAddToCartClick(
unitId, productId, magentoStorefrontEvents.context
);
// Timeout to prevent submission before event has fired.
setTimeout(() => e.submit(), 500);
},
scrollViewEvent: function (unitId) {
magentoStorefrontEvents.publish.recsUnitView(
unitId, magentoStorefrontEvents.context
);
},
recsClickEvent: function (unitId, productId, productUrl) {
magentoStorefrontEvents.publish.recsItemClick(
unitId, productId, magentoStorefrontEvents.context
);
// Timeout to prevent submission before event has fired.
setTimeout(() => window.location.href = productUrl, 500);
},
setProducts(recommendations) {
this.productBanners = recommendations;
},
createAddToCartUrl(productId) {
const encodedUenc = this.encodeUenc(window.BASE_URL);
return `${window.BASE_URL}checkout/cart/add/uenc/${encodedUenc}/product/${productId}`;
},
encodeUenc(value) {
return btoa(value).replace(/=/g, ",");
},
checkIfIsNew: function (publication) {
if (!publication) return false;
let current = new Date(),
publ = new Date(publication),
period = 60 * 24 * 60 * 60 * 1000;
current = current.getTime();
publ = publ.getTime();
return (current - period) <= publ;
},
getRecommendationsRating: function (value) {
let result = '',
percent = 20,
title = `${parseFloat(value[0]).toFixed(2)}/5`;
if (parseInt(value[0]) === parseFloat(value[0])) {
title = `${value[0]}/5`;
}
if (value && value.length) {
value = Number(value[0]) * 20;
}
for (let i = 0; i < 5; i++) {
if (value >= 20) {
result += `<span class="nr-icon nr-star gold !text-[12px]" style="width: ${percent}%"></span>`;
value -= 20;
} else {
percent = 20 - value;
result += `<span class="nr-icon nr-star gold !text-[12px]" style="width: ${percent}%"></span>`;
}
}
result = `<div class="netreviews-stars">
<span>
<div class="netreviews_bg_stars_big listStars float-none w-[60px] min-w-[60px] max-w-[60px] h-[15px] min-h-[15px] max-h-[15px] !my-0" title="${title}">
<div class="recommendation-stars-wrapper !text-[0px] flex">
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
</div>
<div class="recommendation-stars-wrapper !text-[0px] flex">
${result}
</div>
</div>
</span>
</div>`;
return result;
},
getMaxColorClasses: function (arr, desktopLimit, mobileLimit) {
if (!arr || !desktopLimit || !mobileLimit) return false;
let result = 'product-item-colors';
if (arr.length > desktopLimit) result += ' max-colors';
if (arr.length > mobileLimit) result += ' max-color-mobile';
return result;
},
addToWishlistCompare(productId, actionUrl) {
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + actionUrl;
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(),
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Impossible\u0020d\u0027ajouter\u0020un\u0020article\u0020\u00E0\u0020la\u0020liste\u0020de\u0020souhaits."
}], 5000
);
}
}).then(function (response) {
if (!response) { return }
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: (response.success) ? "success" : "error",
text: (response.success)
? "Produit\u0020a\u0020\u00E9t\u00E9\u0020ajout\u00E9\u0020\u00E0\u0020votre\u0020liste\u0020d\u0027achats."
: response.error_message
}], 5000
);
const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data");
window.dispatchEvent(reloadCustomerDataEvent);
}).catch(function (error) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "error",
text: error
}], 5000
);
});
},
initSlider() {
let desktopPerPage = 4,
tabletPerPage = 3,
mobilePerPage = 2;
if (this.isCartPage) {
desktopPerPage = 3;
mobilePerPage = 1;
}
this.productBanners.forEach(async (banner) => {
let splide = new Splide( '.slider-' + banner.unitId, {
perPage: desktopPerPage,
perMove: desktopPerPage,
arrows: false,
breakpoints: {
1049: {
perPage: tabletPerPage,
perMove: tabletPerPage,
},
768: {
perPage: mobilePerPage,
perMove: mobilePerPage,
},
}
});
splide.mount();
});
},
afterRender() {
this.initSlider();
this.updateListHeight();
document.querySelectorAll('select[data-element-target]').forEach(select => {
let attrId = select.getAttribute('data-element-target');
this.selectedAttributes[attrId] = ''
});
},
validateAndSubmit(form, unitId, productId) {
let self = this,
isValid = true;
form.querySelectorAll('select[data-element-target]').forEach(select => {
let productId = select.getAttribute('data-element-target');
if (!this.selectedAttributes[productId]) {
this.errors[productId] = true;
isValid = false;
}
});
if (isValid) {
this.disableAddToCartButton(form);
// Submit if valid
this.addToCartRecsEvent(form, unitId, productId);
let formData = new URLSearchParams(new FormData(form));
fetch(form.getAttribute('action'), {
method: 'POST',
body: formData,
cache: 'no-cache',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(res => {
let product,
addToCartFormData = new FormData(form);
if (self.gtmProductRecommendations.length) {
self.gtmProductRecommendations.forEach(gtmProduct => {
if (gtmProduct.id === addToCartFormData.get('sku')) {
product = gtmProduct;
}
});
}
if (product && window.dataLayer) {
// Enhanced Ecommerce (UA)
dataLayer.push({
'event': 'addToCart',
'ecommerce': {
'currencyCode': window.dlCurrencyCode,
'add': {
'products': [{
'name': product.name,
'id': product.id,
'price': product.price,
'brand': product.brand,
'category': product.category,
'variant': product.variant,
'metric1': product.metric1,
'dimension2': product.dimension2,
'metric2': product.metric2,
'quantity': '1'
}]
}
}
});
// Ecommerce (GA4)
dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'items': [{
'item_name': product.name,
'item_id': product.id,
'price': product.price,
'item_brand': product.brand,
'item_category': product.category,
'item_variant': product.variant,
'index': product.position,
'item_price_vat': product.metric1,
'quantity': '1',
'item_width': product.metric2,
'item_size': product.dimension2
}]
}
});
}
if (res.backUrl) {
window.location.replace(res.backUrl);
} else {
window.location.reload();
}
})
.catch(error => {
console.error('Error:', error);
});
}
},
validateField(attrId) {
if (!this.selectedAttributes[attrId]) {
this.errors[attrId] = true;
} else {
delete this.errors[attrId];
}
},
isWishlistEnable(product) {
let wishlistActive = '';
if (product.attributes.config && typeof product.attributes.config[0] === 'string') {
try {
wishlistActive = JSON.parse(product.attributes.config).wishlistActive;
} catch (e) {
console.error('Invalid JSON:', e);
return false;
}
}
return wishlistActive;
},
isCompareEnable(product) {
let compareActive = '';
if (product.attributes.config && typeof product.attributes.config[0] === 'string') {
try {
compareActive = JSON.parse(product.attributes.config).compareActive;
} catch (e) {
console.error('Invalid JSON:', e);
return false;
}
}
return compareActive;
},
disableAddToCartButton(form) {
let addToCartButton = form.querySelector('.action.tocart');
if (addToCartButton) {
addToCartButton.setAttribute('disabled', 'true');
let spanElement = addToCartButton.querySelector('span');
if (spanElement) {
spanElement.textContent = this.addToCartButtonTextWhileAdding;
}
addToCartButton.setAttribute('title', this.addToCartButtonTextWhileAdding);
}
},
updateListHeight() {
let self = this,
productRecommendationsList = document.querySelectorAll('.product-recommendations-list');
productRecommendationsList.forEach(list => {
let swatchWrappers = list.querySelectorAll('.product-items .swatch-conf-container');
swatchWrappers.forEach(wrapper => {
let swatchHeight = wrapper.offsetHeight;
if (swatchHeight > self.swatchHeight) {
self.swatchHeight = swatchHeight;
}
});
// Set the height after calculating the max height
setTimeout(() => {
swatchWrappers.forEach(wrapper => {
wrapper.style.height = `${self.swatchHeight}px`;
});
}, 5);
});
},
getSizeGuideHtml(sizeGuideUrl, productId) {
let self = this,
url = `/productrecommendations/ajax/loadBlockSizeGuide`;
fetch(url + `?isAjax=true&block_id=${sizeGuideUrl}`)
.then(response => response.json())
.then(data => {
if (data.success) {
const sizeGuideBlockContent = document.getElementById(`size-guide-${productId}`);
if (sizeGuideBlockContent) {
sizeGuideBlockContent.innerHTML = data.html;
const swatchAttribute = document.querySelector('.service_size#swatch-attribute-' + productId);
if (swatchAttribute) {
const sizeGuideButtonWrapper = swatchAttribute.querySelector('.size-guide-button-wrapper');
if (sizeGuideButtonWrapper) {
const sizeGuideButton = document.createElement('span');
sizeGuideButton.className = `size-guide-button size-guide-button-${productId}`;
sizeGuideButton.dataset.popup = `#size-guide-${productId}`;
sizeGuideButton.textContent = self.sizeGuideButtonText;
sizeGuideButtonWrapper.appendChild(sizeGuideButton);
}
}
}
}
})
.catch(error => console.error('Error loading size guide:', error));
},
objectToArray(product) {
let attributesObj = JSON.parse(product.attributes.swatch_options).attributes;
this.selectAttributesArray = Object.values(attributesObj).sort((a, b) => {
return Number(a.position) - Number(b.position);
});
return this.selectAttributesArray;
},
updateSelectOptions(select) {
let wrapper = select.closest('.swatch-opt-wrapper'),
selects = wrapper.querySelectorAll('select'),
lastSelect = selects[selects.length - 1];
if (lastSelect !== select) {
let availableProducts = JSON.parse(select.selectedOptions[0].getAttribute('data-products')),
productsOption;
Array.from(lastSelect.options).forEach((option, index) => {
productsOption = JSON.parse(option.getAttribute('data-products'));
if (productsOption) {
option.disabled = !productsOption.some(product => availableProducts.includes(product));
}
});
lastSelect.selectedIndex = -1;
lastSelect.disabled = false;
this.selects[lastSelect.dataset.elementCode].update();
lastSelect.nextElementSibling.querySelector('.current').textContent = '';
}
}
}
}
</script></div></div></div></div>
<div><style>#html-body [data-pb-style=L2AMDE2],#html-body [data-pb-style=TPBT8KM]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=TPBT8KM]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=L2AMDE2]{align-self:stretch}#html-body [data-pb-style=Y9EKHU9]{display:flex;width:100%}#html-body [data-pb-style=TMHIU0S]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:25%;align-self:stretch}#html-body [data-pb-style=R14CM88]{border-style:none}#html-body [data-pb-style=H1MSUEB],#html-body [data-pb-style=UBM11YO]{max-width:100%;height:auto}#html-body [data-pb-style=TNL9UE1]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:16.6667%;align-self:stretch}#html-body [data-pb-style=WUSN6RV]{width:100%;border-width:1px;border-color:#cecece;display:inline-block}#html-body [data-pb-style=KPN7DJY]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:16.6667%;align-self:stretch}#html-body [data-pb-style=CCLR710]{border-style:none}#html-body [data-pb-style=LW50KD7],#html-body [data-pb-style=M0DAQOG]{max-width:100%;height:auto}#html-body [data-pb-style=VO5BOSC]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:16.6667%;align-self:stretch}#html-body [data-pb-style=L4K8NSR]{width:100%;border-width:1px;border-color:#cecece;display:inline-block}#html-body [data-pb-style=LQXC42K]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:25%;align-self:stretch}#html-body [data-pb-style=D7QOCVO]{border-style:none}#html-body [data-pb-style=LW2FFDT],#html-body [data-pb-style=VJW0OAA]{max-width:100%;height:auto}@media only screen and (max-width: 768px) { #html-body [data-pb-style=CCLR710],#html-body [data-pb-style=D7QOCVO],#html-body [data-pb-style=R14CM88]{border-style:none} }</style><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
body#html-body .services{
padding: 50px 0
}
body#html-body .services .pagebuilder-column-line{
justify-content: space-evenly;
flex-wrap: wrap;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.hr{
padding: 0px;
height: 50px;
width: 2px;
background-color: #c3c8c8;
min-width: auto;
align-self: center;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.hr hr{
display: none;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service{
flex-flow: row;
background: #ffffff;
padding: 0px;
width: 400px;
justify-content: center;
align-items: center;
padding: 5px;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service img{ display: block; margin-right: 20px;}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service h3{ margin: 0px; padding: 0px;}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service h3 a{
font-size: 18px;
color: #000;
position: relative;
padding-right: 35px;
text-decoration:none;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service p{
font-size: 18px;
color: #000;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service a::after{
width: 24px;
height: 24px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg fill='none' fill-rule='evenodd' stroke='rgba(204,0,0,0.99)' stroke-width='2'%3E%3Cpath d='M4 12h14M15 17l5-5-5-5'/%3E%3C/g%3E%3C/svg%3E%0A");
content: '';
display: inline-block;
position: absolute;
top: 50%;
transform: translateY(-50%);
right: 0;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service h3 a:hover{ color:#c00; }
@media screen and (max-width: 1680px) {
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service img{ }
}
@media screen and (max-width: 1337px) {
body#html-body .services .pagebuilder-column-group .pagebuilder-column.hr{display:none;}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service{
margin-bottom: 2vw;
}
}
@media screen and (max-width: 768px) {
body#html-body .services .pagebuilder-column-line{
flex-flow: column;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service{
width: 90%;
margin: 0 auto;
margin-bottom: 4vw;
}
body#html-body .services .pagebuilder-column-group .pagebuilder-column.service img{width: 14vw;}
}
</style></div><div data-content-type="row" data-appearance="contained" data-element="main"><div class="services" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="inner" data-pb-style="TPBT8KM"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="L2AMDE2"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="Y9EKHU9"><div class="pagebuilder-column service" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="TMHIU0S"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="R14CM88"><picture class="mfwebp"> <source title="" data-element="desktop_image" data-pb-style="UBM11YO" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/3-blocs-services/livraison-rapide.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/home/3-blocs-services/livraison-rapide.png" alt="" title="" data-element="desktop_image" data-pb-style="UBM11YO"></picture><picture class="mfwebp"> <source title="" data-element="mobile_image" data-pb-style="H1MSUEB" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/3-blocs-services/livraison-rapide.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/home/3-blocs-services/livraison-rapide.png" alt="" title="" data-element="mobile_image" data-pb-style="H1MSUEB"></picture></figure><div data-content-type="text" data-appearance="default" data-element="main"><div>
<h3><a href="/livraison">Livraison rapide</a></h3>
<p>Commandez avant 15h,<br>
recevez votre colis à domicile demain.</p>
</div></div></div><div class="pagebuilder-column hr" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="TNL9UE1"><div data-content-type="divider" data-appearance="default" data-element="main"><hr data-element="line" data-pb-style="WUSN6RV"></div></div><div class="pagebuilder-column service" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="KPN7DJY"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="CCLR710"><picture class="mfwebp"> <source title="" data-element="desktop_image" data-pb-style="LW50KD7" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/3-blocs-services/grands-comptes.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/home/3-blocs-services/grands-comptes.png" alt="" title="" data-element="desktop_image" data-pb-style="LW50KD7"></picture><picture class="mfwebp"> <source title="" data-element="mobile_image" data-pb-style="M0DAQOG" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/3-blocs-services/grands-comptes.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/home/3-blocs-services/grands-comptes.png" alt="" title="" data-element="mobile_image" data-pb-style="M0DAQOG"></picture></figure><div data-content-type="text" data-appearance="default" data-element="main"><div>
<h3><a href="/grands-comptes">Grands Comptes</a></h3>
<p>Contactez notre équipe commerciale<br>
qui répondra à vos besoins</p>
</div></div></div><div class="pagebuilder-column hr" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="VO5BOSC"><div data-content-type="divider" data-appearance="default" data-element="main"><hr data-element="line" data-pb-style="L4K8NSR"></div></div><div class="pagebuilder-column service" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="LQXC42K"><figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="D7QOCVO"><picture class="mfwebp"> <source title="" data-element="desktop_image" data-pb-style="LW2FFDT" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/3-blocs-services/personnalisez-vos-vetements.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/home/3-blocs-services/personnalisez-vos-vetements.png" alt="" title="" data-element="desktop_image" data-pb-style="LW2FFDT"></picture><picture class="mfwebp"> <source title="" data-element="mobile_image" data-pb-style="VJW0OAA" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/home/3-blocs-services/personnalisez-vos-vetements.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/home/3-blocs-services/personnalisez-vos-vetements.png" alt="" title="" data-element="mobile_image" data-pb-style="VJW0OAA"></picture></figure><div data-content-type="text" data-appearance="default" data-element="main"><div>
<h3><a href="/personnalisation">Modyf PLUS</a></h3>
<p>Demandez un devis et personnalisez <br>nos vêtements à votre image</p>
</div></div></div></div></div></div></div></div>
<div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="double-blocs">
<!--a href="https://www.modyf.fr/demande-de-catalogue" class="bloc">
<picture class="mfwebp"> <source type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/cms-pages/catalogue-wurth-modyf-2024-25.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/cms-pages/catalogue-wurth-modyf-2024-25.jpg" alt="Catalogue Würth MODYF 2024-25" /></picture>
<span class="cta">Demandez le catalogue</span>
</a-->
<!--a href="https://www.modyf.fr/vetements-pluie-hiver" class="bloc">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/vetements-pluie-hiver.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/home/2-blocs/vetements-pluie-hiver.jpg" alt="Nos vêtements pluie hiver" loading="lazy"/></picture>
<span class="cta">Je découvre</span>
</a-->
<a href="https://www.modyf.fr/tenue-ete" class="bloc">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/tenues-ete-2.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/home/2-blocs/tenues-ete-2.jpg" alt="Nos vêtements printemps été" loading="lazy"></picture>
<span class="cta">Je découvre</span>
</a>
<a href="/shoefinder" class="bloc">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/2-blocs/SHOEFINDER-HOME-23-24.webp"> <img data-webpconverted="1" src="https://www.modyf.fr/media/FR/home/2-blocs/SHOEFINDER-HOME-23-24.jpg" alt="Trouvez vos chaussures de sécurité adaptés à votre travail" loading="lazy"></picture>
<span class="cta">Laissez-vous guider</span>
</a>
</div>
<style>
.double-blocs{
padding: 100px 0;
display: flex;
justify-content: space-evenly;
background: linear-gradient(0deg, #efefef 50%, #ff000000 50%);
}
.double-blocs a.bloc{
position: relative;
}
.double-blocs .bloc img{
display: block;
}
.double-blocs .bloc span.cta{
position: absolute;
z-index: 2;
bottom: 25px;
left: 50%;
background: #c00;
padding: 18px 17px;
font-size: 18px;
color: #fff;
font-family: 'wuerthbold';
font-weight: 'normal';
transform: translateX(-50%);
min-width: 254px;
text-align: center;
transition: 0.3s;
}
.double-blocs a.bloc:hover span.cta{
background-color: #E51717;
box-shadow: 0px 7px 14px rgb(0 0 0 / 24%);
}
@media only screen and (max-width: 768px){
.double-blocs{
flex-flow: column;
padding: 0 34px;
background: linear-gradient(0deg, #efefef 75%, #ff000000 75%);
}
.double-blocs a.bloc:first-child{
margin-bottom: 34px;
}
}
</style></div></div>
<div></div>
<div><style>#html-body [data-pb-style=CPDWPWG]{justify-content:flex-start;display:flex;flex-direction:column;background-color:#efefef;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;padding-top:70px}#html-body [data-pb-style=WD8W3CP]{text-align:center;margin-top:0;margin-bottom:40px}</style><div class="blog blog-posts" data-content-type="row" data-appearance="full-width" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="CPDWPWG"><div class="row-full-width-inner" data-element="inner"><h2 data-content-type="heading" data-appearance="default" data-element="main" data-pb-style="WD8W3CP">Nos guides et conseils</h2><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.blog h2{margin: 0px auto; width: 100%;}
.blog .pagebuilder-column figure{
height: 280px;
}
ul.pagebuilder-column-group{
list-style: none;
padding-left: 0;
display: flex;
align-items: flex-start;
}
ul.pagebuilder-column-group li.pagebuilder-column{
display: block;
overflow: hidden;
}
.blog-posts .pagebuilder-column a.custom{
position: relative;
top: auto;
left: auto;
height: auto;
}
.blog-posts .pagebuilder-column a.custom span{
display: block;
font-family: "wuerthbold";
color: #000;
font-size: 24px;
line-height: 30px;
margin: 25px;
}
.blog-posts .pagebuilder-column a.custom:hover span{
color: #c00;
}
@media only screen and (max-width: 767px){
.blog .pagebuilder-column-group .slick-list .slick-track{
align-items: start;
}
}
</style> </div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><ul class="pagebuilder-column-group">
<li class="pagebuilder-column">
<a href="https://blog.modyf.fr/qui-paye-les-chaussures-securite/" class="custom">
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/4-blocs/qui-paye-les-chaussures-securite.webp"> <img data-webpconverted="1" src="/media/FR/home/4-blocs/qui-paye-les-chaussures-securite.jpg" loading="lazy" alt="Qui doit payer les chaussures de sécurité ?"></picture>
</figure>
<span>Qui doit payer les chaussures de sécurité ?</span>
</a>
</li>
<li class="pagebuilder-column">
<a href="https://blog.modyf.fr/vetement-stretch/" class="custom">
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/4-blocs/qu-est-ce-qu-un-vetement-stretch.webp"> <img data-webpconverted="1" src="/media/FR/home/4-blocs/qu-est-ce-qu-un-vetement-stretch.jpg" loading="lazy" alt="Qu'est-ce qu'un vêtement Stretch ?"></picture>
</figure>
<span>Qu'est-ce qu'un vêtement Stretch ?</span>
</a>
</li>
<li class="pagebuilder-column">
<a href="/normes/en-20345" class="custom">
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/4-blocs/normes-chaussures_1.webp"> <img data-webpconverted="1" src="/media/FR/home/4-blocs/normes-chaussures_1.jpg" loading="lazy" alt="Guide des normes de chaussures de sécurité"></picture>
</figure>
<span>Guide des normes de chaussures de sécurité</span>
</a>
</li>
<li class="pagebuilder-column">
<a href="https://blog.modyf.fr/chaussures-de-securite-conseils-astuces/" class="custom">
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/home/4-blocs/conseils-et-astuces-chaussures-de-securite_1.webp"> <img data-webpconverted="1" src="/media/FR/home/4-blocs/conseils-et-astuces-chaussures-de-securite_1.jpg" loading="lazy" alt="Conseil et astuces chaussures de sécurité"></picture>
</figure>
<span>Tout sur les chaussures de sécurité</span>
</a>
</li>
</ul></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><!--script type="text/x-magento-init">
{
".home-category.blog": {
"Modyf_Cms/js/home-category": {}
}
}
</script-->
</div></div></div></div>
<div><style>#html-body [data-pb-style=KDDMFT6],#html-body [data-pb-style=KH1X0W6]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=KDDMFT6]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=KH1X0W6]{align-self:stretch}#html-body [data-pb-style=B795TAN]{display:flex;width:100%}#html-body [data-pb-style=IEY84FB]{justify-content:flex-start;display:flex;flex-direction:column;width:50%;align-self:center}#html-body [data-pb-style=IEY84FB],#html-body [data-pb-style=LN650OV],#html-body [data-pb-style=XRTGT1K]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=XRTGT1K]{justify-content:flex-start;display:flex;flex-direction:column;width:50%;margin-top:0;align-self:center}#html-body [data-pb-style=LN650OV]{align-self:stretch}#html-body [data-pb-style=HPJR8GQ]{display:flex;width:100%}#html-body [data-pb-style=JS8UDG2]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:100%;align-self:stretch}</style><div class="home-seo-text" data-content-type="row" data-appearance="full-width" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="KDDMFT6"><div class="row-full-width-inner" data-element="inner"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="KH1X0W6"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="B795TAN"><div class="pagebuilder-column home-seo-left" data-content-type="column" data-appearance="align-center" data-background-images="{}" data-element="main" data-pb-style="IEY84FB"><h1 data-content-type="heading" data-appearance="default" data-element="main">Vêtements de travail et chaussures de sécurité</h1></div><div class="pagebuilder-column home-seo-right" data-content-type="column" data-appearance="align-center" data-background-images="{}" data-element="main" data-pb-style="XRTGT1K"><div data-content-type="text" data-appearance="default" data-element="main"><p>Les <a tabindex="0" href="https://www.modyf.fr/vetements-professionnels/pantalons-de-travail">pantalons de travail</a> et <a tabindex="0" href="https://www.modyf.fr/chaussures-de-securite">chaussures de sécurité</a> Würth MODYF sont conçus pour les professionnels de l’artisanat et de l’industrie. Ouvrier du bâtiment, mécanicien, ou paysagiste, tous les Pros peuvent travailler avec Style avec <a tabindex="0" href="https://www.modyf.fr/vetements-professionnels">les vêtements de travail</a> Würth MODYF. <a class="morelink" tabindex="0" href="#">Afficher plus</a></p></div></div></div></div><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="LN650OV"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="HPJR8GQ"><div class="pagebuilder-column more-content" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="JS8UDG2"><div data-content-type="text" data-appearance="default" data-element="main"><p>Modyf est une filiale du groupe <strong>Würth</strong>, numéro 1 mondial en outillage, quincaillerie, matériel de montage et de fixation, équipements de protection pour le professionnel dans le secteur de l’industrie, de l’artisanat ou des services.</p>
<p>La société est présente aussi dans les composants électroniques et les circuits imprimés grâce à sa filiale Elektronik ou encore dans les instruments de mesure. Ce rapprochement avec un groupe leader sur son marché assure aux clients de MODYF le <strong>meilleur du vêtement de travail professionnel</strong> et des <strong>chaussures de sécurité</strong>, une exigence de qualité toujours plus forte et un niveau de performance très élevé. Retrouvez sur notre boutique en ligne toute la gamme dédiée à la protection du salarié ou du travailleur indépendant. Toutes les références disponibles dans les points de vente de la marque sont disponibles sur un seul et même site, <strong>Modyf.fr</strong>. La puissance d’une entreprise telle que Würth, groupe international vous permet de bénéficier des meilleurs articles et d’un service commercial disponible et à votre écoute.</p>
<p>Achetez vos chaussures et vêtements professionnels en ligne et profitez aux meilleurs prix de prestations équivalentes à celles offertes par un magasin : livraison offerte dès 50 euros d’achats et retour gratuit, garantie 30 jours, paiement sécurisé…</p>
<p>Vous avez une question ? Vous recherchez des informations complémentaires ? Contactez nos conseillères et conseillers par téléphone au 03 88 98 83 80, chattez en ligne ou envoyez-nous un message.</p>
<p>Vous avez besoin d’un vêtement professionnel, d’une paire de chaussures de sécurité ? Würth MODYF est disponible sur votre ordinateur ou sur votre mobile 24h/24 et 7j/7. Professionnel, vous avez également la possibilité de commander dans un des nombreux <a href="https://www.modyf.fr/magasins-wurth/">magasins wurth</a> présents partout en France.</p></div></div></div></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.show{ display: block!important; }
.home-seo-text .home-seo-right a{ color: inherit; }
.home-seo-right a.morelink{ color: black; }
.more-content a{ color: inherit; }
</style>
<script>
document.querySelector(".more-content").style.display="none";
var link = document.querySelector(".morelink");
link.addEventListener("click", function(event) {
console.log("ok");
event.preventDefault();
document.querySelector(".more-content").classList.toggle('show');
if(document.querySelector(".more-content.show")){
document.querySelector(".morelink").innerHTML="Afficher moins";
}
else document.querySelector(".morelink").innerHTML="Afficher plus";
})
</script></div></div></div></div></div></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><script type="application/ld+json">
{
"@type": "Organization",
"name": "WÜRTH MODYF France",
"url": "https://www.modyf.fr",
"Logo": "https://www.modyf.fr/static/version1744177601/frontend/Modyf/default/fr_FR/images/wurth-modyf.svg",
"foundingDate": "2001-12-17",
"parentOrganization": {
"@type": "Organization",
"name": "Adolf Würth GmbH & Co. KG",
"alternateName": ["Würth", "Wuerth"],
"url": "https://www.wuerth.com/",
"Logo": "https://www.wuerth.com/system/layout_wl2bootstrap/bootstrap_system_images/svg_logos/wuerth_group_logo_svg.svg",
"sameAs": "https://en.wikipedia.org/wiki/W%C3%BCrth",
"address": {
"@type": "PostalAddress",
"addressLocality": "KÜNZELSAU-GAISBACH, Germany",
"postalCode": "74653",
"streetAddress": "Reinhold-Würth-Straße 12–17"
}
},
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+33 3 88 98 83 80",
"contactType": "Customer Service",
"availableLanguage": ["French"]
},
"address": {
"@type": "PostalAddress",
"streetAddress": "4 rue de l'Expansion",
"addressLocality": "Erstein",
"postalCode": "67150",
"addressCountry": "FR"
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "FR",
"merchantReturnLink": "https://www.modyf.fr/retour",
"merchantReturnDays": 30,
"refundType": "FullRefund",
"returnFees": "FreeReturn",
"inStoreReturnsOffered": false
},
"sameAs": [
"https://www.facebook.com/wurthmodyf/",
"https://www.instagram.com/wurthmodyf_france/",
"https://www.linkedin.com/company/wurthmodyf-france/",
"https://www.youtube.com/user/WURTHMODYF"
]
}
</script></div> <div x-data="recommendedProducts_below_main_content()"
x-init="initProductRecBlock()"
id="recs_block_below_main_content"
class="block block-static-block product-recommendations-wrapper" x-cloak>
<template x-if="productBanners">
<div class="block-content desktop:px-[63px]" x-effect="productBanners.length && $nextTick(() => afterRender())">
<template x-for="banner in productBanners">
<div class="products wrapper products-grid product-slider product-recommendations-list"
x-intersect.once="scrollViewEvent(banner.unitId)"
>
<div class="block-title px-[22px] leading-[30px] mb-[28px] tablet:px-[45px]"
>
<h3 x-text='banner.storefrontLabel'
class="text-center block text-[32px] leading-[32px] text-modyf-black font-wuerth-bold"
></h3>
</div>
<div class="splide px-[8px] tablet:px-[45px]"
:class="'slider-' + banner.unitId"
>
<div class="relative splide__track mobile_tablet:pb-[60px] desktop:pb-[54px]">
<div class="products list items product-items relative splide__list">
<template x-for="product in banner.products">
<div class="item product product-item splide__slide pb-[20px]">
<div class="product-item-info p-[10px] relative text-center box-border desktop:px-[35px] desktop:py-[30px] desktop:hover:shadow-modyf_product_item_shadow desktop:hover:bg-modyf-white"
>
<form method="post"
x-bind:action="createAddToCartUrl(product.productId)"
@submit.prevent="validateAndSubmit($event.target, banner.unitId, product.productId)"
class="item product product-item product_addtocart_form flex flex-col w-full"
>
<input name="form_key" type="hidden" :value="hyva.getFormKey()"/>
<input type="hidden" name="product" x-bind:value="product.productId">
<input type="hidden" name="qty" value="1">
<input type="hidden" name="sku" x-bind:value="product.sku">
<a @click="recsClickEvent(banner.unitId, product.productId, product.url)"
class="product photo product-item-photo flex justify-center cursor-pointer w-full h-[168px] align-center desktop:h-auto desktop:w-[240px] desktop:m-auto desktop:inline-block desktop:max-w-full desktop:pb-[125%] desktop:overflow-hidden desktop:relative desktop:z-[1]"
tabindex="-1">
<img class="object-contain desktop:block desktop:absolute desktop:w-auto desktop:m-auto desktop:top-0 desktop:bottom-0 desktop:right-0 desktop:left-0"
loading="lazy"
x-bind:alt="product.smallImage?.label"
x-bind:title="product.smallImage?.label"
x-bind:src="product.smallImage?.url">
</a>
<div class="product-item-labels absolute top-[10px] left-[10px] desktop:top-[25px] desktop:left-[25px]"
>
<template x-if="product.attributes.publication_date && checkIfIsNew(product.attributes.publication_date[0])">
<div>
<span class="new-label px-[10px] py-[3px] text-[11px] font-wuerth-bold text-modyf-white uppercase bg-modyf-red mb-[10px] float-left leading-normal desktop:px-[20px] desktop:py-[8px]"
>
Nouveau </span>
</div>
</template>
<template x-if="product.attributes.discount_percent">
<div>
<span class="px-[10px] py-[3px] text-[11px] font-wuerth-bold text-modyf-white uppercase bg-modyf-red mb-[10px] float-left leading-normal desktop:px-[20px] desktop:py-[8px]"
x-text="product.attributes.discount_percent + '%'"
></span>
</div>
</template>
</div>
<div class="product details product-item-details product-info flex flex-col flex-grow">
<div class="product-item-collection mb-[10px] min-h-[27px] desktop:min-h-[32px]"
>
<template x-if="product.attributes.modyf_collection && product.attributes.modyf_collection.length">
<template x-for="collection in product.attributes.modyf_collection">
<span class="text-[11px] uppercase font-wuerth-bold text-modyf-darkest_grey bg-modyf-light_grey inline-block px-[10px] py-[5px] desktop:px-[16px] desktop:py-[8px]"
x-text="collection"
></span>
</template>
</template>
</div>
<div class="my-[5px] break-words text-[14px] leading-[15px] overflow-hidden h-[40px] font-wuerth-bold tablet_desktop:h-[47px]"
>
<a class="product-item-link block leading-[15px] cursor-pointer my-[5px] overflow-hidden h-[47px] tablet:h-[32px] desktop:hover:underline desktop:text-[18px] desktop:leading-[21px] desktop:h-[45px]"
@click="recsClickEvent(banner.unitId, product.productId, product.url)"
x-text="product.name"></a>
</div>
<div class="reviews-container min-h-[15px] mb-[5px]">
<template x-if="product.attributes && product.attributes.reviews_summary && product.attributes.reviews_summary.length">
<div class="reviews-summary-wrapper" x-html="getRecommendationsRating(product.attributes.reviews_summary)"></div>
</template>
</div>
<div class="price-container min-h-[54px] desktop:min-h-[72px]">
<template x-if="product.prices">
<div class="pt-1 text-gray-900 price-box price-final_price"
x-bind:data-product-id="product.productId"
>
<span class="normal-price inline-block">
<span class="price-container price-final_price">
<span x-show="product.prices.minimum.final !== product.prices.maximum.final"
class="price-label">À partir de</span>
<span id="product-price" class="price-wrapper">
<span class="price text-[18px] leading-[24px] font-bold desktop:!text-[26px] desktop:!leading-[35px] desktop:!font-normal"
x-text="hyva.formatPrice(product.prices.minimum.final)"
:class="{ 'text-modyf-red': product.prices.minimum.regular > product.prices.minimum.final }"
>
</span>
</span>
</span>
</span>
<template x-if="product.prices.minimum.regular > product.prices.minimum.final">
<span class="regular-price inline-block">
<span class="price-final_price">
<span id="product-price" class="price-wrapper">
<span class="price text-modyf-darkest_grey3 line-through !text-[13px] !leading-[24px] !font-normal"
x-text="hyva.formatPrice(product.prices.minimum.regular)"
></span>
</span>
</span>
</span>
</template>
<p class="price-vat-label !text-[13px] !leading-[18px] text-modyf-darkest_grey3 mt-[-5px] desktop:mt-[5px]"
>
TTC </p>
</div>
</template>
</div>
<template x-if="product.attributes.model_group && product.attributes.model_group.length && !isCartPage">
<div class="relative">
<template x-if="product.attributes.model_group.length > maxColorsDesktop">
<div class="product-item-colors-label desktop">
<span x-text="product.attributes.model_group.length"></span>
<span class="text-[13px] leading-[18px] text-modyf-darkest_grey3">
Colors </span>
</div>
</template>
<div :class="getMaxColorClasses(product.attributes.model_group, maxColorsDesktop, maxColorsMobile)">
<template x-for="colorItem in product.attributes.model_group.map(colorStr => JSON.parse(colorStr))">
<a class="w-[10px] h-[10px] mr-[4px] inline-block box-border desktop:w-[15px] desktop:h-[15px] desktop:mr-[6px]"
:href="colorItem.url"
:class="{ ['color ' + colorItem.color_id]: true, 'border-2 border-modyf-grey': !colorItem.swatch_color }"
:title="colorItem.color_value"
:style="'background-color: ' + colorItem.swatch_color">
</a>
</template>
</div>
<template x-if="product.attributes.model_group.length > maxColorsMobile">
<span class="more-colors mobile-tablet text-[13px] leading-[18px] text-modyf-darkest_grey3 align-text-bottom">
+ more </span>
</template>
</div>
</template>
<template x-if="product.addToCartAllowed && isCartPage">
<div>
<div class="swatch-conf-container my-[10px]">
<template x-if="product.attributes.swatch_options && product.attributes.swatch_options.length">
<div>
<div class="swatch-conf-wrapper"
x-init="$nextTick(() => { $el.querySelectorAll('select').forEach(select => { const instance = NiceSelect.bind(select); selects[select.dataset.elementCode] = instance; }); })">
<div class="swatch-opt-wrapper" data-rendered="true">
<template x-for="(attr, index) in objectToArray(product)">
<div class="relative"
:class="{ 'hidden-attribute': isAttributeToHide(attr, product) }"
:style="{ zIndex: product.attributes.swatch_options.length - index }">
<template x-if="!isAttributeToHide(attr, product)">
<div class="swatch-attribute"
:data-attribute-id="attr.id"
:data-attribute-code="attr.code"
:id="'swatch-attribute-' + product.productId"
:class="attr.code">
<div class="clearfix">
<div class="field required custom-select-attribute relative">
<label class="absolute m-0 top-[10px] left-[10px] normal-case z-[2] font-wuerth-book font-normal text-[14px] leading-[28px] after:!hidden"
>
<span x-text="attr.label"></span>
<span class="size-guide-button-wrapper text-modyf-darkest_grey2 ml-[5px] underline cursor-pointer"
@click.prevent="openPopups[product.productId] = true"
></span>
</label>
<div class="control">
<select
:name="'super_attribute[' + attr.id + ']'"
:data-element-target="attr.id + '_' + product.productId"
:data-element-code="attr.code + '_' + product.productId"
:class="attr.code"
x-model="selectedAttributes[attr.id + '_' + product.productId]"
@change="validateField(attr.id + '_' + product.productId); updateSelectOptions($event.target)"
:disabled="selectAttributesArray.length === 2 && selectAttributesArray[selectAttributesArray.length - 1].code === attr.code && product.attributes.size_mode != sizeModeDefault"
x-init="$nextTick(() => { updateHiddenSelectOptions($el) })"
>
<option value=""></option>
<template x-for="option in attr.options">
<option
x-show="option.products.length"
:value="option.id"
:data-options-id="option.id"
:data-products="JSON.stringify(option.products)"
x-text="option.label">
</option>
</template>
</select>
</div>
<div class="flex justify-between items-center">
<div x-show="errors[attr.id + '_' + product.productId]"
class="leading-[28px] text-[13px] text-modyf-red absolute right-0 left-0 bottom-[-5px]"
>
Ce champ est obligatoire. </div>
</div>
</div>
</div>
</div>
</template>
<template x-if="isAttributeToHide(attr, product)">
<div>
<input type="hidden"
:value="attr.options[0]?.id"
:name="'super_attribute[' + attr.id + ']'"
:data-products="JSON.stringify(attr.options[0].products)" />
</div>
</template>
</div>
</template>
</div>
</div>
</div>
</template>
</div>
<div
class="mt-auto pt-3 flex flex-wrap justify-center items-center w-full">
<button class="w-full btn text-[13px] justify-center h-[50px] action tocart"
aria-label="Add to Cart">
<span>Ajouter au panier </span>
</button>
</div>
</div>
</template>
<template x-if="!product.addToCartAllowed && isCartPage">
<div class="stock unavailable">
<span>Épuisé </span>
</div>
</template>
<div class="product-item-inner absolute right-[10px] top-[10px] desktop:right-[25px] desktop:top-[25px] desktop:hidden"
x-show="product.productId && product.addToCartAllowed"
>
<div class="product-item-actions">
<div class="actions-primary"></div>
<div class="actions-secondary" data-role="add-to-links">
<template x-if="isCompareEnable(product) === '1'">
<div class="action tocompare svg-icon-mixin svg-icon__compare__mixin mb-[5px]"
data-action="add-to-wishlist"
@click.prevent="addToWishlistCompare(product.productId, 'catalog/product_compare/add')">
<span class="sr-only">Ajouter au comparateur</span>
</div>
</template>
<template x-if="isWishlistEnable(product) === '1'">
<span class="action towishlist before:text-[16px] before:text-modyf-grey before:content-['\e600'] before:font-luma-icons desktop:before:text-[20px]"
data-action="add-to-wishlist"
@click.prevent="addToWishlistCompare(product.productId, 'wishlist/index/add')">
<span class="sr-only">Ajouter à la liste d'achats</span>
</span>
</template>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</template>
</div>
</div>
</div>
<template x-for="product in banner.products">
<template x-if="product.attributes.size_guide_url">
<div>
<div role="dialog"
aria-modal="true"
@click.outside="openPopups[product.productId] = false"
class="mobile:inset-y-0 mobile:left-[44px] right-0 !fixed z-[999] tablet_desktop:left-0 tablet_desktop:right-0 tablet_desktop:m-auto tablet_desktop:max-h-[90%] tablet_desktop:w-3/4 tablet_desktop:absolute tablet_desktop:max-w-[1680px] tablet_desktop:modyf-absolute-centering-verticall-mixin"
x-cloak
x-show="openPopups[product.productId]"
:class="openPopups[product.productId] == true ? 'opacity-100 visible mobile:[transition:opacity_.3s_ease] !flex' : 'opacity-0 invisible [transition:visibility_0s_.3s,opacity_.3s_ease] !flex'">
<div class="relative w-screen pt-[42px] bg-container-lighter overflow-auto [transition:transform_.3s_ease-in-out] shadow-modyf_stock_alert_popup_shadow tablet_desktop:[transition:transform_.2s_ease] tablet_desktop:w-full"
x-cloak=""
:class="openPopups[product.productId] == true ? 'mobile:translate-x-[0] tablet_desktop:translate-y-[0]' : 'mobile:translate-x-[100%] tablet_desktop:translate-y-[-200%]'">
<div
x-show="openPopups[product.productId]"
x-cloak=""
class="absolute top-[10px] right-[10px] tablet_desktop:top-[30px] tablet_desktop:right-[30px]">
<button
type="button"
@click="openPopups[product.productId] = false;"
aria-label="Fermer le panneau"
>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24" class="w-[24px] h-[24px]" role="img"><g fill="none" fill-rule="evenodd" stroke="rgba(0,0,0,0.99)" stroke-width="2"><path d="M6 18L18 6M18 18L6 6"/></g><title>cross-black-icon</title></svg>
</button>
</div>
<div class="content p-[20px] text-left desktop:px-[50px] desktop:pb-[50px] desktop:pt-0 tablet_desktop:overflow-y-auto">
<div class="cms-block-container"
:id="'size-guide-' + product.productId"
x-html="getSizeGuideHtml(product.attributes.size_guide_url[0], product.productId)"
></div>
</div>
</div>
</div>
<div class="backdrop z-[998]"
aria-hidden="true"
x-cloak
x-show="openPopups[product.productId]"
@click="openPopups[product.productId] = false"
></div>
</div>
</template>
</template>
</div>
</template>
</div>
</template>
</div>
<script>
function recommendedProducts_below_main_content() {
return {
productBanners: [],
pagePreconfiguredDeferred: {},
bannerPlacement: 'below-main-content',
maxColorsDesktop: 10,
maxColorsMobile: 5,
isCartPage: document.body.classList.contains('checkout-cart-index'),
selectedAttributes: {},
errors: {},
addToCartButtonTextWhileAdding: 'En\u0020cours\u0020d\u0027ajout...',
swatchHeight: 0,
sizeGuideButtonText: 'Tableaux\u0020des\u0020tailles\u0020',
openPopups: {},
gtmProductImpressionsAjaxUrl: 'https://www.modyf.fr/google-tag-manager/ajax/collectData/',
gtmProductRecommendations: [],
selectAttributesArray: [],
selects: {},
serviceSizeCode: 'service_size',
sizeModeDefault: 'size',
initProductRecBlock: function (placement) {
let self = this;
window.addEventListener('recsResponseReceivedEvent', (function () {
let recsData = window.magentoStorefrontEvents.context.getRecommendations();
self.renderProductRecs(recsData);
}));
},
renderProductRecs: function (recsData) {
let self = this;
recsData.units.sort((a, b) => a.displayOrder - b.displayOrder);
recsData.units.forEach(function (unit, index) {
if (unit.pagePlacement === self.bannerPlacement) {
self.productBanners.push(unit);
/** @todo move event outside of recsResponseReceived event **/
window.magentoStorefrontEvents.publish.recsUnitRender(
unit.unitId, magentoStorefrontEvents.context
);
self.gtmProductImpressions(unit.products)
}
});
},
gtmProductImpressions: function (products) {
if (!Array.isArray(products) || products.length === 0) {
return;
}
let self = this,
postData = new URLSearchParams();
products.forEach((product, index) => {
postData.append(`ids[${index}]`, product.productId);
});
postData.append('type', 'impression');
postData.append('list', '');
postData.append('isAjax', 'true');
fetch(this.gtmProductImpressionsAjaxUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
body: postData
})
.then(response => response.json())
.then(data => {
if (Array.isArray(data) && data.length) {
const event = new CustomEvent('googleAnalyticsUniversalEvent', {
detail: data
});
document.dispatchEvent(event);
data.forEach(product => {
self.gtmProductRecommendations.push(product);
});
}
})
.catch(error => console.error('Error:', error));
},
addToCartRecsEvent: function (e, unitId, productId) {
// requires recommendationsContext to be set
magentoStorefrontEvents.publish.recsItemAddToCartClick(
unitId, productId, magentoStorefrontEvents.context
);
},
scrollViewEvent: function (unitId) {
magentoStorefrontEvents.publish.recsUnitView(
unitId, magentoStorefrontEvents.context
);
},
recsClickEvent: function (unitId, productId, productUrl) {
magentoStorefrontEvents.publish.recsItemClick(
unitId, productId, magentoStorefrontEvents.context
);
// Timeout to prevent submission before event has fired.
setTimeout(() => window.location.href = productUrl, 500);
},
createAddToCartUrl: function (productId) {
const currentLocationUENC = encodeURIComponent(
this.encodeUenc(BASE_URL),
);
return BASE_URL +
'checkout/cart/add/uenc/' +
currentLocationUENC +
'/product/' +
productId
},
encodeUenc: function (value) {
const regex = /=/gi;
return btoa(value).replace(regex, ',');
},
checkIfIsNew: function (publication) {
if (!publication) return false;
let current = new Date(),
publ = new Date(publication),
period = 60 * 24 * 60 * 60 * 1000;
current = current.getTime();
publ = publ.getTime();
return (current - period) <= publ;
},
getRecommendationsRating: function (value) {
let result = '',
percent = 20,
title = `${parseFloat(value[0]).toFixed(2)}/5`;
if (parseInt(value[0]) === parseFloat(value[0])) {
title = `${value[0]}/5`;
}
if (value && value.length) {
value = Number(value[0]) * 20;
}
for (let i = 0; i < 5; i++) {
if (value >= 20) {
result += `<span class="nr-icon nr-star gold !text-[12px]" style="width: ${percent}%"></span>`;
value -= 20;
} else {
percent = 20 - value;
result += `<span class="nr-icon nr-star gold !text-[12px]" style="width: ${percent}%"></span>`;
}
}
result = `<div class="netreviews-stars">
<span>
<div class="netreviews_bg_stars_big listStars float-none w-[60px] min-w-[60px] max-w-[60px] h-[15px] min-h-[15px] max-h-[15px] !my-0" title="${title}">
<div class="recommendation-stars-wrapper !text-[0px] flex">
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
<span class="nr-icon nr-star grey !text-[12px] !text-modyf-light_grey"></span>
</div>
<div class="recommendation-stars-wrapper !text-[0px] flex">
${result}
</div>
</div>
</span>
</div>`;
return result;
},
getMaxColorClasses: function (arr, desktopLimit, mobileLimit) {
if (!arr || !desktopLimit || !mobileLimit) return false;
let result = 'product-item-colors';
if (arr.length > desktopLimit) result += ' max-colors';
if (arr.length > mobileLimit) result += ' max-color-mobile';
return result;
},
addToWishlistCompare(productId, actionUrl) {
const formKey = hyva.getFormKey();
const postUrl = BASE_URL + actionUrl;
fetch(postUrl, {
"headers": {
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
},
"body": "form_key=" + formKey + "&product=" + productId + "&uenc=" + hyva.getUenc(),
"method": "POST",
"mode": "cors",
"credentials": "include"
}).then(function (response) {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Impossible\u0020d\u0027ajouter\u0020un\u0020article\u0020\u00E0\u0020la\u0020liste\u0020de\u0020souhaits."
}], 5000
);
}
}).then(function (response) {
if (!response) { return }
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: (response.success) ? "success" : "error",
text: (response.success)
? "Produit\u0020a\u0020\u00E9t\u00E9\u0020ajout\u00E9\u0020\u00E0\u0020votre\u0020liste\u0020d\u0027achats."
: response.error_message
}], 5000
);
const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data");
window.dispatchEvent(reloadCustomerDataEvent);
}).catch(function (error) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "error",
text: error
}], 5000
);
});
},
initSlider() {
let desktopPerPage = 4,
tabletPerPage = 3,
mobilePerPage = 2;
if (this.isCartPage) {
desktopPerPage = 3;
mobilePerPage = 1;
}
this.productBanners.forEach(async (banner) => {
let splide = new Splide( '.slider-' + banner.unitId, {
perPage: desktopPerPage,
perMove: desktopPerPage,
arrows: false,
breakpoints: {
1049: {
perPage: tabletPerPage,
perMove: tabletPerPage,
},
768: {
perPage: mobilePerPage,
perMove: mobilePerPage,
},
}
});
splide.mount();
});
},
afterRender() {
this.initSlider();
this.updateListHeight();
document.querySelectorAll('select[data-element-target]').forEach(select => {
let attrId = select.getAttribute('data-element-target');
this.selectedAttributes[attrId] = ''
});
},
validateAndSubmit(form, unitId, productId) {
let self = this,
isValid = true;
form.querySelectorAll('select[data-element-target]').forEach(select => {
let productId = select.getAttribute('data-element-target');
if (!this.selectedAttributes[productId]) {
this.errors[productId] = true;
isValid = false;
}
});
if (isValid) {
this.disableAddToCartButton(form);
// Submit if valid
this.addToCartRecsEvent(form, unitId, productId);
let formData = new URLSearchParams(new FormData(form));
fetch(form.getAttribute('action'), {
method: 'POST',
body: formData,
cache: 'no-cache',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(res => {
let product,
addToCartFormData = new FormData(form);
if (self.gtmProductRecommendations.length) {
self.gtmProductRecommendations.forEach(gtmProduct => {
if (gtmProduct.id === addToCartFormData.get('sku')) {
product = gtmProduct;
}
});
}
if (product && window.dataLayer) {
// Enhanced Ecommerce (UA)
dataLayer.push({
'event': 'addToCart',
'ecommerce': {
'currencyCode': window.dlCurrencyCode,
'add': {
'products': [{
'name': product.name,
'id': product.id,
'price': product.price,
'brand': product.brand,
'category': product.category,
'variant': product.variant,
'metric1': product.metric1,
'dimension2': product.dimension2,
'metric2': product.metric2,
'quantity': '1'
}]
}
}
});
// Ecommerce (GA4)
dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'items': [{
'item_name': product.name,
'item_id': product.id,
'price': product.price,
'item_brand': product.brand,
'item_category': product.category,
'item_variant': product.variant,
'index': product.position,
'item_price_vat': product.metric1,
'quantity': '1',
'item_width': product.metric2,
'item_size': product.dimension2
}]
}
});
}
if (res.backUrl) {
window.location.replace(res.backUrl);
} else {
window.location.reload();
}
})
.catch(error => {
console.error('Error:', error);
});
}
},
validateField(attrId) {
if (!this.selectedAttributes[attrId]) {
this.errors[attrId] = true;
} else {
delete this.errors[attrId];
}
},
isWishlistEnable(product) {
let wishlistActive = '';
if (product.attributes.config && typeof product.attributes.config[0] === 'string') {
try {
wishlistActive = JSON.parse(product.attributes.config).wishlistActive;
} catch (e) {
console.error('Invalid JSON:', e);
return false;
}
}
return wishlistActive;
},
isCompareEnable(product) {
let compareActive = '';
if (product.attributes.config && typeof product.attributes.config[0] === 'string') {
try {
compareActive = JSON.parse(product.attributes.config).compareActive;
} catch (e) {
console.error('Invalid JSON:', e);
return false;
}
}
return compareActive;
},
disableAddToCartButton(form) {
let addToCartButton = form.querySelector('.action.tocart');
if (addToCartButton) {
addToCartButton.setAttribute('disabled', 'true');
let spanElement = addToCartButton.querySelector('span');
if (spanElement) {
spanElement.textContent = this.addToCartButtonTextWhileAdding;
}
addToCartButton.setAttribute('title', this.addToCartButtonTextWhileAdding);
}
},
updateListHeight() {
let self = this,
productRecommendationsList = document.querySelectorAll('.product-recommendations-list');
productRecommendationsList.forEach(list => {
let swatchWrappers = list.querySelectorAll('.product-items .swatch-conf-container');
swatchWrappers.forEach(wrapper => {
let swatchHeight = wrapper.offsetHeight;
if (swatchHeight > self.swatchHeight) {
self.swatchHeight = swatchHeight;
}
});
// Set the height after calculating the max height
setTimeout(() => {
swatchWrappers.forEach(wrapper => {
wrapper.style.height = `${self.swatchHeight}px`;
});
}, 5);
});
},
getSizeGuideHtml(sizeGuideUrl, productId) {
let self = this,
url = `/productrecommendations/ajax/loadBlockSizeGuide`;
fetch(url + `?isAjax=true&block_id=${sizeGuideUrl}`)
.then(response => response.json())
.then(data => {
if (data.success) {
const sizeGuideBlockContent = document.getElementById(`size-guide-${productId}`);
if (sizeGuideBlockContent) {
sizeGuideBlockContent.innerHTML = data.html;
const swatchAttribute = document.querySelector('.service_size#swatch-attribute-' + productId);
if (swatchAttribute) {
const sizeGuideButtonWrapper = swatchAttribute.querySelector('.size-guide-button-wrapper');
if (sizeGuideButtonWrapper) {
const sizeGuideButton = document.createElement('span');
sizeGuideButton.className = `size-guide-button size-guide-button-${productId}`;
sizeGuideButton.dataset.popup = `#size-guide-${productId}`;
sizeGuideButton.textContent = self.sizeGuideButtonText;
sizeGuideButtonWrapper.appendChild(sizeGuideButton);
}
}
}
}
})
.catch(error => console.error('Error loading size guide:', error));
},
objectToArray(product) {
let attributesObj = JSON.parse(product.attributes.swatch_options).attributes;
this.selectAttributesArray = Object.values(attributesObj).map(attribute => {
let optionsArray = attribute.options;
if (optionsArray && !Array.isArray(optionsArray)) {
optionsArray = Object.values(optionsArray);
}
return {
...attribute,
options: optionsArray
};
}).sort((a, b) => Number(a.position) - Number(b.position));
return this.selectAttributesArray;
},
updateSelectOptions(select) {
let wrapper = select.closest('.swatch-opt-wrapper'),
selects = wrapper.querySelectorAll('select'),
lastSelect = selects[selects.length - 1];
if (lastSelect !== select) {
let availableProducts = JSON.parse(select.selectedOptions[0].getAttribute('data-products')),
productsOption;
Array.from(lastSelect.options).forEach((option, index) => {
productsOption = JSON.parse(option.getAttribute('data-products'));
if (productsOption) {
option.disabled = !productsOption.some(product => availableProducts.includes(product));
}
});
lastSelect.selectedIndex = -1;
lastSelect.disabled = false;
this.selects[lastSelect.dataset.elementCode].update();
lastSelect.nextElementSibling.querySelector('.current').textContent = '';
}
},
updateHiddenSelectOptions(select) {
let wrapper = select.closest('.swatch-opt-wrapper'),
hiddenInput = wrapper.querySelectorAll('input');
if (hiddenInput.length) {
let availableProducts = JSON.parse(hiddenInput[0].getAttribute('data-products')),
productsOption;
Array.from(select.options).forEach((option, index) => {
productsOption = JSON.parse(option.getAttribute('data-products'));
if (productsOption) {
option.disabled = !productsOption.some(product => availableProducts.includes(product));
}
});
this.selects[select.dataset.elementCode].update();
}
},
isAttributeToHide(attr, product) {
return product.attributes.size_mode == this.sizeModeDefault && attr.code !== this.serviceSizeCode;
},
}
}
</script></div></div></main><div id="country-detection-popup" style="display: none">
</div>
<script>
(function() {
var optionsFirst = {
type: 'popup',
responsive: true,
innerScroll: true,
modalClass: 'country-detection-popup',
cookieName: 'stay_on_current',
buttons: []
};
var optionsSecond = optionsFirst;
var actionUrl = "https://www.modyf.fr/modyf_geoip/geoip/getaction/";
// Check if the cookie exists
if (document.cookie.split('; ').some(row => row.startsWith(optionsFirst.cookieName))) {
return;
}
// Create a function to set cookies
function setCookie(name, value, options = {}) {
let cookieString = `${name}=${value}`;
if (options.path) {
cookieString += `; path=${options.path}`;
}
document.cookie = cookieString;
}
// Make an AJAX request
var xhr = new XMLHttpRequest();
xhr.open("POST", actionUrl, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function () {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
var data = xhr.responseText;
if (data && data !== 'null') {
var container = document.createElement('div');
container.innerHTML = `
<aside class="modal-popup country-detection-popup modal-slide _inner-scroll _show
overflow-y-auto !z-[1055] visible opacity-100 transition-opacity
pointer-events-auto bottom-0 left-[44px] min-w-0 fixed right-0 top-0 block
mobile:scrolling-touch
tablet_desktop:overflow-y-visible tablet_desktop:left-0
tablet_desktop:pointer-events-none"
data-role="modal"
data-type="popup"
tabindex="0"
style="z-index: 1055;">
<div data-role="focusable-start" tabindex="0"></div>
<div class="modal-inner-wrap
h-auto min-h-full bg-[#f4f4f4] translate-x-0 m-0 max-h-[90vh]
overflow-y-auto static transition-transform shadow-modyf_box_shadow
opacity-100 pointer-events-auto flex flex-col
tablet_desktop:h-auto tablet_desktop:min-h-0 tablet_desktop:bg-modyf-white
tablet_desktop:translate-y-[0] tablet_desktop:m-[50px_auto]
tablet_desktop:max-h-[90%] tablet_desktop:overflow-y-visible
tablet_desktop:absolute tablet_desktop:left-0 tablet_desktop:right-0
tablet_desktop:max-w-[625px] tablet_desktop:w-full
desktop:-ml-[400px] desktop:w-[800px] desktop:left-1/2"
data-role="focusable-scope">
<header class="modal-header
grow-0 shrink-0 pb-[12px] pt-[30px] px-[30px] block">
<button class="action-close
m-[15px] p-0 bg-[0_0] border-0 shadow-none inline-block
right-0 top-0 text-modyf-white cursor-pointer font-wuerth-bold
text-[18px] box-border align-middle absolute leading-[27px]
before:text-[12px] before:leading-[12px] before:font-bold
before:text-modyf-black before:antialiased
before:font-luma-icons before:m-0 before:align-top
before:inline-block before:overflow-hidden before:text-center
before:w-[12px] before:h-[12px] before:content-['\\e616']"
data-role="closeBtn"
type="button">
</button>
</header>
<div class="modal-content
overflow-y-auto px-[30px] pb-[36px]"
data-role="content">
<div>
${JSON.parse(data)}
</div>
<div>
</div>
<div data-role="focusable-end" tabindex="0"></div>
</aside>
<div class="modals-overlay
!z-[1054] bg-[rgba(51,51,51,.55)] bottom-0 left-0 fixed right-0 top-0"
style="z-index: 1001;"></div>
`;
document.body.appendChild(container);
}
var stayOnCurrent = document.getElementById('stay-on-current');
var popupCloseButton = document.querySelector('.action-close');
if (popupCloseButton) {
popupCloseButton.addEventListener('click', function () {
setCookie(optionsFirst.cookieName, 1, { path: '/' });
});
}
if (stayOnCurrent) {
stayOnCurrent.addEventListener('click', function () {
if (popupCloseButton) {
popupCloseButton.click();
}
setCookie(optionsFirst.cookieName, 1, { path: '/' });
});
}
}
}
};
xhr.send();
document.addEventListener('click', function(event) {
if (event.target.matches('#stay-on-current')) {
const modalPopup = event.target.closest('.modal-popup.country-detection-popup');
if (modalPopup) {
modalPopup.classList.add('popup-hidden');
modalPopup.style.display = 'none';
}
const modalsOverlay = event.target.closest('body').querySelector('.modals-overlay');
if (modalsOverlay) {
modalsOverlay.style.display = 'none';
}
}
});
document.addEventListener('click', function(event) {
const modalPopup = event.target.closest('body').querySelector('.modal-popup.country-detection-popup');
if (modalPopup) {
modalPopup.classList.add('popup-hidden');
modalPopup.style.display = 'none';
}
if (event.target.matches('.modals-overlay')) {
const modalsOverlay = event.target.closest('body').querySelector('.modals-overlay');
if (modalsOverlay) {
modalsOverlay.style.display = 'none';
}
}
});
})()
</script><footer class="page-footer bg-modyf-white">
<div class="footer-newsletter footer-newsletter-img-wrapper bg-center bg-cover py-[53px] px-[34px] mobile:!bg-modyf-white mobile:!bg-none tablet:py-[52px] tablet:px-[45px] desktop:mx-auto desktop:max-w-[1680px] desktop:p-[86px_63px_84px]"
style="background-image:url('https://www.modyf.fr/media/newsletter/stores/2/modyf-newsletter.webp');">
<form
class="form subscribe bg-modyf-white p-0 w-full tablet:p-[40px] tablet:max-w-[327px] desktop:p-[50px_45px_41px_50px] desktop:max-w-[465px]"
action="https://www.modyf.fr/newsletter/subscriber/new/"
method="post"
x-data="initNewsletterForm()"
@submit.prevent="submitForm()"
id="newsletter-validate-detail"
aria-label="S'abonner à la newsletter"
>
<div id="footer-newsletter-heading"
class="title mb-[6px] font-wuerth-bold text-[11px] leading-[16px] tracking-[.75px] uppercase text-modyf-main_text_grey desktop:mb-[13px] desktop:text-[14px] desktop:leading-[20px]">
Newsletter </div>
<div class="subtitle mt-[20px] mb-[31px] font-wuerth-bold text-[24px] leading-[1.33] tracking-[-.75px] desktop:mt-0 desktop:mb-[34px] desktop:text-[40px] desktop:leading-[53px]">
Obtenez votre bon de 10€ </div>
<div class="subscribe-field mb-[20px]">
<label for="newsletter-subscribe" class="mb-[9px] inline-block">
Email </label>
<input
name="email"
type="email"
required
id="newsletter-subscribe"
class="form-input w-full text-[16px] leading-[1] bg-modyf-lightest_grey border-0"
placeholder="Saisissez votre email"
aria-describedby="footer-newsletter-heading"
>
<input name="form_key" type="hidden" value="njoHEetKjnTraCzD" /> </div>
<button class="btn btn-primary w-[100%] block text-center border-0 whitespace-nowrap"
title="S'abonner à la newsletter">
<span class="whitespace-normal">
S'abonner à la newsletter </span>
</button>
<div>
<template x-if="displayErrorMessage">
<p class="flex items-center text-red">
<span class="inline-block w-8 h-8 mr-3">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
<title>exclamation-circle</title></svg>
</span>
<template x-for="errorMessage in errorMessages">
<span x-html="errorMessage"></span>
</template>
</p>
</template>
</div>
</form>
<script>
function initNewsletterForm() {
return {
errors: 0,
hasCaptchaToken: 0,
displayErrorMessage: false,
errorMessages: [],
setErrorMessages(messages) {
this.errorMessages = [messages];
this.displayErrorMessage = this.errorMessages.length;
},
submitForm() {
// Do not rename $form, the variable is expected to be declared in the recaptcha output
const $form = document.querySelector('#newsletter-validate-detail');
if (this.errors === 0) {
$form.submit();
}
}
}
}
</script>
</div><style>#html-body [data-pb-style=SKXCSYK],#html-body [data-pb-style=YAMYMHU]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=YAMYMHU]{justify-content:flex-start;display:flex;flex-direction:column;background-color:#fff}#html-body [data-pb-style=SKXCSYK]{align-self:stretch}#html-body [data-pb-style=IM202FV]{display:flex;width:100%}#html-body [data-pb-style=S5C6E5Y]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:25%;align-self:stretch}#html-body [data-pb-style=T5TKRR9]{text-align:center}#html-body [data-pb-style=C8BDX51]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:25%;align-self:stretch}#html-body [data-pb-style=T0LTPQE]{text-align:center}#html-body [data-pb-style=DD556VK]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:25%;align-self:stretch}#html-body [data-pb-style=HHM40LN]{text-align:center}#html-body [data-pb-style=KY53ING]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;text-align:center;width:25%;align-self:stretch}#html-body [data-pb-style=FECLKEV]{text-align:center}</style><div class="footer-reinsurance" data-content-type="row" data-appearance="full-width" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="YAMYMHU"><div class="row-full-width-inner" data-element="inner"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><script>
var fakeLink = 'L3NlbGVjdGlvbi1wcmludGVtcHM=';
var fakeLinkContent = 'Sélection Printemps';
var ulDesktop = document.querySelector(".navigation>ul");
var liDesktop = document.createElement("li");
liDesktop.setAttribute("class", "level-0 nav-0 category-item first level-top parent ui-menu-item hack");
liDesktop.innerHTML = "<span class='flex items-center text-md'></span><span class='font-wuerth-bold text-[18px] leading-[28px] text-modyf-red level-0 group w-full flex justify-between items-center gap-1 pb-[14px] border-b-[6px] border-transparent hover:border-modyf-red transition aria-expanded:text-blue-500 aria-expanded:border-modyf-red data-[has-current]:aria-expanded:border-modyf-red data-[has-current]:border-slate-400 data-[has-current]:hover:border-modyf-red hover:!text-modyf-red atc' data-atc='"+fakeLink+"'>"+fakeLinkContent +"</span>";
ulDesktop.insertBefore(liDesktop, ulDesktop.firstChild);
var ulMobile = document.querySelector("[x-ref='mobileMenuNavLinks'] > ul");
var liMobile = document.createElement("li");
liMobile.setAttribute("class", "level-0 hack");
liMobile.innerHTML = "<div class='flex items-center transition-transform duration-150 ease-in-out transform'><span class='flex items-center w-full pr-[40px] pl-[20px] py-[15px] border-b border-modyf-lightest_grey cursor-pointer bg-modyf-white level-0 font-wuerth-bold text-[16px] text-modyf-black atc' data-atc='"+fakeLink+"'>"+fakeLinkContent +"</span></div>";
ulMobile.insertBefore(liMobile, ulMobile.firstChild);
</script>
<script>
//product badging
var productsToBadge = [
"/jeans-de-travail-multipoches-stretch-x-wurth-modyf-91449-2",
"/tee-shirt-de-travail-a-manches-longues-pro-wurth-modyf-noir-95436-2",
"/tee-shirt-modyf-job-black-30851-2",
"/pantalon-de-travail-star-cp250-en14404-noir-wurth-modyf-117438-2",
"/pantalon-de-travail-wurth-modyf-haute-visibilite-orange-marine-78364-2",
"/tee-shirt-modyf-job-white-30875-2",
"/jeans-de-travail-stretch-x-wurth-modyf-91437-2",
"/tee-shirt-modyf-job-grey-30843-2",
"/tee-shirt-modyf-job-navy-30835-2",
"/tee-shirt-job-116611-2",
"/pantalon-de-travail-stretch-x-wurth-modyf-anthracite-91153-2",
"/sweat-de-travail-col-rond-wurth-modyf-noir-110270-2",
"/veste-polaire-zippee-job--wurth-modyf-noir-m456368",
"/chaussures-de-securite-montantes-wurth-modyf-hercules-s3-src-noires-78423-2",
"/chaussures-de-securite-basses-s3-cruise-wurth-modyf-116154",
"/pantalon-de-travail-star-cp250-en14404-gris-wurth-modyf-117565-2",
"/pantalon-de-travail-wurth-modyf-nature-noir-87221-2",
"/tee-shirt-de-travail-a-manches-longues-pro-wurth-modyf-anthracite-82239-2",
"/bottes-de-securite-fourrees-s3-src-wr-hro-hi-ci-xorion-wurth-modyf-brunes-110234-2",
"/bermuda-de-travail-stretch-x-wurth-modyf-anthracite-91255-2",
"/tee-shirt-de-travail-manches-longues-pro-wurth-modyf-gris-115523-2",
"/pull-de-travail-polaire-job--wurth-modyf-noir-m456374",
"/jeans-de-travail-stretch-x-noir-wurth-modyf-109087-2",
"/tee-shirt-de-travail-a-manches-longues-pro-wurth-modyf-marine-104538-2",
"/pantalon-de-travail-star-cp250-en14404-bleu-marine-wurth-modyf-117550-2",
"/pantalon-de-travail-new-cobra-wurth-modyf-noir-102485-2",
"/sweat-de-travail-col-rond-wurth-modyf-anthracite-110053-2",
"/baskets-de-securite-s3-esd-hro-src-puma-airtwist-noires-114030-2",
"/tee-shirt-modyf-job-orange-30891-2",
"/pantalon-de-travail-wurth-modyf-haute-visibilite-jaune-marine-78357-2",
"/pantalon-de-travail-wurth-modyf-nature-gris-71775-2",
"/softshell-de-travail-x-titan-wurth-modyf-noire-110028-2",
"/sweat-de-travail-col-rond-wurth-modyf-marine-110055-2",
"/pantalon-de-travail-star-cp250-noir-wurth-modyf-116027",
"/pantalon-de-travail-thermic-stretch-x-wurth-modyf-anthracite-91209-2",
"/salopette-de-travail-stretch-x-wurth-modyf-noire-91702-2",
"/chaussures-de-securite-montantes-s3-rock-wurth-modyf-noires-117619-2",
"/chaussures-de-securite-basses-wurth-modyf-hercules-s3-src-noires-78408-2",
"/tee-shirt-de-travail-modyf-job-vert-66997-2",
"/gilet-modyf-new-craft-41585",
"/tee-shirt-modyf-job-royal-30867-2",
"/pantalon-de-travail-wurth-modyf-nature-brun-71793-2",
"/baskets-de-securite-s1p-esd-hro-src-elevate-knit-green-puma-noires-85359-2",
"/veste-de-travail-power-stretch-one-noire-11719-2",
"/sweat-de-travail-col-rond-wurth-modyf-gris-110063-2",
"/jean-de-travail-stretch-casual-bleu-wurth-modyf-116090",
"/pull-de-travail-polaire--job--wurth-modyf-anthracite-m456378",
"/chaussures-de-securite-carbon-290-ultra-legeres-wurth-modyf-marine-114508-2",
"/chaussures-de-securite-iconic-suede-s1pl-puma-noires-m416224",
"/veste-polaire-de-travail-zippee-job--wurth-modyf-anthracite-m456372",
"/jean-de-travail-stretch-x-cordura-wurth-modyf-denim-noir-94707-2",
"/baskets-de-securite-s3-esd-hro-src-puma-airtwist-bleues-113997-2",
"/pantalon-de-travail-stretch-evolution-wurth-modyf-anthracite-lime-111311-2",
"/bermuda-de-travail-en-jeans-stretch-x-wurth-modyf-91092-2",
"/polaire-stretch-noir-42063",
"/pantalon-de-travail-stretch-x-wurth-modyf-marine-119397-2",
"/pantalon-de-travail-haute-visibilite-fluo-orange-anthracite-wurth-modyf-116671",
"/tee-shirt-modyf-job-red-30859-2",
"/pull-de-travail-polaire-job--wurth-modyf-marine-m456379",
"/pantalon-de-travail-star-pc-noir-m403836",
"/bermuda-de-travail-stretch-x-wurth-modyf-marine-91269-2",
"/chaussures-de-securite-iconic-suede-s1pl-esd-hro-puma-marines-m416225",
"/chaussures-de-securite-aries-s3-wurth-modyf-noires-91990-2",
"/pantalon-de-travail-star-cp250-bleu-marine-wurth-modyf-116012",
"/pantalon-de-travail-new-cobra-wurth-modyf-kaki-83831-2",
"/chaussures-de-securite-s1p-caracas-wurth-modyf-anthracite-115675-2",
"/jeans-de-travail-janus-wurth-modyf-bleu-gris-m443186",
"/baskets-securite-jogger-s1p-grises",
"/pantalon-de-travail-stretch-x-wurth-modyf-beige-91181-2",
"/veste-softshell-de-travail-stretch-x-wurth-modyf-noire-99037-2",
"/pantalon-de-travail-femme-stretch-x-wurth-modyf-anthracite-97246",
"/pantalon-de-travail-stretch-x-wurth-modyf-gris-91126-2",
"/baskets-de-securite-s3-esd-hro-src-puma-airtwist-noires-et-rouges-114007-2",
"/bermuda-de-travail-stretch-x-wurth-modyf-beige-91283-2",
"/baskets-de-securite-puma-velocity-2-0-s1p-esd-hro-src-noires-97837-2",
"/chaussures-de-securite-montantes-s3-taurus-wurth-modyf-brunes-117388-2",
"/chaussures-de-securite-basses-femmes-s1p-puma-technics-noir-rose-47298-2",
"/chaussures-de-securite-montantes-cruise-s3s-noir-m422263",
"/chaussures-montantes-caracas-s3-115614-2",
"/jogging-de-travail-star-noir-m443203",
"/bermuda-de-travail-stretch-x-wurth-modyf-gris-91241-2",
"/chaussures-de-securite-montantes-s1p-caracas-wurth-modyf-anthracite-115726-2",
"/gilet-matelasse-craft-gris-9891-2",
"/pantalon-de-travail-star-cp250-gris-wurth-modyf-116042",
"/pantalon-de-travail-stretch-evolution-wurth-modyf-bleu-royal-111341-2",
"/jogging-de-travail-star-anthracite-m443204",
"/softshell-91301-2",
"/chaussures-securite-montantes-hydro-sympatex-s3",
"/chaussures-de-securite-s3l-a-fo-sr-cetus-wurth-modyf-noires-grises-m418199",
"/combinaison-de-travail-stretch-x-wurth-modyf-anthracite-91798-2",
"/chaussures-montantes-s3-vibram-ii-brun-14549",
"/gilet-matelasse-craft-bleu-9883-2",
"/chaussures-caracas-s3-115599-2",
"/gilet-de-travail-haute-visibilite-reversible-orange-fluo-wurth-modyf-117131-2",
"/chaussures-basses-lina-s1p-src-esd-ci-hro-115532-2",
"/gilet-de-travail-haute-visibilite-reversible-jaune-fluo-wurth-modyf-117123-2",
"/veste-polaire-de-travail-zippee-job--wurth-modyf-rouge-m456370",
"/pantalon-de-travail-star-cp-en14404-blanc-m403711",
"/chaussures-de-securite-basses-ecofresh-s3-wurth-modyf-114223",
"/pantalon-de-travail-stretch-x-rouge-wurth-modyf-97761-2",
"/pull-de-travail-polaire-job--wurth-modyf-rouge-m456376",
"/4-paires-de-chaussettes-robustes-noires-m451291",
"/pantalon-haute-visibilite-fluo-115872-2",
"/chaussures-de-securite-s3-triton-wurth-modyf-bleues-m418189",
"/pantalon-de-travail-star-pc-marine-m403829",
"/pantalon-de-travail-hiver-stretch-x-marine-91650-2",
"/sweat-de-travail-col-rond-wurth-modyf-blanc-m550221",
"/chaussures-de-securite-hautes-femme-s1p-lina-wurth-modyf-115735-2",
"/softshell-de-travail-stretch-evolution-wurth-modyf-anthracite-lime-111381-2",
"/pantalon-de-travail-star-pc-gris-m403832",
"/chaussures-de-securite-basses-stretch-x-s3s-noires-m418215",
"/softshell-de-travail-stretch-x-rouge-wurth-modyf-98395-2",
"/softshell-de-travail-stretch-evolution-wurth-modyf-bleue-royale-111392-2",
"/softshell-de-travail-femme-stretch-x-wurth-modyf-anthracite-96990",
"/chaussures-de-securite-basses-cruise-lady-s3s-bordeaux-m428027",
"/chaussures-de-securite-montantes-cruise-lady-s3s-bordeaux-m428028",
"/tee-shirt-de-travail-x-finity-wurth-modyf-marine-m446944",
"/tee-shirt-de-travail-x-finity-wurth-modyf-gris-m446940",
"/chaussettes-de-travail-ete-grise-bleue-m451087",
"/genouilleres-de-protection-noires-et-rouges-wurth-modyf-m437484",
"/ceinture-de-travail-stretch-x-wurth-modyf-noire-97233"
];
function checkForProducts() {
var href = document.querySelectorAll(".product-item a");
console.log("href = "+href.length);
for (var j = 0; j < href.length; j++) {
for (var i = 0; i < productsToBadge.length; i++) {
if (href[j].href.includes(productsToBadge[i])) href[j].parentElement.classList.add("badge")
}
}
for (var i = 0; i < productsToBadge.length; i++) {
if (window.location.href.includes(productsToBadge[i])) { //page product
document.body.classList.add("badge");
}
}
}
checkForProducts();
if (document.body.classList.contains("page-products")) { //category page
document.getElementById("load-more-products").addEventListener("click", function () {
var length = document.querySelectorAll(".product-item a.product").length;
var intervalId = window.setInterval(function () {
checkForProducts();
if (length != document.querySelectorAll(".product-item a.product").length) clearInterval(intervalId);
}, 1000);
});
}
if (document.body.classList.contains("cms-home")) { //homepage
var length = document.querySelectorAll(".product-item a").length;
var intervalId2 = window.setInterval(function () {
checkForProducts();
if (length != document.querySelectorAll(".product-item a").length) clearInterval(intervalId2);
}, 2000);
}
if (document.body.classList.contains("catalog-product-view")) { //product page T2S block
var length = document.querySelectorAll(".product-item a").length;
var intervalId3 = window.setInterval(function () {
checkForProducts();
if ((length != document.querySelectorAll(".product-item a").length) && (length !=0)) clearInterval(intervalId3);
}, 2000);
}
</script>
<style>
.badge .discount-label{background-color: #5A660A!important;}
</style></div><div class="pagebuilder-column-group footer-reinsurance-images" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="SKXCSYK"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="IM202FV"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="S5C6E5Y"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="T5TKRR9" data-decoded="true"><!--figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="GXS9UVL">
<picture class="mfwebp"> <source data-element="desktop_image" data-pb-style="L3MU7FL" loading="lazy" width="95" height="64" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/free-shipping-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/free-shipping-icon.png" alt="Livraison & retours gratuits" data-element="desktop_image" data-pb-style="L3MU7FL" loading="lazy" width="95" height="64"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" data-pb-style="A35OHFK" loading="lazy" width="95" height="64" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/free-shipping-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/free-shipping-icon.png" alt="Livraison & retours gratuits" data-element="mobile_image" data-pb-style="A35OHFK" loading="lazy" width="95" height="64"></picture>
</figure-->
<svg width="95" height="63" viewbox="0 0 95 63" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3572_525)">
<path d="M59.5 54.8346V13.3516H81.5C84.6052 13.5533 87.5045 14.9751 89.5653 17.3066C91.6261 19.6381 92.6811 22.6901 92.5 25.7966V50.6866C92.5603 51.7222 92.2084 52.7396 91.5212 53.5168C90.834 54.2939 89.8672 54.7676 88.832 54.8346H80.5" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M74.5 60.7612C77.8137 60.7612 80.5 58.108 80.5 54.8352C80.5 51.5623 77.8137 48.9092 74.5 48.9092C71.1863 48.9092 68.5 51.5623 68.5 54.8352C68.5 58.108 71.1863 60.7612 74.5 60.7612Z" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M26.5 60.7612C29.8137 60.7612 32.5 58.108 32.5 54.8352C32.5 51.5623 29.8137 48.9092 26.5 48.9092C23.1863 48.9092 20.5 51.5623 20.5 54.8352C20.5 58.108 23.1863 60.7612 26.5 60.7612Z" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M92.5 31.1296H75C74.0919 31.1486 73.2133 30.8066 72.5571 30.1785C71.9009 29.5504 71.5207 28.6877 71.5 27.7796V13.3516" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M68.5 54.835H32.5" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M92.4999 42.9834H84.6719" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M1.5 37.057H59.5V1.5H1.5V37.057Z" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M20.5 54.8346H1.5V37.0566" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
</g>
<defs>
<clippath id="clip0_3572_525">
<rect width="94.028" height="62.261" fill="white"/>
</clippath>
</defs>
</svg></div><div data-content-type="text" data-appearance="default" data-element="main"><p><span style="color: #000000;"><strong>Livraison & retours gratuits</strong></span></p>
<p><span style="color: #818a8f;">Frais de ports offerts dès 66€ TTC d'achats hors TNT express</span></p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="C8BDX51"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="T0LTPQE" data-decoded="true"><!--figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="SNK7NHY">
<picture class="mfwebp"> <source data-element="desktop_image" data-pb-style="D9C776S" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/fast-delivery-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/fast-delivery-icon.png" alt="Livraison rapide" data-element="desktop_image" data-pb-style="D9C776S" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" data-pb-style="TEYAP3K" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/fast-delivery-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/fast-delivery-icon.png" alt="Livraison rapide" data-element="mobile_image" data-pb-style="TEYAP3K" loading="lazy"></picture>
</figure-->
<svg width="78" height="62" viewbox="0 0 78 62" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3572_539)">
<path d="M0.671875 35.2178L10.4619 40.1178" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M0.984375 22.0889L10.3574 27.0469" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M4.93555 11.1709L10.5655 14.5979" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M34.3145 8.64551L61.8145 22.5225" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M48.0645 1.68652L20.5645 16.1325V44.6635L48.0645 59.8635L75.5645 47.0475V15.5865L48.0645 1.68652Z" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M74.4773 16.1328L48.0643 29.4598L21.6543 16.1328" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M48.0664 29.46V59.868" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M61.8164 22.5225V32.1095" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
</g>
<defs>
<clippath id="clip0_3572_539">
<rect width="77.064" height="61.55" fill="white"/>
</clippath>
</defs>
</svg></div><div data-content-type="text" data-appearance="default" data-element="main"><p><span style="color: #000000;"><strong>Livraison rapide</strong></span></p>
<p><span style="color: #818a8f;">Chez vous en 24/48h par TNT ou 5 jours en points relais</span></p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="DD556VK"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="HHM40LN" data-decoded="true"><!--figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="SOV3VER">
<picture class="mfwebp"> <source data-element="desktop_image" data-pb-style="EERG4B8" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/free-retoure-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/free-retoure-icon.png" alt="Garantie 30 jours" data-element="desktop_image" data-pb-style="EERG4B8" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" data-pb-style="VLNNC9U" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/free-retoure-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/free-retoure-icon.png" alt="Garantie 30 jours" data-element="mobile_image" data-pb-style="VLNNC9U" loading="lazy"></picture>
</figure-->
<svg width="64" height="59" viewbox="0 0 64 59" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3572_553)">
<path d="M21.844 49.9871H1.5V13.6221H50.281V21.7031" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M50.281 12.919L39.094 1.5H12.905L1.5 12.919" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M25.9062 1.5V13.622" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M42.1562 29.7842L34.0312 37.8652L42.1562 45.9462" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M34.0312 37.8653H42.1562C47.5285 37.8507 52.6865 39.9706 56.4959 43.7588C60.3052 47.5469 62.4539 52.6931 62.4692 58.0653" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
</g>
<defs>
<clippath id="clip0_3572_553">
<rect width="63.969" height="58.068" fill="white"/>
</clippath>
</defs>
</svg></div><div data-content-type="text" data-appearance="default" data-element="main"><p><span style="color: #000000;"><strong>Garantie 30 jours</strong></span></p>
<p><span style="color: #818a8f;">100% satisfait, remboursé ou échangé</span></p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="KY53ING"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="FECLKEV" data-decoded="true"><!--figure data-content-type="image" data-appearance="full-width" data-element="main" data-pb-style="HH416PX">
<picture class="mfwebp"> <source data-element="desktop_image" data-pb-style="EIAI5MS" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/safe-payment-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/safe-payment-icon.png" alt="Paiement sécurisé" data-element="desktop_image" data-pb-style="EIAI5MS" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" data-pb-style="IN9MWLD" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/cms/safe-payment-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/safe-payment-icon.png" alt="Paiement sécurisé" data-element="mobile_image" data-pb-style="IN9MWLD" loading="lazy"></picture>
</figure-->
<svg width="60" height="59" viewbox="0 0 60 59" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3572_564)">
<path d="M42.75 23.7227H16.5V42.2417H42.75V23.7227Z" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M29.6259 32.0567C29.4433 32.0588 29.2653 32.115 29.1145 32.218C28.9637 32.3211 28.8467 32.4665 28.7783 32.6358C28.7099 32.8052 28.6931 32.9911 28.7301 33.17C28.7671 33.3488 28.8561 33.5128 28.986 33.6412C29.116 33.7696 29.281 33.8567 29.4603 33.8916C29.6396 33.9264 29.8252 33.9075 29.9938 33.8371C30.1624 33.7667 30.3063 33.648 30.4076 33.4959C30.5089 33.3439 30.5629 33.1653 30.5629 32.9827C30.5633 32.8607 30.5394 32.7398 30.4925 32.6272C30.4456 32.5145 30.3767 32.4124 30.2899 32.3267C30.1129 32.1526 29.8742 32.0555 29.6259 32.0567Z" stroke="black" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round"/>
<path d="M20.25 23.7234V18.1684C20.2653 15.6973 21.2617 13.3334 23.0198 11.5968C24.7779 9.86028 27.1539 8.89321 29.625 8.90838C32.0961 8.89321 34.4721 9.86028 36.2302 11.5968C37.9883 13.3334 38.9847 15.6973 39 18.1684V23.7244" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
<path d="M29.625 57.058C12.935 52.66 1.5 42.884 1.5 25.575V1.5H57.75V25.575C57.75 42.872 46.333 52.655 29.625 57.058Z" stroke="black" stroke-width="3" stroke-miterlimit="10"/>
</g>
<defs>
<clippath id="clip0_3572_564">
<rect width="59.25" height="58.609" fill="white"/>
</clippath>
</defs>
</svg></div><div data-content-type="text" data-appearance="default" data-element="main"><p><span style="color: #000000;"><strong>Paiement sécurisé</strong></span></p>
<p><span style="color: #818a8f;">Modes de paiement au choix (carte bancaire, Paypal, 3x sans frais, LCR…)</span></p></div></div></div></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.footer-reinsurance svg{display: inline; margin-bottom: 29px;}
</style>
<style>.footer-seo .row-full-width-inner{display:none;}</style>
<script>
//badging produits Made in France
var productsMDFToBadge = ["m451086", "m546177", "m546176", "m546175", "m443189", "m550312", "m550313"];
function checkForProductsMDF() {
var href = document.querySelectorAll(".product-item a");
console.log(href.length);
for (var j = 0; j < href.length; j++) {
for (var i = 0; i < productsMDFToBadge.length; i++) {
if (href[j].href.includes(productsMDFToBadge[i])) href[j].parentElement.classList.add("mdf")
}
}
for (var i = 0; i < productsMDFToBadge.length; i++) {
if (window.location.href.includes(productsMDFToBadge[i])) { //page product
document.body.classList.add("mdf");
}
}
}
checkForProductsMDF();
if (document.body.classList.contains("page-products")) { //category page
document.getElementById("load-more-products").addEventListener("click", function(){
var length = document.querySelectorAll(".product-item a.product").length;
var intervalId = window.setInterval(function(){
checkForProductsMDF();
if(length != document.querySelectorAll(".product-item a.product").length) clearInterval(intervalId);
}, 1000);
});
}
if (document.body.classList.contains("cms-home")) { //home
var length = document.querySelectorAll(".product-item a").length;
var intervalId2 = window.setInterval(function(){
checkForProductsMDF();
if(length != document.querySelectorAll(".product-item a").length) clearInterval(intervalId2);
}, 1000);
}
</script>
<style>.cart .mdf a .product-image-container::before,.mdf .product-info-main-top-content::before{content:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Calque_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 79.4 42.7' style='enable-background:new 0 0 79.4 42.7;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%231D71B8;%7D .st1%7Bfill:%23E30613;%7D .st2%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Crect x='18.3' y='-18.3' transform='matrix(-1.836970e-16 1 -1 -1.836970e-16 61.0249 -18.3452)' class='st0' width='42.7' height='79.4'/%3E%3Crect x='29' y='-7.7' transform='matrix(-1.836970e-16 1 -1 -1.836970e-16 71.6599 -7.7102)' class='st1' width='21.4' height='79.4'/%3E%3Cg%3E%3Cg id='X-FINITY_Logo_Size_36_4C_00000165917915428574253260000008735311868972911774_'%3E%3Cpolygon class='st2' points='24.8,20.2 24.8,12.8 21.8,11 15.3,14.8 8.9,11 5.9,12.8 5.9,20.2 10.6,23 13.6,21.2 8.9,18.4 8.9,14.6 15.3,18.4 21.8,14.6 21.8,18.4 '/%3E%3Cpolygon class='st2' points='5.9,22.2 5.9,29.6 8.9,31.4 15.3,27.5 21.8,31.4 24.8,29.6 24.8,22.2 20.1,19.4 17.1,21.2 21.8,24 21.8,27.8 15.3,24 8.9,27.8 8.9,24 '/%3E%3C/g%3E%3Cg%3E%3Cpath class='st2' d='M34.4,20l0.1-6.7l0,0L32.5,20h-1.5l-1.9-6.8l0.1,6.8h-2.1v-9h2.9l1.7,5.9h0l1.7-5.9h2.9v9H34.4z'/%3E%3Cpath class='st2' d='M43,20l-0.4-1.3h-3L39.1,20h-2.4l3.5-9H42l3.5,9H43z M41.1,13.8L41.1,13.8l-0.9,3.1H42L41.1,13.8z'/%3E%3Cpath class='st2' d='M45.6,20v-9h3c1.1,0,2,0.2,2.6,0.5c1.2,0.7,2,2.1,2,4c0,3-1.7,4.5-4.4,4.5H45.6z M48.9,18 c1.3,0,2.1-0.8,2.1-2.5c0-1.6-0.8-2.5-2.1-2.5h-1v5H48.9z'/%3E%3Cpath class='st2' d='M53.9,20v-9h4.9v2h-2.7v1.4h2.6v2h-2.6V18h2.7v2H53.9z'/%3E%3Cpath class='st2' d='M62.6,20v-9h2.2v9H62.6z'/%3E%3Cpath class='st2' d='M71.3,20l-3.4-5.5L68,20h-2.1v-9h1.9l3.4,5.7L71.1,11h2.1v9H71.3z'/%3E%3Cpath class='st2' d='M27.2,31.4v-9H32v2h-2.6v1.5h2.5v2h-2.5v3.4H27.2z'/%3E%3Cpath class='st2' d='M37.4,31.4l-2-2.9h0v2.9h-2.1v-9H36c0.9,0,1.6,0.1,2.1,0.3c0.9,0.4,1.6,1.5,1.6,2.8c0,1.4-0.8,2.6-2.2,2.8 l2.4,3.1H37.4z M36.1,26.9c0.9,0,1.4-0.4,1.4-1.3c0-0.8-0.6-1.2-1.4-1.2h-0.9v2.5H36.1z'/%3E%3Cpath class='st2' d='M46.5,31.4l-0.4-1.3h-3l-0.5,1.3h-2.4l3.5-9h1.8l3.5,9H46.5z M44.6,25.2L44.6,25.2l-0.9,3.1h1.8L44.6,25.2z' /%3E%3Cpath class='st2' d='M55.3,31.4l-3.4-5.5l0.1,5.5h-2.1v-9h1.9l3.4,5.7l-0.1-5.7h2.1v9H55.3z'/%3E%3Cpath class='st2' d='M65.2,25.8c-0.4-1-1.2-1.6-2.1-1.6c-1.4,0-2.3,1.2-2.3,2.6c0,1.5,1,2.7,2.4,2.7c0.9,0,1.6-0.5,2.1-1.5h2.3 c-0.5,2.2-2.4,3.5-4.4,3.5c-1.2,0-2.4-0.4-3.3-1.4c-0.9-0.9-1.3-2.1-1.3-3.5c0-2.4,2-4.5,4.5-4.5c1.2,0,2.2,0.3,3,1.1 c0.8,0.7,1.3,1.6,1.5,2.5H65.2z'/%3E%3Cpath class='st2' d='M68.6,31.4v-9h4.9v2h-2.7v1.4h2.6v2h-2.6v1.5h2.7v2H68.6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A");display:block;position:absolute;top:0;width:65px;z-index:2}[data-role=add-to-links]{display:none!important}.product-item-info.mdf .product-item-labels::after,.product-item.mdf .product-item-labels::after{content:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Calque_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 79.4 42.7' style='enable-background:new 0 0 79.4 42.7;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%231D71B8;%7D .st1%7Bfill:%23E30613;%7D .st2%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Crect x='18.3' y='-18.3' transform='matrix(-1.836970e-16 1 -1 -1.836970e-16 61.0249 -18.3452)' class='st0' width='42.7' height='79.4'/%3E%3Crect x='29' y='-7.7' transform='matrix(-1.836970e-16 1 -1 -1.836970e-16 71.6599 -7.7102)' class='st1' width='21.4' height='79.4'/%3E%3Cg%3E%3Cg id='X-FINITY_Logo_Size_36_4C_00000165917915428574253260000008735311868972911774_'%3E%3Cpolygon class='st2' points='24.8,20.2 24.8,12.8 21.8,11 15.3,14.8 8.9,11 5.9,12.8 5.9,20.2 10.6,23 13.6,21.2 8.9,18.4 8.9,14.6 15.3,18.4 21.8,14.6 21.8,18.4 '/%3E%3Cpolygon class='st2' points='5.9,22.2 5.9,29.6 8.9,31.4 15.3,27.5 21.8,31.4 24.8,29.6 24.8,22.2 20.1,19.4 17.1,21.2 21.8,24 21.8,27.8 15.3,24 8.9,27.8 8.9,24 '/%3E%3C/g%3E%3Cg%3E%3Cpath class='st2' d='M34.4,20l0.1-6.7l0,0L32.5,20h-1.5l-1.9-6.8l0.1,6.8h-2.1v-9h2.9l1.7,5.9h0l1.7-5.9h2.9v9H34.4z'/%3E%3Cpath class='st2' d='M43,20l-0.4-1.3h-3L39.1,20h-2.4l3.5-9H42l3.5,9H43z M41.1,13.8L41.1,13.8l-0.9,3.1H42L41.1,13.8z'/%3E%3Cpath class='st2' d='M45.6,20v-9h3c1.1,0,2,0.2,2.6,0.5c1.2,0.7,2,2.1,2,4c0,3-1.7,4.5-4.4,4.5H45.6z M48.9,18 c1.3,0,2.1-0.8,2.1-2.5c0-1.6-0.8-2.5-2.1-2.5h-1v5H48.9z'/%3E%3Cpath class='st2' d='M53.9,20v-9h4.9v2h-2.7v1.4h2.6v2h-2.6V18h2.7v2H53.9z'/%3E%3Cpath class='st2' d='M62.6,20v-9h2.2v9H62.6z'/%3E%3Cpath class='st2' d='M71.3,20l-3.4-5.5L68,20h-2.1v-9h1.9l3.4,5.7L71.1,11h2.1v9H71.3z'/%3E%3Cpath class='st2' d='M27.2,31.4v-9H32v2h-2.6v1.5h2.5v2h-2.5v3.4H27.2z'/%3E%3Cpath class='st2' d='M37.4,31.4l-2-2.9h0v2.9h-2.1v-9H36c0.9,0,1.6,0.1,2.1,0.3c0.9,0.4,1.6,1.5,1.6,2.8c0,1.4-0.8,2.6-2.2,2.8 l2.4,3.1H37.4z M36.1,26.9c0.9,0,1.4-0.4,1.4-1.3c0-0.8-0.6-1.2-1.4-1.2h-0.9v2.5H36.1z'/%3E%3Cpath class='st2' d='M46.5,31.4l-0.4-1.3h-3l-0.5,1.3h-2.4l3.5-9h1.8l3.5,9H46.5z M44.6,25.2L44.6,25.2l-0.9,3.1h1.8L44.6,25.2z' /%3E%3Cpath class='st2' d='M55.3,31.4l-3.4-5.5l0.1,5.5h-2.1v-9h1.9l3.4,5.7l-0.1-5.7h2.1v9H55.3z'/%3E%3Cpath class='st2' d='M65.2,25.8c-0.4-1-1.2-1.6-2.1-1.6c-1.4,0-2.3,1.2-2.3,2.6c0,1.5,1,2.7,2.4,2.7c0.9,0,1.6-0.5,2.1-1.5h2.3 c-0.5,2.2-2.4,3.5-4.4,3.5c-1.2,0-2.4-0.4-3.3-1.4c-0.9-0.9-1.3-2.1-1.3-3.5c0-2.4,2-4.5,4.5-4.5c1.2,0,2.2,0.3,3,1.1 c0.8,0.7,1.3,1.6,1.5,2.5H65.2z'/%3E%3Cpath class='st2' d='M68.6,31.4v-9h4.9v2h-2.7v1.4h2.6v2h-2.6v1.5h2.7v2H68.6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E%0A");display:block;width:50px}.cart .mdf a .product-image-container::before{right:0}.mdf .product-info-main-top-content,.product-image-container,.product-item.mdf{position:relative}.mdf .product-info-main-top-content::before{left:auto;right:33px}
</style></div></div></div><div class="footer content relative bg-modyf-grey">
<span class="atc footer-logo top-[-52px] modyf-absolute-centering-horizontall-mixin desktop:top-[-66px]"
data-atc="aHR0cHM6Ly93d3cubW9keWYuZnIv">
<svg xmlns="http://www.w3.org/2000/svg" width="127" height="132" viewbox="0 0 127 132" class="w-[100px] h-[104px] desktop:w-[127px] desktop:h-[132px]" role="img"><g fill="none" fill-rule="evenodd"><path fill="#818A8F" d="M0 .644h127V131.15H0z"/><path fill="#C00" d="M106.197 60.87V28.675L92.55 20.883 63.333 37.569 34.117 20.883 20.47 28.675V60.87L41.79 73.046l13.649-7.792-21.323-12.178V36.469l29.216 16.687L92.55 36.47v16.607z"/><path fill="#000" d="M20.47 69.637v32.198l13.647 7.794 29.216-16.688L92.55 109.63l13.647-7.794V69.637l-21.323-12.18-13.647 7.796 21.323 12.18V94.04L63.333 77.352 34.117 94.04V77.432z"/></g><title/></svg>
</span><div class="footer-top desktop:flex desktop:justify-between"><style>#html-body [data-pb-style=ULAQCBG],#html-body [data-pb-style=UREFUGB]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=ULAQCBG]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=UREFUGB]{align-self:stretch}#html-body [data-pb-style=C8RXPVU]{display:flex;width:100%}#html-body [data-pb-style=EBBDJ79],#html-body [data-pb-style=HVTJP9J],#html-body [data-pb-style=S4HSMXI],#html-body [data-pb-style=URNC5N8],#html-body [data-pb-style=VDESUOI]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:16.6667%;align-self:stretch}#html-body [data-pb-style=EBBDJ79],#html-body [data-pb-style=HVTJP9J]{width:25%}</style><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
@media (max-width: 1049px){
.footer-sitemap .pagebuilder-column-line {
flex-flow: column;
}
}
</style></div><div class="footer-sitemap mob-collapse" data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="ULAQCBG"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="UREFUGB"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="C8RXPVU"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="VDESUOI"><div class="title-wrap" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div data-role="trigger"><strong>VOTRE COMMANDE</strong></div>
</div><div class="sitemap-item-content" data-content-type="text" data-appearance="default" data-element="main"><p>
<span class="atc" data-atc="L3JldG91cg==">Retour gratuit</span><br>
<span class="atc" data-atc="L2NvbW1lbnQtY29tbWFuZGVy">Comment commander</span><br>
<a href="/code-promo-reductions">Code Promo MODYF</a><br>
<a href="/livraison">Livraison</a><br>
<span class="atc" data-atc="L2NvbW1lbnQtY29tbWFuZGVyI3BhZ2UtNA==">Suivi de commande</span>
</p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="S4HSMXI"><div class="title-wrap" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div data-role="trigger"><strong>Services</strong></div>
</div><div class="sitemap-item-content" data-content-type="text" data-appearance="default" data-element="main"><p>
<a tabindex="0" href="/personnalisation">Personnalisation</a><br>
<span class="atc" data-atc="L2dyYW5kcy1jb21wdGVz">Grands Comptes</span><br>
<span class="atc" data-atc="L2dhcmFudGllI3BhZ2UtMg==">Paiement sécurisé</span><br>
<span class="atc" data-atc="L2dhcmFudGll">Garantie</span><br>
<span class="atc" data-atc="L3JlcHJpc2UtZGVzLWNoYXVzc3VyZXMtZGUtc2VjdXJpdGUtdXNhZ2Vlcw==">Reprise des chaussures de sécurité usagées</span>
<span class="atc" data-atc="L2JvbnVzLXJlcGFyYXRpb24=">Bonus réparation<br>(réservé aux particuliers)</span></p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="URNC5N8"><div class="title-wrap" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div data-role="trigger"><strong>Produits</strong></div>
</div><div class="sitemap-item-content" data-content-type="text" data-appearance="default" data-element="main"><p>
<span class="atc" data-atc="L2RlbWFuZGUtZGUtY2F0YWxvZ3Vl">Catalogues</span><br>
<a href="/marques">Marques</a><br>
<span class="atc" data-atc="L2dhcmFudGll">Qualité des produits</span><br>
<span class="atc" data-atc="aHR0cHM6Ly93d3cubW9keWYuY29tL2NvbmZvcm1pdHk=">Certificats de conformité</span><br>
<span class="atc" data-atc="c2VsZWN0aW9ucy1yZXNwb25zYWJsZXM=">Les sélections responsables</span><br>
<span class="atc" data-atc="L2ZpY2hlcy1wcm9kdWl0cy1yZWxhdGl2ZXMtYXV4LXF1YWxpdGVzLWV0LWNhcmFjdGVyaXN0aXF1ZXMtZW52aXJvbm5lbWVudGFsZXM=">Fiches produits relatives aux qualités et caractéristiques environnementales</span>
</p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="EBBDJ79"><div class="title-wrap" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div data-role="trigger"><strong>Aide et contact</strong></div>
</div><div class="sitemap-item-content" data-content-type="text" data-appearance="default" data-element="main"><p><span class="atc" data-atc="L25vdXMtY29udGFjdGVy">Contactez-nous</span><br><a tabindex="0" href="/faq">FAQ</a><br><a tabindex="0" href="/guide-des-tailles">Guides des tailles</a><br><a tabindex="0" href="/normes">Guides des normes de sécurité</a><br><a tabindex="0" href="/normes/en-20345">Normes de chaussures de sécurité ISO 20345:2011</a><br><a tabindex="0" href="/evolution-de-la-norme-en-iso-20345">Evolution des normes chaussures ISO 20345:2022</a><br><a tabindex="0" href="/guide-tissus">Guides des tissus</a><br><span class="atc" data-atc="L2xleGlxdWU=">Lexique</span><br><a tabindex="0" href="javascript:openAxeptioCookies()">Paramétrer mes cookies</a><br><span class="atc" data-atc="L2FjY2Vzc2liaWxpdGU=">Accessibilité - partiellement conforme</span></p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="HVTJP9J"><div class="title-wrap" data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div data-role="trigger"><strong>Notre société</strong></div>
</div><div class="sitemap-item-content" data-content-type="text" data-appearance="default" data-element="main"><p>
<a href="/entreprise">À propos de Würth MODYF</a><br>
<a href="/nos-engagements-en-responsabilite-societale-des-entreprises">Nos engagements RSE</a><br>
<span class="atc" data-atc="L21lbnRpb25zLWxlZ2FsZXM=">Mentions légales</span><br>
<span class="atc" data-atc="L21lbnRpb25zLWxlZ2FsZXMjcGFnZS0y">Politique de confidentialité</span><br>
<span class="atc" data-atc="L21lbnRpb25zLWxlZ2FsZXMjcGFnZS0z">CGV</span><br>
<a href="/magasins-wurth/">Magasins Würth</a><br>
<span class="atc" data-atc="L21hc3RlcnBpZWNl">Masterpiece</span><br>
<span class="atc" data-atc="L2NvbmZvcm1pdGU=">Conformité</span>
</p></div></div></div></div></div>
<div class="mob-collapse">
<div class="sitemap-content pagebuilder-column-group desktop:w-[204px]">
<div class="region px-[34px] tablet:pr-[30px] desktop:p-0">
<div class="title-wrap py-[17px] desktop:mb-[20px] desktop:p-0"
data-role="collapsible">
<div data-role="trigger">
<strong class="relative font-wuerth-bold text-[15px] uppercase tracking-[.5px] block after:content-['\e61c'] after:absolute after:top-0 after:right-0 after:text-[14px] after:p-[3px] after:h-[20px] after:w-[19px] after:rounded-[4px] after:leading-[14px] after:text-modyf-black after:font-luma-icons [.title-wrap.active_&]:after:content-['\e60f'] desktop:text-[20px] desktop:leading-[28px] desktop:after:hidden">
Pays & Langues </strong>
</div>
</div>
<div class="sitemap-item-content hidden pt-[17px] px-[34px] pb-0 [.title-wrap.active_+_&]:block desktop:p-0 desktop:block"
data-role="content"
x-data="{ openCountry: false, openLang: false }">
<div class="choose-country mb-[24px]">
<span class="region-label block">
France </span>
<a href="javascript:void(0);"
class="region-popup-show call-to-action-arrow inline-block tracking-[-1.1px]"
@click="openCountry = true; openLang = false;">
Sélectionner </a>
<div class="region-popup mx-auto my-0 pt-[20px] pr-[20px] pb-[40px] pl-[40px] h-[min-content] fixed top-auto bottom-0 left-0 right-0 z-[5] bg-modyf-white tablet_desktop:w-[445px] tablet_desktop:top-1/2 tablet_desktop:translate-y-[-50%]"
x-show="openCountry"
x-cloak="">
<a href="javascript:void(0);"
class="popup-close w-[21px] h-[21px] absolute right-[22px] inline-block cursor-pointer svg-icon__cross__mixin bg-center"
@click="openCountry = false"></a>
<strong class="mt-[20px] mb-[30px] block font-wuerth-bold text-[22px] leading-[30px]">
Choisissez un pays </strong>
<ul>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/austria.svg"
alt="Austria"
width="24"
height="16">
<a href="https://www.modyf.at/">
Autriche </a>
</li>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/belgium.svg"
alt="Belgium"
width="24"
height="16">
<a href="https://www.modyf.be/fr/">
Belgique </a>
</li>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/german.svg"
alt="German"
width="24"
height="16">
<a href="https://www.modyf.de/">
Allemagne </a>
</li>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/italy.svg"
alt="Italy"
width="24"
height="16">
<a href="https://www.modyf.it/">
Italie </a>
</li>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/netherlands.svg"
alt="Netherlands"
width="24"
height="16">
<a href="https://www.modyf.nl/">
Pays-Bas </a>
</li>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/spain.svg"
alt="Spain"
width="24"
height="16">
<a href="https://www.modyf.es/">
Espagne </a>
</li>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/norway.svg"
alt="Norway"
width="24"
height="16">
<a href="https://www.modyf.no/">
Norvège </a>
</li>
<li class="mb-[15px] flex items-center leading-[26px] [&:last-child]:mb-0">
<img class="mr-[14px]"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/images/icons/portugal.svg"
alt="Portugal"
width="24"
height="16">
<a href="https://www.modyf.pt/">
Portugal </a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<div x-init="initFooterAccordion"></div>
<script>
function initFooterAccordion() {
const mobCollapse = document.querySelectorAll('.mob-collapse');
mobCollapse.forEach(element => {
element.querySelectorAll('[data-role="trigger"]').forEach((trigger) => {
trigger.addEventListener('click', (e) => {
const title = e.currentTarget.parentElement;
const method = (title.classList.contains('active')) ? 'remove' : 'add';
title.classList[method]('active');
});
});
});
}
(() => {
const footerTitle = document.querySelectorAll('.footer-sitemap .title-wrap');
let biggest = 0;
if (window.innerWidth > 1024) {
setBiggestHeight();
}
function setBiggestHeight () {
footerTitle.forEach(title => {
let height = title.offsetHeight;
biggest = height > biggest ? height : biggest;
});
footerTitle.forEach(element => {
element.style.height = `${biggest}px`;
});
}
window.addEventListener('resize', function () {
footerTitle.forEach(element => element.style.height = '');
if (window.innerWidth > 1024) {
setBiggestHeight();
}
});
})();
</script></div><div class="footer-center desktop:flex desktop:justify-between desktop:items-start"><style>#html-body [data-pb-style=NLAMCCR],#html-body [data-pb-style=TR92T48]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=NLAMCCR]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=TR92T48]{align-self:stretch}#html-body [data-pb-style=VCFC6KW]{display:flex;width:100%}#html-body [data-pb-style=JEK2G1W]{justify-content:center;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:100%;align-self:center}</style><div class="footer-payments" data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="NLAMCCR"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.footer-payments .pagebuilder-column figure img{ max-height: 100% }
.footer-payments .pagebuilder-column figure{ width: auto; }
.footer .footer-payments h4,
.footer .footer-payments p,
.footer .footer-social h4,
.footer .footer-social p{margin-bottom: 0px; margin-top: 0px;}
@media (min-width: 1050px){
.footer-social [data-content-type=text], .footer-payments [data-content-type=text] { margin: 0px 0;}
}
</style>
</div><div data-content-type="text" data-appearance="default" data-element="main"><p><strong>Paiement sécurisé</strong></p></div><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="TR92T48"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="VCFC6KW"><div class="pagebuilder-column" data-content-type="column" data-appearance="align-center" data-background-images="{}" data-element="main" data-pb-style="JEK2G1W"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/mastercard-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/wysiwyg/mastercard-24.jpg" alt="mastercard" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/mastercard-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/wysiwyg/mastercard-24.jpg" alt="mastercard" data-element="mobile_image" loading="lazy"></picture>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/visa-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/wysiwyg/visa-24.jpg" alt="visa" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/visa-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/wysiwyg/visa-24.jpg" alt="visa" data-element="mobile_image" loading="lazy"></picture>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/paypal-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/wysiwyg/paypal-24.jpg" alt="paypal" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/paypal-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/wysiwyg/paypal-24.jpg" alt="paypal" data-element="mobile_image" loading="lazy"></picture>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/scalapay-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/wysiwyg/scalapay-24.jpg" alt="scalapay" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/scalapay-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/wysiwyg/scalapay-24.jpg" alt="scalapay" data-element="mobile_image" loading="lazy"></picture>
</figure>
<!--figure data-content-type="image" data-appearance="full-width" data-element="main">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/amazon-pay-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/wysiwyg/amazon-pay-24.jpg" alt="Amazon Pay" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/wysiwyg/amazon-pay-24.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/wysiwyg/amazon-pay-24.jpg" alt="Amazon Pay" data-element="mobile_image" loading="lazy"></picture>
</figure-->
<figure data-content-type="image" data-appearance="full-width" data-element="main" style="width: auto;">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/apple-pay-icon2.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/apple-pay-icon2.png" alt="Apple Pay" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/apple-pay-icon2.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/apple-pay-icon2.png" alt="Apple Pay" data-element="mobile_image" loading="lazy"></picture>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main" style="width: auto;">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/google-pay-icon2.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/google-pay-icon2.png" alt="Google Pay" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/google-pay-icon2.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/google-pay-icon2.png" alt="Google Pay" data-element="mobile_image" loading="lazy"></picture>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main" style="width: auto;">
<picture class="mfwebp"> <source title="Collectivités : paiement par mandat administratif" data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/mandat-administratif.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/mandat-administratif.jpg" alt="logo mandat administratif" title="Collectivités : paiement par mandat administratif" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source title="Collectivités : paiement par mandat administratif" data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/mandat-administratif.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/mandat-administratif.jpg" alt="logo mandat administratif" title="Collectivités : paiement par mandat administratif" data-element="mobile_image" loading="lazy"></picture>
</figure></div></div></div></div></div><style>#html-body [data-pb-style=PLA2IG4],#html-body [data-pb-style=TF7X1AE]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=PLA2IG4]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=TF7X1AE]{margin-top:0;align-self:stretch}#html-body [data-pb-style=H403ISM]{display:flex;width:100%}#html-body [data-pb-style=JW4Y5JC]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:100%;margin-top:0;align-self:stretch}#html-body [data-pb-style=XGR3PCL]{display:none}</style><div class="footer-social" data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="PLA2IG4"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.footer .footer-social [data-content-type=html]{gap:15px;}
.footer .footer-social [data-content-type=html] svg{width:32px;}
@media (max-width: 768px) {
.footer .footer-social [data-content-type=html] svg{width:48px;}
}
.footer .footer-social svg path{transition: 0.1s ease-out}
.facebook:hover svg path[fill="#38424c"]{fill:#fff;}
.facebook:hover svg path[fill="#fff"]{fill:#0866ff;}
.facebook:hover svg path[fill="#38424c"]:last-child{fill:fff;}
.linkedin:hover svg path[fill="#38424c"]{fill: #0077B7;}
.instagram:hover svg path[fill="#38424c"]{opacity:0;}
.youtube:hover svg path[fill="#38424c"]{fill: #fff;}
.youtube:hover svg path[fill="#fff"]{fill:red;}
.tiktok:hover svg path[fill="#38424c"]{fill: #000;}
.newsletter:hover svg path[fill="#38424c"]{fill: #000;}
</style></div><div data-content-type="text" data-appearance="default" data-element="main">
<p><strong>Suivez nous sur</strong></p></div><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-background-lazy-load="false" data-element="main" data-pb-style="TF7X1AE"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="H403ISM"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-background-lazy-load="false" data-element="main" data-pb-style="JW4Y5JC"><div data-content-type="html" data-appearance="default" data-element="main" data-pb-style="XGR3PCL" data-decoded="true"><figure data-content-type="image" data-appearance="full-width ok" data-element="main">
<span data-atc="aHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3d1cnRobW9keWYv" class="atc" data-target="_blank">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/fb-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/fb-icon.jpg" alt="Facebook" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/fb-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/fb-icon.jpg" alt="Facebook" data-element="mobile_image" loading="lazy"></picture>
</span>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<span data-atc="aHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2NvbXBhbnkvd3VydGhtb2R5Zi1mcmFuY2Uv" class="atc" data-target="_blank">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/linked-in.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/linked-in.jpg" alt="LinkedIn" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/linked-in.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/linked-in.jpg" alt="LinkedIn" data-element="mobile_image" loading="lazy"></picture>
</span>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<span data-atc="aHR0cHM6Ly93d3cuaW5zdGFncmFtLmNvbS93dXJ0aG1vZHlmX2ZyYW5jZS8=" class="atc" data-target="_blank">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/insta-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/insta-icon.jpg" alt="Instagram" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/insta-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/insta-icon.jpg" alt="Instagram" data-element="mobile_image" loading="lazy"></picture>
</span>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<span data-atc="aHR0cHM6Ly93d3cueW91dHViZS5jb20vdXNlci9XVVJUSE1PRFlG" class="atc" data-target="_blank">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/youtube-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/youtube-icon.jpg" alt="Youtube" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/youtube-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/youtube-icon.jpg" alt="Youtube" data-element="mobile_image" loading="lazy"></picture>
</span>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<span data-atc="aHR0cHM6Ly93d3cudGlrdG9rLmNvbS9Ad3VydGhtb2R5Zl9mcmFuY2U=" class="atc" data-target="_blank">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/tiktok.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/FR/tiktok.jpg" alt="TikTok" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/FR/tiktok.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/FR/tiktok.jpg" alt="TikTok" data-element="mobile_image" loading="lazy"></picture>
</span>
</figure>
<figure data-content-type="image" data-appearance="full-width" data-element="main">
<span data-atc="L25ld3NsZXR0ZXI=" class="atc" data-target="_blank">
<picture class="mfwebp"> <source data-element="desktop_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/mail-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-hidden" src="https://www.modyf.fr/media/cms/mail-icon.jpg" alt="Newsletter" data-element="desktop_image" loading="lazy"></picture>
<picture class="mfwebp"> <source data-element="mobile_image" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/jpg/media/cms/mail-icon.webp"> <img data-webpconverted="1" class="pagebuilder-mobile-only" src="https://www.modyf.fr/media/cms/mail-icon.jpg" alt="Newsletter" data-element="mobile_image" loading="lazy"></picture>
</span>
</figure></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><span data-atc="aHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3d1cnRobW9keWYv" class="atc facebook" data-target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 48 48"><path fill="#38424c" d="M0 0h48v48H0z"/><path fill="#fff" d="M40 24c0-8.836-7.164-16-16-16S8 15.164 8 24c0 7.504 5.166 13.8 12.135 15.529v-10.64h-3.3V24h3.3v-2.107c0-5.446 2.464-7.97 7.81-7.97 1.014 0 2.763.199 3.479.398v4.432c-.378-.04-1.034-.06-1.849-.06-2.623 0-3.637.994-3.637 3.578v1.73h5.226l-.898 4.889h-4.328v10.993C33.86 38.926 40 32.18 40 24"/><path fill="#38424c" d="m30.267 28.89.897-4.89h-5.226v-1.73c0-2.583 1.014-3.577 3.637-3.577.815 0 1.471.02 1.849.06v-4.432c-.716-.199-2.465-.398-3.478-.398-5.347 0-7.812 2.524-7.812 7.97V24h-3.299v4.89h3.3v10.639a16 16 0 0 0 5.803.354V28.889z"/></svg>
</span>
<span data-atc="aHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2NvbXBhbnkvd3VydGhtb2R5Zi1mcmFuY2Uv" class="atc linkedin" data-target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 48 48" fill="none"><path fill="#38424c" d="M0 0h48v48H0z"/><path fill="#fff" fill-rule="evenodd" d="M38 38h-5.753v-9.799c0-2.686-1.02-4.188-3.147-4.188-2.314 0-3.522 1.563-3.522 4.188v9.8h-5.545V19.332h5.545v2.515s1.667-3.085 5.628-3.085c3.96 0 6.794 2.418 6.794 7.418zM13.42 16.89c-1.89 0-3.42-1.544-3.42-3.447 0-1.9 1.53-3.443 3.419-3.443 1.888 0 3.418 1.542 3.418 3.444 0 1.903-1.53 3.445-3.418 3.445ZM10.556 38h5.781V19.333h-5.781z" clip-rule="evenodd"/></svg>
</span>
<span data-atc="aHR0cHM6Ly93d3cuaW5zdGFncmFtLmNvbS93dXJ0aG1vZHlmX2ZyYW5jZS8=" class="atc instagram" data-target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 48 48"><g clip-path="url(#clip0_3819_11465)"><path fill="#38424c" d="M0 0h48v48H0z"/><path fill="url(#paint0_radial_3819_11465)" d="M23.51-4c-11.9 0-15.38.012-16.055.068-2.442.203-3.962.588-5.617 1.412A11.4 11.4 0 0 0-1.437-.122c-1.808 1.878-2.904 4.188-3.3 6.934-.194 1.333-.25 1.605-.261 8.414-.004 2.27 0 5.256 0 9.263 0 11.892.013 15.37.07 16.044.197 2.377.57 3.872 1.36 5.508 1.507 3.13 4.387 5.481 7.78 6.358 1.175.303 2.473.47 4.139.548.705.031 7.9.053 15.097.053 7.199 0 14.397-.009 15.085-.044 1.929-.09 3.049-.241 4.287-.561a11.93 11.93 0 0 0 7.782-6.372c.773-1.596 1.166-3.148 1.343-5.4.039-.492.055-8.322.055-16.142s-.017-15.637-.056-16.128c-.18-2.289-.572-3.828-1.37-5.455a11.3 11.3 0 0 0-2.44-3.343c-1.886-1.801-4.192-2.897-6.94-3.294-1.331-.192-1.596-.25-8.409-.261z"/><path fill="url(#paint1_radial_3819_11465)" d="M23.51-4c-11.9 0-15.38.012-16.055.068-2.442.203-3.962.588-5.617 1.412A11.4 11.4 0 0 0-1.437-.122c-1.808 1.878-2.904 4.188-3.3 6.934-.194 1.333-.25 1.605-.261 8.414-.004 2.27 0 5.256 0 9.263 0 11.892.013 15.37.07 16.044.197 2.377.57 3.872 1.36 5.508 1.507 3.13 4.387 5.481 7.78 6.358 1.175.303 2.473.47 4.139.548.705.031 7.9.053 15.097.053 7.199 0 14.397-.009 15.085-.044 1.929-.09 3.049-.241 4.287-.561a11.93 11.93 0 0 0 7.782-6.372c.773-1.596 1.166-3.148 1.343-5.4.039-.492.055-8.322.055-16.142s-.017-15.637-.056-16.128c-.18-2.289-.572-3.828-1.37-5.455a11.3 11.3 0 0 0-2.44-3.343c-1.886-1.801-4.192-2.897-6.94-3.294-1.331-.192-1.596-.25-8.409-.261z"/><path fill="url(#paint2_radial_3819_11465)" d="M23.51-4c-11.9 0-15.38.012-16.055.068-2.442.203-3.962.588-5.617 1.412A11.4 11.4 0 0 0-1.437-.122c-1.808 1.878-2.904 4.188-3.3 6.934-.194 1.333-.25 1.605-.261 8.414-.004 2.27 0 5.256 0 9.263 0 11.892.013 15.37.07 16.044.197 2.377.57 3.872 1.36 5.508 1.507 3.13 4.387 5.481 7.78 6.358 1.175.303 2.473.47 4.139.548.705.031 7.9.053 15.097.053 7.199 0 14.397-.009 15.085-.044 1.929-.09 3.049-.241 4.287-.561a11.93 11.93 0 0 0 7.782-6.372c.773-1.596 1.166-3.148 1.343-5.4.039-.492.055-8.322.055-16.142s-.017-15.637-.056-16.128c-.18-2.289-.572-3.828-1.37-5.455a11.3 11.3 0 0 0-2.44-3.343c-1.886-1.801-4.192-2.897-6.94-3.294-1.331-.192-1.596-.25-8.409-.261z"/><path fill="url(#paint3_radial_3819_11465)" d="M23.51-4c-11.9 0-15.38.012-16.055.068-2.442.203-3.962.588-5.617 1.412A11.4 11.4 0 0 0-1.437-.122c-1.808 1.878-2.904 4.188-3.3 6.934-.194 1.333-.25 1.605-.261 8.414-.004 2.27 0 5.256 0 9.263 0 11.892.013 15.37.07 16.044.197 2.377.57 3.872 1.36 5.508 1.507 3.13 4.387 5.481 7.78 6.358 1.175.303 2.473.47 4.139.548.705.031 7.9.053 15.097.053 7.199 0 14.397-.009 15.085-.044 1.929-.09 3.049-.241 4.287-.561a11.93 11.93 0 0 0 7.782-6.372c.773-1.596 1.166-3.148 1.343-5.4.039-.492.055-8.322.055-16.142s-.017-15.637-.056-16.128c-.18-2.289-.572-3.828-1.37-5.455a11.3 11.3 0 0 0-2.44-3.343c-1.886-1.801-4.192-2.897-6.94-3.294-1.331-.192-1.596-.25-8.409-.261z"/><path fill="#38424c" d="M0 0h48v48H0z"/><path fill="#fff" d="M24 10.063c4.539 0 5.077.018 6.87.1 1.657.075 2.557.352 3.156.585a5.3 5.3 0 0 1 1.955 1.271 5.3 5.3 0 0 1 1.271 1.955c.233.599.51 1.5.586 3.157.082 1.792.099 2.33.099 6.87 0 4.539-.017 5.076-.1 6.869-.075 1.657-.352 2.558-.585 3.157a5.63 5.63 0 0 1-3.226 3.226c-.599.233-1.5.51-3.157.585-1.792.082-2.33.1-6.87.1-4.539 0-5.076-.018-6.869-.1-1.657-.075-2.557-.352-3.156-.585a5.3 5.3 0 0 1-1.955-1.272 5.3 5.3 0 0 1-1.272-1.954c-.233-.6-.51-1.5-.585-3.157-.082-1.793-.1-2.33-.1-6.87s.018-5.077.1-6.87c.075-1.657.352-2.557.585-3.156a5.3 5.3 0 0 1 1.272-1.955 5.26 5.26 0 0 1 1.955-1.271c.599-.233 1.499-.51 3.156-.586 1.793-.082 2.33-.099 6.87-.099M24 7c-4.617 0-5.196.02-7.01.102-1.809.083-3.044.37-4.126.79a8.3 8.3 0 0 0-3.01 1.961 8.3 8.3 0 0 0-1.962 3.011c-.42 1.082-.707 2.317-.79 4.127C7.02 18.804 7 19.383 7 24.001c0 4.616.02 5.195.102 7.008.083 1.81.37 3.045.79 4.127a8.3 8.3 0 0 0 1.961 3.01 8.3 8.3 0 0 0 3.012 1.962c1.08.42 2.317.707 4.126.79 1.813.082 2.392.102 7.01.102 4.616 0 5.195-.02 7.008-.102 1.81-.083 3.045-.37 4.127-.79a8.7 8.7 0 0 0 4.972-4.972c.42-1.082.707-2.317.79-4.127C40.98 29.196 41 28.617 41 24s-.02-5.196-.102-7.009c-.083-1.81-.37-3.045-.79-4.127a8.3 8.3 0 0 0-1.961-3.01 8.3 8.3 0 0 0-3.011-1.962c-1.082-.42-2.318-.707-4.127-.79C29.196 7.02 28.617 7 23.999 7z"/><path fill="#fff" d="M24 15.27a8.73 8.73 0 1 0 0 17.46 8.73 8.73 0 0 0 0-17.46m0 14.397a5.667 5.667 0 1 1 0-11.333 5.667 5.667 0 0 1 0 11.333m9.074-12.702a2.04 2.04 0 1 0 0-4.08 2.04 2.04 0 0 0 0 4.08"/></g><defs><radialgradient id="paint0_radial_3819_11465" cx="0" cy="0" r="1" gradienttransform="rotate(164.25 23.509 14.827)scale(36.41972 26.23872)" gradientunits="userSpaceOnUse"><stop stop-color="#ff005f"/><stop offset="1" stop-color="#fc01d8"/></radialgradient><radialgradient id="paint1_radial_3819_11465" cx="0" cy="0" r="1" gradienttransform="matrix(0 -45.4985 48.2729 0 10.14 57.39)" gradientunits="userSpaceOnUse"><stop stop-color="#fc0"/><stop offset=".124" stop-color="#fc0"/><stop offset=".567" stop-color="#fe4a05"/><stop offset=".694" stop-color="#ff0f3f"/><stop offset="1" stop-color="#fe0657" stop-opacity="0"/></radialgradient><radialgradient id="paint2_radial_3819_11465" cx="0" cy="0" r="1" gradienttransform="rotate(-59.87 57.792 4.442)scale(18.81403 24.49374)" gradientunits="userSpaceOnUse"><stop stop-color="#fc0"/><stop offset="1" stop-color="#fc0" stop-opacity="0"/></radialgradient><radialgradient id="paint3_radial_3819_11465" cx="0" cy="0" r="1" gradienttransform="matrix(-34.6676 9.76182 -3.32499 -11.8115 2.734 -1.679)" gradientunits="userSpaceOnUse"><stop stop-color="#780cff"/><stop offset="1" stop-color="#820bff" stop-opacity="0"/></radialgradient><clippath id="clip0_3819_11465"><path fill="#fff" d="M0 0h48v48H0z"/></clippath></defs></svg>
</span>
<span data-atc="aHR0cHM6Ly93d3cueW91dHViZS5jb20vdXNlci9XVVJUSE1PRFlG" class="atc youtube" data-target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 48 48" fill="none"><path fill="#38424c" d="M0 0h48v48H0z"/><g clip-path="url(#a)"><path fill="#fff" d="M23.706 13.003s-9.832 0-12.29.647a4.02 4.02 0 0 0-2.77 2.795C8 18.903 8 24 8 24s0 5.123.647 7.555a3.94 3.94 0 0 0 2.769 2.77c2.484.672 12.29.672 12.29.672s9.832 0 12.29-.647a3.94 3.94 0 0 0 2.77-2.769c.646-2.458.646-7.555.646-7.555s.026-5.123-.646-7.581a3.94 3.94 0 0 0-2.77-2.77c-2.458-.672-12.29-.672-12.29-.672m-3.13 6.288 8.175 4.71-8.176 4.708z"/></g><defs><clippath id="a"><path fill="#fff" d="M8 13.003h31.412v21.994H8z"/></clippath></defs></svg>
</span>
<span data-atc="aHR0cHM6Ly93d3cudGlrdG9rLmNvbS9Ad3VydGhtb2R5Zl9mcmFuY2U=" class="atc tiktok" data-target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 48 48" fill="none"><path fill="#38424c" d="M0 0h48v48H0z"/><path fill="#fff" d="M34.34 13.831a8.02 8.02 0 0 1-3.643-6.704h-5.75l-.01 23.045a4.836 4.836 0 0 1-4.824 4.652 4.8 4.8 0 0 1-2.241-.556 4.84 4.84 0 0 1-2.592-4.278 4.84 4.84 0 0 1 4.833-4.833c.498 0 .975.081 1.427.223v-5.87a11 11 0 0 0-1.427-.104c-5.835 0-10.583 4.749-10.583 10.584 0 3.581 1.789 6.75 4.518 8.666a10.5 10.5 0 0 0 6.065 1.917c5.836 0 10.585-4.747 10.585-10.584V18.304a13.68 13.68 0 0 0 8 2.572v-5.75a7.95 7.95 0 0 1-4.356-1.296z"/></svg>
</span>
<span data-atc="L25ld3NsZXR0ZXI=" class="atc newsletter" data-target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 48 48" fill="none"><path fill="#38424c" d="M0 0h48v48H0z"/><path stroke="#fff" stroke-width="3" d="m11 15 13 10.634L37 15"/><path stroke="#fff" stroke-width="3" d="M10.5 14.5h27v19h-27z"/></svg>
</span></div></div></div></div></div></div><style>#html-body [data-pb-style=JORVO0D],#html-body [data-pb-style=JSHMH7T]{background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=JORVO0D]{justify-content:flex-start;display:flex;flex-direction:column}#html-body [data-pb-style=JSHMH7T]{align-self:stretch}#html-body [data-pb-style=QB1XQ0F]{display:flex;width:100%}#html-body [data-pb-style=FS3FUKD],#html-body [data-pb-style=GLC9A9P],#html-body [data-pb-style=SJ5U4DX]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll;width:33.3333%;align-self:stretch}</style><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>
.footer-awards .pagebuilder-column-line{justify-content: space-evenly;}
.footer-awards .pagebuilder-column-group .pagebuilder-column{width: auto!important;}
</style></div><div class="footer-awards" data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="JORVO0D"><div class="pagebuilder-column-group" data-background-images="{}" data-content-type="column-group" data-appearance="default" data-grid-size="12" data-element="main" data-pb-style="JSHMH7T"><div class="pagebuilder-column-line" data-content-type="column-line" data-element="main" data-pb-style="QB1XQ0F"><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="FS3FUKD"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><p><strong>Vos avis comptent pour nous</strong></p>
<div class="av" id="6abee2f1-8860-4b12-aba9-c25a646ad6e0"></div>
<style>.av a{ margin: 0 auto;}</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
const footer = document.querySelector('footer .footer-awards');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadReviewsScript();
observer.unobserve(footer);
}
});
}, {
rootMargin: "200px"
});
observer.observe(footer);
function loadReviewsScript() {
const script = document.createElement('script');
script.src = "https://widgets.rr.skeepers.io/generated/d64d94ac-97ac-7644-ed36-bdd0132cd0fb/6abee2f1-8860-4b12-aba9-c25a646ad6e0.js";
script.async = true;
document.body.appendChild(script);
}
});
</script></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="GLC9A9P"><div data-content-type="text" data-appearance="default" data-element="main"><p><strong>Médaillé de platine par Ecovadis</strong></p>
<p><a tabindex="0" href="https://recognition.ecovadis.com/Bmh4CcrNAEuSOsCz8_IptA" target="_blank" rel="noopener"><img class="css-fpzrtp" style="color: transparent; width: 200px; height: 200px;" src="https://assets.ecovadis-survey.com/csr-recognition/26E6FB9A41B8C3839EBCC3EB99EA76492ABFA0CF71316FA0C92DC8ED9BE696D0.svg" alt="Médaille de platine pour être parmi les 1 % des entreprises les mieux évaluées par EcoVadis. Valable jusqu’en janvier 2027." width="200" height="200" loading="lazy" data-testid="recognition-image" data-nimg="1"></a></p></div></div><div class="pagebuilder-column" data-content-type="column" data-appearance="full-height" data-background-images="{}" data-element="main" data-pb-style="SJ5U4DX"><div data-content-type="text" data-appearance="default" data-element="main"><p><strong>Labellisé en RSE</strong></p>
<p><a href="https://www.modyf.fr/documents/pdf/certificat-LUCIE-26000.pdf" target="_blank"><picture class="mfwebp"> <source id="TL4ANBD" loading="lazy" type="image/webp" srcset="https://www.modyf.fr/media/mf_webp/png/media/FR/Logo_LUCIE_26000_-_Couleur-2.webp"> <img data-webpconverted="1" id="TL4ANBD" src="https://www.modyf.fr/media/FR/Logo_LUCIE_26000_-_Couleur-2.png" alt="Logo LUCIE 26000 - Label RSE" loading="lazy"></picture></a></p></div></div></div></div></div> </div><style>#html-body [data-pb-style=XOV02UB]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div class="footer-seo" data-content-type="row" data-appearance="full-width" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-element="main" data-pb-style="XOV02UB"><div class="row-full-width-inner" data-element="inner"><div data-content-type="text" data-appearance="default" data-element="main"></div></div></div><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style>.footer-seo .row-full-width-inner{display:none;} li.level-0{margin-bottom:0;}</style></div></footer> <script>
function dataServicesShoppingCartContextData() {
return {
initContext() {
const cartData = this.$event.detail.data.cart;
let contextCartItems = [];
if (cartData && cartData.items) {
cartData.items.forEach(function (item) {
contextCartItems.push({
id: item.item_id,
formattedPrice: parseFloat(item.product_price_value ? item.product_price_value : 0),
quantity: item.qty,
product: {
productType: item.product_type,
productId: item.product_id,
name: item.product_name,
sku: item.product_sku,
mainImageUrl: item.product_image.src
},
prices: {
price: {
value: parseFloat(item.product_price_value ? item.product_price_value : 0)
}
}
});
});
magentoStorefrontEvents.context.setShoppingCart({
id: cartData.dsCartId,
totalQuantity: cartData.summary_count,
prices: {
subtotalExcludingTax: {
value: parseFloat(cartData.subtotalAmountExclTax ? cartData.subtotalAmountExclTax : 0)
},
subtotalIncludingTax: {
value: parseFloat(cartData.subtotalAmount ? cartData.subtotalAmount : 0)
}
},
items: contextCartItems,
possibleOnepageCheckout: cartData.possible_onepage_checkout,
giftMessageSelected : false,
giftWrappingSelected : false
});
}
localStorage.setItem("ds-cart", JSON.stringify({
cart: {
items: cartData.items
}
}));
window.dispatchEvent(new Event("shoppingCartContextSet"));
}
}
}
window.addEventListener('alpine:init', () => Alpine.data('dataServicesShoppingCartContextData', dataServicesShoppingCartContextData), {once: true});</script> <div x-data="dataServicesShoppingCartContextData" @private-content-loaded.window="initContext"></div> <script type="text/x-magento-init">
{
"*": {
"Modyf_Theme/js/atob-links": {}
}
}</script> <script type="text/x-magento-init">
{
"*": {
"Modyf_Theme/js/vat-number-prefix": {
"vatInputSelectorNL": "input.validate-company-vat_number-nl",
"vatInputSelectorBE": "input.validate-company-vat_number-be"
}
}
}</script> <script>
let SnapSlider = class {
constructor(el, {
labelSepparator = 'de',
autoPager,
groupPager
} = {}) {
this.el = el;
this.track = this.el.querySelector("[data-track]");
if (!this.track) {
console.warn(
"No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track",
this.el
);
return;
}
this.initialLoad = true;
this.slides = [];
this.inViewObserver;
this.mutationObserver;
this.resizeObserver;
this.pager = this.el.querySelector("[data-pager]");
this.navBtns = Array.from(
this.el.querySelectorAll("[data-next], [data-prev]")
);
this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator;
this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false;
this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false;
this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
this.sliderId = this.el.id || this.sliderLabel || "slider";
this.markerIdName = "data-target-id";
this.pagerClasses = this.el.dataset.pagerClass || "snap-pager";
this.markerClasses = this.el.dataset.markerClass || "snap-marker";
this.init();
}
init() {
this.setupSlides();
this.setupNav();
if (this.useAutoPager) {
this.createPager();
} else {
this.setupPager();
}
this.setupObservers();
this.setupMutationObserver();
this.setupResizeObserver();
this.el.addEventListener("click", this.eventHandler.bind(this));
this.el.addEventListener("keydown", this.eventHandler.bind(this));
}
destroy() {
this.inViewObserver?.disconnect();
this.mutationObserver?.disconnect();
this.resizeObserver?.disconnect();
this.el.removeEventListener("click", this.eventHandler.bind(this));
this.el.removeEventListener("keydown", this.eventHandler.bind(this));
}
roundUpIfGreaterThan(number, min = 8) {
const decimalPart = number - Math.floor(number);
return decimalPart >= min ? Math.ceil(number) : Math.floor(number);
}
getInViewItems() {
const inViewSlides = this.track.querySelectorAll("[data-in-view]");
const firstInViewSlide = inViewSlides[0] || null;
const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null;
const isAtStart = firstInViewSlide === this.slides[0];
const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1];
return {
inViewSlides,
totalInViewSlides: inViewSlides.length,
firstInViewSlide,
lastInViewSlide,
isAtStart,
isAtEnd,
hasNoOverflow: isAtStart && isAtEnd
};
}
groupPagerMarkers() {
if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return;
const totalVisibleSlides = this.roundUpIfGreaterThan(
this.track.offsetWidth / this.slides[0].offsetWidth
);
const markers = Array.from(this.pager.querySelectorAll("a, button"));
markers.forEach((marker, index) => {
marker.style.display = index % totalVisibleSlides === 0 ? null : "none";
});
}
handleInView(entries) {
entries.forEach((entry) => {
const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector(
`[${this.markerIdName}="${entry.target.id}"]`
));
entry.target.toggleAttribute("data-in-view", entry.isIntersecting);
entry.target.toggleAttribute("inert", !entry.isIntersecting);
marker?.setAttribute("aria-current", entry.isIntersecting);
marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1");
});
const {
isAtStart,
isAtEnd,
hasNoOverflow
} = this.getInViewItems();
this.navBtns.forEach((btn) => {
if (btn.hasAttribute("data-next")) {
btn.style.visibility = hasNoOverflow ? "hidden" : null;
isAtEnd ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
}
if (btn.hasAttribute("data-prev")) {
btn.style.visibility = hasNoOverflow ? "hidden" : null;
isAtStart ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
}
});
if (this.pager) {
this.pager.style.visibility = hasNoOverflow ? "hidden" : null;
}
if (!this.initialLoad) {
this.el.dispatchEvent(
new CustomEvent("slideChange", {
detail: this.getInViewItems()
})
);
} else {
this.initialLoad = false;
}
if (document.activeElement.parentElement.hasAttribute("data-pager")) {
const activeItems = this.pager.querySelectorAll('[tabindex="0"]');
if (activeItems.length) {
activeItems[0].focus({ preventScroll: true });
}
}
}
getSlides() {
if (!this.track) return [];
return Array.from(this.track.children).filter(
(child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script"
);
}
refreshSlides() {
this.initialLoad = true;
this.slides = this.getSlides();
this.setupSlides();
if (this.useAutoPager) {
this.createPager();
} else {
this.setupPager();
}
this.groupPagerMarkers();
this.setupObservers();
}
setupSlides() {
this.slides = this.getSlides();
this.slides.forEach((slide, index) => {
const totalSlides = this.slides.length;
const currentSlide = index + 1;
const existingLabel = slide.getAttribute("aria-label") || "";
const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture";
const slideLabelTag = isImage ? "alt" : "aria-label";
const hasAutoLabel = existingLabel.startsWith(
`${currentSlide} ${this.slideLabelSepparator} `
);
if (!slide.hasAttribute("id")) {
slide.setAttribute(
"id",
`${this.sliderId}-item-${currentSlide}`
);
}
if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) {
slide.setAttribute(
slideLabelTag,
`${currentSlide} ${this.slideLabelSepparator} ${totalSlides}`
);
}
if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) {
slide.setAttribute("role", "group");
}
if (this.pager && !isImage) {
slide.setAttribute("role", "tabpanel");
}
if (slide.getAttribute("role") === "group") {
slide.setAttribute("aria-roledescription", "item");
}
});
if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") {
this.el.setAttribute("role", "region");
}
if (!this.el.hasAttribute("aria-roledescription")) {
this.el.setAttribute("aria-roledescription", "carousel");
}
this.track.setAttribute("tabindex", 0);
this.track.setAttribute("aria-live", "polite");
}
setupNav() {
this.navBtns.forEach((btn) => {
btn.setAttribute("disabled", "");
btn.removeAttribute("hidden");
btn.classList.remove("invisible");
btn.style.visibility = null;
});
}
createPager() {
const newPager = document.createElement("nav");
newPager.setAttribute("data-pager", "");
newPager.setAttribute("role", "tablist");
newPager.classList.add(...this.pagerClasses.split(" "));
this.slides.forEach((slide, index) => {
const marker = document.createElement("button");
const slideId = slide.id || `${this.sliderId}-item-${index + 1}`;
marker.setAttribute(this.markerIdName, slideId);
marker.classList.add(...this.markerClasses.split(" "));
this.setupPagerMarker(marker, index);
newPager.appendChild(marker);
if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") {
slide.removeAttribute("aria-roledescription");
slide.setAttribute("role", "tabpanel");
}
});
if (this.pager) {
this.pager.setAttribute("role", "tablist");
this.pager.replaceChildren(...newPager.children);
} else {
this.track.after(newPager);
this.pager = this.el.querySelector("[data-pager]");
}
}
setupPager() {
if (!this.pager) return;
this.pager.setAttribute("role", "tablist");
const items = Array.from(this.pager.querySelectorAll("a, button"));
items.forEach((marker, index) => this.setupPagerMarker(marker, index));
}
setupPagerMarker(marker, index) {
const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
const slideId = markerId || `${this.sliderId}-item-${index + 1}`;
if (!markerId) {
marker.setAttribute(this.markerIdName, slideId);
}
marker.setAttribute("role", "tab");
marker.setAttribute("aria-controls", slideId);
marker.setAttribute("aria-posinset", index + 1);
marker.setAttribute("aria-setsize", this.slides.length);
marker.setAttribute("tabindex", "-1");
if (!marker.hasAttribute("aria-label")) {
marker.setAttribute("aria-label", `Slide ${index + 1}`);
}
}
setupObservers() {
if (this.inViewObserver) {
this.inViewObserver.disconnect();
}
this.inViewObserver = new IntersectionObserver(
this.handleInView.bind(this), {
root: this.track,
threshold: 0.8
}
);
this.slides.forEach((slide) => this.inViewObserver.observe(slide));
}
setupMutationObserver() {
this.mutationObserver = new MutationObserver(
this.refreshSlides.bind(this)
);
this.mutationObserver.observe(this.track, {
childList: true,
subtree: false
});
}
setupResizeObserver() {
this.resizeObserver = new ResizeObserver(
this.groupPagerMarkers.bind(this)
);
this.resizeObserver.observe(this.el);
}
goToSlideDir(dir = "next") {
const {
firstInViewSlide,
lastInViewSlide
} = this.getInViewItems();
const isPrev = dir === "prev";
let targetSlide = isPrev ? firstInViewSlide?.previousElementSibling : lastInViewSlide?.nextElementSibling;
if (!targetSlide) return;
if (targetSlide.tagName.toLowerCase() === "template") {
targetSlide = isPrev ? targetSlide?.previousElementSibling : targetSlide?.nextElementSibling;
}
targetSlide.scrollIntoView({ block: "nearest", inline: isPrev ? "end" : "start" });
}
pagerToSlide(event) {
if (!event.target.closest("[data-pager]")) return;
const marker = event.target.closest("a, button");
if (!marker) return;
event.preventDefault();
const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
const targetSlide = this.track.querySelector(`#${slideId}`);
targetSlide?.scrollIntoView({ block: "nearest", inline: "start" });
}
eventHandler(event) {
const target = event.target.closest(
"[data-next], [data-prev], [data-pager]"
);
if (!target) return;
if (event.type === "click") {
if (target.hasAttribute("data-next")) {
this.goToSlideDir("next");
} else if (target.hasAttribute("data-prev")) {
this.goToSlideDir("prev");
} else if (target.closest("[data-pager]")) {
this.pagerToSlide(event);
}
}
if (event.type === "keydown" && target.closest("[data-pager]")) {
if (event.key === "ArrowRight") {
this.goToSlideDir("next");
} else if (event.key === "ArrowLeft") {
this.goToSlideDir("prev");
}
}
}
};
(() => {
function alpineSnapSlider(Alpine) {
Alpine.directive("snap-slider", (el, {
modifiers
}, {
cleanup
}) => {
const autoPager = modifiers.includes("auto-pager");
const groupPager = modifiers.includes("group-pager");
const slider = new SnapSlider(el, {
autoPager,
groupPager
});
cleanup(() => {
slider.destroy();
});
});
}
document.addEventListener("alpine:init", () => {
window.Alpine.plugin(alpineSnapSlider);
});
})();</script> <script>
(() => {
function dialog_default(Alpine) {
Alpine.directive("htmldialog", fylgjaAlpineDialog);
function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) {
const evaluate = expression.length ? evaluateLater(expression) : () => {};
const canEvaluate = expression.length > 0;
const lockPageScroll = modifiers.includes("noscroll");
const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest");
el.style.display = null;
el.style.length === 0 && el.removeAttribute("style");
if (el._x_isShown) {
open();
}
const closeBySupported = (() => {
return "closedBy" in HTMLDialogElement.prototype;
})();
function scrollLock(use = true) {
document.body.style.overflow = use ? "hidden" : "";
}
function dialogSubmit(event) {
if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") {
event.preventDefault();
evaluate();
}
}
function escapeDialog(event) {
if (event.key !== "Escape") return;
event.preventDefault();
if (closeBy === "none") return;
evaluate();
}
function handleCloseByEvent(event) {
if (event.target !== el) return;
const rect = el.getBoundingClientRect();
const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width;
if (!isInDialog) {
if (closeBy === "any") {
if (closeBySupported) {
event.preventDefault();
}
evaluate();
}
}
}
function handleCloseEvent() {
evaluate();
}
function open() {
if (el.hasAttribute("open")) return;
el.showModal();
scrollLock(lockPageScroll);
}
function close() {
if (!el.hasAttribute("open")) return;
el.close();
scrollLock(false);
}
el._x_doShow = () => open();
el._x_doHide = () => close();
el.addEventListener("keydown", escapeDialog);
el.addEventListener("submit", dialogSubmit);
el.addEventListener("click", handleCloseByEvent);
el.addEventListener("cancel", handleCloseEvent);
cleanup(() => {
el.removeEventListener("keydown", escapeDialog);
el.removeEventListener("submit", dialogSubmit);
el.removeEventListener("click", handleCloseByEvent);
el.removeEventListener("cancel", handleCloseEvent);
scrollLock(false);
});
}
}
function modifierValue(modifiers, key, fallback) {
if (modifiers.indexOf(key) === -1) return fallback;
const rawValue = modifiers[modifiers.indexOf(key) + 1];
if (!rawValue) return fallback;
if (key === "closeby") {
const allowedValues = ["auto", "none", "closerequest", "any"];
const options = allowedValues.join(", ");
if (!allowedValues.includes(rawValue)) {
console.warn(
`"${rawValue}" is not one of the allowed values for closeby: ${options}`
);
return fallback;
}
}
return rawValue;
}
document.addEventListener("alpine:init", () => {
window.Alpine.plugin(dialog_default);
});
})();</script> <script>
(() => {
function src_default(Alpine) {
Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {
let evaluate = evaluateLater(expression);
let options = {
rootMargin: getRootMargin(modifiers),
threshold: getThreshold(modifiers)
};
let observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting === (value === "leave"))
return;
evaluate();
modifiers.includes("once") && observer.disconnect();
});
}, options);
observer.observe(el);
cleanup(() => {
observer.disconnect();
});
}));
}
function getThreshold(modifiers) {
if (modifiers.includes("full"))
return 0.99;
if (modifiers.includes("half"))
return 0.5;
if (!modifiers.includes("threshold"))
return 0;
let threshold = modifiers[modifiers.indexOf("threshold") + 1];
if (threshold === "100")
return 1;
if (threshold === "0")
return 0;
return Number(`.${threshold}`);
}
function getLengthValue(rawValue) {
let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/);
return match ? match[1] + (match[2] || "px") : void 0;
}
function getRootMargin(modifiers) {
const key = "margin";
const fallback = "0px 0px 0px 0px";
const index = modifiers.indexOf(key);
if (index === -1)
return fallback;
let values = [];
for (let i = 1; i < 5; i++) {
values.push(getLengthValue(modifiers[index + i] || ""));
}
values = values.filter((v) => v !== void 0);
return values.length ? values.join(" ").trim() : fallback;
}
document.addEventListener("alpine:init", () => {
window.Alpine.plugin(src_default);
});
})();</script> <script>
for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]:not([x-data] [x-data])":"intersect",".product-info [x-data]:not([x-data] [x-data])":"intersect","#filters-content [x-data]:not([x-data] [x-data])":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]:not([x-data] [x-data])":"intersect","#notice-cookie-block":"idle"})) {
document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`));
}</script> <script>
(function () {
"use strict";
const hasAlpine = new Promise(resolve => {
window.addEventListener('alpine:initialized', resolve, {once: true, passive: true});
});
const hasInteract = new Promise(resolve => {
(events => {
const onInteract = () => {
resolve();
events.forEach(type => window.removeEventListener(type, onInteract));
}
events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true}))
})(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown'])
});
const onIntersect = (el) => {
return new Promise(resolve => {
const observer = new IntersectionObserver(entries => {
for (const entry of entries) {
if (entry.isIntersecting) {
observer.disconnect()
resolve();
}
}
}, {});
observer.observe(el);
});
}
function runComponent(el) {
hasAlpine.then(() => {
el.removeAttribute('x-ignore');
queueMicrotask(() => Alpine.initTree(el));
});
}
function initDeferredComponents() {
document.querySelectorAll('[x-data][x-defer]').forEach(el => {
el.setAttribute('x-ignore', '');
const deferUntil = (el.getAttribute('x-defer') || '').trim();
switch (deferUntil) {
case 'interact':
hasInteract.then(() => runComponent(el));
break;
case 'intersect':
onIntersect(el).then(() => runComponent(el))
break;
case 'idle':
window.requestIdleCallback
? window.requestIdleCallback(() => runComponent(el), {timeout: 4000})
: setTimeout(() => runComponent(el), 4000);
break;
case 'eager':
runComponent(el);
break;
default:
if (deferUntil.startsWith('event:') && deferUntil.length > 6) {
window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true});
}
}
});
}
window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true});
})()</script> <script type="module"
src="https://www.modyf.fr/static/version1773297122/frontend/Modyf/hyva/fr_FR/Hyva_Theme/js/alpine3.min.js"
defer
crossorigin
></script> <script>
function dispatchMessages(messages, hideAfter) {
const messagesEvent = new CustomEvent("messages-loaded", {
detail: {
messages: messages,
hideAfter: hideAfter
}
});
window.dispatchEvent(messagesEvent);
}
if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
}
(function( hyva, undefined ) {
hyva.initFormKey = () => {
const inputSelector = 'input[name="form_key"]',
formKey = hyva.getFormKey();
Array.from(document.querySelectorAll(inputSelector)).map(function (input) {
input.value = formKey
});
}
hyva.initMessages = () => {
try {
const messages = hyva.getCookie('mage-messages');
window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : [];
dispatchMessages(window.mageMessages);
const skipSetDomain = true;
hyva.setCookie('mage-messages','', -1, skipSetDomain);
} catch (error) {
console.warn('Error parsing Cookie Messages:', error);
}
}
window.addEventListener('DOMContentLoaded', hyva.initFormKey);
hyva.alpineInitialized(hyva.initMessages)
}( window.hyva = window.hyva || {} ));</script> <script>
{
const private_content_key = 'mage-cache-storage';
const private_content_expire_key = 'mage-cache-timeout';
const private_content_version_key = 'private_content_version';
const section_data_ids_key = 'section_data_ids';
const mage_cache_session_id_key = 'mage-cache-sessid';
const last_visited_store_key = 'last_visited_store';
const ttl = 3600;
if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
}
function loadSectionData () {
const browserStorage = hyva.getBrowserStorage();
if (!browserStorage) {
typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
[{
type: "warning",
text: "Veuillez activer localStorage dans votre navigateur."
}]
);
return;
}
try {
let isInvalid = false;
if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) {
isInvalid = true;
}
hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false);
if (!hyva.getCookie(mage_cache_session_id_key)) {
isInvalid = true;
browserStorage.removeItem(private_content_key);
const skipSetDomain = true;
const days = false;
hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain)
}
const cookieVersion = hyva.getCookie(private_content_version_key);
const storageVersion = browserStorage.getItem(private_content_version_key);
if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) {
isInvalid = true;
}
const privateContentExpires = browserStorage.getItem(private_content_expire_key);
if (privateContentExpires && new Date(privateContentExpires) < new Date()) {
browserStorage.removeItem(private_content_key);
}
if (isInvalid && cookieVersion) {
fetchPrivateContent([]);
} else if (cookieVersion && storageVersion && cookieVersion === storageVersion) {
const privateContent = JSON.parse(browserStorage.getItem(private_content_key));
if (
privateContent &&
privateContentExpires &&
privateContent.cart &&
privateContent.customer
) {
dispatchPrivateContent(privateContent);
} else {
fetchPrivateContent([]);
}
} else {
if (document.getElementById('default-section-data')) {
const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim());
dispatchPrivateContent(privateContent);
} else {
dispatchPrivateContent({});
}
}
} catch (error) {
console.warn('Error retrieving Private Content:', error);
}
}
hyva.alpineInitialized(loadSectionData)
window.addEventListener('reload-customer-section-data', loadSectionData);
window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data);
function dispatchPrivateContent(data) {
const privateContentEvent = new CustomEvent("private-content-loaded", {
detail: {
data: window.processSectionDataBeforeDispatch(data)
}
});
window.dispatchEvent(privateContentEvent);
}
function fetchPrivateContent(sections) {
fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.ok && response.json())
.then(
data => {
if (data) {
try {
const browserStorage = hyva.getBrowserStorage();
const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {};
if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) {
delete oldSectionData['checkout-data'];
}
const newSectionData = Object.assign(oldSectionData, data);
dispatchPrivateContent(newSectionData);
if (newSectionData.messages && newSectionData.messages.messages ) {
newSectionData.messages.messages = [];
}
browserStorage.setItem(private_content_key, JSON.stringify(newSectionData));
const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString();
browserStorage.setItem(private_content_expire_key, expiresAt);
const newCookieVersion = hyva.getCookie(private_content_version_key);
browserStorage.setItem(private_content_version_key, newCookieVersion);
hyva.setCookie(
section_data_ids_key,
JSON.stringify(
Object.keys(data).reduce((sectionDataIds, sectionKey) => {
sectionDataIds[sectionKey] = data[sectionKey]['data_id'];
return sectionDataIds;
}, {})
),
false,
true
);
} catch (error) {
console.warn("Couldn't store privateContent", error);
}
}
}
);
}
}</script> <script>
(() => {
document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc()));
})()</script> <script>
(events => {
const dispatchUserInteractionEvent = () => {
events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent))
window.dispatchEvent(new Event('init-external-scripts'))
};
events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true}))
})(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown'])</script><script>
'use strict';
(() => {
const initCarousels = (elements) => {
if (!Glider) {
return;
}
const initProductCarousel = (carousel) => {
const gliderElement = carousel.querySelector('[data-role="glider-content"]');
if (!gliderElement) {
return;
}
const gliderDots = carousel.querySelector('.glider-dots');
const gliderPrev = carousel.querySelector('.glider-prev');
const gliderNext = carousel.querySelector('.glider-next');
const glider = new Glider(gliderElement, {
slidesToShow: 1,
slidesToScroll: 1,
scrollLock: true,
draggable: true,
dragVelocity: 2.5,
dots: gliderDots,
arrows: {
prev: gliderPrev,
next: gliderNext,
},
responsive: [
{
breakpoint: 640,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 1024,
settings: {
slidesToShow: 3,
slidesToScroll: 3,
}
},
{
breakpoint: 1280,
settings: {
slidesToShow: 4,
slidesToScroll: 4,
}
},
],
});
carousel.classList.remove('overflow-x-scroll');
gliderPrev.classList.remove('hidden');
gliderNext.classList.remove('hidden');
if (carousel.dataset.autoplay !== 'false') {
gliderAutoplay(
glider,
carousel.dataset.autoplaySpeed,
carousel.dataset.infiniteLoop
);
}
window.addEventListener('page-builder-tab-activate', event => {
const tab = event.detail.tab;
if (tab && tab.contains(gliderElement)) {
event.detail.nextTick.then(() => {
requestAnimationFrame(() => glider.refresh(true))
});
}
});
};
const initSliderCarousel = (slider) => {
slider.innerHTML = `<div data-role="glider-content">${slider.innerHTML}</div>`;
slider.classList.add('glider-contain');
slider.insertAdjacentHTML(
'beforeend',
'\u003Cdiv\u0020class\u003D\u0022carousel\u002Dnav\u0020flex\u0020items\u002Dcenter\u0020justify\u002Dbetween\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020flex\u002D1\u0020px\u002D\u005B20px\u005D\u0020absolute\u0020top\u002D\u005B42\u0025\u005D\u0020left\u002D0\u0020right\u002D0\u0020z\u002D10\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020tablet_desktop\u003Atop\u002D1\u002F2\u0022\u000A\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Pr\u00E9c\u00E9dent\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dprev\u0020w\u002D\u005B44px\u005D\u0020h\u002D\u005B44px\u005D\u0020text\u002Dblack\u0020outline\u002Dnone\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0020bg\u002Dmodyf\u002Dred\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020before\u003Acontent\u002D\u005B\u0027\u0027\u005D\u0020before\u003Asvg\u002Dicon__short\u002Darrow\u002Dleft\u002Dwhite__mixin\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020before\u003Ablock\u0020before\u003Aw\u002D\u005B24px\u005D\u0020before\u003Ah\u002D\u005B24px\u005D\u0020before\u003Am\u002Dauto\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020desktop\u003Aw\u002D\u005B75px\u005D\u0020desktop\u003Ah\u002D\u005B75px\u005D\u0022\u000A\u0020\u0020\u0020\u0020\u003E\u003C\u002Fbutton\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Continuer\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dnext\u0020w\u002D\u005B44px\u005D\u0020h\u002D\u005B44px\u005D\u0020text\u002Dblack\u0020outline\u002Dnone\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0020bg\u002Dmodyf\u002Dred\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020before\u003Acontent\u002D\u005B\u0027\u0027\u005D\u0020before\u003Asvg\u002Dicon__short\u002Darrow\u002Dright\u002Dwhite__mixin\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020before\u003Ablock\u0020before\u003Aw\u002D\u005B24px\u005D\u0020before\u003Ah\u002D\u005B24px\u005D\u0020before\u003Am\u002Dauto\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020desktop\u003Aw\u002D\u005B75px\u005D\u0020desktop\u003Ah\u002D\u005B75px\u005D\u0022\u000A\u0020\u0020\u0020\u0020\u003E\u003C\u002Fbutton\u003E\u000A\u003C\u002Fdiv\u003E\u000A\u000A\u003Cdiv\u0020class\u003D\u0022carousel\u002Dnav\u0020dots\u0020modyf\u002Dabsolute\u002Dcentering\u002Dhorizontall\u002Dmixin\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020flex\u0020items\u002Dcenter\u0020justify\u002Dcenter\u0020flex\u002D1\u0020p\u002D\u005B11px\u005D\u0020\u0021bottom\u002D\u005B\u002D50px\u005D\u0022\u000A\u003E\u000A\u0020\u0020\u0020\u0020\u003Cdiv\u0020role\u003D\u0022tablist\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Ddots\u0020select\u002Dnone\u0020flex\u0020flex\u002Dwrap\u0020mx\u002D1\u0020j\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020ustify\u002Dcenter\u0020p\u002D0\u0020focus\u003Aoutline\u002Dnone\u0022\u000A\u0020\u0020\u0020\u0020\u003E\u003C\u002Fdiv\u003E\u000A\u003C\u002Fdiv\u003E'
);
const gliderElement = slider.querySelector('[data-role="glider-content"]');
const gliderDots = slider.querySelector('.glider-dots');
const gliderPrev = slider.querySelector('.glider-prev');
const gliderNext = slider.querySelector('.glider-next');
const glider = new Glider(gliderElement, {
slidesToShow: 1,
slidesToScroll: 1,
scrollLock: true,
scrollLockDelay: 250,
draggable: true,
dragVelocity: 2.5,
dots: gliderDots,
arrows: {
prev: gliderPrev,
next: gliderNext,
},
});
slider.classList.add('glider-initialized');
if (slider.dataset.showArrows === 'true') {
gliderPrev.classList.remove('hidden');
gliderNext.classList.remove('hidden');
}
if (slider.dataset.autoplay !== 'false') {
gliderAutoplay(
glider,
slider.dataset.autoplaySpeed,
slider.dataset.infiniteLoop
);
}
};
const gliderAutoplay = (glider, milliseconds, loop) => {
const pagesCount = glider.track.childElementCount;
let slideTimeout = null;
let nextIndex = 1;
let paused = false;
const slide = () => {
slideTimeout = setTimeout(
() => {
if (loop && nextIndex >= pagesCount) {
nextIndex = 0;
}
glider.scrollItem(nextIndex);
},
parseInt(milliseconds)
);
};
glider.ele.addEventListener('glider-animated', () => {
nextIndex = glider.slide + glider.opt.slidesToScroll;
window.clearInterval(slideTimeout);
if (!paused && (loop || nextIndex < pagesCount)) {
slide();
}
});
const pause = () => {
if (!paused) {
clearInterval(slideTimeout);
paused = true;
}
};
const unpause = () => {
if (paused) {
slide();
paused = false;
}
};
glider.ele.parentElement.addEventListener('mouseover', pause, {passive: true});
glider.ele.parentElement.addEventListener('touchstart', pause, {passive: true});
glider.ele.parentElement.addEventListener('mouseout', unpause, {passive: true});
glider.ele.parentElement.addEventListener('touchend', unpause, {passive: true});
slide();
};
elements.forEach(element => {
if (element.dataset.contentType === 'products') {
initProductCarousel(element);
}
if (element.dataset.contentType === 'slider') {
initSliderCarousel(element);
}
});
};
window.addEventListener('DOMContentLoaded', () => {
const carouselElements = document.querySelectorAll(
`[data-content-type="products"][data-appearance="carousel"],
[data-content-type="slider"]`
);
if (carouselElements.length > 0) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.addEventListener('load', () => {
initCarousels(carouselElements);
});
script.src = 'https\u003A\u002F\u002Fwww.modyf.fr\u002Fstatic\u002Fversion1773297122\u002Ffrontend\u002FModyf\u002Fhyva\u002Ffr_FR\u002FMagento_PageBuilder\u002Fjs\u002Fglider.min.js';
document.head.appendChild(script);
}
});
})();
</script><script>
'use strict';
(() => {
const applyShowOnHover = (element) => {
const showOverlayOnHover = (element) => {
const overlay = element.querySelector('.pagebuilder-overlay');
const color = overlay.dataset.overlayColor;
element.addEventListener('mouseover', () => {
overlay.style.backgroundColor = color;
});
element.addEventListener('mouseout', () => {
overlay.style.backgroundColor = 'transparent';
});
};
const showButtonOnHover = (element) => {
const button = element.querySelector('.pagebuilder-banner-button');
element.addEventListener('mouseover', () => {
button.style.opacity = '1';
button.style.visibility = 'visible';
});
element.addEventListener('mouseout', () => {
button.style.opacity = '0';
button.style.visibility = 'hidden';
});
};
if (element.dataset.showOverlay === 'hover') {
showOverlayOnHover(element);
}
if (element.dataset.showButton === 'hover') {
showButtonOnHover(element);
}
};
window.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-content-type="banner"],[data-content-type="slider"]').forEach(element => {
applyShowOnHover(element);
});
});
})();
</script><!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://tracking.modyf.fr/ns.html?id=GTM-P9L9DSH" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<script>
if(document.body.classList.contains("catalog-product-view")){
var dp = document.querySelector(".display-id").innerHTML;
if(document.querySelector(".request-quotation-btn")){
var url = "https://www.modyf.fr/documents/pages/modyf-plus/produit.html?id="+dp;
document.querySelector(".request-quotation-btn").setAttribute("data-atc",btoa(url));
}
}
</script>
<style>
.page-layout-modyf-cms-page .page-main [data-appearance=contained]>div.subheader-block, .page-layout-category-job-page .page-main [data-appearance=contained]>div.subheader-block, .page-layout-modyf-cms-page .page-main [data-appearance=contained]>div.collection-banner, .page-layout-category-job-page .page-main [data-appearance=contained]>div.collection-banner{
margin-top: -69px;
}
.nice-select .list{
scrollbar-width: thin;
}
</style>
<style>
.popupbg1 {
display: none;
position: fixed;
top: 0px;
left: 0px;
background: rgba(0, 0, 0, 0.75);
width: 100%;
height: 100%;
overflow: hidden;
z-index: 1000;
align-items: center;
justify-content: center;
}
.popup1 {
display: none;
background: #fff;
position: relative;
z-index: 1000;
width: 90%;
max-width: 490px;
}
.popup1 .flex {
display: flex;
}
.popup1 .left {
width: 60%;
padding: 50px;
box-sizing: border-box;
}
.popup1 .right {
width: 40%;
background-image: url("https://documents.modyf.fr/media/documents-fr/banners/Innovator_FRA_2018_4692-retouched.jpg");
background-size: cover;
}
.popup1 h3 {
margin-top: 0px;
font-family: 'wuerth';
font-weight: bold;
font-size: 20px;
margin-bottom: 10px;
color: #000;
}
.popup1 h3 img {
vertical-align: middle;
max-width: none;
}
.popup1 p {
font-family: 'wuerth';
font-weight: normal;
font-size: 16px;
line-height: normal;
color: #000;
}
.popup1 button {
position: absolute;
top: 20px;
right: 20px;
z-index: 3;
border: none;
background: none;
width: 30px;
height: 30px;
cursor: pointer;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13.414' height='13.414' viewBox='0 0 13.414 13.414'%3E%3Cg id='close' transform='translate(0.707 0.707)'%3E%3Cpath id='Path' d='M0,12,12,0' transform='translate(0 0)' fill='none' stroke='%23fff' stroke-miterlimit='10' stroke-width='2'/%3E%3Cpath id='Path-2' data-name='Path' d='M12,12,0,0' fill='none' stroke='%23fff' stroke-miterlimit='10' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E%0A");
background-repeat: no-repeat;
background-position: center center;
background-color: transparent;
opacity: 1;
transition: 0.3s;
font-size: 0px;
}
.popup1 button:hover {}
@media screen and (max-width: 768px) {
.popup1 .flex {
flex-flow: column;
}
.popup1 .left {
width: 100%;
}
.popup1 .right {
display: none;
}
.popup1 button {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13.414' height='13.414' viewBox='0 0 13.414 13.414'%3E%3Cg id='close' transform='translate(0.707 0.707)'%3E%3Cpath id='Path' d='M0,12,12,0' transform='translate(0 0)' fill='none' stroke='%23000' stroke-miterlimit='10' stroke-width='2'/%3E%3Cpath id='Path-2' data-name='Path' d='M12,12,0,0' fill='none' stroke='%23000' stroke-miterlimit='10' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E%0A");
}
}
</style>
<style>
@media screen and (max-width: 768px) {
.account .block-collapsible-nav{
z-index: 2;
}
}
</style>
<style>
.catalog-category-view .category-page-header.image .header-sub-categories ul li a:hover {
opacity: 0.9;
}
@media screen and (min-width: 1050px) {
.catalog-category-view .header-sub-categories ul::-webkit-scrollbar {
width: 11px;
height: 6px;
}
.catalog-category-view .header-sub-categories ul {
scrollbar-width: thin;
scrollbar-color: #818a8f rgb(4 4 4 / 10%);
}
.catalog-category-view .header-sub-categories ul::-webkit-scrollbar-track {
background: rgb(4 4 4 / 10%);
}
.catalog-category-view .header-sub-categories ul::-webkit-scrollbar-thumb {
background-color: #818a8f;
border-radius: 6px;
border: none;
}
.catalog-category-view .image .header-sub-categories ul::-webkit-scrollbar-thumb {
background-color: #ffffff;
}
catalog-category-view .header-sub-categories ul li:nth-child(6) ~ li{
display:none;
}
}
.page-with-filter .filter-options-item .filter-options-content .actions .action{
background-color: #818A8F;
color: #fff;
padding: 7px 15px;
font-size: 14px;
font-family: 'WuerthBold';
}
.page-with-filter .filter-options-item .filter-options-content .actions .action:hover{
color: #fff;
background-color: #97A2A8;
text-decoration: none;
box-shadow: 0 5px 20px 0 rgba(0,0,0,.16);
}
body .header-top-links p:not(:last-child):after{
margin: 0 8px;
}
</style><script>
function initConfigurableOptions(productId, optionConfig) {
if (document.querySelector('.bss-fastorder-form')) {
window.modyf.fast_order_active_product = optionConfig;
}
function findPathParam(key) {
const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL;
const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/');
const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3);
for (let i = 0; i < pathParts.length; i += 2) {
if (pathParts[i] === key && pathParts.length > i) {
return pathParts[i + 1];
}
}
}
return {
optionConfig,
productId,
itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'),
allowedAttributeOptions: [],
selectedValues: [],
init() {
this.findAllowedAttributeOptions();
this.$nextTick(() => {
if (typeof this.optionConfig.defaultValues === 'object') {
for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) {
this.changeOption(attributeId, value + '');
}
}
this.updatePriceLabelVisibility();
});
},
findSimpleIndex() {
this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues);
},
calculateSimpleIndexForPartialSelection(selectedValues) {
if (selectedValues.length === 0) return 0;
let productIndexIds = Object.keys(this.optionConfig.index);
Object.keys(this.optionConfig.attributes).forEach((attribute) => {
const productsWithAttributeMatch = selectedValues[attribute]
? productIndexIds.filter((productIndex) => {
return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute]
})
: [];
productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds
})
return productIndexIds[0];
},
calculateSimpleIndexForFullSelection(selectedValues) {
const productIndexes = this.optionConfig.index;
return Object.keys(productIndexes).find(productIndex => {
const productCandidateOptions = productIndexes[productIndex];
for (const productOption in productCandidateOptions) {
if (
! selectedValues[productOption] ||
selectedValues[productOption] !== productCandidateOptions[productOption]
) {
return false;
}
}
return productIndex;
});
},
productIndex: 0,
findAllowedAttributeOptions() {
this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues);
},
calculateAllowedAttributeOptions(selectedValues) {
const allAttributes = this.optionConfig.attributes;
const allAttributesSorted = Object.values(allAttributes).sort((a,b) => {
return a.position - b.position
});
const newAllowedAttributeOptions = [];
allAttributesSorted.forEach(attribute => {
const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id));
const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr);
if (attribute.code === 'pants_length') {
newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options;
} else {
newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => {
return !!option.products.find(product => {
return availableIndexes.includes(product);
})
});
}
});
return newAllowedAttributeOptions;
},
calculateAvailableProductIndexes(selectedOptions) {
if (Object.keys(selectedOptions).length === 0) {
if (Object.values(this.optionConfig.salable || {}).length) {
return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i)
}
return Object.keys(this.optionConfig.index);
}
const selectedIds = Object.keys(selectedOptions);
if (Object.values(this.optionConfig.salable || {}).length) {
const selectedOptionIndexes = selectedIds.map(attrId => {
const optionValue = selectedOptions[attrId];
return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || []
})
return selectedOptionIndexes.reduce((acc, optionIndexes) => {
return acc.filter(index => optionIndexes.includes(index));
});
} else {
const productIndexes = this.optionConfig.index;
return Object.keys(productIndexes).filter(index => {
for (const attrId of selectedIds) {
if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false
}
return true
});
}
},
findAttributeByOptionId(optionId) {
for (const attributeId in this.optionConfig.attributes) {
const attributeOptions = this.optionConfig.attributes[attributeId].options || [];
if (attributeOptions.find(option => option.id === optionId)) {
return attributeId;
}
}
},
getAllowedAttributeOptions(attributeId) {
return this.allowedAttributeOptions[attributeId] || []
},
getProductIdsForOption(option) {
const attributeId = this.findAttributeByOptionId(option.id);
const allOptions = this.optionConfig.attributes[attributeId];
const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id);
return opt && opt.products
? opt.products
: [];
},
findProductIdsForPartialSelection(optionSelection) {
const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => {
const newCandidates = this.getProductIdsForOption({id: optionId});
return candidates === null
? newCandidates
: candidates.filter(productId => newCandidates.includes(productId));
}, null);
return candidateProducts || [];
},
findCheapestProductForPartialSelection(optionSelection) {
const candidateProducts = this.findProductIdsForPartialSelection(optionSelection);
return candidateProducts.reduce((cheapest, simpleIdx) => {
// in the first iteration we start with simpleIdx as the currently cheapest product
if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx;
const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount;
return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount
? simpleIdx
: cheapest;
}, 0)
},
findProductIdToUseForOptionPrice(option) {
// try to find a product for a complete selection
const attributeId = this.findAttributeByOptionId(option.id);
const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id});
const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection);
// if there is no complete selection, use the cheapest product for the option
return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection);
},
getAttributeOptionLabel(option) {
const optionProduct = this.findProductIdToUseForOptionPrice(option);
if ((! optionProduct) || (optionProduct === this.productIndex)) {
return option.label;
}
const currentPrice = this.getOptionPriceAdjustmentBasePrice();
if (this.optionConfig.optionPrices[optionProduct]) {
const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount;
if (optionPrice !== currentPrice){
return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true);
}
}
return option.label;
},
getAttributeOptionPrice(option) {
const optionProduct = this.findProductIdToUseForOptionPrice(option);
if (this.optionConfig.optionPrices[optionProduct]) {
const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount;
return hyva.formatPrice(optionPrice, false);
}
},
getAttributeOptionDeliveryDate(option) {
let deliveryDate = '';
if (typeof option.deliveryDate === 'string') {
deliveryDate = option.deliveryDate;
} else if (typeof option.deliveryDate === 'object' && option.deliveryDate !== null) {
let firstKey = Object.keys(option.deliveryDate)[0];
deliveryDate = option.deliveryDate[firstKey];
}
return deliveryDate;
},
getAttributeOptionDeliveryDateNotFormatted(option) {
const optionProduct = this.findProductIdToUseForOptionPrice(option);
return this.optionConfig.product_delivery_date_not_formatted[optionProduct];
},
getOptionPriceAdjustmentBasePrice() {
if (this.optionConfig.optionPrices[this.productIndex]) {
return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount
}
const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues);
return this.optionConfig.optionPrices[cheapestForSelection]
? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount
: this.optionConfig.prices.finalPrice.amount; // default price if no option selection
},
clearOptionIfActive(optionId, value) {
if (this.selectedValues[optionId] === value) {
this.blurLabel()
this.changeOption(optionId, '')
}
},
removeAttrFromSelection(selectedValues, attributeId) {
attributeId = parseInt(attributeId);
return selectedValues.reduce((newSelection, val, attr) => {
if (attr !== attributeId) {
newSelection[attr] = val;
}
return newSelection;
}, []);
},
changeOption(attributeId, value) {
let allowedAttributeOption = false;
if (value) {
allowedAttributeOption = this.getAllowedAttributeOptions(attributeId).find(option => option.id === value);
}
if (value === '') {
this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId)
} else if (value && allowedAttributeOption) {
this.selectedValues[attributeId] = value;
let optionId = this.getSimpleProductId(attributeId, value);
if (optionId) {
this.changeDisplayNumber(optionId);
}
}
this.findSimpleIndex();
this.findAllowedAttributeOptions();
this.updatePrices();
this.updateGallery();
window.dispatchEvent(
new CustomEvent(
'configurable-selection-changed',
{
detail: {
productId: this.productId,
optionId: attributeId,
value: value,
productIndex: this.productIndex,
selectedValues: this.selectedValues,
candidates: this.findProductIdsForPartialSelection(this.selectedValues),
optionInitialLabel: allowedAttributeOption['label'],
}
}
)
);
this.processStockData(this.productIndex);
},
changeDisplayNumber(optionId) {
let displayNumber = this.optionConfig['display_id'][optionId],
wrapper = document.querySelector('.product-info-main-review');
if (displayNumber) {
let existingDisplayId = wrapper.querySelector('.display-id');
if (existingDisplayId) {
existingDisplayId.remove();
}
let newDisplayId = document.createElement('p');
newDisplayId.className = 'display-id';
newDisplayId.textContent = displayNumber;
wrapper.prepend(newDisplayId);
} else {
let existingDisplayId = wrapper.querySelector('.display-id');
if (existingDisplayId) {
existingDisplayId.remove();
}
}
},
getSimpleProductId(attributeId, value) {
let allOptions = this.optionConfig.attributes[attributeId].options;
let config = allOptions.filter(function(option) {
return option.id === value;
});
config = config.length ? config[0] : undefined;
return config && config.products.length ? config.products[0] : undefined;
},
processStockData(optionId) {
let optionQty = parseFloat(this.optionConfig.stock_source_quantity[optionId]),
stockStatus = this.optionConfig.product_stock_status[optionId],
deliveryDate = this.optionConfig.product_delivery_date[optionId],
productAlert = document.querySelector('.product.alert'),
availableLabel = document.querySelector('.available-label'),
showStockStatus = true;
if (availableLabel) availableLabel.style.display = 'none';
if (productAlert) {
productAlert.style.display = 'none';
productAlert.querySelector('.stock-status')?.style.setProperty('display', 'none');
productAlert.querySelector('.stock-text-bottom')?.style.setProperty('display', 'none');
productAlert.querySelector('.delivery-date-wrapper')?.style.setProperty('display', 'none');
productAlert.querySelector('.box-tocart .fieldset')?.style.setProperty('display', 'none');
}
let pantsLengthElement = document.querySelector('.pants_length');
let serviceSizeElement = document.querySelector('.service_size');
if (pantsLengthElement && pantsLengthElement.value && serviceSizeElement && !serviceSizeElement.value) {
let allowedProductsDeliveryDate,
minDeliveryDate;
document.querySelectorAll('.service_size option').forEach(function(current) {
let currentDeliveryDate = current.getAttribute('data-delivery-date'),
currentDeliveryDateNotFormatted = current.getAttribute('data-delivery-date-not-formatted');
if (current.value && !currentDeliveryDate) {
showStockStatus = false;
}
if (!allowedProductsDeliveryDate) {
allowedProductsDeliveryDate = Date.parse(currentDeliveryDateNotFormatted);
minDeliveryDate = currentDeliveryDate;
} else if (allowedProductsDeliveryDate > Date.parse(currentDeliveryDateNotFormatted)) {
allowedProductsDeliveryDate = Date.parse(currentDeliveryDateNotFormatted);
minDeliveryDate = currentDeliveryDate;
}
});
if (showStockStatus && minDeliveryDate) {
deliveryDate = minDeliveryDate;
}
}
if (availableLabel && (optionQty > 0 || !showStockStatus)) {
availableLabel.style.display = 'block';
return;
}
if (showStockStatus && productAlert) {
productAlert.style.display = 'block';
}
if (stockStatus === 'active' && productAlert) {
productAlert.querySelector('.stock-text-bottom')?.style.setProperty('display', 'block');
}
if (deliveryDate && stockStatus === 'active' && showStockStatus) {
const deliveryDateElement = productAlert.querySelector('.delivery-date-wrapper .delivery-date-value');
if (deliveryDateElement) {
deliveryDateElement.textContent = deliveryDate;
}
productAlert.querySelector('.delivery-date-wrapper')?.style.setProperty('display', 'block');
productAlert.querySelector('.stock-status')?.style.setProperty('display', 'block');
return;
}
if (productAlert) productAlert.querySelector('.box-tocart .fieldset').style.display = 'block';
},
calculateIsMinimalPrice() {
return (
this.selectedValues.filter(value => !!value).length <
Object.keys(this.optionConfig.attributes).length
);
},
updatePrices() {
const value = this.productIndex ?
this.optionConfig.optionPrices[this.productIndex] :
this.optionConfig.prices;
window.dispatchEvent(
new CustomEvent(
"update-prices-" + this.productId,
{
detail: Object.assign(
value,
{ isMinimalPrice: this.calculateIsMinimalPrice() }
)
}
)
);
},
updateGallery () {
if (this.productIndex) {
const images = this.optionConfig.images[this.productIndex];
images && window.dispatchEvent(new CustomEvent(
"update-gallery",
{ detail: this.sortImagesByPosition(images) }
));
} else {
window.dispatchEvent(new Event("reset-gallery"));
}
},
sortImagesByPosition(images) {
return images.sort((x, y) => {
return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1)
});
},
onGetCartData(data) {
},
preselectCartItems(data) {
// pre-select options based on cart data for current (quote) itemId
const cart = data && data.cart;
if (cart && cart.items) {
const cartItem = cart.items.find((item) => {
return (
item.item_id === this.itemId
&& item.product_id === this.productId
)
});
if (cartItem && cartItem.options && cartItem.options.length) {
cartItem.options.map(option => {
this.changeOption(option.option_id, option.option_value);
})
}
}
},
preselectQuerystringItems() {
// pre-select option like ?size=167
const urlQueryParams = new URLSearchParams(window.location.search.replace('?',''));
if (urlQueryParams.size) {
this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code));
}
},
preselectLocationHashItems() {
// pre-select option like #144=167
const urlHashParams = new URLSearchParams(window.location.hash.replace('#',''));
if (urlHashParams.size) {
this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id));
}
},
preselectItemsBasedOnLocation(getLocationValue) {
Object.values(this.optionConfig.attributes).map(attribute => {
this.changeOption(attribute.id, getLocationValue(attribute))
});
},
updatePriceLabelVisibility() {
let shouldBeShown = false,
price = '',
updatePrice = 0;
for (const key in this.optionConfig.optionPrices) {
if (Object.hasOwn(this.optionConfig.optionPrices, key)) {
const option = this.optionConfig.optionPrices[key];
const itemPrice = option.finalPrice['amount'];
if (itemPrice !== undefined && itemPrice !== price) {
price = itemPrice;
updatePrice++;
}
}
}
shouldBeShown = updatePrice !== 1;
window.dispatchEvent(
new CustomEvent("update-prices-label", {
detail: { shouldBeShown }
})
);
}
}
}
</script><script>
function initSwatchOptions(swatchConfig) {
return {
swatchConfig,
getAttributeSwatchData(attributeId) {
const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]);
swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']);
return swatchConfig;
},
mapSwatchTypeNumberToTypeCode(typeNumber) {
switch ("" + typeNumber) {
case "1":
return "color"
case "2":
return "image"
case "3":
return "empty"
case "0":
default:
return "text"
}
},
getTypeOfFirstOption(attributeId) {
for (const optionId in this.swatchConfig[attributeId]) {
const option = this.swatchConfig[attributeId][optionId];
if (typeof option.type !== 'undefined') {
return this.mapSwatchTypeNumberToTypeCode(option.type);
}
}
},
getVisualSwatchType(attributeId, targetOptionId) {
// If a type configuration is present for the given option id, use it
const config = this.swatchConfig[attributeId];
if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') {
return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type);
}
// Otherwise - if no config is present for the target option - use the type of the first option
// with a type property from the attribute, thus assuming its the same type as the target option.
// (This edge case condition can occur on single swatch products if some options are not salable)
return this.getTypeOfFirstOption(attributeId);
},
getSwatchType(attributeId, optionId) {
// Deserialize the attribute details the first time they are used
if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) {
this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId);
}
const type = this.swatchConfig[attributeId] &&
this.swatchConfig[attributeId].details &&
this.swatchConfig[attributeId].details.swatch_input_type ||
"empty";
return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type;
},
isTextSwatch(attributeId, optionId) {
return this.getSwatchType(attributeId, optionId) === 'text';
},
isVisualSwatch(attributeId, optionId) {
const type = this.getSwatchType(attributeId, optionId);
return ['image', 'color'].includes(type);
},
getSwatchBackgroundStyle(attributeId, optionId) {
const config = this.getSwatchConfig(attributeId, optionId);
const type = this.getSwatchType(attributeId, optionId);
if (type === "color") {
return 'background-color:' + config.value;
} else if (type === "image") {
return "background: #fff url('" + config.value + "') no-repeat center";
} else {
return '';
}
},
getSwatchText(attributeId, optionId) {
const config = this.getSwatchConfig(attributeId, optionId);
return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId);
},
getOptionLabelFromOptionConfig(attributeId, optionId) {
// Fallback if no value is present in swatchConfig data
// Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190
const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId);
return option && option[0] && option[0].label ||'';
},
getSwatchConfig(attributeId, optionId) {
return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId]
? this.swatchConfig[attributeId][optionId]
: false;
},
activeTooltipItem: false,
tooltipPositionElement: false,
isTooltipVisible() {
return this.activeTooltipItem &&
this.getSwatchConfig(
this.activeTooltipItem.attribute,
this.activeTooltipItem.item
);
},
isFirstItemCol() {
return this.activeTooltipItem.index === 0;
},
getTooltipImageStyle(attributeId, optionId) {
const config = this.getSwatchConfig(attributeId, optionId);
const type = this.getSwatchType(attributeId, optionId);
if (type === "color") {
return 'background-color:' + config.value + '; width: 110px; height: 90px;';
} else if (type === "image") {
return "background: #ffffff url('" + config.thumb +
"') center center no-repeat; width: 110px; height: 90px;";
} else {
return 'display:none';
}
},
getTooltipPosition() {
return this.tooltipPositionElement ?
`top: ${this.tooltipPositionElement.offsetTop}px;` +
`left: ${
this.tooltipPositionElement.offsetLeft - (
this.tooltipPositionElement.closest('.snap') &&
this.tooltipPositionElement.closest('.snap').scrollLeft ||
0
)
}px;` : ''
},
getTooltipLabel() {
return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label
},
focusedLabel: false,
focusLabel(optionId) {
this.focusedLabel = optionId;
},
blurLabel() {
this.focusedLabel = false;
}
}
}
</script>
<script>
'use strict';
const grecaptchaV2LoadCallbacks = [];
function executeRecaptchaLoadCallbacks () {
while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) {
const callback = grecaptchaV2LoadCallbacks.pop();
typeof callback === 'string' ? window[callback]() : callback();
}
}
(function() {
const loadRecaptchaScript = (event) => {
if (window.grecaptcha || !event.target.form) {
return;
}
const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks';
const siteKey = '';
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`;
script.async = true;
document.head.appendChild(script);
script.addEventListener('load', () => {
Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled'));
});
}
window.forceLoadRecaptchaScript = (form) => {
loadRecaptchaScript({target: {form: form || 'dummy'}});
executeRecaptchaLoadCallbacks();
};
document.body.addEventListener('input', loadRecaptchaScript, { once: true });
document.body.addEventListener('focus', loadRecaptchaScript, { once: true });
}());
</script>
<script>
/**
* Init widget.
*/
function initDQEServices(el, service) {
let currentDataInit = el.getAttribute('x-data');
if (currentDataInit) {
el.setAttribute('x-data', `{...(${currentDataInit}), ...(${service})}`);
} else {
el.setAttribute('x-data', service);
}
}
/**
* Init first widget method.
*/
function initDQEServicesCreate(el, method) {
let currentDataInit = el.getAttribute('x-init');
if (currentDataInit) {
el.setAttribute('x-init', `${currentDataInit}; ${method}`);
} else {
el.setAttribute('x-init', method);
}
}
/**
* Dqe disable autocomplete from field.
*/
function disableAutocompleteDQE (input) {
input.setAttribute('autocomplete', 'none');
setTimeout(function () {
input.setAttribute('autocomplete', 'none');
}, 500);
}
</script>
<script>
let elements = document.getElementsByTagName('select');
for (let i = 0; i < elements.length; i++) {
if (elements[i].classList.contains('nice-inited')) continue;
NiceSelect.bind(elements[i]);
}
</script><script>
document.querySelector('body').addEventListener('click', function(event) {
let target = event.target.closest('.atc');
if (target && target.getAttribute('data-atc')) {
let url = decodeURIComponent(atob(target.getAttribute('data-atc')));
if (target.getAttribute('data-target') === '_blank' || event.ctrlKey) {
let newWindow = window.open(url, '_blank');
newWindow.focus();
} else {
window.location.href = url;
}
}
});
</script><script>
document.querySelectorAll('.cms-accordion').forEach(accordion => {
const titles = accordion.querySelectorAll('.cms-accordion-title');
const contents = accordion.querySelectorAll('.cms-accordion-content');
titles.forEach(title => {
title.addEventListener('click', () => {
// Collapse all contents and remove active class
contents.forEach(content => {
content.style.maxHeight = null;
content.style.opacity = '0';
});
titles.forEach(t => t.classList.remove('active'));
const nextContent = title.nextElementSibling;
// Toggle current content
if (nextContent && nextContent.classList.contains('cms-accordion-content')) {
if (!nextContent.style.maxHeight) {
nextContent.style.maxHeight = nextContent.scrollHeight + 'px';
nextContent.style.opacity = '1';
title.classList.add('active');
} else {
nextContent.style.maxHeight = null;
nextContent.style.opacity = '0';
title.classList.remove('active');
}
}
});
});
});
</script>
<script type="text/javascript">
//<![CDATA[
var _t2sparams = _t2sparams || {};
_t2sparams.cID = '';
_t2sparams.pID = '1000';
_t2sparams.eN = 'view';
_t2sparams.hasRankOption = true;
function loadT2sScriptAsync(callback) {
var url = ('https:' === document.location.protocol ? 'https' : 'http')
+ '://';
if (!url || !(typeof url === 'string')) {
return;
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.onload = function () {
resolve();
};
if (typeof document.attachEvent === "object") {
script.onreadystatechange = function () {
if (script.readyState === 'loaded') {
if (callback) {
callback()
}
}
};
} else {
script.onload = function () {
if (callback) {
callback();
}
};
}
script.src = url;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(script, s);
}
//]]>
</script> <script>
'use strict';
document.addEventListener( 'DOMContentLoaded', function() {
let element = document.querySelector('.home\u002Dcategory');
if (element) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https\u003A\u002F\u002Fwww.modyf.fr\u002Fstatic\u002Fversion1773297122\u002Ffrontend\u002FModyf\u002Fhyva\u002Ffr_FR\u002FModyf_Cms\u002Fjs\u002Fhome_category_slider.min.js';
document.head.appendChild(script);
}
} );
</script><script>
'use strict';
document.addEventListener( 'DOMContentLoaded', function() {
let element = document.querySelector('.grid\u002Dlike\u002Dtable');
if (element) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https\u003A\u002F\u002Fwww.modyf.fr\u002Fstatic\u002Fversion1773297122\u002Ffrontend\u002FModyf\u002Fhyva\u002Ffr_FR\u002FModyf_Cms\u002Fjs\u002Fgrid_like_table.min.js';
document.head.appendChild(script);
}
} );
</script><script>
'use strict';
document.addEventListener( 'DOMContentLoaded', function() {
let element = document.querySelector('.cms\u002Daccordion');
if (element) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https\u003A\u002F\u002Fwww.modyf.fr\u002Fstatic\u002Fversion1773297122\u002Ffrontend\u002FModyf\u002Fhyva\u002Ffr_FR\u002FModyf_Cms\u002Fjs\u002Fcms\u002Daccordion.min.js';
document.head.appendChild(script);
}
} );
</script><script>
'use strict';
document.addEventListener( 'DOMContentLoaded', function() {
let element = document.querySelector('.cotton\u002Dproducts');
if (element) {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https\u003A\u002F\u002Fwww.modyf.fr\u002Fstatic\u002Fversion1773297122\u002Ffrontend\u002FModyf\u002Fhyva\u002Ffr_FR\u002FModyf_Cms\u002Fjs\u002Fcotton\u002Dproducts\u002Dslider.min.js';
document.head.appendChild(script);
}
} );
</script> <script>
'use strict';
function responseSerialize(response) {
if (response.redirected) {
window.location.href = response.url;
} else if (response.ok) {
return response.json();
} else {
let defaultErrMsg = 'Something went wrong. Please contact the website admin for more information.',
result;
result = response.text();
if (typeof result?.then === 'function') {
result.then(res => {
let errorMessage;
try {
errorMessage = JSON.parse(res);
errorMessage = errorMessage?.message ? errorMessage.message : defaultErrMsg;
} catch (e) {
errorMessage = defaultErrMsg;
}
window.dispatchMessages([
{
type: 'error',
text: errorMessage
}
], 3000);
});
} else {
throw new Error(defaultErrMsg);
}
}
}
if (typeof window.buildRestAPIUrl !== 'function') {
window.buildRestAPIUrl = function (url, params = {}) {
const method = 'rest',
storeCode = 'fr_fr',
version = 'V1',
serviceUrl = ':method/:storeCode/:version';
let urlParts;
params.method = method;
params.storeCode = storeCode;
params.version = version;
url = serviceUrl + url;
urlParts = url.split('/');
urlParts = urlParts.filter(Boolean);
Object.entries(urlParts).forEach (entry => {
let [key, part] = entry;
part = part.replace(':', '');
if (params[part] !== undefined) {
urlParts[key] = params[part];
}
});
return urlParts.join('/');
}
}
if (typeof window.isObjectEmpty !== 'function') {
window.isObjectEmpty = function (obj) {
return (
Object.prototype.toString.call(obj) === '[object Object]' &&
JSON.stringify(obj) === '{}'
);
}
}
if (typeof window.mergeDeep !== 'function') {
/**
* Deep merge two objects.
*
* @param target
* @param sources
* @returns {*}
*/
window.mergeDeep = (target, ...sources) => {
/**
* Simple object check.
*
* @param item
* @returns {boolean}
*/
const isObject = (item) => {
return (item && typeof item === 'object' && !Array.isArray(item));
};
if (!sources.length) return target;
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return mergeDeep(target, ...sources);
}
}</script><script>
window.setAjaxCart = (selectors = '.product_addtocart_form,\u0020\u0023product_addtocart_form', recursive = true) => {
const forms = document.querySelectorAll(selectors);
const delay = parseInt('1000', 10);
const loader = document.getElementById('main-css-loader');
forms.forEach(form => {
form.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new URLSearchParams(new FormData(form));
const button = document.getElementById('product-addtocart-button');
// Disable the Add to Cart button
disableAddToCartButton(button);
loader.style.display = 'block';
try {
const response = await fetch(e.currentTarget.action, {
method: 'POST',
body: formData,
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
}
});
if (!response.ok) {
return form.submit();
}
if (response.redirected) {
return window.location.href = response.url;
}
const data = await response.json();
if (data.backUrl) {
return window.location.href = data.backUrl;
}
if (recursive) {
window.dispatchEvent(new CustomEvent('product-addtocart-success'));
}
window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
setTimeout(() => {
const gtmScriptEvent = new CustomEvent('gtm_product-addtocart-success', {
detail: {
data: data.product
},
});
document.dispatchEvent(gtmScriptEvent);
}, delay);
} catch (err) {
console.warn(err);
window.dispatchEvent(new CustomEvent('product-addtocart-error'));
setMessage({
text:'There\u0020was\u0020a\u0020problem\u0020adding\u0020your\u0020item\u0020to\u0020the\u0020cart.',
type: 'error'
});
} finally {
try {
var messages = hyva.getCookie('mage-messages');
messages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : [];
document.cookie = 'mage-messages=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
} catch (error) {
console.warn('Error parsing Cookie Messages:', error);
return;
}
setTimeout(() => {
loader.style.display = 'none';
button.classList.remove('is-loading');
// Enable the Add to Cart button
enableAddToCartButton(button);
}, delay);
}
});
});
}
/**
* Set Message
*/
function setMessage(message) {
typeof window.dispatchMessages !== 'undefined' &&
window.dispatchMessages([message], 5000);
}
function disableAddToCartButton(button) {
const addToCartButtonTextWhileAdding = 'En\u0020cours\u0020d\u0027ajout...';
button.classList.add('is-disabled');
button.disabled = true;
button.querySelector('span').textContent = addToCartButtonTextWhileAdding;
button.title = addToCartButtonTextWhileAdding;
}
function enableAddToCartButton(button) {
const addToCartButtonTextAdded = 'Ajout\u00E9';
button.querySelector('span').textContent = addToCartButtonTextAdded;
button.title = addToCartButtonTextAdded;
setTimeout(() => {
const addToCartButtonTextDefault = 'Ajouter\u0020au\u0020panier\u0020';
button.querySelector('span').textContent = addToCartButtonTextDefault;
button.title = addToCartButtonTextDefault;
button.classList.remove('is-disabled');
button.disabled = false;
}, 1000);
}
/** Init on pageload */
window.setAjaxCart();
</script> <script>
window.addEventListener('load', function () {
magentoStorefrontEvents.context.setPage({
pageType: "CMS"
});
magentoStorefrontEvents.context.setContext("pageExtended", {
action: "view"
});
});</script> <div x-data="dataServicesAddToCartTracking" @private-content-loaded.window="checkIfProductIsAddedToBasket"></div>
<script>
window.addEventListener('productAddToCart', function(event) {
const browserStorage = hyva.getBrowserStorage();
const product = JSON.parse(browserStorage.getItem('dataservices_product_context'));
let shoppingCart = magentoStorefrontEvents.context.getShoppingCart();
let changedProducts = event.detail;
magentoStorefrontEvents.context.setProduct(product);
if (changedProducts.length > 0) {
magentoStorefrontEvents.context.setShoppingCart(shoppingCart);
magentoStorefrontEvents.context.setChangedProducts({
items: createCartItems(changedProducts),
});
magentoStorefrontEvents.publish.addToCart();
}
function getConfigurableOptions(item) {
return item.options.map((function(item) {
return {
id: item.option_id,
optionLabel: item.label,
valueId: parseInt(item.option_value),
valueLabel: item.value
}
}
))
}
function getCartItemPrice(cartItem) {
const productPrice = cartItem.product_price_value;
if (productPrice && productPrice.hasOwnProperty('excl_tax')) {
return Number(parseFloat(productPrice.excl_tax).toFixed(2));
} else {
return Number(parseFloat(productPrice).toFixed(2));
}
}
function createCartItems(productList) {
if (!Array.isArray(productList)) {
console.error('Expected an array for productList, received:', productList);
return [];
}
return productList.map((item) => ({
id: item.item_id,
formattedPrice: getCartItemPrice(item),
quantity: item.qty,
canApplyMsrp: item.canApplyMsrp,
configurableOptions: getConfigurableOptions(item),
product: {
productType: item.product_type,
productId: item.product_id,
name: item.product_name,
sku: item.product_sku,
topLevelSku: item.topLevelSku,
mainImageUrl: item.product_image.src,
},
prices: {
price: {
value: getCartItemPrice(item),
},
},
}));
}
});
(function() {
const browserStorage = hyva.getBrowserStorage();
const storedData = browserStorage.getItem("mage-cache-storage");
const initialItems = storedData
? (JSON.parse(storedData).cart && JSON.parse(storedData).cart.items) || []
: [];
if (!browserStorage.getItem('prev_cart_items')) {
browserStorage.setItem('prev_cart_items', JSON.stringify(initialItems));
}
const initialSummaryCount = storedData
? (JSON.parse(storedData).cart && JSON.parse(storedData).cart.summary_count) || 0
: 0;
if (!browserStorage.getItem('cart_summary_count')) {
browserStorage.setItem('cart_summary_count', initialSummaryCount);
}
})();
function dataServicesAddToCartTracking() {
return {
checkIfProductIsAddedToBasket() {
const data = this.$event.detail.data;
const browserStorage = hyva.getBrowserStorage();
if (!browserStorage || !data.cart) {
return;
}
let storedItemsJSON = browserStorage.getItem('prev_cart_items');
let browserStorageCartItems = storedItemsJSON ? JSON.parse(storedItemsJSON) : [];
let cartSummaryCount = data.cart.summary_count || 0;
let dataCartItems = data.cart.items || [];
let storageSummaryCount = parseInt(browserStorage.getItem('cart_summary_count'), 10) || 0;
if (cartSummaryCount > storageSummaryCount) {
const results = this.findChangedItems(browserStorageCartItems, dataCartItems);
if (results.length > 0) {
window.dispatchEvent(new CustomEvent("productAddToCart", {
detail: results
}));
}
}
browserStorage.setItem('prev_cart_items', JSON.stringify(dataCartItems));
browserStorage.setItem('cart_summary_count', cartSummaryCount);
browserStorage.setItem('dataservices_product_context', JSON.stringify(data.cart.dataservices_product_context));
},
findChangedItems(oldItems, newItems) {
let changes = [];
newItems.forEach(newItem => {
const oldItem = oldItems.find(old => old.item_id === newItem.item_id);
if (!oldItem || oldItem.qty !== newItem.qty) {
changes.push(newItem);
}
});
return changes;
}
}
}
window.addEventListener('alpine:init', () => Alpine.data('dataServicesAddToCartTracking', dataServicesAddToCartTracking), {once: true});
</script>
<script>
function adobeProductRecsDataFetcher() {
"use strict";
return {
pagePreconfiguredDeferred: {},
productBanners: '',
fetchData: function () {
let self = this;
let storefrontEvents = window.magentoStorefrontEvents;
storefrontEvents.context.setContext('recsContext', {
alternateEnvironmentId: ""
});
this.pagePreconfiguredDeferred = new Promise((resolve, reject) => {
self.pagePreconfiguredDeferred.resolve = resolve;
self.pagePreconfiguredDeferred.reject = reject;
})
document.addEventListener('recsRequestSent', (function () {
storefrontEvents.publish.recsRequestSent();
}));
window.addEventListener('recsResponseReceived', (function (n) {
let rec = storefrontEvents.context.getRecommendations();
rec = n.detail, storefrontEvents.context.setRecommendations({
units: rec
});
window.dispatchEvent(new CustomEvent('recsResponseReceivedEvent'));
}));
this.fetchRecommendationsData();
},
fetchRecommendationsData: function () {
let client;
let promise = new Promise(function(resolve, reject) {
let interval = setInterval(() => {
client = new RecommendationsClient();
if(client._environmentId !== "") {
clearInterval(interval);
resolve();
}
}, 300);
})
.then(() => {
document.dispatchEvent(new Event('recsRequestSent'));
client.fetchPreconfigured().then(response => {
const units = response.data.results;
const filteredUnits = units.filter(unit => unit.products.length);
const responseEvent = new CustomEvent('recsResponseReceived', {
detail: filteredUnits,
});
window.dispatchEvent(responseEvent);
});
});
}
}
}
</script>
<div x-data="adobeProductRecsDataFetcher()" x-init="fetchData()"></div> <script type="text/json" id="default-section-data">
{"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"},"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"data_id":1773722729},"captcha":[],"wishlist":{"items":[]},"instant-purchase":[],"loggedAsCustomer":[],"multiplewishlist":[],"persistent":[],"review":[],"ammessages":[],"quote":[],"getresponse-tracking-code":[],"getresponse-recommendation":[],"gtm-checkout":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[]}</script>
<noscript>
<section class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal">
<div class="container text-center">
<p>
<strong>Javascript est désactivé dans votre navigateur.</strong>
<span>
Pour une expérience optimale sur notre site, veuillez autoriser Javascript sur votre navigateur. </span>
</p>
</div>
</section>
</noscript>
</div></body>
</html>