1<!doctype html> 2<html lang="fr"> 3<head > 4 <meta charset="utf-8"/> 5<meta name="title" content="Panier"/> 6<meta name="robots" content="INDEX,FOLLOW"/> 7<meta name="viewport" content="width=device-width, initial-scale=1"/> 8<title>Panier</title> 9 <link rel="stylesheet" type="text/css" media="all" href="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/css/styles.css" />
10<script type="text/javascript" src="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/Blackbird_Monetico/js/monetico-iframe-redirect.js"></script>
10 11<link rel="icon" type="image/x-icon" href="https://www.broderieplaisir.com/media/favicon/stores/1/favicon.png" /> 12<link rel="shortcut icon" type="image/x-icon" href="https://www.broderieplaisir.com/media/favicon/stores/1/favicon.png" /> 13
13<script> 14 var BASE_URL = 'https://www.broderieplaisir.com/fr/'; 15 var THEME_PATH = 'https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR'; 16 var COOKIE_CONFIG = { 17 "expires": null, 18 "path": "\u002F", 19 "domain": ".www.broderieplaisir.com", 20 "secure": false, 21 "lifetime": "3600", 22 "cookie_restriction_enabled": true }; 23 var CURRENT_STORE_CODE = 'fr'; 24 var CURRENT_WEBSITE_ID = '1'; 25 26 window.hyva = window.hyva || {} 27 28 window.cookie_consent_groups = window.cookie_consent_groups || {} 29 window.cookie_consent_groups['necessary'] = true; 30 31 window.cookie_consent_config = window.cookie_consent_config || {}; 32 window.cookie_consent_config['necessary'] = [].concat( 33 window.cookie_consent_config['necessary'] || [], 34 [ 35 'user_allowed_save_cookie', 36 'form_key', 37 'mage-messages', 38 'private_content_version', 39 'mage-cache-sessid', 40 'last_visited_store', 41 'section_data_ids' 42 ] 43 ); 44 //# sourceURL=hyva-variables.js 45</script>
vendor: 1 bytes, line 45
45
46<script> 47 (function( hyva, undefined ) { 48 49 function lifetimeToExpires(options, defaults) { 50 51 const lifetime = options.lifetime || defaults.lifetime; 52 53 if (lifetime) { 54 const date = new Date; 55 date.setTime(date.getTime() + lifetime * 1000); 56 return date; 57 } 58 59 return null; 60 } 61 62 function generateRandomString() { 63 64 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 65 length = 16; 66 67 let formKey = '', 68 charactersLength = allowedCharacters.length; 69 70 for (let i = 0; i < length; i++) { 71 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 72 } 73 74 return formKey; 75 } 76 77 const sessionCookieMarker = {noLifetime: true} 78 79 const cookieTempStorage = {}; 80 81 const internalCookie = { 82 get(name) { 83 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 84 return v ? v[2] : null; 85 }, 86 set(name, value, days, skipSetDomain) { 87 let expires, 88 path, 89 domain, 90 secure, 91 samesite; 92 93 const defaultCookieConfig = { 94 expires: null, 95 path: '/', 96 domain: null, 97 secure: false, 98 lifetime: null, 99 samesite: 'lax' 100 }; 101 102 const cookieConfig = window.COOKIE_CONFIG || {}; 103 104 expires = days && days !== sessionCookieMarker 105 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 106 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 107 108 path = cookieConfig.path || defaultCookieConfig.path; 109 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 110 secure = cookieConfig.secure || defaultCookieConfig.secure; 111 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 112 113 document.cookie = name + "=" + encodeURIComponent(value) + 114 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 115 (path ? '; path=' + path : '') + 116 (domain ? '; domain=' + domain : '') + 117 (secure ? '; secure' : '') + 118 (samesite ? '; samesite=' + samesite : 'lax'); 119 }, 120 isWebsiteAllowedToSaveCookie() { 121 const allowedCookies = this.get('user_allowed_save_cookie'); 122 if (allowedCookies) { 123 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 124 125 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 126 } 127 return false; 128 }, 129 getGroupByCookieName(name) { 130 const cookieConsentConfig = window.cookie_consent_config || {}; 131 let group = null; 132 for (let prop in cookieConsentConfig) { 133 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 134 if (cookieConsentConfig[prop].includes(name)) { 135 group = prop; 136 break; 137 } 138 } 139 return group; 140 }, 141 isCookieAllowed(name) { 142 const cookieGroup = this.getGroupByCookieName(name); 143 return cookieGroup 144 ? window.cookie_consent_groups[cookieGroup] 145 : this.isWebsiteAllowedToSaveCookie(); 146 }, 147 saveTempStorageCookies() { 148 for (const [name, data] of Object.entries(cookieTempStorage)) { 149 if (this.isCookieAllowed(name)) { 150 this.set(name, data['value'], data['days'], data['skipSetDomain']); 151 delete cookieTempStorage[name]; 152 } 153 } 154 } 155 }; 156 157 hyva.getCookie = (name) => { 158 const cookieConfig = window.COOKIE_CONFIG || {}; 159 160 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 161 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 162 } 163 164 return internalCookie.get(name); 165 } 166 167 hyva.setCookie = (name, value, days, skipSetDomain) => { 168 const cookieConfig = window.COOKIE_CONFIG || {}; 169 170 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 171 cookieTempStorage[name] = {value, days, skipSetDomain}; 172 return; 173 } 174 return internalCookie.set(name, value, days, skipSetDomain); 175 } 176 177 178 hyva.setSessionCookie = (name, value, skipSetDomain) => { 179 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 180 } 181 182 hyva.getBrowserStorage = () => { 183 const browserStorage = window.localStorage || window.sessionStorage; 184 if (!browserStorage) { 185 console.warn('Browser Storage is unavailable'); 186 return false;
187 } 188 try { 189 browserStorage.setItem('storage_test', '1'); 190 browserStorage.removeItem('storage_test'); 191 } catch (error) { 192 console.warn('Browser Storage is not accessible', error); 193 return false; 194 } 195 return browserStorage; 196 } 197 198 hyva.postForm = (postParams) => { 199 const form = document.createElement("form"); 200 201 let data = postParams.data; 202 203 if (! postParams.skipUenc && ! data.uenc) { 204 data.uenc = btoa(window.location.href); 205 } 206 form.method = "POST"; 207 form.action = postParams.action; 208 209 Object.keys(postParams.data).map(key => { 210 const field = document.createElement("input"); 211 field.type = 'hidden' 212 field.value = postParams.data[key]; 213 field.name = key; 214 form.appendChild(field); 215 }); 216 217 const form_key = document.createElement("input"); 218 form_key.type = 'hidden'; 219 form_key.value = hyva.getFormKey(); 220 form_key.name="form_key"; 221 form.appendChild(form_key); 222 223 document.body.appendChild(form); 224 225 form.submit(); 226 } 227 228 hyva.getFormKey = function () { 229 let formKey = hyva.getCookie('form_key'); 230 231 if (!formKey) { 232 formKey = generateRandomString(); 233 hyva.setCookie('form_key', formKey); 234 } 235 236 return formKey; 237 } 238 239 hyva.formatPrice = (value, showSign, options = {}) => { 240 const groupSeparator = options.groupSeparator; 241 const decimalSeparator = options.decimalSeparator 242 delete options.groupSeparator; 243 delete options.decimalSeparator; 244 const formatter = new Intl.NumberFormat( 245 'fr\u002DFR', 246 Object.assign({ 247 style: 'currency', 248 currency: 'EUR', 249 signDisplay: showSign ? 'always' : 'auto' 250 }, options) 251 ); 252 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 253 formatter.formatToParts(value).map(({type, value}) => { 254 switch (type) { 255 case 'currency': 256 return '\u20AC' || value; 257 case 'minusSign': 258 return '- '; 259 case 'plusSign': 260 return '+ '; 261 case 'group': 262 return groupSeparator !== undefined ? groupSeparator : value; 263 case 'decimal': 264 return decimalSeparator !== undefined ? decimalSeparator : value; 265 default : 266 return value; 267 } 268 }).reduce((string, part) => string + part) : 269 formatter.format(value); 270 } 271 272 const formatStr = function (str, nStart) { 273 const args = Array.from(arguments).slice(2); 274 275 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 276 const idx = parseInt(n) - nStart; 277 278 if (args[idx] === null || args[idx] === void 0) { 279 return m; 280 } 281 return p.length % 2 282 ? p.slice(0, -1).replace('%%', '%') + args[idx] 283 : p.replace('%%', '%') + n; 284 }) 285 } 286 287 hyva.str = function (string) { 288 const args = Array.from(arguments); 289 args.splice(1, 0, 1); 290 291 return formatStr.apply(undefined, args); 292 } 293 294 hyva.strf = function () { 295 const args = Array.from(arguments); 296 args.splice(1, 0, 0); 297 298 return formatStr.apply(undefined, args); 299 } 300 301 /** 302 * Take a html string as `content` parameter and 303 * extract an element from the DOM to replace in 304 * the current page under the same selector, 305 * defined by `targetSelector` 306 */ 307 hyva.replaceDomElement = (targetSelector, content) => { 308 // Parse the content and extract the DOM node using the `targetSelector` 309 const parser = new DOMParser(); 310 const doc = parser.parseFromString(content, 'text/html');
311 const contentNode = doc.querySelector(targetSelector); 312 313 // Bail if content or target can't be found 314 if (!contentNode || !document.querySelector(targetSelector)) { 315 return; 316 } 317 318 hyva.activateScripts(contentNode); 319 320 // Replace the old DOM node with the new content 321 document.querySelector(targetSelector).replaceWith(contentNode); 322 323 // Reload customerSectionData and display cookie-messages if present 324 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 325 hyva.initMessages(); 326 } 327 328 hyva.removeScripts = (contentNode) => { 329 const scripts = contentNode.getElementsByTagName('script'); 330 for (let i = 0; i < scripts.length; i++) { 331 scripts[i].parentNode.removeChild(scripts[i]); 332 } 333 const templates = contentNode.getElementsByTagName('template'); 334 for (let i = 0; i < templates.length; i++) { 335 const container = document.createElement('div'); 336 container.innerHTML = templates[i].innerHTML; 337 hyva.removeScripts(container); 338 templates[i].innerHTML = container.innerHTML; 339 } 340 } 341 342 hyva.activateScripts = (contentNode) => { 343 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 344 const scripts = Array.from(contentNode.getElementsByTagName('script')); 345 346 // Iterate over all script tags to duplicate+inject each into the head 347 for (const original of scripts) { 348 const script = document.createElement('script'); 349 original.type && (script.type = original.type); 350 script.innerHTML = original.innerHTML; 351 352 // Remove the original (non-executing) script from the contentNode 353 original.parentNode.removeChild(original) 354 355 // Add script to head 356 document.head.appendChild(script); 357 } 358 359 return contentNode; 360 } 361 362 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 363 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 364 365 let currentTrap; 366 367 const focusableElements = (rootElement) => { 368 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 369 return Array.from(rootElement.querySelectorAll(selector)) 370 .filter(el => { 371 return el.style.display !== 'none' 372 && !el.disabled 373 && el.tabIndex !== -1 374 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 375 }) 376 } 377 378 const focusTrap = (e) => { 379 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 380 if (!isTabPressed) return; 381 382 const focusable = focusableElements(currentTrap) 383 const firstFocusableElement = focusable[0] 384 const lastFocusableElement = focusable[focusable.length - 1] 385 386 e.shiftKey 387 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 388 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 389 }; 390 391 hyva.releaseFocus = (rootElement) => { 392 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 393 currentTrap.removeEventListener('keydown', focusTrap) 394 currentTrap = null 395 } 396 } 397 hyva.trapFocus = (rootElement) => { 398 if (!rootElement) return; 399 hyva.releaseFocus() 400 currentTrap = rootElement 401 rootElement.addEventListener('keydown', focusTrap) 402 const firstElement = focusableElements(rootElement)[0] 403 firstElement && firstElement.focus() 404 } 405 406 hyva.safeParseNumber = (rawValue) => { 407 const number = rawValue ? parseFloat(rawValue) : null; 408 409 return Array.isArray(number) || isNaN(number) ? rawValue : number; 410 } 411 412 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 413 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 414 415 const camelCase = toCamelCase(name);
416 const key = '__hyva_bool_' + name 417 418 return new Proxy(Object.assign( 419 additionalMethods, 420 { 421 [key]: !!value, 422 [name]() {return !!this[key]}, 423 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 424 ['not' + camelCase]() {return !this[key]}, 425 ['toggle' + camelCase]() {this[key] = !this[key]}, 426 [`set${camelCase}True`]() {this[key] = true}, 427 [`set${camelCase}False`]() {this[key] = false}, 428 } 429 ), { 430 set(target, prop, value) { 431 return prop === name 432 ? (target[key] = !!value) 433 : Reflect.set(...arguments); 434 } 435 }) 436 } 437 438 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 439 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 440 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 441 442 }( window.hyva = window.hyva || {} )); 443 //# sourceURL=hyva.js 444</script>
vendor: 1 bytes, line 444
444
445<script type="speculationrules"> 446{ 447 "tag": "Hyva Theme", 448 "prefetch": [{ 449 "source": "document", 450 "where": { 451 "and": [ 452 { "href_matches": "/*" }, 453 { "not": { 454 "href_matches": ["/fr/customer/*","/fr/search/*","/fr/sales/*","/fr/wishlist/*","/fr/checkout/*","/fr/paypal/*","/fr/newsletter/*","/fr/stores/store/redirect/*"] }}, 455 { "not": { 456 "selector_matches": [".no-preload", ".do-not-prerender", "[download]", "[rel~=nofollow]", "[target]"] 457 }} 458 ] 459 }, 460 "eagerness": "moderate" 461 }] 462} 463</script>
463 464</head> 465<body id="html-body" class="checkout-cart-index page-layout-1column"><a href="https://www.broderieplaisir.com/cdn-cgi/content?id=C0mu8hbolLEn8reX8y61C0_aRGoxTifImzhMSSJoZhQ-1790866267.7178168-1.2.1.1-X1_bh3yeNzNqGv5vgEQiwniqJB0mq2D7U3StaJwh0iQE7TfHMHojEZvxLDxqgBzR" aria-hidden="true" rel="nofollow noopener" style="display: none !important; visibility: hidden !important"></a> 466<input name="form_key" type="hidden" value="z6LX1KWv1L9598mb" /> 467 <noscript> 468 <section 469 class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal" 470 aria-labelledby="messageGlobalNoScriptMessage" 471 > 472 <div class="container text-center"> 473 <p id="messageGlobalNoScriptMessage"> 474 <strong>Javascript est désactivé dans votre navigateur.</strong> 475 <span> 476 Pour une meilleure expérience sur notre site, assurez-vous dâactiver JavaScript dans votre navigateur. </span> 477 </p> 478 </div> 479 </section> 480 </noscript> 481 482
483<script> 484 document.body.addEventListener('touchstart', () => {}, {passive: true}) 485</script>
485 486
487<script> 488 function initCookieBanner() { 489 const isUserAllowedSaveCookieName = 'user_allowed_save_cookie'; 490 const currentWebsiteId = 1; 491 492 const isAllowedSaveCookie = () => { 493 const allowedCookies = hyva.getCookie(isUserAllowedSaveCookieName); 494 const allowedCookieWebsites = allowedCookies 495 ? JSON.parse(unescape(allowedCookies)) 496 : []; 497 498 return allowedCookieWebsites[currentWebsiteId] !== undefined 499 ? !! allowedCookieWebsites[currentWebsiteId] 500 : false; 501 }; 502 503 return { 504 showCookieBanner: false, 505 cookieName: isUserAllowedSaveCookieName, 506 cookieValue: '{"1":1}', 507 cookieLifetime: '31536000', 508 noCookiesUrl: 'https\u003A\u002F\u002Fwww.broderieplaisir.com\u002Ffr\u002Fcookie\u002Findex\u002FnoCookies\u002F', 509 checkAcceptCookies() { 510 this.showCookieBanner = ! isAllowedSaveCookie(); 511 }, 512 hideCookieBanner() { 513 this.showCookieBanner = false; 514 },
515 setAcceptCookies() { 516 const cookieExpires = this.cookieLifetime / 60 / 60 / 24; 517 hyva.setCookie(this.cookieName, this.cookieValue, cookieExpires); 518 if (!hyva.getCookie(this.cookieName)) { 519 window.location.href = this.noCookiesUrl; 520 } else { 521 window.dispatchEvent(new CustomEvent('user-allowed-save-cookie')); 522 } 523 this.showCookieBanner = false; 524 } 525 } 526 } 527 window.addEventListener('alpine:init', () => Alpine.data('initCookieBanner', initCookieBanner), {once: true}) 528</script>
528 529 <section id="notice-cookie-block" 530 aria-label="Nous utilisons les cookies pour vous offrir une meilleure expérience utilisateur." 531 x-data="initCookieBanner" 532 x-init="checkAcceptCookies" 533 x-defer="idle" 534> 535 <template x-if="showCookieBanner"> 536 <div role="dialog" 537 aria-modal="true" 538 class="container fixed py-0 right-0 bottom-0 z-30 flex max-w-full bg-gray-100 539 border-t-2 border-gray-300" 540 > 541 <button 542 @click="hideCookieBanner" 543 aria-label="Fermer le panel" 544 title="Fermer le panel" 545 class="absolute right-0 top-0 p-4" 546 > 547 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" aria-hidden="true"> 548 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 549</svg> 550 </button> 551 552 <div class="p-2 pr-4"> 553 <p class="mb-1"> 554 <span class="font-semibold"> 555 Nous utilisons les cookies pour vous offrir une meilleure expérience utilisateur. </span> 556 </p> 557 <p class="mb-1"> 558 <span> 559 Pour se conformer à la nouvelle directive concernant la vie privée, nous devons vous demander votre consentement pour sauvegarder des cookies sur votre ordinateur. </span> 560 </p> 561 <p class="mb-4"> 562 <a href="https://www.broderieplaisir.com/fr/privacy-policy-cookie-restriction-mode/" 563 class="underline"> 564 Lire notre politique </a> 565 </p> 566 <div class="my-2"> 567 <button @click="setAcceptCookies" 568 id="btn-cookie-allow" 569 class="btn btn-primary" 570 > 571 Autoriser les cookies </button> 572 </div> 573 </div> 574 </div> 575 </template> 576</section> 577<div class="page-wrapper"><header class="page-header"><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focu
577s:bg-white 578 contentarea" 579 href="#contentarea"> 580 <span> 581 Allez au contenu </span> 582</a>
583<script> 584 function initHeader () { 585 return { 586 searchOpen: false, 587 cart: {}, 588 isCartOpen: false, 589 getData(data) { 590 if (data.cart) { this.cart = data.cart } 591 }, 592 isCartEmpty() { 593 return !this.cart.summary_count 594 }, 595 toggleCart(event) { 596 if (event.detail && event.detail.isOpen !== undefined) { 597 this.isCartOpen = event.detail.isOpen 598 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 599 this.$refs.cartButton.focus() 600 } 601 } else { 602 this.isCartOpen = true 603 } 604 } 605 } 606 } 607 function initCompareHeader() { 608 return { 609 compareProducts: null, 610 itemCount: 0, 611 receiveCompareData(data) { 612 if (data['compare-products']) { 613 this.compareProducts = data['compare-products']; 614 this.itemCount = this.compareProducts.count; 615 } 616 } 617 } 618 } 619</script>
619 620<div id="header" 621 class="relative z-30 w-full border-b shadow bg-container-lighter border-container-lighter" 622 x-data="initHeader()" 623 @private-content-loaded.window="getData(event.detail.data)" 624> 625 <div class="container flex flex-wrap lg:flex-nowrap items-center w-full px-6 py-3 mx-auto mt-0"> 626 <!-- Spacer invisible pour équilibrer les icônes et centrer le logo sur desktop --> 627 <div class="hidden lg:block lg:flex-1" aria-hidden="true"></div> 628 <!--Logo--> 629 <div class="order-1 w-full pb-2 sm:pb-0 lg:w-auto"> 630 <a 631 class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 632 no-underline hover:no-underline font-title" 633 href="https://www.broderieplaisir.com/fr/" 634 aria-label="Aller à la page d'accueil" 635 > 636 <img 637 src="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/images/logo.png" 638 alt="Logo du magasin" 639 width="500" height="131" /> 640 </a> 641</div> 642 643 <!--Main Navigation--> 644 <div x-data="initMobileMenu" x-bind="eventListeners" class="lg:hidden"> 645 <button 646 type="button" 647 class="btn bg-transparent border-transparent p-2" 648 aria-label="Ouvrir le menu" 649 @click="open" 650 > 651 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 5h16M4 12h16M4 19h16"/></svg> 652 </button> 653 <dialog 654 class="size-full max-h-full ms-0 p-0 open:flex flex-col transition ease-out duration-300 motion-reduce:duration-0 rounded-s-none" 655 x-show="isOpen" 656 x-htmldialog="close" 657 closeby="any" 658 x-transition:enter-start="-translate-x-full" 659 x-transition:enter-end="translate-x-0" 660 x-transition:leave-start="translate-x-0" 661 x-transition:leave-end="-translate-x-full" 662 > 663 <div class="border-b border-slate-200"> 664 <div class="flex justify-between items-center gap-2 py-4 px-6"> 665 <div></div> 666 <button 667 type="button" 668 @click="close" 669 class="btn bg-transparent border-transparent p-1" 670 aria-label="Fermer le menu" 671 > 672 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg> 673 </button> 674 </div> 675 </div> 676 <div class="grow relative overflow-y-auto overflow-x-clip py-0.5" :style="lockWrapperScroll"> 677 <nav aria-label="Mobile Main Menu"> 678 <ul> 679 <li data-level="0" x-data="initMobileSubMenu"> 680 <button 681 type="button" 682 class="w-full justify-between flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 683 aria-controls="category-node-9-mobile-menu-panel" 684 aria-expanded="false" 685 x-ref="openSubMenuBtn" 686 :aria-expanded="isOpen" 687 :disabled="isOpen" 688 @click="open" 689 > 690 <span> Matières à broder</span> 691 <span class="btn p-1.5 border border-slate-300 bg-transparent text-current"> 692 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewB
692ox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> 693 </span> 694 </button> 695 <ul 696 id="category-node-9-mobile-menu-panel" 697 class="z-10 absolute inset-0 bg-white py-0.5 overflow-y-auto overscroll-y-contain transition motion-reduce:duration-0" 698 x-show="isOpen" 699 x-transition:enter-start="opacity-0 translate-x-8" 700 x-transition:enter-end="opacity-100 translate-x-0" 701 x-transition:leave-start="opacity-100 translate-x-0" 702 x-transition:leave-end="opacity-0 translate-x-8" 703 @keydown.escape.stop.prevent="close" 704 > 705 <li data-level="1"> 706 <button 707 type="button" 708 class="w-full bg-surface font-bold flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 709 @click="close" 710 x-ref="closeSubMenuBtn" 711 > 712 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg> 713 Matières à broder </button> 714 <a 715 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/matieres-a-broder/id/9/" 716 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 717 > 718 <span class="ms-7">See all Matières à broder</span> 719 </a> 720 </li> 721 <li data-level="1"> 722 <a 723 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/coton-perle-fin/id/41/" 724 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 725 > 726 <span class="ms-7">Coton perlé fin</span> 727 </a> 728 </li> 729 <li data-level="1"> 730 <a 731 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/coton-mercerise/id/40/" 732 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 733 > 734 <span class="ms-7">Coton mercerisé</span> 735 </a> 736 </li> 737 <li data-level="1"> 738 <a 739 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/coton-mouline/id/36/" 740 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 741 >
742 <span class="ms-7">Coton mouliné</span> 743 </a> 744 </li> 745 <li data-level="1"> 746 <a 747 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fil-coton-dare-dare/id/107/" 748 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 749 > 750 <span class="ms-7">Fil coton Dare Dare</span> 751 </a> 752 </li> 753 <li data-level="1"> 754 <a 755 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fil-metal-metallise/id/43/" 756 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 757 > 758 <span class="ms-7">Fil métal - métallisé</span> 759 </a> 760 </li> 761 <li data-level="1"> 762 <a 763 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/assortiment-de-fils/id/44/" 764 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 765 > 766 <span class="ms-7">Assortiment de fils</span> 767 </a> 768 </li> 769 <li data-level="1"> 770 <a 771 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fil-a-gant-glace-invisible/id/52/" 772 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 773 > 774 <span class="ms-7">Fil à gant - glacé - invisible</span> 775 </a> 776 </li> 777 <li data-level="1"> 778 <a 779 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/soie-perlee-au-ver-a-soie/id/108/" 780 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 781 > 782 <span class="ms-7">Soie perlée "Au Ver à Soie"</span> 783 </a> 784 </li> 785 <li data-level="1"> 786 <a 787 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/filament-de-soie-soie-ovale/id/33/" 788 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 789 >
790 <span class="ms-7">Filament de soie / Soie ovale</span> 791 </a> 792 </li> 793 <li data-level="1"> 794 <a 795 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fils-chenille/id/141/" 796 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 797 > 798 <span class="ms-7">Fils chenille</span> 799 </a> 800 </li> 801 <li data-level="1"> 802 <a 803 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/soie-fine/id/34/" 804 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 805 > 806 <span class="ms-7">Soie fine </span> 807 </a> 808 </li> 809 <li data-level="1"> 810 <a 811 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rayonne-perlee/id/37/" 812 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 813 > 814 <span class="ms-7">Rayonne perlée</span> 815 </a> 816 </li> 817 <li data-level="1"> 818 <a 819 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fils-rayonne/id/39/" 820 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 821 > 822 <span class="ms-7">Fils rayonne</span> 823 </a> 824 </li> 825 <li data-level="1"> 826 <a 827 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/chainette-lurex/id/42/" 828 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 829 > 830 <span class="ms-7">Chainette Lurex</span> 831 </a> 832 </li> 833 <li data-level="1"> 834 <a 835 href="https://www.broderieplaisir.com/fr/les-fils-a-broder/ganse-rayonne.html" 836 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 837 >
838 <span class="ms-7">Ganse rayonne</span> 839 </a> 840 </li> 841 <li data-level="1"> 842 <a 843 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fils-fantaisie/id/46/" 844 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 845 > 846 <span class="ms-7">Fils fantaisie</span> 847 </a> 848 </li> 849 </ul> 850 </li> 851 <li data-level="0" x-data="initMobileSubMenu"> 852 <button 853 type="button" 854 class="w-full justify-between flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 855 aria-controls="category-node-3-mobile-menu-panel" 856 aria-expanded="false" 857 x-ref="openSubMenuBtn" 858 :aria-expanded="isOpen" 859 :disabled="isOpen" 860 @click="open" 861 > 862 <span>Rubans & Galons</span> 863 <span class="btn p-1.5 border border-slate-300 bg-transparent text-current"> 864 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> 865 </span> 866 </button> 867 <ul 868 id="category-node-3-mobile-menu-panel" 869 class="z-10 absolute inset-0 bg-white py-0.5 overflow-y-auto overscroll-y-contain transition motion-reduce:duration-0" 870 x-show="isOpen" 871 x-transition:enter-start="opacity-0 translate-x-8" 872 x-transition:enter-end="opacity-100 translate-x-0" 873 x-transition:leave-start="opacity-100 translate-x-0" 874 x-transition:leave-end="opacity-0 translate-x-8" 875 @keydown.escape.stop.prevent="close" 876 > 877 <li data-level="1"> 878 <button 879 type="button" 880 class="w-full bg-surface font-bold flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 881 @click="close" 882 x-ref="closeSubMenuBtn" 883 > 884 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg> 885 Rubans & Galons </button> 886 <a 887 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rubans-galons/id/3/" 888 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 889 >
890 <span class="ms-7">See all Rubans & Galons</span> 891 </a> 892 </li> 893 <li data-level="1"> 894 <a 895 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-de-soie/id/11/" 896 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 897 > 898 <span class="ms-7">Ruban de soie</span> 899 </a> 900 </li> 901 <li data-level="1"> 902 <a 903 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-viscose/id/12/" 904 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 905 > 906 <span class="ms-7">Ruban viscose</span> 907 </a> 908 </li> 909 <li data-level="1"> 910 <a 911 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-organza/id/13/" 912 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 913 > 914 <span class="ms-7">Ruban organza</span> 915 </a> 916 </li> 917 <li data-level="1"> 918 <a 919 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/soutache/id/23/" 920 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 921 > 922 <span class="ms-7">Soutache</span> 923 </a> 924 </li> 925 <li data-level="1"> 926 <a 927 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/raphia-a-broder/id/109/" 928 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 929 > 930 <span class="ms-7">Raphia à broder</span> 931 </a> 932 </li> 933 <li data-level="1"> 934 <a 935 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/passementerie/id/20/" 936 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 937 >
938 <span class="ms-7">Passementerie</span> 939 </a> 940 </li> 941 <li data-level="1"> 942 <a 943 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-a-picots/id/105/" 944 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 945 > 946 <span class="ms-7">Ruban à picots</span> 947 </a> 948 </li> 949 <li data-level="1"> 950 <a 951 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rubans-et-galons-anciens/id/106/" 952 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 953 > 954 <span class="ms-7">Rubans et galons anciens</span> 955 </a> 956 </li> 957 </ul> 958 </li> 959 <li data-level="0" x-data="initMobileSubMenu"> 960 <button 961 type="button" 962 class="w-full justify-between flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 963 aria-controls="category-node-7-mobile-menu-panel" 964 aria-expanded="false" 965 x-ref="openSubMenuBtn" 966 :aria-expanded="isOpen" 967 :disabled="isOpen" 968 @click="open" 969 > 970 <span>Paillettes, sequins & strass </span> 971 <span class="btn p-1.5 border border-slate-300 bg-transparent text-current"> 972 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> 973 </span> 974 </button> 975 <ul 976 id="category-node-7-mobile-menu-panel" 977 class="z-10 absolute inset-0 bg-white py-0.5 overflow-y-auto overscroll-y-contain transition motion-reduce:duration-0" 978 x-show="isOpen" 979 x-transition:enter-start="opacity-0 translate-x-8" 980 x-transition:enter-end="opacity-100 translate-x-0" 981 x-transition:leave-start="opacity-100 translate-x-0" 982 x-transition:leave-end="opacity-0 translate-x-8" 983 @keydown.escape.stop.prevent="close" 984 > 985 <li data-level="1"> 986 <button 987 type="button" 988 class="w-full bg-surface font-bold flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 989 @click="close" 990 x-ref="closeSubMenuBtn" 991 > 992 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewB
992ox="0 0 24 24" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg> 993 Paillettes, sequins & strass </button> 994 <a 995 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/paillettes-sequins-strass/id/7/" 996 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 997 > 998 <span class="ms-7">See all Paillettes, sequins & strass </span> 999 </a> 1000 </li> 1001 <li data-level="1"> 1002 <a 1003 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/paillettes-a-broder/id/56/" 1004 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1005 > 1006 <span class="ms-7">Paillettes à broder </span> 1007 </a> 1008 </li> 1009 <li data-level="1"> 1010 <a 1011 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/cuvettes-a-broder/id/58/" 1012 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1013 > 1014 <span class="ms-7">Cuvettes à broder </span> 1015 </a> 1016 </li> 1017 <li data-level="1"> 1018 <a 1019 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/sequins-et-cabochons/id/16/" 1020 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1021 > 1022 <span class="ms-7">Sequins et cabochons</span> 1023 </a> 1024 </li> 1025 <li data-level="1"> 1026 <a 1027 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/paillettes-anciennes/id/69/" 1028 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1029 > 1030 <span class="ms-7">Paillettes anciennes</span> 1031 </a> 1032 </li> 1033 <li data-level="1"> 1034 <a 1035 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/strass/id/145/" 1036 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1037 > 1038 <span class="ms-7">Strass</span> 1039 </a> 1040 </li> 1041 <li data-level="1"> 1042 <a 1043 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/eclats-perces/id/146/" 1044 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1045 >
1046 <span class="ms-7">Eclats percés</span> 1047 </a> 1048 </li> 1049 </ul> 1050 </li> 1051 <li data-level="0" x-data="initMobileSubMenu"> 1052 <button 1053 type="button" 1054 class="w-full justify-between flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1055 aria-controls="category-node-8-mobile-menu-panel" 1056 aria-expanded="false" 1057 x-ref="openSubMenuBtn" 1058 :aria-expanded="isOpen" 1059 :disabled="isOpen" 1060 @click="open" 1061 > 1062 <span>Les perles</span> 1063 <span class="btn p-1.5 border border-slate-300 bg-transparent text-current"> 1064 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> 1065 </span> 1066 </button> 1067 <ul 1068 id="category-node-8-mobile-menu-panel" 1069 class="z-10 absolute inset-0 bg-white py-0.5 overflow-y-auto overscroll-y-contain transition motion-reduce:duration-0" 1070 x-show="isOpen" 1071 x-transition:enter-start="opacity-0 translate-x-8" 1072 x-transition:enter-end="opacity-100 translate-x-0" 1073 x-transition:leave-start="opacity-100 translate-x-0" 1074 x-transition:leave-end="opacity-0 translate-x-8" 1075 @keydown.escape.stop.prevent="close" 1076 > 1077 <li data-level="1"> 1078 <button 1079 type="button" 1080 class="w-full bg-surface font-bold flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1081 @click="close" 1082 x-ref="closeSubMenuBtn" 1083 > 1084 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg> 1085 Les perles </button> 1086 <a 1087 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/les-perles/id/8/" 1088 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1089 > 1090 <span class="ms-7">See all Les perles</span> 1091 </a> 1092 </li> 1093 <li data-level="1"> 1094 <a 1095 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/perles-sur-fils/id/53/" 1096 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1097 >
1098 <span class="ms-7">Perles sur fils</span> 1099 </a> 1100 </li> 1101 <li data-level="1"> 1102 <a 1103 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/perles-anciennes/id/61/" 1104 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1105 > 1106 <span class="ms-7">Perles anciennes</span> 1107 </a> 1108 </li> 1109 <li data-level="1"> 1110 <a 1111 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/tubes-et-mini-tubes/id/139/" 1112 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1113 > 1114 <span class="ms-7">Tubes et mini tubes</span> 1115 </a> 1116 </li> 1117 <li data-level="1"> 1118 <a 1119 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rocailles-et-autres-perles/id/18/" 1120 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1121 > 1122 <span class="ms-7">Rocailles et autres perles</span> 1123 </a> 1124 </li> 1125 <li data-level="1"> 1126 <a 1127 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fleurs-et-pistils/id/70/" 1128 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1129 > 1130 <span class="ms-7">Fleurs et pistils</span> 1131 </a> 1132 </li> 1133 <li data-level="1"> 1134 <a 1135 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/micro-perles/id/138/" 1136 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1137 > 1138 <span class="ms-7">Micro perles</span> 1139 </a> 1140 </li> 1141 </ul> 1142 </li> 1143 <li data-level="0" x-data="initMobileSubMenu"> 1144 <button 1145 type="button" 1146 class="w-full justify-between flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1147 aria-controls="category-node-10-mobile-menu-panel" 1148 aria-expanded="false" 1149 x-ref="openSubMenuBtn" 1150 :aria-expanded="isOpen" 1151 :disabled="isOpen" 1152 @click="open" 1153 >
1154 <span>Matériel & Mercerie</span> 1155 <span class="btn p-1.5 border border-slate-300 bg-transparent text-current"> 1156 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> 1157 </span> 1158 </button> 1159 <ul 1160 id="category-node-10-mobile-menu-panel" 1161 class="z-10 absolute inset-0 bg-white py-0.5 overflow-y-auto overscroll-y-contain transition motion-reduce:duration-0" 1162 x-show="isOpen" 1163 x-transition:enter-start="opacity-0 translate-x-8" 1164 x-transition:enter-end="opacity-100 translate-x-0" 1165 x-transition:leave-start="opacity-100 translate-x-0" 1166 x-transition:leave-end="opacity-0 translate-x-8" 1167 @keydown.escape.stop.prevent="close" 1168 > 1169 <li data-level="1"> 1170 <button 1171 type="button" 1172 class="w-full bg-surface font-bold flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1173 @click="close" 1174 x-ref="closeSubMenuBtn" 1175 > 1176 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg> 1177 Matériel & Mercerie </button> 1178 <a 1179 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/materiel-mercerie/id/10/" 1180 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1181 > 1182 <span class="ms-7">See all Matériel & Mercerie</span> 1183 </a> 1184 </li> 1185 <li data-level="1"> 1186 <a 1187 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/crochet-metier-et-tambour/id/49/" 1188 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1189 > 1190 <span class="ms-7">Crochet, métier et tambour</span> 1191 </a> 1192 </li> 1193 <li data-level="1"> 1194 <a 1195 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/piquoir-et-poudre-a-poncer/id/104/" 1196 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1197 > 1198 <span class="ms-7">
1198Piquoir et poudre à poncer</span> 1199 </a> 1200 </li> 1201 <li data-level="1"> 1202 <a 1203 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/mercerie-aiguilles/id/50/" 1204 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1205 > 1206 <span class="ms-7">Mercerie, aiguilles</span> 1207 </a> 1208 </li> 1209 <li data-level="1"> 1210 <a 1211 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/broderie-d-or/id/51/" 1212 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1213 > 1214 <span class="ms-7">Broderie d'or</span> 1215 </a> 1216 </li> 1217 <li data-level="1"> 1218 <a 1219 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/monogrammes-anciens/id/62/" 1220 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1221 > 1222 <span class="ms-7">Monogrammes anciens</span> 1223 </a> 1224 </li> 1225 <li data-level="1"> 1226 <a 1227 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/organza-de-soie-et-lames/id/84/" 1228 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1229 > 1230 <span class="ms-7">Organza de soie et lamés</span> 1231 </a> 1232 </li> 1233 <li data-level="1"> 1234 <a 1235 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/cartes-cadeau/id/103/" 1236 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1237 > 1238 <span class="ms-7">Cartes cadeau</span> 1239 </a> 1240 </li> 1241 <li data-level="1"> 1242 <a 1243 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/livres-de-broderie/id/113/" 1244 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1245 >
1246 <span class="ms-7">Livres de broderie</span> 1247 </a> 1248 </li> 1249 </ul> 1250 </li> 1251 <li data-level="0"> 1252 <a 1253 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/nouveautes/id/76/" 1254 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1255 > 1256 Nouveautés </a> 1257 </li> 1258 <li data-level="0" x-data="initMobileSubMenu"> 1259 <button 1260 type="button" 1261 class="w-full justify-between flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1262 aria-controls="category-node-101-mobile-menu-panel" 1263 aria-expanded="false" 1264 x-ref="openSubMenuBtn" 1265 :aria-expanded="isOpen" 1266 :disabled="isOpen" 1267 @click="open" 1268 > 1269 <span>Infos</span> 1270 <span class="btn p-1.5 border border-slate-300 bg-transparent text-current"> 1271 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg> 1272 </span> 1273 </button> 1274 <ul 1275 id="category-node-101-mobile-menu-panel" 1276 class="z-10 absolute inset-0 bg-white py-0.5 overflow-y-auto overscroll-y-contain transition motion-reduce:duration-0" 1277 x-show="isOpen" 1278 x-transition:enter-start="opacity-0 translate-x-8" 1279 x-transition:enter-end="opacity-100 translate-x-0" 1280 x-transition:leave-start="opacity-100 translate-x-0" 1281 x-transition:leave-end="opacity-0 translate-x-8" 1282 @keydown.escape.stop.prevent="close" 1283 > 1284 <li data-level="1"> 1285 <button 1286 type="button" 1287 class="w-full bg-surface font-bold flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1288 @click="close" 1289 x-ref="closeSubMenuBtn" 1290 > 1291 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m15 18-6-6 6-6"/></svg> 1292 Infos </button> 1293 <a 1294 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/infos/id/101/" 1295 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1296 >
1297 <span class="ms-7">See all Infos</span> 1298 </a> 1299 </li> 1300 <li data-level="1"> 1301 <a 1302 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/tarifs-et-livraisons/id/126/" 1303 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1304 > 1305 <span class="ms-7">Tarifs et livraisons</span> 1306 </a> 1307 </li> 1308 <li data-level="1"> 1309 <a 1310 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/le-compte-pro/id/127/" 1311 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1312 > 1313 <span class="ms-7">le Compte Pro</span> 1314 </a> 1315 </li> 1316 <li data-level="1"> 1317 <a 1318 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/nous-contacter/id/128/" 1319 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1320 > 1321 <span class="ms-7">Nous contacter</span> 1322 </a> 1323 </li> 1324 <li data-level="1"> 1325 <a 1326 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/satisfait-ou-rembourse/id/129/" 1327 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1328 > 1329 <span class="ms-7">Satisfait ou remboursé</span> 1330 </a> 1331 </li> 1332 <li data-level="1"> 1333 <a 1334 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/conditions-generales/id/130/" 1335 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1336 > 1337 <span class="ms-7">Conditions générales</span> 1338 </a> 1339 </li> 1340 <li data-level="1"> 1341 <a 1342 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/qui-sommes-nous/id/131/" 1343 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1344 >
1345 <span class="ms-7">Qui sommes nous ?</span> 1346 </a> 1347 </li> 1348 <li data-level="1"> 1349 <a 1350 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/nos-actualites/id/132/" 1351 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1352 > 1353 <span class="ms-7">Nos actualités</span> 1354 </a> 1355 </li> 1356 <li data-level="1"> 1357 <a 1358 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/le-compte-etudiant/id/140/" 1359 class="flex items-center gap-2 py-3 px-6 border-b border-slate-200 outline-offset-0" 1360 > 1361 <span class="ms-7">Le Compte Etudiant</span> 1362 </a> 1363 </li> 1364 </ul> 1365 </li> 1366 </ul> 1367 </nav> 1368 </div> 1369 </dialog> 1370</div>
1371<script> 1372 const initMobileMenu = () => { 1373 return { 1374 isOpen: false, 1375 isSubMenuOpen: false, 1376 isOverflowing: false, 1377 init() { 1378 Array.from(this.$root.querySelectorAll('a')).forEach(link => { 1379 if (link.href === `${window.location.origin}${window.location.pathname}`) { 1380 link.setAttribute('aria-current', 'page'); 1381 } 1382 }); 1383 }, 1384 open() { 1385 this.isOpen = true; 1386 }, 1387 close() { 1388 this.isOpen = false; 1389 }, 1390 lockWrapperScroll() { 1391 return this.isSubMenuOpen ? { overflow: 'hidden' } : {} 1392 }, 1393 hasActiveSubMenu() { 1394 this.isSubMenuOpen = !!this.$root.querySelector('[data-open]'); 1395 }, 1396 eventListeners: { 1397 ['@pageshow.window'](event) { 1398 if (event.persisted) { 1399 this.close(); 1400 }; 1401 } 1402 } 1403 } 1404 }; 1405 1406 const initMobileSubMenu = () => { 1407 return { 1408 isOpen: false, 1409 open() { 1410 this.isOpen = true; 1411 this.$root.setAttribute('data-open', ''); 1412 this.$nextTick(() => { 1413 this.$dispatch('sub-menu-state-change'); 1414 this.$refs.closeSubMenuBtn.focus(); 1415 this.toggleInert(); 1416 }) 1417 }, 1418 close() { 1419 this.isOpen = false; 1420 this.$root.removeAttribute('data-open'); 1421 this.toggleInert(); 1422 this.$nextTick(() => { 1423 this.$dispatch('sub-menu-state-change') 1424 this.$refs.openSubMenuBtn.focus(); 1425 }) 1426 }, 1427 toggleInert() { 1428 const items = this.$root.parentElement.children; 1429 1430 for (item of items) { 1431 if (item.hasAttribute('data-open')) continue; 1432 item.toggleAttribute('inert', this.isOpen); 1433 } 1434 } 1435 } 1436 } 1437 1438 document.addEventListener('alpine:init', () => { 1439 Alpine.data('initMobileMenu', initMobileMenu); 1440 Alpine.data('initMobileSubMenu', initMobileSubMenu); 1441 }, { once: true }); 1442</script>
1442 1443 1444 <div class="flex items-center gap-2 md:gap-1 order-3 md:-mr-1 lg:flex-1 lg:justify-end"> 1445 <!--Compare Icon--> 1446 <a id="compare-link" 1447 class="ml-auto relative inline-block rounded p-1 hover:bg-primary/10 outline-offset-2 invisible" 1448 :class="{ 'invisible': !(itemCount > 0) }" 1449 href="https://www.broderieplaisir.com/fr/catalog/product_compare/index/" 1450 title="Comparer des produits" 1451 x-data="initCompareHeader()" 1452 @private-content-loaded.window="receiveCompareData($event.detail.data)" 1453 :aria-label="` 1454 Comparer des produits, 1455 ${itemCount > 1 1456 ? hyva.str('\u00251\u0020articles', itemCount) 1457 : hyva.str('\u00251\u0020article', itemCount) 1458 }`" 1459 > 1460 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> 1461 <path stroke-linecap="round" stroke-linejoin="round" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3"/> 1462</svg> 1463 <span 1464 x-text="itemCount" 1465 class="absolute -top-1.5 -right-1.5 h-5 px-2 py-1 rounded-full bg-yellow-500 text-white 1466 text-xs font-semibold leading-none text-center uppercase tabular-nums" 1467 aria-hidden="true" 1468 ></span> 1469 </a> 1470 1471 <!--Search Icon--> 1472 <button 1473 id="menu-search-icon" 1474 class="rounded p-1 hover:bg-primary/10 outline-offset-2" 1475 @click.prevent=" 1476 searchOpen = !searchOpen; 1477 $dispatch('search-open'); 1478 " 1479 aria-label="Afficher/Masquer le formulaire de recherche" 1480 aria-haspopup="true" 1481 :aria-expanded="searchOpen" 1482 x-ref="searchButton" 1483 > 1484 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> 1485 <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> 1486</svg> 1487 </button> 1488 1489 <!--Customer Icon & Dropdown--> 1490 1491<div 1492 class="relative inline-block" 1493 x-data="{ 1494 open: false, 1495 isLoggedIn: false, 1496 onPrivateContentLoaded() { 1497 const data = this.$event.detail.data; 1498 this.isLoggedIn = data.customer && data.customer.firstname; 1499 } 1500 }" 1501 @private-content-loaded.window="onPrivateContentLoaded()" 1502 @keyup.escape="open = false" 1503 @click.outside="open = false" 1504> 1505 <button 1506 type="button" 1507 id="customer-menu" 1508 class="block rounded p-1 hover:bg-primary/10 outline-offset-2" 1509 @click="open = !open" 1510 :aria-expanded="open ? 'true' : 'false'" 1511 aria-label="Mon compte" 1512 aria-haspopup="true" 1513 > 1514 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> 1515 <path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/> 1516</svg> 1517 </button> 1518 <nav 1519 class=" 1520 absolute right-0 z-20 w-40 py-2 mt-2 -mr-4 px-1 overflow-auto origin-top-right rounded-sm 1521 shadow-lg sm:w-48 lg:mt-3 bg-container-lighter 1522 " 1523 x-cloak 1524 x-show="open" 1525 aria-labelledby="customer-menu" 1526 > 1527 <template x-if="isLoggedIn"> 1528 <div> 1529 1530 <a id="customer.header.dashboard.link" 1531 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100"
1532 href="https://www.broderieplaisir.com/fr/customer/account/" 1533 title="Mon compte" 1534 > 1535 Mon compte </a> 1536 1537<a 1538 id="customer.header.wishlist.link" 1539 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 relative" 1540 href="https://www.broderieplaisir.com/fr/wishlist/" 1541 title="Ma liste d’envies" 1542 x-data="{ itemCount: 0 }" 1543 @private-content-loaded.window="itemCount = parseInt($event.detail.data.wishlist.counter)" 1544> 1545 Ma liste dâenvies <template x-if="itemCount"> 1546 <span class="tabular-nums" x-text="`(${itemCount})`"></span> 1547 </template> 1548</a> 1549 1550 <a id="customer.header.orders.link" 1551 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 1552 href="https://www.broderieplaisir.com/fr/sales/order/history/" 1553 title="Mes commandes" 1554 > 1555 Mes commandes </a> 1556 1557 <a id="customer.header.address.book.link" 1558 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 1559 href="https://www.broderieplaisir.com/fr/customer/address/" 1560 title="Carnet d’adresses" 1561 > 1562 Carnet dâadresses </a> 1563 1564<span id="customer.header.sign.out.delimiter" 1565 class="delimiter block border-b border-container w-full my-2" 1566></span> 1567 1568 <a id="customer.header.sign.out.link" 1569 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 1570 href="https://www.broderieplaisir.com/fr/customer/account/logout/" 1571 title="Se déconnecter" 1572 > 1573 Se déconnecter </a> 1574 </div> 1575 </template> 1576 <template x-if="!isLoggedIn"> 1577 <div> 1578 1579<a id="customer.header.sign.in.link" 1580 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 1581 onclick="hyva.setCookie && hyva.setCookie( 1582 'login_redirect', 1583 window.location.href, 1584 1 1585 )" 1586 href="https://www.broderieplaisir.com/fr/customer/account/index/" 1587 title="Connexion" 1588> 1589 Connexion</a> 1590 1591 <a id="customer.header.register.link" 1592 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100" 1593 href="https://www.broderieplaisir.com/fr/customer/account/create/" 1594 title="Créer un compte" 1595 > 1596 Créer un compte </a> 1597 </div> 1598 </template> 1599 </nav> 1600</div> 1601 1602 <!--Cart Icon--> 1603 <a 1604 id="menu-cart-icon" 1605 class="relative inline-block rounded p-1 hover:bg-primary/10 outline-offset-2" 1606 x-ref="cartButton" 1607 :aria-disabled="isCartEmpty()" 1608 :aria-label="` 1609 Voir le panier, 1610 ${isCartEmpty() 1611 ? 'Le panier est vide' 1612 : cart.summary_count > 1 1613 ? hyva.str('%1 articles', cart.summary_count) 1614 : hyva.str('%1 item', cart.summary_count) 1615 }`" 1616 href="https://www.broderieplaisir.com/fr/checkout/cart/index/" 1617 title="Voir le panier" 1618 > 1619 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="md:h-6 md:w-6" width="28" height="28" aria-hidden="true"> 1620 <path stroke-linecap="round" stroke-linejoin="round" d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"/> 1621</svg> 1622 <span 1623 x-text="cart.summary_count" 1624 x-show="!isCartEmpty()" 1625 x-cloak 1626 class="absolute -top-1.5 -right-1.5 h-5 px-2 py-1 rounded-full bg-primary text-white 1627 text-xs font-semibold leading-none text-center uppercase tabular-nums" 1628 aria-hidden="true" 1629 ></span> 1630 </a> 1631 1632 <!-- Additional Header Elements --> 1633 <div x-data="{ open: false }" 1634 class="w-auto" 1635 > 1636 <div class="relative inline-block text-left"> 1637 <div> 1638 <button @click.prevent="open = !open" 1639 @click.outside="open = false" 1640 @keydown.window.escape="open=false" 1641 type="button" 1642 class="inline-flex form-select py-2 bg-white text-black focus:outline-none" 1643 aria-haspopup="true" 1644 aria-expanded="true" 1645 > 1646 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3 2" width="24" height="24" role="img"><path fill="#EC1920" d="M0 0h3v2H0z"/><path fill="#fff" d="M0 0h2v2H0z"/><path fill="#051440" d="M0 0h1v2H0z"/><title>fr</title></svg> 1647 </button> 1648 </div> 1649 <nav x-cloak="" 1650 x-show="open" 1651 class="absolute right-0 top-full z-20 w-full py-2 mt-1 overflow-auto origin-top-left rounded-sm shadow-lg lg:mt-3 bg-container-lighter"> 1652 <div class="my-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu"> 1653 <a href="https://www.broderieplaisir.com/fr/stores/store/redirect/___store/en/___from_store/fr/uenc/aHR0cHM6Ly93d3cuYnJvZGVyaWVwbGFpc2lyLmNvbS9lbi9jaGVja291dC9jYXJ0L2luZGV4Lw~~/" 1654 class="block px-4 py-2 lg:px-5 lg:py-2 hover:bg-gray-100 text-black" 1655 > 1656 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 30" class="mx-auto" width="24" height="24" role="img"><clipPath id="gb-a"><path d="M0 0v30h60V0z"/></clipPath><clipPath id="gb-b"><path d="M30 15h30v15zv15H0zH0V0zV0h30z"/></clipPath><g clip-path="url(#gb-a)"><path d="M0 0v30h60V0z" fill="#012169"/><path d="M0 0l60 30m0-30L0 30" stroke="#fff" stroke-width="6"/><path d="M0 0l60 30m0-30L0 30" clip-path="url(#gb-b)" stroke="#C8102E" stroke-width="4"/>
1656<path d="M30 0v30M0 15h60" stroke="#fff" stroke-width="10"/><path d="M30 0v30M0 15h60" stroke="#C8102E" stroke-width="6"/></g><title>gb</title></svg> 1657 </a> 1658 </div> 1659 </nav> 1660 </div> 1661 </div> 1662 </div> 1663 </div> 1664 <!--Search--> 1665 <div class="absolute z-10 w-full border-t shadow-sm bg-container-lighter border-container-lighter" 1666 id="search-content" 1667 x-cloak x-show="searchOpen" 1668 @click.outside="searchOpen = false" 1669 @keydown.escape=" 1670 searchOpen = false; 1671 $refs.searchButton.focus(); 1672 " 1673 > 1674
1674<script> 1675 function initMiniSearch() { 1676 return { 1677 minSearchLength: 3, 1678 suggestions: [], 1679 suggest() { 1680 const search = this.$refs.searchInput; 1681 if (search.value.length >= this.minSearchLength) { 1682 search.setCustomValidity(''); 1683 search.reportValidity(); 1684 this.fetchSuggestions(search.value); 1685 } else { 1686 this.suggestions = []; 1687 } 1688 }, 1689 fetchSuggestions(term) { 1690 fetch( 1691 window.BASE_URL + 'search/ajax/suggest?' + new URLSearchParams({q: term}), 1692 { 1693 headers: { 1694 'X-Requested-With': 'XMLHttpRequest' 1695 } 1696 } 1697 ) 1698 .then(response => response.json()) 1699 .then(result => this.suggestions = result); 1700 }, 1701 search(term) { 1702 const search = this.$refs.searchInput; 1703 term = term && typeof term === 'string' ? term : search.value; 1704 if (term.length < this.minSearchLength) { 1705 search.setCustomValidity('La\u0020longueur\u0020minimale\u0020de\u0020la\u0020requ\u00EAte\u0020de\u0020recherche\u0020est\u0020de\u00203'); 1706 search.reportValidity(); 1707 } else { 1708 search.setCustomValidity(''); 1709 search.value = term; 1710 this.$refs.form.submit(); 1711 } 1712 }, 1713 focusSearch() { 1714 this.$ref.searchInput.focus(); 1715 }, 1716 focusAfterOpen() { 1717 this.$el.focus() 1718 this.$el.select() 1719 }, 1720 isMac: /Mac|iPod|iPhone|iPad/.test(navigator.platform), 1721 textShortcutModifier() { 1722 return this.isMac ? 'â K' : 'Ctrl+K'; 1723 }, 1724 } 1725 } 1726 1727 window.addEventListener('alpine:init', () => { 1728 Alpine.data('initMiniSearch', initMiniSearch) 1729 }, { once: true }) 1730</script>
1730 1731<div class="container py-2 mx-auto text-black" x-data="initMiniSearch"> 1732 <search title="Boutique" role="search"> 1733 <form 1734 id="search_mini_form" 1735 class="form minisearch input-group" 1736 action="https://www.broderieplaisir.com/fr/catalogsearch/result/" 1737 method="get" 1738 @submit.prevent="search" 1739 x-ref="form" 1740 > 1741 <div class="input-group relative grow"> 1742 <input 1743 id="search" 1744 x-ref="searchInput" 1745 type="search" 1746 autocomplete="off" 1747 name="q" 1748 value="" 1749 placeholder="Rechercher..." 1750 maxlength="20" 1751 class="form-input grow" 1752 @search-open.window.debounce.10="focusAfterOpen" 1753 @focus.once="suggest" 1754 @input.debounce.300="suggest" 1755 @keydown.arrow-down.prevent="focusSearch" 1756 > 1757 <label class="sr-only" for="search"> 1758 Rechercher </label> 1759 <kbd 1760 class="absolute top-1/2 right-8 -translate-y-1/2 hidden lg:flex 1761 gap-1 bg-white text-black border border-gray-300 rounded px-1 font-sans text-sm" 1762 x-text="textShortcutModifier" 1763 ></kbd> 1764 </div> 1765 <button 1766 type="submit" 1767 class="btn btn-primary p-2.5 rounded-s-none shrink-0" 1768 title="Rechercher" 1769 aria-label="Rechercher" 1770 > 1771 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="m21 21-4.34-4.34"/><circle cx="11" cy="11" r="8"/></svg> 1772 </button> 1773 </form> 1774 </search> 1775 <template x-if="suggestions.length"> 1776 <nav 1777 aria-label="Search Suggestions" 1778 class="flex flex-col mt-1 text-grey-800 gap-1" 1779 > 1780 <template x-for="suggestion in suggestions"> 1781 <button 1782 type="button" 1783 class="flex justify-between p-2 bg-white even:bg-gray-50 border border-gray-300 hover:bg-gray-100" 1784 @click="searchSuggestion" 1785 @keydown.enter="searchSuggestion" 1786 > 1787 <span x-text="suggestion.title"></span> 1788 <span x-text="suggestion.num_results"></span> 1789 </button> 1790 </template> 1791 </nav> 1792 </template> 1793 </div> 1794 </div> 1795
1796 <!--Cart Drawer--> 1797 1798 <!--Authentication Pop-Up--> 1799
1799<script> 1800 function initAuthentication() { 1801 return { 1802 open: false, 1803 close() { 1804 this.open = false; 1805 }, 1806 forceAuthentication: false, 1807 checkoutUrl: 'https://www.broderieplaisir.com/fr/checkout/index/', 1808 errors: 0, 1809 hasCaptchaToken: 0, 1810 displayErrorMessage: false, 1811 errorMessages: [], 1812 setErrorMessages(message) { 1813 this.errorMessages = [message]; 1814 this.displayErrorMessage = true; 1815 }, 1816 submitForm() { 1817 // Do not rename $form, the variable is expected to be declared in the recaptcha output 1818 const $form = document.querySelector('#login-form'); 1819 if (!this.hasCaptchaToken) { 1820 this.errors = 1; 1821 1822 1823 const executeGreCaptcha = () => { 1824 grecaptcha.ready(() => { 1825 grecaptcha.execute( 1826 '6Lc2fKorAAAAAO1Cz9tTTA2cFil17h3d5Na5sbZf', 1827 {action: 'submit'} 1828 ).then((token) => { 1829 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 1830 1831 if (tokenElement && token && token.length > 0) { 1832 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 1833 this.errors = 0; 1834 this.hasCaptchaToken = 1; 1835 (this.submitForm || $form.submit).call(this); 1836 } else { 1837 this.errors = 1; 1838 const error = tokenElement 1839 ? 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again' 1840 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020trying\u0020again.'; 1841 if (this.setErrorMessages) { 1842 this.setErrorMessages([error]) 1843 this.displayErrorMessage = true; 1844 } else { 1845 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 1846 } 1847 } 1848 }).catch(exception => { 1849 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 1850 }); 1851 }) 1852 } 1853 1854 if (window.grecaptcha) { 1855 executeGreCaptcha(); 1856 } else { 1857 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6Lc2fKorAAAAAO1Cz9tTTA2cFil17h3d5Na5sbZf"; 1858 const script = document.createElement('script'); 1859 script.setAttribute('type', 'text/javascript'); 1860 script.setAttribute('src', recaptchaUrl); 1861 document.head.appendChild(script); 1862 1863 script.addEventListener("load", executeGreCaptcha, false); 1864 } 1865 } 1866 1867 if (this.errors === 0) { 1868 this.dispatchLoginRequest($form); 1869 } 1870 }, 1871 onPrivateContentLoaded() { 1872 const data = this.$event.detail.data; 1873 const isLoggedIn = data.customer && data.customer.firstname; 1874 if (data.cart && !isLoggedIn) { 1875 this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; 1876 } 1877 }, 1878 redirectIfAuthenticated() { 1879 const event = this.$event; 1880 this.open = this.forceAuthentication; 1881 1882 if (event.detail && event.detail.url) { 1883 this.checkoutUrl = event.detail.url; 1884 } 1885 if (!this.forceAuthentication) { 1886 window.location.href = this.checkoutUrl; 1887 } 1888 }, 1889 resetErrors() { 1890 this.errors = 0; 1891 }, 1892 dispatchLoginRequest(form) { 1893 this.isLoading = true; 1894 const username = this.$refs['customer-email'].value; 1895 const password = this.$refs['customer-password'].value; 1896 const formKey = hyva.getFormKey(); 1897 const bodyFields = { 1898 'username': username, 1899 'password': password, 1900 'formKey': formKey 1901 }; 1902 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 1903 const recaptchaField = fieldName && form[fieldName]; 1904 if (recaptchaField) { 1905 bodyFields[fieldName] = recaptchaField.value; 1906 }
1907 fetch('https://www.broderieplaisir.com/fr/customer/ajax/login/', { 1908 method: 'POST', 1909 headers: { 1910 'Content-Type': 'application/json', 1911 'X-Requested-With': 'XMLHttpRequest' 1912 }, 1913 body: JSON.stringify(bodyFields) 1914 } 1915 ).then(response => { 1916 return response.json() 1917 } 1918 ).then(data => { 1919 this.isLoading = false; 1920 if (data.errors) { 1921 this.setErrorMessages(data.message); 1922 this.errors = 1; 1923 this.hasCaptchaToken = 0; 1924 } else { 1925 window.location.href = this.checkoutUrl; 1926 } 1927 }); 1928 }, 1929 eventListeners: { 1930 ['@private-content-loaded.window']() { 1931 this.onPrivateContentLoaded(); 1932 }, 1933 ['@toggle-authentication.window']() { 1934 this.redirectIfAuthenticated(); 1935 }, 1936 ['@pageshow.window'](event) { 1937 if (event.persisted) { 1938 this.close(); 1939 }; 1940 } 1941 } 1942 } 1943 } 1944 1945 window.addEventListener('alpine:init', () => Alpine.data('initAuthentication', initAuthentication), {once: true}) 1946</script>
1946 1947 1948<dialog 1949 id="authentication-popup" 1950 aria-labelledby="authentication-popup-title" 1951 class="open:flex flex-col transition ease-out duration-300 motion-reduce:duration-0 p-0" 1952 x-data="initAuthentication" 1953 x-bind="eventListeners" 1954 x-show="open" 1955 x-htmldialog="close" 1956 closeby="any" 1957 x-transition 1958> 1959 <div class="pt-8 px-8"> 1960 <div class="flex gap-2 justify-between items-center"> 1961 <p id="authentication-popup-title" class="text-xl"> 1962 <strong>Accès client</strong> 1963 </p> 1964 <button 1965 type="button" 1966 class="btn bg-transparent border-transparent p-2" 1967 @click="close" 1968 aria-label="Fermer le panel" 1969 > 1970 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg> 1971 </button> 1972 </div> 1973 1974 <div class="message error" x-show="errors" x-cloak> 1975 <template x-for="(message, index) in errorMessages" :key="index"> 1976 <div> 1977 <template x-if="message"> 1978 <span x-html="message"></span> 1979 </template> 1980 </div> 1981 </template> 1982 </div> 1983 </div> 1984 1985 <div class="block-customer-login p-8"> 1986 <p id="authenticate-customer-login" class="text-lg mb-2"> 1987 <strong>Commander en utilisant votre compte</strong> 1988 </p> 1989 1990 <form 1991 id="login-form" 1992 class="form form-login" 1993 method="post" 1994 @submit.prevent="submitForm" 1995 > 1996 <div class="control"> 1997 <input type="hidden" 1998 value="" 1999 name="g-recaptcha-response" 2000 > 2001</div> 2002 <input name="context" type="hidden" value="checkout"> 2003 2004 <div class="flex flex-col gap-4"> 2005 <div class="field email required"> 2006 <label for="form-login-username"> 2007 <span>Adresse email</span> 2008 </label> 2009 <div class="control"> 2010 <input 2011 id="form-login-username" 2012 name="username" 2013 type="email" 2014 class="form-input w-full" 2015 required 2016 autocomplete="off" 2017 x-ref="customer-email" 2018 @change="resetErrors" 2019 > 2020 </div> 2021 </div> 2022 <div class="field password required"> 2023 <label for="form-login-password"> 2024 <span>Mot de passe</span> 2025 </label> 2026 <div class="control"> 2027 <input 2028 id="form-login-password" 2029 name="password" 2030 type="password" 2031 class="form-input w-full" 2032 required 2033 autocomplete="off" 2034 x-ref="customer-password" 2035 @change="resetErrors" 2036 > 2037 </div> 2038 </div> 2039 </div> 2040 2041 <div class="actions-toolbar"> 2042 <button 2043 type="submit" 2044 class="btn btn-primary" 2045 > 2046 Connexion </button> 2047 <a 2048 href="https://www.broderieplaisir.com/fr/customer/account/forgotpassword/" 2049 class="underline hover:no-underline" 2050 > 2051 Mot de passe oublié ? </a> 2052 </div> 2053 </form> 2054 <p class="prose my-4 text-sm"> 2055 <em>Ce formulaire est protégé par reCAPTCHA. Les <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">règles de confidentialité</a> et les <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">conditions d' utilisation</a> de <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Google</a> s'appliquent.</em> 2056</p> 2057 </div> 2058 <div class="block-new-customer p-8 border-t border-gray-300">
2059 <p id="authenticate-new-customer" class="text-lg mb-2"> 2060 <strong>Commander en tant que nouveau client</strong> 2061 </p> 2062 2063 <div class="block-content"> 2064 <p class="mb-1"> 2065 La création dâun compte possède de nombreux avantages : </p> 2066 <ul class="list-disc pl-5"> 2067 <li> Voir le statut de la commande et de lâexpédition</li> 2068 <li> Suivi de la commande</li> 2069 <li> Commandez plus rapidement</li> 2070 </ul> 2071 <div class="actions-toolbar mt-6 mb-2"> 2072 <a href="https://www.broderieplaisir.com/fr/customer/account/create/" 2073 class="inline-flex btn btn-primary"> 2074 Créer un compte </a> 2075 </div> 2076 </div> 2077 </div> 2078</dialog> 2079</div></header><div x-data="initMenuDesktop_6abe735bc71e1()" 2080 class="container z-20 order-2 sm:order-1 lg:order-2 navigation hidden lg:flex bg-bp-pink my-4" 2081> 2082 <!-- desktop --> 2083 <div x-ref="nav-desktop" 2084 @load.window="setActiveMenu($root)" 2085 class="hidden w-full lg:block lg:px-8"> 2086 <nav 2087 class="relative w-full" 2088 aria-label="Menu principal" 2089 > 2090 <ul class="flex justify-start flex-wrap gap-x-7 py-1 justify-around"> 2091 <li class="relative level-0 border-b-2 border-transparent hover:border-white data-[active]:border-white" 2092 @mouseenter="hoverPanelActiveId = 'category-node-9'" 2093 @mouseleave="hoverPanelActiveId = 0" 2094 @keyup.escape="hoverPanelActiveId = 0" 2095 > 2096 <span class="flex items-center text-md"> 2097 <a class="w-full text-base text-white level-0 py-2 px-0.5" 2098 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/matieres-a-broder/id/9/" 2099 title=" Matières à broder" 2100 @focus="hoverPanelActiveId = 0" 2101 > 2102 Matières à broder </a> 2103 <button 2104 type="button" 2105 data-sr-button-id="category-node-9" 2106 :aria-expanded="hoverPanelActiveId === 'category-node-9' ? 'true' : 'false'" 2107 @click="openMenuOnClick('category-node-9')" 2108 class="rounded p-1 text-white" 2109 > 2110 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2111 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2112</svg> 2113 <span class="sr-only"> 2114 Afficher le sous-menu pour la catégorie Matières à broder </span> 2115 </button> 2116 </span> 2117 <ul 2118 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2119 :class="{ 2120 'hidden' : hoverPanelActiveId !== 'category-node-9', 2121 'block' : hoverPanelActiveId === 'category-node-9' 2122 }" 2123 > 2124 <li> 2125 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/coton-perle-fin/id/41/" 2126 title="Coton perlé fin" 2127 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2128 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2129 >
2130 <span class="text-base text-gray-700"> 2131 Coton perlé fin </span> 2132 </a> 2133 </li> 2134 <li> 2135 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/coton-mercerise/id/40/" 2136 title="Coton mercerisé" 2137 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2138 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2139 > 2140 <span class="text-base text-gray-700"> 2141 Coton mercerisé </span> 2142 </a> 2143 </li> 2144 <li> 2145 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/coton-mouline/id/36/" 2146 title="Coton mouliné" 2147 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2148 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2149 > 2150 <span class="text-base text-gray-700"> 2151 Coton mouliné </span> 2152 </a> 2153 </li> 2154 <li> 2155 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fil-coton-dare-dare/id/107/" 2156 title="Fil coton Dare Dare" 2157 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2158 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2159 > 2160 <span class="text-base text-gray-700"> 2161 Fil coton Dare Dare </span> 2162 </a> 2163 </li> 2164 <li> 2165 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fil-metal-metallise/id/43/" 2166 title="Fil métal - métallisé" 2167 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2168 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2169 > 2170 <span class="text-base text-gray-700"> 2171 Fil métal - métallisé </span> 2172 </a> 2173 </li> 2174 <li> 2175 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/assortiment-de-fils/id/44/" 2176 title="Assortiment de fils" 2177 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2178 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2179 >
2180 <span class="text-base text-gray-700"> 2181 Assortiment de fils </span> 2182 </a> 2183 </li> 2184 <li> 2185 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fil-a-gant-glace-invisible/id/52/" 2186 title="Fil à gant - glacé - invisible" 2187 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2188 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2189 > 2190 <span class="text-base text-gray-700"> 2191 Fil à gant - glacé - invisible </span> 2192 </a> 2193 </li> 2194 <li> 2195 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/soie-perlee-au-ver-a-soie/id/108/" 2196 title="Soie perlée "Au Ver à Soie"" 2197 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2198 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2199 > 2200 <span class="text-base text-gray-700"> 2201 Soie perlée "Au Ver à Soie" </span> 2202 </a> 2203 </li> 2204 <li> 2205 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/filament-de-soie-soie-ovale/id/33/" 2206 title="Filament de soie / Soie ovale" 2207 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2208 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2209 > 2210 <span class="text-base text-gray-700"> 2211 Filament de soie / Soie ovale </span> 2212 </a> 2213 </li> 2214 <li> 2215 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fils-chenille/id/141
2215/" 2216 title="Fils chenille" 2217 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2218 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2219 > 2220 <span class="text-base text-gray-700"> 2221 Fils chenille </span> 2222 </a> 2223 </li> 2224 <li> 2225 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/soie-fine/id/34/" 2226 title="Soie fine " 2227 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2228 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2229 > 2230 <span class="text-base text-gray-700"> 2231 Soie fine </span> 2232 </a> 2233 </li> 2234 <li> 2235 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rayonne-perlee/id/37/" 2236 title="Rayonne perlée" 2237 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2238 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2239 > 2240 <span class="text-base text-gray-700"> 2241 Rayonne perlée </span> 2242 </a> 2243 </li> 2244 <li> 2245 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fils-rayonne/id/39/" 2246 title="Fils rayonne" 2247 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2248 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2249 > 2250 <span class="text-base text-gray-700"> 2251 Fils rayonne </span> 2252 </a> 2253 </li> 2254 <li> 2255 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/chainette-lurex/id/42/" 2256 title="Chainette Lurex" 2257 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2258 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2259 >
2260 <span class="text-base text-gray-700"> 2261 Chainette Lurex </span> 2262 </a> 2263 </li> 2264 <li> 2265 <a href="https://www.broderieplaisir.com/fr/les-fils-a-broder/ganse-rayonne.html" 2266 title="Ganse rayonne" 2267 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2268 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2269 > 2270 <span class="text-base text-gray-700"> 2271 Ganse rayonne </span> 2272 </a> 2273 </li> 2274 <li> 2275 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fils-fantaisie/id/46/" 2276 title="Fils fantaisie" 2277 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2278 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D9]').focus())" 2279 > 2280 <span class="text-base text-gray-700"> 2281 Fils fantaisie </span> 2282 </a> 2283 </li> 2284 </ul> 2285 </li> 2286 <li class="relative level-0 border-b-2 border-transparent hover:border-white data-[active]:border-white" 2287 @mouseenter="hoverPanelActiveId = 'category-node-3'" 2288 @mouseleave="hoverPanelActiveId = 0" 2289 @keyup.escape="hoverPanelActiveId = 0" 2290 > 2291 <span class="flex items-center text-md"> 2292 <a class="w-full text-base text-white level-0 py-2 px-0.5" 2293 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rubans-galons/id/3/" 2294 title="Rubans & Galons" 2295 @focus="hoverPanelActiveId = 0" 2296 > 2297 Rubans & Galons </a> 2298 <button 2299 type="button" 2300 data-sr-button-id="category-node-3" 2301 :aria-expanded="hoverPanelActiveId === 'category-node-3' ? 'true' : 'false'" 2302 @click="openMenuOnClick('category-node-3')" 2303 class="rounded p-1 text-white" 2304 > 2305 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2306 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2307</svg> 2308 <span class="sr-only"> 2309 Afficher le sous-menu pour la catégorie Rubans & Galons </span> 2310 </button> 2311 </span> 2312 <ul 2313 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2314 :class="{ 2315 'hidden' : hoverPanelActiveId !== 'category-node-3', 2316 'block' : hoverPanelActiveId === 'category-node-3' 2317 }" 2318 > 2319 <li> 2320 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-de-soie/id/11/" 2321 title="Ruban de soie" 2322 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2323 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2324 >
2325 <span class="text-base text-gray-700"> 2326 Ruban de soie </span> 2327 </a> 2328 </li> 2329 <li> 2330 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-viscose/id/12/" 2331 title="Ruban viscose" 2332 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2333 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2334 > 2335 <span class="text-base text-gray-700"> 2336 Ruban viscose </span> 2337 </a> 2338 </li> 2339 <li> 2340 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-organza/id/13/" 2341 title="Ruban organza" 2342 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2343 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2344 > 2345 <span class="text-base text-gray-700"> 2346 Ruban organza </span> 2347 </a> 2348 </li> 2349 <li> 2350 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/soutache/id/23/" 2351 title="Soutache" 2352 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2353 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2354 > 2355 <span class="text-base text-gray-700"> 2356 Soutache </span> 2357 </a> 2358 </li> 2359 <li> 2360 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/raphia-a-broder/id/109/" 2361 title="Raphia à broder" 2362 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2363 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2364 > 2365 <span class="text-base text-gray-700"> 2366 Raphia à broder </span> 2367 </a> 2368 </li> 2369 <li> 2370 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/passementerie/id/20/" 2371 title="Passementerie" 2372 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2373 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2374 >
2375 <span class="text-base text-gray-700"> 2376 Passementerie </span> 2377 </a> 2378 </li> 2379 <li> 2380 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/ruban-a-picots/id/105/" 2381 title="Ruban à picots" 2382 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2383 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2384 > 2385 <span class="text-base text-gray-700"> 2386 Ruban à picots </span> 2387 </a> 2388 </li> 2389 <li> 2390 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rubans-et-galons-anciens/id/106/" 2391 title="Rubans et galons anciens" 2392 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2393 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D3]').focus())" 2394 > 2395 <span class="text-base text-gray-700"> 2396 Rubans et galons anciens </span> 2397 </a> 2398 </li> 2399 </ul> 2400 </li> 2401 <li class="relative level-0 border-b-2 border-transparent hover:border-white data-[active]:border-white" 2402 @mouseenter="hoverPanelActiveId = 'category-node-7'" 2403 @mouseleave="hoverPanelActiveId = 0" 2404 @keyup.escape="hoverPanelActiveId = 0" 2405 > 2406 <span class="flex items-center text-md"> 2407 <a class="w-full text-base text-white level-0 py-2 px-0.5" 2408 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/paillettes-sequins-strass/id/7/" 2409 title="Paillettes, sequins & strass " 2410 @focus="hoverPanelActiveId = 0" 2411 > 2412 Paillettes, sequins & strass </a> 2413 <button 2414 type="button" 2415 data-sr-button-id="category-node-7" 2416 :aria-expanded="hoverPanelActiveId === 'category-node-7' ? 'true' : 'false'" 2417 @click="openMenuOnClick('category-node-7')" 2418 class="rounded p-1 text-white" 2419 > 2420 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2421 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2422</svg> 2423 <span class="sr-only"> 2424 Afficher le sous-menu pour la catégorie Paillettes, sequins & strass </span> 2425 </button> 2426 </span> 2427 <ul 2428 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2429 :class="{ 2430 'hidden' : hoverPanelActiveId !== 'category-node-7', 2431 'block' : hoverPanelActiveId === 'category-node-7' 2432 }" 2433 > 2434 <li> 2435 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/paillettes-a-broder/id/56/" 2436 title="Paillettes à broder " 2437 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2438 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D7]').focus())" 2439 >
2440 <span class="text-base text-gray-700"> 2441 Paillettes à broder </span> 2442 </a> 2443 </li> 2444 <li> 2445 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/cuvettes-a-broder/id/58/" 2446 title="Cuvettes à broder " 2447 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2448 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D7]').focus())" 2449 > 2450 <span class="text-base text-gray-700"> 2451 Cuvettes à broder </span> 2452 </a> 2453 </li> 2454 <li> 2455 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/sequins-et-cabochons/id/16/" 2456 title="Sequins et cabochons" 2457 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2458 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D7]').focus())" 2459 > 2460 <span class="text-base text-gray-700"> 2461 Sequins et cabochons </span> 2462 </a> 2463 </li> 2464 <li> 2465 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/paillettes-anciennes/id/69/" 2466 title="Paillettes anciennes" 2467 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2468 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D7]').focus())" 2469 > 2470 <span class="text-base text-gray-700"> 2471 Paillettes anciennes </span> 2472 </a> 2473 </li> 2474 <li> 2475 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/strass/id/145/" 2476 title="Strass" 2477 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2478 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D7]').focus())" 2479 > 2480 <span class="text-base text-gray-700"> 2481 Strass </span> 2482 </a> 2483 </li> 2484 <li> 2485 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/eclats-perces/id/146/" 2486 title="Eclats percés" 2487 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2488 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D7]').focus())" 2489 >
2490 <span class="text-base text-gray-700"> 2491 Eclats percés </span> 2492 </a> 2493 </li> 2494 </ul> 2495 </li> 2496 <li class="relative level-0 border-b-2 border-transparent hover:border-white data-[active]:border-white" 2497 @mouseenter="hoverPanelActiveId = 'category-node-8'" 2498 @mouseleave="hoverPanelActiveId = 0" 2499 @keyup.escape="hoverPanelActiveId = 0" 2500 > 2501 <span class="flex items-center text-md"> 2502 <a class="w-full text-base text-white level-0 py-2 px-0.5" 2503 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/les-perles/id/8/" 2504 title="Les perles" 2505 @focus="hoverPanelActiveId = 0" 2506 > 2507 Les perles </a> 2508 <button 2509 type="button" 2510 data-sr-button-id="category-node-8" 2511 :aria-expanded="hoverPanelActiveId === 'category-node-8' ? 'true' : 'false'" 2512 @click="openMenuOnClick('category-node-8')" 2513 class="rounded p-1 text-white" 2514 > 2515 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2516 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2517</svg> 2518 <span class="sr-only"> 2519 Afficher le sous-menu pour la catégorie Les perles </span> 2520 </button> 2521 </span> 2522 <ul 2523 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2524 :class="{ 2525 'hidden' : hoverPanelActiveId !== 'category-node-8', 2526 'block' : hoverPanelActiveId === 'category-node-8' 2527 }" 2528 > 2529 <li> 2530 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/perles-sur-fils/id/53/" 2531 title="Perles sur fils" 2532 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2533 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D8]').focus())" 2534 > 2535 <span class="text-base text-gray-700"> 2536 Perles sur fils </span> 2537 </a> 2538 </li> 2539 <li> 2540 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/perles-anciennes/id/61/" 2541 title="Perles anciennes" 2542 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2543 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D8]').focus())" 2544 >
2545 <span class="text-base text-gray-700"> 2546 Perles anciennes </span> 2547 </a> 2548 </li> 2549 <li> 2550 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/tubes-et-mini-tubes/id/139/" 2551 title="Tubes et mini tubes" 2552 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2553 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D8]').focus())" 2554 > 2555 <span class="text-base text-gray-700"> 2556 Tubes et mini tubes </span> 2557 </a> 2558 </li> 2559 <li> 2560 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rocailles-et-autres-perles/id/18/" 2561 title="Rocailles et autres perles" 2562 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2563 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D8]').focus())" 2564 > 2565 <span class="text-base text-gray-700"> 2566 Rocailles et autres perles </span> 2567 </a> 2568 </li> 2569 <li> 2570 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/fleurs-et-pistils/id/70/" 2571 title="Fleurs et pistils" 2572 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2573 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D8]').focus())" 2574 > 2575 <span class="text-base text-gray-700"> 2576 Fleurs et pistils </span> 2577 </a> 2578 </li> 2579 <li> 2580 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/micro-perles/id/138/" 2581 title="Micro perles" 2582 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2583 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D8]').focus())" 2584 > 2585 <span class="text-base text-gray-700"> 2586 Micro perles </span> 2587 </a> 2588 </li> 2589 </ul> 2590 </li> 2591 <li class="relative level-0 border-b-2 border-transparent hover:border-white data-[active]:border-white" 2592 @mouseenter="hoverPanelActiveId = 'category-node-10'" 2593 @mouseleave="hoverPanelActiveId = 0" 2594 @keyup.escape="hoverPanelActiveId = 0" 2595 >
2596 <span class="flex items-center text-md"> 2597 <a class="w-full text-base text-white level-0 py-2 px-0.5" 2598 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/materiel-mercerie/id/10/" 2599 title="Matériel & Mercerie" 2600 @focus="hoverPanelActiveId = 0" 2601 > 2602 Matériel & Mercerie </a> 2603 <button 2604 type="button" 2605 data-sr-button-id="category-node-10" 2606 :aria-expanded="hoverPanelActiveId === 'category-node-10' ? 'true' : 'false'" 2607 @click="openMenuOnClick('category-node-10')" 2608 class="rounded p-1 text-white" 2609 > 2610 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2611 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2612</svg> 2613 <span class="sr-only"> 2614 Afficher le sous-menu pour la catégorie Matériel & Mercerie </span> 2615 </button> 2616 </span> 2617 <ul 2618 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2619 :class="{ 2620 'hidden' : hoverPanelActiveId !== 'category-node-10', 2621 'block' : hoverPanelActiveId === 'category-node-10' 2622 }" 2623 > 2624 <li> 2625 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/crochet-metier-et-tambour/id/49/" 2626 title="Crochet, métier et tambour" 2627 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2628 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2629 > 2630 <span class="text-base text-gray-700"> 2631 Crochet, métier et tambour </span> 2632 </a> 2633 </li> 2634 <li> 2635 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/piquoir-et-poudre-a-poncer/id/104/" 2636 title="Piquoir et poudre à poncer" 2637 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2638 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2639 > 2640 <span class="text-base text-gray-700"> 2641 Piquoir et poudre à poncer </span> 2642 </a> 2643 </li> 2644 <li> 2645 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/mercerie-aiguilles/id/50/" 2646 title="Mercerie, aiguilles" 2647 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2648 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2649 >
2650 <span class="text-base text-gray-700"> 2651 Mercerie, aiguilles </span> 2652 </a> 2653 </li> 2654 <li> 2655 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/broderie-d-or/id/51/" 2656 title="Broderie d'or" 2657 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2658 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2659 > 2660 <span class="text-base text-gray-700"> 2661 Broderie d'or </span> 2662 </a> 2663 </li> 2664 <li> 2665 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/monogrammes-anciens/id/62/" 2666 title="Monogrammes anciens" 2667 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2668 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2669 > 2670 <span class="text-base text-gray-700"> 2671 Monogrammes anciens </span> 2672 </a> 2673 </li> 2674 <li> 2675 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/organza-de-soie-et-lames/id/84/" 2676 title="Organza de soie et lamés" 2677 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2678 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2679 > 2680 <span class="text-base text-gray-700"> 2681 Organza de soie et lamés </span> 2682 </a> 2683 </li> 2684 <li> 2685 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/cartes-cadeau/id/103/" 2686 title="Cartes cadeau" 2687 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2688 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2689 > 2690 <span class="text-base text-gray-700"> 2691 Cartes cadeau </span> 2692 </a> 2693 </li> 2694 <li> 2695 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/livres-de-broderie/id/113/" 2696 title="Livres de broderie" 2697 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2698 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D10]').focus())" 2699 >
2700 <span class="text-base text-gray-700"> 2701 Livres de broderie </span> 2702 </a> 2703 </li> 2704 </ul> 2705 </li> 2706 <li class="relative level-0 border-b-2 border-transparent hover:border-white data-[active]:border-white" 2707 @mouseenter="hoverPanelActiveId = 'category-node-76'" 2708 @mouseleave="hoverPanelActiveId = 0" 2709 @keyup.escape="hoverPanelActiveId = 0" 2710 > 2711 <span class="flex items-center text-md"> 2712 <a class="w-full text-base text-white level-0 py-2 px-0.5" 2713 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/nouveautes/id/76/" 2714 title="Nouveautés" 2715 @focus="hoverPanelActiveId = 0" 2716 > 2717 Nouveautés </a> 2718 </span> 2719 </li> 2720 <li class="relative level-0 border-b-2 border-transparent hover:border-white data-[active]:border-white" 2721 @mouseenter="hoverPanelActiveId = 'category-node-101'" 2722 @mouseleave="hoverPanelActiveId = 0" 2723 @keyup.escape="hoverPanelActiveId = 0" 2724 > 2725 <span class="flex items-center text-md"> 2726 <a class="w-full text-base text-white level-0 py-2 px-0.5" 2727 href="https://www.broderieplaisir.com/fr/catalog/category/view/s/infos/id/101/" 2728 title="Infos" 2729 @focus="hoverPanelActiveId = 0" 2730 > 2731 Infos </a> 2732 <button 2733 type="button" 2734 data-sr-button-id="category-node-101" 2735 :aria-expanded="hoverPanelActiveId === 'category-node-101' ? 'true' : 'false'" 2736 @click="openMenuOnClick('category-node-101')" 2737 class="rounded p-1 text-white" 2738 > 2739 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="flex self-center h-5 w-5" width="25" height="25" aria-hidden="true"> 2740 <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd"/> 2741</svg> 2742 <span class="sr-only"> 2743 Afficher le sous-menu pour la catégorie Infos </span> 2744 </button> 2745 </span> 2746 <ul 2747 class="absolute top-full z-10 hidden px-6 py-4 mt-0.5 -ml-6 shadow-lg bg-container-lighter/95" 2748 :class="{ 2749 'hidden' : hoverPanelActiveId !== 'category-node-101', 2750 'block' : hoverPanelActiveId === 'category-node-101' 2751 }" 2752 > 2753 <li> 2754 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/tarifs-et-livraisons/id/126/" 2755 title="Tarifs et livraisons" 2756 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2757 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2758 >
2759 <span class="text-base text-gray-700"> 2760 Tarifs et livraisons </span> 2761 </a> 2762 </li> 2763 <li> 2764 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/le-compte-pro/id/127/" 2765 title="le Compte Pro" 2766 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2767 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2768 > 2769 <span class="text-base text-gray-700"> 2770 le Compte Pro </span> 2771 </a> 2772 </li> 2773 <li> 2774 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/nous-contacter/id/128/" 2775 title="Nous contacter" 2776 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2777 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2778 > 2779 <span class="text-base text-gray-700"> 2780 Nous contacter </span> 2781 </a> 2782 </li> 2783 <li> 2784 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/satisfait-ou-rembourse/id/129/" 2785 title="Satisfait ou remboursé" 2786 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2787 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2788 > 2789 <span class="text-base text-gray-700"> 2790 Satisfait ou remboursé </span> 2791 </a> 2792 </li> 2793 <li> 2794 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/conditions-generales/id/130/" 2795 title="Conditions générales" 2796 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2797 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2798 > 2799 <span class="text-base text-gray-700"> 2800 Conditions générales </span> 2801 </a> 2802 </li> 2803 <li> 2804 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/qui-sommes-nous/id/131/" 2805 title="Qui sommes nous ?" 2806 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2807 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2808 >
2809 <span class="text-base text-gray-700"> 2810 Qui sommes nous ? </span> 2811 </a> 2812 </li> 2813 <li> 2814 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/nos-actualites/id/132/" 2815 title="Nos actualités" 2816 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2817 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2818 > 2819 <span class="text-base text-gray-700"> 2820 Nos actualités </span> 2821 </a> 2822 </li> 2823 <li> 2824 <a href="https://www.broderieplaisir.com/fr/catalog/category/view/s/le-compte-etudiant/id/140/" 2825 title="Le Compte Etudiant" 2826 class="block w-full px-3 py-1 my-1 whitespace-nowrap first:mt-0 hover:underline aria-[current=page]:underline" 2827 @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D101]').focus())" 2828 > 2829 <span class="text-base text-gray-700"> 2830 Le Compte Etudiant </span> 2831 </a> 2832 </li> 2833 </ul> 2834 </li> 2835 </ul> 2836 </nav> 2837 </div> 2838</div>
2839<script> 2840 'use strict'; 2841 2842 const initMenuDesktop_6abe735bc71e1 = () => { 2843 return { 2844 hoverPanelActiveId: null, 2845 setActiveMenu(menuNode) { 2846 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2847 return link.href === window.location.href.split('?')[0]; 2848 }).map(item => { 2849 item.setAttribute('aria-current', 'page'); 2850 item.closest('li.level-0').setAttribute('data-active', 'true'); 2851 }); 2852 }, 2853 openMenuOnClick(menuNode) { 2854 if (menuNode === this.hoverPanelActiveId) { 2855 this.hoverPanelActiveId = 0; 2856 } else { 2857 this.hoverPanelActiveId = menuNode 2858 } 2859 } 2860 } 2861 } 2862</script>
2862 2863<main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div> 2864<div class="page messages">
2864<script> 2865 function initMessages() { 2866 "use strict"; 2867 return { 2868 messages: window.mageMessages || [], 2869 isEmpty() { 2870 return this.messages.reduce( 2871 function (isEmpty, message) { 2872 return isEmpty && message === undefined 2873 }, true 2874 ) 2875 }, 2876 hasMessages() { 2877 return !this.isEmpty(); 2878 }, 2879 hasMessage() { 2880 return !!this.message; 2881 }, 2882 removeMessage() { 2883 this.messages[this.index] = undefined; 2884 }, 2885 addMessages(messages, hideAfter) { 2886 messages.map((message) => { 2887 if (!message.text || !message.text.trim()) return; 2888 this.messages = this.messages.concat(message); 2889 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 2890 hideAfter = window.defaultSuccessMessageTimeout; 2891 } 2892 if (hideAfter) { 2893 this.setHideTimeOut(this.messages.length -1, hideAfter); 2894 } 2895 }); 2896 }, 2897 setHideTimeOut(messageIndex, hideAfter) { 2898 setTimeout((messageIndex) => { 2899 this.messages[messageIndex] = undefined; 2900 }, hideAfter, messageIndex); 2901 }, 2902 eventListeners: { 2903 ['@messages-loaded.window'](event) { 2904 this.addMessages(event.detail.messages, event.detail.hideAfter) 2905 }, 2906 ['@private-content-loaded.window'](event) { 2907 const data = event.detail.data; 2908 if ( 2909 data.messages && 2910 data.messages.messages && 2911 data.messages.messages.length 2912 ) { 2913 this.addMessages(data.messages.messages); 2914 } 2915 }, 2916 ['@clear-messages.window']() { 2917 this.messages = []; 2918 }, 2919 ['@pageshow.window'](event) { 2920 if (event.persisted) { 2921 this.messages = []; 2922 }; 2923 } 2924 }, 2925 getMessageUiId() { 2926 return 'message-' + this.message.type; 2927 } 2928 } 2929 } 2930 2931 window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true}) 2932</script>
2932 2933<section id="messages" 2934 x-data="initMessages" 2935 x-bind="eventListeners" 2936 role="alert" 2937> 2938 <template x-if="hasMessages"> 2939 <div class="w-full"> 2940 <div class="messages container mx-auto py-3"> 2941 <template x-for="(message, index) in messages" :key="index"> 2942 <div> 2943 <template x-if="hasMessage"> 2944 <div class="message" 2945 :class="message.type" 2946 :ui-id="getMessageUiId" 2947 > 2948 <span x-html="message.text"></span> 2949 <button 2950 type="button" 2951 class="text-gray-600 hover:text-black" 2952 aria-label="Fermer le message" 2953 @click.prevent="removeMessage" 2954 > 2955 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-current" width="18" height="18" aria-hidden="true"> 2956 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2957</svg> 2958 </button> 2959 </div> 2960 </template> 2961 </div> 2962 </template> 2963 </div> 2964 </div> 2965 </template> 2966</section> 2967</div> <div class="container flex flex-col md:flex-row flex-wrap"> 2968 <h1 class="page-title text-3xl font-bold mb-6" 2969 data-ui-id="page-title-wrapper" 2970 > 2971 Panier </h1> 2972 </div> 2973<div class="columns"><div class="column main">
2973<script> 2974 window.checkoutConfig = null; 2975 window.customerData = {}; 2976 window.isCustomerLoggedIn = false; 2977 2978 (function( hyva, undefined ) { 2979 2980 let controller = new AbortController(); 2981 2982 /** 2983 * Takes a form element and submits it through fetch, 2984 * then replaces the result into the document without 2985 * refreshing the page 2986 */ 2987 hyva.postCart = (form) => { 2988 if (!form.action) { 2989 return; 2990 } 2991 window.dispatchEvent(new CustomEvent("cart-is-loading", { detail: { 2992 isLoading: true 2993 }})); 2994 controller.abort(); 2995 controller = new AbortController(); 2996 2997 const action = form.action; 2998 const formData = new FormData(form); 2999 3000 if (!formData.uenc) { 3001 formData.append('uenc', hyva.getUenc()); 3002 } 3003 3004 formData.append('form_key', hyva.getFormKey()); 3005 3006 window.fetch(action, { 3007 method: 'POST', 3008 body: formData, 3009 signal: controller.signal 3010 }).then((result) => { 3011 return result.text() 3012 }).then((content) => { 3013 3014 hyva.replaceDomElement('#maincontent', content) 3015 3016 }).catch((error) => { 3017 if (error.name !== 'AbortError') { 3018 console.error(error); 3019 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 3020 [{ 3021 type: "error", 3022 text: "Une\u0020erreur\u0020s\u0027est\u0020produite.\u0020Veuillez\u0020r\u00E9essayer." 3023 }], 10000 3024 ); 3025 } 3026 }).finally(() => { 3027 window.dispatchEvent(new CustomEvent('cart-is-loading', { 3028 detail: {isLoading: false} 3029 })) 3030 }) 3031 } 3032 }( window.hyva = window.hyva || {} )); 3033 3034 function initCartForm() { 3035 let cartIsReloading = false; 3036 3037 return { 3038 cartIsEmpty: true, 3039 isLoading: false, 3040 init() { 3041 window.checkoutConfig = JSON.parse(this.$root.dataset.checkoutConfig); 3042 window.customerData = window.checkoutConfig.customerData; 3043 window.isCustomerLoggedIn = window.checkoutConfig.isCustomerLoggedIn; 3044 3045 this.cartIsEmpty = window.checkoutConfig === false; 3046 }, 3047 checkCartShouldUpdate() { 3048 const cart = this.$event.detail.data.cart; 3049 if (!cart) return; 3050 3051 const cartIsEmptyState = window.checkoutConfig === false; 3052 if (this.cartIsEmpty !== cartIsEmptyState) { 3053 this.cartIsEmpty = cartIsEmptyState; 3054 this.reloadCartContent(); 3055 return; 3056 } 3057 3058 if (this.cartIsEmpty) return; 3059 3060 if (!cart.items) { 3061 this.reloadCartContent(); 3062 return; 3063 } 3064 3065 if (!window.checkoutConfig && cart.items.length) { 3066 this.reloadCartContent(); 3067 return; 3068 } 3069 3070 const roundUp = (number) => Math.round(number * 1000); 3071 const decimalNumbersAreEqual = (number1, number2) => roundUp(number1) === roundUp(number2); 3072 3073 if (decimalNumbersAreEqual( 3074 cart.items.reduce((totalQty, cartItem) => totalQty + cartItem.qty, 0), 3075 window.checkoutConfig.quoteData.items_qty 3076 ) && 3077 decimalNumbersAreEqual( 3078 cart.subtotalAmount, 3079 window.checkoutConfig.totalsData.total_segments.find((segment) => segment.code === "subtotal").value 3080 ) 3081 ) { 3082 return; 3083 } 3084 3085 this.reloadCartContent(); 3086 }, 3087 reloadCartContent() { 3088 if (cartIsReloading) return; 3089 cartIsReloading = true; 3090 3091 window.fetch(window.location.href, { 3092 method: "GET" 3093 }) 3094 .then((result) => result.text()) 3095 .then((body) => { 3096 hyva.setCookie('mage-cache-sessid', '', -1, true); 3097 window.checkoutConfig = null; 3098 hyva.replaceDomElement('#maincontent', body) 3099 3100 }) 3101 .catch(() => { 3102 if (window.location.search.indexOf('reload=1') > -1) return; 3103 window.location = window.location + (window.location.search.length < 1 ? '?' : '&') + 'reload=1' 3104 }) 3105 .finally(() => { 3106 cartIsReloading = false;
3107 }) 3108 }, 3109 onStorageChange() { 3110 if (this.$event.key === 'private_content_version') { 3111 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 3112 } 3113 }, 3114 onCartIsLoading() { 3115 this.isLoading = (this.$event.detail && this.$event.detail.isLoading) || false 3116 }, 3117 proceedToCheckout() { 3118 this.$dispatch('toggle-authentication', { url: this.$el.href }); 3119 }, 3120 postCart() { 3121 hyva.postCart(this.$event.target) 3122 }, 3123 removeItem() { 3124 hyva.postForm(JSON.parse(this.$el.dataset.deletePostJson)); 3125 this.$dispatch('cart-item-removed', [JSON.parse(this.$el.dataset.cartItemRemovedPayload)]); 3126 }, 3127 moveToWishlist() { 3128 hyva.postForm(JSON.parse(this.$el.dataset.postForm)); 3129 } 3130 } 3131 } 3132 window.addEventListener('alpine:init', () => Alpine.data('initCartForm', initCartForm), { once: true }) 3133</script>
3133 3134<section 3135 x-data="initCartForm" 3136 class="cart-form" 3137 aria-label="Panier" 3138 @private-content-loaded.window="checkCartShouldUpdate" 3139 @storage.window="onStorageChange" 3140 @cart-is-loading.window="onCartIsLoading" 3141 data-checkout-config="false" 3142> 3143 <div class="cart-empty"> 3144 <div> 3145 <p>Aucun article dans votre panier.</p> 3146 <p class="mt-4"> 3147 <a href="https://www.broderieplaisir.com/fr/" class="btn btn-primary"> 3148 Click here to continue shopping. </a> 3149 </p> 3150 </div> 3151 </div> 3152 </section> 3153</div></div></main><footer class="page-footer"><div class="footer content"><div class="text-white bg-bp-pink body-font border-t border-container-darker shadow"> 3154 <div class="py-8 px-16 mx-auto"> 3155 <div class="flex flex-wrap order-first gap-y-16 justify-between flex-col text-center md:flex-row md:text-left"> 3156 <div class="xl:w-[325px] xl:order-1"> 3157 <div class=""> 3158 <div> 3159 <ul class="mt-4"> 3160 <li class="mt-4"> 3161 <a href="https://www.broderieplaisir.com/fr/customer/account/" 3162 class="text-base leading-6"> 3163 Mon compte </a> 3164 </li> 3165 <li class="mt-4"> 3166 <a href="https://www.broderieplaisir.com/fr/sales/guest/form/" 3167 class="text-base leading-6"> 3168 Commandes et retours </a> 3169 </li> 3170 <li class="mt-4"> 3171 <a href="https://www.broderieplaisir.com/fr/contact/" 3172 class="text-base leading-6"> 3173 Contact </a> 3174 </li> 3175 </ul> 3176 </div> 3177 </div> 3178</div> 3179 <div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><style> 3180 [data-content-type="html"][data-element="main"] { 3181 display: contents; 3182 } 3183 </style> 3184 <div class="text-center md:w-full xl:w-auto xl:order-2"> 3185 <div class="font-bold uppercase"> 3186 Informations 3187 </div> 3188 3189 <div class="uppercase"> 3190 Broderie Plaisir 3191 10 Place du Gal de Gaulle 3192 </div> 3193 3194 <div class="uppercase"> 3195 67400 3196 Illkirch Graffenstaden 3197 France 3198 </div> 3199 3200 <div class="uppercase"> 3201 <a class="underline" href="/cdn-cgi/l/email-protection#ddbeb2b3a9bcbea99dbfafb2b9b8afb4b8adb1bcb4aeb4aff3beb2b0"> 3202 <span class="__cf_email__" data-cfemail="b4d7dbdac0d5d7c0f4d6c6dbd0d1c6ddd1c4d8d5ddc7ddc69ad7dbd9">[email protected]</span> 3203 </a> 3204</div> 3205 3206 <div class="uppercase"> 3207 Tèl: 3208 03 90 29 74 49 3209 </div> 3210<br /><br /> 3211<div class="uppercase"> <!-- Logo Instagram avec lien --> 3212 <a href="https://www.instagram.com/broderieplaisir/" target="_blank"> 3213 <img src="https://www.broderieplaisir.com/media/wysiwyg/Instagram.png" 3214 alt="Instagram" 3215 class="inline instagram-logo" 3216 style="width: 40px; height: 40px;" /> 3217 </a> 3218</div> 3219 <div class="mt-6"> 3220 <img src="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/BP_Theme/images/footer/credit_mutuel.png" 3221 class="inline" 3222 style="width: 75px" 3223 alt="Crédit Mutuel" /> 3224 <img src="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/BP_Theme/images/footer/card_2.png" 3225 class="inline" 3226 alt="Cards allowed" /> 3227 <img src="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/BP_Theme/images/footer/card_1.png" 3228 class="inline" 3229 alt="Cards allowed" /> 3230 </div> 3231 </div> 3232</div> 3233<div class="xl:order-3"> 3234 <div class="xl:w-[325px] xl:order-3"> 3235 <form 3236 class="form subscribe" 3237 action="https://www.broderieplaisir.com/fr/newsletter/subscriber/new/" 3238 method="post" 3239 x-data="initNewsletterForm()"
3240 @submit.prevent="submitForm()" 3241 id="newsletter-validate-detail" 3242 aria-label="S'abonner à la lettre d’information" 3243 > 3244 <h2 3245 class="mb-3 text-sm font-medium tracking-widest uppercase title-font" 3246 id="footer-newsletter-heading" 3247 > 3248 Lettre dâinformation </h2> 3249 <div class="flex flex-wrap justify-center gap-2 md:justify-start"> 3250 <label for="newsletter-subscribe" class="sr-only"> 3251 Adresse email </label> 3252 <input 3253 name="email" 3254 type="email" 3255 required 3256 id="newsletter-subscribe" 3257 class="text-black form-input inline-flex w-full" 3258 placeholder="Saisissez votre email" 3259 aria-describedby="footer-newsletter-heading" 3260 > 3261 <input name="form_key" type="hidden" value="z6LX1KWv1L9598mb" /> <div class="control"> 3262 <input type="hidden" 3263 value="" 3264 name="g-recaptcha-response" 3265 > 3266</div> 3267 <button class="inline-flex shrink-0 ml-auto xl:mt-0 btn btn-primary"> 3268 Inscription </button> 3269 </div> 3270 <div> 3271 <template x-if="displayErrorMessage"> 3272 <p class="flex items-center text-red"> 3273 <span class="inline-block w-8 h-8 mr-3"> 3274 <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"> 3275 <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> 3276<title>exclamation-circle</title></svg> 3277 </span> 3278 <template x-for="errorMessage in errorMessages"> 3279 <span x-html="errorMessage"></span> 3280 </template> 3281 </p> 3282 </template> 3283 </div> 3284 </form> 3285 <div class="w-full"> 3286 <p class="prose my-4 text-sm"> 3287 <em>Ce formulaire est protégé par reCAPTCHA. Les <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">règles de confidentialité</a> et les <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">conditions d' utilisation</a> de <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Google</a> s'appliquent.</em> 3288</p> 3289 </div>
vendor: 113 bytes, lines 3289-3290
3289 3290 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
3290<script> 3291 function initNewsletterForm() { 3292 return { 3293 errors: 0, 3294 hasCaptchaToken: 0, 3295 displayErrorMessage: false, 3296 errorMessages: [], 3297 setErrorMessages(messages) { 3298 this.errorMessages = [messages] 3299 this.displayErrorMessage = this.errorMessages.length 3300 }, 3301 submitForm() { 3302 // Do not rename $form, the variable is expected to be declared in the recaptcha output 3303 const $form = document.querySelector('#newsletter-validate-detail'); 3304 if (!this.hasCaptchaToken) { 3305 this.errors = 1; 3306 3307 3308 const executeGreCaptcha = () => { 3309 grecaptcha.ready(() => { 3310 grecaptcha.execute( 3311 '6Lc2fKorAAAAAO1Cz9tTTA2cFil17h3d5Na5sbZf', 3312 {action: 'submit'} 3313 ).then((token) => { 3314 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 3315 3316 if (tokenElement && token && token.length > 0) { 3317 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 3318 this.errors = 0; 3319 this.hasCaptchaToken = 1; 3320 (this.submitForm || $form.submit).call(this); 3321 } else { 3322 this.errors = 1; 3323 const error = tokenElement 3324 ? 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again' 3325 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020trying\u0020again.'; 3326 if (this.setErrorMessages) { 3327 this.setErrorMessages([error]) 3328 this.displayErrorMessage = true; 3329 } else { 3330 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 3331 } 3332 } 3333 }).catch(exception => { 3334 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 3335 }); 3336 }) 3337 } 3338 3339 if (window.grecaptcha) { 3340 executeGreCaptcha(); 3341 } else { 3342 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6Lc2fKorAAAAAO1Cz9tTTA2cFil17h3d5Na5sbZf"; 3343 const script = document.createElement('script'); 3344 script.setAttribute('type', 'text/javascript'); 3345 script.setAttribute('src', recaptchaUrl); 3346 document.head.appendChild(script); 3347 3348 script.addEventListener("load", executeGreCaptcha, false); 3349 } 3350 } 3351 3352 if (this.errors === 0) { 3353 $form.submit(); 3354 } 3355 } 3356 } 3357 } 3358 </script>
3358 3359</div> 3360 </div> 3361 </div> 3362 </div> 3363 <div class="bg-container border-t border-b border-container"> 3364 <div class="py-6 mx-auto flex items-center sm:flex-row flex-col text-black sm:px-24 "> 3365 © 2026 Broderieplaisir. Tous droits réservés </div> 3366 </div> 3367</div> 3368</div></footer>
3369<script> 3370 let SnapSlider = class { 3371 constructor(el, { 3372 labelSepparator = 'sur', 3373 autoPager, 3374 groupPager 3375 } = {}) { 3376 this.el = el; 3377 this.track = this.el.querySelector("[data-track]"); 3378 if (!this.track) { 3379 console.warn( 3380 "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track", 3381 this.el 3382 ); 3383 return; 3384 } 3385 this.initialLoad = true; 3386 this.slides = []; 3387 this.inViewObserver; 3388 this.mutationObserver; 3389 this.resizeObserver; 3390 this.pager = this.el.querySelector("[data-pager]"); 3391 this.navBtns = Array.from( 3392 this.el.querySelectorAll("[data-next], [data-prev]") 3393 ); 3394 this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator; 3395 this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false; 3396 this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false; 3397 this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, ""); 3398 this.sliderId = this.el.id || this.sliderLabel || "slider"; 3399 this.markerIdName = "data-target-id"; 3400 this.pagerClasses = this.el.dataset.pagerClass || "snap-pager"; 3401 this.markerClasses = this.el.dataset.markerClass || "snap-marker"; 3402 this.init(); 3403 } 3404 init() { 3405 this.setupSlides(); 3406 this.setupNav(); 3407 if (this.useAutoPager) { 3408 this.createPager(); 3409 } else { 3410 this.setupPager(); 3411 } 3412 this.setupObservers(); 3413 this.setupMutationObserver(); 3414 this.setupResizeObserver(); 3415 this.el.addEventListener("click", this.eventHandler.bind(this)); 3416 this.el.addEventListener("keydown", this.eventHandler.bind(this)); 3417 } 3418 destroy() { 3419 this.inViewObserver?.disconnect(); 3420 this.mutationObserver?.disconnect(); 3421 this.resizeObserver?.disconnect(); 3422 this.el.removeEventListener("click", this.eventHandler.bind(this)); 3423 this.el.removeEventListener("keydown", this.eventHandler.bind(this)); 3424 } 3425 roundUpIfGreaterThan(number, min = 8) { 3426 const decimalPart = number - Math.floor(number); 3427 return decimalPart >= min ? Math.ceil(number) : Math.floor(number); 3428 } 3429 getInViewItems() { 3430 const inViewSlides = this.track.querySelectorAll("[data-in-view]"); 3431 const firstInViewSlide = inViewSlides[0] || null; 3432 const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null; 3433 const isAtStart = firstInViewSlide === this.slides[0]; 3434 const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1]; 3435 return { 3436 inViewSlides, 3437 totalInViewSlides: inViewSlides.length, 3438 firstInViewSlide, 3439 lastInViewSlide, 3440 isAtStart, 3441 isAtEnd, 3442 hasNoOverflow: isAtStart && isAtEnd 3443 }; 3444 } 3445 groupPagerMarkers() { 3446 if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return; 3447 const totalVisibleSlides = this.roundUpIfGreaterThan( 3448 this.track.offsetWidth / this.slides[0].offsetWidth 3449 ); 3450 const markers = Array.from(this.pager.querySelectorAll("a, button")); 3451 markers.forEach((marker, index) => { 3452 marker.style.display = index % totalVisibleSlides === 0 ? null : "none"; 3453 }); 3454 } 3455 handleInView(entries) { 3456 entries.forEach((entry) => { 3457 const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector( 3458 `[${this.markerIdName}="${entry.target.id}"]` 3459 )); 3460 entry.target.toggleAttribute("data-in-view", entry.isIntersecting); 3461 entry.target.toggleAttribute("inert", !entry.isIntersecting); 3462 marker?.setAttribute("aria-current", entry.isIntersecting); 3463 marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1"); 3464 }); 3465 const { 3466 isAtStart, 3467 isAtEnd, 3468 hasNoOverflow 3469 } = this.getInViewItems(); 3470 this.navBtns.forEach((btn) => { 3471 if (btn.hasAttribute("data-next")) { 3472 btn.style.visibility = hasNoOverflow ? "hidden" : null; 3473 isAtEnd ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 3474 } 3475 if (btn.hasAttribute("data-prev")) { 3476 btn.style.visibility = hasNoOverflow ? "hidden" : null; 3477 isAtStart ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 3478 } 3479 }); 3480 if (this.pager) { 3481 this.pager.style.visibility = hasNoOverflow ? "hidden" : null; 3482 } 3483 if (!this.initialLoad) { 3484 this.el.dispatchEvent( 3485 new CustomEvent("slideChange", { 3486 detail: this.getInViewItems() 3487 }) 3488 ); 3489 } else { 3490 this.initialLoad = false;
3491 } 3492 if (document.activeElement.parentElement.hasAttribute("data-pager")) { 3493 const activeItems = this.pager.querySelectorAll('[tabindex="0"]'); 3494 if (activeItems.length) { 3495 activeItems[0].focus({ preventScroll: true }); 3496 } 3497 } 3498 } 3499 getSlides() { 3500 if (!this.track) return []; 3501 return Array.from(this.track.children).filter( 3502 (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" 3503 ); 3504 } 3505 refreshSlides() { 3506 this.initialLoad = true; 3507 this.slides = this.getSlides(); 3508 this.setupSlides(); 3509 if (this.useAutoPager) { 3510 this.createPager(); 3511 } else { 3512 this.setupPager(); 3513 } 3514 this.groupPagerMarkers(); 3515 this.setupObservers(); 3516 } 3517 setupSlides() { 3518 this.slides = this.getSlides(); 3519 this.slides.forEach((slide, index) => { 3520 const totalSlides = this.slides.length; 3521 const currentSlide = index + 1; 3522 const existingLabel = slide.getAttribute("aria-label") || ""; 3523 const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture"; 3524 const slideLabelTag = isImage ? "alt" : "aria-label"; 3525 const hasAutoLabel = existingLabel.startsWith( 3526 `${currentSlide} ${this.slideLabelSepparator} ` 3527 ); 3528 if (!slide.hasAttribute("id")) { 3529 slide.setAttribute( 3530 "id", 3531 `${this.sliderId}-item-${currentSlide}` 3532 ); 3533 } 3534 if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) { 3535 slide.setAttribute( 3536 slideLabelTag, 3537 `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}` 3538 ); 3539 } 3540 if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) { 3541 slide.setAttribute("role", "group"); 3542 } 3543 if (this.pager && !isImage) { 3544 slide.setAttribute("role", "tabpanel"); 3545 } 3546 if (slide.getAttribute("role") === "group") { 3547 slide.setAttribute("aria-roledescription", "item"); 3548 } 3549 }); 3550 if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") { 3551 this.el.setAttribute("role", "region"); 3552 } 3553 if (!this.el.hasAttribute("aria-roledescription")) { 3554 this.el.setAttribute("aria-roledescription", "carousel"); 3555 } 3556 this.track.setAttribute("tabindex", 0); 3557 this.track.setAttribute("aria-live", "polite"); 3558 } 3559 setupNav() { 3560 this.navBtns.forEach((btn) => { 3561 btn.setAttribute("disabled", ""); 3562 btn.removeAttribute("hidden"); 3563 btn.classList.remove("invisible"); 3564 btn.style.visibility = null; 3565 }); 3566 } 3567 createPager() { 3568 const newPager = document.createElement("nav"); 3569 newPager.setAttribute("data-pager", ""); 3570 newPager.setAttribute("role", "tablist"); 3571 newPager.classList.add(...this.pagerClasses.split(" ")); 3572 this.slides.forEach((slide, index) => { 3573 const marker = document.createElement("button"); 3574 const slideId = slide.id || `${this.sliderId}-item-${index + 1}`; 3575 marker.setAttribute(this.markerIdName, slideId); 3576 marker.classList.add(...this.markerClasses.split(" ")); 3577 this.setupPagerMarker(marker, index); 3578 newPager.appendChild(marker); 3579 if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") { 3580 slide.removeAttribute("aria-roledescription"); 3581 slide.setAttribute("role", "tabpanel"); 3582 } 3583 }); 3584 if (this.pager) { 3585 this.pager.setAttribute("role", "tablist"); 3586 this.pager.replaceChildren(...newPager.children); 3587 } else { 3588 this.track.after(newPager); 3589 this.pager = this.el.querySelector("[data-pager]"); 3590 } 3591 } 3592 setupPager() { 3593 if (!this.pager) return; 3594 this.pager.setAttribute("role", "tablist"); 3595 const items = Array.from(this.pager.querySelectorAll("a, button"));
3596 items.forEach((marker, index) => this.setupPagerMarker(marker, index)); 3597 } 3598 setupPagerMarker(marker, index) { 3599 const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 3600 const slideId = markerId || `${this.sliderId}-item-${index + 1}`; 3601 if (!markerId) { 3602 marker.setAttribute(this.markerIdName, slideId); 3603 } 3604 marker.setAttribute("role", "tab"); 3605 marker.setAttribute("aria-controls", slideId); 3606 marker.setAttribute("aria-posinset", index + 1); 3607 marker.setAttribute("aria-setsize", this.slides.length); 3608 marker.setAttribute("tabindex", "-1"); 3609 if (!marker.hasAttribute("aria-label")) { 3610 marker.setAttribute("aria-label", `Slide ${index + 1}`); 3611 } 3612 } 3613 setupObservers() { 3614 if (this.inViewObserver) { 3615 this.inViewObserver.disconnect(); 3616 } 3617 this.inViewObserver = new IntersectionObserver( 3618 this.handleInView.bind(this), { 3619 root: this.track, 3620 threshold: 0.8 3621 } 3622 ); 3623 this.slides.forEach((slide) => this.inViewObserver.observe(slide)); 3624 } 3625 setupMutationObserver() { 3626 this.mutationObserver = new MutationObserver( 3627 this.refreshSlides.bind(this) 3628 ); 3629 this.mutationObserver.observe(this.track, { 3630 childList: true, 3631 subtree: false 3632 }); 3633 } 3634 setupResizeObserver() { 3635 this.resizeObserver = new ResizeObserver( 3636 this.groupPagerMarkers.bind(this) 3637 ); 3638 this.resizeObserver.observe(this.el); 3639 } 3640 goToSlideDir(dir = "next") { 3641 const { 3642 firstInViewSlide, 3643 lastInViewSlide 3644 } = this.getInViewItems(); 3645 const isPrev = dir === "prev"; 3646 let targetSlide = isPrev ? firstInViewSlide?.previousElementSibling : lastInViewSlide?.nextElementSibling; 3647 if (!targetSlide) return; 3648 if (targetSlide.tagName.toLowerCase() === "template") { 3649 targetSlide = isPrev ? targetSlide?.previousElementSibling : targetSlide?.nextElementSibling; 3650 } 3651 targetSlide.scrollIntoView({ block: "nearest", inline: isPrev ? "end" : "start" }); 3652 } 3653 pagerToSlide(event) { 3654 if (!event.target.closest("[data-pager]")) return; 3655 const marker = event.target.closest("a, button"); 3656 if (!marker) return; 3657 event.preventDefault(); 3658 const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 3659 const targetSlide = this.track.querySelector(`#${slideId}`); 3660 targetSlide?.scrollIntoView({ block: "nearest", inline: "start" }); 3661 } 3662 eventHandler(event) { 3663 const target = event.target.closest( 3664 "[data-next], [data-prev], [data-pager]" 3665 ); 3666 if (!target) return; 3667 if (event.type === "click") { 3668 if (target.hasAttribute("data-next")) { 3669 this.goToSlideDir("next"); 3670 } else if (target.hasAttribute("data-prev")) { 3671 this.goToSlideDir("prev"); 3672 } else if (target.closest("[data-pager]")) { 3673 this.pagerToSlide(event); 3674 } 3675 } 3676 if (event.type === "keydown" && target.closest("[data-pager]")) { 3677 if (event.key === "ArrowRight") { 3678 this.goToSlideDir("next"); 3679 } else if (event.key === "ArrowLeft") { 3680 this.goToSlideDir("prev"); 3681 } 3682 } 3683 } 3684 }; 3685 3686 (() => { 3687 function alpineSnapSlider(Alpine) { 3688 Alpine.directive("snap-slider", (el, { 3689 modifiers 3690 }, { 3691 cleanup 3692 }) => { 3693 const autoPager = modifiers.includes("auto-pager");
3694 const groupPager = modifiers.includes("group-pager"); 3695 const slider = new SnapSlider(el, { 3696 autoPager, 3697 groupPager 3698 }); 3699 cleanup(() => { 3700 slider.destroy(); 3701 }); 3702 }); 3703 } 3704 3705 document.addEventListener("alpine:init", () => { 3706 window.Alpine.plugin(alpineSnapSlider); 3707 }); 3708 })(); 3709 //# sourceURL=alpine-snap-slider.js 3710</script>
3710 3711
3712<script> 3713 (() => { 3714 // src/dialog.js 3715 function dialog_default(Alpine) { 3716 Alpine.directive("htmldialog", fylgjaAlpineDialog); 3717 function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) { 3718 const evaluate = expression.length ? evaluateLater(expression) : () => {}; 3719 const canEvaluate = expression.length > 0; 3720 const lockPageScroll = modifiers.includes("noscroll"); 3721 const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest"); 3722 el.style.display = null; 3723 el.style.length === 0 && el.removeAttribute("style"); 3724 if (el._x_isShown) { 3725 open(); 3726 } 3727 const closeBySupported = (() => { 3728 return "closedBy" in HTMLDialogElement.prototype; 3729 })(); 3730 function scrollLock(use = true) { 3731 document.body.style.overflow = use ? "hidden" : ""; 3732 } 3733 function dialogSubmit(event) { 3734 if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") { 3735 event.preventDefault(); 3736 evaluate(); 3737 } 3738 } 3739 function escapeDialog(event) { 3740 if (event.key !== "Escape") return; 3741 event.preventDefault(); 3742 if (closeBy === "none") return; 3743 evaluate(); 3744 } 3745 function handleCloseByEvent(event) { 3746 if (event.target !== el) return; 3747 const rect = el.getBoundingClientRect(); 3748 const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; 3749 if (!isInDialog) { 3750 if (closeBy === "any") { 3751 if (closeBySupported) { 3752 event.preventDefault(); 3753 } 3754 evaluate(); 3755 } 3756 } 3757 } 3758 function handleCloseEvent() { 3759 evaluate(); 3760 } 3761 function open() { 3762 if (el.hasAttribute("open")) return; 3763 el.showModal(); 3764 scrollLock(lockPageScroll); 3765 } 3766 function close() { 3767 if (!el.hasAttribute("open")) return; 3768 el.close(); 3769 scrollLock(false); 3770 } 3771 el._x_doShow = () => open(); 3772 el._x_doHide = () => close(); 3773 el.addEventListener("keydown", escapeDialog); 3774 el.addEventListener("submit", dialogSubmit); 3775 el.addEventListener("click", handleCloseByEvent); 3776 el.addEventListener("cancel", handleCloseEvent); 3777 cleanup(() => { 3778 el.removeEventListener("keydown", escapeDialog); 3779 el.removeEventListener("submit", dialogSubmit); 3780 el.removeEventListener("click", handleCloseByEvent); 3781 el.removeEventListener("cancel", handleCloseEvent); 3782 scrollLock(false); 3783 }); 3784 } 3785 } 3786 function modifierValue(modifiers, key, fallback) { 3787 if (modifiers.indexOf(key) === -1) return fallback; 3788 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 3789 if (!rawValue) return fallback; 3790 if (key === "closeby") { 3791 const allowedValues = ["auto", "none", "closerequest", "any"]; 3792 const options = allowedValues.join(", "); 3793 if (!allowedValues.includes(rawValue)) { 3794 console.warn( 3795 `"${rawValue}" is not one of the allowed values for closeby: ${options}` 3796 ); 3797 return fallback; 3798 } 3799 } 3800 return rawValue; 3801 } 3802 3803 // src/cdn.js 3804 document.addEventListener("alpine:init", () => { 3805 window.Alpine.plugin(dialog_default); 3806 }); 3807 })(); 3808 //# sourceURL=alpine-htmldialog.js 3809</script>
3809 3810
3811<script> 3812 (() => { 3813 function src_default(Alpine) { 3814 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 3815 let evaluate = evaluateLater(expression); 3816 let options = { 3817 rootMargin: getRootMargin(modifiers), 3818 threshold: getThreshold(modifiers) 3819 }; 3820 let observer = new IntersectionObserver((entries) => { 3821 entries.forEach((entry) => { 3822 if (entry.isIntersecting === (value === "leave")) 3823 return; 3824 evaluate(); 3825 modifiers.includes("once") && observer.disconnect(); 3826 }); 3827 }, options); 3828 observer.observe(el); 3829 cleanup(() => { 3830 observer.disconnect(); 3831 }); 3832 })); 3833 } 3834 function getThreshold(modifiers) { 3835 if (modifiers.includes("full")) 3836 return 0.99; 3837 if (modifiers.includes("half")) 3838 return 0.5; 3839 if (!modifiers.includes("threshold")) 3840 return 0; 3841 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 3842 if (threshold === "100") 3843 return 1; 3844 if (threshold === "0") 3845 return 0; 3846 return Number(`.${threshold}`); 3847 } 3848 function getLengthValue(rawValue) { 3849 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 3850 return match ? match[1] + (match[2] || "px") : void 0; 3851 } 3852 function getRootMargin(modifiers) { 3853 const key = "margin"; 3854 const fallback = "0px 0px 0px 0px"; 3855 const index = modifiers.indexOf(key); 3856 if (index === -1) 3857 return fallback; 3858 let values = []; 3859 for (let i = 1; i < 5; i++) { 3860 values.push(getLengthValue(modifiers[index + i] || "")); 3861 } 3862 values = values.filter((v) => v !== void 0); 3863 return values.length ? values.join(" ").trim() : fallback; 3864 } 3865 3866 document.addEventListener("alpine:init", () => { 3867 window.Alpine.plugin(src_default); 3868 }); 3869 })(); 3870 //# sourceURL=alpine-intersect.js 3871</script>
3871 3872
3873<script> 3874 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"})) { 3875 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 3876 } 3877 //# sourceURL=alpine-defer-rules.js 3878</script>
vendor: 1 bytes, line 3878
3878
3879<script> 3880 (() => { 3881 const hasAlpine = new Promise(resolve => { 3882 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 3883 }); 3884 3885 const hasInteract = new Promise(resolve => { 3886 (events => { 3887 const onInteract = () => { 3888 resolve(); 3889 events.forEach(type => window.removeEventListener(type, onInteract)); 3890 } 3891 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 3892 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 3893 }); 3894 3895 const onIntersect = (el) => { 3896 return new Promise(resolve => { 3897 const observer = new IntersectionObserver(entries => { 3898 for (const entry of entries) { 3899 if (entry.isIntersecting) { 3900 observer.disconnect() 3901 resolve(); 3902 } 3903 } 3904 }, {}); 3905 observer.observe(el); 3906 }); 3907 } 3908 3909 function runComponent(el) { 3910 hasAlpine.then(() => { 3911 el.removeAttribute('x-ignore'); 3912 queueMicrotask(() => Alpine.initTree(el)); 3913 }); 3914 } 3915 3916 function initDeferredComponents() { 3917 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 3918 el.setAttribute('x-ignore', ''); 3919 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 3920 switch (deferUntil) { 3921 case 'interact': 3922 hasInteract.then(() => runComponent(el)); 3923 break; 3924 case 'intersect': 3925 onIntersect(el).then(() => runComponent(el)) 3926 break; 3927 case 'idle': 3928 window.requestIdleCallback 3929 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 3930 : setTimeout(() => runComponent(el), 4000); 3931 break; 3932 case 'eager': 3933 runComponent(el); 3934 break; 3935 default: 3936 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 3937 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 3938 } 3939 } 3940 }); 3941 } 3942 3943 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 3944 })(); 3945 //# sourceURL=alpine-defer.js 3946</script>
3946 3947 3948
3949<script type="module" 3950 src="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/Hyva_Theme/js/alpine3.min.js" 3951 defer 3952 crossorigin 3953></script>
vendor: 1 bytes, line 3953
3953
3954<script> 3955 function dispatchMessages(messages, hideAfter) { 3956 const messagesEvent = new CustomEvent("messages-loaded", { 3957 detail: { 3958 messages: messages, 3959 hideAfter: hideAfter 3960 } 3961 }); 3962 window.dispatchEvent(messagesEvent); 3963 } 3964 3965 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 3966 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 3967 } 3968 3969 (function( hyva, undefined ) { 3970 3971 hyva.initFormKey = () => { 3972 const inputSelector = 'input[name="form_key"]', 3973 formKey = hyva.getFormKey(); 3974 3975 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 3976 input.value = formKey 3977 }); 3978 } 3979 3980 hyva.initMessages = () => { 3981 try { 3982 const messages = hyva.getCookie('mage-messages'); 3983 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 3984 3985 dispatchMessages(window.mageMessages); 3986 3987 // empty `mage-messages` cookie 3988 const skipSetDomain = true; 3989 hyva.setCookie('mage-messages','', -1, skipSetDomain); 3990 3991 } catch (error) { 3992 console.warn('Error parsing Cookie Messages:', error); 3993 } 3994 } 3995 3996 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 3997 hyva.alpineInitialized(hyva.initMessages) 3998 3999 }( window.hyva = window.hyva || {} )); 4000 //# sourceURL=hyva-cookies.js 4001</script>
vendor: 1 bytes, line 4001
4001
4002<script> 4003 { 4004 const private_content_key = 'mage-cache-storage'; 4005 const private_content_expire_key = 'mage-cache-timeout'; 4006 const private_content_version_key = 'private_content_version'; 4007 const section_data_ids_key = 'section_data_ids'; 4008 const mage_cache_session_id_key = 'mage-cache-sessid'; 4009 const last_visited_store_key = 'last_visited_store'; 4010 4011 const ttl = 3600; 4012 4013 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 4014 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 4015 } 4016 4017 function loadSectionData () { 4018 const browserStorage = hyva.getBrowserStorage(); 4019 if (!browserStorage) { 4020 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 4021 [{ 4022 type: "warning", 4023 text: "Veuillez activer localStorage dans votre navigateur." 4024 }] 4025 ); 4026 return; 4027 } 4028 try { 4029 let isInvalid = false; 4030 4031 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 4032 isInvalid = true; 4033 } 4034 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 4035 4036 if (!hyva.getCookie(mage_cache_session_id_key)) { 4037 isInvalid = true; 4038 browserStorage.removeItem(private_content_key); 4039 const skipSetDomain = true; 4040 const days = false; 4041 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 4042 } 4043 4044 const cookieVersion = hyva.getCookie(private_content_version_key); 4045 const storageVersion = browserStorage.getItem(private_content_version_key); 4046 4047 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 4048 isInvalid = true; 4049 } 4050 4051 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 4052 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 4053 browserStorage.removeItem(private_content_key); 4054 } 4055 4056 if (isInvalid && cookieVersion) { 4057 fetchPrivateContent([]); 4058 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 4059 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 4060 if ( 4061 privateContent && 4062 privateContentExpires && 4063 privateContent.cart && 4064 privateContent.customer 4065 ) { 4066 dispatchPrivateContent(privateContent); 4067 } else { 4068 fetchPrivateContent([]); 4069 } 4070 } else { 4071 if (document.getElementById('default-section-data')) { 4072 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 4073 dispatchPrivateContent(privateContent); 4074 } else { 4075 dispatchPrivateContent({}); 4076 } 4077 } 4078 4079 } catch (error) { 4080 console.warn('Error retrieving Private Content:', error); 4081 } 4082 } 4083 4084 hyva.alpineInitialized(loadSectionData) 4085 window.addEventListener('reload-customer-section-data', loadSectionData); 4086 4087 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 4088 4089 function dispatchPrivateContent(data) { 4090 4091 const privateContentEvent = new CustomEvent("private-content-loaded", { 4092 detail: { 4093 data: window.processSectionDataBeforeDispatch(data) 4094 } 4095 }); 4096 window.dispatchEvent(privateContentEvent); 4097 } 4098 4099 function fetchPrivateContent(sections) { 4100 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 4101 method: 'GET', 4102 headers: { 4103 'Content-Type': 'application/json', 4104 'X-Requested-With': 'XMLHttpRequest' 4105 } 4106 }) 4107 .then(response => response.ok && response.json()) 4108 .then( 4109 data => { 4110 if (data) { 4111 try { 4112 const browserStorage = hyva.getBrowserStorage(); 4113 4114 // merge new data preserving non-invalidated sections 4115 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 4116 4117 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 4118 delete oldSectionData['checkout-data']; 4119 } 4120 const newSectionData = Object.assign(oldSectionData, data); 4121 4122 dispatchPrivateContent(newSectionData); 4123 4124 // don't persist messages, they've been dispatched already 4125 if (newSectionData.messages && newSectionData.messages.messages ) { 4126 newSectionData.messages.messages = []; 4127 } 4128 4129 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 4130 4131 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 4132 browserStorage.setItem(private_content_expire_key, expiresAt); 4133 4134 const newCookieVersion = hyva.getCookie(private_content_version_key); 4135 browserStorage.setItem(private_content_version_key, newCookieVersion); 4136 4137 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 4138 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 4139 hyva.setCookie( 4140 section_data_ids_key, 4141 JSON.stringify( 4142 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 4143 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 4144 return sectionDataIds; 4145 }, {}) 4146 ), 4147 false, 4148 true 4149 ); 4150 } catch (error) { 4151 console.warn("Couldn't store privateContent", error); 4152 } 4153 } 4154 } 4155 ) 4156 .catch(error => { 4157 console.warn("Couldn't fetch privateContent", error); 4158 }); 4159 } 4160 } 4161 //# sourceURL=hyva-private-content.js 4162</script>
vendor: 1 bytes, line 4162
4162
4163<script> 4164 (() => { 4165 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 4166 })() 4167</script>
vendor: 1 bytes, line 4167
4167
4168<script> 4169 (events => { 4170 const dispatchUserInteractionEvent = () => { 4171 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 4172 window.dispatchEvent(new Event('init-external-scripts')) 4173 }; 4174 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 4175 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']); 4176 //# sourceURL=hyva-init-external-scripts.js 4177</script>
vendor: 1 bytes, line 4177
4177
4178<script> 4179 function initConfigurableOptions(productId, optionConfig) { 4180 4181 function findPathParam(key) { 4182 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 4183 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 4184 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 4185 for (let i = 0; i < pathParts.length; i += 2) { 4186 if (pathParts[i] === key && pathParts.length > i) { 4187 return pathParts[i + 1]; 4188 } 4189 } 4190 } 4191 4192 return { 4193 optionConfig, 4194 productId, 4195 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 4196 allowedAttributeOptions: [], 4197 selectedValues: [], 4198 init() { 4199 this.buildLookupMap(); 4200 this.findAllowedAttributeOptions(); 4201 this.$nextTick(() => { 4202 if (typeof this.optionConfig.defaultValues === 'object') { 4203 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 4204 this.changeOption(attributeId, value + ''); 4205 } 4206 } 4207 }); 4208 }, 4209 productIndex: 0, 4210 productIndexForPrice: 0, 4211 productIndexesMap: null, 4212 productIndexesKeys: null, 4213 attributeCount: 0, 4214 optionIsActive(attributeId, optionId) { 4215 return !!this.getAllowedAttributeOptions(attributeId).find( 4216 option => option.id === optionId 4217 ) 4218 }, 4219 optionIsEnabled(attributeId, optionId) { 4220 for (const productId in this.optionConfig.index) { 4221 if (this.optionConfig.index[productId][attributeId] === optionId) { 4222 return true; 4223 } 4224 } 4225 return false; 4226 }, 4227 findSimpleIndex() { 4228 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 4229 this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues); 4230 }, 4231 calculateSimpleIndexForPartialSelection(selectedValues) { 4232 if (selectedValues.length === 0) return 0; 4233 return this.findProductIdsForPartialSelection(selectedValues)[0]; 4234 }, 4235 buildLookupMap() { 4236 this.productIndexesMap = new Map(); 4237 this.attributeCount = Object.keys(this.optionConfig.attributes).length; 4238 for (const id in this.optionConfig.index) { 4239 const options = this.optionConfig.index[id]; 4240 if (! this.productIndexesKeys) { 4241 this.productIndexesKeys = Object.keys(options).sort(); 4242 } 4243 const key = JSON.stringify(options, this.productIndexesKeys); 4244 this.productIndexesMap.set(key, id); 4245 } 4246 }, 4247 calculateSimpleIndexForFullSelection(selectedValues) { 4248 if (! this.isFullSelection(selectedValues)) return false; 4249 4250 const attrKeys = this.productIndexesKeys || []; 4251 const normalised = {}; 4252 for (let i = 0; i < attrKeys.length; i++) { 4253 normalised[attrKeys[i]] = selectedValues[attrKeys[i]]; 4254 } 4255 const queryKey = JSON.stringify(normalised, attrKeys); 4256 return this.productIndexesMap.get(queryKey); 4257 }, 4258 findAllowedAttributeOptions() { 4259 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 4260 }, 4261 calculateAllowedAttributeOptions(selectedValues) { 4262 const allAttributes = this.optionConfig.attributes; 4263 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 4264 return a.position - b.position 4265 }); 4266 4267 const newAllowedAttributeOptions = []; 4268 4269 allAttributesSorted.forEach(attribute => { 4270 const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); 4271 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 4272 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 4273 return !!option.products.find(product => { 4274 return availableIndexes.includes(product); 4275 }) 4276 }); 4277 }); 4278 return newAllowedAttributeOptions; 4279 }, 4280 calculateAvailableProductIndexes(selectedOptions) { 4281 if (Object.keys(selectedOptions).length === 0) { 4282 if (Object.values(this.optionConfig.salable || {}).length) { 4283 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 4284 } 4285 return Object.keys(this.optionConfig.index); 4286 } 4287 4288 const selectedIds = Object.keys(selectedOptions); 4289 if (Object.values(this.optionConfig.salable || {}).length) { 4290 const selectedOptionIndexes = selectedIds.map(attrId => { 4291 const optionValue = selectedOptions[attrId]; 4292 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 4293 }) 4294 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 4295 return acc.filter(index => optionIndexes.includes(index)); 4296 }); 4297 } else { 4298 const productIndexes = this.optionConfig.index; 4299 return Object.keys(productIndexes).filter(index => { 4300 for (const attrId of selectedIds) { 4301 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 4302 } 4303 return true 4304 }); 4305 } 4306 }, 4307 findAttributeByOptionId(optionId) { 4308 for (const attributeId in this.optionConfig.attributes) { 4309 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 4310 if (attributeOptions.find(option => option.id === optionId)) { 4311 return attributeId; 4312 } 4313 } 4314 }, 4315 getAllowedAttributeOptions(attributeId) { 4316 return this.allowedAttributeOptions[attributeId] || [] 4317 }, 4318 getAllAttributeOptions(attributeId) { 4319 return ( 4320 this.optionConfig.attributes[attributeId] && 4321 this.optionConfig.attributes[attributeId].options 4322 ) || [] 4323 }, 4324 getProductIdsForOption(option) { 4325 const attributeId = this.findAttributeByOptionId(option.id); 4326 const allOptions = this.optionConfig.attributes[attributeId]; 4327 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 4328 return opt && opt.products 4329 ? opt.products 4330 : []; 4331 }, 4332 findProductIdsForPartialSelection(optionSelection) { 4333 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 4334 const newCandidates = this.getProductIdsForOption({id: optionId}); 4335 return candidates === null 4336 ? newCandidates 4337 : candidates.filter(productId => newCandidates.includes(productId)); 4338 }, null); 4339 return candidateProducts || []; 4340 },
4341 findCheapestProductForPartialSelection(optionSelection) { 4342 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 4343 return candidateProducts.reduce((cheapest, simpleIdx) => { 4344 // in the first iteration we start with simpleIdx as the currently cheapest product 4345 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 4346 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 4347 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 4348 ? simpleIdx 4349 : cheapest; 4350 }, 0) 4351 }, 4352 findProductIdToUseForOptionPrice(option) { 4353 // try to find a product for a complete selection 4354 const attributeId = this.findAttributeByOptionId(option.id); 4355 const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); 4356 const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); 4357 // if there is no complete selection, use the cheapest product for the option 4358 return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); 4359 }, 4360 getAttributeOptionLabel(option) { 4361 const optionProduct = this.findProductIdToUseForOptionPrice(option); 4362 4363 if ((! optionProduct) || (optionProduct === this.productIndexForPrice)) { 4364 return option.label; 4365 } 4366 4367 const currentPrice = this.getOptionPriceAdjustmentBasePrice(); 4368 4369 if (this.optionConfig.optionPrices[optionProduct]) { 4370 const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; 4371 if (optionPrice !== currentPrice){ 4372 return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); 4373 } 4374 } 4375 return option.label; 4376 }, 4377 getOptionPriceAdjustmentBasePrice() { 4378 if (this.optionConfig.optionPrices[this.productIndexForPrice]) { 4379 return this.optionConfig.optionPrices[this.productIndexForPrice].finalPrice.amount 4380 } 4381 return this.optionConfig.prices.finalPrice.amount; // default price if no option selection 4382 }, 4383 clearOptionIfActive(optionId, value) { 4384 if (this.selectedValues[optionId] === value) { 4385 this.blurLabel() 4386 this.changeOption(optionId, '') 4387 } 4388 }, 4389 removeAttrFromSelection(selectedValues, attributeId) { 4390 attributeId = parseInt(attributeId); 4391 return selectedValues.reduce((newSelection, val, attr) => { 4392 if (attr !== attributeId) { 4393 newSelection[attr] = val; 4394 } 4395 return newSelection; 4396 }, []); 4397 }, 4398 changeOption(attributeId, value) { 4399 if (value === '') { 4400 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 4401 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 4402 this.selectedValues[attributeId] = value; 4403 } 4404 this.findSimpleIndex(); 4405 this.findAllowedAttributeOptions(); 4406 this.updatePrices(); 4407 this.updateGallery(); 4408 4409 const candidates = this.findProductIdsForPartialSelection(this.selectedValues); 4410 4411 window.dispatchEvent( 4412 new CustomEvent( 4413 'configurable-selection-changed', 4414 { 4415 detail: { 4416 productId: this.productId, 4417 optionId: attributeId, 4418 value: value, 4419 productIndex: this.productIndex, 4420 selectedValues: this.selectedValues, 4421 candidates: candidates, 4422 skuCandidates: Object.values(candidates).map(id =>
4422 this.optionConfig.sku?.[id] ?? null).filter(Boolean), 4423 } 4424 } 4425 ) 4426 ); 4427 }, 4428 calculateIsMinimalPrice() { 4429 return ! this.isFullSelection(this.selectedValues); 4430 }, 4431 isFullSelection(selectedValues) { 4432 return Object.keys(selectedValues).length === this.attributeCount; 4433 }, 4434 updatePrices() { 4435 const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices; 4436 window.dispatchEvent( 4437 new CustomEvent( 4438 "update-prices-" + this.productId, 4439 { 4440 detail: Object.assign( 4441 value, 4442 { isMinimalPrice: this.calculateIsMinimalPrice() } 4443 ) 4444 } 4445 ) 4446 ); 4447 }, 4448 updateGallery () { 4449 if (this.productIndex) { 4450 const images = this.optionConfig.images[this.productIndex]; 4451 images && window.dispatchEvent(new CustomEvent( 4452 "update-gallery", 4453 { detail: this.sortImagesByPosition(images) } 4454 )); 4455 } else { 4456 window.dispatchEvent(new Event("reset-gallery")); 4457 } 4458 }, 4459 sortImagesByPosition(images) { 4460 return images.sort((x, y) => { 4461 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 4462 }); 4463 }, 4464 onGetCartData(data) { 4465 }, 4466 preselectCartItems(data) { 4467 // pre-select options based on cart data for current (quote) itemId 4468 const cart = data && data.cart; 4469 if (cart && cart.items) { 4470 const cartItem = cart.items.find((item) => { 4471 return ( 4472 item.item_id === this.itemId 4473 && item.product_id === this.productId 4474 ) 4475 }); 4476 if (cartItem && cartItem.options && cartItem.options.length) { 4477 cartItem.options.map(option => { 4478 this.changeOption(option.option_id, option.option_value); 4479 }) 4480 } 4481 } 4482 }, 4483 preselectQuerystringItems() { 4484 // pre-select option like ?size=167 4485 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 4486 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 4487 }, 4488 preselectLocationHashItems() { 4489 // pre-select option like #144=167 4490 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 4491 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 4492 }, 4493 preselectItemsBasedOnLocation(getLocationValue) { 4494 Object.values(this.optionConfig.attributes).map(attribute => { 4495 const v = getLocationValue(attribute); 4496 v && this.changeOption(attribute.id, v) 4497 }); 4498 } 4499 } 4500 } 4501</script>
vendor: 1 bytes, line 4501
4501
4502<script> 4503 function initSwatchOptions(swatchConfig) { 4504 return { 4505 swatchConfig, 4506 getAttributeSwatchData(attributeId) { 4507 const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); 4508 swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); 4509 4510 return swatchConfig; 4511 }, 4512 mapSwatchTypeNumberToTypeCode(typeNumber) { 4513 switch ("" + typeNumber) { 4514 case "1": 4515 return "color" 4516 case "2": 4517 return "image" 4518 case "3": 4519 return "empty" 4520 case "0": 4521 default: 4522 return "text" 4523 } 4524 }, 4525 getTypeOfFirstOption(attributeId) { 4526 for (const optionId in this.swatchConfig[attributeId]) { 4527 const option = this.swatchConfig[attributeId][optionId]; 4528 if (typeof option.type !== 'undefined') { 4529 return this.mapSwatchTypeNumberToTypeCode(option.type); 4530 } 4531 } 4532 }, 4533 getVisualSwatchType(attributeId, targetOptionId) { 4534 // If a type configuration is present for the given option id, use it 4535 const config = this.swatchConfig[attributeId]; 4536 if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { 4537 return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); 4538 } 4539 4540 // Otherwise - if no config is present for the target option - use the type of the first option 4541 // with a type property from the attribute, thus assuming its the same type as the target option. 4542 // (This edge case condition can occur on single swatch products if some options are not salable) 4543 return this.getTypeOfFirstOption(attributeId); 4544 }, 4545 getSwatchType(attributeId, optionId) { 4546 // Deserialize the attribute details the first time they are used 4547 if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { 4548 this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); 4549 } 4550 const type = this.swatchConfig[attributeId] && 4551 this.swatchConfig[attributeId].details && 4552 this.swatchConfig[attributeId].details.swatch_input_type || 4553 "empty"; 4554 return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; 4555 }, 4556 isTextSwatch(attributeId, optionId) { 4557 return this.getSwatchType(attributeId, optionId) === 'text'; 4558 }, 4559 isVisualSwatch(attributeId, optionId) { 4560 const type = this.getSwatchType(attributeId, optionId); 4561 4562 return ['image', 'color'].includes(type); 4563 }, 4564 getSwatchBackgroundStyle(attributeId, optionId) { 4565 const config = this.getSwatchConfig(attributeId, optionId); 4566 const type = this.getSwatchType(attributeId, optionId); 4567 4568 if (type === "color") { 4569 return 'background-color:' + config.value; 4570 } else if (type === "image") { 4571 return "background: #fff url('" + config.value + "') no-repeat center"; 4572 } else { 4573 return ''; 4574 } 4575 }, 4576 getSwatchText(attributeId, optionId) { 4577 const config = this.getSwatchConfig(attributeId, optionId); 4578 return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); 4579 }, 4580 getOptionLabelFromOptionConfig(attributeId, optionId) { 4581 // Fallback if no value is present in swatchConfig data 4582 // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 4583 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); 4584 return option && option[0] && option[0].label ||''; 4585 }, 4586 getSwatchConfig(attributeId, optionId) { 4587 return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] 4588 ? this.swatchConfig[attributeId][optionId] 4589 : false;
4590 }, 4591 activeTooltipItem: false, 4592 tooltipPositionElement: false, 4593 isTooltipVisible() { 4594 return this.activeTooltipItem && 4595 this.getSwatchConfig( 4596 this.activeTooltipItem.attribute, 4597 this.activeTooltipItem.item 4598 ); 4599 }, 4600 isFirstItemCol() { 4601 return this.activeTooltipItem.index === 0; 4602 }, 4603 getTooltipImageStyle(attributeId, optionId) { 4604 const config = this.getSwatchConfig(attributeId, optionId); 4605 const type = this.getSwatchType(attributeId, optionId); 4606 4607 if (type === "color") { 4608 return 'background-color:' + config.value + '; width: 110px; height: 90px;'; 4609 } else if (type === "image") { 4610 return "background: #ffffff url('" + config.thumb + 4611 "') center center no-repeat; width: 110px; height: 90px;"; 4612 } else { 4613 return 'display:none'; 4614 } 4615 }, 4616 getTooltipPosition() { 4617 return this.tooltipPositionElement ? 4618 `top: ${this.tooltipPositionElement.offsetTop}px;` + 4619 `left: ${ 4620 this.tooltipPositionElement.offsetLeft - ( 4621 this.tooltipPositionElement.closest('.snap') && 4622 this.tooltipPositionElement.closest('.snap').scrollLeft || 4623 0 4624 ) 4625 }px;` : '' 4626 }, 4627 getTooltipLabel() { 4628 return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label 4629 }, 4630 focusedLabel: false, 4631 focusLabel(optionId) { 4632 this.focusedLabel = optionId; 4633 }, 4634 blurLabel() { 4635 this.focusedLabel = false; 4636 } 4637 } 4638 } 4639</script>
vendor: 1 bytes, line 4639
4639
4640<script> 4641 'use strict'; 4642 4643 const grecaptchaV2LoadCallbacks = []; 4644 4645 function executeRecaptchaLoadCallbacks () { 4646 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 4647 const callback = grecaptchaV2LoadCallbacks.pop(); 4648 typeof callback === 'string' ? window[callback]() : callback(); 4649 } 4650 } 4651 4652 (function() { 4653 const loadRecaptchaScript = (event) => { 4654 4655 if (window.grecaptcha || !event.target.form) { 4656 return; 4657 } 4658 4659 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 4660 const siteKey = '6Lc2fKorAAAAAO1Cz9tTTA2cFil17h3d5Na5sbZf'; 4661 const script = document.createElement('script'); 4662 script.type = 'text/javascript'; 4663 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 4664 script.async = true; 4665 document.head.appendChild(script); 4666 4667 script.addEventListener('load', () => { 4668 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 4669 }); 4670 } 4671 4672 window.forceLoadRecaptchaScript = (form) => { 4673 loadRecaptchaScript({target: {form: form || 'dummy'}}); 4674 executeRecaptchaLoadCallbacks(); 4675 }; 4676 4677 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 4678 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 4679 4680 }()); 4681 4682</script>
4682 4683
4684<script> 4685 (function () { 4686 const modals = []; 4687 const excludedFromFocusTrapping = new Set(); 4688 4689 function trapFocusInNextModalWithOverlay() { 4690 for (let idx = modals.length -1; idx >= 0; idx--) { 4691 const nextOnStack = modals[idx]; 4692 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 4693 if (! isOverlayDisabled(nextDialogElement)) { 4694 hyva.trapFocus(nextDialogElement); 4695 break; 4696 } 4697 } 4698 } 4699 4700 function focusables(dialogElement) { 4701 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 4702 return Array.from(dialogElement.querySelectorAll(selector)) 4703 .filter(el => !el.hasAttribute('disabled')); 4704 } 4705 4706 function firstVisible(elements) { 4707 const a = Array.from(elements); 4708 for (let i = 0; i < a.length; i++) { 4709 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 4710 } 4711 return null; 4712 } 4713 4714 function isInViewport(element) { 4715 const rect = element && element.getBoundingClientRect(); 4716 return rect && 4717 rect.top >= 0 && 4718 rect.left >= 0 && 4719 rect.right <= window.innerWidth && 4720 rect.bottom <= window.innerHeight; 4721 } 4722 4723 function setFocusAfterTransition(dialogElement, duration) { 4724 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 4725 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 4726 next: for (let candidate of candidates) { 4727 for (let child of nested) { 4728 if (child.contains(candidate)) continue next; 4729 } 4730 setTimeout(() => candidate.focus(), 50); 4731 break; 4732 } 4733 window.setTimeout(() => { 4734 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 4735 focusables(dialogElement)[0] || 4736 null; 4737 focusElement && isInViewport(focusElement) && focusElement.focus(); 4738 }, Math.max(1, duration)); 4739 } 4740 4741 function determineTrigger($refs, dialog, trigger) { 4742 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 4743 return dialog.target; 4744 } 4745 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 4746 return trigger.target; 4747 } 4748 if (typeof trigger === 'string') { 4749 try { 4750 return $refs[trigger] || document.querySelector(trigger) 4751 } catch (e) {} 4752 } 4753 if (trigger instanceof Element) { 4754 return trigger; 4755 } 4756 4757 return null; 4758 } 4759 4760 function isOverlayDisabled(dialog) { 4761 return dialog && dialog.hasAttribute('x-no-overlay') 4762 } 4763 4764 function areRemainingModalsWithoutOverlay(modals) 4765 { 4766 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 4767 4768 return overflowDisabled.length === modals.length; 4769 } 4770 4771 window.hyva.modal = function(options = {}) { 4772 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 4773 try { 4774 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 4775 } catch (e) { 4776 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 4777 } 4778 } 4779 4780 const config = Object.assign({ 4781 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 4782 transitionEnterStart: 'opacity-0', 4783 transitionEnterEnd: 'opacity-100', 4784 transitionLeave: 'transition ease-in duration-300', 4785 transitionLeaveStart: 'opacity-100', 4786 transitionLeaveEnd: 'opacity-0', 4787 }, options); 4788 let lastHide = 0; 4789 4790 return { 4791 opened: {}, 4792 show(dialog, trigger) { 4793 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 4794 const name = typeof dialog === 'string' ? dialog : config.dialog; 4795 const dialogElement = this.$refs[name]; 4796 if (! dialogElement) { 4797 return; 4798 } 4799 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 4800 4801 dialogElement.scrollTop = 0; 4802 4803 if (this.opened[name]) { 4804 return; 4805 } 4806 4807 if (focusTargetAfterHide) { 4808 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 4809 } 4810 4811 this.opened[name] = true; 4812 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 4813 setFocusAfterTransition(dialogElement, config.duration); 4814 4815 const frame = {name, instance: this, focusTarget: focu
4815sTargetAfterHide, time: Date.now()}; 4816 4817 modals.push(frame); 4818 if (useOverlay) { 4819 document.body.classList.add('overflow-hidden'); 4820 } 4821 return new Promise(resolve => frame.resolve = resolve); 4822 }, 4823 cancel() { 4824 this.hide(false); 4825 }, 4826 ok() { 4827 this.hide(true); 4828 }, 4829 hide(value) { 4830 if (Date.now() - lastHide < config.duration) { 4831 return; 4832 } 4833 lastHide = Date.now(); 4834 4835 const modal = modals.pop() || {}; 4836 if (! modal.instance) { 4837 return; 4838 } 4839 4840 const name = modal.name; 4841 this.opened[name] = false; 4842 hyva.releaseFocus(modal.instance.$refs[modal.name]) 4843 trapFocusInNextModalWithOverlay(); 4844 4845 const nextFocusAfterHide = modal.focusTarget; 4846 nextFocusAfterHide && setTimeout(() => { 4847 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 4848 nextFocusAfterHide.focus() 4849 }, config.duration); 4850 4851 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 4852 document.body.classList.remove('overflow-hidden'); 4853 } 4854 4855 modal.resolve(value); 4856 }, 4857 overlay(dialog) { 4858 dialog = this.$el.dataset.dialogRefName || dialog; 4859 const name = typeof dialog === 'string' ? dialog : config.dialog; 4860 return { 4861 ['x-show']() { 4862 return this.opened[name] 4863 }, 4864 ['x-transition:enter']: config.transitionEnter, 4865 ['x-transition:enter-start']: config.transitionEnterStart, 4866 ['x-transition:enter-end']: config.transitionEnterEnd, 4867 ['x-transition:leave']: config.transitionLeave, 4868 ['x-transition:leave-start']: config.transitionLeaveStart, 4869 ['x-transition:leave-end']: config.transitionLeaveEnd, 4870 ['@hyva-modal-show.window'](event) { 4871 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 4872 } 4873 }; 4874 }, 4875 showDialogOnInit() { 4876 const parent = this.$el.closest('[data-dialog-ref-name]'); 4877 if (parent && parent.dataset.dialogRefName) { 4878 this.$dispatch('hyva-modal-show', {dialog: parent.dataset.dialogRefName}) 4879 } 4880 } 4881 }; 4882 } 4883 4884 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 4885 4886 window.hyva.modal.pop = function () { 4887 if (modals.length > 0) { 4888 const modal = modals[modals.length -1]; 4889 modal.instance.hide(); 4890 } 4891 } 4892 4893 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 4894 typeof selectors === 'string' || selectors instanceof String 4895 ? excludedFromFocusTrapping.add(selectors) 4896 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 4897 } 4898 4899 window.hyva.modal.eventListeners = { 4900 keydown: event => { 4901 if (event.key === 'Escape') { 4902 window.hyva.modal.pop(); 4903 } 4904 }, 4905 click: event => { 4906 if (modals.length > 0) { 4907 const modal = modals[modals.length -1]; 4908 const dialog = modal.instance.$refs[modal.name]; 4909 if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago 4910 ! isOverlayDisabled(dialog) && // if dialog has overlay 4911 ! dialog.contains(event.target)) { // if click is outside of dialog 4912 modal.instance.hide(); 4913 } 4914 } 4915 } 4916 }; 4917 4918 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 4919 4920 document.addEventListener('click', window.hyva.modal.eventListeners.click); 4921 })(); 4922 window.addEventListener('alpine:init', () => { 4923 Alpine.data('hyvaModal', window.hyva.modal); 4924 }, {once: true}); 4925</script>
vendor: 1 bytes, line 4925
4925
4926<script type="text/json" id="default-section-data"> 4927 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorre"},"AE":{"name":"\u00c9mirats arabes unis"},"AF":{"name":"Afghanistan"},"AG":{"name":"Antigua-et-Barbuda"},"AI":{"name":"Anguilla"},"AL":{"name":"Albanie","regions":{"512":{"code":"AL-01","name":"Berat"},"513":{"code":"AL-09","name":"Dib\u00ebr"},"514":{"code":"AL-02","name":"Durr\u00ebs"},"515":{"code":"AL-03","name":"Elbasan"},"516":{"code":"AL-04","name":"Fier"},"517":{"code":"AL-05","name":"Gjirokast\u00ebr"},"518":{"code":"AL-06","name":"Kor\u00e7\u00eb"},"519":{"code":"AL-07","name":"Kuk\u00ebs"},"520":{"code":"AL-08","name":"Lezh\u00eb"},"521":{"code":"AL-10","name":"Shkod\u00ebr"},"522":{"code":"AL-11","name":"Tiran\u00eb"},"523":{"code":"AL-12","name":"Vlor\u00eb"}}},"AM":{"name":"Arm\u00e9nie"},"AN":{"name":null},"AO":{"name":"Angola"},"AQ":{"name":"Antarctique"},"AR":{"name":"Argentine","regions":{"525":{"code":"AR-B","name":"Buenos Aires"},"526":{"code":"AR-K","name":"Catamarca"},"527":{"code":"AR-H","name":"Chaco"},"528":{"code":"AR-U","name":"Chubut"},"524":{"code":"AR-C","name":"Ciudad Aut\u00f3noma de Buenos Aires"},"529":{"code":"AR-X","name":"C\u00f3rdoba"},"530":{"code":"AR-W","name":"Corrientes"},"531":{"code":"AR-E","name":"Entre R\u00edos"},"532":{"code":"AR-P","name":"Formosa"},"533":{"code":"AR-Y","name":"Jujuy"},"534":{"code":"AR-L","name":"La Pampa"},"535":{"code":"AR-F","name":"La Rioja"},"536":{"code":"AR-M","name":"Mendoza"},"537":{"code":"AR-N","name":"Misiones"},"538":{"code":"AR-Q","name":"Neuqu\u00e9n"},"539":{"code":"AR-R","name":"R\u00edo Negro"},"540":{"code":"AR-A","name":"Salta"},"541":{"code":"AR-J","name":"San Juan"},"542":{"code":"AR-D","name":"San Luis"},"543":{"code":"AR-Z","name":"Santa Cruz"},"544":{"code":"AR-S","name":"Santa Fe"},"545":{"code":"AR-G","name":"Santiago del Estero"},"546":{"code":"AR-V","name":"Tierra del Fuego"},"547":{"code":"AR-T","name":"Tucum\u00e1n"}}},"AS":{"name":"Samoa am\u00e9ricaines"},"AT":{"name":"Autriche","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"AU":{"name":"Australie","regions":{"605":{"code":"ACT","name":"Australian Capital Territory"},"606":{"code":"NSW","name":"New South Wales"},"612":{"code":"NT","name":"Northern Territory"},"608":{"code":"QLD","name":"Queensland"},"609":{"code":"SA","name":"South Australia"},"610":{"code":"TAS","name":"Tasmania"},"607":{"code":"VIC","name":"Victoria"},"611":{"code":"WA","name":"Western Australia"}}},"AW":{"name":"Aruba"},"AX":{"name":"\u00celes \u00c5land"},"AZ":{"name":"Azerba\u00efdjan"},"BA":{"name":"Bosnie-Herz\u00e9govine"},"BB":{"name":"Barbade"},"BD":{"name":"Bangladesh"}
4927,"BE":{"name":"Belgique","regions":{"620":{"code":"VAN","name":"Antwerpen"},"621":{"code":"WBR","name":"Brabant wallon"},"622":{"code":"BRU","name":"Brussels-Capital Region"},"623":{"code":"WHT","name":"Hainaut"},"625":{"code":"WLG","name":"Li\u00e8ge"},"624":{"code":"VLI","name":"Limburg"},"626":{"code":"WLX","name":"Luxembourg"},"627":{"code":"WNA","name":"Namur"},"628":{"code":"VOV","name":"Oost-Vlaanderen"},"629":{"code":"VBR","name":"Vlaams-Brabant"},"630":{"code":"VWV","name":"West-Vlaanderen"}}},"BF":{"name":"Burkina Faso"},"BG":{"name":"Bulgarie","regions":{"640":{"code":"BG-01","name":"Blagoevgrad"},"641":{"code":"BG-02","name":"Burgas"},"647":{"code":"BG-08","name":"Dobrich"},"646":{"code":"BG-07","name":"Gabrovo"},"665":{"code":"BG-26","name":"Haskovo"},"648":{"code":"BG-09","name":"Kardzhali"},"649":{"code":"BG-10","name":"Kyustendil"},"650":{"code":"BG-11","name":"Lovech"},"651":{"code":"BG-12","name":"Montana"},"652":{"code":"BG-13","name":"Pazardzhik"},"653":{"code":"BG-14","name":"Pernik"},"654":{"code":"BG-15","name":"Pleven"},"655":{"code":"BG-16","name":"Plovdiv"},"656":{"code":"BG-17","name":"Razgrad"},"657":{"code":"BG-18","name":"Ruse"},"666":{"code":"BG-27","name":"Shumen"},"658":{"code":"BG-19","name":"Silistra"},"659":{"code":"BG-20","name":"Sliven"},"660":{"code":"BG-21","name":"Smolyan"},"661":{"code":"BG-22","name":"Sofia City"},"662":{"code":"BG-23","name":"Sofia Province"},"663":{"code":"BG-24","name":"Stara Zagora"},"664":{"code":"BG-25","name":"Targovishte"},"642":{"code":"BG-03","name":"Varna"},"643":{"code":"BG-04","name":"Veliko Tarnovo"},"644":{"code":"BG-05","name":"Vidin"},"645":{"code":"BG-06","name":"Vratsa"},"667":{"code":"BG-28","name":"Yambol"}}},"BH":{"name":"Bahre\u00efn"},"BI":{"name":"Burundi"},"BJ":{"name":"B\u00e9nin"},"BL":{"name":"Saint-Barth\u00e9lemy"},"BM":{"name":"Bermudes"},"BN":{"name":"Brunei"},"BO":{"name":"Bolivie","regions":{"632":{"code":"BO-H","name":"Chuquisaca"},"631":{"code":"BO-C","name":"Cochabamba"},"633":{"code":"BO-B","name":"El Beni"},"634":{"code":"BO-L","name":"La Paz"},"635":{"code":"BO-O","name":"Oruro"},"636":{"code":"BO-N","name":"Pando"},"637":{"code":"BO-P","name":"Potos\u00ed"},"638":{"code":"BO-S","name":"Santa Cruz"},"639":{"code":"BO-T","name":"Tarija"}}},"BQ":{"name":"Pays-Bas carib\u00e9ens"},"BR":{"name":"Br\u00e9sil","regions":{"485":{"code":"AC","name":"Acre"},"486":{"code":"AL","name":"Alagoas"},"487":{"code":"AP","name":"Amap\u00e1"},"488":{"code":"AM","name":"Amazonas"},"489":{"code":"BA","name":"Bahia"},"490":{"code":"CE","name":"Cear\u00e1"},"511":{"code":"DF","name":"Distrito Federal"},"491":{"code":"ES","name":"Esp\u00edrito Santo"},"492":{"code":"GO","name":"Goi\u00e1s"},"493":{"code":"MA","name":"Maranh\u00e3o"},"494":{"code":"MT","name":"Mato Grosso"},"495":{"code":"MS","name":"Mato Grosso do Sul"},"496":{"code":"MG","name":"Minas Gerais"},"497":{"code":"PA","name":"Par\u00e1"},"498":{"code":"PB","name":"Para\u00edba"},"499":{"code":"PR","name":"Paran\u00e1"},"500":{"code":"PE","name":"Pernambuco"},"501":{"code":"PI","name":"Piau\u00ed"},"502":{"code":"RJ","name":"Rio de Janeiro"},"503":{"code":"RN","name":"Rio Grande do Norte"},"504":{"code":"RS","name":"Rio Grande do Sul"},"505":{"code":"RO","name":"Rond\u00f4nia"},"506":{"code":"RR","name":"Roraima"},"507":{"code":"SC","name":"Santa Catarina"},"508":{"code":"SP","name":"S\u00e3o Paulo"},"509":{"code":"SE","name":"Sergipe"},"510":{"code":"TO","name":"Tocantins"}}},"BS":{"name":"Bahamas"},"BT":{"name":"Bhoutan"},"BV":{"name":"\u00cele Bouvet"},"BW":{"name":"Botswana"},"BY":{"name":"Bi\u00e9lorussie","regions":{"613":{"code":"BY-BR","name":"Bresckaja voblas\u0107"},"614":{"code":"BY-HO","name":"Homie\u013askaja voblas\u0107"},"615":{"code":"BY-HM","name":"Horad Minsk"},"616":{"code":"BY-HR","name":"Hrodzienskaja voblas\u0107"},"617":{"code":"BY-MA","name":"Mahilio\u016dskaja voblas\u0107"},"618":{"code":"BY-MI","name":"Minskaja voblas\u0107"},"619":{"code":"BY-VI","name":"Viciebskaja voblas\u0107"}}},"BZ":{"name":"Belize"},"CA":{"name":"Canada","regions":{"66":{"code":"AB","name":"Alberta"},"67":{"code":"BC","name":"British Columbia"},"68":{"code":"MB","name":"Manitoba"},"70":{"code":"NB","name":"New Brunswick"},"69":{"code":"NL","name":"Newfoundland and Labrador"},"72":{"code":"NT","name":"Northwest Territories"},"71":{"code":"NS","name":"Nova Scotia"},"73":{"code":"NU","name":"Nunavut"},"74":{"code":"ON","name":"Ontario"},"75":{"code":"PE","name":"Prince Edward Island"},"76":{"code":"QC","name":"Quebec"},"77":{"code":"SK","name":"Saskatchewan"},"78":{"code":"YT","name":"Yukon Territory"}}},"CC":{"name":"\u00celes Cocos"},"CD":{"name":"Congo-Kinshasa"},"CF":{"name":"R\u00e9publique centrafricaine"}
4927,"CG":{"name":"Congo-Brazzaville"},"CH":{"name":"Suisse","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CI":{"name":"C\u00f4te d\u2019Ivoire"},"CK":{"name":"\u00celes Cook"},"CL":{"name":"Chili","regions":{"668":{"code":"CL-AI","name":"Ais\u00e9n del General Carlos Iba\u00f1ez del Campo"},"669":{"code":"CL-AN","name":"Antofagasta"},"670":{"code":"CL-AP","name":"Arica y Parinacota"},"672":{"code":"CL-AT","name":"Atacama"},"673":{"code":"CL-BI","name":"Biob\u00edo"},"674":{"code":"CL-CO","name":"Coquimbo"},"671":{"code":"CL-AR","name":"La Araucan\u00eda"},"675":{"code":"CL-LI","name":"Libertador General Bernardo O'Higgins"},"676":{"code":"CL-LL","name":"Los Lagos"},"677":{"code":"CL-LR","name":"Los R\u00edos"},"678":{"code":"CL-MA","name":"Magallanes"},"679":{"code":"CL-ML","name":"Maule"},"680":{"code":"CL-NB","name":"\u00d1uble"},"681":{"code":"CL-RM","name":"Regi\u00f3n Metropolitana de Santiago"},"682":{"code":"CL-TA","name":"Tarapac\u00e1"},"683":{"code":"CL-VS","name":"Valpara\u00edso"}}},"CM":{"name":"Cameroun"},"CN":{"name":"Chine","regions":{"684":{"code":"CN-AH","name":"Anhui Sheng"},"685":{"code":"CN-BJ","name":"Beijing Shi"},"686":{"code":"CN-CQ","name":"Chongqing Shi"},"687":{"code":"CN-FJ","name":"Fujian Sheng"},"688":{"code":"CN-GS","name":"Gansu Sheng"},"689":{"code":"CN-GD","name":"Guangdong Sheng"},"690":{"code":"CN-GX","name":"Guangxi Zhuangzu Zizhiqu"},"691":{"code":"CN-GZ","name":"Guizhou Sheng"},"692":{"code":"CN-HI","name":"Hainan Sheng"},"693":{"code":"CN-HE","name":"Hebei Sheng"},"694":{"code":"CN-HL","name":"Heilongjiang Sheng"},"695":{"code":"CN-HA","name":"Henan Sheng"},"696":{"code":"CN-HK","name":"Hong Kong SAR"},"697":{"code":"CN-HB","name":"Hubei Sheng"},"698":{"code":"CN-HN","name":"Hunan Sheng"},"699":{"code":"CN-JS","name":"Jiangsu Sheng"},"700":{"code":"CN-JX","name":"Jiangxi Sheng"},"701":{"code":"CN-JL","name":"Jilin Sheng"},"702":{"code":"CN-LN","name":"Liaoning Sheng"},"703":{"code":"CN-MO","name":"Macao SAR"},"704":{"code":"CN-NM","name":"Nei Mongol Zizhiqu"},"705":{"code":"CN-NX","name":"Ningxia Huizi Zizhiqu"},"706":{"code":"CN-QH","name":"Qinghai Sheng"},"707":{"code":"CN-SN","name":"Shaanxi Sheng"},"708":{"code":"CN-SD","name":"Shandong Sheng"},"709":{"code":"CN-SH","name":"Shanghai Shi"},"710":{"code":"CN-SX","name":"Shanxi Sheng"},"711":{"code":"CN-SC","name":"Sichuan Sheng"},"712":{"code":"CN-TW","name":"Taiwan Sheng"},"713":{"code":"CN-TJ","name":"Tianjin Shi"},"714":{"code":"CN-XJ","name":"Xinjiang Uygur Zizhiqu"},"715":{"code":"CN-XZ","name":"Xizang Zizhiqu"},"716":{"code":"CN-YN","name":"Yunnan Sheng"},"717":{"code":"CN-ZJ","name":"Zhejiang Sheng"}}},"CO":{"name":"Colombie","regions":{"718":{"code":"CO-AMA","name":"Amazonas"},"719":{"code":"CO-ANT","name":"Antioquia"},"720":{"code":"CO-ARA","name":"Arauca"},"721":{"code":"CO-ATL","name":"Atl\u00e1ntico"},"722":{"code":"CO-BOL","name":"Bol\u00edvar"},"723":{"code":"CO-BOY","name":"Boyac\u00e1"},"724":{"code":"CO-CAL","name":"Caldas"},"725":{"code":"CO-CAQ","name":"Caquet\u00e1"},"726":{"code":"CO-CAS","name":"Casanare"},"727":{"code":"CO-CAU","name":"Cauca"},"728":{"code":"CO-CES","name":"Cesar"},"729":{"code":"CO-CHO","name":"Choc\u00f3"},"730":{"code":"CO-COR","name":"C\u00f3rdoba"},"731":{"code":"CO-CUN","name":"Cundinamarca"},"732":{"code":"CO-GUA","name":"Guain\u00eda"},"733":{"code":"CO-GUV","name":"Guaviare"},"734":{"code":"CO-HUL","name":"Huila"},"735":{"code":"CO-LAG","name":"La Guajira"},"736":{"code":"CO-MAG","name":"Magdalena"},"737":{"code":"CO-MET","name":"Meta"}
4927,"738":{"code":"CO-NAR","name":"Nari\u00f1o"},"739":{"code":"CO-NSA","name":"Norte de Santander"},"740":{"code":"CO-PUT","name":"Putumayo"},"741":{"code":"CO-QUI","name":"Quind\u00edo"},"742":{"code":"CO-RIS","name":"Risaralda"},"743":{"code":"CO-SAP","name":"San Andr\u00e9s y Providencia"},"744":{"code":"CO-SAN","name":"Santander"},"745":{"code":"CO-SUC","name":"Sucre"},"746":{"code":"CO-TOL","name":"Tolima"},"747":{"code":"CO-VAC","name":"Valle del Cauca"},"748":{"code":"CO-VAU","name":"Vaup\u00e9s"},"749":{"code":"CO-VID","name":"Vichada"}}},"CR":{"name":"Costa Rica","regions":{"751":{"code":"CR-AL","name":"Alajuela"},"752":{"code":"CR-CA","name":"Cartago"},"754":{"code":"CR-GU","name":"Guanacaste"},"753":{"code":"CR-HE","name":"Heredia"},"756":{"code":"CR-LI","name":"Lim\u00f3n"},"755":{"code":"CR-PU","name":"Puntarenas"},"750":{"code":"CR-SJ","name":"San Jos\u00e9"}}},"CU":{"name":"Cuba"},"CV":{"name":"Cap-Vert"},"CW":{"name":"Cura\u00e7ao"},"CX":{"name":"\u00cele Christmas"},"CY":{"name":"Chypre"},"CZ":{"name":"Tch\u00e9quie","regions":{"759":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"767":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"761":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"766":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"764":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"763":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"770":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"768":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"765":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"760":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"757":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"758":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"762":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"769":{"code":"CZ-72","name":"Zl\u00ednsk\u00fd kraj"}}},"DE":{"name":"Allemagne","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DJ":{"name":"Djibouti"},"DK":{"name":"Danemark","regions":{"771":{"code":"DK-84","name":"Hovedstaden"},"772":{"code":"DK-82","name":"Midtjylland"},"773":{"code":"DK-81","name":"Nordjylland"},"774":{"code":"DK-85","name":"Sj\u00e6lland"},"775":{"code":"DK-83","name":"Syddanmark"}}},"DM":{"name":"Dominique"},"DO":{"name":"R\u00e9publique dominicaine"},"DZ":{"name":"Alg\u00e9rie"},"EC":{"name":"\u00c9quateur","regions":{"776":{"code":"EC-A","name":"Azuay"},"777":{"code":"EC-B","name":"Bol\u00edvar"},"778":{"code":"EC-F","name":"Ca\u00f1ar"},"779":{"code":"EC-C","name":"Carchi"},"780":{"code":"EC-H","name":"Chimborazo"},"781":{"code":"EC-X","name":"Cotopaxi"},"782":{"code":"EC-O","name":"El Oro"},"783":{"code":"EC-E","name":"Esmeraldas"},"784":{"code":"EC-W","name":"Gal\u00e1pagos"},"785":{"code":"EC-G","name":"Guayas"},"786":{"code":"EC-I","name":"Imbabura"},"787":{"code":"EC-L","name":"Loja"},"788":{"code":"EC-R","name":"Los R\u00edos"},"789":{"code":"EC-M","name":"Manab\u00ed"},"790":{"code":"EC-S","name":"Morona Santiago"},"791":{"code":"EC-N","name":"Napo"},"792":{"code":"EC-D","name":"Orellana"},"793":{"code":"EC-Y","name":"Pastaza"},"794":{"code":"EC-P","name":"Pichincha"},"795":{"code":"EC-SE","name":"Santa Elena"},"796":{"code":"EC-SD","name":"Santo Domingo de los Ts\u00e1chilas"},"797":{"code":"EC-U","name":"Sucumb\u00edos"},"798":{"code":"EC-T","name":"Tungurahua"},"799":{"code":"EC-Z","name":"Zamora Chinchipe"}}},"EE":{"name":"Estonie","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"}
4927,"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"EG":{"name":"\u00c9gypte"},"EH":{"name":"Sahara occidental"},"ER":{"name":"\u00c9rythr\u00e9e"},"ES":{"name":"Espagne","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"ET":{"name":"\u00c9thiopie"},"FI":{"name":"Finlande","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FJ":{"name":"Fidji"},"FK":{"name":"\u00celes Malouines"},"FM":{"name":"Micron\u00e9sie"},"FO":{"name":"\u00celes F\u00e9ro\u00e9"},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"}
4927,"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"}}},"GA":{"name":"Gabon"},"GB":{"name":"Royaume-Uni"},"GD":{"name":"Grenade"},"GE":{"name":"G\u00e9orgie"},"GF":{"name":"Guyane fran\u00e7aise"},"GG":{"name":"Guernesey"},"GH":{"name":"Ghana"},"GI":{"name":"Gibraltar"},"GL":{"name":"Groenland"},"GM":{"name":"Gambie"},"GN":{"name":"Guin\u00e9e"},"GP":{"name":"Guadeloupe"},"GQ":{"name":"Guin\u00e9e \u00e9quatoriale"},"GR":{"name":"Gr\u00e8ce","regions":{"813":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"800":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"801":{"code":"GR-I","name":"Attik\u00ed"},"802":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"803":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"804":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"805":{"code":"GR-D","name":"\u00cdpeiros"},"806":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"807":{"code":"GR-M","name":"Kr\u00edti"},"808":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"809":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"810":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"}
4927,"811":{"code":"GR-E","name":"Thessal\u00eda"},"812":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"GS":{"name":"G\u00e9orgie du Sud-et-les \u00celes Sandwich du Sud"},"GT":{"name":"Guatemala"},"GU":{"name":"Guam"},"GW":{"name":"Guin\u00e9e-Bissau"},"GY":{"name":"Guyana","regions":{"814":{"code":"GY-BA","name":"Barima-Waini"},"815":{"code":"GY-CU","name":"Cuyuni-Mazaruni"},"816":{"code":"GY-DE","name":"Demerara-Mahaica"},"817":{"code":"GY-EB","name":"East Berbice-Corentyne"},"818":{"code":"GY-ES","name":"Essequibo Islands-West Demerara"},"819":{"code":"GY-MA","name":"Mahaica-Berbice"},"820":{"code":"GY-PM","name":"Pomeroon-Supenaam"},"821":{"code":"GY-PT","name":"Potaro-Siparuni"},"822":{"code":"GY-UD","name":"Upper Demerara-Berbice"},"823":{"code":"GY-UT","name":"Upper Takutu-Upper Essequibo"}}},"HK":{"name":"R.A.S. chinoise de Hong Kong"},"HM":{"name":"\u00celes Heard-et-MacDonald"},"HN":{"name":"Honduras"},"HR":{"name":"Croatie","regions":{"554":{"code":"HR-07","name":"Bjelovarsko-bilogorska \u017eupanija"},"559":{"code":"HR-12","name":"Brodsko-posavska \u017eupanija"},"566":{"code":"HR-19","name":"Dubrova\u010dko-neretvanska \u017eupanija"},"568":{"code":"HR-21","name":"Grad Zagreb"},"565":{"code":"HR-18","name":"Istarska \u017eupanija"},"551":{"code":"HR-04","name":"Karlova\u010dka \u017eupanija"},"553":{"code":"HR-06","name":"Koprivni\u010dko-kri\u017eeva\u010dka \u017eupanija"},"549":{"code":"HR-02","name":"Krapinsko-zagorska \u017eupanija"},"556":{"code":"HR-09","name":"Li\u010dko-senjska \u017eupanija"},"567":{"code":"HR-20","name":"Me\u0111imurska \u017eupanija"},"561":{"code":"HR-14","name":"Osje\u010dko-baranjska \u017eupanija"},"558":{"code":"HR-11","name":"Po\u017ee\u0161ko-slavonska \u017eupanija"},"555":{"code":"HR-08","name":"Primorsko-goranska \u017eupanija"},"562":{"code":"HR-15","name":"\u0160ibensko-kninska \u017eupanija"},"550":{"code":"HR-03","name":"Sisa\u010dko-moslava\u010dka \u017eupanija"},"564":{"code":"HR-17","name":"Splitsko-dalmatinska \u017eupanija"},"552":{"code":"HR-05","name":"Vara\u017edinska \u017eupanija"},"557":{"code":"HR-10","name":"Viroviti\u010dko-podravska \u017eupanija"},"563":{"code":"HR-16","name":"Vukovarsko-srijemska \u017eupanija"},"560":{"code":"HR-13","name":"Zadarska \u017eupanija"},"548":{"code":"HR-01","name":"Zagreba\u010dka \u017eupanija"}}},"HT":{"name":"Ha\u00efti"},"HU":{"name":"Hongrie"},"ID":{"name":"Indon\u00e9sie"},"IE":{"name":"Irlande"},"IL":{"name":"Isra\u00ebl"},"IM":{"name":"\u00cele de Man"},"IN":{"name":"Inde","regions":{"569":{"code":"AN","name":"Andaman and Nicobar Islands"},"570":{"code":"AP","name":"Andhra Pradesh"},"571":{"code":"AR","name":"Arunachal Pradesh"},"572":{"code":"AS","name":"Assam"},"573":{"code":"BR","name":"Bihar"},"574":{"code":"CH","name":"Chandigarh"},"575":{"code":"CT","name":"Chhattisgarh"},"576":{"code":"DN","name":"Dadra and Nagar Haveli"},"577":{"code":"DD","name":"Daman and Diu"},"578":{"code":"DL","name":"Delhi"},"579":{"code":"GA","name":"Goa"},"580":{"code":"GJ","name":"Gujarat"},"581":{"code":"HR","name":"Haryana"},"582":{"code":"HP","name":"Himachal Pradesh"},"583":{"code":"JK","name":"Jammu and Kashmir"},"584":{"code":"JH","name":"Jharkhand"},"585":{"code":"KA","name":"Karnataka"},"586":{"code":"KL","name":"Kerala"},"1156":{"code":"LA","name":"Ladakh"},"587":{"code":"LD","name":"Lakshadweep"},"588":{"code":"MP","name":"Madhya Pradesh"},"589":{"code":"MH","name":"Maharashtra"},"590":{"code":"MN","name":"Manipur"},"591":{"code":"ML","name":"Meghalaya"},"592":{"code":"MZ","name":"Mizoram"},"593":{"code":"NL","name":"Nagaland"},"594":{"code":"OR","name":"Odisha"},"595":{"code":"PY","name":"Puducherry"},"596":{"code":"PB","name":"Punjab"},"597":{"code":"RJ","name":"Rajasthan"},"598":{"code":"SK","name":"Sikkim"},"599":{"code":"TN","name":"Tamil Nadu"},"600":{"code":"TG","name":"Telangana"},"601":{"code":"TR","name":"Tripura"},"602":{"code":"UP","name":"Uttar Pradesh"},"603":{"code":"UT","name":"Uttarakhand"},"604":{"code":"WB","name":"West Bengal"}}},"IO":{"name":"Territoire britannique de l\u2019oc\u00e9an Indien"},"IQ":{"name":"Irak"},"IR":{"name":"Iran"},"IS":{"name":"Islande","regions":{"830":{"code":"IS-07","name":"Austurland"},"824":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"829":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"828":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"831":{"code":"IS-08","name":"Su\u00f0urland"},"825":{"code":"IS-02","name":"Su\u00f0urnes"},"827":{"code":"IS-04","name":"Vestfir\u00f0ir"},"826":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italie","regions":{"832":{"code":"AG","name":"Agrigento"},"833":{"code":"AL","name":"Alessandria"},"834":{"code":"AN","name":"Ancona"},"835":{"code":"AO","name":"Aosta"},"837":{"code":"AR","name":"Arezzo"},"838":{"code":"AP","name":"Ascoli-Piceno"},"839":{"code":"AT","name":"Asti"},"840":{"code":"AV","name":"Avellino"},"841":{"code":"BA","name":"Bari"},"842":{"code":"BT","name":"Barletta-Andria-Trani"},"843":{"code":"BL","name":"Belluno"},"844":{"code":"BN","name":"Benevento"},"845":{"code":"BG","name":"Bergamo"},"846":{"code":"BI","name":"Biella"},"847":{"code":"BO","name":"Bologna"},"848":{"code":"BZ","name":"Bolzano"},"849":{"code":"BS","name":"Brescia"},"850":{"code":"BR","name":"Brindisi"},"851":{"code":"CA","name":"Cagliari"},"852":{"code":"CL","name":"Caltanissetta"},"853":{"code":"CB","name":"Campobasso"},"854":{"code":"CI","name":"Carbonia Iglesias"},"855":{"code":"CE","name":"Caserta"},"856":{"code":"CT","name":"Catania"},"857":{"code":"CZ","name":"Catanzaro"},"858":{"code":"CH","name":"Chieti"},"859":{"code":"CO","name":"Como"},"860":{"code":"CS","name":"Cosenza"},"861":{"code":"CR","name":"Cremona"},"862":{"code":"KR","name":"Crotone"},"863":{"code":"CN","name":"Cuneo"},"864":{"code":"EN","name":"Enna"},"865":{"code":"FM","name":"Fermo"},"866":{"code":"FE","name":"Ferrara"},"867":{"code":"FI","name":"Firenze"},"868":{"code":"FG","name":"Foggia"},"869":{"code":"FC","name":"Forli-Cesena"},"870":{"code":"FR","name":"Frosinone"},"871":{"code":"GE","name":"Genova"},"872":{"code":"GO","name":"Gorizia"},"873":{"code":"GR","name":"Grosseto"},"874":{"code":"IM","name":"Imperia"},"875":{"code":"IS","name":"Isernia"},"836":{"code":"AQ","name":"L'Aquila"},"876":{"code":"SP","name":"La-Spezia"},"877":{"code":"LT","name":"Latina"},"878":{"code":"LE","name":"Lecce"},"879":{"code":"LC","name":"Lecco"},"880":{"code":"LI","name":"Livorno"},"881":{"code":"LO","name":"Lodi"},"882":{"code":"LU","name":"Lucca"},"883":{"code":"MC","name":"Macerata"},"884":{"code":"MN","name":"Mantova"},"885":{"code":"MS","name":"Massa-Carrara"},"886":{"code":"MT","name":"Matera"},"887":{"code":"VS","name":"Medio Campidano"},"888":{"code":"ME","name":"Messina"},"889":{"code":"MI","name":"Milano"},"890":{"code":"MO","name":"Modena"},"891":{"code":"MB","name":"Monza-Brianza"},"892":{"code":"NA","name":"Napoli"},"893":{"code":"NO","name":"Novara"},"894":{"code":"NU","name":"Nuoro"},"895":{"code":"OG","name":"Ogliastra"},"896":{"code":"OT","name":"Olbia Tempio"},"897":{"code":"OR","name":"Oristano"},"898":{"code":"PD","name":"Padova"},"899":{"code":"PA","name":"Palermo"},"900":{"code":"PR","name":"Parma"},"901":{"code":"PV","name":"Pavia"},"902":{"code":"PG","name":"Perugia"},"903":{"code":"PU","name":"Pesaro-Urbino"},"904":{"code":"PE","name":"Pescara"},"905":{"code":"PC","name":"Piacenza"},"906":{"code":"PI","name":"Pisa"},"907":{"code":"PT","name":"Pistoia"},"908":{"code":"PN","name":"Pordenone"},"909":{"code":"PZ","name":"Potenza"},"910":{"code":"PO","name":"Prato"},"911":{"code":"RG","name":"Ragusa"},"912":{"code":"RA","name":"Ravenna"},"913":{"code":"RC","name":"Reggio-Calabria"},"914":{"code":"RE","name":"Reggio-Emilia"},"915":{"code":"RI","name":"Rieti"},"916":{"code":"RN","name":"Rimini"},"917":{"code":"RM","name":"Roma"},"918":{"code":"RO","name":"Rovigo"},"919":{"code":"SA","name":"Salerno"},"920":{"code":"SS","name":"Sassari"},"921":{"code":"SV","name":"Savona"},"922":{"code":"SI","name":"Siena"},"923":{"code":"SR","name":"Siracusa"},"924":{"code":"SO","name":"Sondrio"},"925":{"code":"TA","name":"Taranto"},"926":{"code":"TE","name":"Teramo"},"927":{"code":"TR","name":"Terni"},"928":{"code":"TO","name":"Torino"},"929":{"code":"TP","name":"Trapani"},"930":{"code":"TN","name":"Trento"},"931":{"code":"TV","name":"Treviso"},"932":{"code":"TS","name":"Trieste"},"933":{"code":"UD","name":"Udine"},"934":{"code":"VA","name":"Varese"},"935":{"code":"VE","name":"Venezia"},"936":{"code":"VB","name":"Verbania"},"937":{"code":"VC","name":"Vercelli"},"938":{"code":"VR","name":"Verona"}
4927,"939":{"code":"VV","name":"Vibo-Valentia"},"940":{"code":"VI","name":"Vicenza"},"941":{"code":"VT","name":"Viterbo"}}},"JE":{"name":"Jersey"},"JM":{"name":"Jama\u00efque"},"JO":{"name":"Jordanie"},"JP":{"name":"Japon"},"KE":{"name":"Kenya"},"KG":{"name":"Kirghizstan"},"KH":{"name":"Cambodge"},"KI":{"name":"Kiribati"},"KM":{"name":"Comores"},"KN":{"name":"Saint-Christophe-et-Ni\u00e9v\u00e8s"},"KP":{"name":"Cor\u00e9e du Nord"},"KR":{"name":"Cor\u00e9e du Sud"},"KW":{"name":"Kowe\u00eft"},"KY":{"name":"\u00celes Ca\u00efmans"},"KZ":{"name":"Kazakhstan"},"LA":{"name":"Laos"},"LB":{"name":"Liban"},"LC":{"name":"Sainte-Lucie"},"LI":{"name":"Liechtenstein"},"LK":{"name":"Sri Lanka"},"LR":{"name":"Liberia"},"LS":{"name":"Lesotho"},"LT":{"name":"Lituanie","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxembourg"},"LV":{"name":"Lettonie","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"}
4927,"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"LY":{"name":"Libye"},"MA":{"name":"Maroc"},"MC":{"name":"Monaco"},"MD":{"name":"Moldavie"},"ME":{"name":"Mont\u00e9n\u00e9gro"},"MF":{"name":"Saint-Martin"},"MG":{"name":"Madagascar"},"MH":{"name":"\u00celes Marshall"},"MK":{"name":"Mac\u00e9doine du Nord"},"ML":{"name":"Mali"},"MM":{"name":"Myanmar (Birmanie)"},"MN":{"name":"Mongolie"},"MO":{"name":"R.A.S. chinoise de Macao"},"MP":{"name":"\u00celes Mariannes du Nord"},"MQ":{"name":"Martinique"},"MR":{"name":"Mauritanie"},"MS":{"name":"Montserrat"},"MT":{"name":"Malte"},"MU":{"name":"Maurice"},"MV":{"name":"Maldives"},"MW":{"name":"Malawi"},"MX":{"name":"Mexique","regions":{"942":{"code":"AGU","name":"Aguascalientes"},"943":{"code":"BCN","name":"Baja California"},"944":{"code":"BCS","name":"Baja California Sur"},"945":{"code":"CAM","name":"Campeche"},"946":{"code":"CHP","name":"Chiapas"},"947":{"code":"CHH","name":"Chihuahua"},"948":{"code":"CMX","name":"Ciudad de M\u00e9xico"},"949":{"code":"COA","name":"Coahuila"},"950":{"code":"COL","name":"Colima"},"951":{"code":"DUR","name":"Durango"},"952":{"code":"MEX","name":"Estado de M\u00e9xico"},"953":{"code":"GUA","name":"Guanajuato"},"954":{"code":"GRO","name":"Guerrero"},"955":{"code":"HID","name":"Hidalgo"},"956":{"code":"JAL","name":"Jalisco"},"957":{"code":"MIC","name":"Michoac\u00e1n"},"958":{"code":"MOR","name":"Morelos"},"959":{"code":"NAY","name":"Nayarit"},"960":{"code":"NLE","name":"Nuevo Le\u00f3n"},"961":{"code":"OAX","name":"Oaxaca"},"962":{"code":"PUE","name":"Puebla"},"963":{"code":"QUE","name":"Quer\u00e9taro"},"964":{"code":"ROO","name":"Quintana Roo"},"965":{"code":"SLP","name":"San Luis Potos\u00ed"},"966":{"code":"SIN","name":"Sinaloa"},"967":{"code":"SON","name":"Sonora"},"968":{"code":"TAB","name":"Tabasco"},"969":{"code":"TAM","name":"Tamaulipas"},"970":{"code":"TLA","name":"Tlaxcala"},"971":{"code":"VER","name":"Veracruz"},"972":{"code":"YUC","name":"Yucat\u00e1n"},"973":{"code":"ZAC","name":"Zacatecas"}}},"MY":{"name":"Malaisie"},"MZ":{"name":"Mozambique"},"NA":{"name":"Namibie"},"NC":{"name":"Nouvelle-Cal\u00e9donie"},"NE":{"name":"Niger"},"NF":{"name":"\u00cele Norfolk"},"NG":{"name":"Nigeria"},"NI":{"name":"Nicaragua"},"NL":{"name":"Pays-Bas"},"NO":{"name":"Norv\u00e8ge"},"NP":{"name":"N\u00e9pal"},"NR":{"name":"Nauru"},"NU":{"name":"Niue"},"NZ":{"name":"Nouvelle-Z\u00e9lande"},"OM":{"name":"Oman"},"PA":{"name":"Panama"},"PE":{"name":"P\u00e9rou","regions":{"993":{"code":"PE-AMA","name":"Amazonas"},"994":{"code":"PE-ANC","name":"Ancash"},"995":{"code":"PE-APU","name":"Apur\u00edmac"},"996":{"code":"PE-ARE","name":"Arequipa"},"997":{"code":"PE-AYA","name":"Ayacucho"},"998":{"code":"PE-CAJ","name":"Cajamarca"},"999":{"code":"PE-CUS","name":"Cusco"},"1000":{"code":"PE-CAL","name":"El Callao"},"1001":{"code":"PE-HUV","name":"Huancavelica"},"1002":{"code":"PE-HUC","name":"Hu\u00e1nuco"},"1003":{"code":"PE-ICA","name":"Ica"},"1004":{"code":"PE-JUN","name":"Jun\u00edn"},"1005":{"code":"PE-LAL","name":"La Libertad"},"1006":{"code":"PE-LAM","name":"Lambayeque"},"1007":{"code":"PE-LIM","name":"Lima"},"1008":{"code":"PE-LOR","name":"Loreto"},"1009":{"code":"PE-MDD","name":"Madre de Dios"},"1010":{"code":"PE-MOQ","name":"Moquegua"}
4927,"992":{"code":"PE-LMA","name":"Municipalidad Metropolitana de Lima"},"1011":{"code":"PE-PAS","name":"Pasco"},"1012":{"code":"PE-PIU","name":"Piura"},"1013":{"code":"PE-PUN","name":"Puno"},"1014":{"code":"PE-SAM","name":"San Mart\u00edn"},"1015":{"code":"PE-TAC","name":"Tacna"},"1016":{"code":"PE-TUM","name":"Tumbes"},"1017":{"code":"PE-UCA","name":"Ucayali"}}},"PF":{"name":"Polyn\u00e9sie fran\u00e7aise"},"PG":{"name":"Papouasie-Nouvelle-Guin\u00e9e"},"PH":{"name":"Philippines"},"PK":{"name":"Pakistan"},"PL":{"name":"Pologne","regions":{"1018":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"1019":{"code":"PL-04","name":"kujawsko-pomorskie"},"1020":{"code":"PL-06","name":"lubelskie"},"1021":{"code":"PL-08","name":"lubuskie"},"1024":{"code":"PL-14","name":"mazowieckie"},"1023":{"code":"PL-12","name":"ma\u0142opolskie"},"1025":{"code":"PL-16","name":"opolskie"},"1026":{"code":"PL-18","name":"podkarpackie"},"1027":{"code":"PL-20","name":"podlaskie"},"1028":{"code":"PL-22","name":"pomorskie"},"1029":{"code":"PL-24","name":"\u015bl\u0105skie"},"1030":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"1031":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"1032":{"code":"PL-30","name":"wielkopolskie"},"1033":{"code":"PL-32","name":"zachodniopomorskie"},"1022":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PM":{"name":"Saint-Pierre-et-Miquelon"},"PN":{"name":"\u00celes Pitcairn"},"PS":{"name":"Territoires palestiniens"},"PT":{"name":"Portugal","regions":{"1034":{"code":"PT-01","name":"Aveiro"},"1035":{"code":"PT-02","name":"Beja"},"1036":{"code":"PT-03","name":"Braga"},"1037":{"code":"PT-04","name":"Bragan\u00e7a"},"1038":{"code":"PT-05","name":"Castelo Branco"},"1039":{"code":"PT-06","name":"Coimbra"},"1040":{"code":"PT-07","name":"\u00c9vora"},"1041":{"code":"PT-08","name":"Faro"},"1042":{"code":"PT-09","name":"Guarda"},"1043":{"code":"PT-10","name":"Leiria"},"1044":{"code":"PT-11","name":"Lisboa"},"1045":{"code":"PT-12","name":"Portalegre"},"1046":{"code":"PT-13","name":"Porto"},"1053":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"1052":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"1047":{"code":"PT-14","name":"Santar\u00e9m"},"1048":{"code":"PT-15","name":"Set\u00fabal"},"1049":{"code":"PT-16","name":"Viana do Castelo"},"1050":{"code":"PT-17","name":"Vila Real"},"1051":{"code":"PT-18","name":"Viseu"}}},"PW":{"name":"Palaos"},"PY":{"name":"Paraguay","regions":{"975":{"code":"PY-16","name":"Alto Paraguay"},"976":{"code":"PY-10","name":"Alto Paran\u00e1"},"977":{"code":"PY-13","name":"Amambay"},"974":{"code":"PY-ASU","name":"Asunci\u00f3n"},"978":{"code":"PY-19","name":"Boquer\u00f3n"},"979":{"code":"PY-5","name":"Caaguaz\u00fa"},"980":{"code":"PY-6","name":"Caazap\u00e1"},"981":{"code":"PY-14","name":"Canindey\u00fa"},"982":{"code":"PY-11","name":"Central"},"983":{"code":"PY-1","name":"Concepci\u00f3n"},"984":{"code":"PY-3","name":"Cordillera"},"985":{"code":"PY-4","name":"Guair\u00e1"},"986":{"code":"PY-7","name":"Itap\u00faa"},"987":{"code":"PY-8","name":"Misiones"},"988":{"code":"PY-12","name":"\u00d1eembuc\u00fa"},"989":{"code":"PY-9","name":"Paraguar\u00ed"},"990":{"code":"PY-15","name":"Presidente Hayes"},"991":{"code":"PY-2","name":"San Pedro"}}},"QA":{"name":"Qatar"},"RE":{"name":"La R\u00e9union"},"RO":{"name":"Roumanie","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"Serbie"},"RU":{"name":"Russie"},"RW":{"name":"Rwanda"},"SA":{"name":"Arabie saoudite"},"SB":{"name":"\u00celes Salomon"},"SC":{"name":"Seychelles"},"SD":{"name":"Soudan"},"SE":{"name":"Su\u00e8de","regions":{"1064":{"code":"SE-K","name":"Blekinge l\u00e4n"}
4927,"1065":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"1067":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"1066":{"code":"SE-I","name":"Gotlands l\u00e4n"},"1068":{"code":"SE-N","name":"Hallands l\u00e4n"},"1069":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"1070":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"1071":{"code":"SE-H","name":"Kalmar l\u00e4n"},"1072":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"1073":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"1083":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"1084":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"1074":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"1076":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"1075":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"1077":{"code":"SE-C","name":"Uppsala l\u00e4n"},"1078":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"1079":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"1080":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"1081":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"1082":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SG":{"name":"Singapour"},"SH":{"name":"Sainte-H\u00e9l\u00e8ne"},"SI":{"name":"Slov\u00e9nie"},"SJ":{"name":"Svalbard et Jan Mayen"},"SK":{"name":"Slovaquie"},"SL":{"name":"Sierra Leone"},"SM":{"name":"Saint-Marin"},"SN":{"name":"S\u00e9n\u00e9gal"},"SO":{"name":"Somalie"},"SR":{"name":"Suriname","regions":{"1054":{"code":"SR-BR","name":"Brokopondo"},"1055":{"code":"SR-CM","name":"Commewijne"},"1056":{"code":"SR-CR","name":"Coronie"},"1057":{"code":"SR-MA","name":"Marowijne"},"1058":{"code":"SR-NI","name":"Nickerie"},"1059":{"code":"SR-PR","name":"Para"},"1060":{"code":"SR-PM","name":"Paramaribo"},"1061":{"code":"SR-SA","name":"Saramacca"},"1062":{"code":"SR-SI","name":"Sipaliwini"},"1063":{"code":"SR-WA","name":"Wanica"}}},"ST":{"name":"Sao Tom\u00e9-et-Principe"},"SV":{"name":"Salvador"},"SX":{"name":"Saint-Martin (partie n\u00e9erlandaise)"},"SY":{"name":"Syrie"},"SZ":{"name":"Eswatini"},"TC":{"name":"\u00celes Turques-et-Ca\u00efques"},"TD":{"name":"Tchad"},"TF":{"name":"Terres australes fran\u00e7aises"},"TG":{"name":"Togo"},"TH":{"name":"Tha\u00eflande"},"TJ":{"name":"Tadjikistan"},"TK":{"name":"Tokelau"},"TL":{"name":"Timor oriental"},"TM":{"name":"Turkm\u00e9nistan"},"TN":{"name":"Tunisie"},"TO":{"name":"Tonga"},"TR":{"name":"Turquie"},"TT":{"name":"Trinit\u00e9-et-Tobago"},"TV":{"name":"Tuvalu"},"TW":{"name":"Ta\u00efwan"},"TZ":{"name":"Tanzanie"},"UA":{"name":"Ukraine","regions":{"1109":{"code":"UA-43","name":"Avtonomna Respublika Krym"},"1085":{"code":"UA-71","name":"Cherkaska oblast"},"1086":{"code":"UA-74","name":"Chernihivska oblast"},"1087":{"code":"UA-77","name":"Chernivetska oblast"},"1088":{"code":"UA-12","name":"Dnipropetrovska oblast"},"1089":{"code":"UA-14","name":"Donetska oblast"},"1090":{"code":"UA-26","name":"Ivano-Frankivska oblast"},"1091":{"code":"UA-63","name":"Kharkivska oblast"},"1092":{"code":"UA-65","name":"Khersonska oblast"},"1093":{"code":"UA-68","name":"Khmelnytska oblast"},"1094":{"code":"UA-35","name":"Kirovohradska oblast"},"1110":{"code":"UA-30","name":"Kyiv"},"1095":{"code":"UA-32","name":"Kyivska oblast"},"1096":{"code":"UA-09","name":"Luhanska oblast"},"1097":{"code":"UA-46","name":"Lvivska oblast"},"1098":{"code":"UA-48","name":"Mykolaivska oblast"},"1099":{"code":"UA-51","name":"Odeska oblast"},"1100":{"code":"UA-53","name":"Poltavska oblast"},"1101":{"code":"UA-56","name":"Rivnenska oblast"},"1111":{"code":"UA-40","name":"Sevastopol"},"1102":{"code":"UA-59","name":"Sumska oblast"},"1103":{"code":"UA-61","name":"Ternopilska oblast"},"1104":{"code":"UA-05","name":"Vinnytska oblast"},"1105":{"code":"UA-07","name":"Volynska oblast"},"1106":{"code":"UA-21","name":"Zakarpatska oblast"},"1107":{"code":"UA-23","name":"Zaporizka oblast"},"1108":{"code":"UA-18","name":"Zhytomyrska oblast"}}},"UG":{"name":"Ouganda"},"UM":{"name":"\u00celes mineures \u00e9loign\u00e9es des \u00c9tats-Unis"},"US":{"name":"\u00c9tats-Unis","regions":{"1":{"code":"AL","name":"Alabama"},"2":{"code":"AK","name":"Alaska"},"3":{"code":"AS","name":"American Samoa"},"4":{"code":"AZ","name":"Arizona"},"5":{"code":"AR","name":"Arkansas"},"6":{"code":"AE","name":"Armed Forces Africa"},"7":{"code":"AA","name":"Armed Forces Americas"},"8":{"code":"AE","name":"Armed Forces Canada"},"9":{"code":"AE","name":"Armed Forces Europe"},"10":{"code":"AE","name":"Armed Forces Middle East"},"11":{"code":"AP","name":"Armed Forces Pacific"},"12":{"code":"CA","name":"California"},"13":{"code":"CO","name":"Colorado"},"14":{"code":"CT","name":"Connecticut"},"15":{"code":"DE","name":"Delaware"},"16":{"code":"DC","name":"District of Columbia"},"17":{"code":"FM","name":"Federated States Of Micronesia"}
4927,"18":{"code":"FL","name":"Florida"},"19":{"code":"GA","name":"Georgia"},"20":{"code":"GU","name":"Guam"},"21":{"code":"HI","name":"Hawaii"},"22":{"code":"ID","name":"Idaho"},"23":{"code":"IL","name":"Illinois"},"24":{"code":"IN","name":"Indiana"},"25":{"code":"IA","name":"Iowa"},"26":{"code":"KS","name":"Kansas"},"27":{"code":"KY","name":"Kentucky"},"28":{"code":"LA","name":"Louisiana"},"29":{"code":"ME","name":"Maine"},"30":{"code":"MH","name":"Marshall Islands"},"31":{"code":"MD","name":"Maryland"},"32":{"code":"MA","name":"Massachusetts"},"33":{"code":"MI","name":"Michigan"},"34":{"code":"MN","name":"Minnesota"},"35":{"code":"MS","name":"Mississippi"},"36":{"code":"MO","name":"Missouri"},"37":{"code":"MT","name":"Montana"},"38":{"code":"NE","name":"Nebraska"},"39":{"code":"NV","name":"Nevada"},"40":{"code":"NH","name":"New Hampshire"},"41":{"code":"NJ","name":"New Jersey"},"42":{"code":"NM","name":"New Mexico"},"43":{"code":"NY","name":"New York"},"44":{"code":"NC","name":"North Carolina"},"45":{"code":"ND","name":"North Dakota"},"46":{"code":"MP","name":"Northern Mariana Islands"},"47":{"code":"OH","name":"Ohio"},"48":{"code":"OK","name":"Oklahoma"},"49":{"code":"OR","name":"Oregon"},"50":{"code":"PW","name":"Palau"},"51":{"code":"PA","name":"Pennsylvania"},"52":{"code":"PR","name":"Puerto Rico"},"53":{"code":"RI","name":"Rhode Island"},"54":{"code":"SC","name":"South Carolina"},"55":{"code":"SD","name":"South Dakota"},"56":{"code":"TN","name":"Tennessee"},"57":{"code":"TX","name":"Texas"},"58":{"code":"UT","name":"Utah"},"59":{"code":"VT","name":"Vermont"},"60":{"code":"VI","name":"Virgin Islands"},"61":{"code":"VA","name":"Virginia"},"62":{"code":"WA","name":"Washington"},"63":{"code":"WV","name":"West Virginia"},"64":{"code":"WI","name":"Wisconsin"},"65":{"code":"WY","name":"Wyoming"}}},"UY":{"name":"Uruguay","regions":{"1112":{"code":"UY-AR","name":"Artigas"},"1113":{"code":"UY-CA","name":"Canelones"},"1114":{"code":"UY-CL","name":"Cerro Largo"},"1115":{"code":"UY-CO","name":"Colonia"},"1116":{"code":"UY-DU","name":"Durazno"},"1117":{"code":"UY-FS","name":"Flores"},"1118":{"code":"UY-FD","name":"Florida"},"1119":{"code":"UY-LA","name":"Lavalleja"},"1120":{"code":"UY-MA","name":"Maldonado"},"1121":{"code":"UY-MO","name":"Montevideo"},"1122":{"code":"UY-PA","name":"Paysandu"},"1123":{"code":"UY-RN","name":"R\u00edo Negro"},"1124":{"code":"UY-RV","name":"Rivera"},"1125":{"code":"UY-RO","name":"Rocha"},"1126":{"code":"UY-SA","name":"Salto"},"1127":{"code":"UY-SJ","name":"San Jos\u00e9"},"1128":{"code":"UY-SO","name":"Soriano"},"1129":{"code":"UY-TA","name":"Tacuaremb\u00f3"},"1130":{"code":"UY-TT","name":"Treinta y Tres"}}},"UZ":{"name":"Ouzb\u00e9kistan"},"VA":{"name":"\u00c9tat de la Cit\u00e9 du Vatican"},"VC":{"name":"Saint-Vincent-et-les Grenadines"},"VE":{"name":"Venezuela","regions":{"1133":{"code":"VE-Z","name":"Amazonas"},"1134":{"code":"VE-B","name":"Anzo\u00e1tegui"},"1135":{"code":"VE-C","name":"Apure"},"1136":{"code":"VE-D","name":"Aragua"},"1137":{"code":"VE-E","name":"Barinas"},"1138":{"code":"VE-F","name":"Bol\u00edvar"},"1139":{"code":"VE-G","name":"Carabobo"},"1140":{"code":"VE-H","name":"Cojedes"},"1141":{"code":"VE-Y","name":"Delta Amacuro"},"1131":{"code":"VE-W","name":"Dependencias Federales"},"1132":{"code":"VE-A","name":"Distrito Capital"},"1142":{"code":"VE-I","name":"Falc\u00f3n"},"1143":{"code":"VE-J","name":"Gu\u00e1rico"},"1144":{"code":"VE-K","name":"Lara"},"1145":{"code":"VE-L","name":"M\u00e9rida"},"1146":{"code":"VE-M","name":"Miranda"},"1147":{"code":"VE-N","name":"Monagas"},"1148":{"code":"VE-O","name":"Nueva Esparta"},"1149":{"code":"VE-P","name":"Portuguesa"},"1150":{"code":"VE-R","name":"Sucre"},"1151":{"code":"VE-S","name":"T\u00e1chira"},"1152":{"code":"VE-T","name":"Trujillo"},"1153":{"code":"VE-X","name":"Vargas"},"1154":{"code":"VE-U","name":"Yaracuy"},"1155":{"code":"VE-V","name":"Zulia"}}},"VG":{"name":"\u00celes Vierges britanniques"},"VI":{"name":"\u00celes Vierges des \u00c9tats-Unis"},"VN":{"name":"Vi\u00eat Nam"},"VU":{"name":"Vanuatu"},"WF":{"name":"Wallis-et-Futuna"},"WS":{"name":"Samoa"},"XK":{"name":"Kosovo"},"YE":{"name":"Y\u00e9men"},"YT":{"name":"Mayotte"},"ZA":{"name":"Afrique du Sud"},"ZM":{"name":"Zambie"},"ZW":{"name":"Zimbabwe"},"data_id":1790866267},"captcha":[],"instant-purchase":[],"loggedAsCustomer":[],"persistent":[],"review":[],"payments":[],"wishlist":{"items":[]},"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[]}</script>
4927 4928</div>
4928<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"8b8d3343a6eb45d59e4c0aa5b586843d","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 4928
4928
4929<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a43c489d3b7f2af4',t:'MTc5MDg2NjI2Nw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
4929</body> 4930</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.