PageSourceSearch

https://www.broderieplaisir.com/fr/checkout/cart/index/

html broderieplaisir.com collected 2026-10-01 14:51:08 UTC 335,878 bytes, 4,930 lines download raw bytes

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&#x20;utilisons&#x20;les&#x20;cookies&#x20;pour&#x20;vous&#x20;offrir&#x20;une&#x20;meilleure&#x20;exp&#xE9;rience&#x20;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&#x20;le&#x20;panel"
544                title="Fermer&#x20;le&#x20;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&#x20;&#xE0;&#x20;la&#x20;page&#x20;d&#x27;accueil"
635    >
636        <img
637            src="https://www.broderieplaisir.com/static/version1788980829/frontend/BP/Default/fr_FR/images/logo.png"
638            alt="Logo&#x20;du&#x20;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&#x20;le&#x20;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&#x20;le&#x20;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&#x20;Main&#x20;Menu">
678                <ul>
679                                                                        <li data-level="0" x-data="initMobileSubMenu">
680                                <button
681                                    type="button"
682                                    class="w-full justify-between flex&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;outline-offset-0"
781                                            >
782                                                <span class="ms-7">Soie perlée &quot;Au Ver à Soie&quot;</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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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 &amp; 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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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 &amp; Galons                                        </button>
886                                        <a
887                                            href="https://www.broderieplaisir.com/fr/catalog/category/view/s/rubans-galons/id/3/"
888                                            class="flex&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;outline-offset-0"
889                                        >
890                                            <span class="ms-7">See all Rubans &amp; 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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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 &amp; 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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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 &amp; strass                                         </button>
994                                        <a
995                                            href="https://www.broderieplaisir.com/fr/catalog/category/view/s/paillettes-sequins-strass/id/7/"
996                                            class="flex&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;outline-offset-0"
997                                        >
998                                            <span class="ms-7">See all Paillettes, sequins &amp; 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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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 &amp; 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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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 &amp; Mercerie                                        </button>
1178                                        <a
1179                                            href="https://www.broderieplaisir.com/fr/catalog/category/view/s/materiel-mercerie/id/10/"
1180                                            class="flex&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;outline-offset-0"
1181                                        >
1182                                            <span class="ms-7">See all Matériel &amp; 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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;outline-offset-0"
1213                                            >
1214                                                <span class="ms-7">Broderie d&#039;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;items-center&#x20;gap-2&#x20;py-3&#x20;px-6&#x20;border-b&#x20;border-slate-200&#x20;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&#x20;des&#x20;produits"
1451               x-data="initCompareHeader()"
1452               @private-content-loaded.window="receiveCompareData($event.detail.data)"
1453               :aria-label="`
1454                    Comparer&#x20;des&#x20;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&#x2F;Masquer&#x20;le&#x20;formulaire&#x20;de&#x20;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&#x20;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&#x20;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&#x20;liste&#x20;d&#x2019;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&#x20;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&#x20;d&#x2019;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&#x20;d&#xE9;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&#xE9;er&#x20;un&#x20;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&#x20;le&#x20;panier,
1610                    ${isCartEmpty()
1611                        ? 'Le&#x20;panier&#x20;est&#x20;vide'
1612                        : cart.summary_count > 1
1613                            ? hyva.str('&#x25;1&#x20;articles', cart.summary_count)
1614                            : hyva.str('&#x25;1&#x20;item', cart.summary_count)
1615                    }`"
1616                                    href="https://www.broderieplaisir.com/fr/checkout/cart/index/"
1617                    title="Voir&#x20;le&#x20;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&#x20;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&#x20;le&#x20;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&#039; utilisation</a> de <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Google</a> s&#039;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&#x20;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="&#x20;Mati&#xE8;res&#x20;&#xE0;&#x20;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&#x20;perl&#xE9;&#x20;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&#x20;merceris&#xE9;"
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&#x20;moulin&#xE9;"
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&#x20;coton&#x20;Dare&#x20;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&#x20;m&#xE9;tal&#x20;-&#x20;m&#xE9;tallis&#xE9;"
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&#x20;de&#x20;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&#x20;&#xE0;&#x20;gant&#x20;-&#x20;glac&#xE9;&#x20;-&#x20;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&#x20;perl&#xE9;e&#x20;&quot;Au&#x20;Ver&#x20;&#xE0;&#x20;Soie&quot;"
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 &quot;Au Ver à Soie&quot;                                            </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&#x20;de&#x20;soie&#x20;&#x2F;&#x20;Soie&#x20;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&#x20;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&#x20;fine&#x20;"
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&#x20;perl&#xE9;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&#x20;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&#x20;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&#x20;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&#x20;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&#x20;&amp;&#x20;Galons"
2295                               @focus="hoverPanelActiveId = 0"
2296                            >
2297                                Rubans &amp; 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 &amp; 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&#x20;de&#x20;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&#x20;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&#x20;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&#x20;&#xE0;&#x20;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&#x20;&#xE0;&#x20;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&#x20;et&#x20;galons&#x20;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,&#x20;sequins&#x20;&amp;&#x20;strass&#x20;"
2410                               @focus="hoverPanelActiveId = 0"
2411                            >
2412                                Paillettes, sequins &amp; 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 &amp; 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&#x20;&#xE0;&#x20;broder&#x20;"
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&#x20;&#xE0;&#x20;broder&#x20;"
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&#x20;et&#x20;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&#x20;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&#x20;perc&#xE9;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&#x20;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&#x20;sur&#x20;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&#x20;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&#x20;et&#x20;mini&#x20;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&#x20;et&#x20;autres&#x20;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&#x20;et&#x20;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&#x20;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&#xE9;riel&#x20;&amp;&#x20;Mercerie"
2600                               @focus="hoverPanelActiveId = 0"
2601                            >
2602                                Matériel &amp; 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 &amp; 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,&#x20;m&#xE9;tier&#x20;et&#x20;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&#x20;et&#x20;poudre&#x20;&#xE0;&#x20;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,&#x20;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&#x20;d&#x27;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&#039;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&#x20;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&#x20;de&#x20;soie&#x20;et&#x20;lam&#xE9;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&#x20;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&#x20;de&#x20;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&#xE9;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&#x20;et&#x20;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&#x20;Compte&#x20;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&#x20;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&#x20;ou&#x20;rembours&#xE9;"
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&#x20;g&#xE9;n&#xE9;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&#x20;sommes&#x20;nous&#x20;&#x3F;"
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&#x20;actualit&#xE9;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&#x20;Compte&#x20;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&#x20;flex&#x20;flex-col&#x20;md&#x3A;flex-row&#x20;flex-wrap">
2968        <h1            class="page-title text-3xl&#x20;font-bold&#x20;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&#160;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&#x27;abonner&#x20;&#xE0;&#x20;la&#x20;lettre&#x20;d&#x2019;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&#x20;votre&#x20;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&#039; utilisation</a> de <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Google</a> s&#039;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.