PageSourceSearch

https://www.jardindupicvert.com/mentions-legales

html jardindupicvert.com collected 2026-10-02 11:11:16 UTC 480,454 bytes, 10,468 lines download raw bytes

1<!doctype html>
2<html lang="fr">
3<head >
4<meta charset="utf-8"/>
5<meta name="title" content="Mentions légales (PV)"/>
6<meta name="description" content="Mentions légales"/>
7<meta name="robots" content="INDEX,FOLLOW"/>
8<meta name="viewport" content="width=device-width, initial-scale=1"/>
9<title>Mentions légales (PV)</title>
10<link rel="stylesheet" type="text/css" media="all" href="https://www.jardindupicvert.com/static/version1790796154/_cache/merged/b6ca73420e067085fafe23cb8c29a433.min.css" />
11<script type="text/javascript" defer="true" src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_AiChatbot/js/chat-core.min.js"></script>
vendor: 1 bytes, line 11
11
12<script type="text/javascript" defer="true" src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_AiChatbot/js/hyva-chat.min.js"></script>
12
13<link rel="canonical" href="https://www.jardindupicvert.com/mentions-legales" />
14<link rel="icon" type="image/x-icon" href="https://www.jardindupicvert.com/media/favicon/stores/7/favicon-32x32.png" />
15<link rel="shortcut icon" type="image/x-icon" href="https://www.jardindupicvert.com/media/favicon/stores/7/favicon-32x32.png" />
16<meta name="google-site-verification" content="VIZKD3g2ECUvs8jeLlJrBqc2GZmNoaNzMIRBFlb2ivo" />    
16<script>
17(function () {
18    // Runs before any cookie bar decides what to display, Luma or Hyva alike. An answer given
19    // for a previous set of cookie groups no longer means anything: drop it so the bar returns.
20    var VERSION_COOKIE = 'gdpr_cookie_consent_version';
21    var VERSION = '1';
22
23    function read(name) {
24        var match = document.cookie.match('(?:^|; )' + name + '=([^;]*)');
25        return match ? decodeURIComponent(match[1]) : '';
26    }
27
28    if (!VERSION || read(VERSION_COOKIE) === VERSION) {
29        return;
30    }
31
32    ['gdpr_cookie_consent',
33     'gdpr_cookie_groups'].forEach(function (name) {
34        document.cookie = name + '=; Max-Age=0; path=/';
35        document.cookie = name + '=; Max-Age=0; path=/; domain=' + document.location.hostname;
36        document.cookie = name + '=; Max-Age=0; path=/; domain=.' + document.location.hostname.replace(/^www\./, '');
37    });
38})();
39
40window.pdfConsent = window.pdfConsent || (function () {
41    var GROUPS_COOKIE = 'gdpr_cookie_groups';
42    var SETTLE_MS = 8000;
43    var callbacks = [], timer = null, settleTimer = null, last = null;
44
45    function read(name) {
46        var match = document.cookie.match('(?:^|; )' + name + '=([^;]*)');
47        return match ? decodeURIComponent(match[1]) : '';
48    }
49
50    function allowedGroups() {
51        return read(GROUPS_COOKIE).split(',').map(function (id) {
52            return id.trim();
53        }).filter(Boolean);
54    }
55
56    function start(settleMs) {
57        if (!timer) {
58            last = read(GROUPS_COOKIE);
59            timer = setInterval(tick, 1000);
60        }
61        if (settleTimer) {
62            clearTimeout(settleTimer);
63            settleTimer = null;
64        }
65        if (settleMs) {
66            settleTimer = setTimeout(stop, settleMs);
67        }
68    }
69
70    function stop() {
71        if (timer) {
72            clearInterval(timer);
73            timer = null;
74        }
75        if (settleTimer) {
76            clearTimeout(settleTimer);
77            settleTimer = null;
78        }
79    }
80
81    function tick() {
82        var current = read(GROUPS_COOKIE);
83        if (current === last) {
84            return;
85        }
86        last = current;
87        callbacks = callbacks.filter(function (cb) {
88            return !cb();
89        });
90        // Cookie settled. Remaining callbacks stay for a later revoke; polling
91        // restarts only on mst-gdpr-cookie-settings-save.
92        stop();
93    }
94
95    window.addEventListener('mst-gdpr-cookie-settings-save', function () {
96        start(SETTLE_MS);
97    });
98
99    return {
100        allows: function (groupCsv) {
101            var need = String(groupCsv || '').split(',').map(function (id) {
102                return id.trim();
103            }).filter(Boolean);
104            if (!need.length) {
105                return false;
106            }
107            var have = allowedGroups();
108            // OU : un seul groupe consenti suffit. Les groupes Mirasvit sont rattachés à
109            // des ensembles de stores → un même type (analyse, marketing…) existe en
110            // plusieurs exemplaires selon les langues. Le visiteur ne consent qu'aux
111            // groupes de son store, on liste donc tous les IDs d'un type et on déclenche
112            // dès que l'un d'eux est présent.
113            return need.some(function (id) {
114                return have.indexOf(id) !== -1;
115            });
116        },
117        onChange: function (cb) {
118            callbacks.push(cb);
119            // First visit: no groups cookie yet, poll until the visitor decides.
120            if (!read(GROUPS_COOKIE)) {
121                start();
122            }
123        }
124    };
125})();
126</script>
126
127<link rel="preconnect" href="https://www.googletagmanager.com">
128<script type="application/json" id="webcooking-gtm-config">
129    {"containerId":"GTM-MBDD62PX","loaderUrl":"https:\/\/www.googletagmanager.com","serverContainerUrl":"","consent":{"cookieName":"gdpr_cookie_groups","analyticsValue":"3","marketingValue":"2","waitForUpdate":500},"events":{"search":false,"filters":true,"timeOnPage":[],"navigation":[]}}</script>
vendor: 1 bytes, line 129
129
130<script type="application/json" id="webcooking-gtm-datalayer">
131    [{"page_type":"cms","env_currency":"eur","env_language":"fr-fr","env_date":"02\/10\/2026","env_work":"production"}]</script>
vendor: 1 bytes, line 131
131
132<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/consent.min.js"></script>
vendor: 1 bytes, line 132
132
133<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/datalayer.min.js"></script>
vendor: 1 bytes, line 133
133
134<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/events.min.js"></script>
vendor: 1 bytes, line 134
134
135<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/impressions.min.js"></script>
vendor: 1 bytes, line 135
135
136<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/search.min.js"></script>
vendor: 1 bytes, line 136
136
137<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/engagement.min.js"></script>
vendor: 1 bytes, line 137
137
138<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/navigation.min.js"></script>
vendor: 1 bytes, line 138
138
139<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/bootstrap.min.js"></script>
139
140
141
142<!--Custom Style-->
143<!-- glopal_head -->
144<script>
145// <![CDATA[
146var _webinterpret = _webinterpret || {};
147_webinterpret.plugin_version = 'magento2-1.21.1';
148_webinterpret.page_store_view_id = '7';
149_webinterpret.page_short_name = 'jardindupicvert';
150// ]]>
151</script>
vendor: 1 bytes, line 151
151
152<script async type="text/javascript" src="https://cdn-redirector.glopal.com/common/js/webinterpret-loader.js"></script>
152
153<!-- end glopal_head -->
154<script>
155    var BASE_URL = 'https://www.jardindupicvert.com/';
156    var THEME_PATH = 'https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR';
157    var COOKIE_CONFIG = {
158        "expires": null,
159        "path": "\u002F",
160        "domain": ".www.jardindupicvert.com",
161        "secure": true,
162        "lifetime": "86400",
163        "cookie_restriction_enabled": false    };
164    var CURRENT_STORE_CODE = 'picvert_store';
165    var CURRENT_WEBSITE_ID = '7';
166
167    window.hyva = window.hyva || {}
168
169    window.cookie_consent_groups = window.cookie_consent_groups || {}
170    window.cookie_consent_groups['necessary'] = true;
171
172    window.cookie_consent_config = window.cookie_consent_config || {};
173    window.cookie_consent_config['necessary'] = [].concat(
174        window.cookie_consent_config['necessary'] || [],
175        [
176            'user_allowed_save_cookie',
177            'form_key',
178            'mage-messages',
179            'private_content_version',
180            'mage-cache-sessid',
181            'last_visited_store',
182            'section_data_ids'
183        ]
184    );
185    //# sourceURL=hyva-variables.js
186</script>
vendor: 1 bytes, line 186
186
187<script>
188    (function( hyva, undefined ) {
189
190        function lifetimeToExpires(options, defaults) {
191
192            const lifetime = options.lifetime || defaults.lifetime;
193
194            if (lifetime) {
195                const date = new Date;
196                date.setTime(date.getTime() + lifetime * 1000);
197                return date;
198            }
199
200            return null;
201        }
202
203        function generateRandomString() {
204
205            const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
206                length = 16;
207
208            let formKey = '',
209                charactersLength = allowedCharacters.length;
210
211            for (let i = 0; i < length; i++) {
212                formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))]
213            }
214
215            return formKey;
216        }
217
218        const sessionCookieMarker = {noLifetime: true}
219
220        const cookieTempStorage = {};
221
222        const internalCookie = {
223            get(name) {
224                const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
225                return v ? v[2] : null;
226            },
227            set(name, value, days, skipSetDomain) {
228                let expires,
229                    path,
230                    domain,
231                    secure,
232                    samesite;
233
234                const defaultCookieConfig = {
235                    expires: null,
236                    path: '/',
237                    domain: null,
238                    secure: false,
239                    lifetime: null,
240                    samesite: 'lax'
241                };
242
243                const cookieConfig = window.COOKIE_CONFIG || {};
244
245                expires = days && days !== sessionCookieMarker
246                    ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig)
247                    : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires;
248
249                path = cookieConfig.path || defaultCookieConfig.path;
250                domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain);
251                secure = cookieConfig.secure || defaultCookieConfig.secure;
252                samesite = cookieConfig.samesite || defaultCookieConfig.samesite;
253
254                document.cookie = name + "=" + encodeURIComponent(value) +
255                    (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') +
256                    (path ? '; path=' + path : '') +
257                    (domain ? '; domain=' + domain : '') +
258                    (secure ? '; secure' : '') +
259                    (samesite ? '; samesite=' + samesite : 'lax');
260            },
261            isWebsiteAllowedToSaveCookie() {
262                const allowedCookies = this.get('user_allowed_save_cookie');
263                if (allowedCookies) {
264                    const allowedWebsites = JSON.parse(unescape(allowedCookies));
265
266                    return allowedWebsites[CURRENT_WEBSITE_ID] === 1;
267                }
268                return false;
269            },
270            getGroupByCookieName(name) {
271                const cookieConsentConfig = window.cookie_consent_config || {};
272                let group = null;
273                for (let prop in cookieConsentConfig) {
274                    if (!cookieConsentConfig.hasOwnProperty(prop)) continue;
275                    if (cookieConsentConfig[prop].includes(name)) {
276                        group = prop;
277                        break;
278                    }
279                }
280                return group;
281            },
282            isCookieAllowed(name) {
283                const cookieGroup = this.getGroupByCookieName(name);
284                return cookieGroup
285                    ? window.cookie_consent_groups[cookieGroup]
286                    : this.isWebsiteAllowedToSaveCookie();
287            },
288            saveTempStorageCookies() {
289                for (const [name, data] of Object.entries(cookieTempStorage)) {
290                    if (this.isCookieAllowed(name)) {
291                        this.set(name, data['value'], data['days'], data['skipSetDomain']);
292                        delete cookieTempStorage[name];
293                    }
294                }
295            }
296        };
297
298        hyva.getCookie = (name) => {
299            const cookieConfig = window.COOKIE_CONFIG || {};
300
301            if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
302                return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null;
303            }
304
305            return internalCookie.get(name);
306        }
307
308        hyva.setCookie = (name, value, days, skipSetDomain) => {
309            const cookieConfig = window.COOKIE_CONFIG || {};
310
311            if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
312                cookieTempStorage[name] = {value, days, skipSetDomain};
313                return;
314            }
315            return internalCookie.set(name, value, days, skipSetDomain);
316        }
317
318
319        hyva.setSessionCookie = (name, value, skipSetDomain) => {
320            return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain)
321        }
322
323        hyva.getBrowserStorage = () => {
324            const browserStorage = window.localStorage || window.sessionStorage;
325            if (!browserStorage) {
326                console.warn('Browser Storage is unavailable');
327                return false;
328            }
329            try {
330                browserStorage.setItem('storage_test', '1');
331                browserStorage.removeItem('storage_test');
332            } catch (error) {
333                console.warn('Browser Storage is not accessible', error);
334                return false;
335            }
336            return browserStorage;
337        }
338
339        hyva.postForm = (postParams) => {
340            const form = document.createElement("form");
341
342            let data = postParams.data;
343
344            if (! postParams.skipUenc && ! data.uenc) {
345                data.uenc = btoa(window.location.href);
346            }
347            form.method = "POST";
348            form.action = postParams.action;
349
350            Object.keys(postParams.data).map(key => {
351                const field = document.createElement("input");
352                field.type = 'hidden'
353                field.value = postParams.data[key];
354                field.name = key;
355                form.appendChild(field);
356            });
357
358            const form_key = document.createElement("input");
359            form_key.type = 'hidden';
360            form_key.value = hyva.getFormKey();
361            form_key.name="form_key";
362            form.appendChild(form_key);
363
364            document.body.appendChild(form);
365
366            form.submit();
367        }
368
369        hyva.getFormKey = function () {
370            let formKey = hyva.getCookie('form_key');
371
372            if (!formKey) {
373                formKey = generateRandomString();
374                hyva.setCookie('form_key', formKey);
375            }
376
377            return formKey;
378        }
379
380        hyva.formatPrice = (value, showSign, options = {}) => {
381            const groupSeparator = options.groupSeparator;
382            const decimalSeparator = options.decimalSeparator
383            delete options.groupSeparator;
384            delete options.decimalSeparator;
385            const formatter = new Intl.NumberFormat(
386                'fr\u002DFR',
387                Object.assign({
388                    style: 'currency',
389                    currency: 'EUR',
390                    signDisplay: showSign ? 'always' : 'auto'
391                }, options)
392            );
393            return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ?
394                formatter.formatToParts(value).map(({type, value}) => {
395                    switch (type) {
396                        case 'currency':
397                            return '\u20AC' || value;
398                        case 'minusSign':
399                            return '- ';
400                        case 'plusSign':
401                            return '+ ';
402                        case 'group':
403                            return groupSeparator !== undefined ? groupSeparator : value;
404                        case 'decimal':
405                            return decimalSeparator !== undefined ? decimalSeparator : value;
406                        default :
407                            return value;
408                    }
409                }).reduce((string, part) => string + part) :
410                formatter.format(value);
411        }
412
413        const formatStr = function (str, nStart) {
414            const args = Array.from(arguments).slice(2);
415
416            return str.replace(/(%+)([0-9]+)/g, (m, p, n) => {
417                const idx = parseInt(n) - nStart;
418
419                if (args[idx] === null || args[idx] === void 0) {
420                    return m;
421                }
422                return p.length % 2
423                    ? p.slice(0, -1).replace('%%', '%') + args[idx]
424                    : p.replace('%%', '%') + n;
425            })
426        }
427
428        hyva.str = function (string) {
429            const args = Array.from(arguments);
430            args.splice(1, 0, 1);
431
432            return formatStr.apply(undefined, args);
433        }
434
435        hyva.strf = function () {
436            const args = Array.from(arguments);
437            args.splice(1, 0, 0);
438
439            return formatStr.apply(undefined, args);
440        }
441
442        /**
443         * Take a html string as `content` parameter and
444         * extract an element from the DOM to replace in
445         * the current page under the same selector,
446         * defined by `targetSelector`
447         */
448        hyva.replaceDomElement = (targetSelector, content) => {
449            // Parse the content and extract the DOM node using the `targetSelector`
450            const parser = new DOMParser();
451            const doc = parser.parseFromString(content, 'text/html');
452            const contentNode = doc.querySelector(targetSelector);
453
454            // Bail if content or target can't be found
455            if (!contentNode || !document.querySelector(targetSelector)) {
456                return;
457            }
458
459                        hyva.activateScripts(contentNode);
460            
461            // Replace the old DOM node with the new content
462            document.querySelector(targetSelector).replaceWith(contentNode);
463
464            // Reload customerSectionData and display cookie-messages if present
465            window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
466            hyva.initMessages();
467        }
468
469        hyva.removeScripts = (contentNode) => {
470            const scripts = contentNode.getElementsByTagName('script');
471            for (let i = 0; i < scripts.length; i++) {
472                scripts[i].parentNode.removeChild(scripts[i]);
473            }
474            const templates = contentNode.getElementsByTagName('template');
475            for (let i = 0; i < templates.length; i++) {
476                const container = document.createElement('div');
477                container.innerHTML = templates[i].innerHTML;
478                hyva.removeScripts(container);
479                templates[i].innerHTML = container.innerHTML;
480            }
481        }
482
483        hyva.activateScripts = (contentNode) => {
484            // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM.
485            const scripts = Array.from(contentNode.getElementsByTagName('script'));
486
487            // Iterate over all script tags to duplicate+inject each into the head
488            for (const original of scripts) {
489                const script = document.createElement('script');
490                original.type && (script.type = original.type);
491                script.innerHTML = original.innerHTML;
492
493                // Remove the original (non-executing) script from the contentNode
494                original.parentNode.removeChild(original)
495
496                // Add script to head
497                document.head.appendChild(script);
498            }
499
500            return contentNode;
501        }
502
503        const replace = {['+']: '-', ['/']: '_', ['=']: ','};
504        hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]);
505
506        let currentTrap;
507
508        const focusableElements = (rootElement) => {
509            const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]';
510            return Array.from(rootElement.querySelectorAll(selector))
511                .filter(el => {
512                    return el.style.display !== 'none'
513                        && !el.disabled
514                        && el.tabIndex !== -1
515                        && (el.offsetWidth || el.offsetHeight || el.getClientRects().length)
516                })
517        }
518
519        const focusTrap = (e) => {
520            const isTabPressed = e.key === 'Tab' || e.keyCode === 9;
521            if (!isTabPressed) return;
522
523            const focusable = focusableElements(currentTrap)
524            const firstFocusableElement = focusable[0]
525            const lastFocusableElement = focusable[focusable.length - 1]
526
527            e.shiftKey
528                ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault())
529                : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault())
530        };
531
532        hyva.releaseFocus = (rootElement) => {
533            if (currentTrap && (!rootElement || rootElement === currentTrap)) {
534                currentTrap.removeEventListener('keydown', focusTrap)
535                currentTrap = null
536            }
537        }
538        hyva.trapFocus = (rootElement) => {
539            if (!rootElement) return;
540            hyva.releaseFocus()
541            currentTrap = rootElement
542            rootElement.addEventListener('keydown', focusTrap)
543            const firstElement = focusableElements(rootElement)[0]
544            firstElement && firstElement.focus()
545        }
546
547        hyva.safeParseNumber = (rawValue) => {
548            const number = rawValue ? parseFloat(rawValue) : null;
549
550            return Array.isArray(number) || isNaN(number) ? rawValue : number;
551        }
552
553        const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('');
554        hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => {
555
556            const camelCase = toCamelCase(name);
557            const key = '__hyva_bool_' + name
558
559            return new Proxy(Object.assign(
560                additionalMethods,
561                {
562                    [key]: !!value,
563                    [name]() {return !!this[key]},
564                    ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine
565                    ['not' + camelCase]() {return !this[key]},
566                    ['toggle' + camelCase]() {this[key] = !this[key]},
567                    [`set${camelCase}True`]() {this[key] = true},
568                    [`set${camelCase}False`]() {this[key] = false},
569                }
570            ), {
571                set(target, prop, value) {
572                    return prop === name
573                        ? (target[key] = !!value)
574                        : Reflect.set(...arguments);
575                }
576            })
577        }
578
579                hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true})
580        window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true});
581                window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies())
582
583    }( window.hyva = window.hyva || {} ));
584    //# sourceURL=hyva.js
585</script>
585
586<base href="https://www.jardindupicvert.com/">
587<link rel="preconnect" href="https://fonts.googleapis.com">
588<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
589
590<link rel="preload"
591          href="https://fonts.googleapis.com/css2?family=Lora:wght@400;700&amp;family=Quicksand:wght@400;700&amp;display=swap"
592          as="style"
593    >
594<link href="https://fonts.googleapis.com/css2?family=Lora:wght@400;700&amp;family=Quicksand:wght@400;700&amp;display=swap"
595          rel="stylesheet"
596          media="print"
597          onload="this.onload=null;this.removeAttribute('media');"
598    >
599</head>
600<body id="html-body" class="cms-mentions-legales cms-page-view page-layout-1column">
vendor: 68 bytes, lines 600-601
600
601<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
601GTM-MBDD62PX
vendor: 88 bytes, lines 601-603
601"
602    height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
603
604<script>
605        console.warn(
606            `Crisp chatbox is installed but not configured -
607            To enable the chatbox please login to your store as
608            admin then go to: Stores > Settings > Configuration
609            > Crisp > Settings and configure your Crisp websiteID.`
610        );
611    </script>
611
612<div class="mst-gdpr-cookie-bar-wrapper"
613     id="gdprCookieBar"
614     x-data="initMstGdprCookieBar()"
615     x-init="initDisplay()"
616>
617<div class="fixed z-modal bottom-0 sm:bottom-4 left-0 sm:left-4 z-modal flex max-w-full sm:max-w-sm translate-y-full bg-container-darker text-white font-bold transition-transform duration-700 ease-out"
618         :class="{'opacity-70': isLoading, 'translate-y-0': isBarVisible, 'translate-y-full': !isBarVisible}"
619    >
620<div>
621<div class="flex flex-col items-center justify-center gap-2 lg:gap-8 p-8"
622                 x-show="isBarVisible"
623            >
624<div class="absolute top-2 right-2">
625<button @click="hide"
626                        aria-label="Close panel"
627                    >
628<svg class="w-4 h-4 text-white hover:text-primary-lighter">
629                            <use xlink:href="#close-symbol"></use>
630                        </svg>
631</button>
632</div>
633<div class="consent-text text-sm">
634<button
635                            class="block ml-auto mr-0 mb-4 text-white underline "
636                            data-trigger-settings="agree"
637                            x-bind:class="{'opacity-0': isLoading}"
638                            @click="handleDecline"
639                        >
640<span>Continuer sans accepter</span>
641</button>
642Les cookies nous aident à vous offrir une expérience de navigation personnalisée et mesurer notre audience. Vous pouvez les paramétrer à tout moment et consulter notre politique de confidentialité.                    <p class="mb-4">
643<a href="https://www.jardindupicvert.com/mentions-legales/"
644                           class="underline"
645                           title="Lire&#x20;notre&#x20;politique"
646                        >
647Lire notre politique                        </a>
648</p>
649</div>
650
651<div class="mst-gdpr-buttons w-full flex flex-row items-center justify-around gap-2">
652<button type="button"
653                            class="grow action btn btn-secondary justify-center text-sm w-auto bg-white text-primary"
654                            x-bind:class="{'opacity-0': isLoading}"
655                            @click="openSettings">
656<span>Paramétrer</span>
657</button>
658
659<button class="grow action btn btn-primary justify-center text-sm w-auto bg-white text-primary"
660                            data-trigger-settings="agree"
661                            x-bind:class="{'opacity-0': isLoading}"
662                            @click="handleAllow(1)"><span>Accepter</span></button>
663
664</div>
665</div>
666</div>
667<div class="mst-gdpr-cookie-bar-overlay bg-white fixed h-full left-0 opacity-60 top-0 w-full z-40"
668             style="display: none"
669             id="gdprCookieBarOverlay" x-show="isScreenLocked"
670        >
671</div>
672</div>
673</div>
674<script>
675    function initMstGdprCookieBar() {
676        'use strict';
677        const cookieGroupName = 'gdpr_cookie_groups';
678        const consentCookieName = 'gdpr_cookie_consent'
679        
680        return {
681            isLoading: false,
682            isBarVisible: false,
683            isScreenLocked: false,
684            initDisplay: function () {
685                !hyva.getCookie(cookieGroupName) || !hyva.getCookie(consentCookieName)
686                    ? this.show()
687                    : this.hide();
688                window.addEventListener('mst-gdpr-cookie-settings-save', () => {
689                    this.handleAllow();
690                })
691            },
692            show: function () {
693                this.isBarVisible = true;
694                this.isScreenLocked = window.location.href.indexOf('cookie') === -1 && 0;
695                if (this.isScreenLocked) {
696                    document.querySelector('body').style.overflow = 'hidden';
697                }
698            },
699            hide: function () {
700                this.isBarVisible = false;
701                this.isScreenLocked = false;
702                document.querySelector('body').style.overflowY = 'auto';
703                document.querySelector('body').style.overflowX = 'clip';
704            },
705            handleAllow: function (agreeAll) {
706                this.isLoading = true;
707
708                let checkedGroups = [];
709                if (agreeAll) {
710                    checkedGroups = document.querySelectorAll('.cookie-group-container .checkbox');
711                } else {
712                    checkedGroups = document.querySelectorAll('.cookie-group-container .checkbox:checked');
713                }
714
715                const checked = Array.from(checkedGroups || []);
716                const body = checked.reduce((body, item) => {
717                    body.append('group_ids[]', item.dataset.groupId);
718                    return body;
719                }, new URLSearchParams({form_key: hyva.getFormKey()}))
720
721                fetch('https://www.jardindupicvert.com/gdpr_cookie/cookie/allow/', {
722                        method: 'post',
723                        body: body,
724                        headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'}
725                })
726                    .then(() => this.hide())
727                    .finally(() => this.isLoading = false)
728            },
729
730            handleDecline: function () {
731                this.isLoading = true;
732
733                const body = new URLSearchParams({form_key: hyva.getFormKey()});
734                fetch('https://www.jardindupicvert.com/gdpr_cookie/cookie/decline/', {
735                    method: 'post',
736                    body: body,
737                    headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'}
738                })
739                    .then(() => this.hide())
740                    .finally(() => this.isLoading = false)
741            },
742
743            openSettings: function () {
744                window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-open'));
745            }
746        };
747    }
748</script>
vendor: 1 bytes, line 748
748
749<script>
750
751    (function (config) {
752        function deleteDisallowedCookies() {
753
754            if (!hyva.getCookie(config.consentCookieName)) {
755                return;
756            }
757
758            const allowedGroups = unescape(hyva.getCookie(config.groupCookieName)).split(',');
759            const groupIds = Object.keys(config.groups || {});
760            const disallowedGroupIds = groupIds.filter(groupId => !allowedGroups.includes(groupId));
761
762            setInterval(() => {
763                disallowedGroupIds.forEach(groupId => {
764                    config.groups[groupId].forEach(cookieCode => hyva.setCookie(cookieCode, '', -1));
765                });
766            }, 5000);
767        }
768
769        window.addEventListener('DOMContentLoaded', deleteDisallowedCookies, {once: true});
770
771    })({"groups":{"2":["AdWords","__Secure-3PSIDCC","SIDCC","__Secure-1PAPISID","SAPISID","SSID","__Secure-3PSIDD","__Secure-1PSIDD","__Secure-1PSIDTS","HSID","APISID","__Secure-1PSIDCC","__Secure-3PSIDTS","__Secure-3PAPISID","SID","_ga","SOCS"],"1":["Toky","user_allowed_save_cookie","intercom-device-id-cv6ld8kq","__cf_bm","intercom-id-cv6ld8kq","private_content_version","visitor_country","form_key","PHPSESSID","last_visited_store","CONSENT","section_data_ids"],"3":["_ga_RQXSGJFQ59","_ga_GJH9RGDDP5","_ga_X6LMX9VR0Y","_gid","_ga_4BXXKZJZTZ","_gcl_au","SEARCH_SAMESITE","_ga_1LGNSX0EVM","_ga_B8SKQ9HHPZ","_ga_Z574RD7GDB"]},"groupCookieName":"gdpr_cookie_groups","consentCookieName":"gdpr_cookie_consent"})
772</script>
772
773
774<div x-data="initGdprSettingsModal()"
775    x-init="init"
776    class="relative z-modal"
777>
778<div class="fixed w-full h-full flex items-center justify-center" x-show="open">
779<div class="absolute bg-black h-full opacity-50 w-full" x-on:click="close"
780             style="display: none"
781             x-show="open">
782
783</div>
784<div class="bg-white border border-gray-200 content h-full lg:max-w-4xl max-w-sm md:h-4/6 md:max-w-md overflow-auto overscroll-contain p-2 xs:p-4 sm:p-6 lg:p-8 rounded-md z-20"
785             style="display: none"
786             x-show.transition.origin.top="open">
787<div class="flex justify-between mb-3 pb-4">
788<p class="text-2xl lg:text-3xl">Privacy Overview</p>
789<div class="cursor-pointer pt-1"
790                     x-on:click="close"
791                >
792<svg class="w-8 h-8 text-primary-lighter hover:text-primary"><use xlink:href="#close-symbol"></use></svg>
793</div>
794</div>
795<div class="text-sm lf:text-base">
796This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.            </div>
797
798<div class="group-content">
799<div x-data="{open1: false}"
800     x-defer="interact"
801     class="cookie-group-container cookie-group-container-1 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm"
802     data-nosnippet
803>
804<div class="flex flex justify-between">
805<p class="title text-lg cursor-pointer"
806            x-on:click="open1 = !open1">
807<span x-show="! open1"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span>
808<span x-show="open1" style="display: none"><svg class="w-8 h-8 p-1 inline-block"><use xlink:href="#drop-down-symbol"></use></svg></span>
809Essentiels        </p>
810
811<input class="checkbox disabled:opacity-40" type="checkbox" value="1" disabled checked data-group-id="1" name="allowed-group-1">
812</div>
813<div class="content mt-4 pl-5" x-show.transition.origin.top="open1" style="display: none">
814<div>
815Ces cookies sont indispensables au bon fonctionnement de notre site et ne peuvent donc pas être désactivés sans rendre celui-ci inutilisable. Ces cookies ne stockent aucune information d’identification personnelle.	        </div>
816<div class="cookie-list text-sm hidden">
817<table class="block lg:table">
818<tr class="hidden lg:table-row border-b">
819<th class="p-2 text-left">Nom</th>
820<th class="p-2 text-left">Description</th>
821<th class="p-2 text-left">Durée max. validité</th>
822</tr>
823<tr class="block lg:table-row mb-2">
824<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CART</td>
825<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The association with your shopping cart.</td>
826<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
827</tr>
828<tr class="block lg:table-row mb-2">
829<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CATEGORY_INFO</td>
830<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Allows pages to be displayed more quickly.</td>
831<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
832</tr>
833<tr class="block lg:table-row mb-2">
834<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>COMPARE</td>
835<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The items that you have in the Compare Products list.</td>
836<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
837</tr>
838<tr class="block lg:table-row mb-2">
839<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER</td>
840<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An encrypted version of your customer id.</td>
841<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
842</tr>
843<tr class="block lg:table-row mb-2">
844<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_AUTH</td>
845<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An indicator if you are signed into the store.</td>
846<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
847</tr>
848<tr class="block lg:table-row mb-2">
849<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_INFO</td>
850<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An encrypted version of the customer group you belong to.</td>
851<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
852</tr>
853<tr class="block lg:table-row mb-2">
854<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>toky_state</td>
855<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
856<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>20 jours</td>
857</tr>
858<tr class="block lg:table-row mb-2">
859<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>user_allowed_save_cookie</td>
860<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Enregistre les préférences de l&#039;utilisateur concernant les cookies sur le site.</td>
861<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td>
862</tr>
863<tr class="block lg:table-row mb-2">
864<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>intercom-device-id-cv6ld8kq</td>
865<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant unique utilisé pour suivre les interactions de l&#039;utilisateur avec le site via Intercom.</td>
866<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>63 jours</td>
867</tr>
868<tr class="block lg:table-row mb-2">
869<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__cf_bm</td>
870<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifie de manière unique les clients individuels derrière une adresse IP partagée et applique des paramètres de sécurité par client.</td>
871<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>154 jours</td>
872</tr>
873<tr class="block lg:table-row mb-2">
874<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>intercom-id-cv6ld8kq</td>
875<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
876<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>56 jours</td>
877</tr>
878<tr class="block lg:table-row mb-2">
879<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>private_content_version</td>
880<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
881<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>55 jours</td>
882</tr>
883<tr class="block lg:table-row mb-2">
884<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>visitor_country</td>
885<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>	Choix du volet pays</td>
886<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>17 jours</td>
887</tr>
888<tr class="block lg:table-row mb-2">
889<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>form_key</td>
890<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
891<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>0</td>
892</tr>
893<tr class="block lg:table-row mb-2">
894<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>PHPSESSID</td>
895<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
896<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td>
897</tr>
898<tr class="block lg:table-row mb-2">
899<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>last_visited_store</td>
900<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
901<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>25 jours</td>
902</tr>
903<tr class="block lg:table-row mb-2">
904<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CONSENT</td>
905<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke le statut du consentement des cookies de l&#039;utilisateur pour le domaine actuel.</td>
906<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>18 jours</td>
907</tr>
908<tr class="block lg:table-row mb-2">
909<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>section_data_ids</td>
910<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
911<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
912</tr>
913</table>
914</div>
915</div>
916</div>
917<div x-data="{open2: false}"
918     x-defer="interact"
919     class="cookie-group-container cookie-group-container-2 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm"
920     data-nosnippet
921>
922<div class="flex flex justify-between">
923<p class="title text-lg cursor-pointer"
924            x-on:click="open2 = !open2">
925<span x-show="! open2"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span>
926<span x-show="open2" style="display: none"><svg class="w-8 h-8 p-1 inline-block"><use xlink:href="#drop-down-symbol"></use></svg></span>
927Cookies commerciaux        </p>
928
929<input class="checkbox disabled:opacity-40" type="checkbox" value="1"  checked data-group-id="2" name="allowed-group-2">
930</div>
931<div class="content mt-4 pl-5" x-show.transition.origin.top="open2" style="display: none">
932<div>
933Ces cookies peuvent être utilisés par ces sociétés pour établir un profil de vos intérêts et vous proposer des publicités pertinentes sur d&#039;autres sites Web. Ils ne stockent pas directement des données personnelles, mais sont basés sur l&#039;identification unique de votre navigateur et de votre appareil Internet. Si vous n&#039;
933autorisez pas ces cookies, vous ne serez pas nécessairement moins ciblé(e) par des publicités, mais celles-ci seront moins ciblées.        </div>
934<div class="cookie-list text-sm hidden">
935<table class="block lg:table">
936<tr class="hidden lg:table-row border-b">
937<th class="p-2 text-left">Nom</th>
938<th class="p-2 text-left">Description</th>
939<th class="p-2 text-left">Durée max. validité</th>
940</tr>
941<tr class="block lg:table-row mb-2">
942<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_SEGMENT_IDS</td>
943<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stores your Customer Segment ID</td>
944<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
945</tr>
946<tr class="block lg:table-row mb-2">
947<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>EXTERNAL_NO_CACHE</td>
948<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>A flag that, indicates whether caching is on or off.</td>
949<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
950</tr>
951<tr class="block lg:table-row mb-2">
952<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>FRONTEND</td>
953<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Your session ID on the server.</td>
954<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
955</tr>
956<tr class="block lg:table-row mb-2">
957<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>GUEST-VIEW</td>
958<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Allows guests to edit their orders.</td>
959<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
960</tr>
961<tr class="block lg:table-row mb-2">
962<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>LAST_CATEGORY</td>
963<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The last category you visited.</td>
964<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
965</tr>
966<tr class="block lg:table-row mb-2">
967<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>LAST_PRODUCT</td>
968<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The last product you looked at.</td>
969<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
970</tr>
971<tr class="block lg:table-row mb-2">
972<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>NEWMESSAGE</td>
973<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Indicates whether a new message has been received.</td>
974<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
975</tr>
976<tr class="block lg:table-row mb-2">
977<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>NO_CACHE</td>
978<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Indicates whether it is allowed to use cache.</td>
979<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
980</tr>
981<tr class="block lg:table-row mb-2">
982<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>PERSISTENT_SHOPPING_CART</td>
983<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>A link to information about your cart and viewing history if you have asked the site.</td>
984<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
985</tr>
986<tr class="block lg:table-row mb-2">
987<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>1P_JAR</td>
988<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Service &#039;Google Ads Optimization&#039; pour la délivrance de publicités ciblées</td>
989<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>18 jours</td>
990</tr>
991<tr class="block lg:table-row mb-2">
992<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDCC</td>
993<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations sur l&#039;utilisation du site pour les annonces Google.</td>
994<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>90 jours</td>
995</tr>
996<tr class="block lg:table-row mb-2">
997<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SIDCC</td>
998<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session Google utilisé pour maintenir l&#039;intégrité et la sécurité de votre session lors de l&#039;utilisation des services Google.</td>
999<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>81 jours</td>
1000</tr>
1001<tr class="block lg:table-row mb-2">
1002<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PAPISID</td>
1003<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour livrer des annonces plus pertinentes et pour améliorer les rapports de performance des campagnes publicitaires.</td>
1004<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>51 jours</td>
1005</tr>
1006<tr class="block lg:table-row mb-2">
1007<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SAPISID</td>
1008<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant unique utilisé pour suivre les préférences de l&#039;utilisateur et fournir des recommandations de contenu personnalisé.</td>
1009<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td>
1010</tr>
1011<tr class="block lg:table-row mb-2">
1012<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SSID</td>
1013<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations telles que la langue préférée de l&#039;utilisateur afin de personnaliser l&#039;expérience de navigation.</td>
1014<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>21 jours</td>
1015</tr>
1016<tr class="block lg:table-row mb-2">
1017<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDD</td>
1018<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour collecter des informations sur l&#039;interaction de l&#039;utilisateur avec le site Web, telles que les publicités qu&#039;il a vues et les actions qu&#039;il a entreprises.</td>
1019<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>167 jours</td>
1020</tr>
1021<tr class="block lg:table-row mb-2">
1022<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDD</td>
1023<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session utilisé pour maintenir l&#039;état de la session de l&#039;utilisateur entre les demandes de page.</td>
1024<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>167 jours</td>
1025</tr>
1026<tr class="block lg:table-row mb-2">
1027<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDTS</td>
1028<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour mesurer les performances du site et analyser les modèles de trafic des utilisateurs.</td>
1029<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>93 jours</td>
1030</tr>
1031<tr class="block lg:table-row mb-2">
1032<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>HSID</td>
1033<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session utilisé pour maintenir l&#039;état de la session de l&#039;utilisateur.</td>
1034<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>21 jours</td>
1035</tr>
1036<tr class="block lg:table-row mb-2">
1037<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>
1037APISID</td>
1038<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifie de manière unique votre navigateur pour fournir des publicités et des services personnalisés sur Google.</td>
1039<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>40 jours</td>
1040</tr>
1041<tr class="block lg:table-row mb-2">
1042<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDCC</td>
1043<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1044<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>0</td>
1045</tr>
1046<tr class="block lg:table-row mb-2">
1047<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDTS</td>
1048<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour collecter des informations sur l&#039;interaction de l&#039;utilisateur avec le site Web</td>
1049<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>93 jours</td>
1050</tr>
1051<tr class="block lg:table-row mb-2">
1052<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PAPISID</td>
1053<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1054<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>51 jours</td>
1055</tr>
1056<tr class="block lg:table-row mb-2">
1057<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SID</td>
1058<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session.</td>
1059<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>156 jours</td>
1060</tr>
1061<tr class="block lg:table-row mb-2">
1062<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga</td>
1063<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour collecter des données sur le comportement des utilisateurs sur le site.</td>
1064<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>30 jours</td>
1065</tr>
1066<tr class="block lg:table-row mb-2">
1067<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SOCS</td>
1068<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations sur les préférences de l&#039;utilisateur et aide à personnaliser l&#039;expérience de navigation.</td>
1069<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>58 jours</td>
1070</tr>
1071</table>
1072</div>
1073</div>
1074</div>
1075<div x-data="{open3: false}"
1076     x-defer="interact"
1077     class="cookie-group-container cookie-group-container-3 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm"
1078     data-nosnippet
1079>
1080<div class="flex flex justify-between">
1081<p class="title text-lg cursor-pointer"
1082            x-on:click="open3 = !open3">
1083<span x-show="! open3"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span>
1084<span x-show="open3" style="display: none"><svg class="w-8 h-8 p-1 inline-block"><use xlink:href="#drop-down-symbol"></use></svg></span>
1085Analyse &amp; performances        </p>
1086
1087<input class="checkbox disabled:opacity-40" type="checkbox" value="1"  checked data-group-id="3" name="allowed-group-3">
1088</div>
1089<div class="content mt-4 pl-5" x-show.transition.origin.top="open3" style="display: none">
1090<div>
1091Ces cookies nous permettent d&#039;évaluer le nombre de visites et l&#039;origines des requêtes afin de mesurer et d’améliorer les performances de notre site. Ils nous aident également à identifier les pages les plus / moins visitées afin d&#039;améliorer nos contenus. Les données liées à ces cookies sont agrégées et anonymisées.        </div>
1092<div class="cookie-list text-sm hidden">
1093<table class="block lg:table">
1094<tr class="hidden lg:table-row border-b">
1095<th class="p-2 text-left">Nom</th>
1096<th class="p-2 text-left">Description</th>
1097<th class="p-2 text-left">Durée max. validité</th>
1098</tr>
1099<tr class="block lg:table-row mb-2">
1100<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>RECENTLYCOMPARED</td>
1101<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The items you recently compared.</td>
1102<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1103</tr>
1104<tr class="block lg:table-row mb-2">
1105<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>STF</td>
1106<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Information on products you emailed to friends.</td>
1107<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1108</tr>
1109<tr class="block lg:table-row mb-2">
1110<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>STORE</td>
1111<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The store view or language you have selected.</td>
1112<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1113</tr>
1114<tr class="block lg:table-row mb-2">
1115<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>USER_ALLOWED_SAVE_COOKIE</td>
1116<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Indicates whether a customer authorized cookies.</td>
1117<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1118</tr>
1119<tr class="block lg:table-row mb-2">
1120<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>VIEWED_PRODUCT_IDS</td>
1121<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The products that you recently looked at.</td>
1122<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1123</tr>
1124<tr class="block lg:table-row mb-2">
1125<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>WISHLIST</td>
1126<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An encrypted list of products added to your wish list.</td>
1127<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1128</tr>
1129<tr class="block lg:table-row mb-2">
1130<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>WISHLIST_CNT</td>
1131<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The number of items in your wish list.</td>
1132<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1133</tr>
1134<tr class="block lg:table-row mb-2">
1135<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_RQXSGJFQ59</td>
1136<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td>
1137<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1138</tr>
1139<tr class="block lg:table-row mb-2">
1140<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_GJH9RGDDP5</td>
1141<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td>
1142<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1143</tr>
1144<tr class="block lg:table-row mb-2">
1145<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_X6LMX9VR0Y</td>
1146<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td>
1147<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>60 jours</td>
1148</tr>
1149<tr class="block lg:table-row mb-2">
1150<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_gid</td>
1151<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td>
1152<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>30 jours</td>
1153</tr>
1154<tr class="block lg:table-row mb-2">
1155<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_4BXXKZJZTZ</td>
1156<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td>
1157<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1158</tr>
1159<tr class="block lg:table-row mb-2">
1160<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_gcl_au</td>
1161<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé par Google AdSense pour expérimenter l&#039;
1161efficacité de la publicité sur les sites Web utilisant leurs services.</td>
1162<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>31 jours</td>
1163</tr>
1164<tr class="block lg:table-row mb-2">
1165<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SEARCH_SAMESITE</td>
1166<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations sur les paramètres de même site pour garantir le bon fonctionnement des fonctionnalités du site.</td>
1167<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>23 jours</td>
1168</tr>
1169<tr class="block lg:table-row mb-2">
1170<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_1LGNSX0EVM</td>
1171<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td>
1172<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1173</tr>
1174<tr class="block lg:table-row mb-2">
1175<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_B8SKQ9HHPZ</td>
1176<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td>
1177<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1178</tr>
1179<tr class="block lg:table-row mb-2">
1180<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_Z574RD7GDB</td>
1181<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur le comportement des utilisateurs sur le site.</td>
1182<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>60 jours</td>
1183</tr>
1184</table>
1185</div>
1186</div>
1187</div>
1188</div>
1189<button class="btn btn-primary mx-auto mt-4 text-sm cursor-pointer"
1190                    x-on:click="save"><span>Enregistrer</span></button>
1191</div>
1192</div>
1193</div>
1194<script>
1195    function initGdprSettingsModal() {
1196        return {
1197            open: false,
1198            close: function () {
1199                this.open = false;
1200                document.querySelector('body').style.overflowY = 'auto';
1201                document.querySelector('body').style.overflowX = 'clip';
1202            },
1203            init: function () {
1204                window.addEventListener('mst-gdpr-cookie-settings-open', () => {
1205                    document.querySelector('body').style.overflow = 'hidden';
1206                    this.open = true;
1207                })
1208            },
1209            save: function () {
1210                window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-save'));
1211                this.close();
1212            }
1213        };
1214    }
1215</script>
1215
1216<input name="form_key" type="hidden" value="jIeQ6NmqNDPAX5IC" />
1217<noscript>
1218        <section
1219            class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"
1220            aria-labelledby="messageGlobalNoScriptMessage"
1221        >
1222            <div class="container text-center">
1223                <p id="messageGlobalNoScriptMessage">
1224                    <strong>Javascript est désactivé dans votre navigateur.</strong>
1225                    <span>
1226                        Pour une meilleure expérience sur notre site, assurez-vous d’activer JavaScript dans votre navigateur.                    </span>
1227                </p>
1228            </div>
1229        </section>
1230    </noscript>
1231
1232
1233<span class="sr-only">
1234<svg width="0" height="0" xmlns="http://www.w3.org/2000/svg">
1235        <symbol id="account-symbol" viewBox="0 0 1024 1024">
1236            <path d="M615.424 400.384c64.512-36.864 108.544-105.472 108.544-184.32 0-124.928-108.544-225.28-236.544-210.944-92.16 10.24-169.984 83.968-184.32 176.128-14.336 93.184 31.744 177.152 105.472 219.136-140.288 37.888-242.688 150.528-242.688 283.648v335.872h692.224v-335.872c0-133.12-102.4-245.76-242.688-283.648zM367.616 256c-30.72-113.664 71.68-216.064 185.344-185.344 50.176 13.312 91.136 54.272 104.448 104.448 30.72 114.688-71.68 216.064-185.344 185.344-50.176-13.312-91.136-54.272-104.448-104.448zM797.696 958.464h-570.368v-274.432c0-130.048 128-235.52 284.672-235.52s285.696 105.472 285.696 235.52v274.432z" fill="currentColor"></path>
1237        </symbol>
1238
1239        <symbol id="alert-symbol" viewBox="0 0 24 24" fill="none">
1240            <path fill-rule="evenodd" d="M11.7489 3.5C11.4427 3.5 11.1526 3.61885 10.9416 3.82474C10.7312 4.03002 10.6165 4.30445 10.6165 4.5866V4.87466C10.6165 5.20192 10.4043 5.4914 10.0922 5.58989C9.00929 5.93166 8.06855 6.59852 7.40304 7.49118C6.73775 8.38355 6.38102 9.45633 6.38123 10.5554V14.2282L6.38123 14.2309C6.38036 14.4744 6.28111 14.7041 6.11104 14.8712C5.94158 15.0377 5.71552 15.1294 5.48271 15.1318L5.47564 15.1318C5.21104 15.1321 4.96095 15.2349 4.77937 15.4121C4.59846 15.5887 4.50022 15.8241 4.5 16.0656V16.9832C4.50024 16.9839 4.50107 16.9856 4.50349 16.988C4.50859 16.9929 4.51934 16.9989 4.53431 16.9989L18.9657 17C18.9657 17 18.9657 17 18.9657 17C18.9806 17 18.9914 16.994 18.9965 16.9891C18.9989 16.9867 18.9998 16.985 19 16.9843V16.0661C18.9998 15.8244 18.9014 15.5888 18.7202 15.4121C18.5385 15.2348 18.2882 15.132 18.0235 15.1318C17.9077 15.1319 17.7925 15.1099 17.6845 15.0665C17.5745 15.0224 17.4735 14.9569 17.3878 14.873C17.302 14.789 17.2332 14.6881 17.1863 14.5758C17.1402 14.4652 17.1165 14.3462 17.1171 14.2257C17.1171 14.2238 17.1171 14.2218 17.1171 14.2199L17.8671 14.2282H17.1171V14.2257V10.5556C17.1172 9.45642 16.7604 8.38354 16.095 7.49117C15.4294 6.5985 14.4886 5.93166 13.4055 5.5899C13.0934 5.49141 12.8812 5.20193 12.8812 4.87466V4.5866C12.8812 4.30446 12.7665 4.03002 12.5561 3.82474C12.3451 3.61885 12.0551 3.5 11.7489 3.5ZM9.89409 2.75111C10.3891 2.26815 11.0566 2 11.7489 2C12.4411 2 13.1087 2.26815 13.6037 2.75111C14.0409 3.17771 14.3118 3.74149 14.3696 4.34352C15.534 4.81382 16.5489 5.59058 17.2975 6.59453C18.1542 7.74353 18.6172 9.13026 18.6171 10.5556C18.6171 10.5556 18.6171 10.5555 18.6171 10.5556V13.7029C19.0473 13.8074 19.4461 14.0247 19.7676 14.3383C20.2337 14.7929 20.4993 15.4134 20.5 16.0646V16.9847C20.5 17.3926 20.3338 17.78 20.044 18.0627C19.755 18.3447 19.3667 18.5 18.9657 18.5L15.425 18.4997C15.0777 20.2115 13.5643 21.5 11.75 21.5C9.93549 21.5 8.42198 20.2113 8.07485 18.4992L4.53431 18.4989C4.53429 18.4989 4.53433 18.4989 4.53431 18.4989C4.13328 18.4989 3.74502 18.3436 3.45595 18.0616C3.16625 17.7789 3 17.3916 3 16.9837V16.0654C3.00043 15.4143 3.26581 14.7934 3.73166 14.3387C4.0529 14.0252 4.4513 13.8079 4.88123 13.7032V10.5557C4.88123 10.5557 4.88123 10.5557 4.88123 10.5557C4.88099 9.13047 5.34385 7.74362 6.20047 6.59462C6.94896 5.59066 7.96386 4.81385 9.12816 4.34354C9.18594 3.7415 9.45686 3.17771 9.89409 2.75111ZM9.62778 18.4993C9.93646 19.3736 10.7701 20 11.75 20C12.7298 20 13.5633 19.3737 13.8721 18.4996L9.62778 18.4993ZM18.6171 14.2365V14.2282C18.6171 14.231 18.6171 14.2338 18.6171 14.2365Z" fill="currentColor"/>
1241        </symbol>
1242
1243        <symbol id="basket-symbol" viewBox="0 0 1024 1024" fill="none">
1244            <path d="M986.112 414.72h-196.608l-142.336-344.064c-7.168-17.408-26.624-25.6-44.032-18.432s-24.576 26.624-18.432 44.032l133.12 318.464h-411.648l133.12-318.464c7.168-17.408-1.024-36.864-18.432-44.032s-36.864 1.024-43.008 18.432l-143.36 344.064h-196.608c-18.432 0-32.768 15.36-32.768 33.792s14.336 33.792 32.768 33.792h20.48l65.536 357.376c14.336 77.824 81.92 134.144 160.768 134.144h455.68c78.848 0 146.432-56.32 160.768-134.144l
124465.536-357.376h19.456c18.432 0 33.792-15.36 33.792-33.792-1.024-18.432-15.36-33.792-33.792-33.792zM834.56 827.392c-8.192 46.080-48.128 79.872-95.232 79.872h-454.656c-47.104 0-87.040-33.792-95.232-79.872l-63.488-344.064h772.096l-63.488 344.064z" fill="currentColor"/>
1245        </symbol>
1246
1247        <symbol id="calendar-symbol" viewBox="0 0 24 24">
1248            <path fill-rule="evenodd" d="M7.25 2C6.00736 2 5 3.00736 5 4.25V5H4.75C3.23122 5 2 6.23122 2 7.75V18.75C2 20.2688 3.23122 21.5 4.75 21.5H18.75C20.2688 21.5 21.5 20.2688 21.5 18.75V7.75C21.5 6.23122 20.2688 5 18.75 5H18.5V4.25C18.5 3.00736 17.4926 2 16.25 2C15.0074 2 14 3.00736 14 4.25V5H9.5V4.25C9.5 3.00736 8.49264 2 7.25 2ZM16.25 3.5C16.6642 3.5 17 3.83579 17 4.25V5.75V7.75C17 8.16421 16.6642 8.5 16.25 8.5C15.8358 8.5 15.5 8.16421 15.5 7.75V5.75V4.25C15.5 3.83579 15.8358 3.5 16.25 3.5ZM14 7.75V6.5H9.5V7.75C9.5 8.99264 8.49264 10 7.25 10C6.00736 10 5 8.99264 5 7.75V6.5H4.75C4.05964 6.5 3.5 7.05964 3.5 7.75V11.25H20V7.75C20 7.05964 19.4404 6.5 18.75 6.5H18.5V7.75C18.5 8.99264 17.4926 10 16.25 10C15.0074 10 14 8.99264 14 7.75ZM20 12.75H3.5V18.75C3.5 19.4404 4.05964 20 4.75 20H18.75C19.4404 20 20 19.4404 20 18.75V12.75ZM8 4.25C8 3.83579 7.66421 3.5 7.25 3.5C6.83579 3.5 6.5 3.83579 6.5 4.25V5.75V7.75C6.5 8.16421 6.83579 8.5 7.25 8.5C7.66421 8.5 8 8.16421 8 7.75V5.75V4.25Z" fill="currentColor"/>
1249        </symbol>
1250
1251        <symbol id="check-symbol" viewBox="0 0 24 24">
1252            <path d="M5.52637 11.8235L10.6627 17L18.5264 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
1253        </symbol>
1254
1255        <symbol id="chevron-symbol" viewBox="0 0 288 488">
1256            <path d="M268.75 184c0 2-1 4.25-2.5 5.75l-116.5 116.5c-1.5 1.5-3.75 2.5-5.75 2.5s-4.25-1-5.75-2.5l-116.5-116.5c-1.5-1.5-2.5-3.75-2.5-5.75s1-4.25 2.5-5.75l12.5-12.5c1.5-1.5 3.5-2.5 5.75-2.5 2 0 4.25 1 5.75 2.5l98.25 98.25 98.25-98.25c1.5-1.5 3.75-2.5 5.75-2.5s4.25 1 5.75 2.5l12.5 12.5c1.5 1.5 2.5 3.75 2.5 5.75z" fill="currentColor" />
1257        </symbol>
1258
1259        <symbol id="close-symbol" viewBox="0 0 24 24">
1260            <path d="M6.2877 5.2184C5.99312 4.9272 5.51551 4.9272 5.22093 5.2184C4.92636 5.5096 4.92636 5.98172 5.22093 6.27292L11.0121 11.9976L5.22103 17.7221C4.92645 18.0133 4.92645 18.4854 5.22103 18.7766C5.51561 19.0678 5.99322 19.0678 6.2878 18.7766L12.0788 13.0521L17.7066 18.6153C18.0012 18.9065 18.4788 18.9065 18.7734 18.6153C19.068 18.3241 19.068 17.852 18.7734 17.5608L13.1456 11.9976L18.7735 6.43426C19.0681 6.14306 19.0681 5.67094 18.7735 5.37974C18.4789 5.08855 18.0013 5.08855 17.7067 5.37974L12.0788 10.943L6.2877 5.2184Z" fill="currentColor"/>
1261            <path d="M6.2877 5.2184C5.99312 4.9272 5.51551 4.9272 5.22093 5.2184C4.92636 5.5096 4.92636 5.98172 5.22093 6.27292L11.0121 11.9976L5.22103 17.7221C4.92645 18.0133 4.92645 18.4854 5.22103 18.7766C5.51561 19.0678 5.99322 19.0678 6.2878 18.7766L12.0788 13.0521L17.7066 18.6153C18.0012 18.9065 18.4788 18.9065 18.7734 18.6153C19.068 18.3241 19.068 17.852 18.7734 17.5608L13.1456 11.9976L18.7735 6.43426C19.0681 6.14306 19.0681 5.67094 18.7735 5.37974C18.4789 5.08855 18.0013 5.08855 17.7067 5.37974L12.0788 10.943L6.2877 5.2184Z" fill="currentColor"/>
1262        </symbol>
1263
1264        <symbol id="delete-symbol" viewBox="0 0 804 1024">
1265            <path d="M292.864 420.864v328.704q0 8.192-5.12 13.312t-13.312 5.12h-36.864q-8.192 0-13.312-5.12t-5.12-13.312v-328.704q0-8.192 5.12-13.312t13.312-5.12h36.864q8.192 0 13.312 5.12t5.12 13.312zM439.296 420.864v328.704q0 8.192-5.12 13.312t-13.312 5.12h-36.864q-8.192 0-13.312-5.12t-5.12-13.312v-328.704q0-8.192 5.12-13.312t13.312-5.12h36.864q8.192 0 13.312 5.12t5.12 13.312zM584.704 420.864v328.704q0 8.192-5.12 13.312t-12.288 5.12h-36.864q-8.192 0-13.312-5.12t-5.12-13.312v-328.704q0-8.192 5.12-13.312t13.312-5.12h36.864q7.168 0 12.288 5.12t5.12 13.312zM658.432 834.56v-541.696h-512v541.696q0 12.288 4.096 22.528t8.192 15.36 6.144 5.12h475.136q2.048 0 6.144-5.12t8.192-15.36 4.096-22.528zM274.432 219.136h256l-27.648-66.56q-4.096-5.12-9.216-6.144h-181.248q-6.144 1.024-10.24 6.144zM804.864 237.568v36.864q0 8.192-5.12 13.3
126512t-13.312 5.12h-55.296v541.696q0 47.104-26.624 81.92t-64.512 34.816h-475.136q-37.888 0-64.512-33.792t-27.648-80.896v-543.744h-54.272q-8.192 0-13.312-5.12t-5.12-13.312v-36.864q0-8.192 5.12-13.312t13.312-5.12h176.128l39.936-95.232q9.216-21.504 31.744-35.84t45.056-15.36h182.272q23.552 0 45.056 15.36t30.72 35.84l39.936 95.232h177.152q8.192 0 13.312 5.12t5.12 13.312z" fill=""currentColor"/>
1266        </symbol>
1267
1268        <symbol id="edit-symbol" viewBox="0 0 878 1024">
1269            <path d="M207.872 877.568l51.2-52.224-134.144-134.144-52.224 52.224v61.44h73.728v72.704h61.44zM505.856 347.136q0-12.288-12.288-12.288-5.12 0-9.216 4.096l-310.272 309.248q-4.096 4.096-4.096 10.24 0 12.288 13.312 12.288 5.12 0 9.216-4.096l310.272-309.248q3.072-4.096 3.072-10.24zM475.136 237.568l237.568 237.568-475.136 476.16h-237.568v-238.592zM865.28 292.864q0 29.696-20.48 51.2l-95.232 95.232-237.568-238.592 95.232-94.208q20.48-21.504 51.2-21.504 29.696 0 52.224 21.504l134.144 134.144q20.48 22.528 20.48 52.224z" fill="currentColor"/>
1270        </symbol>
1271
1272        <symbol id="filter-symbol" viewBox="0 0 1024 1024">
1273            <path d="M801.792 168.96q9.216 22.528-8.192 39.936l-281.6 281.6v423.936q0 23.552-22.528 33.792-7.168 3.072-14.336 3.072-15.36 0-25.6-11.264l-146.432-146.432q-10.24-11.264-10.24-25.6v-277.504l-281.6-281.6q-18.432-17.408-8.192-39.936 9.216-22.528 33.792-22.528h731.136q23.552 0 33.792 22.528z" fill="currentColor"></path>
1274        </symbol>
1275
1276        <symbol id="flower-symbol" viewBox="0 0 16 16">
1277            <path clip-rule="evenodd" d="M5.99999 2C5.99999 0.895431 6.89542 0 7.99999 0C9.10456 0 9.99999 0.895431 9.99999 2V2.0359L10.0311 2.01795C10.9877 1.46566 12.2108 1.79341 12.7631 2.75C13.3154 3.70659 12.9877 4.92977 12.0311 5.48205L12 5.5L12.0311 5.51795C12.9877 6.07023 13.3154 7.29342 12.7631 8.25C12.2108 9.20658 10.9877 9.53434 10.0311 8.98205L9.99999 8.9641V9C9.99999 10.1046 9.10456 11 7.99999 11C6.89542 11 5.99999 10.1046 5.99999 9V8.9641L5.9689 8.98205C5.01232 9.53434 3.78914 9.20658 3.23685 8.25C2.68457 7.29342 3.01232 6.07023 3.9689 5.51795L3.99999 5.5L3.9689 5.48205C3.01232 4.92977 2.68457 3.70659 3.23685 2.75C3.78913 1.79341 5.01232 1.46566 5.9689 2.01795L5.99999 2.0359V2ZM9.99999 5.5C9.99999 6.60457 9.10456 7.5 7.99999 7.5C6.89542 7.5 5.99999 6.60457 5.99999 5.5C5.99999 4.39543 6.89542 3.5 7.99999 3.5C9.10456 3.5 9.99999 4.39543 9.99999 5.5Z" fill="currentColor" fill-rule="evenodd"/><path d="M7 16H6C3.23858 16 1 13.7614 1 11V10H2C4.76142 10 7 12.2386 7 15V16Z" fill="currentColor"/><path d="M10 16H9V15C9 12.2386 11.2386 10 14 10H15V11C15 13.7614 12.7614 16 10 16Z" fill="currentColor"/>
1278        </symbol>
1279
1280        <symbol id="heart-empty-symbol" viewBox="0 0 24 24">
1281            <path d="M2.75 9.39995L2.75 9.39982C2.74989 8.78186 2.87296 8.17008 3.11201 7.60023C3.35106 7.03038 3.7013 6.51389 4.14226 6.08095C4.58321 5.64801 5.10604 5.30731 5.68018 5.07876C6.25432 4.8502 6.86826 4.73838 7.48611 4.74982L7.49505 4.74999L7.50398 4.74994C8.24667 4.74599 8.98171 4.89994 9.66039 5.20158C10.3391 5.50322 10.9459 5.94565 11.4406 6.49956L12 7.12582L12.5594 6.49956C13.0541 5.94565 13.6609 5.50322 14.3396 5.20158C15.0183 4.89994 15.7533 4.74599 16.496 4.74994L16.505 4.74999L16.5139 4.74982C17.1317 4.73838 17.7457 4.8502 18.3198 5.07876C18.894 5.30731 19.4168 5.64801 19.8577 6.08095C20.2987 6.51389 20.6489 7.03038 20.888 7.60023C21.127 8.17008 21.2501 8.78186 21.25 9.39982V9.39995C21.25 11.773 19.8337 13.9394 17.8233 15.9824C16.8278 16.994 15.7154 17.9469 14.613 18.8557C14.2997 19.114 13.9855 19.3701 13.6749 19.6232C13.0944 20.0963 12.5268 20.5589 12.0024 21.0056C11.4518 20.5326 10.8538 20.0437 10.2429 19.5442C9.96049 19.3133 9.67529 19.0801 9.39074 18.8452C8.28813 17.9349 7.1753 16.9831 6.17907 15.9731C4.16742 13.9337 2.75 11.7743 2.75 9.39995Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none" />
1282        </symbol>
1283
1284        <symbol id="heart-full-symbol" viewBox="0 0 128 128">
1285            <path d="M88.064 9.344c-8.832 0 -17.152 2.944 -24.064 8.192 -6.784 -5.248 -15.232 -8.192 -24.064 -8.192C18.304 9.344 0.64 27.008 0.64 48.768c0 10.368 3.328 20.608 10.112 30.336C1
12855.744 86.4 22.784 93.44 31.36 100.096c13.952 10.496 27.648 16.384 29.184 17.152L64 118.656l3.328 -1.408c0.64 -0.256 14.976 -6.144 29.312 -17.024 8.576 -6.528 15.616 -13.568 20.608 -20.992 6.784 -9.728 10.112 -19.968 10.112 -30.464 0 -21.76 -17.664 -39.424 -39.296 -39.424" fill="currentColor"/>
1286        </symbol>
1287
1288        <symbol id="help-symbol" viewBox="0 0 24 24" fill="none">
1289            <path d="M11.6304 2C13.4784 2 14.9717 2.52267 16.1104 3.568C17.249 4.61333 17.8184 6.01333 17.8184 7.768C17.8184 9.728 17.2117 11.184 15.9984 12.136C14.785 13.0693 13.1424 13.536 11.0704 13.536L10.9864 16.196H8.77436L8.66236 11.772H9.47436C11.3224 11.772 12.769 11.492 13.8144 10.932C14.8597 10.372 15.3824 9.31733 15.3824 7.768C15.3824 6.648 15.0464 5.76133 14.3744 5.108C13.7024 4.45467 12.797 4.128 11.6584 4.128C10.501 4.128 9.58636 4.44533 8.91436 5.08C8.26102 5.696 7.93436 6.54533 7.93436 7.628H5.52636C5.52636 6.508 5.77836 5.528 6.28236 4.688C6.78636 3.82933 7.49569 3.16667 8.41036 2.7C9.34369 2.23333 10.417 2 11.6304 2ZM9.86636 21.936C9.38102 21.936 8.97036 21.768 8.63436 21.432C8.29836 21.096 8.13036 20.6853 8.13036 20.2C8.13036 19.7147 8.29836 19.304 8.63436 18.968C8.97036 18.632 9.38102 18.464 9.86636 18.464C10.333 18.464 10.725 18.632 11.0424 18.968C11.3784 19.304 11.5464 19.7147 11.5464 20.2C11.5464 20.6853 11.3784 21.096 11.0424 21.432C10.725 21.768 10.333 21.936 9.86636 21.936Z" fill="currentColor"/>
1290        </symbol>
1291
1292        <symbol id="home-symbol" viewBox="0 0 30 32" fill="none">
1293            <path d="M25.143 18v8.571c0 0.625-0.518 1.143-1.143 1.143h-6.857v-6.857h-4.571v6.857h-6.857c-0.625 0-1.143-0.518-1.143-1.143v-8.571c0-0.036 0.018-0.071 0.018-0.107l10.268-8.464 10.268 8.464c0.018 0.036 0.018 0.071 0.018 0.107zM29.125 16.768l-1.107 1.321c-0.089 0.107-0.232 0.179-0.375 0.196h-0.054c-0.143 0-0.268-0.036-0.375-0.125l-12.357-10.304-12.357 10.304c-0.125 0.089-0.268 0.143-0.429 0.125-0.143-0.018-0.286-0.089-0.375-0.196l-1.107-1.321c-0.196-0.232-0.161-0.607 0.071-0.804l12.839-10.696c0.75-0.625 1.964-0.625 2.714 0l4.357 3.643v-3.482c0-0.321 0.25-0.571 0.571-0.571h3.429c0.321 0 0.571 0.25 0.571 0.571v7.286l3.911 3.25c0.232 0.196 0.268 0.571 0.071 0.804z" fill="currentColor"></path>
1294        </symbol>
1295
1296        <symbol id="hourglass-symbol" viewBox="0 0 24 24" fill="none">
1297            <path fill-rule="evenodd" d="M4.25 5C4.25 4.58579 4.58579 4.25 5 4.25H7.00001H18H20C20.4142 4.25 20.75 4.58579 20.75 5C20.75 5.41421 20.4142 5.75 20 5.75H18.721C18.495 8.65565 16.9687 11.1813 14.75 12.2355V12.7644C16.9687 13.8186 18.495 16.3443 18.721 19.25H20C20.4142 19.25 20.75 19.5858 20.75 20C20.75 20.4142 20.4142 20.75 20 20.75H5C4.58579 20.75 4.25 20.4142 4.25 20C4.25 19.5858 4.58579 19.25 5 19.25H6.27905C6.50495 16.3443 8.03133 13.8186 10.25 12.7644V12.2355C8.03134 11.1813 6.50497 8.65565 6.27905 5.75H5C4.58579 5.75 4.25 5.41421 4.25 5ZM11.254 11.0308C9.48502 10.394 8.02125 8.36874 7.78371 5.75001L12.5 5.75005H12.5L17.2163 5.75001C16.9788 8.36874 15.515 10.394 13.746 11.0308C13.4484 11.1379 13.25 11.4202 13.25 11.7365V13.2635C13.25 13.5797 13.4484 13.862 13.746 13.9691C15.515 14.6059 16.9788 16.6312 17.2163 19.2499L12.5 19.2499L7.78371 19.2499C8.02125 16.6312 9.48502 14.6059 11.254 13.9691C11.5516 13.862 11.75 13.5797 11.75 13.2635V11.7365C11.75 11.4202 11.5516 11.1379 11.254 11.0308Z" fill="currentColor"/>
1298        </symbol>
1299
1300        <symbol id="info-symbol" viewBox="0 0 24 24">
1301            <path fill-rule="evenodd" d="M12 2.69231C6.8595 2.69231 2.69231 6.8595 2.69231 12C2.69231 17.1405 6.8595 21.3077 12 21.3077C17.1405 21.3077 21.3077 17.1405 21.3077 12C21.3077 6.8595 17.1405 2.69231 12 2.69231ZM1 12C1 5.92487 5.92487 1 12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12ZM12 10.8718C12.6231 10.8718 13.1282 11.3769 13.1282 12V16.5128C13.1282 17.1359 12.6231 17.641 12 17.641C11.3769 17.641 10.8718 17.1359 10.8718 16.5128V12C10.8718 11.3769 11.3769 10.8718 12 10.8718ZM12 8.61539C12.6231 8.61539 13.1282 8.11027 13.1282 7.48718C13.1282 6.86409 12.6231 6.35897 12 6.35897C11.3769 6.35897 10.8718 6.86409 10.8718 7.48718C10.8718 8.11027 11.3769 8.61539 12 8.61539Z" fill="currentColor"/>
1302        </symbol>
1303
1304        <symbol id="logout-symbol" viewBox="0 0 384 448">
1305            <path d="M384 224c0 105.75-86.25 192-192 192s-192-86.25-192-192c0-60.75 28-116.75 76.75-153.25 14.25-10.75 34.25-8 44.75 6.25 10.75 14 7.75 34.25-6.25 44.75-32.5 24.5-51.25 61.75-51.25 102.25 0 70.5 57.5 128 128 128s128-57.5 128-128c0-40.5-18.75-77.75-51.25-102.25-14-10.5-17-30.75-6.25-44.75 10.5-14.25 30.75-17 44.75-6.25 48.75 36.5 76.75 92.5 76.75 153.25zM224 32v160c0 17.5-14.5 32-32 32s-32-14.5-32-32v-160c0-17.5 14.5-32 32-32s32 14.5 32 32z" fill="currentColor"></path>
1306        </symbol>
1307
1308        <symbol id="map-marker-symbol" viewBox="0 0 18 32">
1309            <path d="M13.714 11.714c0-2.518-2.054-4.571-4.571-4.571s-4.571 2.054-4.571 4.571 2.054 4.571 4.571 4.571 4.571-2.054 4.571-4.571zM18.286 11.714c0 1.089-0.
1309125 2.214-0.589 3.196l-6.5 13.821c-0.375 0.786-1.196 1.268-2.054 1.268s-1.679-0.482-2.036-1.268l-6.518-13.821c-0.464-0.982-0.589-2.107-0.589-3.196 0-5.054 4.089-9.143 9.143-9.143s9.143 4.089 9.143 9.143z" fill="currentColor"></path>
1310        </symbol>
1311
1312        <symbol id="search-symbol" viewBox="0 0 24 24" fill="none">
1313            <circle cx="11" cy="10" r="8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1314            <path d="M16.3334 16.6667L21 21.3334" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1315        </symbol>
1316
1317        <symbol id="sort-symbol" viewBox="0 0 1024 1024">
1318            <path d="M680.96 233.472h100.352l-40.96-124.928-6.144-26.624q-2.048-9.216-2.048-11.264h-2.048l-1.024 11.264q0 0-2.048 10.24t-5.12 16.384zM420.864 823.296q0 6.144-6.144 13.312l-182.272 182.272q-5.12 5.12-13.312 5.12-6.144 0-12.288-5.12l-183.296-183.296q-8.192-9.216-4.096-19.456 4.096-11.264 17.408-11.264h109.568v-786.432q0-8.192 5.12-13.312t13.312-5.12h109.568q8.192 0 13.312 5.12t5.12 13.312v786.432h109.568q8.192 0 13.312 5.12t5.12 13.312zM898.048 890.88v133.12h-333.824v-51.2l210.944-302.080q7.168-11.264 12.288-16.384l6.144-5.12v-1.024q-1.024 0-3.072 0t-5.12 0q-6.144 2.048-16.384 2.048h-133.12v65.536h-68.608v-131.072h324.608v51.2l-210.944 303.104q-4.096 4.096-12.288 14.336l-6.144 7.168v1.024l8.192-1.024q5.12-2.048 16.384-2.048h142.336v-67.584h68.608zM949.248 377.856v61.44h-164.864v-61.44h43.008l-26.624-81.92h-139.264l-26.624 81.92h43.008v61.44h-163.84v-61.44h39.936l131.072-377.856h93.184l131.072 377.856h39.936z" fill="currentColor"/>
1319        </symbol>
1320
1321        <symbol id="star-symbol" viewBox="0 0 24 24">
1322            <path fill-rule="evenodd" d="M12.7102 1.75862C12.6068 1.45452 12.3212 1.25 12.0001 1.25C11.6789 1.25 11.3933 1.45452 11.29 1.75862L10.0763 5.32895C9.35275 7.45766 7.354 8.88932 5.10566 8.88932H1.00006C0.672189 8.88932 0.382323 9.10229 0.284334 9.41517C0.186345 9.72805 0.302947 10.0683 0.572242 10.2553L3.65737 12.3979C5.58097 13.7338 6.38709 16.1823 5.63336 18.3997L4.49158 21.7586C4.38736 22.0652 4.49171 22.4041 4.75035 22.599C5.00899 22.7939 5.3635 22.8007 5.62949 22.616L9.00536 20.2715C10.806 19.021 13.1941 19.021 14.9947 20.2715L18.3706 22.616C18.6366 22.8007 18.9911 22.7939 19.2498 22.599C19.5084 22.4041 19.6128 22.0652 19.5085 21.7586L18.3667 18.3997C17.613 16.1823 18.4191 13.7338 20.3427 12.3979L23.4279 10.2553C23.6972 10.0683 23.8138 9.72805 23.7158 9.41517C23.6178 9.10229 23.3279 8.88932 23.0001 8.88932H18.8945C16.6461 8.88932 14.6474 7.45766 13.9238 5.32895L12.7102 1.75862Z" fill="currentColor"/>
1323        </symbol>
1324
1325        <symbol id="view-symbol" viewBox="0 0 24 24">
1326            <path fill-rule="evenodd" d="M2.56353 12.246C2.32865 12.0035 2.12553 11.7885 1.95981 11.6105C2.12553 11.4325 2.32865 11.2175 2.56353 10.9749C3.25841 10.2573 4.22661 9.30305 5.3235 8.35124C6.42359 7.39666 7.63502 6.46045 8.81682 5.7672C10.0188 5.06213 11.0934 4.66654 11.9432 4.66654C12.7931 4.66654 13.8677 5.06213 15.0697 5.7672C16.2515 6.46045 17.4629 7.39666 18.563 8.35124C19.6599 9.30305 20.6281 10.2573 21.323 10.9749C21.5578 11.2175 21.7609 11.4325 21.9267 11.6105C21.7609 11.7885 21.5578 12.0035 21.323 12.246C20.6281 12.9636 19.6599 13.9179 18.563 14.8697C17.4629 15.8243 16.2515 16.7605 15.0697 17.4538C13.8677 18.1588 12.7931 18.5544 11.9432 18.5544C11.0934 18.5544 10.0188 18.1588 8.81682 17.4538C7.63502 16.7605 6.42359 15.8243 5.3235 14.8697C4.22661 13.9179 3.25841 12.9636 2.56353 12.246ZM23.0535 11.6105C23.6802 11.0613 23.6801 11.0612 23.68 11.061L23.0535 11.6105ZM23.6796 12.1604L23.6739 12.1668L23.6578 12.1851L23.597 12.2534C23.544 12.3126 23.4665 12.3986 23.3668 12.5074C23.1676 12.725 22.8792 13.0345 22.5202 13.4053C21.803 14.1459 20.799 15.136 19.6552 16.1284C18.5146 17.1182 17.217 18.1263 15.9129 18.8912C14.629 19.6444 13.241 20.221 11.9432 20.221C10.6454 20.221 9.25751 19.6444 7.97359 18.8912C6.66953 18.1263 5.37185 17.1182 4.23126 16.1284C3.08749 15.136 2.08347 14.1459 1.3663 13.4053C1.00724 13.0345 0.718915 12.725 0.519637 12.5074C0.419974 12.3986 0.34251 12.3126 0.289532 12.2534L0.228691 12.1851L0.212564 12.1668L0.208166 12.1618L0.206247 12.1596C-0.0691805 11.8453 -0.0685328 11.3749 0.206895 11.0606C0.206759 11.0607 0.206247 11.0613 0.832948 11.6105L0.206895 11.0606L0.208166 11.0591L0.212564 11.0541L0.228691 11.0359L0.289532 10.9675C0.34251 10.9083 0.419974 10.8224 0.519637 10.7135C0.718915 10.4959 
13261.00724 10.1864 1.3663 9.81563C2.08347 9.07501 3.08749 8.085 4.23126 7.09251C5.37185 6.10279 6.66953 5.0947 7.97359 4.32972C9.25751 3.57657 10.6454 3 11.9432 3C13.241 3 14.629 3.57657 15.9129 4.32972C17.217 5.0947 18.5146 6.10279 19.6552 7.09251C20.799 8.085 21.803 9.07501 22.5202 9.81563C22.8792 10.1864 23.1676 10.4959 23.3668 10.7135C23.4665 10.8224 23.544 10.9083 23.597 10.9675L23.6578 11.0359L23.6739 11.0541L23.68 11.061C23.9554 11.3753 23.955 11.8461 23.6796 12.1604ZM23.0535 11.6105L23.6796 12.1604C23.6797 12.1602 23.6802 12.1596 23.0535 11.6105ZM9.44342 11.6105C9.44342 10.2299 10.5626 9.11065 11.9432 9.11065C13.3238 9.11065 14.443 10.2299 14.443 11.6105C14.443 12.9911 13.3238 14.1103 11.9432 14.1103C10.5626 14.1103 9.44342 12.9911 9.44342 11.6105ZM11.9432 7.44411C9.64221 7.44411 7.77687 9.30945 7.77687 11.6105C7.77687 13.9115 9.64221 15.7768 11.9432 15.7768C14.2442 15.7768 16.1096 13.9115 16.1096 11.6105C16.1096 9.30945 14.2442 7.44411 11.9432 7.44411Z" fill="currentColor"/>
1327        </symbol>
1328
1329        <symbol id="warning-symbol" viewBox="0 0 1024 1024">
1330            <path d="M584.704 785.408v-108.544q0-8.192-5.12-13.312t-12.288-5.12h-110.592q-7.168 0-12.288 5.12t-5.12 13.312v108.544q0 8.192 5.12 13.312t12.288 6.144h110.592q7.168 0 12.288-6.144t5.12-13.312zM583.68 572.416l10.24-263.168q0-6.144-5.12-10.24-7.168-6.144-14.336-6.144h-124.928q-6.144 0-14.336 6.144-5.12 4.096-5.12 12.288l9.216 261.12q0 5.12 6.144 9.216t13.312 3.072h105.472q8.192 0 14.336-3.072t5.12-9.216zM576.512 37.888l438.272 804.864q20.48 35.84-1.024 71.68-9.216 17.408-26.624 26.624t-35.84 10.24h-878.592q-18.432 0-35.84-10.24t-26.624-26.624q-21.504-35.84-1.024-71.68l439.296-804.864q9.216-17.408 26.624-27.648t36.864-10.24 36.864 10.24 27.648 27.648z" fill="currentColor"></path>
1331        </symbol>
1332    </svg>
1333</span>
1334
1335<script>
1336    'use strict';
1337
1338        const isTouchDevice = () => ('ontouchstart' in window) ||
1339            (navigator.maxTouchPoints > 0) ||
1340            (navigator.msMaxTouchPoints > 0);
1341
1342        function switchBodyOverflow(signal) {
1343        const body = document.querySelector('body');
1344        if (signal) {
1345            // html.style.overflowY = 'auto';
1346            body.style.overflowY = 'auto';
1347            body.style.overflowX = 'clip';
1348        } else {
1349            // html.style.overflowX = html.style.overflowY = 'hidden';
1350            body.style.overflowX = body.style.overflowY = 'hidden';
1351        }
1352    }
1353
1354    /**
1355     * View model for header drawers
1356     *
1357     * @param String srcElementSel
1358     */
1359    function initDrawer(srcElementSel) {
1360        return {
1361            open: false,
1362            srcElements: null,
1363
1364            init() {
1365                this.srcElements = document.querySelectorAll(srcElementSel);
1366            },
1367
1368            toggle(signal = null) {
1369                signal = typeof signal == "boolean" ? signal : !this.open
1370                if (signal !== this.open) {
1371                    this.open = signal;
1372                    switchBodyOverflow(!signal);
1373                    if (this.srcElements) {
1374                        for (let i = 0; i < this.srcElements.length; ++i) {
1375                            this.srcElements[i].setAttribute('aria-expanded', this.open);
1376                        }
1377                    }
1378                }
1379            },
1380
1381            drawerListeners: {
1382                ['@keydown.window.escape']() {
1383                    this.toggle(false);
1384                }
1385            }
1386        }
1387    }
1388
1389    /**
1390     * Sticky page header: disparaît au scroll bas, réapparaît (compact) au rebond.
1391     * Actif sur toutes les pages.
1392     */
1393    function initStickyPageHeader() {
1394        // Pages « shop » : catégorie, fiche produit et résultats de recherche.
1395        // page-with-filter est posé par la navigation à facettes : il rattrape les listings bâtis sur
1396        // les handles catégorie mais servis par leur propre contrôleur (Webcooking_Promotions par
1397        // exemple), dont la classe body n'est pas catalog-category-view.
1398        const isCatalogPage = document.body.classList.contains('catalog-category-view')
1399            || document.body.classList.contains('catalog-product-view')
1400            || document.body.classList.contains('catalogsearch-result-index')
1401            || document.body.classList.contains('page-with-filter');
1402
1403        // Micro-mouvements de scroll : ils ne portent pas de sens de défilement.
1404        const SCROLL_DELTA = 8;
1405
1406        // Passer en mode compact raccourcit le header, donc la page. Le navigateur recale alors le
1407        // scroll d'autant (ancrage de scroll) pour garder le contenu en place : avec un seuil unique,
1408        // ce recul repasse sous le point de bascule, le header se redéploie, la page rallonge, le
1409        // scroll est recalé vers le bas... et l'aller-retour ne s'arrête plus (is-compact/is-hidden
1410        // qui clignotent).
1411        // On sort donc du mode compact beaucoup plus bas qu'on y entre : l'écart entre les deux
1412        // seuils doit dépasser le recalage, sinon la boucle se réinstalle. Quelques pixels de
1413        // tolérance plutôt que zéro strict : le scroll ne retombe pas toujours pile sur 0.
1414        const COMPACT_EXIT = 8;
1415
1416        // Fenêtre pendant laquelle un évènement de scroll est mis sur le compte de ce recalage
1417        // plutôt que sur celui de l'utilisateur. Le navigateur recale dans la foulée du changement
1418        // de hauteur (une frame) ; la borne évite qu'un recalage qui n'arrive jamais fasse avaler
1419        // le premier geste suivant, qui est précisément le rebond attendu.
1420        const REFLOW_WINDOW = 150;
1421
1422        return {
1423            lastScrollY: 0,
1424            // Hauteur du header déployé. On la remesure tant que le header n'est pas compact,
1425            // jamais en mode compact où il rétrécit : un seuil qui suit cette hauteur réduite
1426            // oscille autour du point de bascule.
1427            threshold: 0,
1428            // Instant de la dernière bascule, voir REFLOW_WINDOW.
1429            reflowAt: 0,
1430            header: null,
1431
1432            init() {
1433                if (!isCatalogPage) return;
1434                this.header = this.$root.closest('header') || this.$root;
1435                this.measureThreshold();
1436                window.addEventListener('scroll', this.onScroll.bind(this), {passive: true});
1437                window.addEventListener('resize', this.measureThreshold.bind(this), {passive: true});
1438            },
1439
1440            measureThreshold() {
1441                if (!this.header.classList.contains('is-compact')) {
1442                    this.threshold = this.header.offsetHeight;
1443                }
1444            },
1445
1446            onScroll() {
1447                this.measureThreshold();
1448
1449                const scrollY = Math.max(0, window.scrollY || document.documentElement.scrollTop);
1450
1451                if (this.reflowAt && performance.now() - this.reflowAt < REFLOW_WINDOW) {
1452                    this.reflowAt = 0;
1453                    this.lastScrollY = scrollY;
1454                    return;
1455                }
1456
1457                const delta = scrollY - this.lastScrollY;
1458
1459                // Le seuil de delta ne filtre que le SENS du défilement, jamais la décision
1460                // compact/déployé : une fin de scroll s'achève par des pas de quelques pixels,
1461                // et si on renonçait à décider sur ces évènements le header resterait compact
1462                // en haut de page.
1463                const isMove = Math.abs(delta) >= SCROLL_DELTA;
1464                if (isMove) {
1465                    this.lastScrollY = scrollY;
1466                }
1467
1468                // On entre en mode compact une fois le header dépassé ; on n'en sort qu'en haut
1469                // de page. Le header disparait à la descente et revient en compact au rebond.
1470                const wasCompact = this.header.classList.contains('is-compact');
1471                const compact = wasCompact ? scrollY > COMPACT_EXIT : scrollY > this.threshold;
1472                const hidden = isMove ? delta > 0 : this.header.classList.contains('is-hidden');
1473
1474                this.header.classList.toggle('is-hidden', compact && hidden);
1475
1476                if (compact !== wasCompact) {
1477                    this.header.classList.toggle('is-compact', compact);
1478                    this.reflowAt = performance.now();
1479                }
1480            }
1481        };
1482    }
1483
1484    /**
1485     * VM StickyHeader
1486     * Element sticks to the viewport top, hides on scrolling down and shows on scrolling up
1487     */
1488    function initStickyHeader(extraHeight = 200) {
1489        return {
1490            triggerLimit: 0,
1491            lastScrollTop: 0,
1492            active: false,
1493            hide: false,
1494
1495            init() {
1496                const eRect = this.$root.getBoundingClientRect();
1497                this.triggerLimit = extraHeight + eRect.top + eRect.height + (window.scrollY || document.documentElement.scrollTop);
1498                document.addEventListener('scroll', this.onScroll.bind(this), {passive: true});
1499            },
1500
1501            onScroll() {
1502                const scroll = window.scrollY || document.documentElement.scrollTop;
1503                if (scroll <= this.triggerLimit) {
1504                    this.active = this.hide = false;
1505                    this.$root.classList.remove('u-sticky-header', 'active', 'hide');
1506                } else {
1507                    this.$root.classList.add('u-sticky-header');
1508                    const isSticky = scroll > this.triggerLimit;
1509                    if (this.active !== isSticky) {
1510                        this.active = isSticky;
1511                        this.active ? this.$root.classList.add('active') : this.$root.classList.remove('active');
1512                    }
1513                    const scrollingDown = scroll > this.lastScrollTop;
1514                    if (this.hide !== scrollingDown) {
1515                        this.hide = scrollingDown;
1516                        this.hide ? this.$root.classList.add('hide') : this.$root.classList.remove('hide');
1517                    }
1518                }
1519                this.lastScrollTop = scroll;
1520            }
1521        };
1522    }
1523
1524    /**
1525     * VM StickyFooter
1526     * Element sticks to the viewport bottom, hides on scrolling down and shows on scrolling up
1527     * Also hides when reach a given element
1528     *
1529     * @param DomElement maxScrollElement
1530     * @param Boolean hiddenOnScroll
1531     */
1532    function initStickyFooter(maxScrollElement = null) {
1533        return {
1534            lastScrollTop: 0,
1535            maxScroll: Number.MAX_VALUE,
1536
1537            init() {
1538                this.$root.classList.add('u-sticky-footer');
1539                this.$root.style.zIndex = 20;
1540                document.addEventListener('scroll', this.onScroll.bind(this), {passive: true});
1541                if (maxScrollElement) {
1542                    const element = document.querySelector(maxScrollElement);
1543                    if (element) {
1544                        this.maxScroll = element.getBoundingClientRect().top + window.scrollY;
1545                    }
1546                }
1547            },
1548
1549            onScroll() {
1550                const st = window.scrollY || document.documentElement.scrollTop;
1551                st > this.lastScrollTop && st < this.maxScroll ?
1552                    this.$root.classList.add('hide') : this.$root.classList.remove('hide');
1553                this.lastScrollTop = st;
1554            }
1555        };
1556    }
1557
1558    /**
1559     * Makes element as a horizontal scrolling container for items with same width
1560     * Scroller must include a element with x-ref="slider" with its first child including items to be displayed
1561     * Left/right buttons may be defined through x-ref="left" and x-ref="right"
1562     */
1563    function initScroller() {
1564        return {
1565            isLeftBtnVisible: false,
1566            isRightBtnVisible: false,
1567            items: [],
1568            itemsVisibleInSlider: 0,
1569            firstVisibleItemIndex: 0,
1570
1571            init() {
1572                if (!this.$refs.slider) {
1573                    return;
1574                }
1575                this.items = Array.from(this.$refs.slider.firstElementChild.children);
1576                this.itemWidth = Math.abs(this.items[0].offsetLeft - (this.items?.[1]?.offsetLeft || 0));
1577                this.firstVisibleItemIndex = 0;
1578                this.updateScroller();
1579            },
1580
1581            slideToRight() {
1582                const maxScrollItemIndex = this.items.length - this.itemsVisibleInSlider;
1583                this.scrollTo(Math.min(maxScrollItemIndex, this.firstVisibleItemIndex + this.itemsVisibleInSlider));
1584            },
1585
1586            slideToLeft() {
1587                this.scrollTo(Math.max(0, this.firstVisibleItemIndex - this.itemsVisibleInSlider));
1588            },
1589
1590            scrollTo(index) {
1591                if (index >= 0 && index < this.items.length) {
1592                    this.$refs.slider.scroll(
1593                        { left: this.items[index].offsetLeft, behavior: 'smooth' }
1594                    );
1595                    this.firstVisibleItemIndex = index;
1596                    this.updateScroller();
1597                }
1598            },
1599
1600            updateScroller() {
1601                this.itemsVisibleInSlider = Math.floor(this.$refs.slider.clientWidth / this.itemWidth);
1602                this.isLeftBtnVisible = this.firstVisibleItemIndex > 0;
1603                this.isRightBtnVisible = this.itemsVisibleInSlider < (this.items.length - this.firstVisibleItemIndex - 1);
1604            },
1605
1606            eventListeners: {
1607                ['@resize.window.debounce']() {
1608                    this.updateScroller();
1609                },
1610                ['@touchmove.passive']() {
1611                    this.firstVisibleItemIndex = Math.floor(Math.abs(this.$refs.items.getBoundingClientRect().left) / this.itemWidth)
1612                    this.updateScroller();
1613                },
1614                ['@click'](event) {
1615                    const btn = event.target.closest('button');
1616                    if (btn) {
1617                        const isLeftBtn = btn.isSameNode(this.$refs.left);
1618                        isLeftBtn ? this.slideToLeft() : this.slideToRight();
1619                    }
1620                }
1621            }
1622        }
1623    }
1624
1625    document.addEventListener("DOMContentLoaded", function(event) {
1626        // Obfuscation (see https://www.410-gone.fr/seo/optimisation-on-site/maillage-interne/cocon-semantique/obfuscation.html)
1627        var classname = document.getElementsByClassName("qcd");
1628        for (let i = 0; i < classname.length; ++i) {
1629            //click gauche
1630            classname[i].addEventListener('click', myFunction, false);
1631            //click droit
1632            classname[i].addEventListener('contextmenu', myRightFunction, false);
1633        }
1634    });
1635    // fonction du click gauche
1636    var myFunction = function(event) {
1637        var attribute = this.getAttribute("data-qcd");
1638        if(event.ctrlKey) {
1639            var newWindow = window.open(decodeURIComponent(window.atob(attribute)), '_blank');
1640            newWindow.focus();
1641        } else {
1642            document.location.href= decodeURIComponent(window.atob(attribute));
1643        }
1644    };
1645    //fonction du click droit
1646    var myRightFunction = function(event) {
1647        var attribute = this.getAttribute("data-qcd");
1648        if(event.ctrlKey) {
1649            var newWindow = window.open(decodeURIComponent(window.atob(attribute)), '_blank');
1650            newWindow.focus();
1651        } else {
1652            window.open(decodeURIComponent(window.atob(attribute)),'_blank');
1653        }
1654    }
1655
1656        /**
1657     * Fetch server content
1658     * @param Element|String content
1659     * @param String insertionNode
1660     */
1661    function fetchContent(content, insertionNode = 'body') {
1662        const url = new URL('https://www.jardindupicvert.com/pdfcore/index/fetch/');
1663        const params = {
1664            content: content,
1665            form_key: hyva.getFormKey(),
1666        };
1667        Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));
1668        const target = insertionNode instanceof Element ? insertionNode : document.querySelector(insertionNode);
1669        if (target) {
1670            return fetch(url, {headers: {"X-Requested-With": "XMLHttpRequest"}})
1671                .then(response => response.json(response))
1672                .then(response => {
1673                    response?.result && target?.insertAdjacentHTML('beforeend', response?.result);
1674                    return response?.result;
1675                });
1676        }
1677    }
1678
1679    // Fetch non-essential svg symbols
1680    document.addEventListener("DOMContentLoaded", function() {
1681        setTimeout(() => {
1682            fetchContent('svg-symbols-defer');
1683        }, 1000);
1684    });
1685
1686</script>
1686
1687
1688<script>
1689    (function(hyva) {
1690                const formValidationRules = {
1691            required(value, options, field, context) {
1692                const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element,
1693                    fieldName = getFieldName(field),
1694                    msg = fieldName
1695                        ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020est\u0020obligatoire.', fieldName)
1696                        : 'Ce\u0020champ\u0020est\u0020obligatoire.';
1697
1698                if (el.type === 'radio' || el.type === 'checkbox') {
1699                    return (value === undefined || value.length === 0) ? msg : true;
1700                }
1701
1702                el.setAttribute('required', '');
1703                el.checkValidity();
1704
1705                return el.validity.valueMissing ? msg : true;
1706            },
1707            maxlength(value, options, field, context) {
1708                const n = Number(options)
1709                if (value.length > n) {
1710                    const fieldName = getFieldName(field);
1711                    return fieldName
1712                        ? n === 1
1713                            ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020peut\u0020pas\u0020\u00EAtre\u0020plus\u0020long\u0020que\u00201\u0020caract\u00E8re.', fieldName)
1714                            : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020peut\u0020pas\u0020\u00EAtre\u0020plus\u0020long\u0020que\u0020\u00252\u0020caract\u00E8res.', fieldName, options)
1715                        : n === 1
1716                            ? 'Veuillez\u0020entrer\u0020au\u0020maximum\u00201\u0020caract\u00E8re.'
1717                            : hyva.strf('Veuillez\u0020entrer\u0020au\u0020maximum\u0020\u00250\u0020caract\u00E8res.', options);
1718                }
1719                return true;
1720            },
1721            minlength(value, options, field, context) {
1722                const n = Number(options)
1723                if (value.length > 0 && value.length < n) {
1724                    const fieldName = getFieldName(field);
1725                    return fieldName
1726                        ? n === 1
1727                            ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020comporter\u0020au\u0020moins\u00201\u0020caract\u00E8re.', fieldName)
1728                            : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020comporter\u0020au\u0020moins\u0020\u00252\u0020caract\u00E8res.', fieldName, options)
1729                        : n === 1
1730                            ? 'Veuillez\u0020entrer\u0020au\u0020moins\u00201\u0020caract\u00E8re.'
1731                            : hyva.strf('Veuillez\u0020entrer\u0020au\u0020moins\u0020\u00250\u0020caract\u00E8res.', options);
1732                }
1733                return true;
1734            },
1735            max(value, options, field, context) {
1736                field.element.setAttribute('max', options);
1737                field.element.checkValidity();
1738                if (field.element.validity.rangeOverflow) {
1739                    const fieldName = getFieldName(field);
1740                    return fieldName
1741                        ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options)
1742                        : hyva.strf('Please\u0020enter\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options);
1743                }
1744                return true;
1745            },
1746            min(value, options, field, context) {
1747                field.element.setAttribute('min', options);
1748                field.element.checkValidity();
1749                if (field.element.validity.rangeUnderflow) {
1750                    const fieldName = getFieldName(field);
1751                    return fieldName
1752                        ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options)
1753                        : hyva.strf('Please\u0020enter\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options);
1754                }
1755                return true;
1756            },
1757            step(value, options, field, context) {
1758                field.element.setAttribute('step', options);
1759                field.element.checkValidity();
1760                if (field.element.validity.stepMismatch) {
1761                    const val = Number(value),
1762                        step = Number(options),
1763                        fieldName = getFieldName(field),
1764                        nearestLowerValue = Math.floor(val / step) * step,
1765                        nearestUpperValue = Math.ceil(val / step) * step;
1766                    return fieldName
1767                        ? hyva.str('\u00251\u0020field\u0020is\u0020invalid.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00252\u0022\u0020and\u0020\u0022\u00253\u0022.', fieldName, nearestLowerValue, nearestUpperValue)
1768                        : hyva.strf('Please\u0020enter\u0020a\u0020valid\u0020value.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00250\u0022\u0020and\u0020\u0022\u00251\u0022.', nearestLowerValue, nearestUpperValue);
1769                }
1770                return true;
1771            },
1772            pattern(value, options, field, context) {
1773                field.element.setAttribute('pattern', options);
1774                field.element.checkValidity();
1775                if (field.element.validity.patternMismatch) {
1776                    const fieldName = getFieldName(field);
1777                    return fieldName
1778                        ? field.element.pattern
1779                            ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020se\u0020conformer\u0020au\u0020format\u0020demand\u00E9\u003A\u0020\u00252.', fieldName, field.element.pattern)
1780                            : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020se\u0020conforme\u0020pas\u0020au\u0020format\u0020demand\u00E9.', fieldName)
1781                        : field.element.pattern
1782                            ? hyva.strf('Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9\u003A\u0020\u00250.', field.element.pattern)
1783                            : 'Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9.';
1784                }
1785                return true;
1786            },
1787            email(value, options, field, context) {
1788                                const rule = /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i;
1789                if (value.length > 0 && !rule.test(value)) {
1790                    const fieldName = getFieldName(field);
1791                    return fieldName
1792                        ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020contenir\u0020une\u0020adresse\u0020email\u0020valide\u0020\u0028par\u0020ex.\u0020jean\u0040domain.com\u0029.', fieldName)
1793                        : 'Veuillez\u0020entrer\u0020une\u0020adresse\u0020email\u0020valide\u0020\u0028par\u0020ex.\u0020jean\u0040domain.com\u0029.';
1794                }
1795                return true;
1796            },
1797            password(value, options, field, context) {
1798                const rule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/;
1799                if (value.length > 0 && !rule.test(value)) {
1800                    const fieldName = getFieldName(field);
1801                    return fieldName
1802                        ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020at\u0020least\u0020one\u0020upper\u0020case,\u0020one\u0020lower\u0020case,\u0020one\u0020digit\u0020and\u0020one\u0020special\u0020character\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026\u002A\u002D\u0029', fieldName)
1803                        : 'Veuillez\u0020fournir\u0020au\u0020moins\u0020une\u0020majuscule,\u0020une\u0020minuscule,\u0020un\u0020chiffre\u0020et\u0020un\u0020caract\u00E8re\u0020sp\u00E9cial\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026\u002A\u002D\u0029';
1804                }
1805                return true;
1806            },
1807            equalTo(value, options, field, context) {
1808                const dependencyField = context.fields[options].element;
1809                if (value !== dependencyField.value) {
1810                    const dependencyFieldName =
1811                        dependencyField.label ||
1812                        dependencyField.title ||
1813                        (dependencyField.labels && dependencyField.labels[0] && dependencyField.labels[0].innerText) ||
1814                        dependencyField.name,
1815                        fieldName = getFieldName(field);
1816                    return fieldName
1817                        ? hyva.str('\u00251\u0020field\u0020value\u0020must\u0020be\u0020the\u0020same\u0020as\u0020\u0022\u00252\u0022.', fieldName, dependencyFieldName)
1818                        : hyva.strf('Ce\u0020champ\u0020doit\u0020correspondre\u0020au\u0020champ\u0020\u0022\u00250\u0022.', dependencyFieldName);
1819                }
1820                return true;
1821            }
1822        };
1823
1824                function raceSome(promises, pred) {
1825            return new Promise((resolve, reject) => {
1826
1827                if (promises.length === 0) {
1828                    return resolve();
1829                }
1830
1831                let settled = false, nDone = 0;
1832
1833                const resolveIf = v => {
1834                    if (!settled && (pred(v) || ++nDone === promises.length)) {
1835                        settled = true;
1836                        resolve(v);
1837                    }
1838                    return v;
1839                }
1840
1841                promises.map(promise => {
1842                    promise.then(resolveIf).catch(reason => {
1843                        settled = true;
1844                        reject(reason)
1845                    });
1846                    return promise;
1847                });
1848            });
1849        }
1850
1851        const INPUT_ATTRIBUTE_RULES = {min: 'min', max: 'max', required: 'required', minlength: 'minlength', maxlength: 'maxlength', step: 'step', pattern: 'pattern'}
1852        const INPUT_TYPE_RULES = {email: 'email'}
1853
1854        function getRules(element) {
1855            let rules = {};
1856            Object.keys(INPUT_ATTRIBUTE_RULES).forEach(attrName => {
1857                if (element.hasAttribute(attrName)) {
1858                    rules[INPUT_ATTRIBUTE_RULES[attrName]] = element.getAttribute(attrName);
1859                }
1860            })
1861            if (INPUT_TYPE_RULES[element.type]) {
1862                rules[INPUT_TYPE_RULES[element.type]] = true;
1863            }
1864
1865            if (element.dataset.validate) {
1866                try {
1867                    Object.assign(rules, JSON.parse(element.dataset.validate));
1868                } catch (error) {
1869                    console.error('Validator error. Cannot parse data-validate attribute of element:\n', element);
1870                }
1871            }
1872
1873            return rules;
1874        }
1875
1876        function isInvalidRuleResult(ruleState) {
1877            return typeof ruleState === 'string' || !ruleState || (ruleState.type && ruleState.content);
1878        }
1879
1880        async function runValidateFn(rule, options, value, field) {
1881            return formValidationRules[rule](value, options, field, this);
1882        }
1883
1884        function generateId() {
1885            let id;
1886            do {
1887                id = `${this.idPrefix}-${++this.idSeq}`;
1888            } while (document.getElementById(id));
1889            return id;
1890        }
1891
1892        function isVisible(element) {
1893            const el = element.type !== 'hidden' ? element : (element.parentElement || {});
1894            return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length)
1895        }
1896
1897        function elementWillValidate(element) {
1898            return (element.willValidate || element.type === 'hidden')
1899                && element.tagName !== 'BUTTON'
1900                && element.disabled === false
1901                && !(element.tagName === 'INPUT' && element.type === 'submit')
1902                && (element.hasAttribute('data-validate-hidden') || isVisible(element))
1903        }
1904
1905        function createMessageContainer(el, fieldWrapperClassName) {
1906            if (! el.parentElement) {
1907                return;
1908            }
1909            const refocus = document.activeElement === el;
1910            const wrapper = document.createElement('div');
1911            wrapper.classList.add.apply(wrapper.classList, fieldWrapperClassName.split(' '));
1912            el.parentElement.insertBefore(wrapper, el);
1913            wrapper.appendChild(el);
1914            refocus && document.activeElement !== el && el.focus();
1915            return wrapper;
1916        }
1917
1918        function containerNotFound(selector, el) {
1919            const msg = `Cannot find message container element ${selector} of ${el.name}`;
1920            console.error(msg, el);
1921            throw msg;
1922        }
1923
1924        function createTextInputFrom(el) {
1925            const text = document.createElement('INPUT');
1926            text.type = 'text';
1927            text.value = el.value;
1928            return text;
1929        }
1930
1931        function classNamesToSelector(classNames) {
1932            return classNames.split(' ')
1933                .filter(className => className.length > 0)
1934                .map(className => `.${className}`)
1935                .join('')
1936        }
1937
1938        function hasMessagesWrapper(field, messagesWrapperClassName) {
1939            return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
1940        }
1941
1942        function getMessagesWrapper(field, messagesWrapperClassName) {
1943            if (hasMessagesWrapper.call(this, field, messagesWrapperClassName)) {
1944                return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
1945            }
1946
1947            const msgWrapper = document.createElement('ul');
1948            const msgId = generateId.call(this);
1949            msgWrapper.id = msgId;
1950            field.element.setAttribute('aria-errormessage', msgId);
1951            field.element.setAttribute('aria-describedby', msgId);
1952            msgWrapper.classList.add.apply(msgWrapper.classList, messagesWrapperClassName.split(' '));
1953            if (field.validateOnChange) {
1954                msgWrapper.setAttribute('aria-live', 'polite');
1955            }
1956            this.getMessageContainer(field).appendChild(msgWrapper);
1957
1958            return msgWrapper;
1959        }
1960
1961        function getCheckedValues(field) {
1962            const name = field.element.name.replace(/([\\"])/g, '\\$1');
1963            const elements = field.element.form.querySelectorAll('input[name="' + name + '"]:checked');
1964            return Array.from(elements).map(el => el.value);
1965        }
1966
1967        function escapeHtml(s) {
1968            const div = document.createElement('div')
1969            div.innerText = s;
1970            return div.innerHTML;
1971        }
1972
1973        
1974        function formValidation(form, options = {}) {
1975            const formElement = form || this.$el;
1976
1977            if (formElement.dataset && formElement.dataset.options) {
1978                try {
1979                    options = Object.assign(options, JSON.parse(formElement.dataset.options || '{}'));
1980                } catch (e) {
1981                    throw new Error('Cannot read the form options from the data-options attribute: not valid JSON');
1982                }
1983            }
1984
1985            // Disable browser default validation
1986            if (formElement.tagName === 'FORM') {
1987                formElement.setAttribute('novalidate', '');
1988            } else {
1989                console.error('formValidation can be initialized only on FORM element', formElement);
1990                return;
1991            }
1992
1993            options = Object.assign({
1994                fieldWrapperClassName: 'field field-reserved',
1995                messagesWrapperClassName: 'messages',
1996                validClassName: 'field-success',
1997                invalidClassName: 'field-error',
1998                pageMessagesWrapperSelector: null,
1999                scrollToFirstError: true,
2000            }, options || {});
2001
2002            return {
2003                state: {
2004                    valid: false,
2005                },
2006                isSubmitting: false,
2007                fields: {},
2008                idSeq: 0,
2009                idPrefix: formElement.id || 'vld-msg',
2010                setupFields(elements) {
2011                    this.fields = {};
2012                    Array.from(elements).forEach(element => {
2013                        if (elementWillValidate(element)) {
2014                            this.setupField(element);
2015                        }
2016                    });
2017                },
2018                setupField(element) {
2019                    if (! element) return;
2020                    const onChange = !!element.dataset.onChange;
2021                    if (elementWillValidate(element)) {
2022                        const rules = getRules(element);
2023                        if (Object.keys(rules).length > 0) {
2024                            if (this.fields[element.name]) {
2025                                Object.assign(this.fields[element.name].rules, rules);
2026                            } else {
2027                                this.fields[element.name] = {
2028                                    element,
2029                                    rules: rules,
2030                                    validateOnChange: onChange,
2031                                    state: {
2032                                        valid: null,
2033                                        rules: {}
2034                                    }
2035                                }
2036                            }
2037                        }
2038                    } else {
2039                        console.error('Element will not validate', element);
2040                    }
2041                },
2042                onSubmit(event) {
2043                    if (event.target.tagName === 'FORM') {
2044                        event.preventDefault();
2045
2046                        if (this.isSubmitting) return;
2047                        this.isSubmitting = true;
2048
2049                        this.validate()
2050                            .then(() => event.target.submit())
2051                            .catch(invalidElements => {
2052                                this.isSubmitting = false;
2053                            });
2054                    }
2055                },
2056                onChange(event) {
2057                    event.target.dataset.onChange = 'true';
2058                    if (!Object.keys(this.fields).length) {
2059                        this.setupFields(formElement.elements);
2060                    }
2061                    if (!Object.keys(this.fields).includes(event.target.name)) {
2062                        this.setupField(event.target);
2063                    }
2064                    const field = this.fields[event.target.name];
2065
2066                    this.validateField(field);
2067                    field && field.element.removeAttribute('data-on-change')
2068                },
2069                validateSafe() {
2070                    return new Promise(resolve => this.validate().then(() => resolve(true)).catch(() => {}))
2071                },
2072                validate() {
2073                    if (!Object.keys(this.fields).length || !Object.keys(this.fields).length !== formElement.elements.length) {
2074                        this.setupFields(formElement.elements);
2075                    }
2076                    return new Promise(async (resolve, reject) => {
2077                        if (formElement.elements) {
2078                                                        await raceSome(this.validateFields(), result => result !== true)
2079                            const invalidFields = Object.values(this.fields).filter(field => !field.state.valid);
2080                            this.state.valid = invalidFields.length === 0;
2081                            if (this.state.valid) {
2082                                resolve();
2083                            } else {
2084                                if (options.scrollToFirstError && invalidFields.length > 0) {
2085                                    invalidFields[0].element.focus()
2086                                    invalidFields[0].element.select && invalidFields[0].element.select();
2087                                }
2088                                reject(invalidFields.map(field => field.element));
2089                            }
2090                        }
2091                    });
2092                },
2093                                validateFields() {
2094                    const fields = Object.values(this.fields);
2095
2096                                        fields.forEach(field => {
2097                        this.getMessageContainer(field).classList.remove(options.validClassName, options.invalidClassName)
2098                    });
2099                                        return fields.map(field => this.validateField(field))
2100                },
2101                                validateField(field) {
2102                                        if (! field || ! elementWillValidate(field.element)) {
2103                        return new Promise(resolve => resolve(true))
2104                    }
2105
2106                    let value;
2107                    if (field.element.type === 'checkbox') {
2108                        value = getCheckedValues(field);
2109                    } else if (field.element.type === 'radio') {
2110                        value = getCheckedValues(field)[0] || undefined;
2111                    } else if (field.element.tagName === 'SELECT' && field.element.multiple) {
2112                        value = Array.from(field.element.selectedOptions).map(opt => opt.value);
2113                    } else {
2114                        value = field.element.value;
2115                    }
2116
2117                    const rules = field.rules || {};
2118
2119                                        field.state.valid = true;
2120                    this.showFieldState(field);
2121
2122                
2123                                        const fieldValidations = Object.keys(rules).filter(rule => formValidationRules[rule]).map(async rule => {
2124                        return runValidateFn.call(this, rule, rules[rule], value, field).then(result => {
2125                            field.state.rules[rule] = result;
2126                            return result;
2127                        })
2128                    });
2129
2130                    return new Promise(resolve => {
2131                                                Promise.all(fieldValidations).then(results => {
2132                                                                                    field.state.valid = !elementWillValidate(field.element) || rules.length === 0 || !results.some(isInvalidRuleResult)
2133                            this.showFieldState(field);
2134                            resolve(field.state.valid);
2135                        })
2136                    });
2137                },
2138                                getMessagesByField(field) {
2139                    const messages = [];
2140                    const invalidRules = Object.keys(field.state.rules).filter(rule => isInvalidRuleResult(field.state.rules[rule]));
2141
2142                    field.rules && Object.keys(field.rules).forEach((rule) => {
2143                        if (invalidRules.includes(rule)) {
2144                            const customMessage = field.element.getAttribute('data-msg-' + rule);
2145                            const message = customMessage ? customMessage : field.state.rules[rule];
2146                            const ruleOptions = JSON.parse(JSON.stringify(field.rules[rule]));
2147
2148                            if (typeof message === 'undefined' || message === null || (typeof message !== 'string' && ! message.type)) {
2149                                messages.push(hyva.strf('Validation rule "%0" failed.', rule));
2150                            } else if (Array.isArray(ruleOptions)) {
2151                                ruleOptions.unshift(message.type ? message.content : message);
2152                                const content = hyva.strf.apply(null, ruleOptions);
2153                                messages.push(message.type ? {type: message.type, content} : content);
2154                            } else {
2155                                const content = hyva.strf(message.type ? message.content : message, ruleOptions)
2156                                messages.push(message.type ? {type: message.type, content} : content);
2157                            }
2158                        }
2159                    });
2160                    return messages;
2161                },
2162                /** @deprecated */
2163                getFieldWrapper(field) {
2164                                        return this.getMessageContainer(field)
2165                },
2166                getMessageContainer(field) {
2167                    let container;
2168                    const pageSelector = field.element.getAttribute('data-validation-container') || options.pageMessagesContainerSelector;
2169                    if (pageSelector) {
2170                        container = document.querySelector(pageSelector)
2171                            || containerNotFound(pageSelector, field.element)
2172                    } else {
2173                        const containerSelector = classNamesToSelector(options.fieldWrapperClassName);
2174                        container = field.element.closest(containerSelector)
2175                            || createMessageContainer(field.element, options.fieldWrapperClassName)
2176                            || containerNotFound(containerSelector, field.element);
2177                    }
2178
2179                    return container;
2180                },
2181                showFieldState(field) {
2182                    const container = this.getMessageContainer(field),
2183                        hasErrorMessages = hasMessagesWrapper.call(this, field, options.messagesWrapperClassName),
2184                        messages = this.getMessagesByField(field).map(m => {
2185                            return m.type !== 'html' ? escapeHtml(m.type ? m.content : m) : m.content;
2186                        });
2187                    container.classList.toggle(options.validClassName, field.state.valid && ! hasErrorMessages);
2188                    container.classList.toggle(options.invalidClassName, !field.state.valid || hasErrorMessages);
2189                    this.createHtmlErrorMessage(field, messages);
2190
2191                    if (field.state.valid) {
2192                        field.element.removeAttribute('aria-invalid');
2193                    } else {
2194                        field.element.setAttribute('aria-invalid', 'true');
2195                        if (! document.activeElement) {
2196                            field.element.focus();
2197                        }
2198                    }
2199                },
2200                removeMessages(field, messagesClass) {
2201                    if (! hasMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName)) {
2202                        return;
2203                    }
2204
2205                    const msgWrapper = getMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName);
2206                    const messages = msgWrapper.querySelectorAll(`[data-msg-field='${field.element.name}']`);
2207                    Array.from(messages).forEach(msg => msg.remove());
2208                    if (msgWrapper && msgWrapper.childElementCount === 0) {
2209                        field.element.removeAttribute('aria-errormessage');
2210                        field.element.removeAttribute('aria-describedby');
2211                        msgWrapper.remove();
2212                    }
2213                },
2214                createErrorMessage(field, messages) {
2215                    const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
2216                    this.createHtmlErrorMessage(field, htmlMessages);
2217                },
2218                createHtmlErrorMessage(field, messages) {
2219                    this.removeMessages(field, options.messagesWrapperClassName);
2220                    field.element.removeAttribute('aria-errormessage');
2221                    field.element.removeAttribute('aria-describedby');
2222
2223                    if (!field.state.valid) {
2224                        const msgWrapper = this.addHtmlMessages(field, options.messagesWrapperClassName, messages);
2225                        field.element.setAttribute('aria-errormessage', msgWrapper.id);
2226                        field.element.setAttribute('aria-describedby', msgWrapper.id);
2227                    }
2228                },
2229                /** @deprecated */
2230                createMessage(field, message) {
2231                                        return this.addMessages(field, options.messagesWrapperClassName, message);
2232                },
2233                addMessages(field, messagesClass, messages) {
2234                    const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
2235                    return this.addHtmlMessages(field, messagesClass, htmlMessages);
2236                },
2237                addHtmlMessages(field, messagesClass, htmlMessages) {
2238                    const msgWrapper = getMessagesWrapper.call(this, field, messagesClass);
2239
2240                    (Array.isArray(htmlMessages) ? htmlMessages : [htmlMessages]).forEach((htmlMessage) => {
2241                        const li = document.createElement('li');
2242                        li.innerHTML = htmlMessage;
2243                        li.setAttribute('data-msg-field', field.element.name);
2244                        msgWrapper.appendChild(li);
2245                    });
2246
2247                    return msgWrapper;
2248                },
2249                setField(name, value) {
2250                    this.fields[name].element.value = value;
2251                    this.fields[name].element.dispatchEvent((new Event('input')));
2252                    this.validateField(this.fields[name]);
2253                }
2254            }
2255        }
2256
2257        function getFieldName(field) {
2258                        const fieldName = field.element?.getAttribute('title')
2259                || document.querySelector(`label[for="${field.element?.id}"]`)?.innerText;
2260
2261            return fieldName
2262                ? fieldName.trim()
2263                : '';
2264        }
2265
2266        hyva.formValidation = formValidation;
2267        hyva.formValidation.rules = formValidationRules;
2268        hyva.formValidation.setInputAttributeRuleName = (attrName, ruleName) => INPUT_ATTRIBUTE_RULES[attrName] = ruleName || attrName;
2269        hyva.formValidation.setInputTypeRuleName = (typeName, ruleName) => INPUT_TYPE_RULES[typeName] = ruleName || typeName;
2270        hyva.formValidation.addRule = (name, validator) => formValidationRules[name] = validator;
2271        hyva.formValidation.getFieldName = getFieldName;
2272    }(window.hyva = window.hyva || {}));
2273
2274    window.addEventListener('alpine:init', () => {
2275        Alpine.data('hyva.formValidation', hyva.formValidation);
2276        Alpine.data('hyva.formValidation($el)', hyva.formValidation);
2277    }, {once: true});
2278    //# sourceURL=hyva-advanced-form-validation.js
2279</script>
2279
2280<div class="page-wrapper"><header class="page-header"><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white
2281   contentarea"
2282   href="#contentarea">
2283<span>
2284Allez au contenu    </span>
2285</a>
2286<div id="header"
2287     x-data="initStickyPageHeader()"
2288     class="relative z-header w-full bg-container-darker"
2289>
2290<div class="container">
2291<div class="header-top-bar flex&#x20;flex-wrap&#x20;md&#x3A;flex-nowrap&#x20;items-center&#x20;justify-between&#x20;gap-y-1&#x20;py-2">
2292
2293<button class="compact-burger hidden order-0 shrink-0 text-white text-4xl font-bold leading-none cursor-pointer"
2294                    @click="$dispatch('open-main-menu')"
2295                    aria-label="Menu"
2296            >&equiv;</button>
2297
2298<div class="header-logo order-1 max-w-1/2 xs:max-w-[180px] sm:max-w-[240px] transition-all duration-500">
2299<a href="https://www.jardindupicvert.com/"
2300       aria-label="Go&#x20;to&#x20;Home&#x20;page"
2301    >
2302<svg class="logo-svg w-full aspect-[3.775]"
2303             viewBox="0 0 302 80"
2304             title="Le Jardin du Pic Vert"
2305        >
2306            <style type="text/css">
2307                .st0{fill:#004650;} .st1{fill:#2DAFAA;} .st2{fill:#C86464;} .st3{fill:#FFFFFF;}
2308            </style>
2309            <g class="layer">
2310                <g id="svg_2">
2311                    <path class="st1" d="m87.22,44.34284c-0.48,-1.85 -1.08,-3.67 -1.77,-5.45c0.17,5.03 -0.41,10.09 -1.85,14.93c-1.79,5.99 -5.37,11.88 -11.65,13.84c-0.68,0.21 -2.28,-1.55 -1.68,-1.73c6.21,-1.94 9.73,-7.89 11.43,-13.81c1.69,-5.86 2.18,-12.06 1.52,-18.12c-0.15,-0.37 -0.23,-0.62 -0.2,-0.66c-0.6,0.64 -0.87,1.98 -1.31,2.8c-0.51,0.95 -1.07,1.88 -1.68,2.76c-1.23,1.78 -2.67,3.41 -4.29,4.82c-2.79,2.43 -5.36,4.81 -7.64,7.73c-3.98,5.1 -7.79,14.98 -0.67,19.34c4.48,2.74 10.67,0.75 14.58,-2.11c2.95,-2.16 5.11,-5.4 5.92,-8.96c0.27,-1.17 0.39,-2.37 0.48,-3.56c0.3,-3.97 -0.2,-7.99 -1.19,-11.82" id="svg_3"/>
2312                    <path class="st1" d="m56.83,55.35284c-0.54,4.44 -0.68,9.16 1,13.39c1.66,4.19 5.23,7.65 9.24,9.62c3.77,1.86 8.53,2.59 12.47,0.85c2.1,-0.93 4.07,-2.19 5.81,-3.69c1.94,-1.67 3.51,-3.68 5.22,-5.56c1.4,-1.54 3.29,-4.02 5.54,-4.21c2.55,-0.21 3.24,2.25 2.59,4.28c-0.34,1.07 2.77,3.63 3.12,2.54c0.76,-2.36 -0.26,-4.76 -1.81,-6.54c-1.41,-1.63 -3.64,-3.3 -5.88,-3.4c-2.1,-0.09 -3.81,1.61 -5.16,3c-1.64,1.69 -3.11,3.54 -4.74,5.24c-3.18,3.33 -7.54,6.38 -12.33,6.2c-3.67,-0.14 -7.71,-1.6 -9.94,-4.67c-2.94,-4.06 -2.58,-9.79 -2,-14.51c0.1,-0.82 -0.85,-1.72 -1.42,-2.19c-0.25,-0.19 -1.61,-1.14 -1.71,-0.35" id="svg_4"/>
2313                    <path class="st1" d="m51.15,52.72284c-5.21,-5.84 -13.67,-7.6 -21.11,-8.06c-4.91,-0.3 -10.72,0.24 -15.41,-1.42c-3.85,-1.36 -7.52,-3.15 -10.9,-5.39c-1.29,-0.85 -2.53,-1.77 -3.73,-2.75c0.95,1.73 2.01,3.4 3.18,5c4.72,6.47 11.05,11.66 18.39,14.9c7.96,3.52 16.84,4.79 25.47,3.72c0.45,-0.06 0.93,0.3 1.26,0.62c0.53,0.31 1.03,0.85 1.31,1.2c0.2,0.25 1.15,1.58 0.35,1.7c-4.96,0.74 -10.02,0.64 -14.95,-0.24c-13.9,-2.46 -25.87,-10.87 -34.23,-22c3.61,9.27 8.63,18.06 16.21,24.61c5.9,5.1 14.46,7.1 22.06,7.02c6.53,-0.07 14.17,-4.02 14.89,-11.11c0.26,-2.83 -0.91,-5.68 -2.79,-7.8" id="svg_5"/>
2314                    <path class="st2" d="m49.68,31.29284c0.55,1.06 0.98,1.9 1.32,2.4c0.12,0.18 0.24,0.38 0.36,0.58c0.03,-0.75 0.08,-1.49 0.13,-2.22c0.17,-2.26 0.33,-4.4 -0.36,-6.48c-0.47,-1.42 -0.86,-2.51 -1.58,-3.57l-0.25,-0.37c-0.72,-1.04 -1.53,-2.23 -1.65,-3.73c-0.21,-2.64 0.62,-5.7 2.18,-8c0.21,-0.31 0.42,-0.61 0.64,-0.91c1.22,-1.7 1.89,-2.75 1.44,-4.38c-0.37,-1.34 -1.69,-2.5 -3.08,-3.38c-2.9,1.85 -5.85,4.26 -6.26,7.62c-0.2,1.71 0.49,3.41 1.22,5.21c0.76,1.87 1.55,3.8 1.39,5.92c-0.07,0.91 -0.32,1.73 -0.72,2.41c2.43,3.54 4.06,6.66 5.22,8.9" id="svg_6"/>
2315                    <path class="st2" d="m62.85,2.98284c-3,3.27 -4.78,6.98 -6.79,11.49c-1.51,3.38 -3.34,7.5 -2.89,11.1c0.6,2.24 0.44,4.46 0.28,6.62c-0.17,2.32 -0.32,4.52 0.44,6.62c0.45,0.63 0.93,1.15 1.47,1.44c0.11,0.06 0.19,0.09 0.25,0.12c0.07,-0.35 0.06,-1 0.06,-1.35l-0.01,-0.34c-0.02,-4.11 1.58,-8.59 4.61,-12.95c0.9,-1.29 2,-2.46 3.07,-3.6c1.89,-2.01 3.68,-3.91 4.39,-6.38c0.5,-1.73 0.21,-3.58 -0.09,-5.53c-0.2,-1.33 -0.42,-2.7 -0.38,-4.09c0.06,-2.44 1.13,-3.17 2.02,-3.36c1.64,-0.34 3.73,1.17 5.26,2.74c-0.06,-2.33 -0.4,-5.31 -4.02,-5.5c-2.89,-0.15 -5.34,1.03 -7.47,2.74c-0.06,0.09 -0.13,0.16 -0.2,0.23" id="svg_7"/>
2316                    <path class="st2" d="m53.79,4.09284c0.72,2.62 -0.53,4.37 -1.74,6.05c-0.2,0.28 -0.41,0.57 -0.61,0.86c-1.32,1.94 -2.03,4.53 -1.85,6.74c0.08,0.97 0.68,1.84 1.31,2.77l0.26,0.38c0.11,0.16 0.2,0.33 0.3,0.49c0.57,-2.71 1.74,-5.35 2.76,-7.64c1.11,-2.48 2.14,-4.7 3.33,-6.77c-1.21,-2.5 -3.05,-4.6 -5.34,-5.51c0.73,0.77 1.3,1.64 1.58,2.63" id="svg_8"/>
2317                    <path class="st2" d="m43.08,20.54284c0.05,-0.22 0.09,-0.45 0.11,-0.69c0.12,-1.66 -0.54,-3.3 -1.25,-5.03c-0.79,-1.95 -1.61,-3.97 -1.35,-6.18c0.22,-1.79 0.99,-3.33 2.04,-4.68c-0.38,0.12 -0.77,0.23 -1.
231716,0.34c-1.87,0.54 -3.8,1.59 -5,3.16c-1.17,1.53 -1.03,3.42 -0.51,5.22c2.89,2.67 5.22,5.34 7.12,7.86" id="svg_9"/>
2318                    <path class="st2" d="m62.99,48.78284c0.51,-1.42 0.76,-2.97 1,-4.47c0.13,-0.83 0.22,-1.69 0.31,-2.52c0.21,-1.98 0.42,-4.02 1.26,-6c1.02,-2.38 2.61,-4.44 4.6,-5.94c3.98,-3.01 6.02,-6.71 6.06,-11c0.03,-3.03 -0.13,-6.9 -1.53,-9.95c-0.92,-2 -4.15,-4.36 -5,-4.19c-0.25,0.05 -0.43,0.64 -0.44,1.47c-0.03,1.21 0.16,2.44 0.36,3.74c0.32,2.08 0.65,4.24 0.03,6.38c-0.84,2.93 -2.88,5.09 -4.85,7.18c-1.06,1.13 -2.07,2.2 -2.89,3.37c-1.96,2.81 -4.28,7.13 -4.26,11.81l0,0.32c0.02,1.13 0.04,2.54 -0.98,3.16c-0.61,0.37 -1.36,0.31 -2.24,-0.16c-0.81,-0.44 -1.47,-1.12 -2.05,-1.91l-0.1,0.04c-0.05,-0.12 -0.09,-0.24 -0.13,-0.35c-0.62,-0.9 -1.14,-1.92 -1.62,-2.87c-0.4,-0.79 -0.78,-1.54 -1.16,-2.11c-0.4,-0.59 -0.85,-1.47 -1.43,-2.59c-2.28,-4.4 -6.39,-12.33 -15.39,-19.92c-0.03,-0.01 -0.05,-0.02 -0.08,-0.02c-0.19,-0.04 -0.41,-0.07 -0.57,0.04c-0.16,0.11 -0.22,0.31 -0.26,0.5c-0.3,1.33 -0.27,2.71 -0.22,4.07c0.13,3.97 0.22,8.59 2.68,11.85c2.51,3.32 5.93,6.08 8.96,8.92c1.64,1.54 3.28,3.11 4.75,4.81c2.82,3.27 4.65,8.11 9.11,9.54c0.16,0.05 0.32,0.1 0.48,0.14c0.97,0.25 2.01,0.26 2.95,-0.08c0.47,-0.17 0.85,-0.38 1.19,-0.62c0.59,-0.72 1.09,-1.59 1.46,-2.64" id="svg_10"/>
2319                </g>
2320                <g id="svg_11">
2321                    <path class="st3" d="m143.75561,18.30332l0,0c-0.09,-0.19 -0.21,-0.35 -0.35,-0.46c-0.14,-0.11 -0.28,-0.19 -0.43,-0.24c-0.78,-0.27 -1.44,0.12 -2.17,1.08c-0.53,0.69 -1.03,1.68 -1.48,2.94c-0.37,0.28 -0.81,0.54 -1.32,0.8c-0.54,0.27 -1.15,0.54 -1.81,0.79c-0.67,0.26 -1.37,0.5 -2.1,0.74c-0.74,0.24 -1.48,0.47 -2.23,0.68c-1.05,0.3 -2.01,0.65 -2.88,1.04c-0.88,0.4 -1.64,0.87 -2.26,1.39c-0.63,0.54 -1.13,1.16 -1.48,1.84c-0.36,0.7 -0.54,1.49 -0.54,2.37c0,1 0.21,1.89 0.62,2.64c0.41,0.74 0.94,1.36 1.59,1.85c0.64,0.48 1.37,0.84 2.17,1.07c0.79,0.23 1.6,0.34 2.4,0.34c0.24,0 0.45,-0.09 0.64,-0.26c0.19,-0.18 0.29,-0.41 0.29,-0.67c0,-0.26 -0.09,-0.49 -0.26,-0.67c-0.17,-0.18 -0.41,-0.28 -0.67,-0.28c-0.59,0 -1.19,-0.08 -1.78,-0.22c-0.58,-0.14 -1.11,-0.38 -1.57,-0.71c-0.46,-0.32 -0.83,-0.74 -1.11,-1.26c-0.28,-0.51 -0.42,-1.15 -0.42,-1.89c0,-0.63 0.13,-1.19 0.4,-1.67c0.27,-0.49 0.65,-0.93 1.14,-1.31c0.5,-0.39 1.11,-0.75 1.82,-1.05c0.72,-0.31 1.54,-0.59 2.42,-0.85c0.59,-0.17 1.2,-0.35 1.81,-0.53c0.61,-0.18 1.21,-0.37 1.79,-0.57c0.59,-0.19 1.15,-0.4 1.68,-0.62c0.31,-0.13 0.61,-0.26 0.89,-0.4c-0.18,0.76 -0.32,1.56 -0.43,2.4c-0.14,1.08 -0.22,2.22 -0.22,3.4c0,1.25 0.04,2.48 0.12,3.65c0.07,1.1 0.12,2.22 0.15,3.31c-0.68,0.3 -1.45,0.67 -2.28,1.11c-0.92,0.48 -1.86,1.05 -2.81,1.69c-0.94,0.64 -1.88,1.36 -2.79,2.15c-0.91,0.79 -1.73,1.66 -2.44,2.59c-0.71,0.93 -1.3,1.94 -1.73,3.01c-0.44,1.07 -0.66,2.22 -0.66,3.4c0,1.08 0.17,2.04 0.49,2.86c0.33,0.81 0.76,1.5 1.29,2.05c0.53,0.55 1.15,0.97 1.84,1.24c0.68,0.27 1.39,0.41 2.09,0.41c1.64,0 3.06,-0.46 4.21,-1.38c1.13,-0.91 2.06,-2.18 2.75,-3.78c0.68,-1.58 1.18,-3.5 1.48,-5.68c0.3,-2.18 0.46,-4.6 0.46,-7.19l0,-1.29c0.34,-0.15 0.61,-0.28 0.81,-0.38c0.32,-0.17 0.5,-0.46 0.5,-0.82c0,-0.26 -0.1,-0.48 -0.29,-0.65c-0.29,-0.25 -0.64,-0.29 -1.06,-0.16c-0.04,-1.07 -0.09,-2.08 -0.15,-3.02c-0.07,-1.06 -0.1,-2.12 -0.1,-3.16c0,-1.46 0.11,-2.81 0.34,-4.02c0.22,-1.18 0.48,-2.24 0.8,-3.16c0.88,-0.65 1.59,-1.29 2.11,-1.93c0.57,-0.7 0.85,-1.32 0.85,-1.9c0,-0.25 -0.04,-0.47 -0.13,-0.66zm-5.56,20.7c-0.01,1.35 -0.05,2.69 -0.13,3.99c-0.09,1.44 -0.24,2.81 -0.46,4.09c-0.21,1.27 -0.5,2.46 -0.84,3.51c-0.34,1.04 -0.78,1.96 -1.29,2.71c-0.5,0.74 -1.1,1.33 -1.78,1.74c-0.67,0.41 -1.45,0.61 -2.34,0.61c-0.51,0 -1,-0.1 -1.48,-0.29c-0.48,-0.19 -0.91,-0.49 -1.28,-0.88c-0.37,-0.39 -0.68,-0.88 -0.9,-1.47c-0.23,-0.59 -0.34,-1.29 -0.34,-2.08c0,-0.94 0.19,-1.86 0.55,-2.73c0.37,-0.89 0.87,-1.75 1.48,-2.55c0.62,-0.81 1.33,-1.57 2.11,-2.28c0.79,-0.71 1.62,-1.36 2.45,-1.94c0.84,-0.59 1.67,-1.1 2.47,-1.54c0.64,-0.34 1.23,-0.64 1.78,-0.89z" id="svg_12"/>
2322                    <path class="st3" d="m180.38561,33.66332c0.51,0 0.96,-0.18 1.31,-0.54c0.36,-0.36 0.54,-0.8 0.54,-1.31c0,-0.25 -0.05,-0.5 -0.14,-0.72c-0.09,-0.22 -0.23,-0.42 -0.4,-0.59s-0.37,-0.3 -0.59,-0.4c-0.45,-0.19 -1,-0.19 -1.45,0c-0.22,0.09 -0.42,0.23 -0.59,0.4c-0.17,0.17 -0.3,0.37 -0.4,0.59c-0.1,0.22 -0.14,0.47 -0.14,0.72c0,0.51 0.18,0.96 0.54,1.31c0.36,0.36 0.8,0.54 1.32,0.54zm-0.28,-1.85c0,-0.08 0.03,-0.15 0.09,-0.21l0,0c0.06,-0.06 0.11,-0.09 0.19,-0.09c0.08,0 0.14,0.03 0.21,0.09s0.09,0.13 0.09,0.21c0,0.08 -0.03,0.13 -0.09,0.19c-0.13,0.12 -0.29,0.13 -0.41,0c-0.06,-0.05 -0.08,-0.11 -0.08,-0.19z" id="svg_13"/>
2323                    <path class="st3" d="m203.35561,39.57332l0,0c-0.29,-0.35 -0.82,-0.42 -1.21,-0.17c-0.16,0.1 -0.28,0.24 -0.36,0.43c-0.12,0.29 -0.31,0.67 -0.56,1.14c-0.25,0.47 -0.55,0.93 -0.88,1.37c-0.33,0.44 -0.7,0.83 -1.09,1.15c-0.36,0.29 -0.71,0.44 -1.07,0.44c-0.17,0 -0.31,-0.04 -0.41,-0.11c-0.1,-0.08 -0.18,-0.18 -0.24,-0.32c-0.07,-0.16 -0.12,-0.36 -0.14,-0.58c-0.03,-0.24 -0.04,-0.49 -0.04,-0.75c0,-0.21 0.01,-0.43 0.03,-0.67l0.1,-1.4c0.02,-0.22 0.03,-0.41 0.03,-0.56c0,-0.69 -0.16,-1.29 -0.48,-1.77c-0.34,-0.52 -0.87,-0.79 -1.57,-0.79c-0.34,0 -0.71,0.1 -1.09,0.3c-0.37,0.19 -0.74,0.51 -1.09,0.94c-0.33,0.41 -0.66,0.86 -0.96,1.32c-0.31,0.46 -0.6,0.92 -0.87,1.39c-0.25,0.42 -0.49,0.84 -0.71,1.25c0.03,-0.39 0.07,-0.78 0.1,-1.18c0.04,-0.5 0.08,-0.96 0.11,-1.4c0.03,-0.44 0.04,-0.77 0.04,-0.98c0,-0.29 -0.03,-0.58 -0.08,-0.86c-0.06,-0.29 -0.
232315,-0.55 -0.26,-0.79c-0.13,-0.26 -0.31,-0.47 -0.53,-0.63c-0.23,-0.17 -0.52,-0.25 -0.84,-0.25c-0.54,0 -1.07,0.33 -1.58,0.98c-0.47,0.6 -0.96,1.52 -1.49,2.77l-0.02,0.06c-0.33,0.66 -0.67,1.25 -1,1.77c-0.36,0.56 -0.71,1.04 -1.06,1.44c-0.34,0.39 -0.68,0.69 -0.99,0.91c-0.47,0.31 -0.87,0.36 -1.34,0.2c-0.16,-0.05 -0.32,-0.16 -0.47,-0.33c-0.16,-0.17 -0.29,-0.42 -0.4,-0.75c-0.11,-0.34 -0.17,-0.8 -0.17,-1.37c0,-0.44 0.01,-0.92 0.04,-1.45c0.03,-0.53 0.06,-1.02 0.1,-1.49l0.1,-1.22c0.03,-0.36 0.04,-0.57 0.04,-0.64c0,-0.24 -0.08,-0.46 -0.25,-0.65c-0.35,-0.41 -0.99,-0.38 -1.34,-0.03c-0.17,0.17 -0.27,0.36 -0.3,0.59c-0.11,0.85 -0.19,1.78 -0.24,2.83c-0.03,0.03 -0.05,0.07 -0.08,0.12c-0.16,0.36 -0.36,0.78 -0.61,1.26c-0.24,0.47 -0.52,0.93 -0.84,1.35c-0.31,0.42 -0.64,0.77 -1,1.05c-0.32,0.26 -0.65,0.39 -0.99,0.39c-0.87,0 -1.6,-1.25 -2.11,-3.62c0.3,-0.73 0.63,-1.59 0.99,-2.57c0.38,-1.02 0.74,-2.16 1.08,-3.37c0.33,-1.2 0.62,-2.49 0.85,-3.82c0.23,-1.33 0.35,-2.68 0.35,-4.02c0,-0.63 -0.04,-1.21 -0.12,-1.74c-0.08,-0.53 -0.21,-1 -0.39,-1.39c-0.18,-0.41 -0.43,-0.73 -0.73,-0.97c-0.67,-0.52 -1.74,-0.5 -2.47,0.14c-0.36,0.31 -0.67,0.75 -0.93,1.28c-0.25,0.51 -0.47,1.12 -0.65,1.8c-0.17,0.67 -0.31,1.38 -0.42,2.13c-0.1,0.76 -0.18,1.52 -0.22,2.28c-0.04,0.77 -0.07,1.52 -0.07,2.23c0,1.62 0.08,3.1 0.24,4.4c-0.08,-0.02 -0.17,-0.04 -0.26,-0.04c-0.57,0 -1.15,0.14 -1.71,0.42c-0.56,0.28 -1.08,0.67 -1.53,1.17c-0.28,0.31 -0.54,0.68 -0.79,1.16l-0.04,0.02c-0.15,0.09 -0.27,0.21 -0.36,0.36c-0.19,0.37 -0.43,0.81 -0.72,1.3c-0.28,0.48 -0.6,0.95 -0.96,1.39c-0.35,0.43 -0.73,0.8 -1.14,1.1c-0.38,0.28 -0.78,0.42 -1.21,0.42c-0.13,0 -0.28,-0.03 -0.44,-0.08c-0.15,-0.05 -0.29,-0.14 -0.43,-0.27c-0.14,-0.13 -0.26,-0.31 -0.36,-0.54c-0.1,-0.23 -0.15,-0.53 -0.15,-0.9c0,-0.27 0.02,-0.55 0.05,-0.84c0.03,-0.29 0.07,-0.59 0.12,-0.89c0.05,-0.3 0.09,-0.6 0.12,-0.89c0.04,-0.29 0.05,-0.58 0.05,-0.86c0,-0.74 -0.21,-1.29 -0.62,-1.63c-0.49,-0.41 -1.25,-0.52 -2.23,-0.49c-0.09,0 -0.18,0 -0.27,0.01c-0.01,-0.16 -0.03,-0.34 -0.05,-0.54c-0.04,-0.32 -0.11,-0.64 -0.21,-0.93c-0.1,-0.32 -0.25,-0.59 -0.44,-0.81c-0.42,-0.49 -1.16,-0.58 -1.77,0.04c-0.25,0.25 -0.47,0.55 -0.66,0.89c-0.19,0.33 -0.35,0.68 -0.46,1.03c-0.12,0.37 -0.18,0.65 -0.18,0.88c0,0.33 0.08,0.6 0.23,0.8c0.15,0.19 0.34,0.33 0.56,0.42c0.21,0.08 0.43,0.13 0.66,0.14c0.08,0 0.17,0.01 0.25,0.01c-0.07,0.32 -0.13,0.56 -0.18,0.74c-0.06,0.21 -0.11,0.36 -0.12,0.39c-0.03,0.03 -0.08,0.08 -0.12,0.16c-0.1,0.21 -0.23,0.47 -0.38,0.76c-0.14,0.29 -0.31,0.59 -0.5,0.9c-0.19,0.31 -0.4,0.62 -0.63,0.93c-0.22,0.3 -0.46,0.57 -0.7,0.8c-0.24,0.23 -0.48,0.41 -0.72,0.54c-0.56,0.31 -1.13,0.23 -1.43,-0.14c-0.21,-0.25 -0.37,-0.56 -0.48,-0.9c-0.11,-0.37 -0.19,-0.74 -0.22,-1.11c-0.03,-0.39 -0.06,-0.69 -0.07,-0.91c-0.02,-0.23 -0.11,-0.43 -0.28,-0.61c-0.35,-0.37 -0.92,-0.35 -1.28,-0.04c-0.18,0.16 -0.29,0.35 -0.32,0.59c-0.08,0.56 -0.21,1.05 -0.39,1.45c-0.19,0.41 -0.4,0.75 -0.62,1.01c-0.22,0.25 -0.45,0.44 -0.68,0.56c-0.55,0.28 -0.89,0.19 -1.14,0.04c-0.15,-0.09 -0.27,-0.2 -0.36,-0.35c-0.09,-0.15 -0.16,-0.32 -0.2,-0.51c-0.04,-0.2 -0.06,-0.4 -0.06,-0.6c0,-0.65 0.1,-1.22 0.31,-1.68c0.21,-0.47 0.47,-0.87 0.77,-1.18c0.3,-0.3 0.63,-0.53 0.99,-0.67c0.61,-0.24 1.18,-0.26 1.58,-0.15c0.17,0.04 0.31,0.1 0.43,0.16c0.15,0.07 0.23,0.13 0.27,0.17c0.07,0.05 0.11,0.09 0.13,0.1c0.36,0.36 0.96,0.38 1.34,-0.01c0.18,-0.19 0.27,-0.41 0.27,-0.66c0,-0.23 -0.09,-0.45 -0.28,-0.68c-0.01,-0.01 -0.08,-0.07 -0.2,-0.17c-0.13,-0.11 -0.31,-0.23 -0.54,-0.35c-0.23,-0.12 -0.5,-0.23 -0.81,-0.34c-0.8,-0.26 -1.81,-0.2 -2.81,0.2c-0.6,0.24 -1.15,0.61 -1.64,1.09c-0.49,0.48 -0.9,1.08 -1.22,1.79c-0.32,0.71 -0.48,1.54 -0.48,2.47c0,0.48 0.07,0.92 0.21,1.33c0.14,0.41 0.35,0.77 0.61,1.08c0.27,0.31 0.6,0.56 0.98,0.73c0.86,0.39 2.01,0.37 3.05,-0.37c0.42,-0.3 0.81,-0.69 1.14,-1.15c0.21,0.45 0.5,0.84 0.84,1.16c0.51,0.47 1.14,0.71 1.87,0.71c0.51,0 1.01,-0.12 1.47,-0.37c0.44,-0.23 0.86,-0.53 1.24,-0.89c0.38,-0.35 0.72,-0.75 1.03,-1.17c0.3,-0.41 0.56,-0.81 0.79,-1.2c0.23,-0.38 0.41,-0.72 0.56,-1.02l0.27,-0.55c0.03,-0.05 0.06,-0.12 0.11,-0.26c0.05,-0.13 0.1,-0.29 0.17,-0.5s0.13,-0.44 0.2,-0.72c0.05,-0.21 0.1,-0.42 0.14,-0.65c0.12,0 0.24,-0.01 0.35,-0.01l0.52,0c0.33,0 0.42,0.06 0.42,0.06c0.04,0.05 0.07,0.15 0.07,0.29c0,0.49 -0.06,1.01 -0.16,1.56c-0.12,0.58 -0.18,1.17 -0.18,1.76c0,0.57 0.09,1.09 0.26,1.55c0.17,0.46 0.41,0.86 0.7,1.17c0.29,0.32 0.65,0.57 1.05,0.74c1.04,0.44 2.29,0.3 3.26,-0.32c0.57,-0.37 1.1,-0.82 1.56,-1.36c0.09,-0.11 0.18,-0.22 0.27,-0.33c0.02,0.08 0.05,0.16 0.07,0.23c0.16,0.43 0.38,0.79 0.64,1.07c0.27,0.28 0.6,0.49 0.96,0.61c0.35,0.12 0.72,0.18 1.09,0.18c0.73,0 1.4,-0.29 2.02,-0.87c0.47,-0.45 0.95,-1.11 1.41,-1.98c0.36,0.93 0.78,1.61 1.25,2.07c0.6,0.58 1.33,0.88 2.17,0.88c0.46,0 0.9,-0.11 1.31,-0.33c0.39,-0.21 0.76,-0.48 1.11,-0.81c0.34,-0.32 0.66,-0.69 0.95,-1.09c0.04,-0.06 0.09,-0.12 0.13,-0.19c0.01,0.04 0.02,0.08 0.03,0.11c0.14,0.53 0.36,1 0.65,1.39c0.29,0.4 0.65,0.72 1.08,0.96c0.43,0.24 0.93,0.36 1.5,0.36c0.45,0 0.89,-0.11 1.31,-0.32c0.41,-0.2 0.81,-0.47 1.18,-0.8c0.37,-0.33 0.71,-0.69 1.04,-1.1c0.32,-0.4 0.62,-0.81 0.88,-1.21c0.27,-0.41 0.51,-0.8 0.71,-1.18c0.21,-0.38 0.38,-0.7 0.51,-0.95l0.04,-0.07c0.4,-0.97 0.73,-1.65 0.98,-2.03c0.05,-0.08 0.1,-0.15 0.14,-0.21c0.02,0.23 0.03,0.46 0.03,0.7c0,0.21 -0.01,0.47 -0.
232303,0.78c-0.02,0.32 -0.05,0.66 -0.08,1.03l-0.1,1.12c-0.03,0.38 -0.07,0.72 -0.1,1.05c-0.04,0.33 -0.06,0.61 -0.09,0.84c-0.02,0.25 -0.04,0.42 -0.04,0.5c0,0.45 0.13,0.8 0.39,1.06c0.45,0.45 1.22,0.56 1.88,0.08c0.27,-0.2 0.53,-0.55 0.78,-1.08c0.11,-0.25 0.27,-0.56 0.46,-0.93c0.2,-0.38 0.41,-0.78 0.65,-1.2c0.23,-0.42 0.48,-0.84 0.74,-1.26c0.26,-0.42 0.52,-0.8 0.77,-1.13c0.24,-0.32 0.48,-0.59 0.7,-0.79c0.23,-0.21 0.36,-0.24 0.4,-0.24c0,0 0.04,0.02 0.11,0.1c0.02,0.02 0.1,0.14 0.1,0.55c0,0.21 -0.01,0.43 -0.02,0.66c-0.02,0.23 -0.04,0.47 -0.07,0.7c-0.03,0.25 -0.05,0.48 -0.07,0.7c-0.02,0.23 -0.03,0.43 -0.03,0.61c0,0.41 0.03,0.83 0.1,1.23c0.07,0.43 0.2,0.82 0.4,1.18c0.21,0.37 0.49,0.67 0.85,0.89c0.69,0.43 1.88,0.5 2.86,-0.03c0.44,-0.24 0.85,-0.54 1.22,-0.9c0.37,-0.35 0.71,-0.75 1.02,-1.18c0.3,-0.42 0.57,-0.82 0.79,-1.2c0.23,-0.39 0.41,-0.71 0.55,-1.01c0.14,-0.28 0.23,-0.47 0.28,-0.58c0.05,-0.12 0.08,-0.24 0.08,-0.36c0.03,-0.18 -0.05,-0.39 -0.21,-0.59zm-32.9,2.47c-0.27,0.5 -0.52,0.89 -0.74,1.16c-0.21,0.25 -0.39,0.42 -0.55,0.49c-0.16,0.08 -0.32,0.12 -0.45,0.12c-0.35,0 -0.6,-0.12 -0.77,-0.36c-0.19,-0.26 -0.29,-0.65 -0.29,-1.15c0,-0.65 0.1,-1.22 0.29,-1.68c0.2,-0.46 0.44,-0.85 0.74,-1.14c0.3,-0.3 0.62,-0.53 0.98,-0.68c0.36,-0.16 0.7,-0.26 1.01,-0.3c0.14,-0.02 0.27,-0.06 0.38,-0.13c0.09,0.62 0.19,1.19 0.29,1.72c-0.33,0.8 -0.63,1.46 -0.89,1.95zm3.53,-9.75c-0.22,0.97 -0.48,1.92 -0.77,2.82c-0.16,0.5 -0.33,1.01 -0.5,1.5c-0.05,-0.45 -0.09,-0.92 -0.13,-1.41c-0.08,-0.98 -0.12,-1.99 -0.12,-2.98c0,-1.04 0.05,-2.07 0.16,-3.09c0.11,-1.01 0.25,-1.93 0.43,-2.73c0.17,-0.79 0.38,-1.43 0.62,-1.91c0.18,-0.37 0.37,-0.58 0.53,-0.58c0.02,0 0.08,0 0.14,0.13c0.09,0.17 0.16,0.39 0.22,0.65c0.06,0.27 0.1,0.57 0.11,0.88c0.02,0.32 0.03,0.63 0.03,0.91c0,0.96 -0.07,1.94 -0.19,2.91c-0.14,0.96 -0.32,1.94 -0.53,2.9zm-17.89,4.34c0,0 0,0 0,0l-0.04,0c0.01,-0.03 0.02,-0.06 0.03,-0.09c0.01,0.03 0.01,0.06 0.01,0.09z" id="svg_14"/>
2324                </g>
2325                <g id="svg_15">
2326                    <path class="st3" d="m97.89561,45.22332l0,-0.65c0.5,-0.03 0.84,-0.14 1.02,-0.34c0.18,-0.2 0.28,-0.48 0.3,-0.84c0.02,-0.36 0.03,-0.77 0.03,-1.23l0,-8.48c0,-0.26 0.01,-0.51 0.02,-0.76c0.01,-0.24 0.03,-0.46 0.04,-0.66c-0.24,0.01 -0.47,0.03 -0.71,0.04c-0.24,0.01 -0.47,0.03 -0.71,0.04l0,-0.86l4.41,0l0,0.65c-0.48,0.01 -0.82,0.12 -1.01,0.33c-0.19,0.21 -0.29,0.49 -0.31,0.84c-0.02,0.35 -0.03,0.76 -0.03,1.24l0,8.42c0,0.35 0,0.65 -0.01,0.9c-0.01,0.25 -0.02,0.46 -0.05,0.63l3.67,-0.06c0.82,-0.01 1.45,-0.27 1.87,-0.78c0.42,-0.51 0.64,-1.34 0.64,-2.49l0.67,0l-0.12,4.06l-9.72,0z" id="svg_16"/>
2327                    <path class="st3" d="m113.77561,45.54332c-0.9,0 -1.72,-0.21 -2.44,-0.64c-0.73,-0.43 -1.3,-1.03 -1.72,-1.81s-0.63,-1.7 -0.63,-2.76c0,-0.92 0.21,-1.77 0.62,-2.57c0.41,-0.8 0.99,-1.44 1.74,-1.93c0.75,-0.49 1.61,-0.74 2.59,-0.74c0.55,0 1.06,0.09 1.54,0.26c0.48,0.18 0.9,0.45 1.27,0.8c0.37,0.36 0.65,0.81 0.86,1.35c0.21,0.54 0.31,1.18 0.31,1.91l-6.91,0.12c0,0.99 0.11,1.87 0.32,2.62s0.57,1.33 1.05,1.75s1.1,0.62 1.86,0.62c0.41,0 0.82,-0.07 1.25,-0.22c0.42,-0.14 0.82,-0.34 1.19,-0.59c0.37,-0.25 0.66,-0.52 0.88,-0.82l0.47,0.39c-0.35,0.55 -0.78,0.99 -1.27,1.31c-0.5,0.33 -1.01,0.56 -1.53,0.71c-0.53,0.16 -1.01,0.24 -1.45,0.24zm-2.71,-6.81l5,0c0,-0.47 -0.07,-0.92 -0.21,-1.36c-0.14,-0.44 -0.36,-0.8 -0.68,-1.08s-0.73,-0.42 -1.24,-0.42c-0.76,0 -1.39,0.23 -1.89,0.68s-0.82,1.17 -0.98,2.18z" id="svg_17"/>
2328                    <path class="st3" d="m213.52561,45.54332c-0.8,0 -1.52,-0.2 -2.16,-0.6c-0.64,-0.4 -1.15,-0.97 -1.52,-1.72c-0.37,-0.75 
2328-0.56,-1.62 -0.56,-2.63c0,-1.07 0.22,-2.02 0.65,-2.85c0.43,-0.82 1.03,-1.47 1.79,-1.94c0.77,-0.47 1.63,-0.71 2.6,-0.71c0.43,0 0.86,0.06 1.29,0.17s0.76,0.24 1.01,0.38l0,-2.69c0,-0.21 0,-0.41 0.01,-0.6c0.01,-0.19 0.02,-0.42 0.05,-0.68c-0.24,0.01 -0.47,0.03 -0.7,0.04c-0.23,0.01 -0.46,0.03 -0.7,0.04l0,-0.82c0.58,0 1.02,-0.03 1.33,-0.08c0.31,-0.05 0.55,-0.12 0.72,-0.2c0.16,-0.08 0.29,-0.16 0.38,-0.26l0.57,0l0,12.73c0,0.21 -0.01,0.42 -0.02,0.63c-0.01,0.21 -0.03,0.45 -0.06,0.71c0.24,-0.01 0.47,-0.03 0.7,-0.04c0.23,-0.01 0.46,-0.03 0.7,-0.04l0,0.82l-2.81,0c-0.04,-0.2 -0.07,-0.38 -0.09,-0.54c-0.02,-0.16 -0.04,-0.32 -0.05,-0.48c-0.37,0.41 -0.82,0.73 -1.35,0.97c-0.53,0.26 -1.13,0.39 -1.78,0.39zm0.7,-0.97c0.43,0 0.87,-0.12 1.3,-0.37c0.44,-0.25 0.8,-0.56 1.09,-0.92c-0.01,-0.16 -0.02,-0.32 -0.02,-0.5s0,-0.37 0,-0.58l0.02,-5.65c-0.31,-0.24 -0.66,-0.41 -1.03,-0.52c-0.37,-0.11 -0.75,-0.17 -1.15,-0.17c-0.65,0 -1.22,0.19 -1.71,0.57c-0.48,0.38 -0.85,0.91 -1.1,1.59c-0.25,0.68 -0.36,1.48 -0.33,2.39c0.03,0.8 0.15,1.51 0.38,2.14c0.23,0.63 0.56,1.12 0.98,1.48c0.44,0.36 0.96,0.54 1.57,0.54z" id="svg_18"/>
2329                    <path class="st3" d="m225.19561,45.54332c-0.71,0 -1.3,-0.13 -1.78,-0.39c-0.48,-0.26 -0.84,-0.71 -1.08,-1.33c-0.24,-0.63 -0.36,-1.48 -0.36,-2.55l0,-3.49c0,-0.21 0,-0.42 0.01,-0.63c0.01,-0.21 0.03,-0.43 0.07,-0.65c-0.22,0.01 -0.45,0.02 -0.68,0.03c-0.23,0.01 -0.45,0.02 -0.68,0.03l0,-0.81l0.61,0c0.56,0 0.97,-0.06 1.23,-0.17c0.25,-0.11 0.45,-0.23 0.6,-0.36l0.57,0l0,5.98c0,1.12 0.16,1.97 0.48,2.52c0.32,0.56 0.87,0.83 1.64,0.81c0.5,-0.01 0.97,-0.17 1.42,-0.46c0.45,-0.29 0.81,-0.64 1.09,-1.05l0,-5.04c0,-0.31 0.01,-0.58 0.02,-0.81c0.01,-0.23 0.04,-0.46 0.08,-0.68c-0.24,0.01 -0.47,0.02 -0.71,0.03s-0.47,0.02 -0.71,0.03l0,-0.8l0.61,0c0.56,0 0.97,-0.06 1.23,-0.17c0.25,-0.11 0.45,-0.23 0.6,-0.36l0.57,0l-0.02,7.42c0,0.21 -0.01,0.5 -0.02,0.88c-0.01,0.38 -0.03,0.7 -0.06,0.96c0.24,-0.01 0.47,-0.03 0.71,-0.04c0.24,-0.01 0.47,-0.03 0.71,-0.04l0,0.82l-2.81,0c-0.04,-0.22 -0.07,-0.43 -0.09,-0.63s-0.04,-0.38 -0.05,-0.55c-0.41,0.41 -0.9,0.75 -1.47,1.05c-0.58,0.3 -1.15,0.45 -1.73,0.45z" id="svg_19"/>
2330                    <path class="st3" d="m238.14561,44.57332c0.5,-0.03 0.84,-0.14 1.02,-0.34c0.18,-0.2 0.28,-0.48 0.3,-0.84c0.02,-0.36 0.03,-0.77 0.03,-1.23l0,-8.48c0,-0.26 0.01,-0.51 0.02,-0.76c0.01,-0.24 0.03,-0.46 0.04,-0.66c-0.24,0.01 -0.47,0.03 -0.71,0.04c-0.24,0.01 -0.47,0.03 -0.71,0.04l0,-0.86c0.69,-0.01 1.41,-0.02 2.14,-0.03c0.73,-0.01 1.48,-0.01 2.24,-0.01c1.27,0 2.33,0.14 3.2,0.43c0.86,0.29 1.52,0.71 1.98,1.28s0.71,1.26 0.75,2.1c0.03,0.51 -0.05,1.04 -0.23,1.6c-0.18,0.56 -0.5,1.08 -0.98,1.57c-0.48,0.49 -1.15,0.89 -2.01,1.19s-1.97,0.45 -3.32,0.45c-0.05,0 -0.15,0 -0.29,0s-0.28,-0.01 -0.41,-0.02l0,2.84c0,0.35 0,0.66 -0.01,0.91c-0.01,0.26 -0.02,0.47 -0.05,0.64c0.21,-0.01 0.41,-0.03 0.61,-0.04c0.2,-0.01 0.4,-0.02 0.6,-0.03c0.2,-0.01 0.4,-0.02 0.6,-0.03l0,0.88l-4.81,0l0,-0.64zm3.06,-5.33c0.25,0.03 0.46,0.04 0.64,0.05c0.18,0.01 0.39,0.01 0.64,0.01c0.75,0 1.43,-0.15 2.04,-0.44c0.61,-0.29 1.1,-0.72 1.47,-1.27c0.37,-0.55 0.55,-1.2 0.55,-1.96c0,-0.62 -0.1,-1.
233014 -0.29,-1.58c-0.2,-0.44 -0.47,-0.79 -0.83,-1.06c-0.36,-0.27 -0.79,-0.46 -1.29,-0.59c-0.5,-0.12 -1.05,-0.19 -1.65,-0.19c-0.46,0 -0.78,0.1 -0.95,0.29c-0.18,0.2 -0.28,0.47 -0.29,0.81s-0.03,0.75 -0.03,1.23l0,4.7l-0.01,0z" id="svg_20"/>
2331                    <path class="st3" d="m249.81561,44.63332c0.41,0 0.69,-0.1 0.84,-0.3s0.25,-0.48 0.27,-0.84s0.04,-0.78 0.04,-1.25l0,-4.47c0,-0.21 0.01,-0.41 0.02,-0.6c0.01,-0.19 0.03,-0.42 0.06,-0.68c-0.24,0.01 -0.47,0.03 -0.7,0.04c-0.23,0.01 -0.46,0.03 -0.7,0.04l0,-0.82c0.58,0 1.02,-0.03 1.33,-0.08c0.31,-0.05 0.55,-0.12 0.72,-0.2c0.16,-0.08 0.29,-0.16 0.38,-0.25l0.57,0l0,7.93c0,0.26 0,0.49 -0.01,0.7c-0.01,0.2 -0.03,0.42 -0.07,0.64c0.21,-0.01 0.42,-0.02 0.62,-0.03c0.2,-0.01 0.41,-0.02 0.62,-0.03l0,0.8l-4,0l0,-0.6l0.01,0zm1.91,-11.36c-0.27,0 -0.52,-0.11 -0.73,-0.33c-0.21,-0.22 -0.31,-0.5 -0.31,-0.82c0,-0.33 0.11,-0.6 0.32,-0.83c0.22,-0.23 0.46,-0.34 0.74,-0.34c0.3,0 0.55,0.11 0.75,0.34c0.2,0.23 0.3,0.51 0.3,0.83c0,0.33 -0.11,0.6 -0.32,0.82c-0.21,0.22 -0.47,0.33 -0.75,0.33z" id="svg_21"/>
2332                    <path class="st3" d="m260.11561,45.54332c-0.88,0 -1.68,-0.2 -2.42,-0.6c-0.74,-0.4 -1.33,-0.97 -1.77,-1.73c-0.44,-0.75 -0.66,-1.66 -0.66,-2.72c0,-0.68 0.12,-1.34 0.37,-1.98c0.25,-0.64 0.6,-1.22 1.05,-1.74s0.99,-0.93 1.62,-1.23s1.32,-0.45 2.08,-0.45c0.73,0 1.37,0.11 1.91,0.33s0.96,0.52 1.27,0.88s0.45,0.76 0.45,1.2c0,0.29 -0.08,0.53 -0.24,0.74s-0.39,0.3 -0.69,0.3c-0.33,0.01 -0.56,-0.09 -0.7,-0.3c-0.14,-0.22 -0.21,-0.41 -0.21,-0.58c0,-0.13 0.02,-0.26 0.06,-0.4c0.04,-0.14 0.12,-0.26 0.24,-0.38c-0.1,-0.31 -0.29,-0.55 -0.55,-0.7c-0.26,-0.15 -0.53,-0.25 -0.81,-0.29s-0.51,-0.07 -0.7,-0.07c-0.89,0 -1.64,0.36 -2.25,1.07c-0.61,0.71 -0.91,1.75 -0.91,3.11c0,0.88 0.14,1.65 0.42,2.33c0.28,0.68 0.68,1.21 1.19,1.6c0.51,0.39 1.1,0.58 1.77,0.58c0.61,0 1.2,-0.16 1.77,-0.49c0.56,-0.33 1,-0.73 1.31,-1.2l0.51,0.39c-0.34,0.55 -0.75,0.99 -1.23,1.33c-0.48,0.34 -0.97,0.59 -1.47,0.75c-0.49,0.17 -0.96,0.25 -1.41,0.25z" id="svg_22"/>
2333                    <path class="st3" d="m269.94561,45.42332l-4.45,-10.44c-0.29,-0.67 -0.49,-1.21 -0.61,-1.62c-0.12,-0.41 -0.2,-0.76 -0.24,-1.05c-0.18,0.01 -0.37,0.02 -0.55,0.02s-0.37,0.01 -0.55,0.02l0,-0.86l4.55,0l-0.02,0.67c-0.65,0.04 -1.05,0.24 -1.18,0.6c-0.13,0.36 -0.07,0.87 0.2,1.52c0.31,0.77 0.61,1.52 0.9,2.24c0.29,0.72 0.61,1.5 0.96,2.33c0.31,0.73 0.62,1.44 0.91,2.11c0.29,0.67 0.52,1.23 0.68,1.68l0.04,0c0.14,-0.46 0.29,-0.9 0.44,-1.31s0.33,-0.91 0.54,-1.49c0.39,-1.1 0.72,-2.03 0.99,-2.79c0.27,-0.76 0.5,-1.41 0.7,-1.94s0.36,-0.99 0.49,-1.37c0.12,-0.34 0.22,-0.63 0.31,-0.86s0.18,-0.43 0.26,-0.59c-0.25,0.01 -0.5,0.03 -0.75,0.04c-0.25,0.01 -0.5,0.03 -0.76,0.04l0,-0.86l3.98,0l0,0.65c-0.58,0.03 -1.02,0.18 -1.32,0.45c-0.31,0.28 -0.59,0.77 -0.83,1.47c-0.03,0.07 -0.06,0.15 -0.1,0.27c-0.04,0.11 -0.11,0.29 -0.2,0.54c-0.09,0.25 -0.22,0.61 -0.39,1.09s-0.4,1.12 -0.7,1.93c-0.29,0.81 -0.67,1.83 -1.12,3.06c-0.45,1.23 -1,2.72 -1.64,4.47l-0.54,0l0,-0.02z" id="svg_23"/>
2334                    <path class="st3" d="m280.50561,45.54332c-0.9,0 -1.72,-0.21 -2.44,-0.64c-0.73,-0.43 -1.3,-1.03 -1.72,-1.81c-0.42,-0.78 -0.63,-1.7 -0.63,-2.76c0,-0.92 0.21,-1.77 0.62,-2.57c0.41,-0.8 0.99,-1.44 1.74,-1.93c0.75,-0.49 1.61,-0.74 2.59,-0.74c0.55,0 1.06,0.09 1.54,0.26c0.48,0.18 0.9,0.45 1.27,0.8c0.37,0.36 0.65,0.81 0.86,1.35c0.21,0.54 0.31,1.18 0.31,1.91l-6.91,0.12c0,0.99 0.11,1.87 0.32,2.62s0.57,1.33 1.05,1.75c0.48,0.41 1.1,0.62 1.86,0.62c0.41,0 0.82,-0.07 1.25,-0.22s0.82,-0.34 1.19,-0.59c0.37,-0.25 0.66,-0.52 0.88,-0.82l0.47,0.39c-0.35,0.55 -0.78,0.99 -1.28,1.31c-0.5,0.33 -1.01,0.56 -1.53,0.71c-0.51,0.16 -1,0.24 -1.44,0.24zm-2.71,-6.81l5,0c0,-0.47 -0.07,-0.92 -0.21,-1.36c-0.14,-0.44 -0.36,-0.8 -0.68,-1.08c-0.31,-0.28 -0.73,-0.42 -1.24,-0.42c-0.76,0 -1.39,0.23 -1.89,0.68c-0.49,0.44 -0.82,1.17 -0.98,2.18z" id="svg_24"/>
2335                    <path class="st3" d="m286.38561,44.63332c0.41,0 0.69,-0.1 0.84,-0.3s0.25,-0.48 0.27,-0.84s0.04,-0.78 0.04,-1.25l0,-4.47c0,-0.21 0,-0.42 0.01,-0.63c0.01,-0.21 0.03,-0.43 0.07,-0.65c-0.24,0.01 -0.47,0.02 -0.7,0.03c-0.23,0.01 -0.46,0.02 -0.7,0.03l0,-0.8l0.61,0c0.56,0 0.95,-0.06 1.17,-0.17c0.22,-0.11 0.4,-0.23 0.54,-0.36l0.57,0c0.03,0.21 0.04,0.47 0.06,0.77c0.01,0.31 0.03,0.7 0.04,1.17c0.2,-0.33 0.46,-0.65 0.8,-0.96c0.34,-0.31 0.72,-0.58 1.15,-0.78c0.42,-0.21 0.87,-0.31 1.34,-0.31c0.37,0 0.69,0.1 0.96,0.29c0.27,0.2 0.41,0.51 0.41,0.94c0,0.1 -0.03,0.23 -0.1,0.38s-0.17,0.28 -0.31,0.39c-0.14,0.11 -0.33,0.17 -0.57,0.17c-0.29,-0.01 -0.52,-0.13 -0.69,-0.34s-0.24,-0.47 -0.2,-0.76c-0.33,-0.01 -0.66,0.07 -1.01,0.25c-0.35,0.18 -0.67,0.44 -0.97,0.76s-0.57,0.7 -0.8,1.13l0.02,4.83c0,0.26 0,0.49 -0.01,0.7c-0.01,0.2 -0.03,0.42 -0.07,0.64c0.21,-0.01 0.42,-0.02 0.62,-0.
233503c0.2,-0.01 0.41,-0.02 0.62,-0.03l0,0.8l-4.02,0l0,-0.6l0.01,0z" id="svg_25"/>
2336                    <path class="st3" d="m298.57561,45.54332c-0.3,0 -0.61,-0.04 -0.92,-0.13c-0.31,-0.08 -0.61,-0.25 -0.87,-0.5c-0.27,-0.25 -0.48,-0.61 -0.64,-1.09s-0.24,-1.11 -0.24,-1.89l0.04,-5.69l-1.51,0.02l0,-0.84c0.34,-0.01 0.69,-0.14 1.04,-0.38c0.35,-0.24 0.67,-0.57 0.95,-0.99c0.28,-0.42 0.47,-0.88 0.58,-1.37l0.67,0l0,2.75l3.3,0l0,0.76l-3.3,0.04l-0.04,5.45c0,0.59 0.05,1.09 0.15,1.5c0.1,0.41 0.26,0.72 0.48,0.93c0.22,0.21 0.51,0.31 0.86,0.31c0.37,0 0.71,-0.1 1.03,-0.31s0.61,-0.5 0.85,-0.86l0.53,0.43c-0.29,0.43 -0.57,0.77 -0.85,1.02c-0.28,0.25 -0.55,0.43 -0.81,0.56s-0.5,0.2 -0.73,0.24c-0.23,0.02 -0.41,0.04 -0.57,0.04z" id="svg_26"/>
2337                </g>
2338            </g>
2339        </svg>
2340<svg class="logo-svg-compact hidden w-full max-h-10"
2341             viewBox="0 0 102 80"
2342             title="Le Jardin du Pic Vert"
2343        >
2344            <style type="text/css">
2345                .st0{fill:#004650;} .st1{fill:#2DAFAA;} .st2{fill:#C86464;} .st3{fill:#FFFFFF;}
2346            </style>
2347            <g class="layer">
2348                <g id="svg_2">
2349                    <path class="st1" d="m87.22,44.34284c-0.48,-1.85 -1.08,-3.67 -1.77,-5.45c0.17,5.03 -0.41,10.09 -1.85,14.93c-1.79,5.99 -5.37,11.88 -11.65,13.84c-0.68,0.21 -2.28,-1.55 -1.68,-1.73c6.21,-1.94 9.73,-7.89 11.43,-13.81c1.69,-5.86 2.18,-12.06 1.52,-18.12c-0.15,-0.37 -0.23,-0.62 -0.2,-0.66c-0.6,0.64 -0.87,1.98 -1.31,2.8c-0.51,0.95 -1.07,1.88 -1.68,2.76c-1.23,1.78 -2.67,3.41 -4.29,4.82c-2.79,2.43 -5.36,4.81 -7.64,7.73c-3.98,5.1 -7.79,14.98 -0.67,19.34c4.48,2.74 10.67,0.75 14.58,-2.11c2.95,-2.16 5.11,-5.4 5.92,-8.96c0.27,-1.17 0.39,-2.37 0.48,-3.56c0.3,-3.97 -0.2,-7.99 -1.19,-11.82" id="svg_3"/>
2350                    <path class="st1" d="m56.83,55.35284c-0.54,4.44 -0.68,9.16 1,13.39c1.66,4.19 5.23,7.65 9.24,9.62c3.77,1.86 8.53,2.59 12.47,0.85c2.1,-0.93 4.07,-2.19 5.81,-3.69c1.94,-1.67 3.51,-3.68 5.22,-5.56c1.4,-1.54 3.29,-4.02 5.54,-4.21c2.55,-0.21 3.24,2.25 2.59,4.28c-0.34,1.07 2.77,3.63 3.12,2.54c0.76,-2.36 -0.26,-4.76 -1.81,-6.54c-1.41,-1.63 -3.64,-3.3 -5.88,-3.4c-2.1,-0.09 -3.81,1.61 -5.16,3c-1.64,1.69 -3.11,3.54 -4.74,5.24c-3.18,3.33 -7.54,6.38 -12.33,6.2c-3.67,-0.14 -7.71,-1.6 -9.94,-4.67c-2.94,-4.06 -2.58,-9.79 -2,-14.51c0.1,-0.82 -0.85,-1.72 -1.42,-2.19c-0.25,-0.19 -1.61,-1.14 -1.71,-0.35" id="svg_4"/>
2351                    <path class="st1" d="m51.15,52.72284c-5.21,-5.84 -13.67,-7.6 -21.11,-8.06c-4.91,-0.3 -10.72,0.24 -15.41,-1.42c-3.85,-1.36 -7.52,-3.15 -10.9,-5.39c-1.29,-0.85 -2.53,-1.77 -3.73,-2.75c0.95,1.73 2.01,3.4 3.18,5c4.72,6.47 11.05,11.66 18.39,14.9c7.96,3.52 16.84,4.79 25.47,3.72c0.45,-0.06 0.93,0.3 1.26,0.62c0.53,0.31 1.03,0.85 1.31,1.2c0.2,0.25 1.15,1.58 0.35,1.7c-4.96,0.74 -10.02,0.64 -14.95,-0.24c-13.9,-2.46 -25.87,-10.87 -34.23,-22c3.61,9.27 8.63,18.06 16.21,24.61c5.9,5.1 14.46,7.1 22.06,7.02c6.53,-0.07 14.17,-4.02 14.89,-11.11c0.26,-2.83 -0.91,-5.68 -2.79,-7.8" id="svg_5"/>
2352                    <path class="st2" d="m49.68,31.29284c0.55,1.06 0.98,1.9 1.32,2.4c0.12,0.18 0.24,0.38 0.36,0.58c0.03,-0.75 0.08,-1.49 0.13,-2.22c0.17,-2.26 0.33,-4.4 -0.36,-6.48c-0.47,-1.42 -0.86,-2.51 -1.58,-3.57l-0.25,-0.37c-0.72,-1.04 -1.53,-2.23 -1.65,-3.73c-0.21,-2.64 0.62,-5.7 2.18,-8c0.21,-0.31 0.42,-0.61 0.64,-0.91c1.22,-1.7 1.89,-2.75 1.44,-4.38c-0.37,-1.34 -1.69,-2.5 -3.08,-3.38c-2.9,1.85 -5.85,4.26 -6.26,7.62c-0.2,1.71 0.49,3.41 1.22,5.21c0.76,1.87 1.55,3.8 1.39,5.92c-0.07,0.91 -0.32,1.73 -0.72,2.41c2.43,3.54 4.06,6.66 5.22,8.9" id="svg_6"/>
2353                    <path class="st2" d="m62.85,2.98284c-3,3.27 -4.78,6.98 -6.79,11.49c-1.51,3.38 -3.34,7.5 -2.89,11.1c0.6,2.24 0.44,4.46 0.28,6.62c-0.17,2.32 -0.32,4.52 0.44,6.62c0.45,0.63 0.93,1.15 1.47,1.44c0.11,0.06 0.19,0.09 0.25,0.12c0.07,-0.35 0.06,-1 0.06,-1.35l-0.01,-0.34c-0.02,-4.11 1.58,-8.59 4.61,-12.95c0.9,-1.29 2,-2.46 3.07,-3.6c1.89,-2.01 3.68,-3.91 4.39,-6.38c0.5,-1.73 0.21,-3.58 -0.09,-5.53c-0.2,-1.33 -0.42,-2.7 -0.38,-4.09c0.06,-2.44 1.13,-3.17 2.02,-3.36c1.64,-0.34 3.73,1.17 5.26,2.74c-0.06,-2.33 -0.4,-5.31 -4.02,-5.5c-2.89,-0.15 -5.34,1.03 -7.47,2.74c-0.06,0.09 -0.13,0.16 -0.2,0.23" id="svg_7"/>
2354                    <path class="st2" d="m53.79,4.09284c0.72,2.62 -0.53,4.37 -1.74,6.05c-0.2,0.28 -0.41,0.57 -0.61,0.86c-1.32,1.94 -2.03,4.53 -1.85,6.74c0.08,0.97 0.68,1.84 1.31,2.77l0.26,0.38c0.11,0.16 0.2,0.33 0.3,0.49c0.57,-2.71 1.74,-5.35 2.76,-7.64c1.11,-2.48 2.14,-4.7 3.33,-6.77c-1.21,-2.5 -3.05,-4.6 -5.34,-5.51c0.73,0.77 1.3,1.64 1.58,2.63" id="svg_8"/>
2355                    <path class="st2" d="m43.08,20.54284c0.05,-0.22 0.09,-0.45 0.11,-0.69c0.12,-1.66 -0.54,-3.3 -1.25,-5.03c-0.79,-1.95 -1.61,-3.97 -1.35,-6.18c0.22,-1.79 0.99,-3.33 2.04,-4.68c-0.38,0.12 -0.77,0.23 -1.
235516,0.34c-1.87,0.54 -3.8,1.59 -5,3.16c-1.17,1.53 -1.03,3.42 -0.51,5.22c2.89,2.67 5.22,5.34 7.12,7.86" id="svg_9"/>
2356                    <path class="st2" d="m62.99,48.78284c0.51,-1.42 0.76,-2.97 1,-4.47c0.13,-0.83 0.22,-1.69 0.31,-2.52c0.21,-1.98 0.42,-4.02 1.26,-6c1.02,-2.38 2.61,-4.44 4.6,-5.94c3.98,-3.01 6.02,-6.71 6.06,-11c0.03,-3.03 -0.13,-6.9 -1.53,-9.95c-0.92,-2 -4.15,-4.36 -5,-4.19c-0.25,0.05 -0.43,0.64 -0.44,1.47c-0.03,1.21 0.16,2.44 0.36,3.74c0.32,2.08 0.65,4.24 0.03,6.38c-0.84,2.93 -2.88,5.09 -4.85,7.18c-1.06,1.13 -2.07,2.2 -2.89,3.37c-1.96,2.81 -4.28,7.13 -4.26,11.81l0,0.32c0.02,1.13 0.04,2.54 -0.98,3.16c-0.61,0.37 -1.36,0.31 -2.24,-0.16c-0.81,-0.44 -1.47,-1.12 -2.05,-1.91l-0.1,0.04c-0.05,-0.12 -0.09,-0.24 -0.13,-0.35c-0.62,-0.9 -1.14,-1.92 -1.62,-2.87c-0.4,-0.79 -0.78,-1.54 -1.16,-2.11c-0.4,-0.59 -0.85,-1.47 -1.43,-2.59c-2.28,-4.4 -6.39,-12.33 -15.39,-19.92c-0.03,-0.01 -0.05,-0.02 -0.08,-0.02c-0.19,-0.04 -0.41,-0.07 -0.57,0.04c-0.16,0.11 -0.22,0.31 -0.26,0.5c-0.3,1.33 -0.27,2.71 -0.22,4.07c0.13,3.97 0.22,8.59 2.68,11.85c2.51,3.32 5.93,6.08 8.96,8.92c1.64,1.54 3.28,3.11 4.75,4.81c2.82,3.27 4.65,8.11 9.11,9.54c0.16,0.05 0.32,0.1 0.48,0.14c0.97,0.25 2.01,0.26 2.95,-0.08c0.47,-0.17 0.85,-0.38 1.19,-0.62c0.59,-0.72 1.09,-1.59 1.46,-2.64" id="svg_10"/>
2357                </g>
2358            </g>
2359        </svg>
2360</a>
2361</div>
2362
2363<div class="header-search&#x20;inline-flex&#x20;items-start&#x20;justify-center&#x20;gap-2&#x20;order-4&#x20;md&#x3A;order-2&#x20;grow&#x20;w-full&#x20;lg&#x3A;w-auto">
2364<span class="header-mobile-burger lg:hidden text-3xl text-white cursor-pointer"
2365                      @click.prevent="$dispatch('open-main-menu')"
2366                >
2367&equiv;
2368</span>
2369
2370<div data-role="search"
2371     class="relative w-full max-w-xl"
2372>
2373<div class="hidden lg:block mb-1 leading-none text-xs text-center text-white font-bold">
237414 900 variétés en 39 337 tailles        </div>
2375<div x-data="vmMinisearch()"
2376         x-defer="interact"
2377         @click.outside="show = false"
2378         class="container md:my-0 mx-auto"
2379    >
2380<form class="form minisearch"
2381              action="https://www.jardindupicvert.com/catalogsearch/result/"
2382              method="get"
2383        >
2384<div class="relative">
2385<svg class="absolute&#x20;w-10&#x20;h-10&#x20;p-2">
2386                    <use xlink:href="#search-symbol"></use>
2387                </svg>
2388<input x-model="input"
2389                       data-clarity-event="clic_champ_recherche"
2390                       @input.debounce="getSearchResults()"
2391                       type="search"
2392                       class="w-full&#x20;pl-8&#x20;pr-4&#x20;py-2&#x20;border&#x20;border-dark&#x20;text-sm&#x20;leading-normal&#x20;italic"
2393                       autocapitalize="off"
2394                       autocomplete="off"
2395                       autocorrect="off"
2396                       name="q"
2397                       placeholder="Que&#x20;cherchez-vous&#x20;&#x3F;"
2398                       maxlength="128"
2399                />
2400<div class="hidden sm:block text-right leading-none">
2401<a class="underline text-2xs text-white font-bold hover:text-highlight"
2402                       href="https://www.jardindupicvert.com/toutes-les-plantes"
2403                       title="Recherche&#x20;par&#x20;filtres"
2404                       data-action="layers-search"
2405                    >
2406Recherche par filtres                    </a>
2407</div>
2408</div>
2409<div class="search-autocomplete relative w-full"
2410                 x-show="show"
2411                 x-cloak
2412            >
2413<div class="absolute -top-4 z-modal w-full max-h-screen-75 overflow-y-auto px-4 py-3 bg-white border border-border shadow-2xl text-left">
2414<svg @click.prevent="show = false"
2415                         class="absolute right-1 top-1 absolute w-6 h-6 text-primary"
2416                    >
2417                        <use xlink:href="#close-symbol"></use>
2418                    </svg>
2419<template x-for="searchResultByType in Object.values(searchResultsByType)">
2420<div class="font-bold text-sm">
2421<template x-for="searchResult in searchResultByType">
2422<div class="hover:bg-container-lighter pb-1">
2423
2424<template x-if="searchResult.type == 'term'">
2425<a class="u-test-ellipsis w-full block p-1" :href="searchResult.url" :title="searchResult.title">
2426<span x-html="formatOutput(searchResult.title)"></span>
2427<span class="text-xs bg-container-lighter p-1 rounded-xl" x-text="searchResult.num_results"></span>
2428</a>
2429</template>
2430
2431<template x-if="searchResult.type == 'product'">
2432<a class="w-full block"
2433       :class="{
2434            'text-primary': searchResult?.available === 'available'
2435       }"
2436       :href="searchResult.url"
2437       :title="searchResult.title"
2438    >
2439<div class="grid grid-cols-4 gap-4 p-3">
2440<div>
2441<img :src="searchResult.image" class="inline-block" />
2442</div>
2443<div class="col-span-3">
2444<span class="text-sm" x-text="searchResult.title"></span>
2445<span class="text-sm font-bold" x-html="searchResult.price"></span>
2446</div>
2447</div>
2448</a>
2449</template>
2450
2451<template x-if="searchResult.type == 'category'">
2452<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2453<span class="text-sm italic block text-gray-500" x-text="searchResult.breadcrumb.join(' > ').concat(' > ')"></span>
2454<span class="text-sm" x-text="searchResult.title"></span>
2455</a>
2456</template>
2457
2458<template x-if="searchResult.type == 'product_attribute'">
2459<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2460<span class="text-sm" x-text="searchResult.title"></span>
2461<span class="text-xs uppercase text-gray-500" x-text="searchResult.attribute_label" style="vertical-align: super;"></span>
2462</a>
2463</template>
2464
2465<script>
2466    function renderEsAutocompleteTitleAttribute(data)
2467    {
2468        data = data.filter(function(item) {
2469            return item.type === 'product_attribute';
2470        }).map(function(item) {
2471            return item['attribute_label']
2472        }).reduce(function(prev, item) {
2473            if (item in prev) {
2474                prev[item]++;
2475            } else {
2476                prev[item] = 1;
2477            }
2478            return prev;
2479        }, {});
2480
2481        data = Object.entries(data).sort(function(item1, item2) {
2482            return item2[1] - item1[1]
2483        }).map(function(item) {return item[0]});
2484
2485        if (data.length > 2) {
2486            data = data.slice(0, 2);
2487            data.push('...');
2488        }
2489
2490        return data.join(', ');
2491    }
2492</script>
2492
2493
2494<template x-if="searchResult.type == 'cms_page'">
2495<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2496<span class="text-sm" x-text="searchResult.title"></span>
2497</a>
2498</template>
2499<template x-if="searchResult.type == 'blog_post'">
2500<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2501<span class="text-sm" x-text="searchResult.title"></span>
2502</a>
2503</template>
2504</div>
2505</template>
2506</div>
2507</template>
2508</div>
2509</div>
2510</form>
2511</div>
2512</div>
2513</div>
2514
2515<div id="header-icons"
2516                 class="inline-flex&#x20;items-center&#x20;justify-end&#x20;gap-1&#x20;xs&#x3A;gap-2&#x20;sm&#x3A;gap-4&#x20;xl&#x3A;gap-8&#x20;order-3&#x20;text-white"
2517            >
2518<div id="wishlist-menu"
2519     x-data
2520     x-defer="event:amwishlist-alpine-init"
2521     @click.prevent="$store.customer.isLoggedIn ?
2522        $dispatch('toggle-wishlist-panel') :
2523        $dispatch('toggle-authentication', {
2524            url: `https://www.jardindupicvert.com/mwishlist/`,
2525            text: `Veuillez vous connecter à votre compte pour pouvoir gérer vos listes de favoris.`
2526        })
2527     "
2528     :class="{
2529           'text-primary-lighter': !$store.customer.isLoggedIn,
2530           'cursor-pointer': $store.customer.isLoggedIn
2531      }"
2532     class="relative inline-block lg:px-2 no-underline whitespace-nowrap"
2533     title="Mes&#x20;listes&#x20;de&#x20;favoris"
2534     role="button"
2535     aria-haspopup="true"
2536     aria-expanded="false"
2537     aria-controls="amwishlist-drawer"
2538>
2539<span class="sr-only label">
2540Mes listes de favoris    </span>
2541<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight">
2542        <use xlink:href="#heart-empty-symbol"></use>
2543    </svg>
2544<span x-show="$store.customer.isLoggedIn && $store.amwishlist?.lists"
2545          x-text="$store.amwishlist.lists.reduce((acc, l) => acc += l.items.length, 0) || 0"
2546          x-cloak
2547          class="absolute -right-2 top-0 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"
2548    ></span>
2549</div>
2550<span id="customer-menu"
2551      x-data
2552      x-defer="event:customer-alpine-init"
2553      @click.prevent="$store.customer.isLoggedIn ? $dispatch('toggle-customer-panel') : $dispatch('toggle-authentication', {})"
2554      :class="{
2555           'text-white cursor-pointer': $store.customer.isInit,
2556      }"
2557      class="relative text-primary-darker"
2558      title="Mon&#x20;compte"
2559      role="button"
2560      aria-haspopup="true"
2561      aria-expanded="false"
2562      aria-controls="customer-drawer"
2563>
2564<span class="sr-only label">
2565Mon compte    </span>
2566<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight"
2567         :class="{ 'text-primary-lighter': $store.customer.isLoggedIn }"
2568    >
2569        <use xlink:href="#account-symbol"></use>
2570    </svg>
2571<template x-if="$store.customer.isLoggedIn">
2572<span x-text="$store.customer.fullName.split(' ', 2).map(s => s?.[0]).join('')"
2573              class="absolute top-0 -right-2 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"></span>
2574</template>
2575</span>
2576<span id="cart-menu"
2577      x-data
2578      x-defer="event:customer-alpine-init"
2579      @click.prevent="$dispatch('toggle-cart-panel', {});"
2580      :class="{
2581           'text-primary-lighter': !$store.customer.isInit,
2582           'cursor-pointer': $store.customer.isInit
2583      }"
2584      class="relative lg:px-2 no-underline whitespace-nowrap"
2585      title="Mon&#x20;panier"
2586      role="button"
2587      aria-haspopup="true"
2588      aria-expanded="false"
2589      aria-controls="cart-drawer"
2590>
2591<span class="sr-only label">
2592Panier    </span>
2593<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight">
2594        <use xlink:href="#basket-symbol"></use>
2595    </svg>
2596<span x-text="$store?.minicart?.cart?.summary_count || '0'"
2597          class="absolute -right-2 top-0 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"></span>
2598</span>
2599<div id="glopal_cs_position"></div>
2600</div>
2601</div>
2602
2603<div id="main_nav"
2604             class="relative z-header"
2605        >
2606
2607<div x-data="initMainMenu()"
2608     @open-main-menu.window="openAt()"
2609     @close-main-menu.window="closeNav()"
2610     class="grow"
2611>
2612<nav x-cloak
2613         id="drawer-nav"
2614         class="fixed inset-y-0 left-0 z-50 flex flex-col w-drawer max-w-screen overflow-x-hidden overflow-y-scroll bg-white transition-transform duration-700 ease-out"
2615         :class="isOpen ? 'translate-x-0' : '-translate-x-full'"
2616         @keydown.window.escape="closeNav()"
2617    >
2618<div class="relative flex items-center justify-between gap-2 p-4 bg-container-dark text-white">
2619<a x-show="backId"
2620               class="leading-none"
2621               @click.prevent.stop="navBack()"
2622            >
2623<svg class="w-8 h-8 hover:text-primary-lighter rotate-90">
2624                    <use xlink:href="#chevron-symbol"></use>
2625                </svg>
2626</a>
2627<p class="flex grow py-2 whitespace-nowrap font-bold"
2628               x-html="title"></p>
2629<a @click.prevent.stop="closeNav()">
2630<span class="text-white text-4xl hover:text-primary-lighter leading-none cursor-pointer">&times;</span>
2631</a>
2632</div>
2633
2634<div class="relative grow">
2635<ol x-ref="nav"
2636                    @click.stop="openAt"
2637                    class="relative p-2 overflow-hidden text-base font-bold font-serif"
2638                    data-menu-lvl="0"
2639                >
2640<li class="py-2 "
2641    data-node-id="758"
2642>
2643<span class="flex items-center justify-between cursor-pointer
2644                 "
2645            style=""
2646        >
2647<span data-node-title>
2648Plantes vivaces            </span>
2649<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
2650                    <use xlink:href="#chevron-symbol"></use>
2651                </svg>
2652</span>
2653<ol class="p-2"
2654            style="z-index: 1"
2655            data-menu-lvl="1"
2656        >
2657<li class="py-2 heading"
2658    data-node-id="758_0"
2659>
2660<a href="https://www.jardindupicvert.com/vivaces"
2661           title="Plantes&#x20;vivaces&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
2662           class="u-text-ellipsis
2663                 "
2664            style=""
2665        >
2666<span data-node-title>
2667Plantes vivaces :  tous les produits            </span>
2668</a>
2669</li>
2670<li class="py-2 "
2671    data-node-id="758_0_1"
2672>
2673<span class="flex items-center justify-between cursor-pointer
2674                 "
2675            style=""
2676        >
2677<span data-node-title>
2678Toutes nos vivaces            </span>
2679<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
2680                    <use xlink:href="#chevron-symbol"></use>
2681                </svg>
2682</span>
2683<ol class="p-2"
2684            style="z-index: 2"
2685            data-menu-lvl="2"
2686        >
2687<li class="py-2 heading"
2688    data-node-id="758_0_1_0"
2689>
2690<a href="https://www.jardindupicvert.com/vivaces"
2691           title="Toutes&#x20;nos&#x20;vivaces&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
2692           class="u-text-ellipsis
2693                 "
2694            style=""
2695        >
2696<span data-node-title>
2697Toutes nos vivaces :  tous les produits            </span>
2698</a>
2699</li>
2700<li class="py-2 "
2701    data-node-id="758_0_1_0_1"
2702>
2703<a href="https://www.jardindupicvert.com/genre/achillea"
2704           title="Achill&#xE9;es"
2705           class="u-text-ellipsis
2706                 "
2707            style=""
2708        >
2709<span data-node-title>
2710Achillées            </span>
2711</a>
2712</li>
2713<li class="py-2 "
2714    data-node-id="758_0_1_0_1_2"
2715>
2716<a href="https://www.jardindupicvert.com/genre/aquilegia"
2717           title="Ancolies"
2718           class="u-text-ellipsis
2719                 "
2720            style=""
2721        >
2722<span data-node-title>
2723Ancolies            </span>
2724</a>
2725</li>
2726<li class="py-2 "
2727    data-node-id="758_0_1_0_1_2_3"
2728>
2729<a href="https://www.jardindupicvert.com/genre/anemone/anemone-hupehensis"
2730           title="An&#xE9;mones&#x20;du&#x20;Japon"
2731           class="u-text-ellipsis
2732                 "
2733            style=""
2734        >
2735<span data-node-title>
2736Anémones du Japon            </span>
2737</a>
2738</li>
2739<li class="py-2 "
2740    data-node-id="758_0_1_0_1_2_3_4"
2741>
2742<a href="https://www.jardindupicvert.com/genre/campanula"
2743           title="Campanules"
2744           class="u-text-ellipsis
2745                 "
2746            style=""
2747        >
2748<span data-node-title>
2749Campanules            </span>
2750</a>
2751</li>
2752<li class="py-2 "
2753    data-node-id="758_0_1_0_1_2_3_4_5"
2754>
2755<a href="https://www.jardindupicvert.com/genre/echinacea"
2756           title="Rudbeckias"
2757           class="u-text-ellipsis
2758                 "
2759            style=""
2760        >
2761<span data-node-title>
2762Rudbeckias            </span>
2763</a>
2764</li>
2765<li class="py-2 "
2766    data-node-id="758_0_1_0_1_2_3_4_5_6"
2767>
2768<a href="https://www.jardindupicvert.com/genre/geranium"
2769           title="G&#xE9;raniums"
2770           class="u-text-ellipsis
2771                 "
2772            style=""
2773        >
2774<span data-node-title>
2775Géraniums            </span>
2776</a>
2777</li>
2778<li class="py-2 "
2779    data-node-id="758_0_1_0_1_2_3_4_5_6_7"
2780>
2781<a href="https://www.jardindupicvert.com/genre/helleborus"
2782           title="Hell&#xE9;bores"
2783           class="u-text-ellipsis
2784                 "
2785            style=""
2786        >
2787<span data-node-title>
2788Hellébores            </span>
2789</a>
2790</li>
2791<li class="py-2 "
2792    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8"
2793>
2794<a href="https://www.jardindupicvert.com/genre/heuchera"
2795           title="Heuch&#xE8;res"
2796           class="u-text-ellipsis
2797                 "
2798            style=""
2799        >
2800<span data-node-title>
2801Heuchères            </span>
2802</a>
2803</li>
2804<li class="py-2 "
2805    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9"
2806>
2807<a href="https://www.jardindupicvert.com/genre/hosta"
2808           title="Hostas"
2809           class="u-text-ellipsis
2810                 "
2811            style=""
2812        >
2813<span data-node-title>
2814Hostas            </span>
2815</a>
2816</li>
2817<li class="py-2 "
2818    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10"
2819>
2820<a href="https://www.jardindupicvert.com/genre/dianthus"
2821           title="Oeillets"
2822           class="u-text-ellipsis
2823                 "
2824            style=""
2825        >
2826<span data-node-title>
2827Oeillets            </span>
2828</a>
2829</li>
2830<li class="py-2 "
2831    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
2832>
2833<a href="https://www.jardindupicvert.com/genre/persicaria"
2834           title="Persicaires"
2835           class="u-text-ellipsis
2836                 "
2837            style=""
2838        >
2839<span data-node-title>
2840Persicaires            </span>
2841</a>
2842</li>
2843<li class="py-2 "
2844    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
2845>
2846<a href="https://www.jardindupicvert.com/genre/vinca"
2847           title="Pervenches"
2848           class="u-text-ellipsis
2849                 "
2850            style=""
2851        >
2852<span data-node-title>
2853Pervenches            </span>
2854</a>
2855</li>
2856<li class="py-2 "
2857    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
2858>
2859<a href="https://www.jardindupicvert.com/genre/phlox"
2860           title="Phlox"
2861           class="u-text-ellipsis
2862                 "
2863            style=""
2864        >
2865<span data-node-title>
2866Phlox            </span>
2867</a>
2868</li>
2869<li class="py-2 "
2870    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14"
2871>
2872<a href="https://www.jardindupicvert.com/genre/paeonia/paeonia-lactiflora"
2873           title="Pivoines&#x20;herbac&#xE9;es"
2874           class="u-text-ellipsis
2875                 "
2876            style=""
2877        >
2878<span data-node-title>
2879Pivoines herbacées            </span>
2880</a>
2881</li>
2882<li class="py-2 "
2883    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15"
2884>
2885<a href="https://www.jardindupicvert.com/genre/salvia"
2886           title="Sauges"
2887           class="u-text-ellipsis
2888                 "
2889            style=""
2890        >
2891<span data-node-title>
2892Sauges            </span>
2893</a>
2894</li>
2895<li class="py-2 "
2896    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16"
2897>
2898<a href="https://www.jardindupicvert.com/genre/sedum"
2899           title="Sedum"
2900           class="u-text-ellipsis
2901                 "
2902            style=""
2903        >
2904<span data-node-title>
2905Sedum            </span>
2906</a>
2907</li>
2908</ol>
2909</li>
2910<li class="py-2 "
2911    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2"
2912>
2913<span class="flex items-center justify-between cursor-pointer
2914                 "
2915            style=""
2916        >
2917<span data-node-title>
2918Graminées            </span>
2919<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
2920                    <use xlink:href="#chevron-symbol"></use>
2921                </svg>
2922</span>
2923<ol class="p-2"
2924            style="z-index: 2"
2925            data-menu-lvl="2"
2926        >
2927<li class="py-2 heading"
2928    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0"
2929>
2930<a href="https://www.jardindupicvert.com/graminees"
2931           title="Gramin&#xE9;es&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
2932           class="u-text-ellipsis
2933                 "
2934            style=""
2935        >
2936<span data-node-title>
2937Graminées :  tous les produits            </span>
2938</a>
2939</li>
2940<li class="py-2 "
2941    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1"
2942>
2943<a href="https://www.jardindupicvert.com/genre/deschampsia"
2944           title="Canches"
2945           class="u-text-ellipsis
2946                 "
2947            style=""
2948        >
2949<span data-node-title>
2950Canches            </span>
2951</a>
2952</li>
2953<li class="py-2 "
2954    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2"
2955>
2956<a href="https://www.jardindupicvert.com/genre/carex"
2957           title="Carex"
2958           class="u-text-ellipsis
2959                 "
2960            style=""
2961        >
2962<span data-node-title>
2963Carex            </span>
2964</a>
2965</li>
2966<li class="py-2 "
2967    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3"
2968>
2969<a href="https://www.jardindupicvert.com/genre/festuca"
2970           title="F&#xE9;tuques"
2971           class="u-text-ellipsis
2972                 "
2973            style=""
2974        >
2975<span data-node-title>
2976Fétuques            </span>
2977</a>
2978</li>
2979<li class="py-2 "
2980    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4"
2981>
2982<a href="https://www.jardindupicvert.com/genre/pennisetum"
2983           title="Herbes&#x20;aux&#x20;&#xE9;couvillons"
2984           class="u-text-ellipsis
2985                 "
2986            style=""
2987        >
2988<span data-node-title>
2989Herbes aux écouvillons            </span>
2990</a>
2991</li>
2992<li class="py-2 "
2993    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5"
2994>
2995<a href="https://www.jardindupicvert.com/genre/cortaderia"
2996           title="Herbes&#x20;des&#x20;pampas"
2997           class="u-text-ellipsis
2998                 "
2999            style=""
3000        >
3001<span data-node-title>
3002Herbes des pampas            </span>
3003</a>
3004</li>
3005<li class="py-2 "
3006    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6"
3007>
3008<a href="https://www.jardindupicvert.com/genre/luzula"
3009           title="Luzules"
3010           class="u-text-ellipsis
3011                 "
3012            style=""
3013        >
3014<span data-node-title>
3015Luzules            </span>
3016</a>
3017</li>
3018<li class="py-2 "
3019    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7"
3020>
3021<a href="https://www.jardindupicvert.com/genre/miscanthus/miscanthus-sinensis"
3022           title="Roseaux&#x20;de&#x20;Chine"
3023           class="u-text-ellipsis
3024                 "
3025            style=""
3026        >
3027<span data-node-title>
3028Roseaux de Chine            </span>
3029</a>
3030</li>
3031<li class="py-2 "
3032    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8"
3033>
3034<a href="https://www.jardindupicvert.com/genre/phalaris"
3035           title="Rubans&#x20;de&#x20;la&#x20;Vierge"
3036           class="u-text-ellipsis
3037                 "
3038            style=""
3039        >
3040<span data-node-title>
3041Rubans de la Vierge            </span>
3042</a>
3043</li>
3044<li class="py-2 "
3045    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9"
3046>
3047<a href="https://www.jardindupicvert.com/genre/stipa"
3048           title="Stipas"
3049           class="u-text-ellipsis
3050                 "
3051            style=""
3052        >
3053<span data-node-title>
3054Stipas            </span>
3055</a>
3056</li>
3057</ol>
3058</li>
3059<li class="py-2 "
3060    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3"
3061>
3062<a href="https://www.jardindupicvert.com/plantes-aromatiques"
3063           title="Les&#x20;aromatiques"
3064           class="u-text-ellipsis
3065                 "
3066            style=""
3067        >
3068<span data-node-title>
3069Les aromatiques            </span>
3070</a>
3071</li>
3072<li class="py-2 "
3073    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4"
3074>
3075<a href="https://www.jardindupicvert.com/fougeres"
3076           title="Les&#x20;foug&#xE8;res"
3077           class="u-text-ellipsis
3078                 "
3079            style=""
3080        >
3081<span data-node-title>
3082Les fougères            </span>
3083</a>
3084</li>
3085<li class="py-2 "
3086    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5"
3087>
3088<a href="https://www.jardindupicvert.com/plantes-aquatiques"
3089           title="Les&#x20;aquatiques"
3090           class="u-text-ellipsis
3091                 "
3092            style=""
3093        >
3094<span data-node-title>
3095Les aquatiques            </span>
3096</a>
3097</li>
3098<li class="py-2 "
3099    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6"
3100>
3101<span class="flex items-center justify-between cursor-pointer
3102                 "
3103            style=""
3104        >
3105<span data-node-title>
3106Plantes vivaces par utilisation            </span>
3107<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3108                    <use xlink:href="#chevron-symbol"></use>
3109                </svg>
3110</span>
3111<ol class="p-2"
3112            style="z-index: 2"
3113            data-menu-lvl="2"
3114        >
3115<li class="py-2 heading"
3116    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0"
3117>
3118<a href="https://www.jardindupicvert.com/vivaces"
3119           title="Plantes&#x20;vivaces&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3120           class="u-text-ellipsis
3121                 "
3122            style=""
3123        >
3124<span data-node-title>
3125Plantes vivaces par utilisation :  tous les produits            </span>
3126</a>
3127</li>
3128<li class="py-2 "
3129    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1"
3130>
3131<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-printaniere"
3132           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re"
3133           class="u-text-ellipsis
3134                 "
3135            style=""
3136        >
3137<span data-node-title>
3138Plantes vivaces à floraison printanière            </span>
3139</a>
3140</li>
3141<li class="py-2 "
3142    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2"
3143>
3144<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-estivale"
3145           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;estivale"
3146           class="u-text-ellipsis
3147                 "
3148            style=""
3149        >
3150<span data-node-title>
3151Plantes vivaces à floraison estivale            </span>
3152</a>
3153</li>
3154<li class="py-2 "
3155    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3"
3156>
3157<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-automnale"
3158           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;automnale"
3159           class="u-text-ellipsis
3160                 "
3161            style=""
3162        >
3163<span data-node-title>
3164Plantes vivaces à floraison automnale            </span>
3165</a>
3166</li>
3167<li class="py-2 "
3168    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4"
3169>
3170<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-hivernale"
3171           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;hivernale"
3172           class="u-text-ellipsis
3173                 "
3174            style=""
3175        >
3176<span data-node-title>
3177Plantes vivaces à floraison hivernale            </span>
3178</a>
3179</li>
3180<li class="py-2 "
3181    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5"
3182>
3183<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-d-ombre"
3184           title="Plantes&#x20;vivaces&#x20;d&#x27;ombre"
3185           class="u-text-ellipsis
3186                 "
3187            style=""
3188        >
3189<span data-node-title>
3190Plantes vivaces d&#039;ombre            </span>
3191</a>
3192</li>
3193<li class="py-2 "
3194    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6"
3195>
3196<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-couvre-sol"
3197           title="Plantes&#x20;vivaces&#x20;couvre-sol"
3198           class="u-text-ellipsis
3199                 "
3200            style=""
3201        >
3202<span data-node-title>
3203Plantes vivaces couvre-sol            </span>
3204</a>
3205</li>
3206<li class="py-2 "
3207    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7"
3208>
3209<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-parfumees"
3210           title="Plantes&#x20;vivaces&#x20;parfum&#xE9;es"
3211           class="u-text-ellipsis
3212                 "
3213            style=""
3214        >
3215<span data-node-title>
3216Plantes vivaces parfumées            </span>
3217</a>
3218</li>
3219<li class="py-2 "
3220    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7_8"
3221>
3222<a href="https://www.jardindupicvert.com/vivaces/vivaces-d-ombre-geantes"
3223           title="Plantes&#x20;vivaces&#x20;g&#xE9;antes"
3224           class="u-text-ellipsis
3225                 "
3226            style=""
3227        >
3228<span data-node-title>
3229Plantes vivaces géantes            </span>
3230</a>
3231</li>
3232<li class="py-2 "
3233    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7_8_9"
3234>
3235<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-feuillage-persistant"
3236           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
3237           class="u-text-ellipsis
3238                 "
3239            style=""
3240        >
3241<span data-node-title>
3242Plantes vivaces à feuillage persistant            </span>
3243</a>
3244</li>
3245</ol>
3246</li>
3247<li class="py-2 "
3248    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7_8_9_7"
3249>
3250<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-en-pot-de-2-3l"
3251           title="Plantes&#x20;vivaces&#x20;en&#x20;grands&#x20;pots"
3252           class="u-text-ellipsis
3253                 "
3254            style=""
3255        >
3256<span data-node-title>
3257Plantes vivaces en grands pots            </span>
3258</a>
3259</li>
3260</ol>
3261</li>
3262<li class="py-2 "
3263    data-node-id="800"
3264>
3265<span class="flex items-center justify-between cursor-pointer
3266                 "
3267            style=""
3268        >
3269<span data-node-title>
3270Arbustes            </span>
3271<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3272                    <use xlink:href="#chevron-symbol"></use>
3273                </svg>
3274</span>
3275<ol class="p-2"
3276            style="z-index: 1"
3277            data-menu-lvl="1"
3278        >
3279<li class="py-2 heading"
3280    data-node-id="800_0"
3281>
3282<a href="https://www.jardindupicvert.com/arbustes"
3283           title="Arbustes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3284           class="u-text-ellipsis
3285                 "
3286            style=""
3287        >
3288<span data-node-title>
3289Arbustes :  tous les produits            </span>
3290</a>
3291</li>
3292<li class="py-2 "
3293    data-node-id="800_0_1"
3294>
3295<span class="flex items-center justify-between cursor-pointer
3296                 "
3297            style=""
3298        >
3299<span data-node-title>
3300Tous nos arbustes            </span>
3301<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3302                    <use xlink:href="#chevron-symbol"></use>
3303                </svg>
3304</span>
3305<ol class="p-2"
3306            style="z-index: 2"
3307            data-menu-lvl="2"
3308        >
3309<li class="py-2 heading"
3310    data-node-id="800_0_1_0"
3311>
3312<a href="https://www.jardindupicvert.com/arbustes"
3313           title="Tous&#x20;nos&#x20;arbustes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3314           class="u-text-ellipsis
3315                 "
3316            style=""
3317        >
3318<span data-node-title>
3319Tous nos arbustes :  tous les produits            </span>
3320</a>
3321</li>
3322<li class="py-2 "
3323    data-node-id="800_0_1_0_1"
3324>
3325<a href="https://www.jardindupicvert.com/genre/buxus"
3326           title="Buis"
3327           class="u-text-ellipsis
3328                 "
3329            style=""
3330        >
3331<span data-node-title>
3332Buis            </span>
3333</a>
3334</li>
3335<li class="py-2 "
3336    data-node-id="800_0_1_0_1_2"
3337>
3338<a href="https://www.jardindupicvert.com/genre/ceanothus"
3339           title="C&#xE9;anothes"
3340           class="u-text-ellipsis
3341                 "
3342            style=""
3343        >
3344<span data-node-title>
3345Céanothes            </span>
3346</a>
3347</li>
3348<li class="py-2 "
3349    data-node-id="800_0_1_0_1_2_3"
3350>
3351<a href="https://www.jardindupicvert.com/genre/lonicera"
3352           title="Ch&#xE8;vrefeuilles"
3353           class="u-text-ellipsis
3354                 "
3355            style=""
3356        >
3357<span data-node-title>
3358Chèvrefeuilles            </span>
3359</a>
3360</li>
3361<li class="py-2 "
3362    data-node-id="800_0_1_0_1_2_3_4"
3363>
3364<a href="https://www.jardindupicvert.com/genre/cornus"
3365           title="Cornouillers"
3366           class="u-text-ellipsis
3367                 "
3368            style=""
3369        >
3370<span data-node-title>
3371Cornouillers            </span>
3372</a>
3373</li>
3374<li class="py-2 "
3375    data-node-id="800_0_1_0_1_2_3_4_5"
3376>
3377<a href="https://www.jardindupicvert.com/arbustes/erables-du-japon"
3378           title="&#xC9;rables&#x20;du&#x20;Japon"
3379           class="u-text-ellipsis
3380                 "
3381            style=""
3382        >
3383<span data-node-title>
3384Érables du Japon            </span>
3385</a>
3386</li>
3387<li class="py-2 "
3388    data-node-id="800_0_1_0_1_2_3_4_5_6"
3389>
3390<a href="https://www.jardindupicvert.com/genre/euonymus"
3391           title="Fusains"
3392           class="u-text-ellipsis
3393                 "
3394            style=""
3395        >
3396<span data-node-title>
3397Fusains            </span>
3398</a>
3399</li>
3400<li class="py-2 "
3401    data-node-id="800_0_1_0_1_2_3_4_5_6_7"
3402>
3403<a href="https://www.jardindupicvert.com/genre/hydrangea"
3404           title="Hortensias"
3405           class="u-text-ellipsis
3406                 "
3407            style=""
3408        >
3409<span data-node-title>
3410Hortensias            </span>
3411</a>
3412</li>
3413<li class="py-2 "
3414    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8"
3415>
3416<a href="https://www.jardindupicvert.com/genre/ilex"
3417           title="Houx"
3418           class="u-text-ellipsis
3419                 "
3420            style=""
3421        >
3422<span data-node-title>
3423Houx            </span>
3424</a>
3425</li>
3426<li class="py-2 "
3427    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9"
3428>
3429<a href="https://www.jardindupicvert.com/genre/syringa"
3430           title="Lilas"
3431           class="u-text-ellipsis
3432                 "
3433            style=""
3434        >
3435<span data-node-title>
3436Lilas            </span>
3437</a>
3438</li>
3439<li class="py-2 "
3440    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10"
3441>
3442<a href="https://www.jardindupicvert.com/genre/magnolia"
3443           title="Magnolias"
3444           class="u-text-ellipsis
3445                 "
3446            style=""
3447        >
3448<span data-node-title>
3449Magnolias            </span>
3450</a>
3451</li>
3452<li class="py-2 "
3453    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
3454>
3455<a href="https://www.jardindupicvert.com/genre/choisya/choisya-ternata"
3456           title="Oranger&#x20;du&#x20;Mexique"
3457           class="u-text-ellipsis
3458                 "
3459            style=""
3460        >
3461<span data-node-title>
3462Oranger du Mexique            </span>
3463</a>
3464</li>
3465<li class="py-2 "
3466    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
3467>
3468<a href="https://www.jardindupicvert.com/genre/rhododendron"
3469           title="Rhododendrons"
3470           class="u-text-ellipsis
3471                 "
3472            style=""
3473        >
3474<span data-node-title>
3475Rhododendrons            </span>
3476</a>
3477</li>
3478<li class="py-2 "
3479    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
3480>
3481<a href="https://www.jardindupicvert.com/genre/spiraea"
3482           title="Spir&#xE9;es"
3483           class="u-text-ellipsis
3484                 "
3485            style=""
3486        >
3487<span data-node-title>
3488Spirées            </span>
3489</a>
3490</li>
3491<li class="py-2 "
3492    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14"
3493>
3494<a href="https://www.jardindupicvert.com/genre/sambucus"
3495           title="Sureaux"
3496           class="u-text-ellipsis
3497                 "
3498            style=""
3499        >
3500<span data-node-title>
3500
3501Sureaux            </span>
3502</a>
3503</li>
3504<li class="py-2 "
3505    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15"
3506>
3507<a href="https://www.jardindupicvert.com/genre/viburnum"
3508           title="Viornes"
3509           class="u-text-ellipsis
3510                 "
3511            style=""
3512        >
3513<span data-node-title>
3514Viornes            </span>
3515</a>
3516</li>
3517</ol>
3518</li>
3519<li class="py-2 "
3520    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2"
3521>
3522<span class="flex items-center justify-between cursor-pointer
3523                 "
3524            style=""
3525        >
3526<span data-node-title>
3527Arbustes par utilisation            </span>
3528<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3529                    <use xlink:href="#chevron-symbol"></use>
3530                </svg>
3531</span>
3532<ol class="p-2"
3533            style="z-index: 2"
3534            data-menu-lvl="2"
3535        >
3536<li class="py-2 heading"
3537    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0"
3538>
3539<a href="https://www.jardindupicvert.com/arbustes"
3540           title="Arbustes&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3541           class="u-text-ellipsis
3542                 "
3543            style=""
3544        >
3545<span data-node-title>
3546Arbustes par utilisation :  tous les produits            </span>
3547</a>
3548</li>
3549<li class="py-2 "
3550    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1"
3551>
3552<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-printaniere"
3553           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re"
3554           class="u-text-ellipsis
3555                 "
3556            style=""
3557        >
3558<span data-node-title>
3559Arbustes à floraison printanière            </span>
3560</a>
3561</li>
3562<li class="py-2 "
3563    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2"
3564>
3565<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-estivale"
3566           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;estivale"
3567           class="u-text-ellipsis
3568                 "
3569            style=""
3570        >
3571<span data-node-title>
3572Arbustes à floraison estivale            </span>
3573</a>
3574</li>
3575<li class="py-2 "
3576    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3"
3577>
3578<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-automnale"
3579           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;automnale"
3580           class="u-text-ellipsis
3581                 "
3582            style=""
3583        >
3584<span data-node-title>
3585Arbustes à floraison automnale            </span>
3586</a>
3587</li>
3588<li class="py-2 "
3589    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4"
3590>
3591<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-hivernale"
3592           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;hivernale"
3593           class="u-text-ellipsis
3594                 "
3595            style=""
3596        >
3597<span data-node-title>
3598Arbustes à floraison hivernale            </span>
3599</a>
3600</li>
3601<li class="py-2 "
3602    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5"
3603>
3604<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/arbustes-fruitiers"
3605           title="Arbustes&#x20;fruitiers"
3606           class="u-text-ellipsis
3607                 "
3608            style=""
3609        >
3610<span data-node-title>
3611Arbustes fruitiers            </span>
3612</a>
3613</li>
3614<li class="py-2 "
3615    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6"
3616>
3617<a href="https://www.jardindupicvert.com/arbustes/arbustes-parfumes"
3618           title="Arbustes&#x20;parfum&#xE9;s"
3619           class="u-text-ellipsis
3620                 "
3621            style=""
3622        >
3623<span data-node-title>
3624Arbustes parfumés            </span>
3625</a>
3626</li>
3627<li class="py-2 "
3628    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7"
3629>
3630<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-feuillage-panache"
3631           title="Arbustes&#x20;&#xE0;&#x20;feuillage&#x20;panach&#xE9;"
3632           class="u-text-ellipsis
3633                 "
3634            style=""
3635        >
3636<span data-node-title>
3637Arbustes à feuillage panaché            </span>
3638</a>
3639</li>
3640<li class="py-2 "
3641    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8"
3642>
3643<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-feuillage-persistant"
3644           title="Arbustes&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
3645           class="u-text-ellipsis
3646                 "
3647            style=""
3648        >
3649<span data-node-title>
3650Arbustes à feuillage persistant            </span>
3651</a>
3652</li>
3653<li class="py-2 "
3654    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9"
3655>
3656<a href="https://www.jardindupicvert.com/arbustes/arbustes-de-terre-de-bruyere"
3657           title="Arbustes&#x20;de&#x20;terre&#x20;de&#x20;bruy&#xE8;re"
3658           class="u-text-ellipsis
3659                 "
3660            style=""
3661        >
3662<span data-node-title>
3663Arbustes de terre de bruyère            </span>
3664</a>
3665</li>
3666<li class="py-2 "
3667    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10"
3668>
3669<a href="https://www.jardindupicvert.com/arbustes/haies-pour-les-oiseaux"
3670           title="Haies&#x20;pour&#x20;les&#x20;oiseaux"
3671           class="u-text-ellipsis
3672                 "
3673            style=""
3674        >
3675<span data-node-title>
3676Haies pour les oiseaux            </span>
3677</a>
3678</li>
3679<li class="py-2 "
3680    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11"
3681>
3682<a href="https://www.jardindupicvert.com/coniferes/petits-coniferes"
3683           title="Conif&#xE8;res&#x20;nains&#x20;et&#x20;petits&#x20;conif&#xE8;res"
3684           class="u-text-ellipsis
3685                 "
3686            style=""
3687        >
3688<span data-node-title>
3689Conifères nains et petits conifères            </span>
3690</a>
3691</li>
3692</ol>
3693</li>
3694<li class="py-2 "
3695    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3"
3696>
3697<span class="flex items-center justify-between cursor-pointer
3698                 "
3699            style=""
3700        >
3701<span data-node-title>
3702Bambous            </span>
3703<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3704                    <use xlink:href="#chevron-symbol"></use>
3705                </svg>
3706</span>
3707<ol class="p-2"
3708            style="z-index: 2"
3709            data-menu-lvl="2"
3710        >
3711<li class="py-2 heading"
3712    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3_0"
3713>
3714<a href="https://www.jardindupicvert.com/bambous"
3715           title="Bambous&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3716           class="u-text-ellipsis
3717                 "
3718            style=""
3719        >
3720<span data-node-title>
3721Bambous :  tous les produits            </span>
3722</a>
3723</li>
3724<li class="py-2 "
3725    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3_0_1"
3726>
3727<a href="https://www.jardindupicvert.com/genre/sasa"
3728           title="Bambous&#x20;couvre-sol"
3729           class="u-text-ellipsis
3730                 "
3731            style=""
3732        >
3733<span data-node-title>
3734Bambous couvre-sol            </span>
3735</a>
3736</li>
3737<li class="py-2 "
3738    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3_0_1_2"
3739>
3740<a href="https://www.jardindupicvert.com/genre/fargesia"
3741           title="Bambous&#x20;non&#x20;tra&#xE7;ants"
3742           class="u-text-ellipsis
3743                 "
3744            style=""
3745        >
3746<span data-node-title>
3747Bambous non traçants            </span>
3748</a>
3749</li>
3750</ol>
3751</li>
3752</ol>
3753</li>
3754<li class="py-2 "
3755    data-node-id="832"
3756>
3757<span class="flex items-center justify-between cursor-pointer
3758                 "
3759            style=""
3760        >
3761<span data-node-title>
3762Arbres            </span>
3763<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3764                    <use xlink:href="#chevron-symbol"></use>
3765                </svg>
3766</span>
3767<ol class="p-2"
3768            style="z-index: 1"
3769            data-menu-lvl="1"
3770        >
3771<li class="py-2 heading"
3772    data-node-id="832_0"
3773>
3774<a href="https://www.jardindupicvert.com/arbres"
3775           title="Arbres&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3776           class="u-text-ellipsis
3777                 "
3778            style=""
3779        >
3780<span data-node-title>
3781Arbres :  tous les produits            </span>
3782</a>
3783</li>
3784<li class="py-2 "
3785    data-node-id="832_0_1"
3786>
3787<span class="flex items-center justify-between cursor-pointer
3788                 "
3789            style=""
3790        >
3791<span data-node-title>
3792Tous nos arbres            </span>
3793<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3794                    <use xlink:href="#chevron-symbol"></use>
3795                </svg>
3796</span>
3797<ol class="p-2"
3798            style="z-index: 2"
3799            data-menu-lvl="2"
3800        >
3801<li class="py-2 heading"
3802    data-node-id="832_0_1_0"
3803>
3804<a href="https://www.jardindupicvert.com/arbres"
3805           title="Tous&#x20;nos&#x20;arbres&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3806           class="u-text-ellipsis
3807                 "
3808            style=""
3809        >
3810<span data-node-title>
3811Tous nos arbres :  tous les produits            </span>
3812</a>
3813</li>
3814<li class="py-2 "
3815    data-node-id="832_0_1_0_1"
3816>
3817<a href="https://www.jardindupicvert.com/genre/arbutus"
3818           title="Arbousiers"
3819           class="u-text-ellipsis
3820                 "
3821            style=""
3822        >
3823<span data-node-title>
3824Arbousiers            </span>
3825</a>
3826</li>
3827<li class="py-2 "
3828    data-node-id="832_0_1_0_1_2"
3829>
3830<a href="https://www.jardindupicvert.com/genre/betula"
3831           title="Bouleaux"
3832           class="u-text-ellipsis
3833                 "
3834            style=""
3835        >
3836<span data-node-title>
3837Bouleaux            </span>
3838</a>
3839</li>
3840<li class="py-2 "
3841    data-node-id="832_0_1_0_1_2_3"
3842>
3843<a href="https://www.jardindupicvert.com/genre/catalpa"
3844           title="Catalpas"
3845           class="u-text-ellipsis
3846                 "
3847            style=""
3848        >
3849<span data-node-title>
3850Catalpas            </span>
3851</a>
3852</li>
3853<li class="py-2 "
3854    data-node-id="832_0_1_0_1_2_3_4"
3855>
3856<a href="https://www.jardindupicvert.com/genre/carpinus"
3857           title="Charmes"
3858           class="u-text-ellipsis
3859                 "
3860            style=""
3861        >
3862<span data-node-title>
3863Charmes            </span>
3864</a>
3865</li>
3866<li class="py-2 "
3867    data-node-id="832_0_1_0_1_2_3_4_5"
3868>
3869<a href="https://www.jardindupicvert.com/genre/quercus"
3870           title="Ch&#xEA;nes"
3871           class="u-text-ellipsis
3872                 "
3873            style=""
3874        >
3875<span data-node-title>
3876Chênes            </span>
3877</a>
3878</li>
3879<li class="py-2 "
3880    data-node-id="832_0_1_0_1_2_3_4_5_6"
3881>
3882<a href="https://www.jardindupicvert.com/genre/acer"
3883           title="&#xC9;rables"
3884           class="u-text-ellipsis
3885                 "
3886            style=""
3887        >
3888<span data-node-title>
3889Érables            </span>
3890</a>
3891</li>
3892<li class="py-2 "
3893    data-node-id="832_0_1_0_1_2_3_4_5_6_7"
3894>
3895<a href="https://www.jardindupicvert.com/genre/fraxinus"
3896           title="Fr&#xEA;nes"
3897           class="u-text-ellipsis
3898                 "
3899            style=""
3900        >
3901<span data-node-title>
3902Frênes            </span>
3903</a>
3904</li>
3905<li class="py-2 "
3906    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8"
3907>
3908<a href="https://www.jardindupicvert.com/genre/liquidambar"
3909           title="Liquidambars"
3910           class="u-text-ellipsis
3911                 "
3912            style=""
3913        >
3914<span data-node-title>
3915Liquidambars            </span>
3916</a>
3917</li>
3918<li class="py-2 "
3919    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9"
3920>
3921<a href="https://www.jardindupicvert.com/genre/magnolia"
3922           title="Magnolias"
3923           class="u-text-ellipsis
3924                 "
3925            style=""
3926        >
3927<span data-node-title>
3928Magnolias            </span>
3929</a>
3930</li>
3931<li class="py-2 "
3932    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10"
3933>
3934<a href="https://www.jardindupicvert.com/genre/paulownia"
3935           title="Pawlonias"
3936           class="u-text-ellipsis
3937                 "
3938            style=""
3939        >
3940<span data-node-title>
3941Pawlonias            </span>
3942</a>
3943</li>
3944<li class="py-2 "
3945    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
3946>
3947<a href="https://www.jardindupicvert.com/genre/populus"
3948           title="Peupliers"
3949           class="u-text-ellipsis
3950                 "
3951            style=""
3952        >
3953<span data-node-title>
3954Peupliers            </span>
3955</a>
3956</li>
3957<li class="py-2 "
3958    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
3959>
3960<a href="https://www.jardindupicvert.com/genre/prunus"
3961           title="Prunus"
3962           class="u-text-ellipsis
3963                 "
3964            style=""
3965        >
3966<span data-node-title>
3967Prunus            </span>
3968</a>
3969</li>
3970<li class="py-2 "
3971    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
3972>
3973<a href="https://www.jardindupicvert.com/genre/salix"
3974           title="Saules"
3975           class="u-text-ellipsis
3976                 "
3977            style=""
3978        >
3979<span data-node-title>
3980Saules            </span>
3981</a>
3982</li>
3983<li class="py-2 "
3984    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14"
3985>
3986<a href="https://www.jardindupicvert.com/genre/sorbus"
3987           title="Sorbiers"
3988           class="u-text-ellipsis
3989                 "
3990            style=""
3991        >
3992<span data-node-title>
3993Sorbiers            </span>
3994</a>
3995</li>
3996</ol>
3997</li>
3998<li class="py-2 "
3999    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2"
4000>
4001<span class="flex items-center justify-between cursor-pointer
4002                 "
4003            style=""
4004        >
4005<span data-node-title>
4006Les conifères            </span>
4007<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4008                    <use xlink:href="#chevron-symbol"></use>
4009                </svg>
4010</span>
4011<ol class="p-2"
4012            style="z-index: 2"
4013            data-menu-lvl="2"
4014        >
4015<li class="py-2 heading"
4016    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0"
4017>
4018<a href="https://www.jardindupicvert.com/coniferes"
4019           title="Les&#x20;conif&#xE8;res&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4020           class="u-text-ellipsis
4021                 "
4022            style=""
4023        >
4024<span data-node-title>
4025Les conifères :  tous les produits            </span>
4026</a>
4027</li>
4028<li class="py-2 "
4029    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1"
4030>
4031<a href="https://www.jardindupicvert.com/genre/cryptomeria"
4032           title="C&#xE8;dres&#x20;du&#x20;Japon"
4033           class="u-text-ellipsis
4034                 "
4035            style=""
4036        >
4037<span data-node-title>
4038Cèdres du Japon            </span>
4039</a>
4040</li>
4041<li class="py-2 "
4042    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2"
4043>
4044<a href="https://www.jardindupicvert.com/genre/cupressus"
4045           title="Cypr&#xE8;s&#x20;d&#x27;Italie"
4046           class="u-text-ellipsis
4047                 "
4048            style=""
4049        >
4050<span data-node-title>
4051Cyprès d&#039;Italie            </span>
4052</a>
4053</li>
4054<li class="py-2 "
4055    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3"
4056>
4057<a href="https://www.jardindupicvert.com/genre/chamaecyparis/chamaecyparis-lawsoniana"
4058           title="Cypr&#xE8;s&#x20;de&#x20;Lawson"
4059           class="u-text-ellipsis
4060                 "
4061            style=""
4062        >
4063<span data-node-title>
4064Cyprès de Lawson            </span>
4065</a>
4066</li>
4067<li class="py-2 "
4068    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4"
4069>
4070<a href="https://www.jardindupicvert.com/genre/cupressocyparis"
4071           title="Cypr&#xE8;s&#x20;de&#x20;Leyland"
4072           class="u-text-ellipsis
4073                 "
4074            style=""
4075        >
4076<span data-node-title>
4077Cyprès de Leyland            </span>
4078</a>
4079</li>
4080<li class="py-2 "
4081    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5"
4082>
4083<a href="https://www.jardindupicvert.com/genre/picea"
4084           title="&#xC9;pic&#xE9;as"
4085           class="u-text-ellipsis
4086                 "
4087            style=""
4088        >
4089<span data-node-title>
4090Épicéas            </span>
4091</a>
4092</li>
4093<li class="py-2 "
4094    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6"
4095>
4096<a href="https://www.jardindupicvert.com/genre/juniperus"
4097           title="Gen&#xE9;vriers"
4098           class="u-text-ellipsis
4099                 "
4100            style=""
4101        >
4102<span data-node-title>
4103Genévriers            </span>
4104</a>
4105</li>
4106<li class="py-2 "
4107    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7"
4108>
4109<a href="https://www.jardindupicvert.com/genre/ginkgo"
4110           title="Ginkgo&#x20;biloba"
4111           class="u-text-ellipsis
4112                 "
4113            style=""
4114        >
4115<span data-node-title>
4116Ginkgo biloba            </span>
4117</a>
4118</li>
4119<li class="py-2 "
4120    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8"
4121>
4122<a href="https://www.jardindupicvert.com/genre/taxus"
4123           title="Ifs"
4124           class="u-text-ellipsis
4125                 "
4126            style=""
4127        >
4128<span data-node-title>
4129Ifs            </span>
4130</a>
4131</li>
4132<li class="py-2 "
4133    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9"
4134>
4135<a href="https://www.jardindupicvert.com/genre/pinus"
4136           title="Pins"
4137           class="u-text-ellipsis
4138                 "
4139            style=""
4140        >
4141<span data-node-title>
4142Pins            </span>
4143</a>
4144</li>
4145<li class="py-2 "
4146    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10"
4147>
4148<a href="https://www.jardindupicvert.com/genre/abies"
4149           title="Sapins"
4150           class="u-text-ellipsis
4151                 "
4152            style=""
4153        >
4154<span data-node-title>
4155Sapins            </span>
4156</a>
4157</li>
4158</ol>
4159</li>
4160<li class="py-2 "
4161    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3"
4162>
4163<a href="https://www.jardindupicvert.com/palmiers"
4164           title="Les&#x20;palmiers"
4165           class="u-text-ellipsis
4166                 "
4167            style=""
4168        >
4169<span data-node-title>
4170Les palmiers            </span>
4171</a>
4172</li>
4173<li class="py-2 "
4174    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4"
4175>
4176<span class="flex items-center justify-between cursor-pointer
4177                 "
4178            style=""
4179        >
4180<span data-node-title>
4181Les arbres par utilisation            </span>
4182<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4183                    <use xlink:href="#chevron-symbol"></use>
4184                </svg>
4185</span>
4186<ol class="p-2"
4187            style="z-index: 2"
4188            data-menu-lvl="2"
4189        >
4190<li class="py-2 heading"
4191    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0"
4192>
4193<a href="https://www.jardindupicvert.com/arbres"
4194           title="Les&#x20;arbres&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4195           class="u-text-ellipsis
4196                 "
4197            style=""
4198        >
4199<span data-node-title>
4200Les arbres par utilisation :  tous les produits            </span>
4201</a>
4202</li>
4203<li class="py-2 "
4204    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1"
4205>
4206<a href="https://www.jardindupicvert.com/arbres/arbres-a-ecorce-remarquable"
4207           title="Arbres&#x20;&#xE0;&#x20;&#xE9;corce&#x20;remarquable"
4208           class="u-text-ellipsis
4209                 "
4210            style=""
4211        >
4212<span data-node-title>
4213Arbres à écorce remarquable            </span>
4214</a>
4215</li>
4216<li class="py-2 "
4217    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2"
4218>
4219<a href="https://www.jardindupicvert.com/arbres/arbres-parfumes"
4220           title="Arbres&#x20;parfum&#xE9;s"
4221           class="u-text-ellipsis
4222                 "
4223            style=""
4224        >
4225<span data-node-title>
4226Arbres parfumés            </span>
4227</a>
4228</li>
4229<li class="py-2 "
4230    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2_3"
4231>
4232<a href="https://www.jardindupicvert.com/arbres/arbres-a-feuillage-panache"
4233           title="Arbres&#x20;&#xE0;&#x20;feuillage&#x20;panach&#xE9;"
4234           class="u-text-ellipsis
4235                 "
4236            style=""
4237        >
4238<span data-node-title>
4239Arbres à feuillage panaché            </span>
4240</a>
4241</li>
4242<li class="py-2 "
4243    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2_3_4"
4244>
4245<a href="https://www.jardindupicvert.com/arbres/arbres-a-feuillage-persistant"
4246           title="Arbres&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
4247           class="u-text-ellipsis
4248                 "
4249            style=""
4250        >
4251<span data-node-title>
4252Arbres à feuillage persistant            </span>
4253</a>
4254</li>
4255<li class="py-2 "
4256    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2_3_4_5"
4257>
4258<a href="https://www.jardindupicvert.com/arbres/arbres-mediterraneens"
4259           title="Arbres&#x20;m&#xE9;diterran&#xE9;ens"
4260           class="u-text-ellipsis
4261                 "
4262            style=""
4263        >
4264<span data-node-title>
4265Arbres méditerranéens            </span>
4266</a>
4267</li>
4268</ol>
4269</li>
4270</ol>
4271</li>
4272<li class="py-2 "
4273    data-node-id="866"
4274>
4275<span class="flex items-center justify-between cursor-pointer
4276                 "
4277            style=""
4278        >
4279<span data-node-title>
4280Fruitiers et petits fruits            </span>
4281<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4282                    <use xlink:href="#chevron-symbol"></use>
4283                </svg>
4284</span>
4285<ol class="p-2"
4286            style="z-index: 1"
4287            data-menu-lvl="1"
4288        >
4289<li class="py-2 heading"
4290    data-node-id="866_0"
4291>
4292<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits"
4293           title="Fruitiers&#x20;et&#x20;petits&#x20;fruits&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4294           class="u-text-ellipsis
4295                 "
4296            style=""
4297        >
4298<span data-node-title>
4299Fruitiers et petits fruits :  tous les produits            </span>
4300</a>
4301</li>
4302<li class="py-2 "
4303    data-node-id="866_0_1"
4304>
4305<span class="flex items-center justify-between cursor-pointer
4306                 "
4307            style=""
4308        >
4309<span data-node-title>
4310Tous nos fruitiers            </span>
4311<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4312                    <use xlink:href="#chevron-symbol"></use>
4313                </svg>
4314</span>
4315<ol class="p-2"
4316            style="z-index: 2"
4317            data-menu-lvl="2"
4318        >
4319<li class="py-2 heading"
4320    data-node-id="866_0_1_0"
4321>
4322<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits"
4323           title="Tous&#x20;nos&#x20;fruitiers&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4324           class="u-text-ellipsis
4325                 "
4326            style=""
4327        >
4328<span data-node-title>
4329Tous nos fruitiers :  tous les produits            </span>
4330</a>
4331</li>
4332<li class="py-2 "
4333    data-node-id="866_0_1_0_1"
4334>
4335<a href="https://www.jardindupicvert.com/genre/prunus/prunus-armeniaca"
4336           title="Abricotiers"
4337           class="u-text-ellipsis
4338                 "
4339            style=""
4340        >
4341<span data-node-title>
4342Abricotiers            </span>
4343</a>
4344</li>
4345<li class="py-2 "
4346    data-node-id="866_0_1_0_1_2"
4347>
4348<a href="https://www.jardindupicvert.com/genre/prunus/prunus-dulcis"
4349           title="Amandiers"
4350           class="u-text-ellipsis
4351                 "
4352            style=""
4353        >
4354<span data-node-title>
4355Amandiers            </span>
4356</a>
4357</li>
4358<li class="py-2 "
4359    data-node-id="866_0_1_0_1_2_3"
4360>
4361<a href="https://www.jardindupicvert.com/genre/prunus/prunus-cerasus"
4362           title="Cerisiers"
4363           class="u-text-ellipsis
4364                 "
4365            style=""
4366        >
4367<span data-node-title>
4368Cerisiers            </span>
4369</a>
4370</li>
4371<li class="py-2 "
4372    data-node-id="866_0_1_0_1_2_3_4"
4373>
4374<a href="https://www.jardindupicvert.com/genre/castanea"
4375           title="Ch&#xE2;taigniers"
4376           class="u-text-ellipsis
4377                 "
4378            style=""
4379        >
4380<span data-node-title>
4381Châtaigniers            </span>
4382</a>
4383</li>
4384<li class="py-2 "
4385    data-node-id="866_0_1_0_1_2_3_4_5"
4386>
4387<a href="https://www.jardindupicvert.com/genre/ficus/ficus-carica"
4388           title="Figuiers"
4389           class="u-text-ellipsis
4390                 "
4391            style=""
4392        >
4393<span data-node-title>
4394Figuiers            </span>
4395</a>
4396</li>
4397<li class="py-2 "
4398    data-node-id="866_0_1_0_1_2_3_4_5_6"
4399>
4400<a href="https://www.jardindupicvert.com/genre/corylus"
4401           title="Noisetiers"
4402           class="u-text-ellipsis
4403                 "
4404            style=""
4405        >
4406<span data-node-title>
4407Noisetiers            </span>
4408</a>
4409</li>
4410<li class="py-2 "
4411    data-node-id="866_0_1_0_1_2_3_4_5_6_7"
4412>
4413<a href="https://www.jardindupicvert.com/genre/juglans"
4414           title="Noyers"
4415           class="u-text-ellipsis
4416                 "
4417            style=""
4418        >
4419<span data-node-title>
4420Noyers            </span>
4421</a>
4422</li>
4423<li class="py-2 "
4424    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8"
4425>
4426<a href="https://www.jardindupicvert.com/genre/prunus/prunus-persica"
4427           title="P&#xEA;chers&#x20;-&#x20;nectariniers"
4428           class="u-text-ellipsis
4429                 "
4430            style=""
4431        >
4432<span data-node-title>
4433Pêchers - nectariniers            </span>
4434</a>
4435</li>
4436<li class="py-2 "
4437    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9"
4438>
4439<a href="https://www.jardindupicvert.com/genre/pyrus"
4440           title="Poiriers"
4441           class="u-text-ellipsis
4442                 "
4443            style=""
4444        >
4445<span data-node-title>
4446Poiriers            </span>
4447</a>
4448</li>
4449<li class="py-2 "
4450    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10"
4451>
4452<a href="https://www.jardindupicvert.com/genre/malus"
4453           title="Pommiers"
4454           class="u-text-ellipsis
4455                 "
4456            style=""
4457        >
4458<span data-node-title>
4459Pommiers            </span>
4460</a>
4461</li>
4462<li class="py-2 "
4463    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
4464>
4465<a href="https://www.jardindupicvert.com/genre/prunus/prunus-domestica"
4466           title="Pruniers&#x20;-&#x20;mirabelliers"
4467           class="u-text-ellipsis
4468                 "
4469            style=""
4470        >
4471<span data-node-title>
4472Pruniers - mirabelliers            </span>
4473</a>
4474</li>
4475</ol>
4476</li>
4477<li class="py-2 "
4478    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2"
4479>
4480<span class="flex items-center justify-between cursor-pointer
4481                 "
4482            style=""
4483        >
4484<span data-node-title>
4485Arbustes à petits fruits            </span>
4486<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4487                    <use xlink:href="#chevron-symbol"></use>
4488                </svg>
4489</span>
4490<ol class="p-2"
4491            style="z-index: 2"
4492            data-menu-lvl="2"
4493        >
4494<li class="py-2 heading"
4495    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0"
4496>
4497<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/petits-fruits"
4498           title="Arbustes&#x20;&#xE0;&#x20;petits&#x20;fruits&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4499           class="u-text-ellipsis
4500                 "
4501            style=""
4502        >
4503<span data-node-title>
4504Arbustes à petits fruits :  tous les produits            </span>
4505</a>
4506</li>
4507<li class="py-2 "
4508    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1"
4509>
4510<a href="https://www.jardindupicvert.com/genre/ribes/ribes-nigrum"
4511           title="Cassissiers"
4512           class="u-text-ellipsis
4513                 "
4514            style=""
4515        >
4516<span data-node-title>
4517Cassissiers            </span>
4518</a>
4519</li>
4520<li class="py-2 "
4521    data-node-id="866_0_1_0
4521_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2"
4522>
4523<a href="https://www.jardindupicvert.com/genre/fragaria"
4524           title="Fraisiers"
4525           class="u-text-ellipsis
4526                 "
4527            style=""
4528        >
4529<span data-node-title>
4530Fraisiers            </span>
4531</a>
4532</li>
4533<li class="py-2 "
4534    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3"
4535>
4536<a href="https://www.jardindupicvert.com/genre/rubus/rubus-idaeus"
4537           title="Framboisiers"
4538           class="u-text-ellipsis
4539                 "
4540            style=""
4541        >
4542<span data-node-title>
4543Framboisiers            </span>
4544</a>
4545</li>
4546<li class="py-2 "
4547    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4"
4548>
4549<a href="https://www.jardindupicvert.com/genre/ribes/ribes-rubrum"
4550           title="Groseilliers"
4551           class="u-text-ellipsis
4552                 "
4553            style=""
4554        >
4555<span data-node-title>
4556Groseilliers            </span>
4557</a>
4558</li>
4559<li class="py-2 "
4560    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5"
4561>
4562<a href="https://www.jardindupicvert.com/genre/actinidia"
4563           title="Kiwis"
4564           class="u-text-ellipsis
4565                 "
4566            style=""
4567        >
4568<span data-node-title>
4569Kiwis            </span>
4570</a>
4571</li>
4572<li class="py-2 "
4573    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6"
4574>
4575<a href="https://www.jardindupicvert.com/genre/morus"
4576           title="M&#xFB;riers"
4577           class="u-text-ellipsis
4578                 "
4579            style=""
4580        >
4581<span data-node-title>
4582Mûriers            </span>
4583</a>
4584</li>
4585<li class="py-2 "
4586    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6_7"
4587>
4588<a href="https://www.jardindupicvert.com/genre/vaccinium"
4589           title="Myrtilles&#x20;-&#x20;airelles"
4590           class="u-text-ellipsis
4591                 "
4592            style=""
4593        >
4594<span data-node-title>
4595Myrtilles - airelles            </span>
4596</a>
4597</li>
4598<li class="py-2 "
4599    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6_7_8"
4600>
4601<a href="https://www.jardindupicvert.com/genre/vitis/vitis-vinifera"
4602           title="Vignes"
4603           class="u-text-ellipsis
4604                 "
4605            style=""
4606        >
4607<span data-node-title>
4608Vignes            </span>
4609</a>
4610</li>
4611</ol>
4612</li>
4613<li class="py-2 "
4614    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6_7_8_3"
4615>
4616<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/fruitiers-nains-a-port-colonnaire"
4617           title="Fruitiers&#x20;nains&#x20;et&#x20;&#xE0;&#x20;port&#x20;colonnaire"
4618           class="u-text-ellipsis
4619                 "
4620            style=""
4621        >
4622<span data-node-title>
4623Fruitiers nains et à port colonnaire            </span>
4624</a>
4625</li>
4626</ol>
4627</li>
4628<li class="py-2 "
4629    data-node-id="1115"
4630>
4631<span class="flex items-center justify-between cursor-pointer
4632                 "
4633            style=""
4634        >
4635<span data-node-title>
4636Potager            </span>
4637<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4638                    <use xlink:href="#chevron-symbol"></use>
4639                </svg>
4640</span>
4641<ol class="p-2"
4642            style="z-index: 1"
4643            data-menu-lvl="1"
4644        >
4645<li class="py-2 "
4646    data-node-id="1115_1116"
4647>
4648<a href="https://www.jardindupicvert.com/bulbes-et-semences/graines-potageres"
4649           title="Graines&#x20;potag&#xE8;res"
4650           class="u-text-ellipsis
4651                 "
4652            style=""
4653        >
4654<span data-node-title>
4655Graines potagères            </span>
4656</a>
4657</li>
4658<li class="py-2 "
4659    data-node-id="1115_1116_1119"
4660>
4661<a href="https://www.jardindupicvert.com/potager/plants-de-tomate"
4662           title="Plants&#x20;de&#x20;tomate"
4663           class="u-text-ellipsis
4664                 "
4665            style=""
4666        >
4667<span data-node-title>
4668Plants de tomate            </span>
4669</a>
4670</li>
4671<li class="py-2 "
4672    data-node-id="1115_1116_1119_1117"
4673>
4674<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-potagers"
4675           title="Bulbes&#x20;potagers"
4676           class="u-text-ellipsis
4677                 "
4678            style=""
4679        >
4680<span data-node-title>
4681Bulbes potagers            </span>
4682</a>
4683</li>
4684<li class="py-2 "
4685    data-node-id="1115_1116_1119_1117_1118"
4686>
4687<a href="https://www.jardindupicvert.com/potager/potager-d-ornement"
4688           title="Potager&#x20;d&#x27;ornement"
4689           class="u-text-ellipsis
4690                 "
4691            style=""
4692        >
4693<span data-node-title>
4694Potager d&#039;ornement            </span>
4695</a>
4696</li>
4697</ol>
4698</li>
4699<li class="py-2 "
4700    data-node-id="889"
4701>
4702<span class="flex items-center justify-between cursor-pointer
4703                 "
4704            style=""
4705        >
4706<span data-node-title>
4707Plantes grimpantes            </span>
4708<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4709                    <use xlink:href="#chevron-symbol"></use>
4710                </svg>
4711</span>
4712<ol class="p-2"
4713            style="z-index: 1"
4714            data-menu-lvl="1"
4715        >
4716<li class="py-2 heading"
4717    data-node-id="889_0"
4718>
4719<a href="https://www.jardindupicvert.com/plantes-grimpantes"
4720           title="Plantes&#x20;grimpantes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4721           class="u-text-ellipsis
4722                 "
4723            style=""
4724        >
4725<span data-node-title>
4726Plantes grimpantes :  tous les produits            </span>
4727</a>
4728</li>
4729<li class="py-2 "
4730    data-node-id="889_0_1"
4731>
4732<span class="flex items-center justify-between cursor-pointer
4733                 "
4734            style=""
4735        >
4736<span data-node-title>
4737Toutes nos plantes grimpantes            </span>
4738<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4739                    <use xlink:href="#chevron-symbol"></use>
4740                </svg>
4741</span>
4742<ol class="p-2"
4743            style="z-index: 2"
4744            data-menu-lvl="2"
4745        >
4746<li class="py-2 heading"
4747    data-node-id="889_0_1_0"
4748>
4749<a href="https://www.jardindupicvert.com/plantes-grimpantes"
4750           title="Toutes&#x20;nos&#x20;plantes&#x20;grimpantes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4751           class="u-text-ellipsis
4752                 "
4753            style=""
4754        >
4755<span data-node-title>
4756Toutes nos plantes grimpantes :  tous les produits            </span>
4757</a>
4758</li>
4759<li class="py-2 "
4760    data-node-id="889_0_1_0_1"
4761>
4762<a href="https://www.jardindupicvert.com/genre/akebia"
4763           title="Ak&#xE9;bies"
4764           class="u-text-ellipsis
4765                 "
4766            style=""
4767        >
4768<span data-node-title>
4769Akébies            </span>
4770</a>
4771</li>
4772<li class="py-2 "
4773    data-node-id="889_0_1_0_1_2"
4774>
4775<a href="https://www.jardindupicvert.com/genre/campsis"
4776           title="Campsis"
4777           class="u-text-ellipsis
4778                 "
4779            style=""
4780        >
4781<span data-node-title>
4782Campsis            </span>
4783</a>
4784</li>
4785<li class="py-2 "
4786    data-node-id="889_0_1_0_1_2_3"
4787>
4788<a href="https://www.jardindupicvert.com/genre/lonicera"
4789           title="Ch&#xE8;vrefeuilles"
4790           class="u-text-ellipsis
4791                 "
4792            style=""
4793        >
4794<span data-node-title>
4795Chèvrefeuilles            </span>
4796</a>
4797</li>
4798<li class="py-2 "
4799    data-node-id="889_0_1_0_1_2_3_4"
4800>
4801<a href="https://www.jardindupicvert.com/genre/clematis"
4802           title="Cl&#xE9;matites"
4803           class="u-text-ellipsis
4804                 "
4805            style=""
4806        >
4807<span data-node-title>
4808Clématites            </span>
4809</a>
4810</li>
4811<li class="py-2 "
4812    data-node-id="889_0_1_0_1_2_3_4_5"
4813>
4814<a href="https://www.jardindupicvert.com/genre/wisteria"
4815           title="Glycines"
4816           class="u-text-ellipsis
4817                 "
4818            style=""
4819        >
4820<span data-node-title>
4821Glycines            </span>
4822</a>
4823</li>
4824<li class="py-2 "
4825    data-node-id="889_0_1_0_1_2_3_4_5_6"
4826>
4827<a href="https://www.jardindupicvert.com/genre/hydrangea/hydrangea-petiolaris"
4828           title="Hortensias&#x20;grimpants"
4829           class="u-text-ellipsis
4830                 "
4831            style=""
4832        >
4833<span data-node-title>
4834Hortensias grimpants            </span>
4835</a>
4836</li>
4837<li class="py-2 "
4838    data-node-id="889_0_1_0_1_2_3_4_5_6_7"
4839>
4840<a href="https://www.jardindupicvert.com/genre/jasminum"
4841           title="Jasmins"
4842           class="u-text-ellipsis
4843                 "
4844            style=""
4845        >
4846<span data-node-title>
4847Jasmins            </span>
4848</a>
4849</li>
4850<li class="py-2 "
4851    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8"
4852>
4853<a href="https://www.jardindupicvert.com/genre/trachelospermum/trachelospermum-jasminoides"
4854           title="Jasmins&#x20;&#xE9;toil&#xE9;s"
4855           class="u-text-ellipsis
4856                 "
4857            style=""
4858        >
4859<span data-node-title>
4860Jasmins étoilés            </span>
4861</a>
4862</li>
4863<li class="py-2 "
4864    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9"
4865>
4866<a href="https://www.jardindupicvert.com/genre/hedera"
4867           title="Lierres"
4868           class="u-text-ellipsis
4869                 "
4870            style=""
4871        >
4872<span data-node-title>
4873Lierres            </span>
4874</a>
4875</li>
4876<li class="py-2 "
4877    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10"
4878>
4879<a href="https://www.jardindupicvert.com/genre/passiflora"
4880           title="Passiflores"
4881           class="u-text-ellipsis
4882                 "
4883            style=""
4884        >
4885<span data-node-title>
4886Passiflores            </span>
4887</a>
4888</li>
4889<li class="py-2 "
4890    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
4891>
4892<a href="https://www.jardindupicvert.com/rosiers/rosiers-grimpants"
4893           title="Rosiers&#x20;grimpants"
4894           class="u-text-ellipsis
4895                 "
4896            style=""
4897        >
4898<span data-node-title>
4899Rosiers grimpants            </span>
4900</a>
4901</li>
4902<li class="py-2 "
4903    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
4904>
4905<a href="https://www.jardindupicvert.com/genre/schizophragma"
4906           title="Schizophragmas"
4907           class="u-text-ellipsis
4908                 "
4909            style=""
4910        >
4911<span data-node-title>
4912Schizophragmas            </span>
4913</a>
4914</li>
4915<li class="py-2 "
4916    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
4917>
4918<a href="https://www.jardindupicvert.com/genre/parthenocissus"
4919           title="Vignes&#x20;vierges"
4920           class="u-text-ellipsis
4921                 "
4922            style=""
4923        >
4924<span data-node-title>
4925Vignes vierges            </span>
4926</a>
4927</li>
4928</ol>
4929</li>
4930<li class="py-2 "
4931    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2"
4932>
4933<span class="flex items-center justify-between cursor-pointer
4934                 "
4935            style=""
4936        >
4937<span data-node-title>
4938Plantes grimpantes par utilisation            </span>
4939<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4940                    <use xlink:href="#chevron-symbol"></use>
4941                </svg>
4942</span>
4943<ol class="p-2"
4944            style="z-index: 2"
4945            data-menu-lvl="2"
4946        >
4947<li class="py-2 heading"
4948    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0"
4949>
4950<a href="https://www.jardindupicvert.com/plantes-grimpantes"
4951           title="Plantes&#x20;grimpantes&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4952           class="u-text-ellipsis
4953                 "
4954            style=""
4955        >
4956<span data-node-title>
4957Plantes grimpantes par utilisation :  tous les produits            </span>
4958</a>
4959</li>
4960<li class="py-2 "
4961    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1"
4962>
4963<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-printaniere"
4964           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re"
4965           class="u-text-ellipsis
4966                 "
4967            style=""
4968        >
4969<span data-node-title>
4970Plantes grimpantes à floraison printanière            </span>
4971</a>
4972</li>
4973<li class="py-2 "
4974    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2"
4975>
4976<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-estivale"
4977           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;estivale"
4978           class="u-text-ellipsis
4979                 "
4980            style=""
4981        >
4982<span data-node-title>
4983Plantes grimpantes à floraison estivale            </span>
4984</a>
4985</li>
4986<li class="py-2 "
4987    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3"
4988>
4989<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-automnale"
4990           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;automnale"
4991           class="u-text-ellipsis
4992                 "
4993            style=""
4994        >
4995<span data-node-title>
4996Plantes grimpantes à floraison automnale            </span>
4997</a>
4998</li>
4999<li class="py-2 "
5000    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4"
5001>
5002<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-hivernale"
5003           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;hivernale"
5004           class="u-text-ellipsis
5005                 "
5006            style=""
5007        >
5008<span data-node-title>
5009Plantes grimpantes à floraison hivernale            </span>
5010</a>
5011</li>
5012<li class="py-2 "
5013    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4_5"
5014>
5015<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-feuillage-persistant"
5016           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
5017           class="u-text-ellipsis
5018                 "
5019            style=""
5020        >
5021<span data-node-title>
5022Plantes grimpantes à feuillage persistant            </span>
5023</a>
5024</li>
5025<li class="py-2 "
5026    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4_5_6"
5027>
5028<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-p
5028arfumees"
5029           title="Plantes&#x20;grimpantes&#x20;parfum&#xE9;es"
5030           class="u-text-ellipsis
5031                 "
5032            style=""
5033        >
5034<span data-node-title>
5035Plantes grimpantes parfumées            </span>
5036</a>
5037</li>
5038<li class="py-2 "
5039    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4_5_6_7"
5040>
5041<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-d-ombre"
5042           title="Plantes&#x20;grimpantes&#x20;d&#x27;ombre"
5043           class="u-text-ellipsis
5044                 "
5045            style=""
5046        >
5047<span data-node-title>
5048Plantes grimpantes d&#039;ombre            </span>
5049</a>
5050</li>
5051</ol>
5052</li>
5053</ol>
5054</li>
5055<li class="py-2 "
5056    data-node-id="912"
5057>
5058<span class="flex items-center justify-between cursor-pointer
5059                 "
5060            style=""
5061        >
5062<span data-node-title>
5063Rosiers            </span>
5064<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5065                    <use xlink:href="#chevron-symbol"></use>
5066                </svg>
5067</span>
5068<ol class="p-2"
5069            style="z-index: 1"
5070            data-menu-lvl="1"
5071        >
5072<li class="py-2 heading"
5073    data-node-id="912_0"
5074>
5075<a href="https://www.jardindupicvert.com/rosiers"
5076           title="Rosiers&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5077           class="u-text-ellipsis
5078                 "
5079            style=""
5080        >
5081<span data-node-title>
5082Rosiers :  tous les produits            </span>
5083</a>
5084</li>
5085<li class="py-2 "
5086    data-node-id="912_0_1"
5087>
5088<span class="flex items-center justify-between cursor-pointer
5089                 "
5090            style=""
5091        >
5092<span data-node-title>
5093Rosiers à grandes fleurs            </span>
5094<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5095                    <use xlink:href="#chevron-symbol"></use>
5096                </svg>
5097</span>
5098<ol class="p-2"
5099            style="z-index: 2"
5100            data-menu-lvl="2"
5101        >
5102<li class="py-2 heading"
5103    data-node-id="912_0_1_0"
5104>
5105<a href="https://www.jardindupicvert.com/rosiers/rosiers-a-grandes-fleurs"
5106           title="Rosiers&#x20;&#xE0;&#x20;grandes&#x20;fleurs&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5107           class="u-text-ellipsis
5108                 "
5109            style=""
5110        >
5111<span data-node-title>
5112Rosiers à grandes fleurs :  tous les produits            </span>
5113</a>
5114</li>
5115<li class="py-2 "
5116    data-node-id="912_0_1_0_1"
5117>
5118<a href="https://www.jardindupicvert.com/rosiers/rosiers-anglais"
5119           title="Rosiers&#x20;anglais"
5120           class="u-text-ellipsis
5121                 "
5122            style=""
5123        >
5124<span data-node-title>
5125Rosiers anglais            </span>
5126</a>
5127</li>
5128<li class="py-2 "
5129    data-node-id="912_0_1_0_1_2"
5130>
5131<a href="https://www.jardindupicvert.com/rosiers/rosiers-generosa"
5132           title="Rosiers&#x20;Generosa"
5133           class="u-text-ellipsis
5134                 "
5135            style=""
5136        >
5137<span data-node-title>
5138Rosiers Generosa            </span>
5139</a>
5140</li>
5141<li class="py-2 "
5142    data-node-id="912_0_1_0_1_2_3"
5143>
5144<a href="https://www.jardindupicvert.com/rosiers/rosiers-the-moderne"
5145           title="Rosiers&#x20;Th&#xE9;&#x20;moderne"
5146           class="u-text-ellipsis
5147                 "
5148            style=""
5149        >
5150<span data-node-title>
5151Rosiers Thé moderne            </span>
5152</a>
5153</li>
5154</ol>
5155</li>
5156<li class="py-2 "
5157    data-node-id="912_0_1_0_1_2_3_2"
5158>
5159<a href="https://www.jardindupicvert.com/rosiers/rosiers-grimpants"
5160           title="Rosiers&#x20;grimpants"
5161           class="u-text-ellipsis
5162                 "
5163            style=""
5164        >
5165<span data-node-title>
5166Rosiers grimpants            </span>
5167</a>
5168</li>
5169<li class="py-2 "
5170    data-node-id="912_0_1_0_1_2_3_2_3"
5171>
5172<a href="https://www.jardindupicvert.com/rosiers/rosiers-lianes"
5173           title="Rosiers&#x20;lianes"
5174           class="u-text-ellipsis
5175                 "
5176            style=""
5177        >
5178<span data-node-title>
5179Rosiers lianes            </span>
5180</a>
5181</li>
5182<li class="py-2 "
5183    data-node-id="912_0_1_0_1_2_3_2_3_4"
5184>
5185<span class="flex items-center justify-between cursor-pointer
5186                 "
5187            style=""
5188        >
5189<span data-node-title>
5190Rosiers anciens            </span>
5191<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5192                    <use xlink:href="#chevron-symbol"></use>
5193                </svg>
5194</span>
5195<ol class="p-2"
5196            style="z-index: 2"
5197            data-menu-lvl="2"
5198        >
5199<li class="py-2 heading"
5200    data-node-id="912_0_1_0_1_2_3_2_3_4_0"
5201>
5202<a href="https://www.jardindupicvert.com/rosiers/rosiers-anciens"
5203           title="Rosiers&#x20;anciens&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5204           class="u-text-ellipsis
5205                 "
5206            style=""
5207        >
5208<span data-node-title>
5209Rosiers anciens :  tous les produits            </span>
5210</a>
5211</li>
5212<li class="py-2 "
5213    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1"
5214>
5215<a href="https://www.jardindupicvert.com/genre/rosa/rosa-bourbon"
5216           title="Rosiers&#x20;bourbons"
5217           class="u-text-ellipsis
5218                 "
5219            style=""
5220        >
5221<span data-node-title>
5222Rosiers bourbons            </span>
5223</a>
5224</li>
5225<li class="py-2 "
5226    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2"
5227>
5228<a href="https://www.jardindupicvert.com/genre/rosa/rosa-gallica"
5229           title="Rosiers&#x20;galliques"
5230           class="u-text-ellipsis
5231                 "
5232            style=""
5233        >
5234<span data-node-title>
5235Rosiers galliques            </span>
5236</a>
5237</li>
5238<li class="py-2 "
5239    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3"
5240>
5241<a href="https://www.jardindupicvert.com/genre/rosa/rosa-damas"
5242           title="Rosiers&#x20;de&#x20;Damas"
5243           class="u-text-ellipsis
5244                 "
5245            style=""
5246        >
5247<span data-node-title>
5248Rosiers de Damas            </span>
5249</a>
5250</li>
5251<li class="py-2 "
5252    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4"
5253>
5254<a href="https://www.jardindupicvert.com/genre/rosa/rosa-portland"
5255           title="Rosiers&#x20;de&#x20;Portland"
5256           class="u-text-ellipsis
5257                 "
5258            style=""
5259        >
5260<span data-node-title>
5261Rosiers de Portland            </span>
5262</a>
5263</li>
5264<li class="py-2 "
5265    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5"
5266>
5267<a href="https://www.jardindupicvert.com/genre/rosa/rosa-rugosa"
5268           title="Rosiers&#x20;rugueux"
5269           class="u-text-ellipsis
5270                 "
5271            style=""
5272        >
5273<span data-node-title>
5274Rosiers rugueux            </span>
5275</a>
5276</li>
5277</ol>
5278</li>
5279<li class="py-2 "
5280    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5"
5281>
5282<span class="flex items-center justify-between cursor-pointer
5283                 "
5284            style=""
5285        >
5286<span data-node-title>
5287Rosiers à massifs            </span>
5288<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5289                    <use xlink:href="#chevron-symbol"></use>
5290                </svg>
5291</span>
5292<ol class="p-2"
5293            style="z-index: 2"
5294            data-menu-lvl="2"
5295        >
5296<li class="py-2 heading"
5297    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0"
5298>
5299<a href="https://www.jardindupicvert.com/rosiers"
5300           title="Rosiers&#x20;&#xE0;&#x20;massifs&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5301           class="u-text-ellipsis
5302                 "
5303            style=""
5304        >
5305<span data-node-title>
5306Rosiers à massifs :  tous les produits            </span>
5307</a>
5308</li>
5309<li class="py-2 "
5310    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1"
5311>
5312<a href="https://www.jardindupicvert.com/genre/rosa/rosa-arbuste"
5313           title="Rosiers&#x20;arbustifs"
5314           class="u-text-ellipsis
5315                 "
5316            style=""
5317        >
5318<span data-node-title>
5319Rosiers arbustifs            </span>
5320</a>
5321</li>
5322<li class="py-2 "
5323    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2"
5324>
5325<a href="https://www.jardindupicvert.com/genre/rosa/rosa-couvre-sol"
5326           title="Rosiers&#x20;couvre-sol"
5327           class="u-text-ellipsis
5328                 "
5329            style=""
5330        >
5331<span data-node-title>
5332Rosiers couvre-sol            </span>
5333</a>
5334</li>
5335<li class="py-2 "
5336    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2_3"
5337>
5338<a href="https://www.jardindupicvert.com/rosiers/rosiers-decorosiers"
5339           title="Rosiers&#x20;D&#xE9;corosiers"
5340           class="u-text-ellipsis
5341                 "
5342            style=""
5343        >
5344<span data-node-title>
5345Rosiers Décorosiers            </span>
5346</a>
5347</li>
5348<li class="py-2 "
5349    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2_3_4"
5350>
5351<a href="https://www.jardindupicvert.com/genre/rosa/rosa-floribunda"
5352           title="Rosiers&#x20;floribunda"
5353           class="u-text-ellipsis
5354                 "
5355            style=""
5356        >
5357<span data-node-title>
5358Rosiers floribunda            </span>
5359</a>
5360</li>
5361<li class="py-2 "
5362    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2_3_4_5"
5363>
5364<a href="https://www.jardindupicvert.com/genre/rosa/rosa-polyantha"
5365           title="Rosiers&#x20;polyantha"
5366           class="u-text-ellipsis
5367                 "
5368            style=""
5369        >
5370<span data-node-title>
5371Rosiers polyantha            </span>
5372</a>
5373</li>
5374</ol>
5375</li>
5376</ol>
5377</li>
5378<li class="py-2 "
5379    data-node-id="931"
5380>
5381<span class="flex items-center justify-between cursor-pointer
5382                 "
5383            style=""
5384        >
5385<span data-node-title>
5386Bulbes et semences            </span>
5387<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5388                    <use xlink:href="#chevron-symbol"></use>
5389                </svg>
5390</span>
5391<ol class="p-2"
5392            style="z-index: 1"
5393            data-menu-lvl="1"
5394        >
5395<li class="py-2 heading"
5396    data-node-id="931_0"
5397>
5398<a href="https://www.jardindupicvert.com/bulbes-et-semences"
5399           title="Bulbes&#x20;et&#x20;semences&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5400           class="u-text-ellipsis
5401                 "
5402            style=""
5403        >
5404<span data-node-title>
5405Bulbes et semences :  tous les produits            </span>
5406</a>
5407</li>
5408<li class="py-2 "
5409    data-node-id="931_0_1"
5410>
5411<span class="flex items-center justify-between cursor-pointer
5412                 "
5413            style=""
5414        >
5415<span data-node-title>
5416Bulbes à floraison printanière            </span>
5417<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5418                    <use xlink:href="#chevron-symbol"></use>
5419                </svg>
5420</span>
5421<ol class="p-2"
5422            style="z-index: 2"
5423            data-menu-lvl="2"
5424        >
5425<li class="py-2 heading"
5426    data-node-id="931_0_1_0"
5427>
5428<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-a-floraison-printaniere"
5429           title="Bulbes&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5430           class="u-text-ellipsis
5431                 "
5432            style=""
5433        >
5434<span data-node-title>
5435Bulbes à floraison printanière :  tous les produits            </span>
5436</a>
5437</li>
5438<li class="py-2 "
5439    data-node-id="931_0_1_0_1"
5440>
5441<a href="https://www.jardindupicvert.com/genre/crocus"
5442           title="Crocus&#x20;de&#x20;printemps"
5443           class="u-text-ellipsis
5444                 "
5445            style=""
5446        >
5447<span data-node-title>
5448Crocus de printemps            </span>
5449</a>
5450</li>
5451<li class="py-2 "
5452    data-node-id="931_0_1_0_1_2"
5453>
5454<a href="https://www.jardindupicvert.com/genre/fritillaria"
5455           title="Fritillaires"
5456           class="u-text-ellipsis
5457                 "
5458            style=""
5459        >
5460<span data-node-title>
5461Fritillaires            </span>
5462</a>
5463</li>
5464<li class="py-2 "
5465    data-node-id="931_0_1_0_1_2_3"
5466>
5467<a href="https://www.jardindupicvert.com/genre/hyacinthus"
5468           title="Jacinthes"
5469           class="u-text-ellipsis
5470                 "
5471            style=""
5472        >
5473<span data-node-title>
5474Jacinthes            </span>
5475</a>
5476</li>
5477<li class="py-2 "
5478    data-node-id="931_0_1_0_1_2_3_4"
5479>
5480<a href="https://www.jardindupicvert.com/genre/muscari"
5481           title="Muscaris"
5482           class="u-text-ellipsis
5483                 "
5484            style=""
5485        >
5486<span data-node-title>
5487Muscaris            </span>
5488</a>
5489</li>
5490<li class="py-2 "
5491    data-node-id="931_0_1_0_1_2_3_4_5"
5492>
5493<a href="https://www.jardindupicvert.com/genre/narcissus"
5494           title="Narcisses"
5495           class="u-text-ellipsis
5496                 "
5497            style=""
5498        >
5499<span data-node-title>
5500Narcisses            </span>
5501</a>
5502</li>
5503<li class="py-2 "
5504    data-node-id="931_0_1_0_1_2_3_4_5_6"
5505>
5506<a href="https://www.jardindupicvert.com/genre/tulipa"
5507           title="Tulipes"
5508           class="u-text-ellipsis
5509                 "
5510            style=""
5511        >
5512<span data-node-title>
5513Tulipes            </span>
5514</a>
5515</li>
5516<li class="py-2 "
5517    data-node-id="931_0_1_0_1_2_3_4_5_6_7"
5518>
5519<a href="https://www.jardindupicvert.com/genre/tulipa/tulipa-gpe-botanique"
5520           title="Tulipes&#x20;botaniques"
5521           class="u-text-ellipsis
5522                 "
5523            style=""
5524        >
5525<span data-node-title>
5526Tulipes botaniques            </span>
5527</a>
5528</li>
5529<li class="py-2 "
5530    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8"
5531>
5532<a href="https://www.jardindupicvert.com/bulbes-et-semences/ail-d-ornement"
5533           title="Aulx&#x20;d&#x27;ornement"
5534           class="u-text-ellipsis
5535                 "
5536            style=""
5537        >
5538<span data-node-title>
5539Aulx d&#039;ornement            </span>
5540</a>
5541</li>
5542</ol>
5543</li>
5544<li class="py-2 "
5545    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2"
5546>
5547<span class="flex items-center justify-between cursor-pointer
5548                 "
5549            style=""
5550        >
5551<span data-node-title>
5552Bulbes à floraison estivale            </span>
5553<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5554                    <use xlink:href="#chevron-symbol"></use>
5555                </svg>
5556</span>
5557<ol class="p-2"
5558            style="z-index: 2"
5559            data-menu-lvl="2"
5560        >
5561<li class="py-2 heading"
5562    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0"
5563>
5564<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-a-floraison-estivale"
5565           title="Bulbes&#x20;&#xE0;&#x20;floraison&#x20;estivale&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5566           class="u-text-ellipsis
5567                 "
5568            style=""
5569        >
5570<span data-node-title>
5571Bulbes à floraison estivale :  tous les produits            </span>
5572</a>
5573</li>
5574<li class="py-2 "
5575    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1"
5576>
5577<a href="https://www.jardindupicvert.com/bulbes-et-semences/les-arums"
5578           title="Arums&#x20;
5578-&#x20;Zantedeschia"
5579           class="u-text-ellipsis
5580                 "
5581            style=""
5582        >
5583<span data-node-title>
5584Arums - Zantedeschia            </span>
5585</a>
5586</li>
5587<li class="py-2 "
5588    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2"
5589>
5590<a href="https://www.jardindupicvert.com/genre/begonia"
5591           title="B&#xE9;gonias"
5592           class="u-text-ellipsis
5593                 "
5594            style=""
5595        >
5596<span data-node-title>
5597Bégonias            </span>
5598</a>
5599</li>
5600<li class="py-2 "
5601    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3"
5602>
5603<a href="https://www.jardindupicvert.com/genre/canna"
5604           title="Cannas"
5605           class="u-text-ellipsis
5606                 "
5607            style=""
5608        >
5609<span data-node-title>
5610Cannas            </span>
5611</a>
5612</li>
5613<li class="py-2 "
5614    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4"
5615>
5616<a href="https://www.jardindupicvert.com/genre/dahlia"
5617           title="Dahlias"
5618           class="u-text-ellipsis
5619                 "
5620            style=""
5621        >
5622<span data-node-title>
5623Dahlias            </span>
5624</a>
5625</li>
5626<li class="py-2 "
5627    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5"
5628>
5629<a href="https://www.jardindupicvert.com/genre/freesia"
5630           title="Freesias"
5631           class="u-text-ellipsis
5632                 "
5633            style=""
5634        >
5635<span data-node-title>
5636Freesias            </span>
5637</a>
5638</li>
5639<li class="py-2 "
5640    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6"
5641>
5642<a href="https://www.jardindupicvert.com/genre/gladiolus"
5643           title="Gla&#xEF;euls"
5644           class="u-text-ellipsis
5645                 "
5646            style=""
5647        >
5648<span data-node-title>
5649Glaïeuls            </span>
5650</a>
5651</li>
5652<li class="py-2 "
5653    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7"
5654>
5655<a href="https://www.jardindupicvert.com/genre/lilium"
5656           title="Lis"
5657           class="u-text-ellipsis
5658                 "
5659            style=""
5660        >
5661<span data-node-title>
5662Lis            </span>
5663</a>
5664</li>
5665</ol>
5666</li>
5667<li class="py-2 "
5668    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3"
5669>
5670<a href="https://www.jardindupicvert.com/plantes-annuelles/graines-de-fleurs"
5671           title="Les&#x20;graines&#x20;de&#x20;fleurs"
5672           class="u-text-ellipsis
5673                 "
5674            style=""
5675        >
5676<span data-node-title>
5677Les graines de fleurs            </span>
5678</a>
5679</li>
5680<li class="py-2 "
5681    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4"
5682>
5683<span class="flex items-center justify-between cursor-pointer
5684                 "
5685            style=""
5686        >
5687<span data-node-title>
5688Bulbes et semences potagères            </span>
5689<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5690                    <use xlink:href="#chevron-symbol"></use>
5691                </svg>
5692</span>
5693<ol class="p-2"
5694            style="z-index: 2"
5695            data-menu-lvl="2"
5696        >
5697<li class="py-2 heading"
5698    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4_0"
5699>
5700<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-et-semences-potageres"
5701           title="Bulbes&#x20;et&#x20;semences&#x20;potag&#xE8;res&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5702           class="u-text-ellipsis
5703                 "
5704            style=""
5705        >
5706<span data-node-title>
5707Bulbes et semences potagères :  tous les produits            </span>
5708</a>
5709</li>
5710<li class="py-2 "
5711    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4_0_1"
5712>
5713<a href="https://www.jardindupicvert.com/genre/solanum/solanum-tuberosum"
5714           title="Pommes&#x20;de&#x20;terre"
5715           class="u-text-ellipsis
5716                 "
5717            style=""
5718        >
5719<span data-node-title>
5720Pommes de terre            </span>
5721</a>
5722</li>
5723<li class="py-2 "
5724    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4_0_1_2"
5725>
5726<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-et-semences-potageres/oignons-ails-et-echalotes"
5727           title="Oignons,&#x20;ails&#x20;et&#x20;&#xE9;chalottes"
5728           class="u-text-ellipsis
5729                 "
5730            style=""
5731        >
5732<span data-node-title>
5733Oignons, ails et échalottes            </span>
5734</a>
5735</li>
5736</ol>
5737</li>
5738</ol>
5739</li>
5740<li class="py-2 "
5741    data-node-id="953"
5742>
5743<a href="/nos-plantes-en-promotion"
5744           title="NOS&#x20;PLANTES&#x20;EN&#x20;PROMOTION"
5745           class="u-text-ellipsis
5746                 text-highlight"
5747            style=""
5748        >
5749<span data-node-title>
5750NOS PLANTES EN PROMOTION            </span>
5751</a>
5752</li>
5753<li class="py-2 "
5754    data-node-id="1130"
5755>
5756<a href="https://www.jardindupicvert.com/nouveautes"
5757           title="NOUVEAUTES"
5758           class="u-text-ellipsis
5759                 "
5760            style="color&#x3A;&#x23;004650&#x3B;font-weight&#x3A;bold&#x3B;"
5761        >
5762<span data-node-title>
5763NOUVEAUTES            </span>
5764</a>
5765</li>
5766</ol>
5767</div>
5768</nav>
5769
5770<div class="nav-0-desktop hidden lg:flex items-center text-white text-sm font-serif"
5771         @click.prevent.stop="openAt"
5772    >
5773<span class="mr-8">
5774<span class="text-4xl font-bold text-white cursor-pointer leading-none">&equiv;</span>
5775</span>
5776<ol class="nav nav-0 flex items-center justify-between grow font-bold">
5777<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5778                    data-node-id="758"
5779                >
5780<span class=""
5781                          style=""
5782                    >
5783Plantes vivaces                    </span>
5784</li>
5785<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5786                    data-node-id="800"
5787                >
5788<span class=""
5789                          style=""
5790                    >
5791Arbustes                    </span>
5792</li>
5793<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5794                    data-node-id="832"
5795                >
5796<span class=""
5797                          style=""
5798                    >
5799Arbres                    </span>
5800</li>
5801<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5802                    data-node-id="866"
5803                >
5804<span class=""
5805                          style=""
5806                    >
5807Fruitiers et petits fruits                    </span>
5808</li>
5809<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5810                    data-node-id="1115"
5811                >
5812<span class=""
5813                          style=""
5814                    >
5815Potager                    </span>
5816</li>
5817<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5818                    data-node-id="889"
5819                >
5820<span class=""
5821                          style=""
5822                    >
5823Plantes grimpantes                    </span>
5824</li>
5825<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5826                    data-node-id="912"
5827                >
5828<span class=""
5829                          style=""
5830                    >
5831Rosiers                    </span>
5832</li>
5833<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5834                    data-node-id="931"
5835                >
5836<span class=""
5837                          style=""
5838                    >
5839Bulbes et semences                    </span>
5840</li>
5841<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5842                    data-node-id="953"
5843                >
5844<span class="text-highlight"
5845                          style=""
5846                    >
5847NOS PLANTES EN PROMOTION                    </span>
5848</li>
5849<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
5850                    data-node-id="1130"
5851                >
5852<span class=""
5853                          style="color&#x3A;&#x23;004650&#x3B;font-weight&#x3A;bold&#x3B;"
5854                    >
5855NOUVEAUTES                    </span>
5856</li>
5857</ol>
5858</div>
5859
5860<!--nav mask-->
5861<div class="backdrop"
5862         :class="isOpen ? '' : 'hidden'"
5863         @click.prevent="closeNav()"></div>
5864</div>
5865
5866<script>
5867    'use strict';
5868
5869    function initMainMenu() {
5870        return {
5871            title: '',
5872            defaultTitle: '<span data-gp-noloc="node">Le\u0020Jardin\u0020du\u0020Pic\u0020Vert</span>',
5873            isOpen: false,
5874            backId: 0,
5875
5876            openAt($event = null) {
5877                if ($event && $event.target?.closest('a')) {
5878                    return;
5879                }
5880                const nodeId = $event && this.getNodeId($event.target);
5881                const node = nodeId ? this.getNodeById(nodeId) : null;
5882                const menu = node?.querySelector('[data-menu-lvl]') || this.$refs.nav;
5883                this.backId = nodeId;
5884                this.title = this.getNodeTitle(node);
5885                this.openMenu(menu);
5886            },
5887
5888            openMenu(menu = null) {
5889                this.isOpen = true;
5890                switchBodyOverflow(false);
5891                this.setActiveMenu(menu);
5892            },
5893
5894            closeNav() {
5895                this.isOpen = false;
5896                switchBodyOverflow(true);
5897            },
5898
5899            navBack() {
5900                const nodeId = this.backId;
5901                const node = nodeId ? this.getNodeById(nodeId) : null;
5902                const menu = node?.closest('[data-menu-lvl]') || this.$refs.nav;
5903                const titleNode = menu?.closest('[data-node-id]');
5904                this.backId = this.getNodeId(titleNode);
5905                this.title = this.getNodeTitle(titleNode);
5906                this.openMenu(menu);
5907            },
5908
5909            setActiveMenu(menu) {
5910                Array.from(this.$root.querySelectorAll('[data-menu-lvl]')).forEach(e => e.classList.remove('active'));
5911                let tmp = menu;
5912                while (tmp) {
5913                    tmp?.classList?.add('active');
5914                    tmp = tmp.parentNode.closest('[data-menu-lvl]');
5915                }
5916            },
5917
5918            getNodeId(node) {
5919                return node instanceof Element ? node.closest('[data-node-id]')?.dataset?.nodeId || 0 : 0;
5920            },
5921
5922            getNodeById(id) {
5923                return this.$refs.nav.querySelector('[data-node-id="' + id + '"]') || null;
5924            },
5925
5926            getNodeTitle(node) {
5927                return node?.querySelector('[data-node-title]')?.innerText || this.defaultTitle;
5928            }
5929        }
5930    }
5931
5932</script>
5932
5933        </div>
5934
5935
5936</div>
5937
5938</div>
5939</header>
5940<script>
5941    function initBannershop() {
5942        const MS_PER_DAY = 24 * 3600 * 1000;
5943        const DEADLINE = 1791586799000;
5944        const DISPLAY_TIME = 0;
5945        const SHOW_COUNTDOWN = false;
5946
5947        return {
5948            show: !DEADLINE || !DISPLAY_TIME || (DEADLINE - Date.now() < DISPLAY_TIME),
5949            days: '-',
5950            hours: '--',
5951            minutes: '--',
5952            seconds: '--',
5953            interval: 0,
5954
5955            init() {
5956                if (this.show && SHOW_COUNTDOWN) {
5957                    if (DISPLAY_TIME) {
5958                        const remaining = DEADLINE - Date.now();
5959                        if (remaining > DISPLAY_TIME) {
5960                            setTimeout(() => {
5961                                this.init()
5962                            }, remaining - DISPLAY_TIME);
5963                            return;
5964                        }
5965                    }
5966                    this.interval = setInterval(() => {
5967                        const now = Date.now();
5968                        let remaining = DEADLINE - now;
5969                        if (remaining <= 0) {
5970                            this.show = false;
5971                            clearInterval(this.interval);
5972                        } else {
5973                            this.days = Math.floor(remaining / MS_PER_DAY);
5974                            remaining -= this.days * MS_PER_DAY;
5975                            this.hours = Math.floor(remaining / 3600000);
5976                            remaining -= this.hours * 3600000;
5977                            this.minutes = Math.floor(remaining / 60000);
5978                            remaining -= this.minutes * 60000;
5979                            this.seconds = Math.floor(remaining / 1000);
5980                        }
5981                    }, 1000);
5982                }
5983            }
5984        }
5985    }
5986</script>
5986
5987<div x-data="initBannershop()"
5988     x-show="show"
5989     class="u-full-width h-[40px] flex items-center justify-center"
5990     style="
5991         background-color: &#x23;55011d;
5992         color: &#x23;FFFFFF     "
5993>
5994<a href="https://www.jardindupicvert.com/genre/sedum"
5995           title="En&#x20;ce&#x20;moment&#x20;&#x3A;&#x20;Profitez&#x20;des&#x20;s&#xE9;dums&#x20;&#xE0;&#x20;-30&#x25;&#x20;&#x21;"
5996            data-gtm-promotion="&#x7B;&quot;item_id&quot;&#x3A;&quot;banner_shop&quot;,&quot;promotion_id&quot;&#x3A;&quot;banner_shop&quot;,&quot;promotion_name&quot;&#x3A;&quot;En&#x20;ce&#x20;moment&#x20;&#x3A;&#x20;Profitez&#x20;des&#x20;s&#x5C;u00e9dums&#x20;&#x5C;u00e0&#x20;-30&#x25;&#x20;&#x21;&quot;,&quot;creative_name&quot;&#x3A;&quot;shop&quot;,&quot;creative_slot&quot;&#x3A;&quot;header&quot;&#x7D;"        >
5997<div class="text-2xs&#x20;sm&#x3A;text-sm&#x20;xl&#x3A;text-lg text-center">
5998En ce moment : Profitez des sédums à -30% !                    </div>
5999</a>
6000</div>
6001<div class="top-container">    <nav class="breadcrumbs bg-container-lighter shadow-sm"
6002         aria-label="Breadcrumb"
6003    >
6004<div class="container">
6005<ol class="items list-reset py-4 rounded flex flex-wrap text-grey text-xs">
6006<li class="item flex home">
6007<a href="https://www.jardindupicvert.com/"
6008                           class="hover:underline"
6009                           title="Aller&#x20;&#xE0;&#x20;la&#x20;page&#x20;d&#x2019;accueil"
6010                        >Accueil</a>
6011</li>
6012<li class="item flex cms_page">
6013<span aria-hidden="true"
6014                              class="separator text-primary-lighter px-2">/</span>
6015<span
6016                           class="text-primary-lighter"
6017                           aria-current="page"
6018                        >Mentions légales (PV)</span>
6019</li>
6020</ol>
6021</div>
6022</nav>
6023</div><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div>
6024<div id="fp.wp.marker-top"></div><div class="page messages">
6024<script>
6025    
6026        let NO_SUCCESS_MESSAGE = false;
6027
6028    function initMessages() {
6029        "use strict";
6030        return {
6031            messages: window.mageMessages || [],
6032
6033            isEmpty() {
6034                return this.messages.reduce(
6035                    function (isEmpty, message) {
6036                        return isEmpty && message === undefined
6037                    }, true
6038                )
6039            },
6040
6041            hasMessages() {
6042                return !this.isEmpty();
6043            },
6044
6045            hasMessage() {
6046                return !!this.message;
6047            },
6048
6049            removeMessage() {
6050                this.messages[this.index] = undefined;
6051            },
6052
6053            addMessages(messages, hideAfter) {
6054                messages.map((message) => {
6055                                        if (message.type !== 'success' || (message.type === 'success' && !window.NO_SUCCESS_MESSAGE)) {
6056                        this.messages = this.messages.concat(message);
6057                    }
6058                    if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) {
6059                        hideAfter = window.defaultSuccessMessageTimeout;
6060                    }
6061                    if (hideAfter) {
6062                        this.setHideTimeOut(this.messages.length -1, hideAfter);
6063                    }
6064                });
6065                                window.NO_SUCCESS_MESSAGE = false;
6066            },
6067
6068            setHideTimeOut(messageIndex, hideAfter) {
6069                setTimeout((messageIndex) => {
6070                    this.removeMessage(messageIndex);
6071                }, hideAfter, messageIndex);
6072            },
6073
6074            eventListeners: {
6075                ['@messages-loaded.window'](event) {
6076                    this.addMessages(event.detail.messages, event.detail.hideAfter)
6077                },
6078                ['@private-content-loaded.window'](event) {
6079                    const data = event.detail.data;
6080                    if (
6081                        data.messages &&
6082                        data.messages.messages &&
6083                        data.messages.messages.length
6084                    ) {
6085                        this.addMessages(data.messages.messages);
6086                    }
6087                },
6088                ['@clear-messages.window']() {
6089                    this.messages = [];
6090                }
6091            },
6092
6093            getMessageUiId() {
6094                return 'message-' + this.message.type;
6095            }
6096        }
6097    }
6098    window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true})
6099</script>
6099
6100
6101<section id="messages"
6102         x-data="initMessages"
6103         x-bind="eventListeners"
6104         aria-live="assertive"
6105         role="alert"
6106>
6107<template x-if="hasMessages">
6108<div class="w-full">
6109<div class="messages fixed z-header top-0 inset-x-0">
6110<template x-for="(message, index) in messages"
6111                          :key="index"
6112                >
6113<div>
6114<template x-if="hasMessage">
6115<div class="message flex items-center justify-between font-bold"
6116                                 :class="message.type"
6117                                 :ui-id="getMessageUiId"
6118                            >
6119<span x-html="message.text"></span>
6120<button type="button"
6121                                        class="hover:text-hover"
6122                                        aria-label="Close message"
6123                                        @click.prevent="removeMessage"
6124                                >
6125&times;
6126</button>
6127</div>
6128</template>
6129</div>
6130</template>
6131</div>
6132</div>
6133</template>
6134</section>
6135</div>    <div class="page-main-title">
6136<h1             class="&#x20;text-3xl&#x20;lg&#x3A;text-4xl&#x20;font-bold&#x20;text-center&#x20;font-serif"
6137        >
6138<span class="base" data-ui-id="page-title-wrapper" >Mentions légales</span>        </h1>
6139</div>
6140<div class="columns"><div class="column main"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><p style="text-align: left;">Raison sociale : <span data-gp-noloc="node">Le Jardin du Pic Vert</span></p>
6141<p style="text-align: justify;">Forme juridique : <span data-gp-noloc="node">Société par actions simplifiée (SAS)</span></p>
6142<p style="text-align: justify;">Siège social : <span data-gp-noloc="node">1012 rue Roger Lecerf - 59840 Prémesques</span></p>
6143<p style="text-align: justify;">Montant du capital social : 7620€</p>
6144<p style="text-align: justify;">Adresse mail : [email protected]</p>
6145<p style="text-align: justify;">Téléphone : 03 20 59 49 74</p>
6146<p style="text-align: justify;">RCS de Lille métropole : 422 537 100</p>
6147<p style="text-align: justify;">Nom du responsable de la publication : M. Fasson Olivier</p>
6148<p style="text-align: justify;">Site hébergé par : OVHCloud, </p>
6149<p style="text-align: justify;"><span data-gp-noloc="node">2 rue Kellermann</span></p>
6150<p style="text-align: justify;"><span data-gp-noloc="node"> 59100 Roubaix France</span></p>
6151<p style="text-align: justify;">Les informations recueillies dans le cadre de ce site sont destinées uniquement au traitement des commandes et à l'usage exclusif du <span data-gp-noloc="node"> Jardin du Pic-Vert</span>. Nous nous engageons à ne pas communiquer à des tiers les informations personnelles que vous nous communiquerez sur notre site web. Conformément à la loi du 6 janvier 1978, vous disposez d'un droit d'accès, de modification, de rectification et de suppression des données vous concernant. Merci de votre confiance.</p>
6152<h3 style="text-align: justify;">Les cookies :</h3>
6153<p style="text-align: justify;">Lorsque vous vous connectez sur notre site, un « cookie » est installé sur votre ordinateur. Un cookie (petit fichier texte) est utilisé pour reconnaître l'internaute d'une page à l'autre et d'une visite à l'autre. Il permet de retrouver vos coordonnées (si vous les avez entrées), de garder en mémoire votre panier, vos commandes en cours ou passées. Les cookies ne sont pas dangereux, ils ne donnent pas accès à votre disque dur, ils ne peuvent pas le modifier. Si votre navigateur n'accepte pas les cookies, vous risquez de ne pas retrouver les informations que vous aurez entrées ou d'être obligé de vous reconnecter régulièrement.</p></div>
6154</div></div><div id="fp.wp.marker-bottom"></div></main><footer class="bg-container-dark py-16"><div class="container"><section id="reinsurance-blocks"
6155         class="text-center mb-12"
6156>
6157<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 lg:gap-8 lg:w-2/3 items-start m-auto leading-tight">
6158<div class="flex flex-col justify-center items-center gap-2">
6159<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#cursor-symbol"></use></svg>
6160<p class="text-white font-bold font-serif text-sm">
616114 900 plantes
6162</p>
6163<p class="text-secondary-lighter text-xs">
6164en 39 337 tailles
6165</p>
6166</div>
6167<div class="flex flex-col justify-center items-center gap-2">
6168<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#customer-service-symbol"></use></svg>
6169<p class="text-white font-bold font-serif text-sm">
6170Nous contacter
6171</p>
6172<p class="text-secondary-lighter text-xs">
6173<span class="glopal-hide">par téléphone au <a href="tel:0320594974" class="text-white">
617303 20 59 49 74</a><br></span>
6174par <a href="https://www.jardindupicvert.com/contact/" class="text-white">formulaire de contact</a><br>
6175Service client disponible du lundi au vendredi.<br>
6176<span data-gp-noloc="node">23 route du Fresnel 59116 Houplines</span>
6177</p>
6178</div>
6179<div class="flex flex-col justify-center items-center gap-2">
6180<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#security-symbol"></use></svg>
6181<p class="mb-2 text-white font-bold font-serif text-sm">
6182Paiement 100% sécurisé
6183</p>
6184<img src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/images/footer-payment-methods.svg"
6185                 class="inline-block w-2/3"
6186                 title="Paiement 100% sécurisé Visa - CB - Mastercard - Paypal"
6187            />
6188</div>
6189<div class="flex flex-col justify-center items-center gap-2">
6190<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#warranty-symbol"></use></svg>
6191<p class="mb-2 text-white font-bold font-serif text-sm">
6192Garantie de reprise
6193</p>
6194<p class="text-secondary-lighter text-xs">
6195sur toutes nos plantes
6196</p>
6197</div>
6198<div class="flex flex-col justify-center items-center gap-2">
6199<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#shipping-symbol"></use></svg>
6200<p class="mb-2 text-white font-bold font-serif text-sm">
6201Informations livraison
6202</p>
6203<p class="text-secondary-lighter text-xs">
6204Livraison rapide, sous 3 à 4 jours<span class="glopal-hide"><br>
6205ou sur rendez-vous</span>
6206</p>
6207</div>
6208<div class="flex flex-col justify-center items-center gap-2">
6209<span class="h-12 text-xl text-secondary-lighter">&#x2605;&#x2605;&#x2605;&#x2605;&#x2605;</span>
6210<p class="mb-2 text-white font-bold font-serif text-sm">
6211Avis clients Google
6212</p>
6213<p class="text-secondary-lighter text-xs">
62144.4 / 5
6215</p>
6216</div>
6217</div>
6218</section>
6219<form x-data="initNewsletterForm()"
6220      x-defer="intersect"
6221      @submit.prevent="submitForm()"
6222      id="newsletter-validate-detail"
6223      class="form subscribe"
6224      :class="{'u-loader': loading}"
6225      action="https://www.jardindupicvert.com/newsletter/subscriber/new/"
6226      method="post"
6227>
6228<div class="my-8 py-4 px-8 border-primary-lighter border-t border-b">
6229<div class="flex flex-col md:flex-row items-center justify-center gap-x-4 gap-y-2">
6230<label for="newsletter-subscribe"
6231                   class="text-white leading-tight"
6232            >
6233<span class="text-sm font-bold">La newsletter préférée des jardins</span>
6234<br>                    <span class="text-xs">Recevez nos actualités et des idées pour profiter de votre jardin toute l&#039;année.</span>
6235</label>
6236<div>
6237<input name="email"
6238                       type="email"
6239                       required
6240                       id="newsletter-subscribe"
6241                       class="form-input w-full px-4 py-2 border-primary-lighter border rounded-3xl shadow-sm text-sm"
6242                       placeholder="Votre&#x20;adresse&#x20;email"
6243                >
6244<input name="form_key" type="hidden" value="jIeQ6NmqNDPAX5IC" />            </div>
6245<div>
6246<button class="inline-flex shrink-0 ml-auto xl:mt-0 text-primary-lighter hover:underline">
6247Je m&#039;inscris &rarr;
6248</button>
6249<div class="control">
6250<input type="hidden"
6251           value=""
6252           name="g-recaptcha-response"
6253    >
6254</div>
6255</div>
6256</div>
6257<template x-if="displayErrorMessage">
6258<p class="flex items-center text-red">
6259<template x-for="errorMessage in errorMessages">
6260<svg class="w-4 sm:w-6 h-4 sm:h-6 mx-1"><use xlink:href="#warning-symbol"></use></svg>
6261<span x-html="errorMessage"></span>
6262</template>
6263</p>
6264</template>
6265<div class="text-white">
6266<p class="my-4 text-2xs text-center leading-tight">
6267<em>Ce formulaire est protégé par reCAPTCHA: vous pouvez consulter la <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">politique de confidentialité</a> et <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">les conditions d&#039;utilisation</a>.</em>
6268</p>
6269</div>
6270</div>
6271</form>
6272
6273<script>
6274        function initNewsletterForm() {
6275            return {
6276                errors: 0,
6277                hasCaptchaToken: 0,
6278                displayErrorMessage: false,
6279                errorMessages: [],
6280                loading: false,
6281
6282                setErrorMessages(messages) {
6283                    this.errorMessages = [messages]
6284                    this.displayErrorMessage = this.errorMessages.length
6285                },
6286                submitForm() {
6287                    this.loading = true;
6288                    // Do not rename $form, the variable is expected to be declared in the child block output
6289                    const $form = document.querySelector('#newsletter-validate-detail');
6290                        if (!this.hasCaptchaToken) {
6291        this.errors = 1;
6292
6293        const lockSubmitButton = () => {
6294            $form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
6295        };
6296
6297        const failCaptcha = (errorMessage, exception = null) => {
6298            this.errors = 1;
6299            lockSubmitButton();
6300
6301            if (this.setErrorMessages) {
6302                this.setErrorMessages([errorMessage]);
6303                this.displayErrorMessage = true;
6304            } else {
6305                window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
6306            }
6307
6308            if (exception) {
6309                console.error(
6310                    exception ||
6311                    'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
6312                );
6313            }
6314        };
6315
6316        const executeGreCaptcha = () => {
6317            grecaptcha.ready(() => {
6318                grecaptcha.execute(
6319                    '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV',
6320                    {action: 'submit'}
6321                ).then((token) => {
6322                    const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
6323
6324                    if (tokenElement && token && token.length > 0) {
6325                        $form['g\u002Drecaptcha\u002Dresponse'].value = token;
6326                        this.errors = 0;
6327                        this.hasCaptchaToken = 1;
6328                        (this.submitForm || $form.submit).call(this);
6329                    } else {
6330                        failCaptcha(
6331                            tokenElement
6332                                ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
6333                                : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
6334                        );
6335                    }
6336                }).catch((exception) => {
6337                    failCaptcha(
6338                        'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
6339                        exception
6340                    );
6341                });
6342            });
6343        };
6344
6345        if (window.grecaptcha) {
6346            executeGreCaptcha();
6347        } else {
6348            const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV";
6349            const script = document.createElement('script');
6350            script.setAttribute('type', 'text/javascript');
6351            script.setAttribute('src', recaptchaUrl);
6352            document.head.appendChild(script);
6353
6354            script.addEventListener("load", executeGreCaptcha, false);
6355        }
6356    }
6357                    if (this.errors === 0) {
6358                        $form.submit();
6359                    }
6360                }
6361            }
6362        }
6363    </script>
6363
6364</div>
6365<h4 class="mt-12 text-white font-bold lg:text-lg text-center">
6366<span data-gp-noloc="node">Le Jardin du Pic-Vert</span>, Jardinerie en ligne depuis 2003
6367</h4>
6368<div class="flex justify-center gap-1 mt-12 font-serif text-white">
6369<a href="/notre-entreprise"
6370       class="hover:underline"
6371    >
6372Qui sommes-nous ?
6373</a>
6374|
6375<a href="/questions-frequentes"
6376       class="hover:underline"
6377    >
6378Questions fréquentes
6379</a>
6380|
6381<a href="/mentions-legales"
6382       class="hover:underline"
6383    >
6384Mentions légales
6385</a>
6386|
6387<a href="/conditions-generales-de-vente"
6388       class="hover:underline"
6389    >
6390CGV
6391</a>
6392</div>
6393<p class="mt-24 text-right text-xs text-white font-bold">
6394© 2009/2025 - Tous droits réservés - <span data-gp-noloc="node">Le Jardin du Pic</span> Vert est une marque déposée
6395</p>
6396<div class="my-8 text-sm text-white font-bold text-center">
6397</div>
6398
6399</div></footer>
6400<script>
6401    let SnapSlider = class {
6402        constructor(el, {
6403            labelSepparator = 'sur',
6404            autoPager,
6405            groupPager,
6406            loop,
6407            forcePager
6408        } = {}) {
6409            this.el = el;
6410            this.track = this.el.querySelector("[data-track]");
6411            if (!this.track) {
6412                console.warn(
6413                    "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track",
6414                    this.el
6415                );
6416                return;
6417            }
6418            this.initialLoad = true;
6419            this.slides = [];
6420            this.inViewObserver;
6421            this.mutationObserver;
6422            this.resizeObserver;
6423            this.pager = this.el.querySelector("[data-pager]");
6424            this.navBtns = Array.from(
6425                this.el.querySelectorAll("[data-next], [data-prev]")
6426            );
6427            this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator;
6428            this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false;
6429            this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false;
6430            this.useLoop = loop || this.el.hasAttribute("data-loop") || false;
6431            this.forcePager = forcePager || this.el.hasAttribute("data-force-pager") || false;
6432            this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
6433            this.sliderId = this.el.id || this.sliderLabel || "slider";
6434            this.markerIdName = "data-target-id";
6435            this.pagerClasses = this.el.dataset.pagerClass || "snap-pager";
6436            this.markerClasses = this.el.dataset.markerClass || "snap-marker";
6437            this.init();
6438        }
6439        init() {
6440            this.setupSlides();
6441            this.setupNav();
6442            if (this.useAutoPager) {
6443                this.createPager();
6444            } else {
6445                this.setupPager();
6446            }
6447            this.setupObservers();
6448            this.setupMutationObserver();
6449            this.setupResizeObserver();
6450            this.el.addEventListener("click", this.eventHandler.bind(this));
6451            this.el.addEventListener("keydown", this.eventHandler.bind(this));
6452            if ("onscrollend" in window) {
6453                this.track.addEventListener("scrollend", () => {
6454                    this.isNavigating = false;
6455                });
6456            } else {
6457                this.track.addEventListener("scroll", () => {
6458                    clearTimeout(this.scrollEndTimer);
6459                    this.scrollEndTimer = setTimeout(() => {
6460                        this.isNavigating = false;
6461                    }, 100);
6462                });
6463            }
6464        }
6465        destroy() {
6466            this.inViewObserver?.disconnect();
6467            this.mutationObserver?.disconnect();
6468            this.resizeObserver?.disconnect();
6469            this.el.removeEventListener("click", this.eventHandler.bind(this));
6470            this.el.removeEventListener("keydown", this.eventHandler.bind(this));
6471        }
6472        roundUpIfGreaterThan(number, min = 8) {
6473            const decimalPart = number - Math.floor(number);
6474            return decimalPart >= min ? Math.ceil(number) : Math.floor(number);
6475        }
6476        getInViewItems() {
6477            const inViewSlides = Array.from(this.track.querySelectorAll("[data-in-view]")).filter((el) => this.slides.includes(el));
6478            const firstInViewSlide = inViewSlides[0] || null;
6479            const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null;
6480            const isAtStart = firstInViewSlide === this.slides[0];
6481            const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1];
6482            return {
6483                inViewSlides,
6484                totalInViewSlides: inViewSlides.length,
6485                firstInViewSlide,
6486                lastInViewSlide,
6487                isAtStart,
6488                isAtEnd,
6489                hasNoOverflow: isAtStart && isAtEnd
6490            };
6491        }
6492        groupPagerMarkers() {
6493            if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return;
6494            const totalVisibleSlides = this.roundUpIfGreaterThan(
6495                this.track.offsetWidth / this.slides[0].offsetWidth
6496            );
6497            const markers = Array.from(this.pager.querySelectorAll("a, button"));
6498            markers.forEach((marker, index) => {
6499                marker.style.display = index % totalVisibleSlides === 0 ? null : "none";
6500            });
6501        }
6502        handleInView(entries) {
6503            entries.forEach((entry) => {
6504                const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector(
6505                    `[${this.markerIdName}="${entry.target.id}"]`
6506                ));
6507                entry.target.toggleAttribute("data-in-view", entry.isIntersecting);
6508                entry.target.toggleAttribute("inert", !entry.isIntersecting);
6509                marker?.setAttribute("aria-current", entry.isIntersecting);
6510                marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1");
6511            });
6512            const { isAtStart, isAtEnd, hasNoOverflow } = this.getInViewItems();
6513            this.navBtns.forEach((btn) => {
6514                if (btn.hasAttribute("data-next")) {
6515                    btn.style.visibility = hasNoOverflow ? "hidden" : null;
6516                    isAtEnd && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
6517                }
6518                if (btn.hasAttribute("data-prev")) {
6519                    btn.style.visibility = hasNoOverflow ? "hidden" : null;
6520                    isAtStart && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
6521                }
6522            });
6523            if (this.pager) {
6524                const hidePager = hasNoOverflow && !this.forcePager;
6525                this.pager.style.visibility = hidePager ? "hidden" : null;
6526                this.pager.toggleAttribute("inert", hidePager);
6527            }
6528            if (!this.initialLoad) {
6529                this.el.dispatchEvent(
6530                    new CustomEvent("slideChange", {
6531                        detail: this.getInViewItems()
6532                    })
6533                );
6534            } else {
6535                this.initialLoad = false;
6536            }
6537            if (document.activeElement.parentElement.hasAttribute("data-pager")) {
6538                const activeItems = this.pager.querySelectorAll('[tabindex="0"]');
6539                if (activeItems.length) {
6540                    activeItems[0].focus({ preventScroll: true });
6541                }
6542            }
6543        }
6544        getSlides() {
6545            if (!this.track) return [];
6546            return Array.from(this.track.children).filter(
6547                (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" && child.style.display !== "none"
6548            );
6549        }
6550        refreshSlides() {
6551            this.initialLoad = true;
6552            this.slides = this.getSlides();
6553            this.setupSlides();
6554            if (this.useAutoPager) {
6555                this.createPager();
6556            } else {
6557                this.setupPager();
6558            }
6559            this.groupPagerMarkers();
6560            this.setupObservers();
6561        }
6562        setupSlides() {
6563            this.slides = this.getSlides();
6564            this.slides.forEach((slide, index) => {
6565                const totalSlides = this.slides.length;
6566                const currentSlide = index + 1;
6567                const existingLabel = slide.getAttribute("aria-label") || "";
6568                const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture";
6569                const slideLabelTag = isImage ? "alt" : "aria-label";
6570                const hasAutoLabel = existingLabel.startsWith(
6571                    `${currentSlide} ${this.slideLabelSepparator} `
6572                );
6573                if (!slide.hasAttribute("id")) {
6574                    slide.setAttribute(
6575                        "id",
6576                        `${this.sliderId}-item-${currentSlide}`
6577                    );
6578                }
6579                if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) {
6580                    slide.setAttribute(
6581                        slideLabelTag,
6582                        `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}`
6583                    );
6584                }
6585                if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) {
6586                    slide.setAttribute("role", "group");
6587                }
6588                if (this.pager && !isImage) {
6589                    slide.setAttribute("role", "tabpanel");
6590                }
6591                if (slide.getAttribute("role") === "group") {
6592                    slide.setAttribute("aria-roledescription", "item");
6593                }
6594            });
6595            if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") {
6596                this.el.setAttribute("role", "region");
6597            }
6598            if (!this.el.hasAttribute("aria-roledescription")) {
6599                this.el.setAttribute("aria-roledescription", "carousel");
6600            }
6601            if (!this.track.hasAttribute("tabindex")) {
6602                this.track.setAttribute("tabindex", 0);
6603            }
6604            this.track.setAttribute("aria-live", "polite");
6605        }
6606        setupNav() {
6607            this.navBtns.forEach((btn) => {
6608                btn.setAttribute("disabled", "");
6609                btn.removeAttribute("hidden");
6610                btn.classList.remove("invisible");
6611                btn.style.visibility = null;
6612            });
6613        }
6614        createPager() {
6615            const newPager = document.createElement("nav");
6616            newPager.setAttribute("data-pager", "");
6617            newPager.setAttribute("role", "tablist");
6618            newPager.classList.add(...this.pagerClasses.split(" "));
6619            this.slides.forEach((slide, index) => {
6620                const marker = document.createElement("button");
6621                const slideId = slide.id || `${this.sliderId}-item-${index + 1}`;
6622                marker.setAttribute(this.markerIdName, slideId);
6623                marker.classList.add(...this.markerClasses.split(" "));
6624                this.setupPagerMarker(marker, index);
6625                newPager.appendChild(marker);
6626                if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") {
6627                    slide.removeAttribute("aria-roledescription");
6628                    slide.setAttribute("role", "tabpanel");
6629                }
6630            });
6631            if (this.pager) {
6632                this.pager.setAttribute("role", "tablist");
6633                this.pager.replaceChildren(...newPager.children);
6634            } else {
6635                this.track.after(newPager);
6636                this.pager = this.el.querySelector("[data-pager]");
6637            }
6638        }
6639        setupPager() {
6640            if (!this.pager) return;
6641            this.pager.setAttribute("role", "tablist");
6642            const items = Array.from(this.pager.querySelectorAll("a, button"));
6643            items.forEach((marker, index) => this.setupPagerMarker(marker, index));
6644        }
6645        setupPagerMarker(marker, index) {
6646            const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
6647            const slideId = markerId || `${this.sliderId}-item-${index + 1}`;
6648            if (!markerId) {
6649                marker.setAttribute(this.markerIdName, slideId);
6650            }
6651            marker.setAttribute("role", "tab");
6652            marker.setAttribute("aria-controls", slideId);
6653            marker.setAttribute("aria-posinset", index + 1);
6654            marker.setAttribute("aria-setsize", this.slides.length);
6655            marker.setAttribute("tabindex", "-1");
6656            if (!marker.hasAttribute("aria-label")) {
6657                marker.setAttribute("aria-label", `Slide ${index + 1}`);
6658            }
6659        }
6660        setupObservers() {
6661            if (this.inViewObserver) {
6662                this.inViewObserver.disconnect();
6663            }
6664            this.inViewObserver = new IntersectionObserver(
6665                this.handleInView.bind(this), {
6666                    root: this.track,
6667                    threshold: 0.8
6668                }
6669            );
6670            this.slides.forEach((slide) => this.inViewObserver.observe(slide));
6671        }
6672        setupMutationObserver() {
6673            this.mutationObserver = new MutationObserver((mutations) => {
6674                if (mutations.some((m) => m.type === "childList" || m.target.parentElement === this.track)) {
6675                    this.refreshSlides();
6676                }
6677            });
6678            this.mutationObserver.observe(this.track, {
6679                childList: true,
6680                subtree: true,
6681                attributeFilter: ["style"]
6682            });
6683        }
6684        setupResizeObserver() {
6685            this.resizeObserver = new ResizeObserver(
6686                this.groupPagerMarkers.bind(this)
6687            );
6688            this.resizeObserver.observe(this.el);
6689        }
6690        goToSlideDir(dir = "next") {
6691            if (this.isNavigating) return;
6692            const { firstInViewSlide, lastInViewSlide } = this.getInViewItems();
6693            const isPrev = dir === "prev";
6694            const referenceSlide = isPrev ? firstInViewSlide : lastInViewSlide;
6695            const currentIndex = this.slides.indexOf(referenceSlide);
6696            let targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1;
6697            if (targetIndex < 0 || targetIndex >= this.slides.length) {
6698                if (!this.useLoop) return;
6699                targetIndex = isPrev ? this.slides.length - 1 : 0;
6700            }
6701            const targetSlide = this.slides[targetIndex];
6702            if (!targetSlide) return;
6703            this.isNavigating = true;
6704            targetSlide.scrollIntoView({
6705                block: "nearest",
6706                inline: isPrev ? "end" : "start"
6707            });
6708        }
6709        pagerToSlide(event) {
6710            if (!event.target.closest("[data-pager]")) return;
6711            const marker = event.target.closest("a, button");
6712            if (!marker) return;
6713            event.preventDefault();
6714            const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
6715            const targetSlide = this.track.querySelector(`#${slideId}`);
6716            targetSlide?.scrollIntoView({ block: "nearest", inline: "start" });
6717        }
6718        eventHandler(event) {
6719            const target = event.target.closest(
6720                "[data-next], [data-prev], [data-pager]"
6721            );
6722            if (!target) return;
6723            if (event.type === "click") {
6724                if (target.hasAttribute("data-next")) {
6725                    this.goToSlideDir("next");
6726                } else if (target.hasAttribute("data-prev")) {
6727                    this.goToSlideDir("prev");
6728                } else if (target.closest("[data-pager]")) {
6729                    this.pagerToSlide(event);
6730                }
6731            }
6732            if (event.type === "keydown" && target.closest("[data-pager]")) {
6733                if (event.key === "ArrowRight" || event.key === "ArrowDown") {
6734                    event.preventDefault();
6735                    this.goToSlideDir("next");
6736                } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
6737                    event.preventDefault();
6738                    this.goToSlideDir("prev");
6739                }
6740            }
6741        }
6742    };
6743
6744    (() => {
6745        function alpineSnapSlider(Alpine) {
6746            Alpine.directive("snap-slider", (el, {
6747                modifiers
6748            }, {
6749                cleanup
6750            }) => {
6751                const slider = new SnapSlider(el, {
6752                    autoPager: modifiers.includes("auto-pager"),
6753                    groupPager: modifiers.includes("group-pager"),
6754                    loop: modifiers.includes("loop"),
6755                    forcePager: modifiers.includes("force-pager")
6756                });
6757                cleanup(() => {
6758                    slider.destroy();
6759                });
6760            });
6761        }
6762
6763        document.addEventListener("alpine:init", () => {
6764            window.Alpine.plugin(alpineSnapSlider);
6765        });
6766    })();
6767    //# sourceURL=alpine-snap-slider.js
6768</script>
vendor: 1 bytes, line 6768
6768
6769<script>
6770    (() => {
6771        'use strict';
6772
6773        if (typeof SnapSlider === 'undefined') {
6774            return;
6775        }
6776
6777        const RESIZE_DEBOUNCE_MS = 150;
6778        const SCROLL_FALLBACK_THROTTLE_MS = 100;
6779
6780        window.AmSnapSlider = class AmSnapSlider extends SnapSlider {
6781            init() {
6782                this.useInfinite = this.el.hasAttribute('data-am-infinity-loop');
6783
6784                super.init();
6785
6786                if (!this.useInfinite || !this.track) {
6787                    return;
6788                }
6789
6790                this._cloneCount = 0;
6791                this._isCloning = false;
6792                this._isJumping = false;
6793                this._onInfiniteScrollEnd = this._onInfiniteScrollEnd.bind(this);
6794
6795                this._setupInfiniteLoop();
6796                this._bindInfiniteScrollEnd();
6797            }
6798
6799            getSlides() {
6800                const slides = super.getSlides();
6801
6802                if (!this.useInfinite) {
6803                    return slides;
6804                }
6805
6806                return slides.filter((child) => !child.hasAttribute('data-clone'));
6807            }
6808
6809            refreshSlides() {
6810                if (!this.useInfinite) {
6811                    return super.refreshSlides();
6812                }
6813
6814                if (this._isCloning) {
6815                    return;
6816                }
6817
6818                this._removeClones();
6819                super.refreshSlides();
6820                this._setupInfiniteLoop();
6821            }
6822
6823            setupResizeObserver() {
6824                this.resizeObserver = new ResizeObserver(() => {
6825                    requestAnimationFrame(() => {
6826                        if (this._isCloning || this._isJumping) {
6827                            return;
6828                        }
6829
6830                        this.groupPagerMarkers();
6831
6832                        if (!this.useInfinite) {
6833                            return;
6834                        }
6835
6836                        clearTimeout(this._resizeInfiniteTimer);
6837                        this._resizeInfiniteTimer = setTimeout(() => {
6838                            this._setupInfiniteLoop();
6839                        }, RESIZE_DEBOUNCE_MS);
6840                    });
6841                });
6842                this.resizeObserver.observe(this.el);
6843            }
6844
6845            goToSlideDir(dir = 'next') {
6846                if (!this.useInfinite || !this._cloneCount) {
6847                    return super.goToSlideDir(dir);
6848                }
6849
6850                if (this.isNavigating || this._isJumping) {
6851                    return;
6852                }
6853
6854                const allSlides = this._getAllTrackSlides();
6855
6856                if (!allSlides.length) {
6857                    return;
6858                }
6859
6860                // Same page-step as SnapSlider: next from last in-view, prev from first.
6861                const inViewSlides = this._getVisibleTrackSlides(allSlides);
6862                const isPrev = dir === 'prev';
6863                const referenceSlide = isPrev
6864                    ? inViewSlides[0]
6865                    : inViewSlides[inViewSlides.length - 1];
6866                const currentIndex = allSlides.indexOf(referenceSlide);
6867
6868                if (currentIndex < 0) {
6869                    return;
6870                }
6871
6872                const targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1;
6873
6874                if (targetIndex < 0 || targetIndex >= allSlides.length) {
6875                    return;
6876                }
6877
6878                const targetSlide = allSlides[targetIndex];
6879
6880                if (!targetSlide) {
6881                    return;
6882                }
6883
6884                this.isNavigating = true;
6885                targetSlide.scrollIntoView({
6886                    block: 'nearest',
6887                    inline: isPrev ? 'end' : 'start'
6888                });
6889            }
6890
6891            handleInView(entries) {
6892                this.focusOnActivePageMarker();
6893
6894                if (!this.useInfinite) {
6895                    const focusedNavBtn = this.navBtns.includes(document.activeElement)
6896                        ? document.activeElement
6897                        : null;
6898
6899                    super.handleInView(entries);
6900
6901                    if (focusedNavBtn?.disabled) {
6902                        this.navBtns.find((btn) =>
6902 !btn.disabled)?.focus({ preventScroll: true });;
6903                    }
6904
6905                    return;
6906                }
6907
6908                const realEntries = [];
6909
6910                entries.forEach((entry) => {
6911                    if (entry.target.hasAttribute('data-clone')) {
6912                        entry.target.toggleAttribute('data-in-view', entry.isIntersecting);
6913                        entry.target.setAttribute('inert', '');
6914                        entry.target.setAttribute('aria-hidden', 'true');
6915                        return;
6916                    }
6917
6918                    realEntries.push(entry);
6919                });
6920
6921                if (realEntries.length) {
6922                    super.handleInView(realEntries);
6923                }
6924
6925                this.navBtns.forEach((btn) => {
6926                    btn.removeAttribute('disabled');
6927                    btn.style.visibility = null;
6928                });
6929            }
6930
6931            focusOnActivePageMarker() {
6932                if (!this.useGroupPager || !this.pager || !this.slides.length) {
6933                    return;
6934                }
6935
6936                const totalVisibleSlides = this.roundUpIfGreaterThan(
6937                    this.track.offsetWidth / this.slides[0].offsetWidth
6938                );
6939                const markers = Array.from(this.pager.querySelectorAll('a, button'));
6940                const { lastInViewSlide } = this.getInViewItems();
6941                const activeIndex = lastInViewSlide ? this.slides.indexOf(lastInViewSlide) : -1;
6942                const activeGroupLeaderIndex = activeIndex >= 0
6943                    ? activeIndex - (activeIndex % totalVisibleSlides)
6944                    : -1;
6945
6946                let currentMarker = null;
6947
6948                markers.forEach((marker, index) => {
6949                    const isGroupLeader = index % totalVisibleSlides === 0;
6950
6951                    if (!isGroupLeader) {
6952                        marker.setAttribute('aria-current', 'false');
6953                        marker.setAttribute('tabindex', '-1');
6954                        return;
6955                    }
6956
6957                    const isCurrent = index === activeGroupLeaderIndex;
6958
6959                    marker.setAttribute('aria-current', String(isCurrent));
6960                    marker.setAttribute('tabindex', isCurrent ? '0' : '-1');
6961
6962                    if (isCurrent) {
6963                        currentMarker = marker;
6964                    }
6965                });
6966
6967                if (currentMarker && this.pager.contains(document.activeElement)
6968                    && document.activeElement !== currentMarker
6969                ) {
6970                    currentMarker.focus({ preventScroll: true });
6971                }
6972            }
6973
6974            destroy() {
6975                if (this.useInfinite) {
6976                    this._unbindInfiniteScrollEnd();
6977                    clearTimeout(this._resizeInfiniteTimer);
6978                    clearTimeout(this._infiniteScrollTimer);
6979                    this._removeClones();
6980                }
6981
6982                super.destroy();
6983            }
6984
6985            _getAllTrackSlides() {
6986                return this.track ? super.getSlides() : [];
6987            }
6988
6989            _getClosestSlideIndex(slides) {
6990                const trackLeft = this.track.getBoundingClientRect().left;
6991                let closest = 0;
6992                let minDist = Infinity;
6993
6994                slides.forEach((slide, index) => {
6995                    const dist = Math.abs(slide.getBoundingClientRect().left - trackLeft);
6996                    if (dist < minDist) {
6997                        minDist = dist;
6998                        closest = index;
6999                    }
7000                });
7001
7002                return closest;
7003            }
7004
7005            _getVisibleTrackSlides(slides) {
7006                const marked = slides.filter((slide) => slide.hasAttribute('data-in-view'));
7007                if (marked.length) {
7008                    return marked;
7009                }
7010
7011                const trackRect = this.track.getBoundingClientRect();
7012                const threshold = 0.8;
7013
7014                return slides.filter((slide) => {
7015                    const rect = slide.getBoundingClientRect();
7016                    const visibleWidth = Math.min(rect.right, trackRect.right)
7017                        - Math.max(rect.left, trackRect.left);
7018
7019                    if (visibleWidth <= 0) {
7020                        return false;
7021                    }
7022
7023                    return (visibleWidth / Math.max(rect.width, 1)) >= threshold;
7024                });
7025            }
7026
7027            _getSlideScrollLeft(slide) {
7028                const trackRect = this.track.getBoundingClientRect();
7029                const slideRect = slide.getBoundingClientRect();
7030
7031                return this.track.scrollLeft + (slideRect.left - trackRect.left);
7032            }
7033
7034            _createClone(slide, position, index) {
7035                const clone = slide.cloneNode(true);
7036                const baseId = slide.id || `${this.sliderId}-item-${index + 1}`;
7037
7038                clone.setAttribute('data-clone', position);
7039                clone.setAttribute('data-clone-of', baseId);
7040                clone.setAttribute('aria-hidden', 'true');
7041                clone.setAttribute('inert', '');
7042                clone.setAttribute('x-ignore', '');
7043                clone.id = `${baseId}-clone-${position}-${index}`;
7044                clone.removeAttribute('data-in-view');
7045
7046                clone.querySelectorAll('[id]').forEach((el) => {
7047                    if (el !== clone) {
7048                        el.removeAttribute('id');
7049                    }
7050                });
7051                clone.querySelectorAll('[name]').forEach((el) => {
7052                    el.removeAttribute('name');
7053                });
7054
7055                return clone;
7056            }
7057
7058            _removeClones() {
7059                if (!this.track) {
7060                    return;
7061                }
7062
7063                this.track.querySelectorAll('[data-clone]').forEach((clone) => {
7064                    clone.remove();
7065                });
7066                this._cloneCount = 0;
7067            }
7068
7069            _silentScrollTo(slide) {
7070                if (!slide || !this.track) {
7071                    return;
7072                }
7073
7074                this._isJumping = true;
7075
7076                const track = this.track;
7077                const prevBehavior = track.style.scrollBehavior;
7078                const prevSnap = track.style.scrollSnapType;
7079
7080                track.style.scrollBehavior = 'auto';
7081                track.style.scrollSnapType = 'none';
7082                track.scrollLeft = this._getSlideScrollLeft(slide);
7083
7084                requestAnimationFrame(() => {
7085                    track.style.scrollBehavior = prevBehavior;
7086                    track.style.scrollSnapType = prevSnap;
7087                    this._isJumping = false;
7088                    this.isNavigating = false;
7089                });
7090            }
7091
7092            _canUseInfinite(realSlides) {
7093                if (!realSlides.length || realSlides.length < 2) {
7094                    return false;
7095                }
7096
7097                return this.track.scrollWidth > this.track.clientWidth + 1;
7098            }
7099
7100            _setupInfiniteLoop() {
7101                if (!this.useInfinite || !this.track || this._isCloning) {
7102                    return;
7103                }
7104
7105                this._isCloning = true;
7106                this.mutationObserver?.disconnect();
7107
7108                let restoreIndex = 0;
7109                const { firstInViewSlide } = this.getInViewItems();
7110                const currentIndex = this.slides.indexOf(firstInViewSlide);
7111
7112                if (currentIndex >= 0) {
7113                    restoreIndex = currentIndex;
7114                }
7115
7116                this._removeClones();
7117
7118                const realSlides = this.getSlides();
7119
7120                this.slides = realSlides;
7121
7122                if (!this._canUseInfinite(realSlides)) {
7123                    this._cloneCount = 0;
7124                    this._isCloning = false;
7125                    this._reobserveMutations();
7126                    this.setupObservers();
7127
7128                    return;
7129                }
7130
7131                const slideWidth = realSlides[0].offsetWidth || 1;
7132                const visibleCount = Math.max(
7133                    1,
7134                    this.roundUpIfGreaterThan(this.track.offsetWidth / slideWidth)
7135                );
7136
7137                this._cloneCount = Math.min(visibleCount, realSlides.length);
7138
7139                const prependFragment = document.createDocumentFragment();
7140
7141                for (let i = realSlides.length - this._cloneCount; i < realSlides.length; i++) {
7142                    prependFragment.appendChild(
7143                        this._createClone(realSlides[i], 'pre', i)
7144                    );
7145                }
7146                this.track.insertBefore(prependFragment, this.track.firstChild);
7147
7148                const appendFragment = document.createDocumentFragment();
7149                for (let i = 0; i < this._cloneCount; i++) {
7150                    appendFragment.appendChild(
7151                        this._createClone(realSlides[i], 'post', i)
7152                    );
7153                }
7154                this.track.appendChild(appendFragment);
7155
7156                this.slides = this.getSlides();
7157                this.setupObservers();
7158
7159                this._getAllTrackSlides().forEach((slide) => {
7160                    if (slide.hasAttribute('data-clone')) {
7161                        this.inViewObserver.observe(slide);
7162                    }
7163                });
7164
7165                const target = this.slides[restoreIndex] || this.slides[0];
7166                requestAnimationFrame(() => {
7167                    this._silentScrollTo(target);
7168                    this._isCloning = false;
7169                    this._reobserveMutations();
7170                });
7171            }
7172
7173            _reobserveMutations() {
7174                if (!this.mutationObserver || !this.track) {
7175                    return;
7176                }
7177
7178                // Same as base SnapSlider. Watching `style` re-enters refreshSlides
7179                // when _silentScrollTo toggles scrollBehavior / scrollSnapType.
7180                this.mutationObserver.observe(this.track, {
7181                    childList: true,
7182                    subtree: false
7183                });
7184            }
7185
7186            _bindInfiniteScrollEnd() {
7187                if (!this.track) {
7188                    return;
7189                }
7190
7191                if ('onscrollend' in window) {
7192                    this.track.addEventListener('scrollend', this._onInfiniteScrollEnd);
7193                    return;
7194                }
7195
7196                this._onInfiniteScrollFallback = () => {
7197                    clearTimeout(this._infiniteScrollTimer);
7198                    this._infiniteScrollTimer = setTimeout(() => {
7199                        this._onInfiniteScrollEnd();
7200                    }, SCROLL_FALLBACK_THROTTLE_MS);
7201                };
7202                this.track.addEventListener('scroll', this._onInfiniteScrollFallback);
7203            }
7204
7205            _unbindInfiniteScrollEnd() {
7206                if (!this.track) {
7207                    return;
7208                }
7209
7210                this.track.removeEventListener('scrollend', this._onInfiniteScrollEnd);
7211                if (this._onInfiniteScrollFallback) {
7212                    this.track.removeEventListener('scroll', this._onInfiniteScrollFallback);
7213                }
7214            }
7215
7216            _onInfiniteScrollEnd() {
7217                if (this._isJumping || this._isCloning || this._isSimulateDragging) {
7218                    return;
7219                }
7220
7221                if (!this.useInfinite || !this._cloneCount) {
7222                    this.isNavigating = false;
7223
7224                    return;
7225                }
7226
7227                const allSlides = this._getAllTrackSlides();
7228                const realCount = this.slides.length;
7229
7230                if (!realCount || allSlides.length < realCount + this._cloneCount) {
7231                    this.isNavigating = false;
7232
7233                    return;
7234                }
7235
7236                const currentIndex = this._getClosestSlideIndex(allSlides);
7237
7238                if (currentIndex < this._cloneCount) {
7239                    this._silentScrollTo(allSlides[currentIndex + realCount]);
7240
7241                    return;
7242                }
7243
7244                if (currentIndex >= this._cloneCount + realCount) {
7245                    this._silentScrollTo(allSlides[currentIndex - realCount]);
7246
7247                    return;
7248                }
7249
7250                this.isNavigating = false;
7251            }
7252        };
7253
7254        function alpineAmSnapSlider(Alpine) {
7255            Alpine.directive('am-snap-slider', (el, { modifiers }, { cleanup }) => {
7256                const slider = new window.AmSnapSlider(el, {
7257                    autoPager: modifiers.includes('auto-pager'),
7258                    groupPager: modifiers.includes('group-pager')
7259                });
7260                cleanup(() => {
7261                    slider.destroy();
7262                });
7263            });
7264        }
7265
7266        document.addEventListener('alpine:init', () => {
7267            window.Alpine.plugin(alpineAmSnapSlider);
7268        });
7269    })();
7270</script>
vendor: 1 bytes, line 7270
7270
7271<script>
7272    (() => {
7273        'use strict';
7274
7275        if (typeof window.AmSnapSlider === 'undefined') {
7276            return;
7277        }
7278
7279        // Ignore tiny jitter so a plain click on an item still opens the link.
7280        const DRAG_THRESHOLD_PX = 8;
7281
7282        // Listeners that only exist while an actual drag is in progress.
7283        const DOC_DRAG_EVENTS = ['pointermove', 'pointerup', 'pointercancel'];
7284
7285        const AmSnapSliderBase = window.AmSnapSlider;
7286
7287        window.AmSnapSlider = class AmSnapSlider extends AmSnapSliderBase {
7288            init() {
7289                this.useSimulateTouch = this.el.hasAttribute('data-am-simulate-touch');
7290
7291                super.init();
7292
7293                if (!this.useSimulateTouch || !this.track) {
7294                    return;
7295                }
7296
7297                this._dragTracking = false;
7298                this._dragMoved = false;
7299                this._isSimulateDragging = false;
7300                this._dragStartX = 0;
7301                this._dragScrollLeft = 0;
7302                this._dragPointerId = null;
7303                this._suppressClick = false;
7304
7305                this._onSimulatePointerDown = this._onSimulatePointerDown.bind(this);
7306                this._onSimulatePointerMove = this._onSimulatePointerMove.bind(this);
7307                this._onSimulatePointerUp = this._onSimulatePointerUp.bind(this);
7308                this._onSimulateClickCapture = this._onSimulateClickCapture.bind(this);
7309                this._onSimulateDragStart = this._onSimulateDragStart.bind(this);
7310
7311                this._bindSimulateTouch();
7312            }
7313
7314            destroy() {
7315                if (this.useSimulateTouch) {
7316                    this._unbindSimulateTouch();
7317                }
7318
7319                super.destroy();
7320            }
7321
7322            _bindSimulateTouch() {
7323                if (!this.track) {
7324                    return;
7325                }
7326
7327                this.track.classList.add('am-snap-simulate-touch');
7328                this.track.addEventListener('pointerdown', this._onSimulatePointerDown);
7329                this.track.addEventListener('dragstart', this._onSimulateDragStart, true);
7330                this.track.addEventListener('click', this._onSimulateClickCapture, true);
7331            }
7332
7333            _unbindSimulateTouch() {
7334                if (!this.track) {
7335                    return;
7336                }
7337
7338                this._endSimulateDrag();
7339                this.track.classList.remove('am-snap-simulate-touch', 'is-dragging');
7340                this.track.removeEventListener('pointerdown', this._onSimulatePointerDown);
7341                this.track.removeEventListener('dragstart', this._onSimulateDragStart, true);
7342                this.track.removeEventListener('click', this._onSimulateClickCapture, true);
7343            }
7344
7345            _onSimulateDragStart(event) {
7346                event.preventDefault();
7347            }
7348
7349            _onSimulatePointerDown(event) {
7350                if (event.pointerType !== 'mouse' || event.button !== 0) {
7351                    return;
7352                }
7353
7354                if (this._isJumping || this._isCloning || !this.track) {
7355                    return;
7356                }
7357
7358                this._dragTracking = true;
7359                this._dragMoved = false;
7360                this._suppressClick = false;
7361                this._dragStartX = event.clientX;
7362                this._dragScrollLeft = this.track.scrollLeft;
7363                this._dragPointerId = event.pointerId;
7364
7365                DOC_DRAG_EVENTS.forEach((name) => {
7366                    const handler = name === 'pointermove'
7367                        ? this._onSimulatePointerMove
7368                        : this._onSimulatePointerUp;
7369                    document.addEventListener(name, handler);
7370                });
7371            }
7372
7373            _onSimulatePointerMove(event) {
7374                if (!this._dragTracking || event.pointerId !== this._dragPointerId || !this.track) {
7375                    return;
7376                }
7377
7378                const deltaX = event.clientX - this._dragStartX;
7379
7380                if (!this._dragMoved) {
7381                    if (Math.abs(deltaX) < DRAG_THRESHOLD_PX) {
7382                        return;
7383                    }
7384
7385                    this._dragMoved = true;
7386                    this._isSimulateDragging = true;
7387                    this._suppressClick = true;
7388                    this.track.style.scrollSnapType = 'none';
7389                    this.track.style.scrollBehavior = 'auto';
7390                    this.track.classList.add('is-dragging');
7391
7392                    try {
7393                        this.track.setPointerCapture(event.pointerId);
7394                    } catch (e) {
7395                        // Ignore capture errors on unsupported targets.
7396                    }
7397                }
7398
7399                event.preventDefault();
7400                this.track.scrollLeft = this._dragScrollLeft - deltaX;
7401            }
7402
7403            _onSimulatePointerUp(event) {
7404                if (!this._dragTracking || event.pointerId !== this._dragPointerId) {
7405                    return;
7406                }
7407
7408                this._endSimulateDrag();
7409            }
7410
7411            /**
7412             * Instantly align to the closest slide without CSS smooth scrolling.
7413             * Restoring snap+smooth from a mid-snap offset is what causes desktop jerk.
7414             */
7415            _snapToNearestAfterDrag() {
7416                if (!this.track) {
7417                    return;
7418                }
7419
7420                const slides = typeof this._getAllTrackSlides === 'function'
7421                    ? this._getAllTrackSlides()
7422                    : Array.from(this.track.children);
7423
7424                if (!slides.length) {
7425                    return;
7426                }
7427
7428                if (typeof this._getClosestSlideIndex === 'function'
7429                    && typeof this._getSlideScrollLeft === 'function'
7430                ) {
7431                    const slide = slides[this._getClosestSlideIndex(slides)];
7432
7433                    if (slide) {
7434                        this.track.scrollLeft = this._getSlideScrollLeft(slide);
7435                    }
7436
7437                    return;
7438                }
7439
7440                const trackLeft = this.track.getBoundingClientRect().left;
7441                let closest = null;
7442                let minDist = Infinity;
7443
7444                for (const slide of slides) {
7445                    const dist = Math.abs(slide.getBoundingClientRect().left - trackLeft);
7446                    if (dist < minDist) {
7447                        minDist = dist;
7448                        closest = slide;
7449                    }
7450                }
7451
7452                if (closest) {
7453                    this.track.scrollLeft += closest.getBoundingClientRect().left - trackLeft;
7454                }
7455            }
7456
7457            _endSimulateDrag() {
7458                DOC_DRAG_EVENTS.forEach((name) => {
7459                    const handler = name === 'pointermove'
7460                        ? this._onSimulatePointerMove
7461                        : this._onSimulatePointerUp;
7462                    document.removeEventListener(name, handler);
7463                });
7464
7465                if (!this.track) {
7466                    this._dragTracking = false;
7467                    this._dragMoved = false;
7468                    this._isSimulateDragging = false;
7469                    this._dragPointerId = null;
7470
7471                    return;
7472                }
7473
7474                if (this._dragPointerId !== null) {
7475                    try {
7476                        if (this.track.hasPointerCapture?.(this._dragPointerId)) {
7477                            this.track.releasePointerCapture(this._dragPointerId);
7478                        }
7479                    } catch (e) {
7480                        // Ignore release errors.
7481                    }
7482                }
7483
7484                if (this._dragMoved) {
7485                    // Keep snap off and behavior auto: settle instantly, then re-enable.
7486                    this.track.style.scrollSnapType = 'none';
7487                    this.track.style.scrollBehavior = 'auto';
7488                    this._snapToNearestAfterDrag();
7489
7490                    // Allow infinite correction now that the gesture ended.
7491                    this._isSimulateDragging = false;
7492                    this._onInfiniteScrollEnd?.();
7493
7494                    // Two frames: 1) drop snap-none + dragging class, 2) restore scroll-behavior.
7495                    requestAnimationFrame(() => {
7496                        if (!this.track) {
7497                            return;
7498                        }
7499                        this.track.style.scrollSnapType = '';
7500                        this.track.classList.remove('is-dragging');
7501
7502                        requestAnimationFrame(() => {
7503                            if (this.track) {
7504                                this.track.style.scrollBehavior = '';
7505                            }
7506                        });
7507                    });
7508                } else {
7509                    this._isSimulateDragging = false;
7510                }
7511
7512                this._dragTracking = false;
7513                this._dragMoved = false;
7514                this._dragPointerId = null;
7515
7516                if (this._suppressClick) {
7517                    requestAnimationFrame(() => {
7518                        this._suppressClick = false;
7519                    });
7520                }
7521            }
7522
7523            _onSimulateClickCapture(event) {
7524                if (!this._suppressClick) {
7525                    return;
7526                }
7527
7528                event.preventDefault();
7529                event.stopPropagation();
7530                this._suppressClick = false;
7531            }
7532        };
7533    })();
7534</script>
vendor: 1 bytes, line 7534
7534
7535<script>
7536    (() => {
7537        // src/dialog.js
7538        function dialog_default(Alpine) {
7539            Alpine.directive("htmldialog", fylgjaAlpineDialog);
7540            function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) {
7541            const evaluate = expression.length ? evaluateLater(expression) : () => {};
7542            const lockPageScroll = modifiers.includes("noscroll");
7543            const isModeless = modifiers.includes("modeless");
7544            const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest");
7545            el.style.display = null;
7546            el.style.length === 0 && el.removeAttribute("style");
7547            if (el._x_isShown) {
7548                open();
7549            }
7550            const closeBySupported = (() => {
7551                return "closedBy" in HTMLDialogElement.prototype;
7552            })();
7553            function scrollLock(use = true) {
7554                document.body.style.overflow = use ? "hidden" : "";
7555            }
7556            function dialogSubmit(event) {
7557                if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") {
7558                event.preventDefault();
7559                evaluate();
7560                }
7561            }
7562            function escapeDialog(event) {
7563                if (event.key !== "Escape") return;
7564                event.preventDefault();
7565                if (closeBy === "none") return;
7566                evaluate();
7567            }
7568            function handleCloseByEvent(event) {
7569                if (event.target !== el) return;
7570                const rect = el.getBoundingClientRect();
7571                const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width;
7572                if (!isInDialog) {
7573                if (closeBy === "any") {
7574                    if (closeBySupported) {
7575                    event.preventDefault();
7576                    }
7577                    evaluate();
7578                }
7579                }
7580            }
7581            function handleCloseEvent() {
7582                evaluate();
7583            }
7584            function open() {
7585                if (el.hasAttribute("open")) return;
7586                isModeless ? el.show() : el.showModal();
7587                scrollLock(lockPageScroll);
7588            }
7589            function close() {
7590                if (!el.hasAttribute("open")) return;
7591                el.close();
7592                scrollLock(false);
7593            }
7594            el._x_doShow = () => open();
7595            el._x_doHide = () => close();
7596            el.addEventListener("keydown", escapeDialog);
7597            el.addEventListener("submit", dialogSubmit);
7598            el.addEventListener("click", handleCloseByEvent);
7599            el.addEventListener("cancel", handleCloseEvent);
7600            cleanup(() => {
7601                el.removeEventListener("keydown", escapeDialog);
7602                el.removeEventListener("submit", dialogSubmit);
7603                el.removeEventListener("click", handleCloseByEvent);
7604                el.removeEventListener("cancel", handleCloseEvent);
7605                scrollLock(false);
7606            });
7607            }
7608        }
7609        function modifierValue(modifiers, key, fallback) {
7610            if (modifiers.indexOf(key) === -1) return fallback;
7611            const rawValue = modifiers[modifiers.indexOf(key) + 1];
7612            if (!rawValue) return fallback;
7613            if (key === "closeby") {
7614            const allowedValues = ["auto", "none", "closerequest", "any"];
7615            const options = allowedValues.join(", ");
7616            if (!allowedValues.includes(rawValue)) {
7617                console.warn(
7618                `"${rawValue}" is not one of the allowed values for closeby: ${options}`
7619                );
7620                return fallback;
7621            }
7622            }
7623            return rawValue;
7624        }
7625
7626        // src/cdn.js
7627        document.addEventListener("alpine:init", () => {
7628            window.Alpine.plugin(dialog_default);
7629        });
7630    })();
7631    //# sourceURL=alpine-htmldialog.js
7632</script>
vendor: 1 bytes, line 7632
7632
7633<script>
7634    (() => {
7635        function src_default(Alpine) {
7636            Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {
7637                let evaluate = evaluateLater(expression);
7638                let options = {
7639                    rootMargin: getRootMargin(modifiers),
7640                    threshold: getThreshold(modifiers)
7641                };
7642                let observer = new IntersectionObserver((entries) => {
7643                    entries.forEach((entry) => {
7644                        if (entry.isIntersecting === (value === "leave"))
7645                            return;
7646                        evaluate();
7647                        modifiers.includes("once") && observer.disconnect();
7648                    });
7649                }, options);
7650                observer.observe(el);
7651                cleanup(() => {
7652                    observer.disconnect();
7653                });
7654            }));
7655        }
7656        function getThreshold(modifiers) {
7657            if (modifiers.includes("full"))
7658                return 0.99;
7659            if (modifiers.includes("half"))
7660                return 0.5;
7661            if (!modifiers.includes("threshold"))
7662                return 0;
7663            let threshold = modifiers[modifiers.indexOf("threshold") + 1];
7664            if (threshold === "100")
7665                return 1;
7666            if (threshold === "0")
7667                return 0;
7668            return Number(`.${threshold}`);
7669        }
7670        function getLengthValue(rawValue) {
7671            let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/);
7672            return match ? match[1] + (match[2] || "px") : void 0;
7673        }
7674        function getRootMargin(modifiers) {
7675            const key = "margin";
7676            const fallback = "0px 0px 0px 0px";
7677            const index = modifiers.indexOf(key);
7678            if (index === -1)
7679                return fallback;
7680            let values = [];
7681            for (let i = 1; i < 5; i++) {
7682                values.push(getLengthValue(modifiers[index + i] || ""));
7683            }
7684            values = values.filter((v) => v !== void 0);
7685            return values.length ? values.join(" ").trim() : fallback;
7686        }
7687
7688        document.addEventListener("alpine:init", () => {
7689            window.Alpine.plugin(src_default);
7690        });
7691    })();
7692    //# sourceURL=alpine-intersect.js
7693</script>
7693
7694
7695<script>
7696    (() => {
7697        const hasAlpine = new Promise(resolve => {
7698            window.addEventListener('alpine:initialized', resolve, {once: true, passive: true});
7699        });
7700
7701        const hasInteract = new Promise(resolve => {
7702            (events => {
7703                const onInteract = () => {
7704                    resolve();
7705                    events.forEach(type => window.removeEventListener(type, onInteract));
7706                }
7707                events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true}))
7708            })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown'])
7709        });
7710
7711        const onIntersect = (el) => {
7712            return new Promise(resolve => {
7713                const observer = new IntersectionObserver(entries => {
7714                    for (const entry of entries) {
7715                        if (entry.isIntersecting) {
7716                            observer.disconnect()
7717                            resolve();
7718                        }
7719                    }
7720                }, {});
7721                observer.observe(el);
7722            });
7723        }
7724
7725        function runComponent(el) {
7726            hasAlpine.then(() => {
7727                el.removeAttribute('x-ignore');
7728                queueMicrotask(() => Alpine.initTree(el));
7729            });
7730        }
7731
7732        function initDeferredComponents() {
7733            document.querySelectorAll('[x-data][x-defer]').forEach(el => {
7734                el.setAttribute('x-ignore', '');
7735                const deferUntil = (el.getAttribute('x-defer') || '').trim();
7736                switch (deferUntil) {
7737                    case 'interact':
7738                        hasInteract.then(() => runComponent(el));
7739                        break;
7740                    case 'intersect':
7741                        onIntersect(el).then(() => runComponent(el))
7742                        break;
7743                    case 'idle':
7744                        window.requestIdleCallback
7745                            ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000})
7746                            : setTimeout(() => runComponent(el), 4000);
7747                        break;
7748                    case 'eager':
7749                        runComponent(el);
7750                        break;
7751                    default:
7752                        if (deferUntil.startsWith('event:') && deferUntil.length > 6) {
7753                            window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true});
7754                        }
7755                }
7756            });
7757        }
7758
7759        window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true});
7760    })();
7761    //# sourceURL=alpine-defer.js
7762</script>
7762
7763
7764
7765<script type="module"
7766        src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Hyva_Theme/js/alpine3.min.js"
7767        defer
7768        crossorigin
7769></script>
vendor: 1 bytes, line 7769
7769
7770<script>
7771    function dispatchMessages(messages, hideAfter) {
7772        const messagesEvent = new CustomEvent("messages-loaded", {
7773            detail: {
7774                messages: messages,
7775                hideAfter: hideAfter
7776            }
7777        });
7778        window.dispatchEvent(messagesEvent);
7779    }
7780
7781        if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
7782        console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
7783    }
7784
7785    (function( hyva, undefined ) {
7786
7787        hyva.initFormKey = () => {
7788            if (typeof hyva.getFormKey !== 'function') return;
7789
7790            const formKey = hyva.getFormKey();
7791            if (!formKey) return;
7792
7793            document.querySelectorAll('input[name="form_key"]').forEach((input) => {
7794                input.value = formKey;
7795            });
7796        }
7797
7798        hyva.initMessages = () => {
7799            try {
7800                const messages = hyva.getCookie('mage-messages');
7801                window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : [];
7802
7803                dispatchMessages(window.mageMessages);
7804
7805                                // empty `mage-messages` cookie
7806                const skipSetDomain = true;
7807                hyva.setCookie('mage-messages','', -1, skipSetDomain);
7808
7809            } catch (error) {
7810                console.warn('Error parsing Cookie Messages:', error);
7811            }
7812        }
7813
7814        window.addEventListener('DOMContentLoaded', hyva.initFormKey);
7815
7816        window.addEventListener('pageshow', (event) => {
7817            if (event.persisted) {
7818                hyva.initFormKey();
7819            }
7820        });
7821
7822        hyva.alpineInitialized(hyva.initMessages)
7823    }( window.hyva = window.hyva || {} ));
7824    //# sourceURL=hyva-cookies.js
7825</script>
vendor: 1 bytes, line 7825
7825
7826<script>
7827    (() => {
7828        const private_content_key = 'mage-cache-storage';
7829        const private_content_expire_key = 'mage-cache-timeout';
7830        const private_content_version_key = 'private_content_version';
7831        const section_data_ids_key = 'section_data_ids';
7832        const mage_cache_session_id_key = 'mage-cache-sessid';
7833        const last_visited_store_key = 'last_visited_store';
7834
7835        const ttl = 86400;
7836
7837                if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
7838            console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
7839        }
7840
7841        function loadSectionData () {
7842            const browserStorage = hyva.getBrowserStorage();
7843            if (!browserStorage) {
7844                typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
7845                    [{
7846                        type: "warning",
7847                        text: "Please enable LocalStorage in your browser."
7848                    }]
7849                );
7850                return;
7851            }
7852            try {
7853                let isInvalid = false;
7854
7855                                if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) {
7856                    isInvalid = true;
7857                }
7858                hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false);
7859
7860                                if (!hyva.getCookie(mage_cache_session_id_key)) {
7861                    isInvalid = true;
7862                    browserStorage.removeItem(private_content_key);
7863                    const skipSetDomain = true;
7864                    const days = false;
7865                    hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain)
7866                }
7867
7868                const cookieVersion = hyva.getCookie(private_content_version_key);
7869                const storageVersion = browserStorage.getItem(private_content_version_key);
7870
7871                if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) {
7872                    isInvalid = true;
7873                }
7874
7875                const privateContentExpires = browserStorage.getItem(private_content_expire_key);
7876                if (privateContentExpires && new Date(privateContentExpires) < new Date()) {
7877                    browserStorage.removeItem(private_content_key);
7878                }
7879
7880                if (isInvalid && cookieVersion) {
7881                    fetchPrivateContent([]);
7882                } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) {
7883                    const privateContent = JSON.parse(browserStorage.getItem(private_content_key));
7884                    if (
7885                        privateContent &&
7886                        privateContentExpires &&
7887                        privateContent.cart &&
7888                        privateContent.customer
7889                    ) {
7890                        dispatchPrivateContent(privateContent);
7891                    } else {
7892                        fetchPrivateContent([]);
7893                    }
7894                } else {
7895                    if (document.getElementById('default-section-data')) {
7896                        const privateContent = JSON.parse(document.getElementById('default-section-data').textContent.trim());
7897                        dispatchPrivateContent(privateContent);
7898                    } else {
7899                        dispatchPrivateContent({});
7900                    }
7901                }
7902
7903            } catch (error) {
7904                console.warn('Error retrieving Private Content:', error);
7905            }
7906        }
7907
7908        hyva.alpineInitialized(loadSectionData)
7909        window.addEventListener('reload-customer-section-data', loadSectionData);
7910
7911                window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data);
7912
7913        function dispatchPrivateContent(data) {
7914
7915            const privateContentEvent = new CustomEvent("private-content-loaded", {
7916                detail: {
7917                    data: window.processSectionDataBeforeDispatch(data)
7918                }
7919            });
7920            window.dispatchEvent(privateContentEvent);
7921        }
7922
7923                function fetchPrivateContent(sections) {
7924            fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, {
7925                method: 'GET',
7926                headers: {
7927                    'Content-Type': 'application/json',
7928                    'X-Requested-With': 'XMLHttpRequest'
7929                }
7930            })
7931                .then(response => response.ok && response.json())
7932                .then(
7933                    data => {
7934                        if (data) {
7935                            try {
7936                                const browserStorage = hyva.getBrowserStorage();
7937
7938                                // merge new data preserving non-invalidated sections
7939                                const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {};
7940
7941                                                                if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) {
7942                                    delete oldSectionData['checkout-data'];
7943                                }
7944                                const newSectionData = Object.assign(oldSectionData, data);
7945
7946                                dispatchPrivateContent(newSectionData);
7947
7948                                // don't persist messages, they've been dispatched already
7949                                if (newSectionData.messages && newSectionData.messages.messages ) {
7950                                    newSectionData.messages.messages = [];
7951                                }
7952
7953                                browserStorage.setItem(private_content_key, JSON.stringify(newSectionData));
7954
7955                                const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString();
7956                                browserStorage.setItem(private_content_expire_key, expiresAt);
7957
7958                                const newCookieVersion = hyva.getCookie(private_content_version_key);
7959                                browserStorage.setItem(private_content_version_key, newCookieVersion);
7960
7961                                // We don't need the section_data_ids in Hyvä, but we store them for compatibility
7962                                // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout
7963                                hyva.setCookie(
7964                                    section_data_ids_key,
7965                                    JSON.stringify(
7966                                        Object.keys(data).reduce((sectionDataIds, sectionKey) => {
7967                                            sectionDataIds[sectionKey] = data[sectionKey]['data_id'];
7968                                            return sectionDataIds;
7969                                        }, {})
7970                                    ),
7971                                    false,
7972                                    true
7973                                );
7974                            } catch (error) {
7975                                console.warn("Couldn't store privateContent", error);
7976                            }
7977                        }
7978                    }
7979                )
7980                .catch(error => {
7981                    console.warn("Couldn't fetch privateContent", error);
7982                });
7983        }
7984    })();
7985    //# sourceURL=hyva-private-content.js
7986</script>
vendor: 1 bytes, line 7986
7986
7987<script>
7988    (() => {
7989        document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc()));
7990    })()
7991</script>
vendor: 1 bytes, line 7991
7991
7992<script>
7993    (events => {
7994        const dispatchUserInteractionEvent = () => {
7995            events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent))
7996            window.dispatchEvent(new Event('init-external-scripts'))
7997        };
7998        events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true}))
7999    })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']);
8000    //# sourceURL=hyva-init-external-scripts.js
8001</script>
8001
8002<!--OX7wOp4TiO5hLyFeO0pUjRq0pBPeKzri-->
8002<script>
8003    function initConfigurableOptions(productId, optionConfig) {
8004
8005        function findPathParam(key) {
8006                        const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL;
8007            const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/');
8008            const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3);
8009            for (let i = 0; i < pathParts.length; i += 2) {
8010                if (pathParts[i] === key && pathParts.length > i) {
8011                    return pathParts[i + 1];
8012                }
8013            }
8014        }
8015
8016        return {
8017            optionConfig,
8018            productId,
8019            itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'),
8020            allowedAttributeOptions: [],
8021            selectedValues: [],
8022            selectedOptions: {},
8023            init() {
8024                this.baseInit();
8025            },
8026            baseInit() {
8027                this.buildLookupMap();
8028                this.findAllowedAttributeOptions();
8029                this.$nextTick(() => {
8030                    if (typeof this.optionConfig.defaultValues === 'object') {
8031                        for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) {
8032                            this.changeOption(attributeId, value + '');
8033                        }
8034                    }
8035                                        this.applyCheckedState();
8036                });
8037            },
8038            applyCheckedState() {
8039                this.$root.querySelectorAll('input[data-attribute-id], select[data-attribute-id]').forEach(el => {
8040                    const val = this.selectedValues[el.dataset.attributeId];
8041                    if (!val) return;
8042                    if (el.tagName === 'SELECT') {
8043                        el.value = val;
8044                        this.selectedOptions[el.dataset.attributeId] = el.options[el.selectedIndex]?.text || '';
8045                    } else if (el.value === val && this.optionIsActive(el.dataset.attributeId, el.value)) {
8046                        el.checked = true;
8047                        this.selectedOptions[el.dataset.attributeId] = el.dataset.optionLabel || '';
8048                    }
8049                });
8050            },
8051            productIndex: 0,
8052            productIndexForPrice: 0,
8053            productIndexesMap: null,
8054            productIndexesKeys: null,
8055            attributeCount: 0,
8056            optionIsActive(attributeId, optionId) {
8057                                return !!this.getAllowedAttributeOptions(attributeId).find(
8058                    option => option.id === optionId
8059                )
8060            },
8061            optionIsDisabled() {
8062                const attributeId = this.$el.dataset.attributeId;
8063                if (!attributeId) {
8064                    throw new Error('data-attribute-id missing, in item template');
8065                }
8066                return !this.optionIsActive(attributeId, this.$el.value);
8067            },
8068            findSimpleIndex() {
8069                                this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues);
8070                this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues);
8071            },
8072            calculateSimpleIndexForPartialSelection(selectedValues) {
8073                if (selectedValues.length === 0) return 0;
8074                return this.findProductIdsForPartialSelection(selectedValues)[0];
8075            },
8076            buildLookupMap() {
8077                                this.productIndexesMap = new Map();
8078                this.attributeCount = Object.keys(this.optionConfig.attributes).length;
8079                for (const id in this.optionConfig.index) {
8080                    const options = this.optionConfig.index[id];
8081                    if (! this.productIndexesKeys) {
8082                        this.productIndexesKeys = Object.keys(options).sort();
8083                    }
8084                    const key = JSON.stringify(options, this.productIndexesKeys);
8085                    this.productIndexesMap.set(key, id);
8086                }
8087            },
8088            findAllowedAttributeOptions() {
8089                                this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues);
8090            },
8091            calculateAllowedAttributeOptions(selectedValues) {
8092                const allAttributes = this.optionConfig.attributes;
8093                const allAttributesSorted = Object.values(allAttributes).sort((a,b) => {
8094                    return a.position - b.position
8095                });
8096
8097                const newAllowedAttributeOptions = [];
8098
8099                allAttributesSorted.forEach(attribute => {
8100                    const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id));
8101                    const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr);
8102                    newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => {
8103                        return !!option.products.find(product => {
8104                            return availableIndexes.includes(product);
8105                        })
8106                    });
8107                });
8108                return newAllowedAttributeOptions;
8109            },
8110            calculateAvailableProductIndexes(selectedOptions) {
8111                if (Object.keys(selectedOptions).length === 0) {
8112                                        if (Object.values(this.optionConfig.salable || {}).length) {
8113                                                return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i)
8114                    }
8115                                        return Object.keys(this.optionConfig.index);
8116                }
8117
8118                                const selectedIds = Object.keys(selectedOptions);
8119                if (Object.values(this.optionConfig.salable || {}).length) {
8120                                        const selectedOptionIndexes = selectedIds.map(attrId => {
8121                        const optionValue = selectedOptions[attrId];
8122                        return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || []
8123                    })
8124                                        return selectedOptionIndexes.reduce((acc, optionIndexes) => {
8125                        return acc.filter(index => optionIndexes.includes(index));
8126                    });
8127                } else {
8128                                        const productIndexes = this.optionConfig.index;
8129                    return Object.keys(productIndexes).filter(index => {
8130                                                for (const attrId of selectedIds) {
8131                            if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false
8132                        }
8133                        return true
8134                    });
8135                }
8136            },
8137            findAttributeByOptionId(optionId) {
8138                for (const attributeId in this.optionConfig.attributes) {
8139                    const attributeOptions = this.optionConfig.attributes[attributeId].options || [];
8140                    if (attributeOptions.find(option => option.id === optionId)) {
8141                        return attributeId;
8142                    }
8143                }
8144            },
8145            getAllowedAttributeOptions(attributeId) {
8146                return this.allowedAttributeOptions[attributeId] || []
8147            },
8148            getAllAttributeOptions(attributeId) {
8149                return (
8150                    this.optionConfig.attributes[attributeId] &&
8151                    this.optionConfig.attributes[attributeId].options
8152                ) || []
8153            },
8154            getProductIdsForOption(option) {
8155                const attributeId = this.findAttributeByOptionId(option.id);
8156                const allOptions = this.optionConfig.attributes[attributeId];
8157                const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id);
8158                return opt && opt.products
8159                    ? opt.products
8160                    : [];
8161            },
8162            findProductIdsForPartialSelection(optionSelection) {
8163                const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => {
8164                    const newCandidates = this.getProductIdsForOption({id: optionId});
8165                    return candidates === null
8166                        ? newCandidates
8167                        : candidates.filter(productId => newCandidates.includes(productId));
8168                }, null);
8169                return candidateProducts || [];
8170            },
8171            findCheapestProductForPartialSelection(optionSelection) {
8172                const candidateProducts = this.findProductIdsForPartialSelection(optionSelection);
8173                return candidateProducts.reduce((cheapest, simpleIdx) => {
8174                    // in the first iteration we start with simpleIdx as the currently cheapest product
8175                    if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx;
8176                    const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount;
8177                    return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount
8178                        ? simpleIdx
8179                        : cheapest;
8180                }, 0)
8181            },
8182            removeAttrFromSelection(selectedValues, attributeId) {
8183                                attributeId = parseInt(attributeId);
8184                return selectedValues.reduce((newSelection, val, attr) => {
8185                    if (attr !== attributeId) {
8186                        newSelection[attr] = val;
8187                    }
8188                    return newSelection;
8189                }, []);
8190            },
8191            reflectOption(event) {
8192                const attributeId = event.target.dataset.attributeId;
8193                const label = event.target.dataset.optionLabel
8194                    || event.target.options?.[event.target.selectedIndex]?.text
8195                    || '';
8196                this.selectedOptions[attributeId] = label;
8197                this.changeOption(attributeId, event.target.value);
8198            },
8199            baseChangeOption(attributeId, value) {
8200                if (value === '') {
8201                    this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId)
8202                } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) {
8203                                        this.selectedValues[attributeId] = value;
8204                }
8205                this.findSimpleIndex();
8206                this.findAllowedAttributeOptions();
8207                this.updatePrices();
8208                this.updateGallery();
8209            },
8210            changeOption(attributeId, value) {
8211                this.baseChangeOption(attributeId, value);
8212
8213                const candidates = this.findProductIdsForPartialSelection(this.selectedValues);
8214
8215                                window.dispatchEvent(
8216                    new CustomEvent(
8217                        'configurable-selection-changed',
8218                        {
8219                            detail: {
8220                                productId: this.productId,
8221                                optionId: attributeId,
8222                                value: value,
8223                                productIndex: this.productIndex,
8224                                selectedValues: this.selectedValues,
8225                                candidates: candidates,
8226                                skuCandidates: Object.values(candidates).map(id => this.optionConfig.sku?.[id] ?? null).filter(Boolean),
8227                            }
8228                        }
8229                    )
8230                );
8231            },
8232            calculateIsMinimalPrice() {
8233                return ! this.isFullSelection(this.selectedValues);
8234            },
8235            isFullSelection(selectedValues) {
8236                return Object.keys(selectedValues).length === this.attributeCount;
8237            },
8238            updatePrices() {
8239                const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices;
8240                window.dispatchEvent(
8241                    new CustomEvent(
8242                        "update-prices-" + this.productId,
8243                        {
8244                            detail: Object.assign(
8245                                value,
8246                                { isMinimalPrice: this.calculateIsMinimalPrice() }
8247                            )
8248                        }
8249                    )
8250                );
8251            },
8252            updateGallery () {
8253                if (this.productIndex) {
8254                    const images = this.optionConfig.images[this.productIndex];
8255                    images && window.dispatchEvent(new CustomEvent(
8256                        "update-gallery",
8257                        { detail: this.sortImagesByPosition(images) }
8258                    ));
8259                } else {
8260                    window.dispatchEvent(new Event("reset-gallery"));
8261                }
8262            },
8263            sortImagesByPosition(images) {
8264                return images.sort((x, y) => {
8265                    return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1)
8266                });
8267            },
8268            preselectQuerystringItems() {
8269                // pre-select option like ?size=167
8270                const urlQueryParams = new URLSearchParams(window.location.search.replace('?',''));
8271                this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code));
8272            },
8273            preselectLocationHashItems() {
8274                // pre-select option like #144=167
8275                const urlHashParams = new URLSearchParams(window.location.hash.replace('#',''));
8276                this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id));
8277            },
8278            preselectItemsBasedOnLocation(getLocationValue) {
8279                Object.values(this.optionConfig.attributes).map(attribute => {
8280                    const v = getLocationValue(attribute);
8281                    v && this.changeOption(attribute.id, v)
8282                });
8283            },
8284            findProductForOptionPrice(attributeId, value) {
8285                const options = this.optionConfig.attributes[attributeId]?.options || [];
8286                const option = options.find(o => o.id === value);
8287                if (!option?.products?.length) return null;
8288                return option.products.reduce((cheapest, productId) => {
8289                    if (!cheapest) return productId;
8290                    const cheapestPrice = this.optionConfig.optionPrices[cheapest]?.finalPrice?.amount ?? Infinity;
8291                    const thisPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount ?? Infinity;
8292                    return thisPrice < cheapestPrice ? productId : cheapest;
8293                }, null);
8294            },
8295            getOptionLabel() {
8296                const value = this.$el.value;
8297                const attributeId = this.$el.dataset.attributeId;
8298                const label = this.$el.dataset.optionLabel || '';
8299                if (!value || !attributeId) return label;
8300
8301                const productId = this.findProductForOptionPrice(attributeId, value);
8302                if (!productId) return label;
8303
8304                const optionPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount;
8305                const basePrice = this.optionConfig.prices?.finalPrice?.amount;
8306                if (optionPrice == null || basePrice == null) return label;
8307
8308                const adjustment = optionPrice - basePrice;
8309                if (Math.abs(adjustment) < 0.001) return label;
8310
8311                const formatted = hyva.formatPrice(Math.abs(adjustment));
8312                return `${label} (${adjustment > 0 ? '+' : '-'}${formatted})`;
8313            },
8314        }
8315    }
8316</script>
vendor: 1 bytes, line 8316
8316
8317<script>
8318    function initSwatchOptions() {
8319        return {
8320            activeTooltipItem: false,
8321            tooltipPositionElement: false,
8322            isTooltipVisible() {
8323                return !!this.activeTooltipItem;
8324            },
8325            isCurrentTooltipVisual() {
8326                return this.activeTooltipItem && ['color', 'image'].includes(this.activeTooltipItem.type);
8327            },
8328            getTooltipImageStyle() {
8329                const item = this.activeTooltipItem;
8330                if (item?.type === 'color') return {
8331                    backgroundColor: item.preview,
8332                    width: `${item.width ?? 90}px`,
8333                    height: `${item.height ?? 90}px`
8334                };
8335                if (item?.type === 'image') return {
8336                    backgroundImage: `url(${item.preview})`,
8337                    backgroundSize: 'cover',
8338                    backgroundPosition: 'center',
8339                    backgroundRepeat: 'no-repeat',
8340                    width: `${item.width ?? 90}px`,
8341                    height: `${item.height ?? 90}px`
8342                };
8343                return null;
8344            },
8345            getTooltipPosition() {
8346                if (!this.tooltipPositionElement) return null;
8347                const el = this.tooltipPositionElement;
8348                const elRect = el.getBoundingClientRect();
8349                const left = elRect.left + elRect.width / 2;
8350
8351                return {
8352                    bottom: `${window.innerHeight - elRect.top}px`,
8353                    left: `${left}px`,
8354                    translate: '-50% 0'
8355                };
8356            },
8357            getTooltipLabel() {
8358                return this.activeTooltipItem ? this.activeTooltipItem.label : '';
8359            },
8360            showTooltip(event) {
8361                if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;
8362                const input = event.currentTarget.querySelector('input');
8363                this.activeTooltipItem = JSON.parse(input.dataset.tooltip);
8364                this.tooltipPositionElement = event.currentTarget;
8365            },
8366            hideTooltip() {
8367                this.activeTooltipItem = false;
8368            },
8369        }
8370    }
8371</script>
vendor: 1 bytes, line 8371
8371
8372<script>
8373        function amastyRewardsCatalog() {
8374            return {
8375                productId: this.$el.dataset.productId,
8376                formSelector: 'product_addtocart_form',
8377                refreshUrl: this.$el.dataset.refreshUrl,
8378                loader: false,
8379                isFetching: false,
8380                abortFetchController: false,
8381                highlight: {
8382                    caption_color: '',
8383                    caption_text: '',
8384                    visible: false
8385                },
8386
8387                init() {
8388                    this.formObserver();
8389                    document.addEventListener(`update-qty-${this.productId}`, () => {
8390                        this.updateData();
8391                    });
8392                    this.$nextTick(() => this.updateData());
8393                },
8394
8395                hideBlock() {
8396                    this.highlight.visible = false;
8397                    this.loader = true;
8398                },
8399
8400                dispatchStatus(type, message) {
8401                    window.dispatchMessages([{
8402                        type: type,
8403                        text: message
8404                    }], 5000);
8405                },
8406
8407                formObserver() {
8408                    const product = document.querySelector(`input[name="product"][value="${this.productId}"]`);
8409
8410                    if (product) {
8411                        const productForm = product.form;
8412                        if (productForm) {
8413                            productForm.addEventListener('change', () => {
8414                                this.updateData();
8415                            });
8416                        }
8417                    }
8418                },
8419
8420                updateData() {
8421                    if (!this.refreshUrl || this.isFetching) return false;
8422                    this.hideBlock();
8423
8424                    if (this.abortFetchController) {
8425                        this.abortFetchController.abort();
8426                    }
8427                    this.abortFetchController = new AbortController();
8428
8429                    const product = document.querySelector(`input[name='product'][value='${this.productId}']`);
8430                    if (!product) return false;
8431
8432                    const form = product.form;
8433                    const formData = new FormData(form);
8434                    const formParams = new URLSearchParams(formData).toString();
8435                    const formJson = JSON.stringify({
8436                        productId: this.productId,
8437                        attributes: formParams
8438                    });
8439
8440                    const requestOptions = {
8441                        method: 'POST',
8442                        body: formJson,
8443                        headers: {
8444                            'Content-Type': 'application/json',
8445                            'x-requested-with': 'XMLHttpRequest',
8446                        },
8447                        signal: this.abortFetchController.signal
8448                    };
8449
8450                    this.isFetching = true;
8451                    fetch(this.refreshUrl, requestOptions).then(response => {
8452                        if (!response.ok) {
8453                            return Promise.reject(`${response.status} ${response.statusText}`);
8454                        }
8455                        return response.json();
8456                    }).then(data => {
8457                        this.highlight.visible = data.visible;
8458                        this.highlight.caption_text = data.caption_text;
8459                        this.highlight.caption_color = data.caption_color;
8460                    }).catch(error => {
8461                        if (error.name !== 'AbortError'
8462                                && typeof error === 'string'
8463                                && error.match(/'401'/g) !== null
8464                            ) {
8465                            this.dispatchStatus('error', error);
8466                        }
8467                    }).finally(() => {
8468                        this.loader = false;
8469                        this.abortFetchController = false;
8470                        this.isFetching = false;
8471                    });
8472                },
8473
8474                highlightVisible() {
8475                    return this.highlight.visible && !this.loader;
8476                },
8477
8478                highlightStyle() {
8479                    return `color: ${this.highlight.caption_color}`;
8480                },
8481            }
8482        }
8483
8484        window.addEventListener(
8485            'alpine:init',
8486            () => Alpine.data('amastyRewardsCatalog', amastyRewardsCatalog),
8487            { once: true }
8488        );
8489 </script>
vendor: 1 bytes, line 8489
8489
8490<script>
8491    'use strict';
8492
8493    const grecaptchaV2LoadCallbacks = [];
8494
8495    function executeRecaptchaLoadCallbacks () {
8496        while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) {
8497            const callback = grecaptchaV2LoadCallbacks.pop();
8498            typeof callback === 'string' ? window[callback]() : callback();
8499        }
8500    }
8501
8502    (function() {
8503        const loadRecaptchaScript = (event) => {
8504
8505            if (window.grecaptcha || !event.target.form) {
8506                return;
8507            }
8508
8509            const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks';
8510            const siteKey = '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV';
8511            const script = document.createElement('script');
8512            script.type = 'text/javascript';
8513            script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`;
8514            script.async = true;
8515            document.head.appendChild(script);
8516
8517            script.addEventListener('load', () => {
8518                Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled'));
8519            });
8520        }
8521
8522        window.forceLoadRecaptchaScript = (form) => {
8523            loadRecaptchaScript({target: {form: form || 'dummy'}});
8524            executeRecaptchaLoadCallbacks();
8525        };
8526
8527        document.body.addEventListener('input', loadRecaptchaScript, { once: true });
8528        document.body.addEventListener('focus', loadRecaptchaScript, { once: true });
8529
8530    }());
8531
8532</script>
vendor: 1 bytes, line 8532
8532
8533<script>
8534    const ALLOWED_SHIPPING_COUNTRIES = JSON.parse('\u007B\u0022de\u0022\u003A\u0022Allemagne\u0022,\u0022ad\u0022\u003A\u0022Andorre\u0022,\u0022at\u0022\u003A\u0022Autriche\u0022,\u0022be\u0022\u003A\u0022Belgique\u0022,\u0022bg\u0022\u003A\u0022Bulgarie\u0022,\u0022cy\u0022\u003A\u0022Chypre\u0022,\u0022hr\u0022\u003A\u0022Croatie\u0022,\u0022dk\u0022\u003A\u0022Danemark\u0022,\u0022es\u0022\u003A\u0022Espagne\u0022,\u0022ee\u0022\u003A\u0022Estonie\u0022,\u0022fi\u0022\u003A\u0022Finlande\u0022,\u0022fr\u0022\u003A\u0022France\u0022,\u0022gr\u0022\u003A\u0022Gr\u005Cu00e8ce\u0022,\u0022hu\u0022\u003A\u0022Hongrie\u0022,\u0022ie\u0022\u003A\u0022Irlande\u0022,\u0022is\u0022\u003A\u0022Islande\u0022,\u0022it\u0022\u003A\u0022Italie\u0022,\u0022lv\u0022\u003A\u0022Lettonie\u0022,\u0022lt\u0022\u003A\u0022Lituanie\u0022,\u0022lu\u0022\u003A\u0022Luxembourg\u0022,\u0022mt\u0022\u003A\u0022Malte\u0022,\u0022mc\u0022\u003A\u0022Monaco\u0022,\u0022nl\u0022\u003A\u0022Pays\u002DBas\u0022,\u0022pl\u0022\u003A\u0022Pologne\u0022,\u0022pt\u0022\u003A\u0022Portugal\u0022,\u0022ro\u0022\u003A\u0022Roumanie\u0022,\u0022sm\u0022\u003A\u0022Saint\u002DMarin\u0022,\u0022sk\u0022\u003A\u0022Slovaquie\u0022,\u0022si\u0022\u003A\u0022Slov\u005Cu00e9nie\u0022,\u0022ch\u0022\u003A\u0022Suisse\u0022,\u0022se\u0022\u003A\u0022Su\u005Cu00e8de\u0022,\u0022cz\u0022\u003A\u0022Tch\u005Cu00e9quie\u0022,\u0022va\u0022\u003A\u0022\u005Cu00c9tat\u0020de\u0020la\u0020Cit\u005Cu00e9\u0020du\u0020Vatican\u0022\u007D');
8535
8536    document.addEventListener('alpine:init', () => {
8537        Alpine.store('customer', {
8538            isInit: false,
8539            isLoggedIn: false,
8540            customerId: 0,
8541            fullName: '',
8542            visitorCountry: '',
8543            isInferredCountry: true,
8544            customerId: 0,
8545
8546            init() {
8547                window.addEventListener(
8548                    "private-content-loaded",
8549                    (event) => {
8550                        const privateData = event?.detail?.data;
8551                        this.isInit = true;
8552                        this.customerId = privateData?.customer?.customerId || ''
8553                        this.fullName = privateData?.customer?.fullname || '';
8554                        this.isLoggedIn = !!privateData?.customer?.fullname;
8555                        this.customerId = privateData?.customer?.customerId || 0;
8556                        this.visitorCountry = (hyva.getCookie('visitor_country') || this.getGlopalHtmlLang() || 'FR').toLowerCase();
8557                        this.isInferredCountry = !hyva.getCookie('visitor_country');
8558                        this.setStoredVisitorCountry(this.visitorCountry, false);
8559                        Alpine.nextTick(() => {window.dispatchEvent(
8560                            new CustomEvent("customer-alpine-init")
8561                        )});
8562                    }
8563                );
8564            },
8565
8566            setStoredVisitorCountry(country, reloadPage = true) {
8567                if (ALLOWED_SHIPPING_COUNTRIES?.[country.toLowerCase()]) {
8568                    hyva.setCookie('visitor_country', country.toUpperCase(), 10, true);
8569                    this.visitorCountry = country;
8570                    if (reloadPage && false) {
8571                        document.querySelector('body').classList.add('u-loader');
8572                        const formData = new FormData();
8573                        formData.append('form_key', hyva.getFormKey());
8574                        fetch('https://www.jardindupicvert.com/pdfcheckout/cart/collectTotals/', {
8575                            method: 'POST',
8576                            headers: {
8577                                "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
8578                                'X-Requested-With': 'XMLHttpRequest',
8579                                'pragma': 'no-cache',
8580                                'cache-control': 'no-cache'
8581                            },
8582                            mode: 'cors',
8583                            credentials: 'include',
8584                            body: formData
8585                        }).then(response => {
8586                            window.location.reload();
8587                        })
8588                    }
8589                }
8590                Alpine.nextTick(() => {window.dispatchEvent(
8591                    new CustomEvent(
8592                        "visitor_country_change",
8593                        { detail: country }
8594                    )
8595                )});
8596                return !!ALLOWED_SHIPPING_COUNTRIES?.[country];
8597            },
8598
8599            get visitorCountryName() {
8600                return ALLOWED_SHIPPING_COUNTRIES?.[this.visitorCountry] || '';
8601            },
8602
8603            getGlopalHtmlLang() {
8604                return document.documentElement.contains(document.querySelector('glopal')) ? 
8605                    document.documentElement.lang.substr(3, 2).toUpperCase() : '';
8606
8607            }
8608        });
8609    })
8610</script>
vendor: 1 bytes, line 8610
8610
8611<script>
8612document.addEventListener('alpine:init', () => {
8613    Alpine.store('minicart', {
8614        cart: {
8615            summary_count: 0,
8616            subtotal: '0',
8617            items: [],
8618            isMergedCart: false
8619        },
8620        init() {
8621            window.addEventListener(
8622                "private-content-loaded",
8623                (event) => {
8624                    event.detail?.data?.cart?.items && (this.cart = event.detail.data.cart);
8625                    this.isMergedCart = this.cart.items.some(i => i?.merged_qty > 0);
8626                }
8627            );
8628        }
8629    });
8630})
8631</script>
vendor: 1 bytes, line 8631
8631
8632<script>
8633    (function () {
8634        const modals = [];
8635                let lastHide = 0;
8636
8637                function resolveElement($refs, value) {
8638            if (!value) return null;
8639                        if (value instanceof Element) return value;
8640                        if (typeof value === 'string') {
8641                try {
8642                    return ($refs && $refs[value]) || document.querySelector(value) || null;
8643                } catch (e) {}
8644            }
8645            return null;
8646        }
8647
8648                function determineTrigger($refs, dialog, trigger) {
8649                        if (!trigger && dialog?.target instanceof HTMLElement) {
8650                return dialog.target;
8651            }
8652
8653                        if (typeof dialog === 'string' && trigger?.target instanceof HTMLElement) {
8654                return trigger.target;
8655            }
8656
8657            return resolveElement($refs, trigger);
8658        }
8659
8660                function setFocusFirstElement(dialogElement) {
8661            if (!dialogElement) return;
8662
8663            window.setTimeout(() => {
8664                const candidates = dialogElement.querySelectorAll('[x-focus-first]');
8665                for (const candidate of candidates) {
8666                    if (candidate.closest('dialog') === dialogElement) {
8667                        candidate.focus();
8668                        return;
8669                    }
8670                }
8671            }, 50);
8672        }
8673
8674        window.hyva.modal = function(options = {}) {
8675                        if (this.$el && this.$el.dataset && this.$el.dataset.options) {
8676                try {
8677                    options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}'));
8678                } catch (e) {
8679                    throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON');
8680                }
8681            }
8682
8683            const config = Object.assign({
8684                dialog: 'dialog',                 duration: 300,                 transitionEnter: 'transition ease-out duration-300',
8685                transitionEnterStart: 'opacity-0',
8686                transitionEnterEnd: 'opacity-100',
8687                transitionLeave: 'transition ease-in duration-300',
8688                transitionLeaveStart: 'opacity-100',
8689                transitionLeaveEnd: 'opacity-0',
8690            }, options);
8691
8692            return {
8693                opened: {},
8694                show(dialog, trigger) {
8695                    const name = typeof dialog === 'string' ? dialog : config.dialog;
8696                    if (!name || this.opened[name]) return;
8697
8698                    this.opened[name] = true;
8699                    const focusTarget = determineTrigger(this.$refs, dialog, trigger);
8700                    const dialogEl = this.$refs && this.$refs[name];
8701                    const frame = { name, instance: this, focusTarget, time: Date.now() };
8702                    modals.push(frame);
8703                    setFocusFirstElement(dialogEl);
8704                    return new Promise(resolve => { frame.resolve = resolve; });
8705                },
8706                cancel() {
8707                    this.hide(false);
8708                },
8709                ok() {
8710                    this.hide(true);
8711                },
8712                hide(value) {
8713                                        if (Date.now() - lastHide < config.duration) return;
8714                    lastHide = Date.now();
8715
8716                                        const modal = modals.pop();
8717                    if (!modal) return;
8718
8719                    modal.instance.opened[modal.name] = false;
8720
8721                                        const focusTarget = modal.focusTarget;
8722                    focusTarget && window.setTimeout(() => focusTarget.focus(), config.duration + 50);
8723                    modal.resolve && modal.resolve(value);
8724                },
8725                /**
8726                 * @deprecated Use dialogConfig() instead, which is used by the default modal-container.phtml template.
8727                 * This method is kept for backwards compatibility with custom container templates.
8728                 */
8729                overlay(dialog) {
8730                    dialog = this.$el.dataset.dialogRefName || dialog;
8731                    const name = typeof dialog === 'string' ? dialog : config.dialog;
8732                    if (this.$el.tagName !== 'DIALOG' && ! window.hyva.modal.legacyModalCompatibility) {
8733                        console.warn(
8734                            '[hyva] Deprecated modal markup detected (x-bind="overlay" on a non-dialog element' +
8735                            (name ? ` for "${name}"` : '') + ').\n' +
8736                            'Escape and click-outside closing are not available for such dialogs anymore.\n' +
8737                            'Install hyva-themes/magento2-legacy-modal-compatibility or migrate to the native <dialog> markup.'
8738                        );
8739                    }
8740                    return Object.assign({}, this.dialogConfig(name), {
8741                        ['@hyva-modal-show.window'](event) {
8742                            event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide)
8743                        }
8744                    });
8745                },
8746                dialogConfig(name) {
8747                    name = name || this.$el.dataset.dialogRefName || config.dialog;
8748                    return {
8749                        ['x-show']: () => name ? this.opened[name] : false,
8750                        ['x-transition:enter']: config.transitionEnter,
8751                        ['x-transition:enter-start']: config.transitionEnterStart,
8752                        ['x-transition:enter-end']: config.transitionEnterEnd,
8753                        ['x-transition:leave']: config.transitionLeave,
8754                        ['x-transition:leave-start']: config.transitionLeaveStart,
8755                        ['x-transition:leave-end']: config.transitionLeaveEnd,
8756                        ['@hyva-modal-show.window'](event) {
8757                            event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide);
8758                        },
8759                    };
8760                },
8761                showDialogOnInit() {
8762                    const name = this.$el.dataset.dialogRefName;
8763                    if (name) {
8764                        this.show(name);
8765                    }
8766                }
8767            };
8768        }
8769
8770        window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length - 1]
8771
8772        window.hyva.modal.pop = function () {
8773            if (modals.length > 0) {
8774                modals[modals.length - 1].instance.hide();
8775            }
8776        }
8777
8778        /**
8779         * @deprecated Native <dialog> handles focus trapping automatically.
8780         * Calling this function has no effect. Kept for backwards compatibility.
8781         */
8782        window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) {}
8783
8784        /**
8785         * @deprecated Native <dialog> with x-htmldialog handles ESC key and click-outside events.
8786         * These functions have no effect. Kept for backwards compatibility.
8787         */
8788        window.hyva.modal.eventListeners = {
8789            keydown: event => {},
8790            click: event => {}
8791        };
8792    })();
8793
8794    window.addEventListener('alpine:init', () => {
8795        Alpine.data('hyvaModal', window.hyva.modal);
8796    }, {once: true});
8797</script>
8797
8798<style>
8799    .wishlist-list {background-color: rgb(241, 243, 242);}
8800</style>
8801<datalist id="presets">
8802<option value="#ffb3ba">Red</option>
8803<option value="#ffdfba">Orange</option>
8804<option value="#ffffba">Yellow</option>
8805<option value="#baffc9">Green</option>
8806<option value="#bae1ff">Blue</option>
8807</datalist>
8808
8809<script>
8810    function getTextColorForBackground(color) { // See https://css-tricks.com/switch-font-color-for-different-backgrounds-with-css/
8811        if (!color) {
8812            return '';
8813        }
8814        color = color.charAt(0) === '#' ? color.substring(1) : color;
8815        if (color.length !== 6) {
8816            return '';
8817        }
8818        const THRESHOLD = .5;
8819        const parts = (color.match(/.{1,2}/g) ?? []).map(h => parseInt(h, 16));
8820        const red = .2126 * parts[0];
8821        const green = .7152 * parts[1];
8822        const blue = .0722 * parts[2];
8823        const textColor = -10000000 * (((red + green + blue) / 255) - THRESHOLD);
8824        return `hsl(0, 0%, ${textColor}%`;
8825    }
8826
8827        
8828    function initMWishlistPopup() {
8829        return {
8830            ...hyva.modal(),
8831
8832            isProcessing: false,
8833            excludedListIds: [],
8834            newListActive: false,
8835            newListName: '',
8836            newListColor: '',
8837            addItemToWishlistUrl: 'https://www.jardindupicvert.com/mwishlist/item/add/',
8838            removeItemFromWishlistUrl: 'https://www.jardindupicvert.com/mwishlist/item/remove/',
8839            addNewListUrl: 'https://www.jardindupicvert.com/mwishlist/wishlist/create/',
8840            deleteListUrl: 'https://www.jardindupicvert.com/mwishlist/wishlist/delete/',
8841            moveItemsUrl: 'https://www.jardindupicvert.com/mwishlist/item/move/',
8842            copyItemsUrl: 'https://www.jardindupicvert.com/mwishlist/item/copy/',
8843            actionNote: '',
8844
8845            eventListeners: {
8846                // Called from vmAMWishlist (js/alpine-data.phtml)
8847                ['@update-product-in-wishlist.window'](event) {
8848                    const params = { ...event.detail };
8849                    this.loginIfRequired(() => {this.updateProductInWishlist(params);});
8850                },
8851                // Called from mwishlist popup or wishlists page
8852                ['@create-new-wishlist.window'](event) {
8853                    this.addNewList(event.detail);
8854                },
8855                // Called from wishlists page or wishlist detail page
8856                ['@delete-wishlist.window'](event) {
8857                    this.deleteList(event.detail);
8858                },
8859                // copy|move items from a wish list to another: called from wishlists detail page
8860                ['@change-wishlist-items.window'](event) {
8861                    const params = { ...event.detail };
8862                    if (params?.action === 'move' || params?.action === 'copy' || params?.action === 'addtocart') {
8863                        let formData = {};
8864                        if (params?.form) {
8865                            formData = this.extractFormData(params.form);
8866                            params.data.data = { ...params.data.data, ...formData };
8867                        }
8868                        this.changeItemsToList(params?.data?.action, params?.data?.data);
8869                    }
8870                },
8871                // Called from wishlists detail page (search results)
8872                ['@add-product-to-wishlist.window'](event) {
8873                    const params = { ...event.detail };
8874                    this.loginIfRequired(() => {this.addProductToWishlist(params);});
8875
8876                },
8877                // Called from wishlists detail page
8878                ['@remove-item-from-wishlist.window'](event) {
8879                    const params = { ...event.detail };
8880                    if (params?.wishlist && params?.item) {
8881                        this.loginIfRequired(() => {this.removeProductFromWishlist(params, [{ list: params?.wishlist, item: params?.item }]);});
8882                    }
8883                },
8884            },
8885
8886            getLists() {
8887                return Alpine.store('amwishlist').loaded ? Alpine.store('amwishlist').lists : [];
8888            },
8889
8890            // If customer is not logged in, we open login in panel
8891            loginIfRequired(callback = false) {
8892                if (!Alpine.store('customer').isLoggedIn) {
8893                    window.dispatchEvent(
8894                        new CustomEvent('toggle-authentication', {
8895                            detail: {
8896                                callback: callback,
8897                                text: "Veuillez vous connecter à votre compte pour pouvoir gérer vos listes de favoris."
8898                            }
8899                        })
8900                    );
8901                } else if (typeof callback === 'function') {
8902                    callback();
8903                }
8904            },
8905
8906            /**
8907             * Enable customer to add/remove product to/from wishlist
8908             * A [remove] button is add to every wishlist the product is included in
8909             * A [add] button is add to every wishlist the product isn't included in
8910             *
8911             * @param params
8912             */
8913            updateProductInWishlist(params) {
8914                if(this.isProcessing) {
8915                    return;
8916                }
8917                const remove = (list, item) => {
8918                    this.ajaxAction(
8919                        this.removeItemFromWishlistUrl,
8920                        { item: item, wishlist_id: list, ...params }
8921                    );
8922                };
8923                const add = (id) => {
8924                    this.ajaxAction(
8925                        this.addItemToWishlistUrl,
8926                        { wishlist_id: id, ...params }
8927                    );
8928                };
8929                // We add a "isIn" attribute to each list whether it includes the product or not
8930                this.getLists().forEach(l => {
8931                    l.isIn = !!l.items.find(i => i.product_id == params.product);
8932                });
8933                const wishlistItems = this.getWishlistItemsForProductId(params.product);
8934                this.actionNote = wishlistItems.length ?
8935                    "Ajouter ou supprimer cet article de vos listes de favoris." :
8936                    "Choisissez une liste à laquelle ajouter cet article."
8937
8938                this.show().then(
8939                    (id) => {
8940                        const wishlist = this.getWishlistById(id);
8941                        if (wishlist) {
8942                            if (wishlist.isIn) {
8943                                const item = wishlistItems.find(i => i.list == id)?.item;
8944                                if (item) {
8945                                    remove(id, item);
8946                                }
8947                            } else {
8948                                add(id);
8949                            }
8950                        }
8951                    }
8952                );
8953            },
8954
8955            /**
8956             * Required key: product
8957             * Extra keys from wishlist search lock: wishlist, block
8958             * @param params
8959             */
8960            addProductToWishlist(params) {
8961                if(this.isProcessing) {
8962                    return;
8963                }
8964                const add = (id) => {
8965                    this.ajaxAction(
8966                        this.addItemToWishlistUrl,
8967                        { wishlist_id: id, ...params }
8968                    );
8969                };
8970                params.qty = params?.qty || 1;
8971                if (params?.wishlist) {
8972                    add(params.wishlist);
8973                } else {
8974                    this.show().then(
8975                        (id) => {
8976                            if (id) {
8977                                add(id);
8978                            }
8979                        }
8980                    );
8981                }
8982            },
8983
8984            /**
8985             * items pattern []{list: int, item: int}
8986             */
8987            removeProductFromWishlist(params, items = []) {
8988                const remove = (list, item) => {
8989                    this.ajaxAction(
8990                        this.removeItemFromWishlistUrl,
8991                        { item: item, wishlist_id: list, ...params }
8992                    );
8993                };
8994                this.actionNote = "Choisissez une liste de destination.";
8995                const wishlistItems = items || this.getWishlistItemsForProductId(params.product);
8996                if (wishlistItems.length) {
8997                    if (wishlistItems.length === 1) {
8998                        remove(wishlistItems[0].list, wishlistItems[0].item);
8999                    } else {
9000                        const lists = wishlistItems.map(i => i.list);
9001                        this.excludedListIds = this.getLists().filter(l => !lists.includes(l.wishlist_id)).map(l => l.wishlist_id);
9002                        this.show().then(
9003                            (id) => {
9004                                if (id) {
9005                                    const item = wishlistItems.find(i => i.list == id)?.item;
9006                                    remove(id, item);
9007                                }
9008                            }
9009                        );
9010                    }
9011                }
9012            },
9013
9014            changeItemsToList(actionUrl, params) {
9015                const change = (params) => {
9016                    this.ajaxAction(
9017                        actionUrl,
9018                        { ...params }
9019                    );
9020                };
9021                const listFrom = this.getWishlistById(params?.wishlist_id);
9022                if (listFrom) {
9023                    params['wishlist[name]'] = listFrom.name;
9024                    params['wishlist[type]'] = 0;
9025                    this.excludedListIds = [listFrom.wishlist_id];
9026                    this.show().then(
9027                        (id) => {
9028                            if (id) {
9029                                params.to_wishlist_id = id;
9030                                change(params);
9031                            }
9032                        }
9033                    );
9034                }
9035            },
9036
9037            /**
9038             * May be called within the mwishlist popup (no 'name' provided, will require reloading sections) or
9039             * within the wishlists page ('name' and 'blocks')
9040             */
9041            addNewList(params) {
9042                const name = params?.name || this.newListName;
9043                const color = params?.color || this.newListColor;
9044                this.ajaxAction(
9045                    this.addNewListUrl,
9046                    {
9047                        'wishlist[name]': name,
9048                        'wishlist[color]': color,
9049                        'wishlist[type]': 1,
9050                        ...(params || {})
9051                    },
9052                    () => {
9053                        this.newListActive = false;
9054                        this.newListName = '';
9055                        this.newListColor = '';
9056                    }
9057                );
9058            },
9059
9060            deleteList(params) {
9061                const id = params?.id;
9062                if (id && window.confirm("Êtes-vous sûr(e) de vouloir supprimer cette liste de favoris ?")) {
9063                    this.ajaxAction(
9064                        this.deleteListUrl,
9065                        { 'wishlist_id': id, ...(params || {}) }
9066                    );
9067                }
9068            },
9069
9070            ajaxAction(url, formData) {
9071                this.processing = true;
9072                formData.form_key = hyva.getFormKey();
9073                if (formData?.block === 'customer.wishlist') {
9074                    document.querySelector('.amwishlist-items')?.classList?.add('u-loader');
9075                }
9076                fetch(
9077                    url,
9078                    {
9079                        method: 'POST',
9080                        headers: {
9081                            "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
9082                            'X-Requested-With': 'XMLHttpRequest',
9083                            'pragma': 'no-cache',
9084                            'cache-control': 'no-cache'
9085                        },
9086                        mode: 'cors',
9087                        credentials: 'include',
9088                        body: Object
9089                                .keys(formData)
9090                                .map(value => `${value}=${encodeURIComponent(formData[value])}`)
9091                                .join('&')
9092                    }
9093                ).then(
9094                    (response) => {
9095                        console.log(response);
9096                        this.excludedListIds = [];
9097                        const redirectUrl = formData?.redirect || response?.backUrl;
9098                        if (redirectUrl) {
9099                            window.location.href = redirectUrl;
9100                        }
9101                        if (formData.reload) {
9102                            window.location.reload();
9103                        }
9104                        this.reloadSectionData();
9105                        if (formData.callback && typeof formData.callback === 'function') {
9106                            formData.callback(response);
9107                        }
9108                        if (formData?.block === 'customer.wishlist') {
9109                            document.querySelector('.amwishlist-items')?.classList?.remove('u-loader');
9110                        }
9111                        return response.json()
9112                    }
9113                ).then(
9114                    (response) => {
9115                        if (response.blocks) {
9116                            this.reloadBlocks(response.blocks);
9117                            // self._toggleMassActions();
9118                        }
9119                        /**
9120                        if (document.querySelector('body.checkout-cart-index').length) {
9121                            window.location.reload();
9122                            return true;
9123                        }*/
9124                        this.processing = false;
9125                        this.newListActive = false;
9126                    }
9127                );
9128            },
9129
9130            getWishlistById(id) {
9131                return this.getLists().find((l) => l.wishlist_id == id);
9132            },
9133
9134            getWishlistItem(list, id) {
9135                const wishlist = this.getWishlistById(list);
9136                return wishlist ? wishlist.items.find(i => i.wishlist_item_id == id) : null;
9137            },
9138
9139            extractFormData(formId) {
9140                const form = document.querySelector(formId);
9141                const data = new FormData(form);
9142                let formData = {};
9143                for (let [key, value] of data) {
9144                    if (key.includes('qty') || key.includes('selected') || key.includes('simple_id')) {
9145                        formData[key] = value;
9146                    }
9147                }
9148                return formData;
9149            },
9150
9151            /**
9152             * Get wishlist items for a given product
9153             * return [{list: int, item: int}]
9154             */
9155            getWishlistItemsForProductId(productId) {
9156                const items = [];
9157                this.getLists().forEach(l => {
9158                    const item = l.items.find(i => i.product_id == productId);
9159                    if (item) {
9160                        items.push({ list: l.wishlist_id, item: item.wishlist_item_id });
9161                    }
9162                })
9163                return items;
9164            },
9165
9166            // See https://docs.hyva.io/hyva-themes/writing-code/working-with-sectiondata.html
9167            reloadSectionData() {
9168                hyva.setCookie('mage-cache-sessid', '', -1, true); // remove the cookie
9169                window.dispatchEvent(
9170                    new CustomEvent("reload-customer-section-data")
9171                ); // reload the data
9172            },
9173
9174            reloadBlocks(blocks) {
9175                for (const [name, content] of Object.entries(blocks)) {
9176                    const block = document.createElement('div');
9177                    block.innerHTML = content;
9178                    let selectors = [];
9179                    switch (name) {
9180                        case 'mwishlist.list.contrainer':
9181                            selectors = ['content-tabs-block', 'tabs-block'];
9182                            break;
9183                        case 'customer.wishlist':
9184                            selectors = ['items-block', 'pager'];
9185                            break;
9186                    }
9187                    selectors.forEach((s) => {
9188                        const srcElmt = block.querySelector('[data-amwishlist-js="' + s + '"]');
9189                        const destElmt = document.querySelector('[data-amwishlist-js="' + s + '"]');
9190                        if (srcElmt && destElmt) {
9191                            destElmt.innerHTML = srcElmt.innerHTML;
9192                        }
9193                    });
9194                }
9195            }
9196        }
9197    }
9198</script>
9198
9199<aside x-data="initMWishlistPopup()"
9200       x-bind="eventListeners"
9201       class="amwishlist-popup-block"
9202>
9203<div x-cloak
9204         x-bind="overlay()"
9205         class="w-screen fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-modal"
9206    >
9207<div x-ref="dialog"
9208             role="dialog"
9209             class="relative inline-block w-full md:max-w-xl m-2 overflow-auto bg-white shadow-xl rounded-lg p-4"
9210        >
9211<div x-focus-first
9212                 @click.prevent="hide()"
9213                 class="absolute top-2 right-2 cursor-pointer"
9214            >
9215<svg class="w-8 h-8 text-primary cursor-pointer">
9216                    <use xlink:href="#close-symbol"></use>
9217                </svg>
9218</div>
9219<div>
9220<div class="amwishlist-title mb-8">
9221<p class="amwishlist-header mb-4 text-lg font-bold text-center">
9222Vos listes de favoris                    </p>
9223</div>
9224<p x-html="actionNote"
9225                   x-show="actionNote"
9226                   class="my-2 text-sm"></p>
9227
9228<div class="amwishlist-tabs-block -block flex flex-col gap-2 max-h-[250px] overflow-y-auto pr-4 font-sm">
9229<template x-for="(list, index) in getLists()"
9230                              :key="list.wishlist_id"
9231                    >
9232<div @click.prevent="hide(list.wishlist_id)"
9233                             :class="{ 'hidden': excludedListIds.includes(list.wishlist_id), ['wishlist-' + index]: true }"
9234                             class="wishlist-list inline-flex flex-row items-center justify-between p-2 border border-border-lighter rounded-xl text-sm cursor-pointer hover:shadow-xl"
9235                             :style="`background-color: ${list.color}; color: ${getTextColorForBackground(list.color) || '#000000'}`"
9236                             list="presets"
9237                        >
9238<span>
9239<span x-text="list.name"
9240                                      class="font-bold leading-tight hover:underline"></span>
9241<span class="text-xs">
9242<span x-text="list.items_count"></span>
9243<span x-show="list.items_count < 2">article</span>
9244<span x-show="list.items_count > 1">articles</span>
9245</span>
9246</span>
9247<button class="btn btn-secondary btn-size-xs">
9248<span x-show="list.isIn">Supprimer</span>
9249<span x-show="!list.isIn">Ajouter</span>
9250</button>
9251</div>
9252</template>
9253</div>
9254
9255<div class="amwishlist-list-block amwishlist-newlist-block my-4">
9256<div @click.prevent="newListActive = !newListActive; $nextTick(() => {if (newListActive) {$refs?.newListInput?.focus();}})"
9257                         class="mt-8 cursor-pointer"
9258                    >
9259<span class="text-2xl">+</span>
9260<span class="hover:underline">
9261Créer une nouvelle liste                        </span>
9262</div>
9263
9264<div x-show="newListActive"
9265                         class="amwishlist-newlist flex flex-col xs:flex-row gap-4 items-center justify-between my-2"
9266                    >
9267<div class="form-field field required grow">
9268<label class="label"
9269                                   for="wishlist-name"
9270                            >
9271<span>Nom de la liste<sup>*</sup></span>
9272</label>
9273<div class="control">
9274<input x-model="newListName"
9275                                       name="wishlist-name"
9276                                       type="text"
9277                                       class="amwishlist-input form-input"
9278                                       maxlength="32"
9279                                       required
9280                                />
9281</div>
9282</div>
9283<span class="flex items-center gap-2 justify-center">
9284<input x-model="newListColor"
9285                                   type="color"
9286                                   class="w-8 h-8"
9287                                   required
9288                            />
9289<button @click.prevent="$dispatch('create-new-wishlist')"
9290                                    class="amwishlist-button btn btn-primary btn-size-sm"
9291                                    type="button"
9292                            >
9293Créer                            </button>
9294</span>
9295</div>
9296</div>
9297</div>
9298</div>
9299</div>
9300</aside>
9301<script>
9302    function hyvaModalContent() {
9303        return {
9304            modalContentElement: document.querySelector('#hyva-modal-content [data-role="content"]'),
9305            isFullScreen: false,
9306            aspectRatio: 'auto',
9307
9308            loadContent(content) {
9309                var content = event?.detail;
9310                switchBodyOverflow(false); /** see js-library.phtml */
9311                this.modalContentElement.innerHTML = '';
9312                const element = content?.template || content;
9313                let popupContent = '';
9314                try {
9315                    const contentElement = document.querySelector(element);
9316                    if (contentElement instanceof HTMLElement) {
9317                        this.isFullScreen = contentElement.hasAttribute('data-zoom');
9318                        this.aspectRatio = this.isFullScreen ? contentElement.getAttribute('data-zoom') || 'auto' : 'auto';
9319                        if (contentElement.tagName === 'TEMPLATE') {
9320                            popupContent = contentElement.content.children[0].cloneNode(true);
9321                        } else {
9322                            popupContent = contentElement.innerHTML;
9323                        }
9324                    }
9325                } catch(error) {
9326                    popupContent = content?.innerHTML || content;
9327                } finally {
9328                    if (popupContent) {
9329                        popupContent instanceof HTMLElement ?
9330                            this.modalContentElement.append(popupContent) :
9331                            this.modalContentElement.innerHTML = popupContent;
9332                        this.processContent();
9333                        this.show();
9334                        typeof content?.callback === 'function' && content?.callback();
9335                    }
9336                }
9337            },
9338
9339            processContent() {
9340                const srcs = this.modalContentElement.querySelectorAll('[src]');
9341                for (let i = 0; i < srcs.length; ++i) {
9342                    const src = srcs[i];
9343                    src.classList.add('u-loader', 'w-full');
9344                    src.onload = () => {src.classList.remove('u-loader')};
9345                }
9346            },
9347
9348            // We stop all possible players before closing popup
9349            shutAndClose() {
9350                this.hide();
9351                setTimeout(() => {
9352                    switchBodyOverflow(true);
9353                    this.modalContentElement.innerHTML = '';
9354                }, 500);
9355            },
9356
9357            getModalClasses() {
9358                return {
9359                    'max-h-screen-75 overflow-auto': !this.isFullScreen,
9360                    'min-w-xs max-h-screen overflow-none': this.isFullScreen
9361                }
9362            },
9363
9364            getModalStyle() {
9365                return {'aspect-ratio': this.isFullScreen ? this.aspectRatio : 'auto'}
9366            },
9367
9368            getContainerClass() {
9369                return {
9370                    'overflow-auto': !this.isFullScreen,
9371                    'h-full': this.isFullScreen
9372                }
9373            },
9374
9375            getContentClass() {
9376                return {'h-full': this.isFullScreen}
9377            }
9378        }
9379    }
9380
9381    window.addEventListener(
9382        'alpine:init',
9383        () => Alpine.data(
9384            'initHyvaModalContent', () => {
9385                return Object.assign(
9386                    hyva.modal.call(this),
9387                    hyvaModalContent()
9388                );
9389            }
9390        ),
9391        {once: true}
9392    );
9393</script>
9393
9394
9395<div x-data="initHyvaModalContent"
9396     x-defer="idle"
9397     id="hyva-modal-content"
9398     @open-modal-content.window="loadContent"
9399     @close-modal-content.window="shutAndClose"
9400>
9401<div x-cloak
9402         x-bind="overlay"
9403         class="w-screen fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-modal"
9404    >
9405<div x-ref="dialog"
9406             role="dialog"
9407             @click.outside.prevent.stop="shutAndClose"
9408             class="relative w-full sm:w-3/4 md:w-1/2 xl:w-1/3 p-4 sm:p-8 xl:p-12 bg-white shadow-2xl rounded-lg"
9409             :class="getModalClasses"
9410             :style="getModalStyle"
9411        >
9412<div x-focus-first
9413                 @click="shutAndClose"
9414                 class="absolute z-1 top-1 right-1 bg-white cursor-pointer"
9415            >
9416<svg class="w-6 sm:w-8 h-6 sm:h-8 text-primary hover:text-primary-lighter">
9417                    <use xlink:href="#close-symbol"></use>
9418                </svg>
9419</div>
9420<div class="max-sm:text-sm"
9421                 :class="getContainerClass"
9422            >
9423<div data-role="content"
9424                     :class="getContentClass"
9425                ></div>
9426</div>
9427</div>
9428</div>
9429</div>
9430<script>
9431    (function () {
9432        if (! window.hyva || ! window.hyva.modal) {
9433            return;
9434        }
9435
9436                window.hyva.modal.legacyModalCompatibility = true;
9437
9438        const refElement = frame =>
9439            frame && frame.instance && frame.instance.$refs && frame.instance.$refs[frame.name];
9440
9441        const isLegacyElement = el => !! el && el.tagName !== 'DIALOG';
9442
9443        const isOverlayDisabled = el => !! el && el.hasAttribute('x-no-overlay');
9444
9445                window.hyva.modal.eventListeners = Object.assign(window.hyva.modal.eventListeners || {}, {
9446            keydown: event => {
9447                if (event.key !== 'Escape') {
9448                    return;
9449                }
9450                const frame = window.hyva.modal.peek();
9451                if (frame && isLegacyElement(refElement(frame))) {
9452                    frame.instance.hide();
9453                }
9454            },
9455            click: event => {
9456                const frame = window.hyva.modal.peek();
9457                const dialog = refElement(frame);
9458                if (! frame || ! isLegacyElement(dialog)) {
9459                    return;
9460                }
9461                if (frame.time + 50 < Date.now() &&                     ! isOverlayDisabled(dialog) &&
9462                    ! dialog.contains(event.target)
9463                ) {
9464                    frame.instance.hide();
9465                }
9466            }
9467        });
9468
9469        document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown);
9470        document.addEventListener('click', window.hyva.modal.eventListeners.click);
9471
9472                window.hyva.modal = new Proxy(window.hyva.modal, {
9473            apply(target, thisArg, args) {
9474                const instance = Reflect.apply(target, thisArg, args);
9475
9476                const originalShow = instance.show;
9477                instance.show = function (dialog, trigger) {
9478                    const frameBefore = window.hyva.modal.peek();
9479                    const openerCandidate = document.activeElement;
9480                    const result = originalShow.call(this, dialog, trigger);
9481                    const frame = window.hyva.modal.peek();
9482                    if (! frame || frame === frameBefore) {
9483                        return result;                     }
9484                    const el = refElement(frame);
9485                    if (isLegacyElement(el)) {
9486                        frame.legacyFocusTarget = openerCandidate;
9487                        if (! isOverlayDisabled(el)) {
9488                            document.body.classList.add('overflow-hidden');
9489                            this.$nextTick
9490                                ? this.$nextTick(() => hyva.trapFocus(el))
9491                                : hyva.trapFocus(el);
9492                        }
9493                        window.setTimeout(() => {
9494                            const focusFirst = el.querySelector('[x-focus-first]');
9495                            focusFirst && focusFirst.focus();
9496                        }, 50);
9497                    }
9498                    return result;
9499                };
9500
9501                const originalHide = instance.hide;
9502                instance.hide = function (value) {
9503                    const frame = window.hyva.modal.peek();
9504                    const el = refElement(frame);
9505                    const wasLegacy = frame && isLegacyElement(el);
9506                    const result = originalHide.call(this, value);
9507                    if (! wasLegacy || window.hyva.modal.peek() === frame) {
9508                        return result;                     }
9509                    hyva.releaseFocus(el);
9510
9511                    const next = window.hyva.modal.peek();
9512                    const nextEl = next ? refElement(next) : null;
9513                    if (isLegacyElement(nextEl) && ! isOverlayDisabled(nextEl)) {
9514                        hyva.trapFocus(nextEl);
9515                    } else {
9516                        document.body.classList.remove('overflow-hidden');
9517                    }
9518
9519                    const focusTarget = frame.legacyFocusTarget;
9520                    focusTarget && window.setTimeout(() =>
9520 focusTarget.focus(), 50);
9521
9522                    return result;
9523                };
9524
9525                return instance;
9526            }
9527        });
9528    })();
9529</script>
vendor: 1 bytes, line 9529
9529
9530<script>
9531document.addEventListener('alpine:init', () => {
9532    Alpine.store('amwishlist', {
9533        lists: [],
9534        loaded: false,
9535        init() {
9536            window.addEventListener(
9537                "private-content-loaded",
9538                (event) => {
9539                    this.loaded = true;
9540                    this.lists = event.detail.data?.mwishlist?.wishlist_list?.[1] || [];
9541                    Alpine.nextTick(() => {
9542                        window.dispatchEvent(new CustomEvent("amwishlist-alpine-init"))
9543                    });
9544                }
9545            );
9546        }
9547    });
9548
9549    Alpine.data('vmAMWishlist', (id, fn = null) => ({
9550        id: id,
9551        callback: fn,
9552        get isIn() {
9553            return Alpine.store('amwishlist').loaded
9554                && Alpine.store('amwishlist').lists.filter(l => l.items.find(i => i.product_id == id)).length > 0;
9555        },
9556        get title() {
9557            return this.isIn ? "Enlever de vos favoris" :
9558                "Ajouter à mes listes d’envie";
9559        },
9560        get color() {
9561            return Alpine.store('amwishlist').loaded
9562                && (Alpine.store('amwishlist').lists.find(l => l.items.find(i => i.product_id == id))?.color || '');
9563        },
9564
9565        trigger: {
9566            ['@click.prevent']() {
9567                if (Alpine.store('amwishlist').loaded) {
9568                    this.$dispatch('update-product-in-wishlist', {
9569                        'product': this.id,
9570                        'callback': this.callback
9571                    });
9572                }
9573            }
9574        }
9575    }))
9576})
9577</script>
9577
9578
9579<script>
9580    'use strict';
9581    (() => {
9582        function _calculateStrength({elementID, valid}) {
9583            const password = document.getElementById(elementID),
9584                emailElm = document.getElementById('email_address');
9585            let displayScore;
9586            // Display score is based on combination of whether password is empty, valid, and zxcvbn strength
9587            if (!password || !password.value) {
9588                displayScore = 0;
9589            } else {
9590                // We should only perform this check in case there is an email field on screen
9591                if (emailElm && password.value && emailElm.value &&
9592                    password.value.toLowerCase() === emailElm.value.toLowerCase()) {
9593                    displayScore = 1;
9594                } else {
9595                    const zxcvbnScore = zxcvbn(password.value).score;
9596                    displayScore = valid && zxcvbnScore > 0 ? zxcvbnScore : 1;
9597                }
9598            }
9599
9600            _displayStrength(displayScore);
9601        }
9602
9603        function _displayStrength(displayScore) {
9604            let strengthLabel = '',
9605                className;
9606
9607            switch (displayScore) {
9608                case 0:
9609                    strengthLabel = "Aucun\u0020mot\u0020de\u0020passe";
9610                    className = 'password-none';
9611                    break;
9612
9613                case 1:
9614                    strengthLabel = "Faible";
9615                    className = 'password-weak';
9616                    break;
9617
9618                case 2:
9619                    strengthLabel = "Moyen";
9620                    className = 'password-medium';
9621                    break;
9622
9623                case 3:
9624                    strengthLabel = "Elev\u00E9";
9625                    className = 'password-strong';
9626                    break;
9627
9628                case 4:
9629                    strengthLabel = "Tr\u00E8s\u0020\u00E9lev\u00E9";
9630                    className = 'password-very-strong';
9631                    break;
9632            }
9633            const meterElm = document.getElementById('password-strength-meter-container'),
9634                meterLabelElm = document.getElementById('password-strength-meter-label');
9635            meterElm.className = '';
9636            meterElm.classList.add(className);
9637            meterLabelElm.textContent = strengthLabel;
9638        }
9639
9640        let loading = false;
9641        const callbacks = [];
9642
9643        function loadZxcvbn(cb) {
9644            callbacks.push(cb);
9645            if (loading) return;
9646            loading = true;
9647
9648            const script = document.createElement('script');
9649            script.type = 'text/javascript';
9650            script.src = 'https\u003A\u002F\u002Fwww.jardindupicvert.com\u002Fstatic\u002Fversion1790796154\u002Ffrontend\u002FPicVert\u002Fhyva\u002Ffr_FR\u002Fjs\u002Fzxcvbn.min.js';
9651            script.async = true;
9652            script.onload = () => callbacks.forEach(cb => cb());
9653            document.head.appendChild(script);
9654        }
9655
9656        window.addEventListener('password-validate', function (evt) {
9657            const meterElm = document.getElementById('password-strength-meter-container'),
9658                meterLabelElm = document.getElementById('password-strength-meter-label');
9659            if (meterElm && meterLabelElm) {
9660                if (evt.detail && evt.detail.elementID) {
9661                    const cb = () => _calculateStrength(evt.detail);
9662                    window.zxcvbn ? cb() : loadZxcvbn(cb)
9663                }
9664            }
9665        });
9666
9667
9668        document.addEventListener('DOMContentLoaded', () => {
9669            hyva && hyva.formValidation && hyva.formValidation.addRule('password-strength', function(value, options, field, context) {
9670                let counter = 0;
9671                const minCharacterSets = options.minCharacterSets !== undefined ?  options.minCharacterSets : 1;
9672                if (value.match(/\d+/)) {
9673                    counter++;
9674                }
9675
9676                if (value.match(/[a-z]+/)) {
9677                    counter++;
9678                }
9679
9680                if (value.match(/[A-Z]+/)) {
9681                    counter++;
9682                }
9683
9684                if (value.match(/[^a-zA-Z0-9]+/)) {
9685                    counter++;
9686                }
9687
9688                queueMicrotask(() => {
9689                    window.dispatchEvent(new CustomEvent('password-validate', { detail: {
9690                            elementID: field.element.id || 'password',
9691                            valid: field.state.valid
9692                        }}));
9693                });
9694
9695                if (counter < minCharacterSets) {
9696                    const missing = minCharacterSets - counter;
9697                    return hyva.str('The\u0020password\u0020must\u0020include\u0020at\u0020least\u0020\u00251\u0020or\u0020more\u0020of\u003A\u0020uppercase\u0020\u0028A\u002DZ\u0029,\u0020lowercase\u0020\u0028a\u002Dz\u0029,\u0020number\u0020and\u0020symbol.', missing);
9698                }
9699                return true;
9700            });
9701        })
9702    })();
9703
9704</script>
vendor: 1 bytes, line 9704
9704
9705<script>
9706    function initDealCountDown(flashSaleData) {
9707        return {
9708            from: flashSaleData?.from || 0,
9709            expiry: flashSaleData?.to || 0,
9710            qty: flashSaleData?.qty || 0,
9711            isPending: false,
9712            isEnded: false,
9713            fromFormatted: null,
9714            remainingTime: null,
9715            days: 0,
9716            hours: 0,
9717            minutes: 0,
9718            seconds: 0,
9719
9720            init() {
9721                const now = new Date().getTime() / 1000;
9722                const fromDate = new Date(this.from * 1000);
9723                this.fromFormatted = ('0' + fromDate.getDate()).substr(-2) + '/' + ('0' + (fromDate.getMonth() + 1)).substr(-2) + '/' + fromDate.getFullYear();
9724                this.isPending = this.from > now;
9725                this.isEnded = !this.isPending && now > this.expiry;
9726                if (!this.isPending && !this.isEnded) {
9727                    this.updateRemainingTime();
9728                    let delay;
9729                    if (this.days) {
9730                        delay = 3600000;
9731                    } else if (this.hours) {
9732                        delay = 60000;
9733                    } else {
9734                        delay = 1000;
9735                    }
9736                    setInterval(() => {
9737                        this.updateRemainingTime();
9738                    }, delay);
9739                }
9740            },
9741
9742            updateRemainingTime() {
9743                this.remainingTime = parseInt(this.expiry - new Date().getTime() / 1000);
9744                let remaining = this.remainingTime;
9745                const d = Math.floor(this.remainingTime / 86400);
9746                this.days = d;
9747                remaining -= (86400 * d);
9748                const h = Math.floor(remaining / 3600);
9749                this.hours = h;
9750                remaining -= (3600 * h);
9751                const m = Math.floor(remaining / 60);
9752                this.minutes = m;
9753                remaining -= 60 * m;
9754                this.seconds = remaining;
9755            },
9756        };
9757    }
9758</script>
vendor: 1 bytes, line 9758
9758
9759<script>
9760document.addEventListener('alpine:init', () => {
9761    Alpine.data('vmMinisearch', () => ({
9762        show: false,
9763        input: "",
9764        url: "https://www.jardindupicvert.com/search/ajax/suggest/",
9765        templates: null,
9766        minSearchLength: 1,
9767        searchResultsByType: {},
9768        currentRequest: null,
9769
9770        getSearchResults: function () {
9771            let value = this.input.trim();
9772            if (value.length < parseInt(this.minSearchLength, 10)) {
9773                this.searchResultsByType = [];
9774                this.show = false;
9775                return false;
9776            }
9777            let url = this.url + '?' + new URLSearchParams({q: value, _: Date.now()}).toString();
9778            if (this.currentRequest !== null) {
9779                this.currentRequest.abort();
9780            }
9781            this.currentRequest = new AbortController();
9782
9783            fetch(url, {
9784                method: 'GET',
9785                signal: this.currentRequest.signal,
9786            }).then((response) => {
9787                if (response.ok) {
9788                    return response.json();
9789                }
9790            }).then((data) => {
9791                this.show = data.length > 0;
9792                // we restrict result types and force order
9793                this.searchResultsByType = data.reduce((acc, result) => {
9794                    if (acc?.[result.type]) acc[result.type].push(result);
9795                    return acc;
9796                }, {category: [], product: [], term: [], blog_post: []});
9797            }).catch((error) => {
9798                console.log(error);
9799            })
9800        },
9801
9802        formatOutput(text) {
9803            let value = text.replace(this.input, '<span class="font-normal">' + this.input + '</span>');
9804            const upperValue = this.input[0].toUpperCase() + this.input.substring(1);
9805            return value.replace(upperValue, '<span class="font-normal">' + upperValue + '</span>');
9806        }
9807    }));
9808})
9809</script>
vendor: 1 bytes, line 9809
9809
9810<script async src="//l.getsitecontrol.com/4m3x2om7.js"></script>
vendor: 1 bytes, line 9810
9810
9811<script type="text/json" id="default-section-data">
9812    {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorre"},"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"}}},"BE":{"name":"Belgique"},"BG":{"name":"Bulgarie"},"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"}}},"CY":{"name":"Chypre"},"CZ":{"name":"Tch\u00e9quie","regions":{"736":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"744":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"738":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"743":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"741":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"740":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"747":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"745":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"742":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"737":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"734":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"735":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"739":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"746":{"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"}}},"DK":{"name":"Danemark","regions":{"546":{"code":"DK-84","name":"Hovedstaden"},"547":{"code":"DK-82","name":"Midtjylland"},"548":{"code":"DK-81","name":"Nordjylland"},"549":{"code":"DK-85","name":"Sj\u00e6lland"},"550":{"code":"DK-83","name":"Syddanmark"}}},"EE":{"name":"Estonie","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"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"}}},"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"}
9812,"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"}}},"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"}}},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"},"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"}
9812,"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"}}},"GR":{"name":"Gr\u00e8ce","regions":{"588":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"575":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"576":{"code":"GR-I","name":"Attik\u00ed"},"577":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"578":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"579":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"580":{"code":"GR-D","name":"\u00cdpeiros"},"581":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"582":{"code":"GR-M","name":"Kr\u00edti"},"583":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"584":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"585":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"},"586":{"code":"GR-E","name":"Thessal\u00eda"},"587":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"HR":{"name":"Croatie"},"HU":{"name":"Hongrie"},"IE":{"name":"Irlande"},"IS":{"name":"Islande","regions":{"605":{"code":"IS-07","name":"Austurland"},"599":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"604":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"603":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"606":{"code":"IS-08","name":"Su\u00f0urland"},"600":{"code":"IS-02","name":"Su\u00f0urnes"},"602":{"code":"IS-04","name":"Vestfir\u00f0ir"},"601":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italie"},"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"}
9812,"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"}
9812,"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"}}},"MC":{"name":"Monaco"},"MT":{"name":"Malte"},"NL":{"name":"Pays-Bas"},"PL":{"name":"Pologne"},"PT":{"name":"Portugal","regions":{"651":{"code":"PT-01","name":"Aveiro"},"652":{"code":"PT-02","name":"Beja"},"653":{"code":"PT-03","name":"Braga"},"654":{"code":"PT-04","name":"Bragan\u00e7a"},"655":{"code":"PT-05","name":"Castelo Branco"},"656":{"code":"PT-06","name":"Coimbra"},"657":{"code":"PT-07","name":"\u00c9vora"},"658":{"code":"PT-08","name":"Faro"},"659":{"code":"PT-09","name":"Guarda"},"660":{"code":"PT-10","name":"Leiria"},"661":{"code":"PT-11","name":"Lisboa"},"662":{"code":"PT-12","name":"Portalegre"},"663":{"code":"PT-13","name":"Porto"},"670":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"669":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"664":{"code":"PT-14","name":"Santar\u00e9m"},"665":{"code":"PT-15","name":"Set\u00fabal"},"666":{"code":"PT-16","name":"Viana do Castelo"},"667":{"code":"PT-17","name":"Vila Real"},"668":{"code":"PT-18","name":"Viseu"}}},"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"}}},"SE":{"name":"Su\u00e8de","regions":{"681":{"code":"SE-K","name":"Blekinge l\u00e4n"}
9812,"682":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"684":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"683":{"code":"SE-I","name":"Gotlands l\u00e4n"},"685":{"code":"SE-N","name":"Hallands l\u00e4n"},"686":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"687":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"688":{"code":"SE-H","name":"Kalmar l\u00e4n"},"689":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"690":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"700":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"701":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"691":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"693":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"692":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"694":{"code":"SE-C","name":"Uppsala l\u00e4n"},"695":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"696":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"697":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"698":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"699":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SI":{"name":"Slov\u00e9nie"},"SK":{"name":"Slovaquie"},"SM":{"name":"Saint-Marin"},"VA":{"name":"\u00c9tat de la Cit\u00e9 du Vatican"},"data_id":1790934894},"captcha":[],"loggedAsCustomer":[],"persistent":[],"review":[],"wishlist":{"items":[]},"mwishlist":[],"ammessages":[],"rewards":[],"webcooking-gtm-events":[],"hyva_checkout":[],"payplug-payments-cards":[],"papercatalog":[],"stock_alert":[],"purchase_products":[],"plantfit":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[],"meta_pixel_events":[],"openai_ads_events":[],"openai_ads_user":[],"pinterest_events":[]}</script>
9812
9813<section id="customer-drawer"
9814         x-data="initDrawer('#customer-menu')"
9815         @toggle-customer-panel.window="toggle(true)"
9816         x-bind="drawerListeners"
9817         :class="{ 'is-open': open }"
9818         x-cloak
9819         data-type="drawer"
9820>
9821<div class="backdrop hidden"
9822         @click="toggle(false)"
9823         aria-label="Close panel"
9824    ></div>
9825<div class="top-0"
9826         role="dialog"
9827         aria-modal="true"
9828         aria-describedby="customer-drawer-title"
9829    >
9830<div class="drawer-content">
9831<div class="absolute top-0 right-2">
9832<button @click="toggle(false)"
9833                        aria-label="Close panel"
9834                >
9835<span class="text-4xl">×</span>
9836</button>
9837</div>
9838<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto">
9839<header>
9840<p id="customer-drawer-title"
9841                       class="flex items-center gap-2 text-lg font-bold"
9842                    >
9843<svg class="w-8 h-8 p-1"><use xlink:href="#account-symbol"></use></svg>
9844Mon compte                    </p>
9845</header>
9846<!-- BLOCK customer-drawer.navigation --><div id="hello-customer"
9847     class="block account-nav my-4"
9848>
9849<p>
9850Bonjour <span x-text="$store.customer.fullName"></span>
9851</p>
9852
9853<nav x-data
9854         class="flex flex-col border-t border-primary-lighter py-4 gap-4"
9855    >
9856<ul class="flex flex-col gap-2"><li :class="{'active': location.pathname === '/customer/account/'}"
9857>
9858<a href="https://www.jardindupicvert.com/customer/account/">
9859<span>Mon espace client</span>
9860<span class="go">&rarr;</span>
9861</a>
9862</li>
9863<li :class="{'active': 0 === location.pathname.indexOf('/mwishlist/')}">
9864<a href="https://www.jardindupicvert.com/mwishlist/">
9865<span>Mes produits favoris</span>
9866<span x-show="0 !== location.pathname.indexOf('/mwishlist/')">&rarr;</span>
9867</a>
9868</li>
9869<li :class="{'active': location.pathname === '/sales/order/history/'}">
9870<a href="https://www.jardindupicvert.com/sales/order/history/">
9871<span>Suivre mes commandes</span>
9872<span class="go">&rarr;</span>
9873</a>
9874</li>
9875<li :class="{'active': location.pathname === '/contact/'}">
9876<a href="https://www.jardindupicvert.com/contact/">
9877<span>Contacter le service client</span>
9878<span class="go">&rarr;</span>
9879</a>
9880</li>
9881<li class="mt-2 pt-4 border-primary-lighter border-t">
9882<a class="flex items-center !justify-start gap-2 text-alert"
9883       href="https://www.jardindupicvert.com/customer/account/logout/"
9884    >
9885<svg class="w-6 h-6"><use xlink:href="#logout-symbol"></use></svg>
9886<span>Déconnexion</span>
9887</a>
9888</li>
9889</ul>    </nav>
9890</div>
9891<!-- /BLOCK customer-drawer.navigation -->            </div>
9892</div>
9893</div>
9894</section>
9895<section id="amwishlist-drawer"
9896         x-data="initDrawer('#wishlist-menu')"
9897         @toggle-wishlist-panel.window="toggle(true)"
9898         x-bind="drawerListeners"
9899         x-defer="event:amwishlist-alpine-init"
9900         x-cloak
9901         :class="{ 'is-open': open }"
9902         data-type="drawer"
9903>
9904<div class="backdrop hidden"
9905         @click="toggle(false)"
9906         aria-label="Close panel"
9907    ></div>
9908<div class="top-0"
9909         role="dialog"
9910         aria-modal="true"
9911         aria-describedby="drawer-wishlist-title"
9912    >
9913<div class="drawer-content">
9914<div class="absolute top-0 right-2">
9915<button @click="toggle(false)"
9916                        aria-label="Close panel"
9917                >
9918<span class="text-4xl">&times;</span>
9919</button>
9920</div>
9921<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto">
9922<header>
9923<p id="drawer-wishlist-title"
9924                       class="flex items-center gap-2 text-lg font-bold"
9925                    >
9926<svg class="w-8 h-8 p-1"><use xlink:href="#heart-empty-symbol"></use></svg>
9927Mes listes de favoris                    </p>
9928</header>
9929<div class="my-8">
9930<p x-show="$store.amwishlist.lists.length === 1">
9931Vous avez une liste de favoris                    </p>
9932<p x-show="$store.amwishlist.lists.length > 1"
9933                       x-html="hyva.str(`Vous avez %1 listes de favoris`, $store.amwishlist.lists.length)">
9934</p>
9935<p class="flex items-center justify-end gap-1 text-xs">
9936<svg class="w-4 h-4">
9937                            <use xlink:href="#edit-symbol"></use>
9938                        </svg>
9939<a href="https://www.jardindupicvert.com/mwishlist/"
9940                           title="G&#xE9;rer&#x20;mes&#x20;listes&#x20;de&#x20;favoris"
9941                        >
9942G&#xE9;rer&#x20;mes&#x20;listes&#x20;de&#x20;favoris                        </a>
9943</p>
9944<ul class="flex flex-col h-full py-6 px-4 sm:px-6 bg-white overflow-y-auto">
9945<template x-for="list in $store.amwishlist.lists">
9946<li class="flex items-center gap-2">
9947<span class="w-4 h-4 rounded-full border border-border-lighter shrink-0"
9948                                      :style="'background-color: ' + list.color">
9949</span>
9950<a :href="'https://www.jardindupicvert.com/mwishlist/wishlist/index/wishlist_id/' + list.wishlist_id "
9951                                   class="u-text-ellipsis hover:underline cursor-pointer"
9952                                   title="Consulter"
9953                                >
9954<span x-text="list.name"></span>
9955</a>
9956</li>
9957</template>
9958</ul>
9959</div>
9960</div>
9961</div>
9962</div>
9963</section>
9964<script>
9965    function initCartDrawer() {
9966        return {
9967            loading: false,
9968            maxItemsToDisplay: 999,
9969            summaryCount: -1,
9970            showMergedCartMessage: true,
9971
9972            init() {
9973                window.addEventListener(
9974                    "private-content-loaded",
9975                    (event) => {
9976                        event.detail?.data?.cart?.items
9977                            && !window.location.pathname.startsWith('/checkout/cart')
9978                            && this.summaryCount !== -1
9979                            && this.summaryCount != event.detail.data.cart.summary_count
9980                            && window.dispatchEvent(new CustomEvent('toggle-cart-panel'));
9981                        this.summaryCount = event.detail?.data?.cart?.summary_count || 0;
9982                        this.showMergedCartMessage = event.detail?.data?.cart?.items?.some(i => i?.merged_qty > 0);
9983                    }
9984                );
9985            },
9986
9987            cartItems() {
9988                const items = Alpine.store('minicart').cart.items || [];
9989                if (this.maxItemsToDisplay > 0) {
9990                    return items.slice(0, this.maxItemsToDisplay);
9991                }
9992                return items;
9993            },
9994
9995            deleteItemFromCart(itemId) {
9996                this.loading = true;
9997                fetch(BASE_URL + 'checkout/sidebar/removeItem/', {
9998                    "headers": {
9999                        "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
10000                    },
10001                    "body": "form_key=" + hyva.getFormKey() + "&item_id=" + itemId,
10002                    "method": "POST",
10003                    "mode": "cors",
10004                    "credentials": "include"
10005                }).then(response => {
10006                    if (response.redirected) {
10007                        window.location.href = response.url;
10008                    } else if (response.ok) {
10009                        return response.json();
10010                    } else {
10011                        window?.dispatchMessages([{
10012                            type: 'error',
10013                            text: 'Impossible\u0020de\u0020supprimer\u0020cet\u0020article\u0020du\u0020panier.'
10014                        }]);
10015                    }
10016                }).then(result => {
10017                    window?.dispatchMessages([{
10018                        type: result.success ? 'success' : 'error',
10019                        text: result.success
10020                            ? 'Article\u0020retir\u00E9\u0020du\u0020panier.'
10021                            : result.error_message
10022                    }], result.success ? 5000 : 0)
10023                    window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
10024                }).finally(() => {
10025                    this.loading = false;
10026                });
10027            }
10028        }
10029    }
10030</script>
10030
10031<section id="cart-drawer"
10032         x-data="{ ...initDrawer('#cart-menu'), ...initCartDrawer() }"
10033         @toggle-cart-panel.window="toggle(true)"
10034         @keydown.window.escape="toggle(false)"
10035         @close-merged-cart-popup.window="showMergedCartMessage = false"
10036         x-bind="drawerListeners"
10037         :class="{ 'is-open': open }"
10038         x-cloak
10039         data-type="drawer"
10040>
10041<template x-if="$store?.minicart?.cart?.items">
10042<div>
10043<div class="backdrop hidden"
10044                 @click="toggle(false)"
10045                 aria-label="Close panel"
10046            ></div>
10047<div class="top-0"
10048                 role="dialog"
10049                 aria-labelledby="cart-drawer-title"
10050                 aria-modal="true"
10051            >
10052<div class="drawer-content">
10053<div class="absolute top-0 right-2">
10054<button @click="toggle(false)"
10055                                aria-label="Close panel"
10056                        >
10057<span class="text-4xl">&times;</span>
10058</button>
10059</div>
10060<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto"
10061                         :class="{ 'u-loader': loading }"
10062                    >
10063<header>
10064<p id="cart-drawer-title"
10065                               class="flex items-center gap-2 text-lg font-bold"
10066                            >
10067<svg class="w-8 h-8 p-1"><use xlink:href="#basket-symbol"></use></svg>
10068Mon panier                                <span class="items-total text-xs"
10069                                      x-show="$store?.minicart.cart.items.length && maxItemsToDisplay && maxItemsToDisplay < $store.minicart.cart.items.length"
10070                                      x-text="hyva.strf('(%0 sur %1)', maxItemsToDisplay, $store.minicart.cart.items.length)">
10071</span>
10072</p>
10073</header>
10074<div x-show="showMergedCartMessage"
10075                             x-cloak
10076                             class="p-2 border-2 rounded-lg text-xs leading-tight"
10077                        >
10078Nous avons fusionné vos paniers !                            Les articles mis au panier lors d&#039;une précédente visite ont été récupérés.                        </div>
10079<div class="relative grid gap-2 overflow-y-auto bg-white border-b border-container">
10080<div x-show="!$store.minicart.cart.summary_count">
10081<p>Votre panier est vide.</p>
10082</div>
10083<template x-for="item in cartItems()">
10084<div class="grid grid-cols-4 gap-2 p-2 text-sm md:text-base border-2"
10085                                     :class="showMergedCartMessage && item.merged_qty > 0 ? 'rounded-lg' : 'border-white'"
10086                                >
10087<a :href="item.product_url"
10088                                       class="col-start-1 col-end-2"
10089                                    >
10090<img :src="item.product_image.src"
10091                                             :width="item.product_image.width"
10092                                             :height="item.product_image.height"
10093                                             :alt="item.product_name"
10094                                             loading="lazy"
10095
10096                                        />
10097</a>
10098<div class="col-span-2">
10099<div>
10100<p class="leading-tight font-bold">
10101<a :href="item.product_url">
10102<span x-html="item.product_name"></span>
10103</a>
10104</p>
10105<p x-html="item.product_conditionnement"
10106                                               class="text-xs"
10107                                            ></p>
10108<p class="text-xs">
10109Quantité: <span x-html="item.qty"></span>
10110</p>
10111</div>
10112</div>
10113<div class="col-start-4">
10114<div class="flex flex-col justify-end mb-2">
10115<p class="text-right font-bold">
10116<span x-html="item.product_price"></span>
10117</p>
10118<div class="flex items-center justify-end gap-2">
10119<button class="inline-flex"
10120                                                        @click="deleteItemFromCart(item.item_id)"
10121                                                        title="Supprimer"
10122                                                >
10123<svg class="w-5 h-5">
10124                                                        <use xlink:href="#delete-symbol"></use>
10125                                                    </svg>
10126</button>
10127</div>
10128</div>
10129</div>
10130</div>
10131</template>
10132</div>
10133<div x-show="$store.minicart.cart.summary_count"
10134                             class="relative bg-white"
10135                        >
10136<div class="flex items-center justify-between my-4 py-2 border-t border-border-light font-bold">
10137<span>Total panier</span>
10138<span x-html="$store.minicart.cart.subtotal"></span>
10139</div>
10140<div class="mb-4 text-center">
10141<a href="https://www.jardindupicvert.com/checkout/cart/"
10142                                   class="inline-flex btn btn-primary xs:btn-size-lg"
10143                                >
10144Voir le panier et commander                                </a>
10145</div>
10146<p @click.prevent="toggle(false)"
10147                               class="text-sm xs:text-base text-center underline cursor-pointer"
10148                            >
10149Continuer mes achats                            </p>
10150</div>
10151</div>
10152</div>
10153</div>
10154</div>
10155</template>
10156</section>
10157<!-- BLOCK authentication-popup -->
10157<script>
10158    function initAuthentication() {
10159        return {
10160            loading: false,
10161            errors: 0,
10162            hasCaptchaToken: 0,
10163            errorMessage: '',
10164            showPassword: false,
10165            username: '',
10166            password: '',
10167            request: null, /**
10168             {
10169                text: contextual text to output in panel,
10170                callback: function to be called after successful login,
10171                url: redirect url after successful login
10172             }
10173             */
10174
10175            submitForm: function () {
10176                // Do not rename $form, the variable is expected to be declared in the recaptcha output
10177                const $form = document.querySelector('#login-form');
10178                    if (!this.hasCaptchaToken) {
10179        this.errors = 1;
10180
10181        const lockSubmitButton = () => {
10182            $form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
10183        };
10184
10185        const failCaptcha = (errorMessage, exception = null) => {
10186            this.errors = 1;
10187            lockSubmitButton();
10188
10189            if (this.setErrorMessages) {
10190                this.setErrorMessages([errorMessage]);
10191                this.displayErrorMessage = true;
10192            } else {
10193                window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
10194            }
10195
10196            if (exception) {
10197                console.error(
10198                    exception ||
10199                    'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
10200                );
10201            }
10202        };
10203
10204        const executeGreCaptcha = () => {
10205            grecaptcha.ready(() => {
10206                grecaptcha.execute(
10207                    '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV',
10208                    {action: 'submit'}
10209                ).then((token) => {
10210                    const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
10211
10212                    if (tokenElement && token && token.length > 0) {
10213                        $form['g\u002Drecaptcha\u002Dresponse'].value = token;
10214                        this.errors = 0;
10215                        this.hasCaptchaToken = 1;
10216                        (this.submitForm || $form.submit).call(this);
10217                    } else {
10218                        failCaptcha(
10219                            tokenElement
10220                                ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
10221                                : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
10222                        );
10223                    }
10224                }).catch((exception) => {
10225                    failCaptcha(
10226                        'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
10227                        exception
10228                    );
10229                });
10230            });
10231        };
10232
10233        if (window.grecaptcha) {
10234            executeGreCaptcha();
10235        } else {
10236            const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV";
10237            const script = document.createElement('script');
10238            script.setAttribute('type', 'text/javascript');
10239            script.setAttribute('src', recaptchaUrl);
10240            document.head.appendChild(script);
10241
10242            script.addEventListener("load", executeGreCaptcha, false);
10243        }
10244    }
10245                if (this.errors === 0) {
10246                    this.dispatchLoginRequest($form);
10247                }
10248            },
10249
10250            toggleAuthentication(request) {
10251                this.request = request;
10252                Alpine.store('customer')?.isLoggedIn ? this.redirectIfAuthenticated() : this.toggle(true);
10253            },
10254
10255            redirectIfAuthenticated: function() {
10256                window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
10257                if (this.request?.callback && typeof this.request.callback === 'function') {
10258                    this.request.callback();
10259                } else if (this.request?.url) {
10260                    if (location.pathname.startsWith('/checkout/cart')) {
10261                        // If login from cart, redirect to checkout after login
10262                        this.request.url = 'https://www.jardindupicvert.com/checkout/';
10263                    }
10264                    window.location.href = this.request.url;
10265                } else {
10266                    window.location.reload();
10267                }
10268                this.toggle(false);
10269            },
10270
10271            resetErrors() {
10272                this.errors = 0;
10273            },
10274
10275            dispatchLoginRequest: function(form) {
10276                this.loading = true;
10277                this.errorMessage = '';
10278                const bodyFields = {
10279                    'username': this.username,
10280                    'password': this.password,
10281                    'formKey': hyva.getFormKey()
10282                };
10283                                const fieldName = 'g\u002Drecaptcha\u002Dresponse';
10284                const recaptchaField = fieldName && form[fieldName];
10285                if (recaptchaField) {
10286                    bodyFields[fieldName] = recaptchaField.value;
10287                }
10288                fetch('https://www.jardindupicvert.com/customer/ajax/login/', {
10289                        method: 'POST',
10290                        headers: {
10291                            'Content-Type': 'application/json',
10292                            'X-Requested-With': 'XMLHttpRequest'
10293                        },
10294                        body: JSON.stringify(bodyFields)
10295                    }
10296                ).then(response => {
10297                        return response.json()
10298                    }
10299                ).then(data=> {
10300                        if (data.errors) {
10301                            this.errorMessage = data.message;
10302                            this.errors = 1;
10303                            this.hasCaptchaToken = 0;
10304                        } else {
10305                            this.redirectIfAuthenticated();
10306                        }
10307                    }
10308                ).finally(() => {
10309                    this.loading = false;
10310                    this.request = null;
10311                });
10312            }
10313        }
10314    }
10315
10316    function initAutoLogin() {
10317        return {
10318            init: function () {
10319                window?.AUTO_LOGIN_MESSAGE && window.dispatchEvent(
10320                    new CustomEvent(
10321                        'toggle-authentication',
10322                        {
10323                            detail: {
10324                                url: window.location.href,
10325                                text: window.AUTO_LOGIN_MESSAGE
10326                            }
10327                        }
10328                    )
10329                )
10330            }
10331        }
10332    }
10333</script>
10333
10334<section id="authentication-popup"
10335         x-data="{ ...initDrawer('#customer-menu'), ...initAuthentication() }"
10336         @toggle-authentication.window="toggleAuthentication($event?.detail)"
10337         @keydown.window.escape="toggle(false)"
10338         :class="{'is-open': open}"
10339         x-cloak
10340         data-type="drawer"
10341>
10342<div class="backdrop hidden"
10343         @click="toggle(false)"
10344         aria-label="Close panel"
10345    ></div>
10346<div x-data="initAutoLogin()"
10347         role="dialog"
10348         class="top-0"
10349    >
10350<div class="drawer-content">
10351<div class="absolute top-0 right-2">
10352<button @click="toggle(false)"
10353                        aria-label="Close panel"
10354                >
10355<span class="text-4xl">×</span>
10356</button>
10357</div>
10358<div class="h-full p-4 sm:px-6 bg-white overflow-y-auto"
10359                 :class="{ 'u-loader': loading }"
10360            >
10361<header>
10362<p id="authentication-title"
10363                       class="flex items-center gap-2 text-lg font-bold"
10364                    >
10365<svg class="w-8 h-8 p-1"><use xlink:href="#account-symbol"></use></svg>
10366Connexion / Inscription                    </p>
10367<p class="leading-tight italic text-sm"
10368                       x-html="request?.text || ''"></p>
10369</header>
10370<div class="block-customer-login">
10371<p class="my-4 font-bold text-lg">
10372Déjà client(e) ?                    </p>
10373<form class="form form-login pb-4"
10374                          method="post"
10375                          @submit.prevent="submitForm();"
10376                          id="login-form"
10377                    >
10378<div class="control">
10379<input type="hidden"
10380           value=""
10381           name="g-recaptcha-response"
10382    >
10383</div>
10384<div class="fieldset login">
10385<div class="form-field field email required">
10386<label class="label" for="customer-email">
10387<span>Adresse email <sup>*</sup></span>
10388</label>
10389<div class="control">
10390<input name="username"
10391                                           x-model="username"
10392                                           @keyup="errorMessage = ''"
10393                                           @change="resetErrors"
10394                                           type="email"
10395                                           required
10396                                           class="form-input input-text"
10397                                    >
10398</div>
10399</div>
10400<div class="form-field password required">
10401<label for="pass"
10402                                       class="label"
10403                                >
10404<span>Mot de passe <sup>*</sup></span>
10405</label>
10406<div class="control relative">
10407<input name="password"
10408                                           x-model="password"
10409                                           :type="showPassword ? 'text' : 'password'"
10410                                           class="form-input input-text"
10411                                           required
10412                                           @keyup="errorMessage = ''"
10413                                           @change="resetErrors"
10414                                    >
10415<svg @click.prevent="showPassword = !showPassword"
10416                                         class="w-6 h-6 absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer"
10417                                         :class="{ 'text-primary-light': !showPassword, 'text-primary-lighter': showPassword }"
10418                                    >
10419                                        <use xlink:href="#view-symbol"></use>
10420                                    </svg>
10421</div>
10422</div>
10423<p x-show="errorMessage"
10424                               class="flex items-center gap-1 mt-1 text-sm text-alert"
10425                            >
10426<span class="text-alert font-bold text-xl">&#9888;</span>
10427<span x-text="errorMessage"></span>
10428</p>
10429<input name="context" type="hidden" value="checkout" />
10430<div class="actions flex justify-between pt-6 pb-2 items-center">
10431<button type="submit"
10432                                        class="inline-flex btn btn-primary"
10433                                        :disabled="!username || !password || (errorMessage != '')"
10434                                >
10435Me connecter                                </button>
10436<a href="https://www.jardindupicvert.com/customer/account/forgotpassword/"
10437                                   class="text-xs italic hover:underline"
10438                                >
10439Mot de passe oublié ?                                </a>
10440</div>
10441</div>
10442</form>
10443</div>
10444<div class="mx-4">
10445<p class="my-4 text-2xs text-center leading-tight">
10446<em>Ce formulaire est protégé par reCAPTCHA: vous pouvez consulter la <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">politique de confidentialité</a> et <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">les conditions d&#039;utilisation</a>.</em>
10447</p>
10448</div>
10449<div class="block-new-customer">
10450<p class="py-4 font-bold text-lg">
10451Pas encore client(e) ?                    </p>
10452<div class="block-content">
10453<p class="mb-1 text-sm">
10454Créez votre compte client pour passer commande sur notre site.                        </p>
10455<div class="actions flex justify-between mt-6 mb-2 items-center">
10456<a href="https://www.jardindupicvert.com/customer/account/login/"
10457                               class="inline-flex btn btn-primary"
10458                            >
10459Créer un compte                            </a>
10460</div>
10461</div>
10462</div>
10463</div>
10464</div>
10465</div>
10466</section>
10467<!-- /BLOCK authentication-popup --></div></body>
10468</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.