PageSourceSearch

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

html jardindupicvert.com collected 2026-09-24 22:57:16 UTC 493,415 bytes, 10,815 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/version1790243132/_cache/merged/67f194a17c1b7a32ff09426bd0211e43.min.css" />
11<script type="text/javascript" defer="true" src="https://www.jardindupicvert.com/static/version1790243132/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/version1790243132/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
128
129<!--Custom Style-->
130
131<script>
132(function() {
133    var dl = {"env_currency":"eur","env_language":"fr-fr","env_date":"24\/09\/2026","env_work":"production","page_type":"cms","menu_level_1":"","menu_level_2":"","menu_level_3":""};
134    if (typeof dl.page_type !== 'string' || !dl.page_type) {
135        dl.page_type = 'other';
136    }
137    dl.env_timestamp = Date.now();
138    dl.page_title = document.title;
139    dl.page_name = document.location.pathname;
140    dl.page_url = document.location.href;
141    window.ga4PageType = dl.page_type;
142    window.dataLayer = window.dataLayer || [];
143    window.dataLayer.push(dl);
144})();
145</script>
145
146
147<script>
148(function() {
149    var sectionLoadUrl = "https:\/\/www.jardindupicvert.com\/customer\/section\/load\/";
150    window.ga4PrivateData = window.ga4PrivateData || {};
151
152    function hasOwn(obj, key) {
153        return !!obj && Object.prototype.hasOwnProperty.call(obj, key);
154    }
155
156    function normalizeUserData(userData) {
157        if (!userData || typeof userData !== 'object') {
158            return {};
159        }
160
161        return userData;
162    }
163
164    function getPageType() {
165        if (typeof window.ga4PageType === 'string' && window.ga4PageType) {
166            return window.ga4PageType;
167        }
168        return 'other';
169    }
170
171    function dispatchPrivateData(userData) {
172        window.dispatchEvent(new CustomEvent('webcooking:ga4:private-data', {
173            detail: userData
174        }));
175    }
176
177    function setPrivateData(userData) {
178        window.ga4PrivateData = normalizeUserData(userData);
179        dispatchPrivateData(window.ga4PrivateData);
180    }
181
182    function getAnalyticsUserData(userData) {
183        var analyticsUserData = {};
184
185        ['user_type', 'user_login_status', 'user_name', 'user_ln', 'user_phone', 'user_zip'].forEach(function(key) {
186            if (!hasOwn(userData, key)) {
187                return;
188            }
189
190            if (key === 'user_login_status') {
191                analyticsUserData[key] = userData[key] ? 'true' : 'false';
192                return;
193            }
194
195            if (userData[key]) {
196                analyticsUserData[key] = userData[key];
197            }
198        });
199
200        return analyticsUserData;
201    }
202
203    function applyUserDataToGa4(userData) {
204        var analyticsUserData = getAnalyticsUserData(userData);
205        var hasUserId = hasOwn(userData, 'user_id') && userData.user_id;
206
207        if (typeof window.gtag === 'function') {
208            if (hasUserId) {
209                window.gtag('set', 'user_id', String(userData.user_id));
210            } else {
211                window.gtag('set', 'user_id', null);
212            }
213
214            if (Object.keys(analyticsUserData).length > 0) {
215                window.gtag('set', analyticsUserData);
216                window.gtag('set', 'user_properties', analyticsUserData);
217            }
218
219            if (hasUserId || Object.keys(analyticsUserData).length > 0) {
220                window.gtag(
221                    'event',
222                    'ga4_private_data_ready',
223                    Object.assign({ page_type: getPageType() }, analyticsUserData)
224                );
225            }
226        }
227    }
228
229    function pushUserData(userData) {
230        setPrivateData(userData);
231        var analyticsUserData = getAnalyticsUserData(userData);
232        window.dataLayer = window.dataLayer || [];
233        var payload = Object.assign({}, analyticsUserData, {
234            'event': 'ga4_private_data_ready',
235            'page_type': getPageType()
236        });
237        var hasUserId = hasOwn(userData, 'user_id') && userData.user_id;
238
239        if (hasUserId) {
240            payload.user_id = String(userData.user_id);
241        }
242
243        if (hasOwn(userData, 'user_email') && userData.user_email) {
244            payload.user_email = userData.user_email;
245        }
246
247        if (hasUserId || Object.keys(analyticsUserData).length > 0 || hasOwn(userData, 'user_email')) {
248            window.dataLayer.push(payload);
249        }
250
251        if (window.ga4IsGtm === false && (hasUserId || Object.keys(analyticsUserData).length > 0)) {
252            applyUserDataToGa4(userData);
253        }
254    }
255
256    function sameData(left, right) {
257        try {
258            return JSON.stringify(left) === JSON.stringify(right);
259        } catch (e) {
260            return false;
261        }
262    }
263
264    function consumeSectionData(userData) {
265        var normalizedData = normalizeUserData(userData);
266        if (sameData(window.ga4PrivateData, normalizedData)) {
267            return;
268        }
269
270        pushUserData(normalizedData);
271    }
272
273    function getStorageSection() {
274        try {
275            var storage = JSON.parse(localStorage.getItem('mage-cache-storage') || '{}');
276            return storage['ga4-datalayer'] || null;
277        } catch (e) {
278            return null;
279        }
280    }
281
282    function fetchSectionNative() {
283        fetch(sectionLoadUrl + '?sections=ga4-datalayer&force_new_section_timestamp=false', {
284            method: 'GET',
285            credentials: 'same-origin',
286            headers: { 'X-Requested-With': 'XMLHttpRequest' }
287        })
288        .then(function(response) { return response.json(); })
289        .then(function(data) {
290            if (data && data['ga4-datalayer']) {
291                consumeSectionData(data['ga4-datalayer']);
292            }
293        })
294        .catch(function() {
295            setPrivateData({});
296        });
297    }
298
299    function initNative() {
300        var sectionLoaded = false;
301
302        var cached = getStorageSection();
303        if (cached && Object.keys(cached).length > 0) {
304            consumeSectionData(cached);
305            sectionLoaded = true;
306        }
307
308        window.addEventListener('storage', function(e) {
309            if (e.key === 'mage-cache-storage') {
310                var section = getStorageSection();
311                if (section) {
312                    consumeSectionData(section);
313                }
314            }
315        });
316
317        window.addEventListener('private-content-loaded', function(e) {
318            if (e.detail && e.detail.data && e.detail.data['ga4-datalayer']) {
319                sectionLoaded = true;
320                consumeSectionData(e.detail.data['ga4-datalayer']);
321            }
322        });
323
324        setTimeout(function() {
325            if (!sectionLoaded) {
326                fetchSectionNative();
327            }
328        }, 800);
329    }
330
331    function initRequireJs() {
332        window.require(['Magento_Customer/js/customer-data'], function(customerData) {
333            var section = customerData.get('ga4-datalayer');
334
335            consumeSectionData(section());
336            section.subscribe(function(userData) {
337                consumeSectionData(userData);
338            });
339            customerData.reload(['ga4-datalayer'], false);
340        }, function() {
341            initNative();
342        });
343    }
344
345    function init() {
346        if (typeof window.require === 'function') {
347            initRequireJs();
348        } else {
349            initNative();
350        }
351    }
352
353    if (document.readyState === 'complete') {
354        setTimeout(init, 50);
355    } else {
356        window.addEventListener('load', function() {
357            setTimeout(init, 50);
358        });
359    }
360})();
361</script>
361
362
363<script>
364(function() {
365    function pushToDataLayer(data) {
366        window.dataLayer = window.dataLayer || [];
367        window.dataLayer.push(data);
368    }
369
370    function initMiniCartTracking() {
371        var miniCartOpen = false;
372
373        var miniCartAside = document.getElementById('minicart-content-wrapper')
374            || document.querySelector('.block-minicart');
375
376        if (miniCartAside) {
377            new MutationObserver(function() {
378                var isVisible = miniCartAside.classList.contains('_show')
379                    || miniCartAside.classList.contains('active')
380                    || (miniCartAside.offsetParent !== null && miniCartAside.style.display !== 'none');
381                if (isVisible && !miniCartOpen) {
382                    miniCartOpen = true;
383                    pushToDataLayer({ 'page_type': 'minipanier', 'event': 'ga4_minicart_open' });
384                } else if (!isVisible) {
385                    miniCartOpen = false;
386                }
387            }).observe(miniCartAside, { attributes: true, attributeFilter: ['class', 'style'] });
388        }
389
390        var wrapper = document.querySelector('.minicart-wrapper');
391        if (wrapper) {
392            new MutationObserver(function() {
393                var isActive = wrapper.classList.contains('active');
394                if (isActive && !miniCartOpen) {
395                    miniCartOpen = true;
396                    pushToDataLayer({ 'page_type': 'minipanier', 'event': 'ga4_minicart_open' });
397                } else if (!isActive) {
398                    miniCartOpen = false;
399                }
400            }).observe(wrapper, { attributes: true, attributeFilter: ['class'] });
401        }
402    }
403
404    if (document.readyState === 'loading') {
405        document.addEventListener('DOMContentLoaded', initMiniCartTracking);
406    } else {
407        initMiniCartTracking();
408    }
409})();
410</script>
410
411
412<link rel="preconnect" href="https://www.googletagmanager.com">
413<link rel="preconnect" href="https://www.google-analytics.com">
414
415
416
417<script>
418        var ga4IsGtm = false;
419        var ga4IsTrackVariant = 0;
420        var productImpressions = [];
421        var promoImpressions = [];
422        window.ga4NavigationEvents = [{"selector":"#nav-cat .lvl-items a","trigger":"click","once_per_page":false,"once_key":"53f6d11bdf4e890dc077a894a3d67fd061073ee6","event_name":"menu_click","page_filter":"","event_params":"{\r\n  \"url\": \"{{href_path}}\",\r\n  \"page_name\": \"{{text}}\",\r\n  \"menu_level\": \"{{closest_data:lvl}}\"\r\n}"},{"selector":"#desktop-navigation-sub-menu-catalog > a","trigger":"click","once_per_page":false,"once_key":"3104f888323799721651d14c34e6260313870a59","event_name":"menu_click","page_filter":"","event_params":"{\r\n  \"url\": \"{{href_path}}\",\r\n  \"page_name\": \"{{text}}\",\r\n  \"menu_level\": \"0\"\r\n}"},{"selector":"input[type=\"search\"]","trigger":"focus","once_per_page":false,"once_key":"decef979830fe571479f6556cafa3f9a23ec3740","event_name":"search_open","page_filter":"","event_params":"{\"page_type\":\"{{page_type}}\",\"search_term\":\"{{value}}\"}"},{"selector":".search-autocomplete a","trigger":"click","once_per_page":false,"once_key":"cac90cf89f59075097cd187f2206332f69680388","event_name":"search_click","page_filter":"","event_params":"{\"page_type\":\"{{page_type}}\",\"search_term\":\"{{selector_value:input[type=\\\"search\\\"]}}\",\"click_url\":\"{{href}}\",\"click_text\":\"{{text}}\"}"}];
423      
424        
425
426            
427    </script>
427
428
429<script>
430        window.dataLayer = window.dataLayer || [];
431function gtag(){dataLayer.push(arguments)}
432gtag('consent', 'default', {
433  'ad_storage': 'denied',
434  'ad_user_data': 'denied',
435  'ad_personalization': 'denied',
436  'analytics_storage': 'denied',
437  'wait_for_update': 500
438});
439(function(){
440  function gc(n){var m=document.cookie.match(new RegExp('(?:^|;\\s*)'+n.replace(/[.*+?^${}()|[\]\\]/g,'\\\$&')+'=([^;]*)'));return m?decodeURIComponent(m[1]):null}
441  function addToken(bag,val){val=val===undefined||val===null?'':String(val).trim().toLowerCase();if(!val||bag.indexOf(val)!==-1)return;bag.push(val)}
442  function collectTokens(val,bag){if(val===undefined||val===null)return;if(Array.isArray(val)){for(var i=0;i<val.length;i++){collectTokens(val[i],bag)}return}if(typeof val==='object'){for(var k in val){if(Object.prototype.hasOwnProperty.call(val,k)){addToken(bag,k);collectTokens(val[k],bag)}}return}var str=String(val);addToken(bag,str);try{var dec=decodeURIComponent(str);if(dec!==str){addToken(bag,dec);str=dec}}catch(e){}try{var parsed=JSON.parse(str);if(parsed!==null&&parsed!==str){collectTokens(parsed,bag)}}catch(e){}var split=str.split(/[,;|:\s]+/);for(var j=0;j<split.length;j++){addToken(bag,split[j])}var matches=str.match(/[a-z0-9_.-]+/ig)||[];for(var m=0;m<matches.length;m++){addToken(bag,matches[m])}}
443  function hasVal(cookieValue,configuredList){var actual=[],expected=[];collectTokens(cookieValue,actual);collectTokens(configuredList,expected);for(var i=0;i<expected.length;i++){if(actual.indexOf(expected[i])!==-1)return true}return false}
444  function normalizeExternalConsent(input){if(!input||typeof input!=='object')return null;var r={analytics:false,marketing:false};if(Object.prototype.hasOwnProperty.call(input,'analytics')){r.analytics=!!input.analytics}if(Object.prototype.hasOwnProperty.call(input,'marketing')){r.marketing=!!input.marketing}if(Object.prototype.hasOwnProperty.call(input,'analytics_storage')){r.analytics=String(input.analytics_storage).toLowerCase()==='granted'}if(Object.prototype.hasOwnProperty.call(input,'ad_storage')){r.marketing=String(input.ad_storage).toLowerCase()==='granted'}return r}
445  function checkConsent(){
446    var v=gc('gdpr_cookie_groups');
447    if(v===null) return null;
448    var r={};
449    r.analytics=hasVal(v,'3,7,11,15,19,23,27,31');
450    r.marketing=hasVal(v,'2,4,10,14,18,22,26,30');
451    return r;
452  }
453  function applyConsent(r){
454    gtag('consent','update',{
455      'analytics_storage': r.analytics ? 'granted' : 'denied',
456      'ad_storage': r.marketing ? 'granted' : 'denied',
457      'ad_user_data': r.marketing ? 'granted' : 'denied',
458      'ad_personalization': r.marketing ? 'granted' : 'denied'
459    })
460  }
461  window.webcookingGa4UpdateConsent=function(input){var r=normalizeExternalConsent(input);if(r){applyConsent(r)}};
462  window.addEventListener('webcooking:ga4:consent:update',function(e){if(e&&e.detail){window.webcookingGa4UpdateConsent(e.detail)}});
463  var c=checkConsent();
464  if(c!==null){applyConsent(c)}
465  else{
466    var _ck=setInterval(function(){var r=checkConsent();if(r!==null){applyConsent(r);clearInterval(_ck)}},500);
467    setTimeout(function(){clearInterval(_ck)},30000);
468  }
469})();
470    </script>
vendor: 65 bytes, lines 470-472
470
471
472<script async src="https://www.googletagmanager.com/gtag/js?id=
472G-XE667X2PS0
vendor: 12 bytes, line 472
472"></script>
473<script>
474      window.dataLayer = window.dataLayer || [];
475      function gtag(){dataLayer.push(arguments)};
476      gtag('js', new Date());
477
478      (function(){function syncGa4UserId(data){if(typeof window.gtag!=='function'){return;}if(data&&data.user_id){window.gtag('set','user_id',String(data.user_id));return;}window.gtag('set','user_id',null);}window.addEventListener('webcooking:ga4:private-data',function(e){syncGa4UserId(e?e.detail:null);});syncGa4UserId(window.ga4PrivateData||null);})();      gtag('set', {"env_currency":"eur","env_language":"fr-fr","env_date":"24\/09\/2026","env_work":"production"});
479      var options = {"currency":"EUR"};
480      // si window.ga4Options est défini et que c'est un objet, on fusionne les options
481      if (typeof window.ga4Options === 'object' && window.ga4Options !== null) {
482          options = Object.assign(options, window.ga4Options);
483      }
484        if (typeof options !== 'object' || options === null) {
485          options = {};
486        }
487
488        var pageType = (typeof window.ga4PageType === 'string' && window.ga4PageType) ? window.ga4PageType : 'other';
489        if (!Object.prototype.hasOwnProperty.call(options, 'page_type') || !options.page_type) {
490          options.page_type = pageType;
491        }
492      
493      gtag(
494        'config', 
495        'G-XE667X2PS0',
496        options
497      );
498          </script>
498
499
500<script>  
501
502        
503    
504    
505    
506    </script>
506
507
508<script defer src="https://www.jardindupicvert.com/static/version1790243132/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleAnalytics4/js/navigation-events.min.js"></script>
vendor: 1 bytes, line 508
508
509<script defer src="https://www.jardindupicvert.com/static/version1790243132/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleAnalytics4/js/filter-tracking.min.js"></script>
509
510<!-- glopal_head -->
511<script>
512// <![CDATA[
513var _webinterpret = _webinterpret || {};
514_webinterpret.plugin_version = 'magento2-1.21.1';
515_webinterpret.page_store_view_id = '7';
516_webinterpret.page_short_name = 'jardindupicvert';
517// ]]>
518</script>
vendor: 1 bytes, line 518
518
519<script async type="text/javascript" src="https://cdn-redirector.glopal.com/common/js/webinterpret-loader.js"></script>
519
520<!-- end glopal_head -->
521<script>
522    var BASE_URL = 'https://www.jardindupicvert.com/';
523    var THEME_PATH = 'https://www.jardindupicvert.com/static/version1790243132/frontend/PicVert/hyva/fr_FR';
524    var COOKIE_CONFIG = {
525        "expires": null,
526        "path": "\u002F",
527        "domain": ".www.jardindupicvert.com",
528        "secure": true,
529        "lifetime": "86400",
530        "cookie_restriction_enabled": false    };
531    var CURRENT_STORE_CODE = 'picvert_store';
532    var CURRENT_WEBSITE_ID = '7';
533
534    window.hyva = window.hyva || {}
535
536    window.cookie_consent_groups = window.cookie_consent_groups || {}
537    window.cookie_consent_groups['necessary'] = true;
538
539    window.cookie_consent_config = window.cookie_consent_config || {};
540    window.cookie_consent_config['necessary'] = [].concat(
541        window.cookie_consent_config['necessary'] || [],
542        [
543            'user_allowed_save_cookie',
544            'form_key',
545            'mage-messages',
546            'private_content_version',
547            'mage-cache-sessid',
548            'last_visited_store',
549            'section_data_ids'
550        ]
551    );
552    //# sourceURL=hyva-variables.js
553</script>
vendor: 1 bytes, line 553
553
554<script>
555    (function( hyva, undefined ) {
556
557        function lifetimeToExpires(options, defaults) {
558
559            const lifetime = options.lifetime || defaults.lifetime;
560
561            if (lifetime) {
562                const date = new Date;
563                date.setTime(date.getTime() + lifetime * 1000);
564                return date;
565            }
566
567            return null;
568        }
569
570        function generateRandomString() {
571
572            const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
573                length = 16;
574
575            let formKey = '',
576                charactersLength = allowedCharacters.length;
577
578            for (let i = 0; i < length; i++) {
579                formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))]
580            }
581
582            return formKey;
583        }
584
585        const sessionCookieMarker = {noLifetime: true}
586
587        const cookieTempStorage = {};
588
589        const internalCookie = {
590            get(name) {
591                const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
592                return v ? v[2] : null;
593            },
594            set(name, value, days, skipSetDomain) {
595                let expires,
596                    path,
597                    domain,
598                    secure,
599                    samesite;
600
601                const defaultCookieConfig = {
602                    expires: null,
603                    path: '/',
604                    domain: null,
605                    secure: false,
606                    lifetime: null,
607                    samesite: 'lax'
608                };
609
610                const cookieConfig = window.COOKIE_CONFIG || {};
611
612                expires = days && days !== sessionCookieMarker
613                    ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig)
614                    : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires;
615
616                path = cookieConfig.path || defaultCookieConfig.path;
617                domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain);
618                secure = cookieConfig.secure || defaultCookieConfig.secure;
619                samesite = cookieConfig.samesite || defaultCookieConfig.samesite;
620
621                document.cookie = name + "=" + encodeURIComponent(value) +
622                    (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') +
623                    (path ? '; path=' + path : '') +
624                    (domain ? '; domain=' + domain : '') +
625                    (secure ? '; secure' : '') +
626                    (samesite ? '; samesite=' + samesite : 'lax');
627            },
628            isWebsiteAllowedToSaveCookie() {
629                const allowedCookies = this.get('user_allowed_save_cookie');
630                if (allowedCookies) {
631                    const allowedWebsites = JSON.parse(unescape(allowedCookies));
632
633                    return allowedWebsites[CURRENT_WEBSITE_ID] === 1;
634                }
635                return false;
636            },
637            getGroupByCookieName(name) {
638                const cookieConsentConfig = window.cookie_consent_config || {};
639                let group = null;
640                for (let prop in cookieConsentConfig) {
641                    if (!cookieConsentConfig.hasOwnProperty(prop)) continue;
642                    if (cookieConsentConfig[prop].includes(name)) {
643                        group = prop;
644                        break;
645                    }
646                }
647                return group;
648            },
649            isCookieAllowed(name) {
650                const cookieGroup = this.getGroupByCookieName(name);
651                return cookieGroup
652                    ? window.cookie_consent_groups[cookieGroup]
653                    : this.isWebsiteAllowedToSaveCookie();
654            },
655            saveTempStorageCookies() {
656                for (const [name, data] of Object.entries(cookieTempStorage)) {
657                    if (this.isCookieAllowed(name)) {
658                        this.set(name, data['value'], data['days'], data['skipSetDomain']);
659                        delete cookieTempStorage[name];
660                    }
661                }
662            }
663        };
664
665        hyva.getCookie = (name) => {
666            const cookieConfig = window.COOKIE_CONFIG || {};
667
668            if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
669                return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null;
670            }
671
672            return internalCookie.get(name);
673        }
674
675        hyva.setCookie = (name, value, days, skipSetDomain) => {
676            const cookieConfig = window.COOKIE_CONFIG || {};
677
678            if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) {
679                cookieTempStorage[name] = {value, days, skipSetDomain};
680                return;
681            }
682            return internalCookie.set(name, value, days, skipSetDomain);
683        }
684
685
686        hyva.setSessionCookie = (name, value, skipSetDomain) => {
687            return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain)
688        }
689
690        hyva.getBrowserStorage = () => {
691            const browserStorage = window.localStorage || window.sessionStorage;
692            if (!browserStorage) {
693                console.warn('Browser Storage is unavailable');
694                return false;
695            }
696            try {
697                browserStorage.setItem('storage_test', '1');
698                browserStorage.removeItem('storage_test');
699            } catch (error) {
700                console.warn('Browser Storage is not accessible', error);
701                return false;
702            }
703            return browserStorage;
704        }
705
706        hyva.postForm = (postParams) => {
707            const form = document.createElement("form");
708
709            let data = postParams.data;
710
711            if (! postParams.skipUenc && ! data.uenc) {
712                data.uenc = btoa(window.location.href);
713            }
714            form.method = "POST";
715            form.action = postParams.action;
716
717            Object.keys(postParams.data).map(key => {
718                const field = document.createElement("input");
719                field.type = 'hidden'
720                field.value = postParams.data[key];
721                field.name = key;
722                form.appendChild(field);
723            });
724
725            const form_key = document.createElement("input");
726            form_key.type = 'hidden';
727            form_key.value = hyva.getFormKey();
728            form_key.name="form_key";
729            form.appendChild(form_key);
730
731            document.body.appendChild(form);
732
733            form.submit();
734        }
735
736        hyva.getFormKey = function () {
737            let formKey = hyva.getCookie('form_key');
738
739            if (!formKey) {
740                formKey = generateRandomString();
741                hyva.setCookie('form_key', formKey);
742            }
743
744            return formKey;
745        }
746
747        hyva.formatPrice = (value, showSign, options = {}) => {
748            const groupSeparator = options.groupSeparator;
749            const decimalSeparator = options.decimalSeparator
750            delete options.groupSeparator;
751            delete options.decimalSeparator;
752            const formatter = new Intl.NumberFormat(
753                'fr\u002DFR',
754                Object.assign({
755                    style: 'currency',
756                    currency: 'EUR',
757                    signDisplay: showSign ? 'always' : 'auto'
758                }, options)
759            );
760            return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ?
761                formatter.formatToParts(value).map(({type, value}) => {
762                    switch (type) {
763                        case 'currency':
764                            return '\u20AC' || value;
765                        case 'minusSign':
766                            return '- ';
767                        case 'plusSign':
768                            return '+ ';
769                        case 'group':
770                            return groupSeparator !== undefined ? groupSeparator : value;
771                        case 'decimal':
772                            return decimalSeparator !== undefined ? decimalSeparator : value;
773                        default :
774                            return value;
775                    }
776                }).reduce((string, part) => string + part) :
777                formatter.format(value);
778        }
779
780        const formatStr = function (str, nStart) {
781            const args = Array.from(arguments).slice(2);
782
783            return str.replace(/(%+)([0-9]+)/g, (m, p, n) => {
784                const idx = parseInt(n) - nStart;
785
786                if (args[idx] === null || args[idx] === void 0) {
787                    return m;
788                }
789                return p.length % 2
790                    ? p.slice(0, -1).replace('%%', '%') + args[idx]
791                    : p.replace('%%', '%') + n;
792            })
793        }
794
795        hyva.str = function (string) {
796            const args = Array.from(arguments);
797            args.splice(1, 0, 1);
798
799            return formatStr.apply(undefined, args);
800        }
801
802        hyva.strf = function () {
803            const args = Array.from(arguments);
804            args.splice(1, 0, 0);
805
806            return formatStr.apply(undefined, args);
807        }
808
809        /**
810         * Take a html string as `content` parameter and
811         * extract an element from the DOM to replace in
812         * the current page under the same selector,
813         * defined by `targetSelector`
814         */
815        hyva.replaceDomElement = (targetSelector, content) => {
816            // Parse the content and extract the DOM node using the `targetSelector`
817            const parser = new DOMParser();
818            const doc = parser.parseFromString(content, 'text/html');
819            const contentNode = doc.querySelector(targetSelector);
820
821            // Bail if content or target can't be found
822            if (!contentNode || !document.querySelector(targetSelector)) {
823                return;
824            }
825
826                        hyva.activateScripts(contentNode);
827            
828            // Replace the old DOM node with the new content
829            document.querySelector(targetSelector).replaceWith(contentNode);
830
831            // Reload customerSectionData and display cookie-messages if present
832            window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
833            hyva.initMessages();
834        }
835
836        hyva.removeScripts = (contentNode) => {
837            const scripts = contentNode.getElementsByTagName('script');
838            for (let i = 0; i < scripts.length; i++) {
839                scripts[i].parentNode.removeChild(scripts[i]);
840            }
841            const templates = contentNode.getElementsByTagName('template');
842            for (let i = 0; i < templates.length; i++) {
843                const container = document.createElement('div');
844                container.innerHTML = templates[i].innerHTML;
845                hyva.removeScripts(container);
846                templates[i].innerHTML = container.innerHTML;
847            }
848        }
849
850        hyva.activateScripts = (contentNode) => {
851            // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM.
852            const scripts = Array.from(contentNode.getElementsByTagName('script'));
853
854            // Iterate over all script tags to duplicate+inject each into the head
855            for (const original of scripts) {
856                const script = document.createElement('script');
857                original.type && (script.type = original.type);
858                script.innerHTML = original.innerHTML;
859
860                // Remove the original (non-executing) script from the contentNode
861                original.parentNode.removeChild(original)
862
863                // Add script to head
864                document.head.appendChild(script);
865            }
866
867            return contentNode;
868        }
869
870        const replace = {['+']: '-', ['/']: '_', ['=']: ','};
871        hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]);
872
873        let currentTrap;
874
875        const focusableElements = (rootElement) => {
876            const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]';
877            return Array.from(rootElement.querySelectorAll(selector))
878                .filter(el => {
879                    return el.style.display !== 'none'
880                        && !el.disabled
881                        && el.tabIndex !== -1
882                        && (el.offsetWidth || el.offsetHeight || el.getClientRects().length)
883                })
884        }
885
886        const focusTrap = (e) => {
887            const isTabPressed = e.key === 'Tab' || e.keyCode === 9;
888            if (!isTabPressed) return;
889
890            const focusable = focusableElements(currentTrap)
891            const firstFocusableElement = focusable[0]
892            const lastFocusableElement = focusable[focusable.length - 1]
893
894            e.shiftKey
895                ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault())
896                : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault())
897        };
898
899        hyva.releaseFocus = (rootElement) => {
900            if (currentTrap && (!rootElement || rootElement === currentTrap)) {
901                currentTrap.removeEventListener('keydown', focusTrap)
902                currentTrap = null
903            }
904        }
905        hyva.trapFocus = (rootElement) => {
906            if (!rootElement) return;
907            hyva.releaseFocus()
908            currentTrap = rootElement
909            rootElement.addEventListener('keydown', focusTrap)
910            const firstElement = focusableElements(rootElement)[0]
911            firstElement && firstElement.focus()
912        }
913
914        hyva.safeParseNumber = (rawValue) => {
915            const number = rawValue ? parseFloat(rawValue) : null;
916
917            return Array.isArray(number) || isNaN(number) ? rawValue : number;
918        }
919
920        const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('');
921        hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => {
922
923            const camelCase = toCamelCase(name);
924            const key = '__hyva_bool_' + name
925
926            return new Proxy(Object.assign(
927                additionalMethods,
928                {
929                    [key]: !!value,
930                    [name]() {return !!this[key]},
931                    ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine
932                    ['not' + camelCase]() {return !this[key]},
933                    ['toggle' + camelCase]() {this[key] = !this[key]},
934                    [`set${camelCase}True`]() {this[key] = true},
935                    [`set${camelCase}False`]() {this[key] = false},
936                }
937            ), {
938                set(target, prop, value) {
939                    return prop === name
940                        ? (target[key] = !!value)
941                        : Reflect.set(...arguments);
942                }
943            })
944        }
945
946                hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true})
947        window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true});
948                window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies())
949
950    }( window.hyva = window.hyva || {} ));
951    //# sourceURL=hyva.js
952</script>
952
953<base href="https://www.jardindupicvert.com/">
954<link rel="preconnect" href="https://fonts.googleapis.com">
955<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
956
957<link rel="preload"
958          href="https://fonts.googleapis.com/css2?family=Lora:wght@400;700&amp;family=Quicksand:wght@400;700&amp;display=swap"
959          as="style"
960    >
961<link href="https://fonts.googleapis.com/css2?family=Lora:wght@400;700&amp;family=Quicksand:wght@400;700&amp;display=swap"
962          rel="stylesheet"
963          media="print"
964          onload="this.onload=null;this.removeAttribute('media');"
965    >
966</head>
967<body id="html-body" class="cms-mentions-legales cms-page-view page-layout-1column">
968<script>
969        console.warn(
970            `Crisp chatbox is installed but not configured -
971            To enable the chatbox please login to your store as
972            admin then go to: Stores > Settings > Configuration
973            > Crisp > Settings and configure your Crisp websiteID.`
974        );
975    </script>
975
976<div class="mst-gdpr-cookie-bar-wrapper"
977     id="gdprCookieBar"
978     x-data="initMstGdprCookieBar()"
979     x-init="initDisplay()"
980>
981<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"
982         :class="{'opacity-70': isLoading, 'translate-y-0': isBarVisible, 'translate-y-full': !isBarVisible}"
983    >
984<div>
985<div class="flex flex-col items-center justify-center gap-2 lg:gap-8 p-8"
986                 x-show="isBarVisible"
987            >
988<div class="absolute top-2 right-2">
989<button @click="hide"
990                        aria-label="Close panel"
991                    >
992<svg class="w-4 h-4 text-white hover:text-primary-lighter">
993                            <use xlink:href="#close-symbol"></use>
994                        </svg>
995</button>
996</div>
997<div class="consent-text text-sm">
998<button
999                            class="block ml-auto mr-0 mb-4 text-white underline "
1000                            data-trigger-settings="agree"
1001                            x-bind:class="{'opacity-0': isLoading}"
1002                            @click="handleDecline"
1003                        >
1004<span>Continuer sans accepter</span>
1005</button>
1006Les 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">
1007<a href="https://www.jardindupicvert.com/mentions-legales/"
1008                           class="underline"
1009                           title="Lire&#x20;notre&#x20;politique"
1010                        >
1011Lire notre politique                        </a>
1012</p>
1013</div>
1014
1015<div class="mst-gdpr-buttons w-full flex flex-row items-center justify-around gap-2">
1016<button type="button"
1017                            class="grow action btn btn-secondary justify-center text-sm w-auto bg-white text-primary"
1018                            x-bind:class="{'opacity-0': isLoading}"
1019                            @click="openSettings">
1020<span>Paramétrer</span>
1021</button>
1022
1023<button class="grow action btn btn-primary justify-center text-sm w-auto bg-white text-primary"
1024                            data-trigger-settings="agree"
1025                            x-bind:class="{'opacity-0': isLoading}"
1026                            @click="handleAllow(1)"><span>Accepter</span></button>
1027
1028</div>
1029</div>
1030</div>
1031<div class="mst-gdpr-cookie-bar-overlay bg-white fixed h-full left-0 opacity-60 top-0 w-full z-40"
1032             style="display: none"
1033             id="gdprCookieBarOverlay" x-show="isScreenLocked"
1034        >
1035</div>
1036</div>
1037</div>
1038<script>
1039    function initMstGdprCookieBar() {
1040        'use strict';
1041        const cookieGroupName = 'gdpr_cookie_groups';
1042        const consentCookieName = 'gdpr_cookie_consent'
1043        
1044        return {
1045            isLoading: false,
1046            isBarVisible: false,
1047            isScreenLocked: false,
1048            initDisplay: function () {
1049                !hyva.getCookie(cookieGroupName) || !hyva.getCookie(consentCookieName)
1050                    ? this.show()
1051                    : this.hide();
1052                window.addEventListener('mst-gdpr-cookie-settings-save', () => {
1053                    this.handleAllow();
1054                })
1055            },
1056            show: function () {
1057                this.isBarVisible = true;
1058                this.isScreenLocked = window.location.href.indexOf('cookie') === -1 && 0;
1059                if (this.isScreenLocked) {
1060                    document.querySelector('body').style.overflow = 'hidden';
1061                }
1062            },
1063            hide: function () {
1064                this.isBarVisible = false;
1065                this.isScreenLocked = false;
1066                document.querySelector('body').style.overflowY = 'auto';
1067                document.querySelector('body').style.overflowX = 'clip';
1068            },
1069            handleAllow: function (agreeAll) {
1070                this.isLoading = true;
1071
1072                let checkedGroups = [];
1073                if (agreeAll) {
1074                    checkedGroups = document.querySelectorAll('.cookie-group-container .checkbox');
1075                } else {
1076                    checkedGroups = document.querySelectorAll('.cookie-group-container .checkbox:checked');
1077                }
1078
1079                const checked = Array.from(checkedGroups || []);
1080                const body = checked.reduce((body, item) => {
1081                    body.append('group_ids[]', item.dataset.groupId);
1082                    return body;
1083                }, new URLSearchParams({form_key: hyva.getFormKey()}))
1084
1085                fetch('https://www.jardindupicvert.com/gdpr_cookie/cookie/allow/', {
1086                        method: 'post',
1087                        body: body,
1088                        headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'}
1089                })
1090                    .then(() => this.hide())
1091                    .finally(() => this.isLoading = false)
1092            },
1093
1094            handleDecline: function () {
1095                this.isLoading = true;
1096
1097                const body = new URLSearchParams({form_key: hyva.getFormKey()});
1098                fetch('https://www.jardindupicvert.com/gdpr_cookie/cookie/decline/', {
1099                    method: 'post',
1100                    body: body,
1101                    headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'}
1102                })
1103                    .then(() => this.hide())
1104                    .finally(() => this.isLoading = false)
1105            },
1106
1107            openSettings: function () {
1108                window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-open'));
1109            }
1110        };
1111    }
1112</script>
vendor: 1 bytes, line 1112
1112
1113<script>
1114
1115    (function (config) {
1116        function deleteDisallowedCookies() {
1117
1118            if (!hyva.getCookie(config.consentCookieName)) {
1119                return;
1120            }
1121
1122            const allowedGroups = unescape(hyva.getCookie(config.groupCookieName)).split(',');
1123            const groupIds = Object.keys(config.groups || {});
1124            const disallowedGroupIds = groupIds.filter(groupId => !allowedGroups.includes(groupId));
1125
1126            setInterval(() => {
1127                disallowedGroupIds.forEach(groupId => {
1128                    config.groups[groupId].forEach(cookieCode => hyva.setCookie(cookieCode, '', -1));
1129                });
1130            }, 5000);
1131        }
1132
1133        window.addEventListener('DOMContentLoaded', deleteDisallowedCookies, {once: true});
1134
1135    })({"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"})
1136</script>
1136
1137
1138<div x-data="initGdprSettingsModal()"
1139    x-init="init"
1140    class="relative z-modal"
1141>
1142<div class="fixed w-full h-full flex items-center justify-center" x-show="open">
1143<div class="absolute bg-black h-full opacity-50 w-full" x-on:click="close"
1144             style="display: none"
1145             x-show="open">
1146
1147</div>
1148<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"
1149             style="display: none"
1150             x-show.transition.origin.top="open">
1151<div class="flex justify-between mb-3 pb-4">
1152<p class="text-2xl lg:text-3xl">Privacy Overview</p>
1153<div class="cursor-pointer pt-1"
1154                     x-on:click="close"
1155                >
1156<svg class="w-8 h-8 text-primary-lighter hover:text-primary"><use xlink:href="#close-symbol"></use></svg>
1157</div>
1158</div>
1159<div class="text-sm lf:text-base">
1160This 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>
1161
1162<div class="group-content">
1163<div x-data="{open1: false}"
1164     x-defer="interact"
1165     class="cookie-group-container cookie-group-container-1 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm"
1166     data-nosnippet
1167>
1168<div class="flex flex justify-between">
1169<p class="title text-lg cursor-pointer"
1170            x-on:click="open1 = !open1">
1171<span x-show="! open1"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span>
1172<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>
1173Essentiels        </p>
1174
1175<input class="checkbox disabled:opacity-40" type="checkbox" value="1" disabled checked data-group-id="1" name="allowed-group-1">
1176</div>
1177<div class="content mt-4 pl-5" x-show.transition.origin.top="open1" style="display: none">
1178<div>
1179Ces 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>
1180<div class="cookie-list text-sm hidden">
1181<table class="block lg:table">
1182<tr class="hidden lg:table-row border-b">
1183<th class="p-2 text-left">Nom</th>
1184<th class="p-2 text-left">Description</th>
1185<th class="p-2 text-left">Durée max. validité</th>
1186</tr>
1187<tr class="block lg:table-row mb-2">
1188<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CART</td>
1189<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The association with your shopping cart.</td>
1190<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1191</tr>
1192<tr class="block lg:table-row mb-2">
1193<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CATEGORY_INFO</td>
1194<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>
1195<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1196</tr>
1197<tr class="block lg:table-row mb-2">
1198<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>COMPARE</td>
1199<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>
1200<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1201</tr>
1202<tr class="block lg:table-row mb-2">
1203<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER</td>
1204<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>
1205<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1206</tr>
1207<tr class="block lg:table-row mb-2">
1208<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_AUTH</td>
1209<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>
1210<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1211</tr>
1212<tr class="block lg:table-row mb-2">
1213<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_INFO</td>
1214<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>
1215<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1216</tr>
1217<tr class="block lg:table-row mb-2">
1218<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>toky_state</td>
1219<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1220<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>20 jours</td>
1221</tr>
1222<tr class="block lg:table-row mb-2">
1223<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>user_allowed_save_cookie</td>
1224<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>
1225<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td>
1226</tr>
1227<tr class="block lg:table-row mb-2">
1228<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>intercom-device-id-cv6ld8kq</td>
1229<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>
1230<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>63 jours</td>
1231</tr>
1232<tr class="block lg:table-row mb-2">
1233<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__cf_bm</td>
1234<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>
1235<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>154 jours</td>
1236</tr>
1237<tr class="block lg:table-row mb-2">
1238<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>intercom-id-cv6ld8kq</td>
1239<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1240<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>56 jours</td>
1241</tr>
1242<tr class="block lg:table-row mb-2">
1243<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>private_content_version</td>
1244<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1245<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>55 jours</td>
1246</tr>
1247<tr class="block lg:table-row mb-2">
1248<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>visitor_country</td>
1249<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>	Choix du volet pays</td>
1250<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>17 jours</td>
1251</tr>
1252<tr class="block lg:table-row mb-2">
1253<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>form_key</td>
1254<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1255<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>0</td>
1256</tr>
1257<tr class="block lg:table-row mb-2">
1258<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>PHPSESSID</td>
1259<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1260<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td>
1261</tr>
1262<tr class="block lg:table-row mb-2">
1263<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>last_visited_store</td>
1264<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1265<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>25 jours</td>
1266</tr>
1267<tr class="block lg:table-row mb-2">
1268<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CONSENT</td>
1269<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>
1270<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>18 jours</td>
1271</tr>
1272<tr class="block lg:table-row mb-2">
1273<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>section_data_ids</td>
1274<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1275<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1276</tr>
1277</table>
1278</div>
1279</div>
1280</div>
1281<div x-data="{open2: false}"
1282     x-defer="interact"
1283     class="cookie-group-container cookie-group-container-2 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm"
1284     data-nosnippet
1285>
1286<div class="flex flex justify-between">
1287<p class="title text-lg cursor-pointer"
1288            x-on:click="open2 = !open2">
1289<span x-show="! open2"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span>
1290<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>
1291Cookies commerciaux        </p>
1292
1293<input class="checkbox disabled:opacity-40" type="checkbox" value="1"  checked data-group-id="2" name="allowed-group-2">
1294</div>
1295<div class="content mt-4 pl-5" x-show.transition.origin.top="open2" style="display: none">
1296<div>
1297Ces 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;
1297autorisez pas ces cookies, vous ne serez pas nécessairement moins ciblé(e) par des publicités, mais celles-ci seront moins ciblées.        </div>
1298<div class="cookie-list text-sm hidden">
1299<table class="block lg:table">
1300<tr class="hidden lg:table-row border-b">
1301<th class="p-2 text-left">Nom</th>
1302<th class="p-2 text-left">Description</th>
1303<th class="p-2 text-left">Durée max. validité</th>
1304</tr>
1305<tr class="block lg:table-row mb-2">
1306<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_SEGMENT_IDS</td>
1307<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stores your Customer Segment ID</td>
1308<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1309</tr>
1310<tr class="block lg:table-row mb-2">
1311<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>EXTERNAL_NO_CACHE</td>
1312<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>
1313<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1314</tr>
1315<tr class="block lg:table-row mb-2">
1316<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>FRONTEND</td>
1317<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Your session ID on the server.</td>
1318<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1319</tr>
1320<tr class="block lg:table-row mb-2">
1321<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>GUEST-VIEW</td>
1322<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Allows guests to edit their orders.</td>
1323<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1324</tr>
1325<tr class="block lg:table-row mb-2">
1326<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>LAST_CATEGORY</td>
1327<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The last category you visited.</td>
1328<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1329</tr>
1330<tr class="block lg:table-row mb-2">
1331<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>LAST_PRODUCT</td>
1332<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The last product you looked at.</td>
1333<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1334</tr>
1335<tr class="block lg:table-row mb-2">
1336<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>NEWMESSAGE</td>
1337<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>
1338<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1339</tr>
1340<tr class="block lg:table-row mb-2">
1341<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>NO_CACHE</td>
1342<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>
1343<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1344</tr>
1345<tr class="block lg:table-row mb-2">
1346<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>PERSISTENT_SHOPPING_CART</td>
1347<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>
1348<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1349</tr>
1350<tr class="block lg:table-row mb-2">
1351<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>1P_JAR</td>
1352<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>
1353<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>18 jours</td>
1354</tr>
1355<tr class="block lg:table-row mb-2">
1356<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDCC</td>
1357<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>
1358<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>90 jours</td>
1359</tr>
1360<tr class="block lg:table-row mb-2">
1361<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SIDCC</td>
1362<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>
1363<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>81 jours</td>
1364</tr>
1365<tr class="block lg:table-row mb-2">
1366<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PAPISID</td>
1367<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>
1368<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>51 jours</td>
1369</tr>
1370<tr class="block lg:table-row mb-2">
1371<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SAPISID</td>
1372<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>
1373<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td>
1374</tr>
1375<tr class="block lg:table-row mb-2">
1376<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SSID</td>
1377<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>
1378<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>21 jours</td>
1379</tr>
1380<tr class="block lg:table-row mb-2">
1381<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDD</td>
1382<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>
1383<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>167 jours</td>
1384</tr>
1385<tr class="block lg:table-row mb-2">
1386<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDD</td>
1387<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>
1388<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>167 jours</td>
1389</tr>
1390<tr class="block lg:table-row mb-2">
1391<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDTS</td>
1392<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>
1393<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>93 jours</td>
1394</tr>
1395<tr class="block lg:table-row mb-2">
1396<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>HSID</td>
1397<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>
1398<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>21 jours</td>
1399</tr>
1400<tr class="block lg:table-row mb-2">
1401<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>
1401APISID</td>
1402<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>
1403<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>40 jours</td>
1404</tr>
1405<tr class="block lg:table-row mb-2">
1406<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDCC</td>
1407<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1408<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>0</td>
1409</tr>
1410<tr class="block lg:table-row mb-2">
1411<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDTS</td>
1412<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>
1413<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>93 jours</td>
1414</tr>
1415<tr class="block lg:table-row mb-2">
1416<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PAPISID</td>
1417<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td>
1418<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>51 jours</td>
1419</tr>
1420<tr class="block lg:table-row mb-2">
1421<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SID</td>
1422<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session.</td>
1423<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>156 jours</td>
1424</tr>
1425<tr class="block lg:table-row mb-2">
1426<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga</td>
1427<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>
1428<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>30 jours</td>
1429</tr>
1430<tr class="block lg:table-row mb-2">
1431<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SOCS</td>
1432<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>
1433<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>58 jours</td>
1434</tr>
1435</table>
1436</div>
1437</div>
1438</div>
1439<div x-data="{open3: false}"
1440     x-defer="interact"
1441     class="cookie-group-container cookie-group-container-3 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm"
1442     data-nosnippet
1443>
1444<div class="flex flex justify-between">
1445<p class="title text-lg cursor-pointer"
1446            x-on:click="open3 = !open3">
1447<span x-show="! open3"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span>
1448<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>
1449Analyse &amp; performances        </p>
1450
1451<input class="checkbox disabled:opacity-40" type="checkbox" value="1"  checked data-group-id="3" name="allowed-group-3">
1452</div>
1453<div class="content mt-4 pl-5" x-show.transition.origin.top="open3" style="display: none">
1454<div>
1455Ces 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>
1456<div class="cookie-list text-sm hidden">
1457<table class="block lg:table">
1458<tr class="hidden lg:table-row border-b">
1459<th class="p-2 text-left">Nom</th>
1460<th class="p-2 text-left">Description</th>
1461<th class="p-2 text-left">Durée max. validité</th>
1462</tr>
1463<tr class="block lg:table-row mb-2">
1464<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>RECENTLYCOMPARED</td>
1465<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The items you recently compared.</td>
1466<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1467</tr>
1468<tr class="block lg:table-row mb-2">
1469<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>STF</td>
1470<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>
1471<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1472</tr>
1473<tr class="block lg:table-row mb-2">
1474<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>STORE</td>
1475<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>
1476<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1477</tr>
1478<tr class="block lg:table-row mb-2">
1479<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>USER_ALLOWED_SAVE_COOKIE</td>
1480<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Indicates whether a customer authorized cookies.</td>
1481<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1482</tr>
1483<tr class="block lg:table-row mb-2">
1484<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>VIEWED_PRODUCT_IDS</td>
1485<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>
1486<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1487</tr>
1488<tr class="block lg:table-row mb-2">
1489<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>WISHLIST</td>
1490<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>
1491<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1492</tr>
1493<tr class="block lg:table-row mb-2">
1494<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>WISHLIST_CNT</td>
1495<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>
1496<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td>
1497</tr>
1498<tr class="block lg:table-row mb-2">
1499<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_RQXSGJFQ59</td>
1500<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>
1501<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1502</tr>
1503<tr class="block lg:table-row mb-2">
1504<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_GJH9RGDDP5</td>
1505<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>
1506<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1507</tr>
1508<tr class="block lg:table-row mb-2">
1509<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_X6LMX9VR0Y</td>
1510<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>
1511<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>60 jours</td>
1512</tr>
1513<tr class="block lg:table-row mb-2">
1514<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_gid</td>
1515<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>
1516<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>30 jours</td>
1517</tr>
1518<tr class="block lg:table-row mb-2">
1519<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_4BXXKZJZTZ</td>
1520<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>
1521<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1522</tr>
1523<tr class="block lg:table-row mb-2">
1524<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_gcl_au</td>
1525<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;
1525efficacité de la publicité sur les sites Web utilisant leurs services.</td>
1526<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>31 jours</td>
1527</tr>
1528<tr class="block lg:table-row mb-2">
1529<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SEARCH_SAMESITE</td>
1530<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>
1531<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>23 jours</td>
1532</tr>
1533<tr class="block lg:table-row mb-2">
1534<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_1LGNSX0EVM</td>
1535<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>
1536<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1537</tr>
1538<tr class="block lg:table-row mb-2">
1539<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_B8SKQ9HHPZ</td>
1540<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>
1541<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td>
1542</tr>
1543<tr class="block lg:table-row mb-2">
1544<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_Z574RD7GDB</td>
1545<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>
1546<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>60 jours</td>
1547</tr>
1548</table>
1549</div>
1550</div>
1551</div>
1552</div>
1553<button class="btn btn-primary mx-auto mt-4 text-sm cursor-pointer"
1554                    x-on:click="save"><span>Enregistrer</span></button>
1555</div>
1556</div>
1557</div>
1558<script>
1559    function initGdprSettingsModal() {
1560        return {
1561            open: false,
1562            close: function () {
1563                this.open = false;
1564                document.querySelector('body').style.overflowY = 'auto';
1565                document.querySelector('body').style.overflowX = 'clip';
1566            },
1567            init: function () {
1568                window.addEventListener('mst-gdpr-cookie-settings-open', () => {
1569                    document.querySelector('body').style.overflow = 'hidden';
1570                    this.open = true;
1571                })
1572            },
1573            save: function () {
1574                window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-save'));
1575                this.close();
1576            }
1577        };
1578    }
1579</script>
1579
1580<input name="form_key" type="hidden" value="GlviVI2SJRtUGRrR" />
1581<noscript>
1582        <section
1583            class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"
1584            aria-labelledby="messageGlobalNoScriptMessage"
1585        >
1586            <div class="container text-center">
1587                <p id="messageGlobalNoScriptMessage">
1588                    <strong>Javascript est désactivé dans votre navigateur.</strong>
1589                    <span>
1590                        Pour une meilleure expérience sur notre site, assurez-vous d’activer JavaScript dans votre navigateur.                    </span>
1591                </p>
1592            </div>
1593        </section>
1594    </noscript>
1595
1596
1597<span class="sr-only">
1598<svg width="0" height="0" xmlns="http://www.w3.org/2000/svg">
1599        <symbol id="account-symbol" viewBox="0 0 1024 1024">
1600            <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>
1601        </symbol>
1602
1603        <symbol id="alert-symbol" viewBox="0 0 24 24" fill="none">
1604            <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"/>
1605        </symbol>
1606
1607        <symbol id="basket-symbol" viewBox="0 0 1024 1024" fill="none">
1608            <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
160865.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"/>
1609        </symbol>
1610
1611        <symbol id="calendar-symbol" viewBox="0 0 24 24">
1612            <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"/>
1613        </symbol>
1614
1615        <symbol id="check-symbol" viewBox="0 0 24 24">
1616            <path d="M5.52637 11.8235L10.6627 17L18.5264 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
1617        </symbol>
1618
1619        <symbol id="chevron-symbol" viewBox="0 0 288 488">
1620            <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" />
1621        </symbol>
1622
1623        <symbol id="close-symbol" viewBox="0 0 24 24">
1624            <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"/>
1625            <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"/>
1626        </symbol>
1627
1628        <symbol id="delete-symbol" viewBox="0 0 804 1024">
1629            <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
162912t-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"/>
1630        </symbol>
1631
1632        <symbol id="edit-symbol" viewBox="0 0 878 1024">
1633            <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"/>
1634        </symbol>
1635
1636        <symbol id="filter-symbol" viewBox="0 0 1024 1024">
1637            <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>
1638        </symbol>
1639
1640        <symbol id="flower-symbol" viewBox="0 0 16 16">
1641            <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"/>
1642        </symbol>
1643
1644        <symbol id="heart-empty-symbol" viewBox="0 0 24 24">
1645            <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" />
1646        </symbol>
1647
1648        <symbol id="heart-full-symbol" viewBox="0 0 128 128">
1649            <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
16495.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"/>
1650        </symbol>
1651
1652        <symbol id="help-symbol" viewBox="0 0 24 24" fill="none">
1653            <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"/>
1654        </symbol>
1655
1656        <symbol id="home-symbol" viewBox="0 0 30 32" fill="none">
1657            <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>
1658        </symbol>
1659
1660        <symbol id="hourglass-symbol" viewBox="0 0 24 24" fill="none">
1661            <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"/>
1662        </symbol>
1663
1664        <symbol id="info-symbol" viewBox="0 0 24 24">
1665            <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"/>
1666        </symbol>
1667
1668        <symbol id="logout-symbol" viewBox="0 0 384 448">
1669            <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>
1670        </symbol>
1671
1672        <symbol id="map-marker-symbol" viewBox="0 0 18 32">
1673            <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.
1673125 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>
1674        </symbol>
1675
1676        <symbol id="search-symbol" viewBox="0 0 24 24" fill="none">
1677            <circle cx="11" cy="10" r="8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1678            <path d="M16.3334 16.6667L21 21.3334" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
1679        </symbol>
1680
1681        <symbol id="sort-symbol" viewBox="0 0 1024 1024">
1682            <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"/>
1683        </symbol>
1684
1685        <symbol id="star-symbol" viewBox="0 0 24 24">
1686            <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"/>
1687        </symbol>
1688
1689        <symbol id="view-symbol" viewBox="0 0 24 24">
1690            <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 
16901.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"/>
1691        </symbol>
1692
1693        <symbol id="warning-symbol" viewBox="0 0 1024 1024">
1694            <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>
1695        </symbol>
1696    </svg>
1697</span>
1698
1699<script>
1700    'use strict';
1701
1702        const isTouchDevice = () => ('ontouchstart' in window) ||
1703            (navigator.maxTouchPoints > 0) ||
1704            (navigator.msMaxTouchPoints > 0);
1705
1706        function switchBodyOverflow(signal) {
1707        const body = document.querySelector('body');
1708        if (signal) {
1709            // html.style.overflowY = 'auto';
1710            body.style.overflowY = 'auto';
1711            body.style.overflowX = 'clip';
1712        } else {
1713            // html.style.overflowX = html.style.overflowY = 'hidden';
1714            body.style.overflowX = body.style.overflowY = 'hidden';
1715        }
1716    }
1717
1718    /**
1719     * View model for header drawers
1720     *
1721     * @param String srcElementSel
1722     */
1723    function initDrawer(srcElementSel) {
1724        return {
1725            open: false,
1726            srcElements: null,
1727
1728            init() {
1729                this.srcElements = document.querySelectorAll(srcElementSel);
1730            },
1731
1732            toggle(signal = null) {
1733                signal = typeof signal == "boolean" ? signal : !this.open
1734                if (signal !== this.open) {
1735                    this.open = signal;
1736                    switchBodyOverflow(!signal);
1737                    if (this.srcElements) {
1738                        for (let i = 0; i < this.srcElements.length; ++i) {
1739                            this.srcElements[i].setAttribute('aria-expanded', this.open);
1740                        }
1741                    }
1742                }
1743            },
1744
1745            drawerListeners: {
1746                ['@keydown.window.escape']() {
1747                    this.toggle(false);
1748                }
1749            }
1750        }
1751    }
1752
1753    /**
1754     * Sticky page header: disparaît au scroll bas, réapparaît (compact) au rebond.
1755     * Actif sur toutes les pages.
1756     */
1757    function initStickyPageHeader() {
1758        // Pages « shop » : catégorie, fiche produit et résultats de recherche.
1759        // page-with-filter est posé par la navigation à facettes : il rattrape les listings bâtis sur
1760        // les handles catégorie mais servis par leur propre contrôleur (Webcooking_Promotions par
1761        // exemple), dont la classe body n'est pas catalog-category-view.
1762        const isCatalogPage = document.body.classList.contains('catalog-category-view')
1763            || document.body.classList.contains('catalog-product-view')
1764            || document.body.classList.contains('catalogsearch-result-index')
1765            || document.body.classList.contains('page-with-filter');
1766
1767        // Micro-mouvements de scroll : ils ne portent pas de sens de défilement.
1768        const SCROLL_DELTA = 8;
1769
1770        // Passer en mode compact raccourcit le header, donc la page. Le navigateur recale alors le
1771        // scroll d'autant (ancrage de scroll) pour garder le contenu en place : avec un seuil unique,
1772        // ce recul repasse sous le point de bascule, le header se redéploie, la page rallonge, le
1773        // scroll est recalé vers le bas... et l'aller-retour ne s'arrête plus (is-compact/is-hidden
1774        // qui clignotent).
1775        // On sort donc du mode compact beaucoup plus bas qu'on y entre : l'écart entre les deux
1776        // seuils doit dépasser le recalage, sinon la boucle se réinstalle. Quelques pixels de
1777        // tolérance plutôt que zéro strict : le scroll ne retombe pas toujours pile sur 0.
1778        const COMPACT_EXIT = 8;
1779
1780        // Fenêtre pendant laquelle un évènement de scroll est mis sur le compte de ce recalage
1781        // plutôt que sur celui de l'utilisateur. Le navigateur recale dans la foulée du changement
1782        // de hauteur (une frame) ; la borne évite qu'un recalage qui n'arrive jamais fasse avaler
1783        // le premier geste suivant, qui est précisément le rebond attendu.
1784        const REFLOW_WINDOW = 150;
1785
1786        return {
1787            lastScrollY: 0,
1788            // Hauteur du header déployé. On la remesure tant que le header n'est pas compact,
1789            // jamais en mode compact où il rétrécit : un seuil qui suit cette hauteur réduite
1790            // oscille autour du point de bascule.
1791            threshold: 0,
1792            // Instant de la dernière bascule, voir REFLOW_WINDOW.
1793            reflowAt: 0,
1794            header: null,
1795
1796            init() {
1797                if (!isCatalogPage) return;
1798                this.header = this.$root.closest('header') || this.$root;
1799                this.measureThreshold();
1800                window.addEventListener('scroll', this.onScroll.bind(this), {passive: true});
1801                window.addEventListener('resize', this.measureThreshold.bind(this), {passive: true});
1802            },
1803
1804            measureThreshold() {
1805                if (!this.header.classList.contains('is-compact')) {
1806                    this.threshold = this.header.offsetHeight;
1807                }
1808            },
1809
1810            onScroll() {
1811                this.measureThreshold();
1812
1813                const scrollY = Math.max(0, window.scrollY || document.documentElement.scrollTop);
1814
1815                if (this.reflowAt && performance.now() - this.reflowAt < REFLOW_WINDOW) {
1816                    this.reflowAt = 0;
1817                    this.lastScrollY = scrollY;
1818                    return;
1819                }
1820
1821                const delta = scrollY - this.lastScrollY;
1822
1823                // Le seuil de delta ne filtre que le SENS du défilement, jamais la décision
1824                // compact/déployé : une fin de scroll s'achève par des pas de quelques pixels,
1825                // et si on renonçait à décider sur ces évènements le header resterait compact
1826                // en haut de page.
1827                const isMove = Math.abs(delta) >= SCROLL_DELTA;
1828                if (isMove) {
1829                    this.lastScrollY = scrollY;
1830                }
1831
1832                // On entre en mode compact une fois le header dépassé ; on n'en sort qu'en haut
1833                // de page. Le header disparait à la descente et revient en compact au rebond.
1834                const wasCompact = this.header.classList.contains('is-compact');
1835                const compact = wasCompact ? scrollY > COMPACT_EXIT : scrollY > this.threshold;
1836                const hidden = isMove ? delta > 0 : this.header.classList.contains('is-hidden');
1837
1838                this.header.classList.toggle('is-hidden', compact && hidden);
1839
1840                if (compact !== wasCompact) {
1841                    this.header.classList.toggle('is-compact', compact);
1842                    this.reflowAt = performance.now();
1843                }
1844            }
1845        };
1846    }
1847
1848    /**
1849     * VM StickyHeader
1850     * Element sticks to the viewport top, hides on scrolling down and shows on scrolling up
1851     */
1852    function initStickyHeader(extraHeight = 200) {
1853        return {
1854            triggerLimit: 0,
1855            lastScrollTop: 0,
1856            active: false,
1857            hide: false,
1858
1859            init() {
1860                const eRect = this.$root.getBoundingClientRect();
1861                this.triggerLimit = extraHeight + eRect.top + eRect.height + (window.scrollY || document.documentElement.scrollTop);
1862                document.addEventListener('scroll', this.onScroll.bind(this), {passive: true});
1863            },
1864
1865            onScroll() {
1866                const scroll = window.scrollY || document.documentElement.scrollTop;
1867                if (scroll <= this.triggerLimit) {
1868                    this.active = this.hide = false;
1869                    this.$root.classList.remove('u-sticky-header', 'active', 'hide');
1870                } else {
1871                    this.$root.classList.add('u-sticky-header');
1872                    const isSticky = scroll > this.triggerLimit;
1873                    if (this.active !== isSticky) {
1874                        this.active = isSticky;
1875                        this.active ? this.$root.classList.add('active') : this.$root.classList.remove('active');
1876                    }
1877                    const scrollingDown = scroll > this.lastScrollTop;
1878                    if (this.hide !== scrollingDown) {
1879                        this.hide = scrollingDown;
1880                        this.hide ? this.$root.classList.add('hide') : this.$root.classList.remove('hide');
1881                    }
1882                }
1883                this.lastScrollTop = scroll;
1884            }
1885        };
1886    }
1887
1888    /**
1889     * VM StickyFooter
1890     * Element sticks to the viewport bottom, hides on scrolling down and shows on scrolling up
1891     * Also hides when reach a given element
1892     *
1893     * @param DomElement maxScrollElement
1894     * @param Boolean hiddenOnScroll
1895     */
1896    function initStickyFooter(maxScrollElement = null) {
1897        return {
1898            lastScrollTop: 0,
1899            maxScroll: Number.MAX_VALUE,
1900
1901            init() {
1902                this.$root.classList.add('u-sticky-footer');
1903                this.$root.style.zIndex = 20;
1904                document.addEventListener('scroll', this.onScroll.bind(this), {passive: true});
1905                if (maxScrollElement) {
1906                    const element = document.querySelector(maxScrollElement);
1907                    if (element) {
1908                        this.maxScroll = element.getBoundingClientRect().top + window.scrollY;
1909                    }
1910                }
1911            },
1912
1913            onScroll() {
1914                const st = window.scrollY || document.documentElement.scrollTop;
1915                st > this.lastScrollTop && st < this.maxScroll ?
1916                    this.$root.classList.add('hide') : this.$root.classList.remove('hide');
1917                this.lastScrollTop = st;
1918            }
1919        };
1920    }
1921
1922    /**
1923     * Makes element as a horizontal scrolling container for items with same width
1924     * Scroller must include a element with x-ref="slider" with its first child including items to be displayed
1925     * Left/right buttons may be defined through x-ref="left" and x-ref="right"
1926     */
1927    function initScroller() {
1928        return {
1929            isLeftBtnVisible: false,
1930            isRightBtnVisible: false,
1931            items: [],
1932            itemsVisibleInSlider: 0,
1933            firstVisibleItemIndex: 0,
1934
1935            init() {
1936                if (!this.$refs.slider) {
1937                    return;
1938                }
1939                this.items = Array.from(this.$refs.slider.firstElementChild.children);
1940                this.itemWidth = Math.abs(this.items[0].offsetLeft - (this.items?.[1]?.offsetLeft || 0));
1941                this.firstVisibleItemIndex = 0;
1942                this.updateScroller();
1943            },
1944
1945            slideToRight() {
1946                const maxScrollItemIndex = this.items.length - this.itemsVisibleInSlider;
1947                this.scrollTo(Math.min(maxScrollItemIndex, this.firstVisibleItemIndex + this.itemsVisibleInSlider));
1948            },
1949
1950            slideToLeft() {
1951                this.scrollTo(Math.max(0, this.firstVisibleItemIndex - this.itemsVisibleInSlider));
1952            },
1953
1954            scrollTo(index) {
1955                if (index >= 0 && index < this.items.length) {
1956                    this.$refs.slider.scroll(
1957                        { left: this.items[index].offsetLeft, behavior: 'smooth' }
1958                    );
1959                    this.firstVisibleItemIndex = index;
1960                    this.updateScroller();
1961                }
1962            },
1963
1964            updateScroller() {
1965                this.itemsVisibleInSlider = Math.floor(this.$refs.slider.clientWidth / this.itemWidth);
1966                this.isLeftBtnVisible = this.firstVisibleItemIndex > 0;
1967                this.isRightBtnVisible = this.itemsVisibleInSlider < (this.items.length - this.firstVisibleItemIndex - 1);
1968            },
1969
1970            eventListeners: {
1971                ['@resize.window.debounce']() {
1972                    this.updateScroller();
1973                },
1974                ['@touchmove.passive']() {
1975                    this.firstVisibleItemIndex = Math.floor(Math.abs(this.$refs.items.getBoundingClientRect().left) / this.itemWidth)
1976                    this.updateScroller();
1977                },
1978                ['@click'](event) {
1979                    const btn = event.target.closest('button');
1980                    if (btn) {
1981                        const isLeftBtn = btn.isSameNode(this.$refs.left);
1982                        isLeftBtn ? this.slideToLeft() : this.slideToRight();
1983                    }
1984                }
1985            }
1986        }
1987    }
1988
1989    document.addEventListener("DOMContentLoaded", function(event) {
1990        // Obfuscation (see https://www.410-gone.fr/seo/optimisation-on-site/maillage-interne/cocon-semantique/obfuscation.html)
1991        var classname = document.getElementsByClassName("qcd");
1992        for (let i = 0; i < classname.length; ++i) {
1993            //click gauche
1994            classname[i].addEventListener('click', myFunction, false);
1995            //click droit
1996            classname[i].addEventListener('contextmenu', myRightFunction, false);
1997        }
1998    });
1999    // fonction du click gauche
2000    var myFunction = function(event) {
2001        var attribute = this.getAttribute("data-qcd");
2002        if(event.ctrlKey) {
2003            var newWindow = window.open(decodeURIComponent(window.atob(attribute)), '_blank');
2004            newWindow.focus();
2005        } else {
2006            document.location.href= decodeURIComponent(window.atob(attribute));
2007        }
2008    };
2009    //fonction du click droit
2010    var myRightFunction = function(event) {
2011        var attribute = this.getAttribute("data-qcd");
2012        if(event.ctrlKey) {
2013            var newWindow = window.open(decodeURIComponent(window.atob(attribute)), '_blank');
2014            newWindow.focus();
2015        } else {
2016            window.open(decodeURIComponent(window.atob(attribute)),'_blank');
2017        }
2018    }
2019
2020        /**
2021     * Fetch server content
2022     * @param Element|String content
2023     * @param String insertionNode
2024     */
2025    function fetchContent(content, insertionNode = 'body') {
2026        const url = new URL('https://www.jardindupicvert.com/pdfcore/index/fetch/');
2027        const params = {
2028            content: content,
2029            form_key: hyva.getFormKey(),
2030        };
2031        Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));
2032        const target = insertionNode instanceof Element ? insertionNode : document.querySelector(insertionNode);
2033        if (target) {
2034            return fetch(url, {headers: {"X-Requested-With": "XMLHttpRequest"}})
2035                .then(response => response.json(response))
2036                .then(response => {
2037                    response?.result && target?.insertAdjacentHTML('beforeend', response?.result);
2038                    return response?.result;
2039                });
2040        }
2041    }
2042
2043    // Fetch non-essential svg symbols
2044    document.addEventListener("DOMContentLoaded", function() {
2045        setTimeout(() => {
2046            fetchContent('svg-symbols-defer');
2047        }, 1000);
2048    });
2049
2050</script>
2050
2051
2052<script>
2053    (function(hyva) {
2054                const formValidationRules = {
2055            required(value, options, field, context) {
2056                const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element,
2057                    fieldName = getFieldName(field),
2058                    msg = fieldName
2059                        ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020est\u0020obligatoire.', fieldName)
2060                        : 'Ce\u0020champ\u0020est\u0020obligatoire.';
2061
2062                if (el.type === 'radio' || el.type === 'checkbox') {
2063                    return (value === undefined || value.length === 0) ? msg : true;
2064                }
2065
2066                el.setAttribute('required', '');
2067                el.checkValidity();
2068
2069                return el.validity.valueMissing ? msg : true;
2070            },
2071            maxlength(value, options, field, context) {
2072                const n = Number(options)
2073                if (value.length > n) {
2074                    const fieldName = getFieldName(field);
2075                    return fieldName
2076                        ? n === 1
2077                            ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020peut\u0020pas\u0020\u00EAtre\u0020plus\u0020long\u0020que\u00201\u0020caract\u00E8re.', fieldName)
2078                            : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020peut\u0020pas\u0020\u00EAtre\u0020plus\u0020long\u0020que\u0020\u00252\u0020caract\u00E8res.', fieldName, options)
2079                        : n === 1
2080                            ? 'Veuillez\u0020entrer\u0020au\u0020maximum\u00201\u0020caract\u00E8re.'
2081                            : hyva.strf('Veuillez\u0020entrer\u0020au\u0020maximum\u0020\u00250\u0020caract\u00E8res.', options);
2082                }
2083                return true;
2084            },
2085            minlength(value, options, field, context) {
2086                const n = Number(options)
2087                if (value.length > 0 && value.length < n) {
2088                    const fieldName = getFieldName(field);
2089                    return fieldName
2090                        ? n === 1
2091                            ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020comporter\u0020au\u0020moins\u00201\u0020caract\u00E8re.', fieldName)
2092                            : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020comporter\u0020au\u0020moins\u0020\u00252\u0020caract\u00E8res.', fieldName, options)
2093                        : n === 1
2094                            ? 'Veuillez\u0020entrer\u0020au\u0020moins\u00201\u0020caract\u00E8re.'
2095                            : hyva.strf('Veuillez\u0020entrer\u0020au\u0020moins\u0020\u00250\u0020caract\u00E8res.', options);
2096                }
2097                return true;
2098            },
2099            max(value, options, field, context) {
2100                field.element.setAttribute('max', options);
2101                field.element.checkValidity();
2102                if (field.element.validity.rangeOverflow) {
2103                    const fieldName = getFieldName(field);
2104                    return fieldName
2105                        ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options)
2106                        : hyva.strf('Please\u0020enter\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options);
2107                }
2108                return true;
2109            },
2110            min(value, options, field, context) {
2111                field.element.setAttribute('min', options);
2112                field.element.checkValidity();
2113                if (field.element.validity.rangeUnderflow) {
2114                    const fieldName = getFieldName(field);
2115                    return fieldName
2116                        ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options)
2117                        : hyva.strf('Please\u0020enter\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options);
2118                }
2119                return true;
2120            },
2121            step(value, options, field, context) {
2122                field.element.setAttribute('step', options);
2123                field.element.checkValidity();
2124                if (field.element.validity.stepMismatch) {
2125                    const val = Number(value),
2126                        step = Number(options),
2127                        fieldName = getFieldName(field),
2128                        nearestLowerValue = Math.floor(val / step) * step,
2129                        nearestUpperValue = Math.ceil(val / step) * step;
2130                    return fieldName
2131                        ? hyva.str('\u00251\u0020field\u0020is\u0020invalid.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00252\u0022\u0020and\u0020\u0022\u00253\u0022.', fieldName, nearestLowerValue, nearestUpperValue)
2132                        : hyva.strf('Please\u0020enter\u0020a\u0020valid\u0020value.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00250\u0022\u0020and\u0020\u0022\u00251\u0022.', nearestLowerValue, nearestUpperValue);
2133                }
2134                return true;
2135            },
2136            pattern(value, options, field, context) {
2137                field.element.setAttribute('pattern', options);
2138                field.element.checkValidity();
2139                if (field.element.validity.patternMismatch) {
2140                    const fieldName = getFieldName(field);
2141                    return fieldName
2142                        ? field.element.pattern
2143                            ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020se\u0020conformer\u0020au\u0020format\u0020demand\u00E9\u003A\u0020\u00252.', fieldName, field.element.pattern)
2144                            : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020se\u0020conforme\u0020pas\u0020au\u0020format\u0020demand\u00E9.', fieldName)
2145                        : field.element.pattern
2146                            ? hyva.strf('Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9\u003A\u0020\u00250.', field.element.pattern)
2147                            : 'Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9.';
2148                }
2149                return true;
2150            },
2151            email(value, options, field, context) {
2152                                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;
2153                if (value.length > 0 && !rule.test(value)) {
2154                    const fieldName = getFieldName(field);
2155                    return fieldName
2156                        ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020contenir\u0020une\u0020adresse\u0020email\u0020valide\u0020\u0028par\u0020ex.\u0020jean\u0040domain.com\u0029.', fieldName)
2157                        : 'Veuillez\u0020entrer\u0020une\u0020adresse\u0020email\u0020valide\u0020\u0028par\u0020ex.\u0020jean\u0040domain.com\u0029.';
2158                }
2159                return true;
2160            },
2161            password(value, options, field, context) {
2162                const rule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/;
2163                if (value.length > 0 && !rule.test(value)) {
2164                    const fieldName = getFieldName(field);
2165                    return fieldName
2166                        ? 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)
2167                        : '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';
2168                }
2169                return true;
2170            },
2171            equalTo(value, options, field, context) {
2172                const dependencyField = context.fields[options].element;
2173                if (value !== dependencyField.value) {
2174                    const dependencyFieldName =
2175                        dependencyField.label ||
2176                        dependencyField.title ||
2177                        (dependencyField.labels && dependencyField.labels[0] && dependencyField.labels[0].innerText) ||
2178                        dependencyField.name,
2179                        fieldName = getFieldName(field);
2180                    return fieldName
2181                        ? hyva.str('\u00251\u0020field\u0020value\u0020must\u0020be\u0020the\u0020same\u0020as\u0020\u0022\u00252\u0022.', fieldName, dependencyFieldName)
2182                        : hyva.strf('Ce\u0020champ\u0020doit\u0020correspondre\u0020au\u0020champ\u0020\u0022\u00250\u0022.', dependencyFieldName);
2183                }
2184                return true;
2185            }
2186        };
2187
2188                function raceSome(promises, pred) {
2189            return new Promise((resolve, reject) => {
2190
2191                if (promises.length === 0) {
2192                    return resolve();
2193                }
2194
2195                let settled = false, nDone = 0;
2196
2197                const resolveIf = v => {
2198                    if (!settled && (pred(v) || ++nDone === promises.length)) {
2199                        settled = true;
2200                        resolve(v);
2201                    }
2202                    return v;
2203                }
2204
2205                promises.map(promise => {
2206                    promise.then(resolveIf).catch(reason => {
2207                        settled = true;
2208                        reject(reason)
2209                    });
2210                    return promise;
2211                });
2212            });
2213        }
2214
2215        const INPUT_ATTRIBUTE_RULES = {min: 'min', max: 'max', required: 'required', minlength: 'minlength', maxlength: 'maxlength', step: 'step', pattern: 'pattern'}
2216        const INPUT_TYPE_RULES = {email: 'email'}
2217
2218        function getRules(element) {
2219            let rules = {};
2220            Object.keys(INPUT_ATTRIBUTE_RULES).forEach(attrName => {
2221                if (element.hasAttribute(attrName)) {
2222                    rules[INPUT_ATTRIBUTE_RULES[attrName]] = element.getAttribute(attrName);
2223                }
2224            })
2225            if (INPUT_TYPE_RULES[element.type]) {
2226                rules[INPUT_TYPE_RULES[element.type]] = true;
2227            }
2228
2229            if (element.dataset.validate) {
2230                try {
2231                    Object.assign(rules, JSON.parse(element.dataset.validate));
2232                } catch (error) {
2233                    console.error('Validator error. Cannot parse data-validate attribute of element:\n', element);
2234                }
2235            }
2236
2237            return rules;
2238        }
2239
2240        function isInvalidRuleResult(ruleState) {
2241            return typeof ruleState === 'string' || !ruleState || (ruleState.type && ruleState.content);
2242        }
2243
2244        async function runValidateFn(rule, options, value, field) {
2245            return formValidationRules[rule](value, options, field, this);
2246        }
2247
2248        function generateId() {
2249            let id;
2250            do {
2251                id = `${this.idPrefix}-${++this.idSeq}`;
2252            } while (document.getElementById(id));
2253            return id;
2254        }
2255
2256        function isVisible(element) {
2257            const el = element.type !== 'hidden' ? element : (element.parentElement || {});
2258            return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length)
2259        }
2260
2261        function elementWillValidate(element) {
2262            return (element.willValidate || element.type === 'hidden')
2263                && element.tagName !== 'BUTTON'
2264                && element.disabled === false
2265                && !(element.tagName === 'INPUT' && element.type === 'submit')
2266                && (element.hasAttribute('data-validate-hidden') || isVisible(element))
2267        }
2268
2269        function createMessageContainer(el, fieldWrapperClassName) {
2270            if (! el.parentElement) {
2271                return;
2272            }
2273            const refocus = document.activeElement === el;
2274            const wrapper = document.createElement('div');
2275            wrapper.classList.add.apply(wrapper.classList, fieldWrapperClassName.split(' '));
2276            el.parentElement.insertBefore(wrapper, el);
2277            wrapper.appendChild(el);
2278            refocus && document.activeElement !== el && el.focus();
2279            return wrapper;
2280        }
2281
2282        function containerNotFound(selector, el) {
2283            const msg = `Cannot find message container element ${selector} of ${el.name}`;
2284            console.error(msg, el);
2285            throw msg;
2286        }
2287
2288        function createTextInputFrom(el) {
2289            const text = document.createElement('INPUT');
2290            text.type = 'text';
2291            text.value = el.value;
2292            return text;
2293        }
2294
2295        function classNamesToSelector(classNames) {
2296            return classNames.split(' ')
2297                .filter(className => className.length > 0)
2298                .map(className => `.${className}`)
2299                .join('')
2300        }
2301
2302        function hasMessagesWrapper(field, messagesWrapperClassName) {
2303            return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
2304        }
2305
2306        function getMessagesWrapper(field, messagesWrapperClassName) {
2307            if (hasMessagesWrapper.call(this, field, messagesWrapperClassName)) {
2308                return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName));
2309            }
2310
2311            const msgWrapper = document.createElement('ul');
2312            const msgId = generateId.call(this);
2313            msgWrapper.id = msgId;
2314            field.element.setAttribute('aria-errormessage', msgId);
2315            field.element.setAttribute('aria-describedby', msgId);
2316            msgWrapper.classList.add.apply(msgWrapper.classList, messagesWrapperClassName.split(' '));
2317            if (field.validateOnChange) {
2318                msgWrapper.setAttribute('aria-live', 'polite');
2319            }
2320            this.getMessageContainer(field).appendChild(msgWrapper);
2321
2322            return msgWrapper;
2323        }
2324
2325        function getCheckedValues(field) {
2326            const name = field.element.name.replace(/([\\"])/g, '\\$1');
2327            const elements = field.element.form.querySelectorAll('input[name="' + name + '"]:checked');
2328            return Array.from(elements).map(el => el.value);
2329        }
2330
2331        function escapeHtml(s) {
2332            const div = document.createElement('div')
2333            div.innerText = s;
2334            return div.innerHTML;
2335        }
2336
2337        
2338        function formValidation(form, options = {}) {
2339            const formElement = form || this.$el;
2340
2341            if (formElement.dataset && formElement.dataset.options) {
2342                try {
2343                    options = Object.assign(options, JSON.parse(formElement.dataset.options || '{}'));
2344                } catch (e) {
2345                    throw new Error('Cannot read the form options from the data-options attribute: not valid JSON');
2346                }
2347            }
2348
2349            // Disable browser default validation
2350            if (formElement.tagName === 'FORM') {
2351                formElement.setAttribute('novalidate', '');
2352            } else {
2353                console.error('formValidation can be initialized only on FORM element', formElement);
2354                return;
2355            }
2356
2357            options = Object.assign({
2358                fieldWrapperClassName: 'field field-reserved',
2359                messagesWrapperClassName: 'messages',
2360                validClassName: 'field-success',
2361                invalidClassName: 'field-error',
2362                pageMessagesWrapperSelector: null,
2363                scrollToFirstError: true,
2364            }, options || {});
2365
2366            return {
2367                state: {
2368                    valid: false,
2369                },
2370                isSubmitting: false,
2371                fields: {},
2372                idSeq: 0,
2373                idPrefix: formElement.id || 'vld-msg',
2374                setupFields(elements) {
2375                    this.fields = {};
2376                    Array.from(elements).forEach(element => {
2377                        if (elementWillValidate(element)) {
2378                            this.setupField(element);
2379                        }
2380                    });
2381                },
2382                setupField(element) {
2383                    if (! element) return;
2384                    const onChange = !!element.dataset.onChange;
2385                    if (elementWillValidate(element)) {
2386                        const rules = getRules(element);
2387                        if (Object.keys(rules).length > 0) {
2388                            if (this.fields[element.name]) {
2389                                Object.assign(this.fields[element.name].rules, rules);
2390                            } else {
2391                                this.fields[element.name] = {
2392                                    element,
2393                                    rules: rules,
2394                                    validateOnChange: onChange,
2395                                    state: {
2396                                        valid: null,
2397                                        rules: {}
2398                                    }
2399                                }
2400                            }
2401                        }
2402                    } else {
2403                        console.error('Element will not validate', element);
2404                    }
2405                },
2406                onSubmit(event) {
2407                    if (event.target.tagName === 'FORM') {
2408                        event.preventDefault();
2409
2410                        if (this.isSubmitting) return;
2411                        this.isSubmitting = true;
2412
2413                        this.validate()
2414                            .then(() => event.target.submit())
2415                            .catch(invalidElements => {
2416                                this.isSubmitting = false;
2417                            });
2418                    }
2419                },
2420                onChange(event) {
2421                    event.target.dataset.onChange = 'true';
2422                    if (!Object.keys(this.fields).length) {
2423                        this.setupFields(formElement.elements);
2424                    }
2425                    if (!Object.keys(this.fields).includes(event.target.name)) {
2426                        this.setupField(event.target);
2427                    }
2428                    const field = this.fields[event.target.name];
2429
2430                    this.validateField(field);
2431                    field && field.element.removeAttribute('data-on-change')
2432                },
2433                validateSafe() {
2434                    return new Promise(resolve => this.validate().then(() => resolve(true)).catch(() => {}))
2435                },
2436                validate() {
2437                    if (!Object.keys(this.fields).length || !Object.keys(this.fields).length !== formElement.elements.length) {
2438                        this.setupFields(formElement.elements);
2439                    }
2440                    return new Promise(async (resolve, reject) => {
2441                        if (formElement.elements) {
2442                                                        await raceSome(this.validateFields(), result => result !== true)
2443                            const invalidFields = Object.values(this.fields).filter(field => !field.state.valid);
2444                            this.state.valid = invalidFields.length === 0;
2445                            if (this.state.valid) {
2446                                resolve();
2447                            } else {
2448                                if (options.scrollToFirstError && invalidFields.length > 0) {
2449                                    invalidFields[0].element.focus()
2450                                    invalidFields[0].element.select && invalidFields[0].element.select();
2451                                }
2452                                reject(invalidFields.map(field => field.element));
2453                            }
2454                        }
2455                    });
2456                },
2457                                validateFields() {
2458                    const fields = Object.values(this.fields);
2459
2460                                        fields.forEach(field => {
2461                        this.getMessageContainer(field).classList.remove(options.validClassName, options.invalidClassName)
2462                    });
2463                                        return fields.map(field => this.validateField(field))
2464                },
2465                                validateField(field) {
2466                                        if (! field || ! elementWillValidate(field.element)) {
2467                        return new Promise(resolve => resolve(true))
2468                    }
2469
2470                    let value;
2471                    if (field.element.type === 'checkbox') {
2472                        value = getCheckedValues(field);
2473                    } else if (field.element.type === 'radio') {
2474                        value = getCheckedValues(field)[0] || undefined;
2475                    } else if (field.element.tagName === 'SELECT' && field.element.multiple) {
2476                        value = Array.from(field.element.selectedOptions).map(opt => opt.value);
2477                    } else {
2478                        value = field.element.value;
2479                    }
2480
2481                    const rules = field.rules || {};
2482
2483                                        field.state.valid = true;
2484                    this.showFieldState(field);
2485
2486                
2487                                        const fieldValidations = Object.keys(rules).filter(rule => formValidationRules[rule]).map(async rule => {
2488                        return runValidateFn.call(this, rule, rules[rule], value, field).then(result => {
2489                            field.state.rules[rule] = result;
2490                            return result;
2491                        })
2492                    });
2493
2494                    return new Promise(resolve => {
2495                                                Promise.all(fieldValidations).then(results => {
2496                                                                                    field.state.valid = !elementWillValidate(field.element) || rules.length === 0 || !results.some(isInvalidRuleResult)
2497                            this.showFieldState(field);
2498                            resolve(field.state.valid);
2499                        })
2500                    });
2501                },
2502                                getMessagesByField(field) {
2503                    const messages = [];
2504                    const invalidRules = Object.keys(field.state.rules).filter(rule => isInvalidRuleResult(field.state.rules[rule]));
2505
2506                    field.rules && Object.keys(field.rules).forEach((rule) => {
2507                        if (invalidRules.includes(rule)) {
2508                            const customMessage = field.element.getAttribute('data-msg-' + rule);
2509                            const message = customMessage ? customMessage : field.state.rules[rule];
2510                            const ruleOptions = JSON.parse(JSON.stringify(field.rules[rule]));
2511
2512                            if (typeof message === 'undefined' || message === null || (typeof message !== 'string' && ! message.type)) {
2513                                messages.push(hyva.strf('Validation rule "%0" failed.', rule));
2514                            } else if (Array.isArray(ruleOptions)) {
2515                                ruleOptions.unshift(message.type ? message.content : message);
2516                                const content = hyva.strf.apply(null, ruleOptions);
2517                                messages.push(message.type ? {type: message.type, content} : content);
2518                            } else {
2519                                const content = hyva.strf(message.type ? message.content : message, ruleOptions)
2520                                messages.push(message.type ? {type: message.type, content} : content);
2521                            }
2522                        }
2523                    });
2524                    return messages;
2525                },
2526                /** @deprecated */
2527                getFieldWrapper(field) {
2528                                        return this.getMessageContainer(field)
2529                },
2530                getMessageContainer(field) {
2531                    let container;
2532                    const pageSelector = field.element.getAttribute('data-validation-container') || options.pageMessagesContainerSelector;
2533                    if (pageSelector) {
2534                        container = document.querySelector(pageSelector)
2535                            || containerNotFound(pageSelector, field.element)
2536                    } else {
2537                        const containerSelector = classNamesToSelector(options.fieldWrapperClassName);
2538                        container = field.element.closest(containerSelector)
2539                            || createMessageContainer(field.element, options.fieldWrapperClassName)
2540                            || containerNotFound(containerSelector, field.element);
2541                    }
2542
2543                    return container;
2544                },
2545                showFieldState(field) {
2546                    const container = this.getMessageContainer(field),
2547                        hasErrorMessages = hasMessagesWrapper.call(this, field, options.messagesWrapperClassName),
2548                        messages = this.getMessagesByField(field).map(m => {
2549                            return m.type !== 'html' ? escapeHtml(m.type ? m.content : m) : m.content;
2550                        });
2551                    container.classList.toggle(options.validClassName, field.state.valid && ! hasErrorMessages);
2552                    container.classList.toggle(options.invalidClassName, !field.state.valid || hasErrorMessages);
2553                    this.createHtmlErrorMessage(field, messages);
2554
2555                    if (field.state.valid) {
2556                        field.element.removeAttribute('aria-invalid');
2557                    } else {
2558                        field.element.setAttribute('aria-invalid', 'true');
2559                        if (! document.activeElement) {
2560                            field.element.focus();
2561                        }
2562                    }
2563                },
2564                removeMessages(field, messagesClass) {
2565                    if (! hasMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName)) {
2566                        return;
2567                    }
2568
2569                    const msgWrapper = getMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName);
2570                    const messages = msgWrapper.querySelectorAll(`[data-msg-field='${field.element.name}']`);
2571                    Array.from(messages).forEach(msg => msg.remove());
2572                    if (msgWrapper && msgWrapper.childElementCount === 0) {
2573                        field.element.removeAttribute('aria-errormessage');
2574                        field.element.removeAttribute('aria-describedby');
2575                        msgWrapper.remove();
2576                    }
2577                },
2578                createErrorMessage(field, messages) {
2579                    const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
2580                    this.createHtmlErrorMessage(field, htmlMessages);
2581                },
2582                createHtmlErrorMessage(field, messages) {
2583                    this.removeMessages(field, options.messagesWrapperClassName);
2584                    field.element.removeAttribute('aria-errormessage');
2585                    field.element.removeAttribute('aria-describedby');
2586
2587                    if (!field.state.valid) {
2588                        const msgWrapper = this.addHtmlMessages(field, options.messagesWrapperClassName, messages);
2589                        field.element.setAttribute('aria-errormessage', msgWrapper.id);
2590                        field.element.setAttribute('aria-describedby', msgWrapper.id);
2591                    }
2592                },
2593                /** @deprecated */
2594                createMessage(field, message) {
2595                                        return this.addMessages(field, options.messagesWrapperClassName, message);
2596                },
2597                addMessages(field, messagesClass, messages) {
2598                    const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml)
2599                    return this.addHtmlMessages(field, messagesClass, htmlMessages);
2600                },
2601                addHtmlMessages(field, messagesClass, htmlMessages) {
2602                    const msgWrapper = getMessagesWrapper.call(this, field, messagesClass);
2603
2604                    (Array.isArray(htmlMessages) ? htmlMessages : [htmlMessages]).forEach((htmlMessage) => {
2605                        const li = document.createElement('li');
2606                        li.innerHTML = htmlMessage;
2607                        li.setAttribute('data-msg-field', field.element.name);
2608                        msgWrapper.appendChild(li);
2609                    });
2610
2611                    return msgWrapper;
2612                },
2613                setField(name, value) {
2614                    this.fields[name].element.value = value;
2615                    this.fields[name].element.dispatchEvent((new Event('input')));
2616                    this.validateField(this.fields[name]);
2617                }
2618            }
2619        }
2620
2621        function getFieldName(field) {
2622                        const fieldName = field.element?.getAttribute('title')
2623                || document.querySelector(`label[for="${field.element?.id}"]`)?.innerText;
2624
2625            return fieldName
2626                ? fieldName.trim()
2627                : '';
2628        }
2629
2630        hyva.formValidation = formValidation;
2631        hyva.formValidation.rules = formValidationRules;
2632        hyva.formValidation.setInputAttributeRuleName = (attrName, ruleName) => INPUT_ATTRIBUTE_RULES[attrName] = ruleName || attrName;
2633        hyva.formValidation.setInputTypeRuleName = (typeName, ruleName) => INPUT_TYPE_RULES[typeName] = ruleName || typeName;
2634        hyva.formValidation.addRule = (name, validator) => formValidationRules[name] = validator;
2635        hyva.formValidation.getFieldName = getFieldName;
2636    }(window.hyva = window.hyva || {}));
2637
2638    window.addEventListener('alpine:init', () => {
2639        Alpine.data('hyva.formValidation', hyva.formValidation);
2640        Alpine.data('hyva.formValidation($el)', hyva.formValidation);
2641    }, {once: true});
2642    //# sourceURL=hyva-advanced-form-validation.js
2643</script>
2643
2644<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
2645   contentarea"
2646   href="#contentarea">
2647<span>
2648Allez au contenu    </span>
2649</a>
2650<div id="header"
2651     x-data="initStickyPageHeader()"
2652     class="relative z-header w-full bg-container-darker"
2653>
2654<div class="container">
2655<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">
2656
2657<button class="compact-burger hidden order-0 shrink-0 text-white text-4xl font-bold leading-none cursor-pointer"
2658                    @click="$dispatch('open-main-menu')"
2659                    aria-label="Menu"
2660            >&equiv;</button>
2661
2662<div class="header-logo order-1 max-w-1/2 xs:max-w-[180px] sm:max-w-[240px] transition-all duration-500">
2663<a href="https://www.jardindupicvert.com/"
2664       aria-label="Go&#x20;to&#x20;Home&#x20;page"
2665    >
2666<svg class="logo-svg w-full aspect-[3.775]"
2667             viewBox="0 0 302 80"
2668             title="Le Jardin du Pic Vert"
2669        >
2670            <style type="text/css">
2671                .st0{fill:#004650;} .st1{fill:#2DAFAA;} .st2{fill:#C86464;} .st3{fill:#FFFFFF;}
2672            </style>
2673            <g class="layer">
2674                <g id="svg_2">
2675                    <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"/>
2676                    <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"/>
2677                    <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"/>
2678                    <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"/>
2679                    <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"/>
2680                    <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"/>
2681                    <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.
268116,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"/>
2682                    <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"/>
2683                </g>
2684                <g id="svg_11">
2685                    <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"/>
2686                    <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"/>
2687                    <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.
268715,-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.
268703,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"/>
2688                </g>
2689                <g id="svg_15">
2690                    <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"/>
2691                    <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"/>
2692                    <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 
2692-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"/>
2693                    <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"/>
2694                    <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.
269414 -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"/>
2695                    <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"/>
2696                    <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"/>
2697                    <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"/>
2698                    <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"/>
2699                    <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.
269903c0.2,-0.01 0.41,-0.02 0.62,-0.03l0,0.8l-4.02,0l0,-0.6l0.01,0z" id="svg_25"/>
2700                    <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"/>
2701                </g>
2702            </g>
2703        </svg>
2704<svg class="logo-svg-compact hidden w-full max-h-10"
2705             viewBox="0 0 102 80"
2706             title="Le Jardin du Pic Vert"
2707        >
2708            <style type="text/css">
2709                .st0{fill:#004650;} .st1{fill:#2DAFAA;} .st2{fill:#C86464;} .st3{fill:#FFFFFF;}
2710            </style>
2711            <g class="layer">
2712                <g id="svg_2">
2713                    <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"/>
2714                    <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"/>
2715                    <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"/>
2716                    <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"/>
2717                    <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"/>
2718                    <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"/>
2719                    <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.
271916,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"/>
2720                    <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"/>
2721                </g>
2722            </g>
2723        </svg>
2724</a>
2725</div>
2726
2727<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">
2728<span class="header-mobile-burger lg:hidden text-3xl text-white cursor-pointer"
2729                      @click.prevent="$dispatch('open-main-menu')"
2730                >
2731&equiv;
2732</span>
2733
2734<div data-role="search"
2735     class="relative w-full max-w-xl"
2736>
2737<div class="hidden lg:block mb-1 leading-none text-xs text-center text-white font-bold">
273814 899 variétés en 39 337 tailles        </div>
2739<div x-data="vmMinisearch()"
2740         x-defer="interact"
2741         @click.outside="show = false"
2742         class="container md:my-0 mx-auto"
2743    >
2744<form class="form minisearch"
2745              action="https://www.jardindupicvert.com/catalogsearch/result/"
2746              method="get"
2747        >
2748<div class="relative">
2749<svg class="absolute&#x20;w-10&#x20;h-10&#x20;p-2">
2750                    <use xlink:href="#search-symbol"></use>
2751                </svg>
2752<input x-model="input"
2753                       data-clarity-event="clic_champ_recherche"
2754                       @input.debounce="getSearchResults()"
2755                       type="search"
2756                       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"
2757                       autocapitalize="off"
2758                       autocomplete="off"
2759                       autocorrect="off"
2760                       name="q"
2761                       placeholder="Que&#x20;cherchez-vous&#x20;&#x3F;"
2762                       maxlength="128"
2763                />
2764<div class="hidden sm:block text-right leading-none">
2765<a class="underline text-2xs text-white font-bold hover:text-highlight"
2766                       href="https://www.jardindupicvert.com/toutes-les-plantes"
2767                       title="Recherche&#x20;par&#x20;filtres"
2768                       data-action="layers-search"
2769                    >
2770Recherche par filtres                    </a>
2771</div>
2772</div>
2773<div class="search-autocomplete relative w-full"
2774                 x-show="show"
2775                 x-cloak
2776            >
2777<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">
2778<svg @click.prevent="show = false"
2779                         class="absolute right-1 top-1 absolute w-6 h-6 text-primary"
2780                    >
2781                        <use xlink:href="#close-symbol"></use>
2782                    </svg>
2783<template x-for="searchResultByType in Object.values(searchResultsByType)">
2784<div class="font-bold text-sm">
2785<template x-for="searchResult in searchResultByType">
2786<div class="hover:bg-container-lighter pb-1">
2787
2788<template x-if="searchResult.type == 'term'">
2789<a class="u-test-ellipsis w-full block p-1" :href="searchResult.url" :title="searchResult.title">
2790<span x-html="formatOutput(searchResult.title)"></span>
2791<span class="text-xs bg-container-lighter p-1 rounded-xl" x-text="searchResult.num_results"></span>
2792</a>
2793</template>
2794
2795<template x-if="searchResult.type == 'product'">
2796<a class="w-full block"
2797       :class="{
2798            'text-primary': searchResult?.available === 'available'
2799       }"
2800       :href="searchResult.url"
2801       :title="searchResult.title"
2802    >
2803<div class="grid grid-cols-4 gap-4 p-3">
2804<div>
2805<img :src="searchResult.image" class="inline-block" />
2806</div>
2807<div class="col-span-3">
2808<span class="text-sm" x-text="searchResult.title"></span>
2809<span class="text-sm font-bold" x-html="searchResult.price"></span>
2810</div>
2811</div>
2812</a>
2813</template>
2814
2815<template x-if="searchResult.type == 'category'">
2816<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2817<span class="text-sm italic block text-gray-500" x-text="searchResult.breadcrumb.join(' > ').concat(' > ')"></span>
2818<span class="text-sm" x-text="searchResult.title"></span>
2819</a>
2820</template>
2821
2822<template x-if="searchResult.type == 'product_attribute'">
2823<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2824<span class="text-sm" x-text="searchResult.title"></span>
2825<span class="text-xs uppercase text-gray-500" x-text="searchResult.attribute_label" style="vertical-align: super;"></span>
2826</a>
2827</template>
2828
2829<script>
2830    function renderEsAutocompleteTitleAttribute(data)
2831    {
2832        data = data.filter(function(item) {
2833            return item.type === 'product_attribute';
2834        }).map(function(item) {
2835            return item['attribute_label']
2836        }).reduce(function(prev, item) {
2837            if (item in prev) {
2838                prev[item]++;
2839            } else {
2840                prev[item] = 1;
2841            }
2842            return prev;
2843        }, {});
2844
2845        data = Object.entries(data).sort(function(item1, item2) {
2846            return item2[1] - item1[1]
2847        }).map(function(item) {return item[0]});
2848
2849        if (data.length > 2) {
2850            data = data.slice(0, 2);
2851            data.push('...');
2852        }
2853
2854        return data.join(', ');
2855    }
2856</script>
2856
2857
2858<template x-if="searchResult.type == 'cms_page'">
2859<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2860<span class="text-sm" x-text="searchResult.title"></span>
2861</a>
2862</template>
2863<template x-if="searchResult.type == 'blog_post'">
2864<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title">
2865<span class="text-sm" x-text="searchResult.title"></span>
2866</a>
2867</template>
2868</div>
2869</template>
2870</div>
2871</template>
2872</div>
2873</div>
2874</form>
2875</div>
2876</div>
2877</div>
2878
2879<div id="header-icons"
2880                 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"
2881            >
2882<div id="wishlist-menu"
2883     x-data
2884     x-defer="event:amwishlist-alpine-init"
2885     @click.prevent="$store.customer.isLoggedIn ?
2886        $dispatch('toggle-wishlist-panel') :
2887        $dispatch('toggle-authentication', {
2888            url: `https://www.jardindupicvert.com/mwishlist/`,
2889            text: `Veuillez vous connecter à votre compte pour pouvoir gérer vos listes de favoris.`
2890        })
2891     "
2892     :class="{
2893           'text-primary-lighter': !$store.customer.isLoggedIn,
2894           'cursor-pointer': $store.customer.isLoggedIn
2895      }"
2896     class="relative inline-block lg:px-2 no-underline whitespace-nowrap"
2897     title="Mes&#x20;listes&#x20;de&#x20;favoris"
2898     role="button"
2899     aria-haspopup="true"
2900     aria-expanded="false"
2901     aria-controls="amwishlist-drawer"
2902>
2903<span class="sr-only label">
2904Mes listes de favoris    </span>
2905<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight">
2906        <use xlink:href="#heart-empty-symbol"></use>
2907    </svg>
2908<span x-show="$store.customer.isLoggedIn && $store.amwishlist?.lists"
2909          x-text="$store.amwishlist.lists.reduce((acc, l) => acc += l.items.length, 0) || 0"
2910          x-cloak
2911          class="absolute -right-2 top-0 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"
2912    ></span>
2913</div>
2914<span id="customer-menu"
2915      x-data
2916      x-defer="event:customer-alpine-init"
2917      @click.prevent="$store.customer.isLoggedIn ? $dispatch('toggle-customer-panel') : $dispatch('toggle-authentication', {})"
2918      :class="{
2919           'text-white cursor-pointer': $store.customer.isInit,
2920      }"
2921      class="relative text-primary-darker"
2922      title="Mon&#x20;compte"
2923      role="button"
2924      aria-haspopup="true"
2925      aria-expanded="false"
2926      aria-controls="customer-drawer"
2927>
2928<span class="sr-only label">
2929Mon compte    </span>
2930<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight"
2931         :class="{ 'text-primary-lighter': $store.customer.isLoggedIn }"
2932    >
2933        <use xlink:href="#account-symbol"></use>
2934    </svg>
2935<template x-if="$store.customer.isLoggedIn">
2936<span x-text="$store.customer.fullName.split(' ', 2).map(s => s?.[0]).join('')"
2937              class="absolute top-0 -right-2 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"></span>
2938</template>
2939</span>
2940<span id="cart-menu"
2941      x-data
2942      x-defer="event:customer-alpine-init"
2943      @click.prevent="$dispatch('toggle-cart-panel', {});"
2944      :class="{
2945           'text-primary-lighter': !$store.customer.isInit,
2946           'cursor-pointer': $store.customer.isInit
2947      }"
2948      class="relative lg:px-2 no-underline whitespace-nowrap"
2949      title="Mon&#x20;panier"
2950      role="button"
2951      aria-haspopup="true"
2952      aria-expanded="false"
2953      aria-controls="cart-drawer"
2954>
2955<span class="sr-only label">
2956Panier    </span>
2957<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight">
2958        <use xlink:href="#basket-symbol"></use>
2959    </svg>
2960<span x-text="$store?.minicart?.cart?.summary_count || '0'"
2961          class="absolute -right-2 top-0 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"></span>
2962</span>
2963<div id="glopal_cs_position"></div>
2964</div>
2965</div>
2966
2967<div id="main_nav"
2968             class="relative z-header"
2969        >
2970
2971<div x-data="initMainMenu()"
2972     @open-main-menu.window="openAt()"
2973     @close-main-menu.window="closeNav()"
2974     class="grow"
2975>
2976<nav x-cloak
2977         id="drawer-nav"
2978         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"
2979         :class="isOpen ? 'translate-x-0' : '-translate-x-full'"
2980         @keydown.window.escape="closeNav()"
2981    >
2982<div class="relative flex items-center justify-between gap-2 p-4 bg-container-dark text-white">
2983<a x-show="backId"
2984               class="leading-none"
2985               @click.prevent.stop="navBack()"
2986            >
2987<svg class="w-8 h-8 hover:text-primary-lighter rotate-90">
2988                    <use xlink:href="#chevron-symbol"></use>
2989                </svg>
2990</a>
2991<p class="flex grow py-2 whitespace-nowrap font-bold"
2992               x-html="title"></p>
2993<a @click.prevent.stop="closeNav()">
2994<span class="text-white text-4xl hover:text-primary-lighter leading-none cursor-pointer">&times;</span>
2995</a>
2996</div>
2997
2998<div class="relative grow">
2999<ol x-ref="nav"
3000                    @click.stop="openAt"
3001                    class="relative p-2 overflow-hidden text-base font-bold font-serif"
3002                    data-menu-lvl="0"
3003                >
3004<li class="py-2 "
3005    data-node-id="758"
3006>
3007<span class="flex items-center justify-between cursor-pointer
3008                 "
3009            style=""
3010        >
3011<span data-node-title>
3012Plantes vivaces            </span>
3013<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3014                    <use xlink:href="#chevron-symbol"></use>
3015                </svg>
3016</span>
3017<ol class="p-2"
3018            style="z-index: 1"
3019            data-menu-lvl="1"
3020        >
3021<li class="py-2 heading"
3022    data-node-id="758_0"
3023>
3024<a href="https://www.jardindupicvert.com/vivaces"
3025           title="Plantes&#x20;vivaces&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3026           class="u-text-ellipsis
3027                 "
3028            style=""
3029        >
3030<span data-node-title>
3031Plantes vivaces :  tous les produits            </span>
3032</a>
3033</li>
3034<li class="py-2 "
3035    data-node-id="758_0_1"
3036>
3037<span class="flex items-center justify-between cursor-pointer
3038                 "
3039            style=""
3040        >
3041<span data-node-title>
3042Toutes nos vivaces            </span>
3043<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3044                    <use xlink:href="#chevron-symbol"></use>
3045                </svg>
3046</span>
3047<ol class="p-2"
3048            style="z-index: 2"
3049            data-menu-lvl="2"
3050        >
3051<li class="py-2 heading"
3052    data-node-id="758_0_1_0"
3053>
3054<a href="https://www.jardindupicvert.com/vivaces"
3055           title="Toutes&#x20;nos&#x20;vivaces&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3056           class="u-text-ellipsis
3057                 "
3058            style=""
3059        >
3060<span data-node-title>
3061Toutes nos vivaces :  tous les produits            </span>
3062</a>
3063</li>
3064<li class="py-2 "
3065    data-node-id="758_0_1_0_1"
3066>
3067<a href="https://www.jardindupicvert.com/genre/achillea"
3068           title="Achill&#xE9;es"
3069           class="u-text-ellipsis
3070                 "
3071            style=""
3072        >
3073<span data-node-title>
3074Achillées            </span>
3075</a>
3076</li>
3077<li class="py-2 "
3078    data-node-id="758_0_1_0_1_2"
3079>
3080<a href="https://www.jardindupicvert.com/genre/aquilegia"
3081           title="Ancolies"
3082           class="u-text-ellipsis
3083                 "
3084            style=""
3085        >
3086<span data-node-title>
3087Ancolies            </span>
3088</a>
3089</li>
3090<li class="py-2 "
3091    data-node-id="758_0_1_0_1_2_3"
3092>
3093<a href="https://www.jardindupicvert.com/genre/anemone/anemone-hupehensis"
3094           title="An&#xE9;mones&#x20;du&#x20;Japon"
3095           class="u-text-ellipsis
3096                 "
3097            style=""
3098        >
3099<span data-node-title>
3100Anémones du Japon            </span>
3101</a>
3102</li>
3103<li class="py-2 "
3104    data-node-id="758_0_1_0_1_2_3_4"
3105>
3106<a href="https://www.jardindupicvert.com/genre/campanula"
3107           title="Campanules"
3108           class="u-text-ellipsis
3109                 "
3110            style=""
3111        >
3112<span data-node-title>
3113Campanules            </span>
3114</a>
3115</li>
3116<li class="py-2 "
3117    data-node-id="758_0_1_0_1_2_3_4_5"
3118>
3119<a href="https://www.jardindupicvert.com/genre/echinacea"
3120           title="Rudbeckias"
3121           class="u-text-ellipsis
3122                 "
3123            style=""
3124        >
3125<span data-node-title>
3126Rudbeckias            </span>
3127</a>
3128</li>
3129<li class="py-2 "
3130    data-node-id="758_0_1_0_1_2_3_4_5_6"
3131>
3132<a href="https://www.jardindupicvert.com/genre/geranium"
3133           title="G&#xE9;raniums"
3134           class="u-text-ellipsis
3135                 "
3136            style=""
3137        >
3138<span data-node-title>
3139Géraniums            </span>
3140</a>
3141</li>
3142<li class="py-2 "
3143    data-node-id="758_0_1_0_1_2_3_4_5_6_7"
3144>
3145<a href="https://www.jardindupicvert.com/genre/helleborus"
3146           title="Hell&#xE9;bores"
3147           class="u-text-ellipsis
3148                 "
3149            style=""
3150        >
3151<span data-node-title>
3152Hellébores            </span>
3153</a>
3154</li>
3155<li class="py-2 "
3156    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8"
3157>
3158<a href="https://www.jardindupicvert.com/genre/heuchera"
3159           title="Heuch&#xE8;res"
3160           class="u-text-ellipsis
3161                 "
3162            style=""
3163        >
3164<span data-node-title>
3165Heuchères            </span>
3166</a>
3167</li>
3168<li class="py-2 "
3169    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9"
3170>
3171<a href="https://www.jardindupicvert.com/genre/hosta"
3172           title="Hostas"
3173           class="u-text-ellipsis
3174                 "
3175            style=""
3176        >
3177<span data-node-title>
3178Hostas            </span>
3179</a>
3180</li>
3181<li class="py-2 "
3182    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10"
3183>
3184<a href="https://www.jardindupicvert.com/genre/dianthus"
3185           title="Oeillets"
3186           class="u-text-ellipsis
3187                 "
3188            style=""
3189        >
3190<span data-node-title>
3191Oeillets            </span>
3192</a>
3193</li>
3194<li class="py-2 "
3195    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
3196>
3197<a href="https://www.jardindupicvert.com/genre/persicaria"
3198           title="Persicaires"
3199           class="u-text-ellipsis
3200                 "
3201            style=""
3202        >
3203<span data-node-title>
3204Persicaires            </span>
3205</a>
3206</li>
3207<li class="py-2 "
3208    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
3209>
3210<a href="https://www.jardindupicvert.com/genre/vinca"
3211           title="Pervenches"
3212           class="u-text-ellipsis
3213                 "
3214            style=""
3215        >
3216<span data-node-title>
3217Pervenches            </span>
3218</a>
3219</li>
3220<li class="py-2 "
3221    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
3222>
3223<a href="https://www.jardindupicvert.com/genre/phlox"
3224           title="Phlox"
3225           class="u-text-ellipsis
3226                 "
3227            style=""
3228        >
3229<span data-node-title>
3230Phlox            </span>
3231</a>
3232</li>
3233<li class="py-2 "
3234    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14"
3235>
3236<a href="https://www.jardindupicvert.com/genre/paeonia/paeonia-lactiflora"
3237           title="Pivoines&#x20;herbac&#xE9;es"
3238           class="u-text-ellipsis
3239                 "
3240            style=""
3241        >
3242<span data-node-title>
3243Pivoines herbacées            </span>
3244</a>
3245</li>
3246<li class="py-2 "
3247    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15"
3248>
3249<a href="https://www.jardindupicvert.com/genre/salvia"
3250           title="Sauges"
3251           class="u-text-ellipsis
3252                 "
3253            style=""
3254        >
3255<span data-node-title>
3256Sauges            </span>
3257</a>
3258</li>
3259<li class="py-2 "
3260    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16"
3261>
3262<a href="https://www.jardindupicvert.com/genre/sedum"
3263           title="Sedum"
3264           class="u-text-ellipsis
3265                 "
3266            style=""
3267        >
3268<span data-node-title>
3269Sedum            </span>
3270</a>
3271</li>
3272</ol>
3273</li>
3274<li class="py-2 "
3275    data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2"
3276>
3277<span class="flex items-center justify-between cursor-pointer
3278                 "
3279            style=""
3280        >
3281<span data-node-title>
3282Graminées            </span>
3283<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3284                    <use xlink:href="#chevron-symbol"></use>
3285                </svg>
3286</span>
3287<ol class="p-2"
3288            style="z-index: 2"
3289            data-menu-lvl="2"
3290        >
3291<li class="py-2 heading"
3292    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"
3293>
3294<a href="https://www.jardindupicvert.com/graminees"
3295           title="Gramin&#xE9;es&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3296           class="u-text-ellipsis
3297                 "
3298            style=""
3299        >
3300<span data-node-title>
3301Graminées :  tous les produits            </span>
3302</a>
3303</li>
3304<li class="py-2 "
3305    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"
3306>
3307<a href="https://www.jardindupicvert.com/genre/deschampsia"
3308           title="Canches"
3309           class="u-text-ellipsis
3310                 "
3311            style=""
3312        >
3313<span data-node-title>
3314Canches            </span>
3315</a>
3316</li>
3317<li class="py-2 "
3318    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"
3319>
3320<a href="https://www.jardindupicvert.com/genre/carex"
3321           title="Carex"
3322           class="u-text-ellipsis
3323                 "
3324            style=""
3325        >
3326<span data-node-title>
3327Carex            </span>
3328</a>
3329</li>
3330<li class="py-2 "
3331    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"
3332>
3333<a href="https://www.jardindupicvert.com/genre/festuca"
3334           title="F&#xE9;tuques"
3335           class="u-text-ellipsis
3336                 "
3337            style=""
3338        >
3339<span data-node-title>
3340Fétuques            </span>
3341</a>
3342</li>
3343<li class="py-2 "
3344    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"
3345>
3346<a href="https://www.jardindupicvert.com/genre/pennisetum"
3347           title="Herbes&#x20;aux&#x20;&#xE9;couvillons"
3348           class="u-text-ellipsis
3349                 "
3350            style=""
3351        >
3352<span data-node-title>
3353Herbes aux écouvillons            </span>
3354</a>
3355</li>
3356<li class="py-2 "
3357    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"
3358>
3359<a href="https://www.jardindupicvert.com/genre/cortaderia"
3360           title="Herbes&#x20;des&#x20;pampas"
3361           class="u-text-ellipsis
3362                 "
3363            style=""
3364        >
3365<span data-node-title>
3366Herbes des pampas            </span>
3367</a>
3368</li>
3369<li class="py-2 "
3370    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"
3371>
3372<a href="https://www.jardindupicvert.com/genre/luzula"
3373           title="Luzules"
3374           class="u-text-ellipsis
3375                 "
3376            style=""
3377        >
3378<span data-node-title>
3379Luzules            </span>
3380</a>
3381</li>
3382<li class="py-2 "
3383    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"
3384>
3385<a href="https://www.jardindupicvert.com/genre/miscanthus/miscanthus-sinensis"
3386           title="Roseaux&#x20;de&#x20;Chine"
3387           class="u-text-ellipsis
3388                 "
3389            style=""
3390        >
3391<span data-node-title>
3392Roseaux de Chine            </span>
3393</a>
3394</li>
3395<li class="py-2 "
3396    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"
3397>
3398<a href="https://www.jardindupicvert.com/genre/phalaris"
3399           title="Rubans&#x20;de&#x20;la&#x20;Vierge"
3400           class="u-text-ellipsis
3401                 "
3402            style=""
3403        >
3404<span data-node-title>
3405Rubans de la Vierge            </span>
3406</a>
3407</li>
3408<li class="py-2 "
3409    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"
3410>
3411<a href="https://www.jardindupicvert.com/genre/stipa"
3412           title="Stipas"
3413           class="u-text-ellipsis
3414                 "
3415            style=""
3416        >
3417<span data-node-title>
3418Stipas            </span>
3419</a>
3420</li>
3421</ol>
3422</li>
3423<li class="py-2 "
3424    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"
3425>
3426<a href="https://www.jardindupicvert.com/plantes-aromatiques"
3427           title="Les&#x20;aromatiques"
3428           class="u-text-ellipsis
3429                 "
3430            style=""
3431        >
3432<span data-node-title>
3433Les aromatiques            </span>
3434</a>
3435</li>
3436<li class="py-2 "
3437    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"
3438>
3439<a href="https://www.jardindupicvert.com/fougeres"
3440           title="Les&#x20;foug&#xE8;res"
3441           class="u-text-ellipsis
3442                 "
3443            style=""
3444        >
3445<span data-node-title>
3446Les fougères            </span>
3447</a>
3448</li>
3449<li class="py-2 "
3450    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"
3451>
3452<a href="https://www.jardindupicvert.com/plantes-aquatiques"
3453           title="Les&#x20;aquatiques"
3454           class="u-text-ellipsis
3455                 "
3456            style=""
3457        >
3458<span data-node-title>
3459Les aquatiques            </span>
3460</a>
3461</li>
3462<li class="py-2 "
3463    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"
3464>
3465<span class="flex items-center justify-between cursor-pointer
3466                 "
3467            style=""
3468        >
3469<span data-node-title>
3470Plantes vivaces par utilisation            </span>
3471<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3472                    <use xlink:href="#chevron-symbol"></use>
3473                </svg>
3474</span>
3475<ol class="p-2"
3476            style="z-index: 2"
3477            data-menu-lvl="2"
3478        >
3479<li class="py-2 heading"
3480    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"
3481>
3482<a href="https://www.jardindupicvert.com/vivaces"
3483           title="Plantes&#x20;vivaces&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3484           class="u-text-ellipsis
3485                 "
3486            style=""
3487        >
3488<span data-node-title>
3489Plantes vivaces par utilisation :  tous les produits            </span>
3490</a>
3491</li>
3492<li class="py-2 "
3493    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"
3494>
3495<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-printaniere"
3496           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re"
3497           class="u-text-ellipsis
3498                 "
3499            style=""
3500        >
3501<span data-node-title>
3502Plantes vivaces à floraison printanière            </span>
3503</a>
3504</li>
3505<li class="py-2 "
3506    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"
3507>
3508<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-estivale"
3509           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;estivale"
3510           class="u-text-ellipsis
3511                 "
3512            style=""
3513        >
3514<span data-node-title>
3515Plantes vivaces à floraison estivale            </span>
3516</a>
3517</li>
3518<li class="py-2 "
3519    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"
3520>
3521<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-automnale"
3522           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;automnale"
3523           class="u-text-ellipsis
3524                 "
3525            style=""
3526        >
3527<span data-node-title>
3528Plantes vivaces à floraison automnale            </span>
3529</a>
3530</li>
3531<li class="py-2 "
3532    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"
3533>
3534<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-hivernale"
3535           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;floraison&#x20;hivernale"
3536           class="u-text-ellipsis
3537                 "
3538            style=""
3539        >
3540<span data-node-title>
3541Plantes vivaces à floraison hivernale            </span>
3542</a>
3543</li>
3544<li class="py-2 "
3545    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"
3546>
3547<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-d-ombre"
3548           title="Plantes&#x20;vivaces&#x20;d&#x27;ombre"
3549           class="u-text-ellipsis
3550                 "
3551            style=""
3552        >
3553<span data-node-title>
3554Plantes vivaces d&#039;ombre            </span>
3555</a>
3556</li>
3557<li class="py-2 "
3558    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"
3559>
3560<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-couvre-sol"
3561           title="Plantes&#x20;vivaces&#x20;couvre-sol"
3562           class="u-text-ellipsis
3563                 "
3564            style=""
3565        >
3566<span data-node-title>
3567Plantes vivaces couvre-sol            </span>
3568</a>
3569</li>
3570<li class="py-2 "
3571    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"
3572>
3573<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-parfumees"
3574           title="Plantes&#x20;vivaces&#x20;parfum&#xE9;es"
3575           class="u-text-ellipsis
3576                 "
3577            style=""
3578        >
3579<span data-node-title>
3580Plantes vivaces parfumées            </span>
3581</a>
3582</li>
3583<li class="py-2 "
3584    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"
3585>
3586<a href="https://www.jardindupicvert.com/vivaces/vivaces-d-ombre-geantes"
3587           title="Plantes&#x20;vivaces&#x20;g&#xE9;antes"
3588           class="u-text-ellipsis
3589                 "
3590            style=""
3591        >
3592<span data-node-title>
3593Plantes vivaces géantes            </span>
3594</a>
3595</li>
3596<li class="py-2 "
3597    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"
3598>
3599<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-feuillage-persistant"
3600           title="Plantes&#x20;vivaces&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
3601           class="u-text-ellipsis
3602                 "
3603            style=""
3604        >
3605<span data-node-title>
3606Plantes vivaces à feuillage persistant            </span>
3607</a>
3608</li>
3609</ol>
3610</li>
3611<li class="py-2 "
3612    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"
3613>
3614<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-en-pot-de-2-3l"
3615           title="Plantes&#x20;vivaces&#x20;en&#x20;grands&#x20;pots"
3616           class="u-text-ellipsis
3617                 "
3618            style=""
3619        >
3620<span data-node-title>
3621Plantes vivaces en grands pots            </span>
3622</a>
3623</li>
3624</ol>
3625</li>
3626<li class="py-2 "
3627    data-node-id="800"
3628>
3629<span class="flex items-center justify-between cursor-pointer
3630                 "
3631            style=""
3632        >
3633<span data-node-title>
3634Arbustes            </span>
3635<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3636                    <use xlink:href="#chevron-symbol"></use>
3637                </svg>
3638</span>
3639<ol class="p-2"
3640            style="z-index: 1"
3641            data-menu-lvl="1"
3642        >
3643<li class="py-2 heading"
3644    data-node-id="800_0"
3645>
3646<a href="https://www.jardindupicvert.com/arbustes"
3647           title="Arbustes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3648           class="u-text-ellipsis
3649                 "
3650            style=""
3651        >
3652<span data-node-title>
3653Arbustes :  tous les produits            </span>
3654</a>
3655</li>
3656<li class="py-2 "
3657    data-node-id="800_0_1"
3658>
3659<span class="flex items-center justify-between cursor-pointer
3660                 "
3661            style=""
3662        >
3663<span data-node-title>
3664Tous nos arbustes            </span>
3665<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3666                    <use xlink:href="#chevron-symbol"></use>
3667                </svg>
3668</span>
3669<ol class="p-2"
3670            style="z-index: 2"
3671            data-menu-lvl="2"
3672        >
3673<li class="py-2 heading"
3674    data-node-id="800_0_1_0"
3675>
3676<a href="https://www.jardindupicvert.com/arbustes"
3677           title="Tous&#x20;nos&#x20;arbustes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3678           class="u-text-ellipsis
3679                 "
3680            style=""
3681        >
3682<span data-node-title>
3683Tous nos arbustes :  tous les produits            </span>
3684</a>
3685</li>
3686<li class="py-2 "
3687    data-node-id="800_0_1_0_1"
3688>
3689<a href="https://www.jardindupicvert.com/genre/buxus"
3690           title="Buis"
3691           class="u-text-ellipsis
3692                 "
3693            style=""
3694        >
3695<span data-node-title>
3696Buis            </span>
3697</a>
3698</li>
3699<li class="py-2 "
3700    data-node-id="800_0_1_0_1_2"
3701>
3702<a href="https://www.jardindupicvert.com/genre/ceanothus"
3703           title="C&#xE9;anothes"
3704           class="u-text-ellipsis
3705                 "
3706            style=""
3707        >
3708<span data-node-title>
3709Céanothes            </span>
3710</a>
3711</li>
3712<li class="py-2 "
3713    data-node-id="800_0_1_0_1_2_3"
3714>
3715<a href="https://www.jardindupicvert.com/genre/lonicera"
3716           title="Ch&#xE8;vrefeuilles"
3717           class="u-text-ellipsis
3718                 "
3719            style=""
3720        >
3721<span data-node-title>
3722Chèvrefeuilles            </span>
3723</a>
3724</li>
3725<li class="py-2 "
3726    data-node-id="800_0_1_0_1_2_3_4"
3727>
3728<a href="https://www.jardindupicvert.com/genre/cornus"
3729           title="Cornouillers"
3730           class="u-text-ellipsis
3731                 "
3732            style=""
3733        >
3734<span data-node-title>
3735Cornouillers            </span>
3736</a>
3737</li>
3738<li class="py-2 "
3739    data-node-id="800_0_1_0_1_2_3_4_5"
3740>
3741<a href="https://www.jardindupicvert.com/arbustes/erables-du-japon"
3742           title="&#xC9;rables&#x20;du&#x20;Japon"
3743           class="u-text-ellipsis
3744                 "
3745            style=""
3746        >
3747<span data-node-title>
3748Érables du Japon            </span>
3749</a>
3750</li>
3751<li class="py-2 "
3752    data-node-id="800_0_1_0_1_2_3_4_5_6"
3753>
3754<a href="https://www.jardindupicvert.com/genre/euonymus"
3755           title="Fusains"
3756           class="u-text-ellipsis
3757                 "
3758            style=""
3759        >
3760<span data-node-title>
3761Fusains            </span>
3762</a>
3763</li>
3764<li class="py-2 "
3765    data-node-id="800_0_1_0_1_2_3_4_5_6_7"
3766>
3767<a href="https://www.jardindupicvert.com/genre/hydrangea"
3768           title="Hortensias"
3769           class="u-text-ellipsis
3770                 "
3771            style=""
3772        >
3773<span data-node-title>
3774Hortensias            </span>
3775</a>
3776</li>
3777<li class="py-2 "
3778    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8"
3779>
3780<a href="https://www.jardindupicvert.com/genre/ilex"
3781           title="Houx"
3782           class="u-text-ellipsis
3783                 "
3784            style=""
3785        >
3786<span data-node-title>
3787Houx            </span>
3788</a>
3789</li>
3790<li class="py-2 "
3791    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9"
3792>
3793<a href="https://www.jardindupicvert.com/genre/syringa"
3794           title="Lilas"
3795           class="u-text-ellipsis
3796                 "
3797            style=""
3798        >
3799<span data-node-title>
3800Lilas            </span>
3801</a>
3802</li>
3803<li class="py-2 "
3804    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10"
3805>
3806<a href="https://www.jardindupicvert.com/genre/magnolia"
3807           title="Magnolias"
3808           class="u-text-ellipsis
3809                 "
3810            style=""
3811        >
3812<span data-node-title>
3813Magnolias            </span>
3814</a>
3815</li>
3816<li class="py-2 "
3817    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
3818>
3819<a href="https://www.jardindupicvert.com/genre/choisya/choisya-ternata"
3820           title="Oranger&#x20;du&#x20;Mexique"
3821           class="u-text-ellipsis
3822                 "
3823            style=""
3824        >
3825<span data-node-title>
3826Oranger du Mexique            </span>
3827</a>
3828</li>
3829<li class="py-2 "
3830    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
3831>
3832<a href="https://www.jardindupicvert.com/genre/rhododendron"
3833           title="Rhododendrons"
3834           class="u-text-ellipsis
3835                 "
3836            style=""
3837        >
3838<span data-node-title>
3839Rhododendrons            </span>
3840</a>
3841</li>
3842<li class="py-2 "
3843    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
3844>
3845<a href="https://www.jardindupicvert.com/genre/spiraea"
3846           title="Spir&#xE9;es"
3847           class="u-text-ellipsis
3848                 "
3849            style=""
3850        >
3851<span data-node-title>
3852Spirées            </span>
3853</a>
3854</li>
3855<li class="py-2 "
3856    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14"
3857>
3858<a href="https://www.jardindupicvert.com/genre/sambucus"
3859           title="Sureaux"
3860           class="u-text-ellipsis
3861                 "
3862            style=""
3863        >
3864<span data-node-title>
3864
3865Sureaux            </span>
3866</a>
3867</li>
3868<li class="py-2 "
3869    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15"
3870>
3871<a href="https://www.jardindupicvert.com/genre/viburnum"
3872           title="Viornes"
3873           class="u-text-ellipsis
3874                 "
3875            style=""
3876        >
3877<span data-node-title>
3878Viornes            </span>
3879</a>
3880</li>
3881</ol>
3882</li>
3883<li class="py-2 "
3884    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2"
3885>
3886<span class="flex items-center justify-between cursor-pointer
3887                 "
3888            style=""
3889        >
3890<span data-node-title>
3891Arbustes par utilisation            </span>
3892<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
3893                    <use xlink:href="#chevron-symbol"></use>
3894                </svg>
3895</span>
3896<ol class="p-2"
3897            style="z-index: 2"
3898            data-menu-lvl="2"
3899        >
3900<li class="py-2 heading"
3901    data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0"
3902>
3903<a href="https://www.jardindupicvert.com/arbustes"
3904           title="Arbustes&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
3905           class="u-text-ellipsis
3906                 "
3907            style=""
3908        >
3909<span data-node-title>
3910Arbustes par utilisation :  tous les produits            </span>
3911</a>
3912</li>
3913<li class="py-2 "
3914    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"
3915>
3916<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-printaniere"
3917           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re"
3918           class="u-text-ellipsis
3919                 "
3920            style=""
3921        >
3922<span data-node-title>
3923Arbustes à floraison printanière            </span>
3924</a>
3925</li>
3926<li class="py-2 "
3927    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"
3928>
3929<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-estivale"
3930           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;estivale"
3931           class="u-text-ellipsis
3932                 "
3933            style=""
3934        >
3935<span data-node-title>
3936Arbustes à floraison estivale            </span>
3937</a>
3938</li>
3939<li class="py-2 "
3940    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"
3941>
3942<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-automnale"
3943           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;automnale"
3944           class="u-text-ellipsis
3945                 "
3946            style=""
3947        >
3948<span data-node-title>
3949Arbustes à floraison automnale            </span>
3950</a>
3951</li>
3952<li class="py-2 "
3953    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"
3954>
3955<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-hivernale"
3956           title="Arbustes&#x20;&#xE0;&#x20;floraison&#x20;hivernale"
3957           class="u-text-ellipsis
3958                 "
3959            style=""
3960        >
3961<span data-node-title>
3962Arbustes à floraison hivernale            </span>
3963</a>
3964</li>
3965<li class="py-2 "
3966    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"
3967>
3968<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/arbustes-fruitiers"
3969           title="Arbustes&#x20;fruitiers"
3970           class="u-text-ellipsis
3971                 "
3972            style=""
3973        >
3974<span data-node-title>
3975Arbustes fruitiers            </span>
3976</a>
3977</li>
3978<li class="py-2 "
3979    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"
3980>
3981<a href="https://www.jardindupicvert.com/arbustes/arbustes-parfumes"
3982           title="Arbustes&#x20;parfum&#xE9;s"
3983           class="u-text-ellipsis
3984                 "
3985            style=""
3986        >
3987<span data-node-title>
3988Arbustes parfumés            </span>
3989</a>
3990</li>
3991<li class="py-2 "
3992    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"
3993>
3994<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-feuillage-panache"
3995           title="Arbustes&#x20;&#xE0;&#x20;feuillage&#x20;panach&#xE9;"
3996           class="u-text-ellipsis
3997                 "
3998            style=""
3999        >
4000<span data-node-title>
4001Arbustes à feuillage panaché            </span>
4002</a>
4003</li>
4004<li class="py-2 "
4005    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"
4006>
4007<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-feuillage-persistant"
4008           title="Arbustes&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
4009           class="u-text-ellipsis
4010                 "
4011            style=""
4012        >
4013<span data-node-title>
4014Arbustes à feuillage persistant            </span>
4015</a>
4016</li>
4017<li class="py-2 "
4018    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"
4019>
4020<a href="https://www.jardindupicvert.com/arbustes/arbustes-de-terre-de-bruyere"
4021           title="Arbustes&#x20;de&#x20;terre&#x20;de&#x20;bruy&#xE8;re"
4022           class="u-text-ellipsis
4023                 "
4024            style=""
4025        >
4026<span data-node-title>
4027Arbustes de terre de bruyère            </span>
4028</a>
4029</li>
4030<li class="py-2 "
4031    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"
4032>
4033<a href="https://www.jardindupicvert.com/arbustes/haies-pour-les-oiseaux"
4034           title="Haies&#x20;pour&#x20;les&#x20;oiseaux"
4035           class="u-text-ellipsis
4036                 "
4037            style=""
4038        >
4039<span data-node-title>
4040Haies pour les oiseaux            </span>
4041</a>
4042</li>
4043<li class="py-2 "
4044    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"
4045>
4046<a href="https://www.jardindupicvert.com/coniferes/petits-coniferes"
4047           title="Conif&#xE8;res&#x20;nains&#x20;et&#x20;petits&#x20;conif&#xE8;res"
4048           class="u-text-ellipsis
4049                 "
4050            style=""
4051        >
4052<span data-node-title>
4053Conifères nains et petits conifères            </span>
4054</a>
4055</li>
4056</ol>
4057</li>
4058<li class="py-2 "
4059    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"
4060>
4061<span class="flex items-center justify-between cursor-pointer
4062                 "
4063            style=""
4064        >
4065<span data-node-title>
4066Bambous            </span>
4067<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4068                    <use xlink:href="#chevron-symbol"></use>
4069                </svg>
4070</span>
4071<ol class="p-2"
4072            style="z-index: 2"
4073            data-menu-lvl="2"
4074        >
4075<li class="py-2 heading"
4076    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"
4077>
4078<a href="https://www.jardindupicvert.com/bambous"
4079           title="Bambous&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4080           class="u-text-ellipsis
4081                 "
4082            style=""
4083        >
4084<span data-node-title>
4085Bambous :  tous les produits            </span>
4086</a>
4087</li>
4088<li class="py-2 "
4089    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"
4090>
4091<a href="https://www.jardindupicvert.com/genre/sasa"
4092           title="Bambous&#x20;couvre-sol"
4093           class="u-text-ellipsis
4094                 "
4095            style=""
4096        >
4097<span data-node-title>
4098Bambous couvre-sol            </span>
4099</a>
4100</li>
4101<li class="py-2 "
4102    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"
4103>
4104<a href="https://www.jardindupicvert.com/genre/fargesia"
4105           title="Bambous&#x20;non&#x20;tra&#xE7;ants"
4106           class="u-text-ellipsis
4107                 "
4108            style=""
4109        >
4110<span data-node-title>
4111Bambous non traçants            </span>
4112</a>
4113</li>
4114</ol>
4115</li>
4116</ol>
4117</li>
4118<li class="py-2 "
4119    data-node-id="832"
4120>
4121<span class="flex items-center justify-between cursor-pointer
4122                 "
4123            style=""
4124        >
4125<span data-node-title>
4126Arbres            </span>
4127<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4128                    <use xlink:href="#chevron-symbol"></use>
4129                </svg>
4130</span>
4131<ol class="p-2"
4132            style="z-index: 1"
4133            data-menu-lvl="1"
4134        >
4135<li class="py-2 heading"
4136    data-node-id="832_0"
4137>
4138<a href="https://www.jardindupicvert.com/arbres"
4139           title="Arbres&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4140           class="u-text-ellipsis
4141                 "
4142            style=""
4143        >
4144<span data-node-title>
4145Arbres :  tous les produits            </span>
4146</a>
4147</li>
4148<li class="py-2 "
4149    data-node-id="832_0_1"
4150>
4151<span class="flex items-center justify-between cursor-pointer
4152                 "
4153            style=""
4154        >
4155<span data-node-title>
4156Tous nos arbres            </span>
4157<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4158                    <use xlink:href="#chevron-symbol"></use>
4159                </svg>
4160</span>
4161<ol class="p-2"
4162            style="z-index: 2"
4163            data-menu-lvl="2"
4164        >
4165<li class="py-2 heading"
4166    data-node-id="832_0_1_0"
4167>
4168<a href="https://www.jardindupicvert.com/arbres"
4169           title="Tous&#x20;nos&#x20;arbres&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4170           class="u-text-ellipsis
4171                 "
4172            style=""
4173        >
4174<span data-node-title>
4175Tous nos arbres :  tous les produits            </span>
4176</a>
4177</li>
4178<li class="py-2 "
4179    data-node-id="832_0_1_0_1"
4180>
4181<a href="https://www.jardindupicvert.com/genre/arbutus"
4182           title="Arbousiers"
4183           class="u-text-ellipsis
4184                 "
4185            style=""
4186        >
4187<span data-node-title>
4188Arbousiers            </span>
4189</a>
4190</li>
4191<li class="py-2 "
4192    data-node-id="832_0_1_0_1_2"
4193>
4194<a href="https://www.jardindupicvert.com/genre/betula"
4195           title="Bouleaux"
4196           class="u-text-ellipsis
4197                 "
4198            style=""
4199        >
4200<span data-node-title>
4201Bouleaux            </span>
4202</a>
4203</li>
4204<li class="py-2 "
4205    data-node-id="832_0_1_0_1_2_3"
4206>
4207<a href="https://www.jardindupicvert.com/genre/catalpa"
4208           title="Catalpas"
4209           class="u-text-ellipsis
4210                 "
4211            style=""
4212        >
4213<span data-node-title>
4214Catalpas            </span>
4215</a>
4216</li>
4217<li class="py-2 "
4218    data-node-id="832_0_1_0_1_2_3_4"
4219>
4220<a href="https://www.jardindupicvert.com/genre/carpinus"
4221           title="Charmes"
4222           class="u-text-ellipsis
4223                 "
4224            style=""
4225        >
4226<span data-node-title>
4227Charmes            </span>
4228</a>
4229</li>
4230<li class="py-2 "
4231    data-node-id="832_0_1_0_1_2_3_4_5"
4232>
4233<a href="https://www.jardindupicvert.com/genre/quercus"
4234           title="Ch&#xEA;nes"
4235           class="u-text-ellipsis
4236                 "
4237            style=""
4238        >
4239<span data-node-title>
4240Chênes            </span>
4241</a>
4242</li>
4243<li class="py-2 "
4244    data-node-id="832_0_1_0_1_2_3_4_5_6"
4245>
4246<a href="https://www.jardindupicvert.com/genre/acer"
4247           title="&#xC9;rables"
4248           class="u-text-ellipsis
4249                 "
4250            style=""
4251        >
4252<span data-node-title>
4253Érables            </span>
4254</a>
4255</li>
4256<li class="py-2 "
4257    data-node-id="832_0_1_0_1_2_3_4_5_6_7"
4258>
4259<a href="https://www.jardindupicvert.com/genre/fraxinus"
4260           title="Fr&#xEA;nes"
4261           class="u-text-ellipsis
4262                 "
4263            style=""
4264        >
4265<span data-node-title>
4266Frênes            </span>
4267</a>
4268</li>
4269<li class="py-2 "
4270    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8"
4271>
4272<a href="https://www.jardindupicvert.com/genre/liquidambar"
4273           title="Liquidambars"
4274           class="u-text-ellipsis
4275                 "
4276            style=""
4277        >
4278<span data-node-title>
4279Liquidambars            </span>
4280</a>
4281</li>
4282<li class="py-2 "
4283    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9"
4284>
4285<a href="https://www.jardindupicvert.com/genre/magnolia"
4286           title="Magnolias"
4287           class="u-text-ellipsis
4288                 "
4289            style=""
4290        >
4291<span data-node-title>
4292Magnolias            </span>
4293</a>
4294</li>
4295<li class="py-2 "
4296    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10"
4297>
4298<a href="https://www.jardindupicvert.com/genre/paulownia"
4299           title="Pawlonias"
4300           class="u-text-ellipsis
4301                 "
4302            style=""
4303        >
4304<span data-node-title>
4305Pawlonias            </span>
4306</a>
4307</li>
4308<li class="py-2 "
4309    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
4310>
4311<a href="https://www.jardindupicvert.com/genre/populus"
4312           title="Peupliers"
4313           class="u-text-ellipsis
4314                 "
4315            style=""
4316        >
4317<span data-node-title>
4318Peupliers            </span>
4319</a>
4320</li>
4321<li class="py-2 "
4322    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
4323>
4324<a href="https://www.jardindupicvert.com/genre/prunus"
4325           title="Prunus"
4326           class="u-text-ellipsis
4327                 "
4328            style=""
4329        >
4330<span data-node-title>
4331Prunus            </span>
4332</a>
4333</li>
4334<li class="py-2 "
4335    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
4336>
4337<a href="https://www.jardindupicvert.com/genre/salix"
4338           title="Saules"
4339           class="u-text-ellipsis
4340                 "
4341            style=""
4342        >
4343<span data-node-title>
4344Saules            </span>
4345</a>
4346</li>
4347<li class="py-2 "
4348    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14"
4349>
4350<a href="https://www.jardindupicvert.com/genre/sorbus"
4351           title="Sorbiers"
4352           class="u-text-ellipsis
4353                 "
4354            style=""
4355        >
4356<span data-node-title>
4357Sorbiers            </span>
4358</a>
4359</li>
4360</ol>
4361</li>
4362<li class="py-2 "
4363    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2"
4364>
4365<span class="flex items-center justify-between cursor-pointer
4366                 "
4367            style=""
4368        >
4369<span data-node-title>
4370Les conifères            </span>
4371<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4372                    <use xlink:href="#chevron-symbol"></use>
4373                </svg>
4374</span>
4375<ol class="p-2"
4376            style="z-index: 2"
4377            data-menu-lvl="2"
4378        >
4379<li class="py-2 heading"
4380    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0"
4381>
4382<a href="https://www.jardindupicvert.com/coniferes"
4383           title="Les&#x20;conif&#xE8;res&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4384           class="u-text-ellipsis
4385                 "
4386            style=""
4387        >
4388<span data-node-title>
4389Les conifères :  tous les produits            </span>
4390</a>
4391</li>
4392<li class="py-2 "
4393    data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1"
4394>
4395<a href="https://www.jardindupicvert.com/genre/cryptomeria"
4396           title="C&#xE8;dres&#x20;du&#x20;Japon"
4397           class="u-text-ellipsis
4398                 "
4399            style=""
4400        >
4401<span data-node-title>
4402Cèdres du Japon            </span>
4403</a>
4404</li>
4405<li class="py-2 "
4406    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"
4407>
4408<a href="https://www.jardindupicvert.com/genre/cupressus"
4409           title="Cypr&#xE8;s&#x20;d&#x27;Italie"
4410           class="u-text-ellipsis
4411                 "
4412            style=""
4413        >
4414<span data-node-title>
4415Cyprès d&#039;Italie            </span>
4416</a>
4417</li>
4418<li class="py-2 "
4419    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"
4420>
4421<a href="https://www.jardindupicvert.com/genre/chamaecyparis/chamaecyparis-lawsoniana"
4422           title="Cypr&#xE8;s&#x20;de&#x20;Lawson"
4423           class="u-text-ellipsis
4424                 "
4425            style=""
4426        >
4427<span data-node-title>
4428Cyprès de Lawson            </span>
4429</a>
4430</li>
4431<li class="py-2 "
4432    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"
4433>
4434<a href="https://www.jardindupicvert.com/genre/cupressocyparis"
4435           title="Cypr&#xE8;s&#x20;de&#x20;Leyland"
4436           class="u-text-ellipsis
4437                 "
4438            style=""
4439        >
4440<span data-node-title>
4441Cyprès de Leyland            </span>
4442</a>
4443</li>
4444<li class="py-2 "
4445    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"
4446>
4447<a href="https://www.jardindupicvert.com/genre/picea"
4448           title="&#xC9;pic&#xE9;as"
4449           class="u-text-ellipsis
4450                 "
4451            style=""
4452        >
4453<span data-node-title>
4454Épicéas            </span>
4455</a>
4456</li>
4457<li class="py-2 "
4458    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"
4459>
4460<a href="https://www.jardindupicvert.com/genre/juniperus"
4461           title="Gen&#xE9;vriers"
4462           class="u-text-ellipsis
4463                 "
4464            style=""
4465        >
4466<span data-node-title>
4467Genévriers            </span>
4468</a>
4469</li>
4470<li class="py-2 "
4471    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"
4472>
4473<a href="https://www.jardindupicvert.com/genre/ginkgo"
4474           title="Ginkgo&#x20;biloba"
4475           class="u-text-ellipsis
4476                 "
4477            style=""
4478        >
4479<span data-node-title>
4480Ginkgo biloba            </span>
4481</a>
4482</li>
4483<li class="py-2 "
4484    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"
4485>
4486<a href="https://www.jardindupicvert.com/genre/taxus"
4487           title="Ifs"
4488           class="u-text-ellipsis
4489                 "
4490            style=""
4491        >
4492<span data-node-title>
4493Ifs            </span>
4494</a>
4495</li>
4496<li class="py-2 "
4497    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"
4498>
4499<a href="https://www.jardindupicvert.com/genre/pinus"
4500           title="Pins"
4501           class="u-text-ellipsis
4502                 "
4503            style=""
4504        >
4505<span data-node-title>
4506Pins            </span>
4507</a>
4508</li>
4509<li class="py-2 "
4510    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"
4511>
4512<a href="https://www.jardindupicvert.com/genre/abies"
4513           title="Sapins"
4514           class="u-text-ellipsis
4515                 "
4516            style=""
4517        >
4518<span data-node-title>
4519Sapins            </span>
4520</a>
4521</li>
4522</ol>
4523</li>
4524<li class="py-2 "
4525    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"
4526>
4527<a href="https://www.jardindupicvert.com/palmiers"
4528           title="Les&#x20;palmiers"
4529           class="u-text-ellipsis
4530                 "
4531            style=""
4532        >
4533<span data-node-title>
4534Les palmiers            </span>
4535</a>
4536</li>
4537<li class="py-2 "
4538    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"
4539>
4540<span class="flex items-center justify-between cursor-pointer
4541                 "
4542            style=""
4543        >
4544<span data-node-title>
4545Les arbres par utilisation            </span>
4546<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4547                    <use xlink:href="#chevron-symbol"></use>
4548                </svg>
4549</span>
4550<ol class="p-2"
4551            style="z-index: 2"
4552            data-menu-lvl="2"
4553        >
4554<li class="py-2 heading"
4555    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"
4556>
4557<a href="https://www.jardindupicvert.com/arbres"
4558           title="Les&#x20;arbres&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4559           class="u-text-ellipsis
4560                 "
4561            style=""
4562        >
4563<span data-node-title>
4564Les arbres par utilisation :  tous les produits            </span>
4565</a>
4566</li>
4567<li class="py-2 "
4568    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"
4569>
4570<a href="https://www.jardindupicvert.com/arbres/arbres-a-ecorce-remarquable"
4571           title="Arbres&#x20;&#xE0;&#x20;&#xE9;corce&#x20;remarquable"
4572           class="u-text-ellipsis
4573                 "
4574            style=""
4575        >
4576<span data-node-title>
4577Arbres à écorce remarquable            </span>
4578</a>
4579</li>
4580<li class="py-2 "
4581    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"
4582>
4583<a href="https://www.jardindupicvert.com/arbres/arbres-parfumes"
4584           title="Arbres&#x20;parfum&#xE9;s"
4585           class="u-text-ellipsis
4586                 "
4587            style=""
4588        >
4589<span data-node-title>
4590Arbres parfumés            </span>
4591</a>
4592</li>
4593<li class="py-2 "
4594    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"
4595>
4596<a href="https://www.jardindupicvert.com/arbres/arbres-a-feuillage-panache"
4597           title="Arbres&#x20;&#xE0;&#x20;feuillage&#x20;panach&#xE9;"
4598           class="u-text-ellipsis
4599                 "
4600            style=""
4601        >
4602<span data-node-title>
4603Arbres à feuillage panaché            </span>
4604</a>
4605</li>
4606<li class="py-2 "
4607    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"
4608>
4609<a href="https://www.jardindupicvert.com/arbres/arbres-a-feuillage-persistant"
4610           title="Arbres&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
4611           class="u-text-ellipsis
4612                 "
4613            style=""
4614        >
4615<span data-node-title>
4616Arbres à feuillage persistant            </span>
4617</a>
4618</li>
4619<li class="py-2 "
4620    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"
4621>
4622<a href="https://www.jardindupicvert.com/arbres/arbres-mediterraneens"
4623           title="Arbres&#x20;m&#xE9;diterran&#xE9;ens"
4624           class="u-text-ellipsis
4625                 "
4626            style=""
4627        >
4628<span data-node-title>
4629Arbres méditerranéens            </span>
4630</a>
4631</li>
4632</ol>
4633</li>
4634</ol>
4635</li>
4636<li class="py-2 "
4637    data-node-id="866"
4638>
4639<span class="flex items-center justify-between cursor-pointer
4640                 "
4641            style=""
4642        >
4643<span data-node-title>
4644Fruitiers et petits fruits            </span>
4645<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4646                    <use xlink:href="#chevron-symbol"></use>
4647                </svg>
4648</span>
4649<ol class="p-2"
4650            style="z-index: 1"
4651            data-menu-lvl="1"
4652        >
4653<li class="py-2 heading"
4654    data-node-id="866_0"
4655>
4656<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits"
4657           title="Fruitiers&#x20;et&#x20;petits&#x20;fruits&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4658           class="u-text-ellipsis
4659                 "
4660            style=""
4661        >
4662<span data-node-title>
4663Fruitiers et petits fruits :  tous les produits            </span>
4664</a>
4665</li>
4666<li class="py-2 "
4667    data-node-id="866_0_1"
4668>
4669<span class="flex items-center justify-between cursor-pointer
4670                 "
4671            style=""
4672        >
4673<span data-node-title>
4674Tous nos fruitiers            </span>
4675<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4676                    <use xlink:href="#chevron-symbol"></use>
4677                </svg>
4678</span>
4679<ol class="p-2"
4680            style="z-index: 2"
4681            data-menu-lvl="2"
4682        >
4683<li class="py-2 heading"
4684    data-node-id="866_0_1_0"
4685>
4686<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits"
4687           title="Tous&#x20;nos&#x20;fruitiers&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4688           class="u-text-ellipsis
4689                 "
4690            style=""
4691        >
4692<span data-node-title>
4693Tous nos fruitiers :  tous les produits            </span>
4694</a>
4695</li>
4696<li class="py-2 "
4697    data-node-id="866_0_1_0_1"
4698>
4699<a href="https://www.jardindupicvert.com/genre/prunus/prunus-armeniaca"
4700           title="Abricotiers"
4701           class="u-text-ellipsis
4702                 "
4703            style=""
4704        >
4705<span data-node-title>
4706Abricotiers            </span>
4707</a>
4708</li>
4709<li class="py-2 "
4710    data-node-id="866_0_1_0_1_2"
4711>
4712<a href="https://www.jardindupicvert.com/genre/prunus/prunus-dulcis"
4713           title="Amandiers"
4714           class="u-text-ellipsis
4715                 "
4716            style=""
4717        >
4718<span data-node-title>
4719Amandiers            </span>
4720</a>
4721</li>
4722<li class="py-2 "
4723    data-node-id="866_0_1_0_1_2_3"
4724>
4725<a href="https://www.jardindupicvert.com/genre/prunus/prunus-cerasus"
4726           title="Cerisiers"
4727           class="u-text-ellipsis
4728                 "
4729            style=""
4730        >
4731<span data-node-title>
4732Cerisiers            </span>
4733</a>
4734</li>
4735<li class="py-2 "
4736    data-node-id="866_0_1_0_1_2_3_4"
4737>
4738<a href="https://www.jardindupicvert.com/genre/castanea"
4739           title="Ch&#xE2;taigniers"
4740           class="u-text-ellipsis
4741                 "
4742            style=""
4743        >
4744<span data-node-title>
4745Châtaigniers            </span>
4746</a>
4747</li>
4748<li class="py-2 "
4749    data-node-id="866_0_1_0_1_2_3_4_5"
4750>
4751<a href="https://www.jardindupicvert.com/genre/ficus/ficus-carica"
4752           title="Figuiers"
4753           class="u-text-ellipsis
4754                 "
4755            style=""
4756        >
4757<span data-node-title>
4758Figuiers            </span>
4759</a>
4760</li>
4761<li class="py-2 "
4762    data-node-id="866_0_1_0_1_2_3_4_5_6"
4763>
4764<a href="https://www.jardindupicvert.com/genre/corylus"
4765           title="Noisetiers"
4766           class="u-text-ellipsis
4767                 "
4768            style=""
4769        >
4770<span data-node-title>
4771Noisetiers            </span>
4772</a>
4773</li>
4774<li class="py-2 "
4775    data-node-id="866_0_1_0_1_2_3_4_5_6_7"
4776>
4777<a href="https://www.jardindupicvert.com/genre/juglans"
4778           title="Noyers"
4779           class="u-text-ellipsis
4780                 "
4781            style=""
4782        >
4783<span data-node-title>
4784Noyers            </span>
4785</a>
4786</li>
4787<li class="py-2 "
4788    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8"
4789>
4790<a href="https://www.jardindupicvert.com/genre/prunus/prunus-persica"
4791           title="P&#xEA;chers&#x20;-&#x20;nectariniers"
4792           class="u-text-ellipsis
4793                 "
4794            style=""
4795        >
4796<span data-node-title>
4797Pêchers - nectariniers            </span>
4798</a>
4799</li>
4800<li class="py-2 "
4801    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9"
4802>
4803<a href="https://www.jardindupicvert.com/genre/pyrus"
4804           title="Poiriers"
4805           class="u-text-ellipsis
4806                 "
4807            style=""
4808        >
4809<span data-node-title>
4810Poiriers            </span>
4811</a>
4812</li>
4813<li class="py-2 "
4814    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10"
4815>
4816<a href="https://www.jardindupicvert.com/genre/malus"
4817           title="Pommiers"
4818           class="u-text-ellipsis
4819                 "
4820            style=""
4821        >
4822<span data-node-title>
4823Pommiers            </span>
4824</a>
4825</li>
4826<li class="py-2 "
4827    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
4828>
4829<a href="https://www.jardindupicvert.com/genre/prunus/prunus-domestica"
4830           title="Pruniers&#x20;-&#x20;mirabelliers"
4831           class="u-text-ellipsis
4832                 "
4833            style=""
4834        >
4835<span data-node-title>
4836Pruniers - mirabelliers            </span>
4837</a>
4838</li>
4839</ol>
4840</li>
4841<li class="py-2 "
4842    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2"
4843>
4844<span class="flex items-center justify-between cursor-pointer
4845                 "
4846            style=""
4847        >
4848<span data-node-title>
4849Arbustes à petits fruits            </span>
4850<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
4851                    <use xlink:href="#chevron-symbol"></use>
4852                </svg>
4853</span>
4854<ol class="p-2"
4855            style="z-index: 2"
4856            data-menu-lvl="2"
4857        >
4858<li class="py-2 heading"
4859    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0"
4860>
4861<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/petits-fruits"
4862           title="Arbustes&#x20;&#xE0;&#x20;petits&#x20;fruits&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
4863           class="u-text-ellipsis
4864                 "
4865            style=""
4866        >
4867<span data-node-title>
4868Arbustes à petits fruits :  tous les produits            </span>
4869</a>
4870</li>
4871<li class="py-2 "
4872    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1"
4873>
4874<a href="https://www.jardindupicvert.com/genre/ribes/ribes-nigrum"
4875           title="Cassissiers"
4876           class="u-text-ellipsis
4877                 "
4878            style=""
4879        >
4880<span data-node-title>
4881Cassissiers            </span>
4882</a>
4883</li>
4884<li class="py-2 "
4885    data-node-id="866_0_1_0
4885_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2"
4886>
4887<a href="https://www.jardindupicvert.com/genre/fragaria"
4888           title="Fraisiers"
4889           class="u-text-ellipsis
4890                 "
4891            style=""
4892        >
4893<span data-node-title>
4894Fraisiers            </span>
4895</a>
4896</li>
4897<li class="py-2 "
4898    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3"
4899>
4900<a href="https://www.jardindupicvert.com/genre/rubus/rubus-idaeus"
4901           title="Framboisiers"
4902           class="u-text-ellipsis
4903                 "
4904            style=""
4905        >
4906<span data-node-title>
4907Framboisiers            </span>
4908</a>
4909</li>
4910<li class="py-2 "
4911    data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4"
4912>
4913<a href="https://www.jardindupicvert.com/genre/ribes/ribes-rubrum"
4914           title="Groseilliers"
4915           class="u-text-ellipsis
4916                 "
4917            style=""
4918        >
4919<span data-node-title>
4920Groseilliers            </span>
4921</a>
4922</li>
4923<li class="py-2 "
4924    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"
4925>
4926<a href="https://www.jardindupicvert.com/genre/actinidia"
4927           title="Kiwis"
4928           class="u-text-ellipsis
4929                 "
4930            style=""
4931        >
4932<span data-node-title>
4933Kiwis            </span>
4934</a>
4935</li>
4936<li class="py-2 "
4937    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"
4938>
4939<a href="https://www.jardindupicvert.com/genre/morus"
4940           title="M&#xFB;riers"
4941           class="u-text-ellipsis
4942                 "
4943            style=""
4944        >
4945<span data-node-title>
4946Mûriers            </span>
4947</a>
4948</li>
4949<li class="py-2 "
4950    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"
4951>
4952<a href="https://www.jardindupicvert.com/genre/vaccinium"
4953           title="Myrtilles&#x20;-&#x20;airelles"
4954           class="u-text-ellipsis
4955                 "
4956            style=""
4957        >
4958<span data-node-title>
4959Myrtilles - airelles            </span>
4960</a>
4961</li>
4962<li class="py-2 "
4963    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"
4964>
4965<a href="https://www.jardindupicvert.com/genre/vitis/vitis-vinifera"
4966           title="Vignes"
4967           class="u-text-ellipsis
4968                 "
4969            style=""
4970        >
4971<span data-node-title>
4972Vignes            </span>
4973</a>
4974</li>
4975</ol>
4976</li>
4977<li class="py-2 "
4978    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"
4979>
4980<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/fruitiers-nains-a-port-colonnaire"
4981           title="Fruitiers&#x20;nains&#x20;et&#x20;&#xE0;&#x20;port&#x20;colonnaire"
4982           class="u-text-ellipsis
4983                 "
4984            style=""
4985        >
4986<span data-node-title>
4987Fruitiers nains et à port colonnaire            </span>
4988</a>
4989</li>
4990</ol>
4991</li>
4992<li class="py-2 "
4993    data-node-id="1115"
4994>
4995<span class="flex items-center justify-between cursor-pointer
4996                 "
4997            style=""
4998        >
4999<span data-node-title>
5000Potager            </span>
5001<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5002                    <use xlink:href="#chevron-symbol"></use>
5003                </svg>
5004</span>
5005<ol class="p-2"
5006            style="z-index: 1"
5007            data-menu-lvl="1"
5008        >
5009<li class="py-2 "
5010    data-node-id="1115_1116"
5011>
5012<a href="https://www.jardindupicvert.com/bulbes-et-semences/graines-potageres"
5013           title="Graines&#x20;potag&#xE8;res"
5014           class="u-text-ellipsis
5015                 "
5016            style=""
5017        >
5018<span data-node-title>
5019Graines potagères            </span>
5020</a>
5021</li>
5022<li class="py-2 "
5023    data-node-id="1115_1116_1119"
5024>
5025<a href="https://www.jardindupicvert.com/potager/plants-de-tomate"
5026           title="Plants&#x20;de&#x20;tomate"
5027           class="u-text-ellipsis
5028                 "
5029            style=""
5030        >
5031<span data-node-title>
5032Plants de tomate            </span>
5033</a>
5034</li>
5035<li class="py-2 "
5036    data-node-id="1115_1116_1119_1117"
5037>
5038<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-potagers"
5039           title="Bulbes&#x20;potagers"
5040           class="u-text-ellipsis
5041                 "
5042            style=""
5043        >
5044<span data-node-title>
5045Bulbes potagers            </span>
5046</a>
5047</li>
5048<li class="py-2 "
5049    data-node-id="1115_1116_1119_1117_1118"
5050>
5051<a href="https://www.jardindupicvert.com/potager/potager-d-ornement"
5052           title="Potager&#x20;d&#x27;ornement"
5053           class="u-text-ellipsis
5054                 "
5055            style=""
5056        >
5057<span data-node-title>
5058Potager d&#039;ornement            </span>
5059</a>
5060</li>
5061</ol>
5062</li>
5063<li class="py-2 "
5064    data-node-id="889"
5065>
5066<span class="flex items-center justify-between cursor-pointer
5067                 "
5068            style=""
5069        >
5070<span data-node-title>
5071Plantes grimpantes            </span>
5072<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5073                    <use xlink:href="#chevron-symbol"></use>
5074                </svg>
5075</span>
5076<ol class="p-2"
5077            style="z-index: 1"
5078            data-menu-lvl="1"
5079        >
5080<li class="py-2 heading"
5081    data-node-id="889_0"
5082>
5083<a href="https://www.jardindupicvert.com/plantes-grimpantes"
5084           title="Plantes&#x20;grimpantes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5085           class="u-text-ellipsis
5086                 "
5087            style=""
5088        >
5089<span data-node-title>
5090Plantes grimpantes :  tous les produits            </span>
5091</a>
5092</li>
5093<li class="py-2 "
5094    data-node-id="889_0_1"
5095>
5096<span class="flex items-center justify-between cursor-pointer
5097                 "
5098            style=""
5099        >
5100<span data-node-title>
5101Toutes nos plantes grimpantes            </span>
5102<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5103                    <use xlink:href="#chevron-symbol"></use>
5104                </svg>
5105</span>
5106<ol class="p-2"
5107            style="z-index: 2"
5108            data-menu-lvl="2"
5109        >
5110<li class="py-2 heading"
5111    data-node-id="889_0_1_0"
5112>
5113<a href="https://www.jardindupicvert.com/plantes-grimpantes"
5114           title="Toutes&#x20;nos&#x20;plantes&#x20;grimpantes&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5115           class="u-text-ellipsis
5116                 "
5117            style=""
5118        >
5119<span data-node-title>
5120Toutes nos plantes grimpantes :  tous les produits            </span>
5121</a>
5122</li>
5123<li class="py-2 "
5124    data-node-id="889_0_1_0_1"
5125>
5126<a href="https://www.jardindupicvert.com/genre/akebia"
5127           title="Ak&#xE9;bies"
5128           class="u-text-ellipsis
5129                 "
5130            style=""
5131        >
5132<span data-node-title>
5133Akébies            </span>
5134</a>
5135</li>
5136<li class="py-2 "
5137    data-node-id="889_0_1_0_1_2"
5138>
5139<a href="https://www.jardindupicvert.com/genre/campsis"
5140           title="Campsis"
5141           class="u-text-ellipsis
5142                 "
5143            style=""
5144        >
5145<span data-node-title>
5146Campsis            </span>
5147</a>
5148</li>
5149<li class="py-2 "
5150    data-node-id="889_0_1_0_1_2_3"
5151>
5152<a href="https://www.jardindupicvert.com/genre/lonicera"
5153           title="Ch&#xE8;vrefeuilles"
5154           class="u-text-ellipsis
5155                 "
5156            style=""
5157        >
5158<span data-node-title>
5159Chèvrefeuilles            </span>
5160</a>
5161</li>
5162<li class="py-2 "
5163    data-node-id="889_0_1_0_1_2_3_4"
5164>
5165<a href="https://www.jardindupicvert.com/genre/clematis"
5166           title="Cl&#xE9;matites"
5167           class="u-text-ellipsis
5168                 "
5169            style=""
5170        >
5171<span data-node-title>
5172Clématites            </span>
5173</a>
5174</li>
5175<li class="py-2 "
5176    data-node-id="889_0_1_0_1_2_3_4_5"
5177>
5178<a href="https://www.jardindupicvert.com/genre/wisteria"
5179           title="Glycines"
5180           class="u-text-ellipsis
5181                 "
5182            style=""
5183        >
5184<span data-node-title>
5185Glycines            </span>
5186</a>
5187</li>
5188<li class="py-2 "
5189    data-node-id="889_0_1_0_1_2_3_4_5_6"
5190>
5191<a href="https://www.jardindupicvert.com/genre/hydrangea/hydrangea-petiolaris"
5192           title="Hortensias&#x20;grimpants"
5193           class="u-text-ellipsis
5194                 "
5195            style=""
5196        >
5197<span data-node-title>
5198Hortensias grimpants            </span>
5199</a>
5200</li>
5201<li class="py-2 "
5202    data-node-id="889_0_1_0_1_2_3_4_5_6_7"
5203>
5204<a href="https://www.jardindupicvert.com/genre/jasminum"
5205           title="Jasmins"
5206           class="u-text-ellipsis
5207                 "
5208            style=""
5209        >
5210<span data-node-title>
5211Jasmins            </span>
5212</a>
5213</li>
5214<li class="py-2 "
5215    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8"
5216>
5217<a href="https://www.jardindupicvert.com/genre/trachelospermum/trachelospermum-jasminoides"
5218           title="Jasmins&#x20;&#xE9;toil&#xE9;s"
5219           class="u-text-ellipsis
5220                 "
5221            style=""
5222        >
5223<span data-node-title>
5224Jasmins étoilés            </span>
5225</a>
5226</li>
5227<li class="py-2 "
5228    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9"
5229>
5230<a href="https://www.jardindupicvert.com/genre/hedera"
5231           title="Lierres"
5232           class="u-text-ellipsis
5233                 "
5234            style=""
5235        >
5236<span data-node-title>
5237Lierres            </span>
5238</a>
5239</li>
5240<li class="py-2 "
5241    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10"
5242>
5243<a href="https://www.jardindupicvert.com/genre/passiflora"
5244           title="Passiflores"
5245           class="u-text-ellipsis
5246                 "
5247            style=""
5248        >
5249<span data-node-title>
5250Passiflores            </span>
5251</a>
5252</li>
5253<li class="py-2 "
5254    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11"
5255>
5256<a href="https://www.jardindupicvert.com/rosiers/rosiers-grimpants"
5257           title="Rosiers&#x20;grimpants"
5258           class="u-text-ellipsis
5259                 "
5260            style=""
5261        >
5262<span data-node-title>
5263Rosiers grimpants            </span>
5264</a>
5265</li>
5266<li class="py-2 "
5267    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12"
5268>
5269<a href="https://www.jardindupicvert.com/genre/schizophragma"
5270           title="Schizophragmas"
5271           class="u-text-ellipsis
5272                 "
5273            style=""
5274        >
5275<span data-node-title>
5276Schizophragmas            </span>
5277</a>
5278</li>
5279<li class="py-2 "
5280    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13"
5281>
5282<a href="https://www.jardindupicvert.com/genre/parthenocissus"
5283           title="Vignes&#x20;vierges"
5284           class="u-text-ellipsis
5285                 "
5286            style=""
5287        >
5288<span data-node-title>
5289Vignes vierges            </span>
5290</a>
5291</li>
5292</ol>
5293</li>
5294<li class="py-2 "
5295    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2"
5296>
5297<span class="flex items-center justify-between cursor-pointer
5298                 "
5299            style=""
5300        >
5301<span data-node-title>
5302Plantes grimpantes par utilisation            </span>
5303<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5304                    <use xlink:href="#chevron-symbol"></use>
5305                </svg>
5306</span>
5307<ol class="p-2"
5308            style="z-index: 2"
5309            data-menu-lvl="2"
5310        >
5311<li class="py-2 heading"
5312    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0"
5313>
5314<a href="https://www.jardindupicvert.com/plantes-grimpantes"
5315           title="Plantes&#x20;grimpantes&#x20;par&#x20;utilisation&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5316           class="u-text-ellipsis
5317                 "
5318            style=""
5319        >
5320<span data-node-title>
5321Plantes grimpantes par utilisation :  tous les produits            </span>
5322</a>
5323</li>
5324<li class="py-2 "
5325    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1"
5326>
5327<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-printaniere"
5328           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re"
5329           class="u-text-ellipsis
5330                 "
5331            style=""
5332        >
5333<span data-node-title>
5334Plantes grimpantes à floraison printanière            </span>
5335</a>
5336</li>
5337<li class="py-2 "
5338    data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2"
5339>
5340<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-estivale"
5341           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;estivale"
5342           class="u-text-ellipsis
5343                 "
5344            style=""
5345        >
5346<span data-node-title>
5347Plantes grimpantes à floraison estivale            </span>
5348</a>
5349</li>
5350<li class="py-2 "
5351    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"
5352>
5353<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-automnale"
5354           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;automnale"
5355           class="u-text-ellipsis
5356                 "
5357            style=""
5358        >
5359<span data-node-title>
5360Plantes grimpantes à floraison automnale            </span>
5361</a>
5362</li>
5363<li class="py-2 "
5364    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"
5365>
5366<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-hivernale"
5367           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;floraison&#x20;hivernale"
5368           class="u-text-ellipsis
5369                 "
5370            style=""
5371        >
5372<span data-node-title>
5373Plantes grimpantes à floraison hivernale            </span>
5374</a>
5375</li>
5376<li class="py-2 "
5377    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"
5378>
5379<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-feuillage-persistant"
5380           title="Plantes&#x20;grimpantes&#x20;&#xE0;&#x20;feuillage&#x20;persistant"
5381           class="u-text-ellipsis
5382                 "
5383            style=""
5384        >
5385<span data-node-title>
5386Plantes grimpantes à feuillage persistant            </span>
5387</a>
5388</li>
5389<li class="py-2 "
5390    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"
5391>
5392<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-p
5392arfumees"
5393           title="Plantes&#x20;grimpantes&#x20;parfum&#xE9;es"
5394           class="u-text-ellipsis
5395                 "
5396            style=""
5397        >
5398<span data-node-title>
5399Plantes grimpantes parfumées            </span>
5400</a>
5401</li>
5402<li class="py-2 "
5403    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"
5404>
5405<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-d-ombre"
5406           title="Plantes&#x20;grimpantes&#x20;d&#x27;ombre"
5407           class="u-text-ellipsis
5408                 "
5409            style=""
5410        >
5411<span data-node-title>
5412Plantes grimpantes d&#039;ombre            </span>
5413</a>
5414</li>
5415</ol>
5416</li>
5417</ol>
5418</li>
5419<li class="py-2 "
5420    data-node-id="912"
5421>
5422<span class="flex items-center justify-between cursor-pointer
5423                 "
5424            style=""
5425        >
5426<span data-node-title>
5427Rosiers            </span>
5428<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5429                    <use xlink:href="#chevron-symbol"></use>
5430                </svg>
5431</span>
5432<ol class="p-2"
5433            style="z-index: 1"
5434            data-menu-lvl="1"
5435        >
5436<li class="py-2 heading"
5437    data-node-id="912_0"
5438>
5439<a href="https://www.jardindupicvert.com/rosiers"
5440           title="Rosiers&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5441           class="u-text-ellipsis
5442                 "
5443            style=""
5444        >
5445<span data-node-title>
5446Rosiers :  tous les produits            </span>
5447</a>
5448</li>
5449<li class="py-2 "
5450    data-node-id="912_0_1"
5451>
5452<span class="flex items-center justify-between cursor-pointer
5453                 "
5454            style=""
5455        >
5456<span data-node-title>
5457Rosiers à grandes fleurs            </span>
5458<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5459                    <use xlink:href="#chevron-symbol"></use>
5460                </svg>
5461</span>
5462<ol class="p-2"
5463            style="z-index: 2"
5464            data-menu-lvl="2"
5465        >
5466<li class="py-2 heading"
5467    data-node-id="912_0_1_0"
5468>
5469<a href="https://www.jardindupicvert.com/rosiers/rosiers-a-grandes-fleurs"
5470           title="Rosiers&#x20;&#xE0;&#x20;grandes&#x20;fleurs&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5471           class="u-text-ellipsis
5472                 "
5473            style=""
5474        >
5475<span data-node-title>
5476Rosiers à grandes fleurs :  tous les produits            </span>
5477</a>
5478</li>
5479<li class="py-2 "
5480    data-node-id="912_0_1_0_1"
5481>
5482<a href="https://www.jardindupicvert.com/rosiers/rosiers-anglais"
5483           title="Rosiers&#x20;anglais"
5484           class="u-text-ellipsis
5485                 "
5486            style=""
5487        >
5488<span data-node-title>
5489Rosiers anglais            </span>
5490</a>
5491</li>
5492<li class="py-2 "
5493    data-node-id="912_0_1_0_1_2"
5494>
5495<a href="https://www.jardindupicvert.com/rosiers/rosiers-generosa"
5496           title="Rosiers&#x20;Generosa"
5497           class="u-text-ellipsis
5498                 "
5499            style=""
5500        >
5501<span data-node-title>
5502Rosiers Generosa            </span>
5503</a>
5504</li>
5505<li class="py-2 "
5506    data-node-id="912_0_1_0_1_2_3"
5507>
5508<a href="https://www.jardindupicvert.com/rosiers/rosiers-the-moderne"
5509           title="Rosiers&#x20;Th&#xE9;&#x20;moderne"
5510           class="u-text-ellipsis
5511                 "
5512            style=""
5513        >
5514<span data-node-title>
5515Rosiers Thé moderne            </span>
5516</a>
5517</li>
5518</ol>
5519</li>
5520<li class="py-2 "
5521    data-node-id="912_0_1_0_1_2_3_2"
5522>
5523<a href="https://www.jardindupicvert.com/rosiers/rosiers-grimpants"
5524           title="Rosiers&#x20;grimpants"
5525           class="u-text-ellipsis
5526                 "
5527            style=""
5528        >
5529<span data-node-title>
5530Rosiers grimpants            </span>
5531</a>
5532</li>
5533<li class="py-2 "
5534    data-node-id="912_0_1_0_1_2_3_2_3"
5535>
5536<a href="https://www.jardindupicvert.com/rosiers/rosiers-lianes"
5537           title="Rosiers&#x20;lianes"
5538           class="u-text-ellipsis
5539                 "
5540            style=""
5541        >
5542<span data-node-title>
5543Rosiers lianes            </span>
5544</a>
5545</li>
5546<li class="py-2 "
5547    data-node-id="912_0_1_0_1_2_3_2_3_4"
5548>
5549<span class="flex items-center justify-between cursor-pointer
5550                 "
5551            style=""
5552        >
5553<span data-node-title>
5554Rosiers anciens            </span>
5555<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5556                    <use xlink:href="#chevron-symbol"></use>
5557                </svg>
5558</span>
5559<ol class="p-2"
5560            style="z-index: 2"
5561            data-menu-lvl="2"
5562        >
5563<li class="py-2 heading"
5564    data-node-id="912_0_1_0_1_2_3_2_3_4_0"
5565>
5566<a href="https://www.jardindupicvert.com/rosiers/rosiers-anciens"
5567           title="Rosiers&#x20;anciens&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5568           class="u-text-ellipsis
5569                 "
5570            style=""
5571        >
5572<span data-node-title>
5573Rosiers anciens :  tous les produits            </span>
5574</a>
5575</li>
5576<li class="py-2 "
5577    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1"
5578>
5579<a href="https://www.jardindupicvert.com/genre/rosa/rosa-bourbon"
5580           title="Rosiers&#x20;bourbons"
5581           class="u-text-ellipsis
5582                 "
5583            style=""
5584        >
5585<span data-node-title>
5586Rosiers bourbons            </span>
5587</a>
5588</li>
5589<li class="py-2 "
5590    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2"
5591>
5592<a href="https://www.jardindupicvert.com/genre/rosa/rosa-gallica"
5593           title="Rosiers&#x20;galliques"
5594           class="u-text-ellipsis
5595                 "
5596            style=""
5597        >
5598<span data-node-title>
5599Rosiers galliques            </span>
5600</a>
5601</li>
5602<li class="py-2 "
5603    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3"
5604>
5605<a href="https://www.jardindupicvert.com/genre/rosa/rosa-damas"
5606           title="Rosiers&#x20;de&#x20;Damas"
5607           class="u-text-ellipsis
5608                 "
5609            style=""
5610        >
5611<span data-node-title>
5612Rosiers de Damas            </span>
5613</a>
5614</li>
5615<li class="py-2 "
5616    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4"
5617>
5618<a href="https://www.jardindupicvert.com/genre/rosa/rosa-portland"
5619           title="Rosiers&#x20;de&#x20;Portland"
5620           class="u-text-ellipsis
5621                 "
5622            style=""
5623        >
5624<span data-node-title>
5625Rosiers de Portland            </span>
5626</a>
5627</li>
5628<li class="py-2 "
5629    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5"
5630>
5631<a href="https://www.jardindupicvert.com/genre/rosa/rosa-rugosa"
5632           title="Rosiers&#x20;rugueux"
5633           class="u-text-ellipsis
5634                 "
5635            style=""
5636        >
5637<span data-node-title>
5638Rosiers rugueux            </span>
5639</a>
5640</li>
5641</ol>
5642</li>
5643<li class="py-2 "
5644    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5"
5645>
5646<span class="flex items-center justify-between cursor-pointer
5647                 "
5648            style=""
5649        >
5650<span data-node-title>
5651Rosiers à massifs            </span>
5652<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5653                    <use xlink:href="#chevron-symbol"></use>
5654                </svg>
5655</span>
5656<ol class="p-2"
5657            style="z-index: 2"
5658            data-menu-lvl="2"
5659        >
5660<li class="py-2 heading"
5661    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0"
5662>
5663<a href="https://www.jardindupicvert.com/rosiers"
5664           title="Rosiers&#x20;&#xE0;&#x20;massifs&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5665           class="u-text-ellipsis
5666                 "
5667            style=""
5668        >
5669<span data-node-title>
5670Rosiers à massifs :  tous les produits            </span>
5671</a>
5672</li>
5673<li class="py-2 "
5674    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1"
5675>
5676<a href="https://www.jardindupicvert.com/genre/rosa/rosa-arbuste"
5677           title="Rosiers&#x20;arbustifs"
5678           class="u-text-ellipsis
5679                 "
5680            style=""
5681        >
5682<span data-node-title>
5683Rosiers arbustifs            </span>
5684</a>
5685</li>
5686<li class="py-2 "
5687    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2"
5688>
5689<a href="https://www.jardindupicvert.com/genre/rosa/rosa-couvre-sol"
5690           title="Rosiers&#x20;couvre-sol"
5691           class="u-text-ellipsis
5692                 "
5693            style=""
5694        >
5695<span data-node-title>
5696Rosiers couvre-sol            </span>
5697</a>
5698</li>
5699<li class="py-2 "
5700    data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2_3"
5701>
5702<a href="https://www.jardindupicvert.com/rosiers/rosiers-decorosiers"
5703           title="Rosiers&#x20;D&#xE9;corosiers"
5704           class="u-text-ellipsis
5705                 "
5706            style=""
5707        >
5708<span data-node-title>
5709Rosiers Décorosiers            </span>
5710</a>
5711</li>
5712<li class="py-2 "
5713    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"
5714>
5715<a href="https://www.jardindupicvert.com/genre/rosa/rosa-floribunda"
5716           title="Rosiers&#x20;floribunda"
5717           class="u-text-ellipsis
5718                 "
5719            style=""
5720        >
5721<span data-node-title>
5722Rosiers floribunda            </span>
5723</a>
5724</li>
5725<li class="py-2 "
5726    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"
5727>
5728<a href="https://www.jardindupicvert.com/genre/rosa/rosa-polyantha"
5729           title="Rosiers&#x20;polyantha"
5730           class="u-text-ellipsis
5731                 "
5732            style=""
5733        >
5734<span data-node-title>
5735Rosiers polyantha            </span>
5736</a>
5737</li>
5738</ol>
5739</li>
5740</ol>
5741</li>
5742<li class="py-2 "
5743    data-node-id="931"
5744>
5745<span class="flex items-center justify-between cursor-pointer
5746                 "
5747            style=""
5748        >
5749<span data-node-title>
5750Bulbes et semences            </span>
5751<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5752                    <use xlink:href="#chevron-symbol"></use>
5753                </svg>
5754</span>
5755<ol class="p-2"
5756            style="z-index: 1"
5757            data-menu-lvl="1"
5758        >
5759<li class="py-2 heading"
5760    data-node-id="931_0"
5761>
5762<a href="https://www.jardindupicvert.com/bulbes-et-semences"
5763           title="Bulbes&#x20;et&#x20;semences&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5764           class="u-text-ellipsis
5765                 "
5766            style=""
5767        >
5768<span data-node-title>
5769Bulbes et semences :  tous les produits            </span>
5770</a>
5771</li>
5772<li class="py-2 "
5773    data-node-id="931_0_1"
5774>
5775<span class="flex items-center justify-between cursor-pointer
5776                 "
5777            style=""
5778        >
5779<span data-node-title>
5780Bulbes à floraison printanière            </span>
5781<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5782                    <use xlink:href="#chevron-symbol"></use>
5783                </svg>
5784</span>
5785<ol class="p-2"
5786            style="z-index: 2"
5787            data-menu-lvl="2"
5788        >
5789<li class="py-2 heading"
5790    data-node-id="931_0_1_0"
5791>
5792<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-a-floraison-printaniere"
5793           title="Bulbes&#x20;&#xE0;&#x20;floraison&#x20;printani&#xE8;re&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5794           class="u-text-ellipsis
5795                 "
5796            style=""
5797        >
5798<span data-node-title>
5799Bulbes à floraison printanière :  tous les produits            </span>
5800</a>
5801</li>
5802<li class="py-2 "
5803    data-node-id="931_0_1_0_1"
5804>
5805<a href="https://www.jardindupicvert.com/genre/crocus"
5806           title="Crocus&#x20;de&#x20;printemps"
5807           class="u-text-ellipsis
5808                 "
5809            style=""
5810        >
5811<span data-node-title>
5812Crocus de printemps            </span>
5813</a>
5814</li>
5815<li class="py-2 "
5816    data-node-id="931_0_1_0_1_2"
5817>
5818<a href="https://www.jardindupicvert.com/genre/fritillaria"
5819           title="Fritillaires"
5820           class="u-text-ellipsis
5821                 "
5822            style=""
5823        >
5824<span data-node-title>
5825Fritillaires            </span>
5826</a>
5827</li>
5828<li class="py-2 "
5829    data-node-id="931_0_1_0_1_2_3"
5830>
5831<a href="https://www.jardindupicvert.com/genre/hyacinthus"
5832           title="Jacinthes"
5833           class="u-text-ellipsis
5834                 "
5835            style=""
5836        >
5837<span data-node-title>
5838Jacinthes            </span>
5839</a>
5840</li>
5841<li class="py-2 "
5842    data-node-id="931_0_1_0_1_2_3_4"
5843>
5844<a href="https://www.jardindupicvert.com/genre/muscari"
5845           title="Muscaris"
5846           class="u-text-ellipsis
5847                 "
5848            style=""
5849        >
5850<span data-node-title>
5851Muscaris            </span>
5852</a>
5853</li>
5854<li class="py-2 "
5855    data-node-id="931_0_1_0_1_2_3_4_5"
5856>
5857<a href="https://www.jardindupicvert.com/genre/narcissus"
5858           title="Narcisses"
5859           class="u-text-ellipsis
5860                 "
5861            style=""
5862        >
5863<span data-node-title>
5864Narcisses            </span>
5865</a>
5866</li>
5867<li class="py-2 "
5868    data-node-id="931_0_1_0_1_2_3_4_5_6"
5869>
5870<a href="https://www.jardindupicvert.com/genre/tulipa"
5871           title="Tulipes"
5872           class="u-text-ellipsis
5873                 "
5874            style=""
5875        >
5876<span data-node-title>
5877Tulipes            </span>
5878</a>
5879</li>
5880<li class="py-2 "
5881    data-node-id="931_0_1_0_1_2_3_4_5_6_7"
5882>
5883<a href="https://www.jardindupicvert.com/genre/tulipa/tulipa-gpe-botanique"
5884           title="Tulipes&#x20;botaniques"
5885           class="u-text-ellipsis
5886                 "
5887            style=""
5888        >
5889<span data-node-title>
5890Tulipes botaniques            </span>
5891</a>
5892</li>
5893<li class="py-2 "
5894    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8"
5895>
5896<a href="https://www.jardindupicvert.com/bulbes-et-semences/ail-d-ornement"
5897           title="Aulx&#x20;d&#x27;ornement"
5898           class="u-text-ellipsis
5899                 "
5900            style=""
5901        >
5902<span data-node-title>
5903Aulx d&#039;ornement            </span>
5904</a>
5905</li>
5906</ol>
5907</li>
5908<li class="py-2 "
5909    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2"
5910>
5911<span class="flex items-center justify-between cursor-pointer
5912                 "
5913            style=""
5914        >
5915<span data-node-title>
5916Bulbes à floraison estivale            </span>
5917<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
5918                    <use xlink:href="#chevron-symbol"></use>
5919                </svg>
5920</span>
5921<ol class="p-2"
5922            style="z-index: 2"
5923            data-menu-lvl="2"
5924        >
5925<li class="py-2 heading"
5926    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0"
5927>
5928<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-a-floraison-estivale"
5929           title="Bulbes&#x20;&#xE0;&#x20;floraison&#x20;estivale&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
5930           class="u-text-ellipsis
5931                 "
5932            style=""
5933        >
5934<span data-node-title>
5935Bulbes à floraison estivale :  tous les produits            </span>
5936</a>
5937</li>
5938<li class="py-2 "
5939    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1"
5940>
5941<a href="https://www.jardindupicvert.com/bulbes-et-semences/les-arums"
5942           title="Arums&#x20;
5942-&#x20;Zantedeschia"
5943           class="u-text-ellipsis
5944                 "
5945            style=""
5946        >
5947<span data-node-title>
5948Arums - Zantedeschia            </span>
5949</a>
5950</li>
5951<li class="py-2 "
5952    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2"
5953>
5954<a href="https://www.jardindupicvert.com/genre/begonia"
5955           title="B&#xE9;gonias"
5956           class="u-text-ellipsis
5957                 "
5958            style=""
5959        >
5960<span data-node-title>
5961Bégonias            </span>
5962</a>
5963</li>
5964<li class="py-2 "
5965    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3"
5966>
5967<a href="https://www.jardindupicvert.com/genre/canna"
5968           title="Cannas"
5969           class="u-text-ellipsis
5970                 "
5971            style=""
5972        >
5973<span data-node-title>
5974Cannas            </span>
5975</a>
5976</li>
5977<li class="py-2 "
5978    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4"
5979>
5980<a href="https://www.jardindupicvert.com/genre/dahlia"
5981           title="Dahlias"
5982           class="u-text-ellipsis
5983                 "
5984            style=""
5985        >
5986<span data-node-title>
5987Dahlias            </span>
5988</a>
5989</li>
5990<li class="py-2 "
5991    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5"
5992>
5993<a href="https://www.jardindupicvert.com/genre/freesia"
5994           title="Freesias"
5995           class="u-text-ellipsis
5996                 "
5997            style=""
5998        >
5999<span data-node-title>
6000Freesias            </span>
6001</a>
6002</li>
6003<li class="py-2 "
6004    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6"
6005>
6006<a href="https://www.jardindupicvert.com/genre/gladiolus"
6007           title="Gla&#xEF;euls"
6008           class="u-text-ellipsis
6009                 "
6010            style=""
6011        >
6012<span data-node-title>
6013Glaïeuls            </span>
6014</a>
6015</li>
6016<li class="py-2 "
6017    data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7"
6018>
6019<a href="https://www.jardindupicvert.com/genre/lilium"
6020           title="Lis"
6021           class="u-text-ellipsis
6022                 "
6023            style=""
6024        >
6025<span data-node-title>
6026Lis            </span>
6027</a>
6028</li>
6029</ol>
6030</li>
6031<li class="py-2 "
6032    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"
6033>
6034<a href="https://www.jardindupicvert.com/plantes-annuelles/graines-de-fleurs"
6035           title="Les&#x20;graines&#x20;de&#x20;fleurs"
6036           class="u-text-ellipsis
6037                 "
6038            style=""
6039        >
6040<span data-node-title>
6041Les graines de fleurs            </span>
6042</a>
6043</li>
6044<li class="py-2 "
6045    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"
6046>
6047<span class="flex items-center justify-between cursor-pointer
6048                 "
6049            style=""
6050        >
6051<span data-node-title>
6052Bulbes et semences potagères            </span>
6053<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90">
6054                    <use xlink:href="#chevron-symbol"></use>
6055                </svg>
6056</span>
6057<ol class="p-2"
6058            style="z-index: 2"
6059            data-menu-lvl="2"
6060        >
6061<li class="py-2 heading"
6062    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"
6063>
6064<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-et-semences-potageres"
6065           title="Bulbes&#x20;et&#x20;semences&#x20;potag&#xE8;res&#x20;&#x3A;&#x20;&#x20;tous&#x20;les&#x20;produits"
6066           class="u-text-ellipsis
6067                 "
6068            style=""
6069        >
6070<span data-node-title>
6071Bulbes et semences potagères :  tous les produits            </span>
6072</a>
6073</li>
6074<li class="py-2 "
6075    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"
6076>
6077<a href="https://www.jardindupicvert.com/genre/solanum/solanum-tuberosum"
6078           title="Pommes&#x20;de&#x20;terre"
6079           class="u-text-ellipsis
6080                 "
6081            style=""
6082        >
6083<span data-node-title>
6084Pommes de terre            </span>
6085</a>
6086</li>
6087<li class="py-2 "
6088    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"
6089>
6090<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-et-semences-potageres/oignons-ails-et-echalotes"
6091           title="Oignons,&#x20;ails&#x20;et&#x20;&#xE9;chalottes"
6092           class="u-text-ellipsis
6093                 "
6094            style=""
6095        >
6096<span data-node-title>
6097Oignons, ails et échalottes            </span>
6098</a>
6099</li>
6100</ol>
6101</li>
6102</ol>
6103</li>
6104<li class="py-2 "
6105    data-node-id="953"
6106>
6107<a href="/nos-plantes-en-promotion"
6108           title="NOS&#x20;PLANTES&#x20;EN&#x20;PROMOTION"
6109           class="u-text-ellipsis
6110                 text-highlight"
6111            style=""
6112        >
6113<span data-node-title>
6114NOS PLANTES EN PROMOTION            </span>
6115</a>
6116</li>
6117</ol>
6118</div>
6119</nav>
6120
6121<div class="nav-0-desktop hidden lg:flex items-center text-white text-sm font-serif"
6122         @click.prevent.stop="openAt"
6123    >
6124<span class="mr-8">
6125<span class="text-4xl font-bold text-white cursor-pointer leading-none">&equiv;</span>
6126</span>
6127<ol class="nav nav-0 flex items-center justify-between grow font-bold">
6128<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6129                    data-node-id="758"
6130                >
6131<span class=""
6132                          style=""
6133                    >
6134Plantes vivaces                    </span>
6135</li>
6136<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6137                    data-node-id="800"
6138                >
6139<span class=""
6140                          style=""
6141                    >
6142Arbustes                    </span>
6143</li>
6144<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6145                    data-node-id="832"
6146                >
6147<span class=""
6148                          style=""
6149                    >
6150Arbres                    </span>
6151</li>
6152<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6153                    data-node-id="866"
6154                >
6155<span class=""
6156                          style=""
6157                    >
6158Fruitiers et petits fruits                    </span>
6159</li>
6160<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6161                    data-node-id="1115"
6162                >
6163<span class=""
6164                          style=""
6165                    >
6166Potager                    </span>
6167</li>
6168<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6169                    data-node-id="889"
6170                >
6171<span class=""
6172                          style=""
6173                    >
6174Plantes grimpantes                    </span>
6175</li>
6176<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6177                    data-node-id="912"
6178                >
6179<span class=""
6180                          style=""
6181                    >
6182Rosiers                    </span>
6183</li>
6184<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6185                    data-node-id="931"
6186                >
6187<span class=""
6188                          style=""
6189                    >
6190Bulbes et semences                    </span>
6191</li>
6192<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight"
6193                    data-node-id="953"
6194                >
6195<span class="text-highlight"
6196                          style=""
6197                    >
6198NOS PLANTES EN PROMOTION                    </span>
6199</li>
6200</ol>
6201</div>
6202
6203<!--nav mask-->
6204<div class="backdrop"
6205         :class="isOpen ? '' : 'hidden'"
6206         @click.prevent="closeNav()"></div>
6207</div>
6208
6209<script>
6210    'use strict';
6211
6212    function initMainMenu() {
6213        return {
6214            title: '',
6215            defaultTitle: '<span data-gp-noloc="node">Le\u0020Jardin\u0020du\u0020Pic\u0020Vert</span>',
6216            isOpen: false,
6217            backId: 0,
6218
6219            openAt($event = null) {
6220                if ($event && $event.target?.closest('a')) {
6221                    return;
6222                }
6223                const nodeId = $event && this.getNodeId($event.target);
6224                const node = nodeId ? this.getNodeById(nodeId) : null;
6225                const menu = node?.querySelector('[data-menu-lvl]') || this.$refs.nav;
6226                this.backId = nodeId;
6227                this.title = this.getNodeTitle(node);
6228                this.openMenu(menu);
6229            },
6230
6231            openMenu(menu = null) {
6232                this.isOpen = true;
6233                switchBodyOverflow(false);
6234                this.setActiveMenu(menu);
6235            },
6236
6237            closeNav() {
6238                this.isOpen = false;
6239                switchBodyOverflow(true);
6240            },
6241
6242            navBack() {
6243                const nodeId = this.backId;
6244                const node = nodeId ? this.getNodeById(nodeId) : null;
6245                const menu = node?.closest('[data-menu-lvl]') || this.$refs.nav;
6246                const titleNode = menu?.closest('[data-node-id]');
6247                this.backId = this.getNodeId(titleNode);
6248                this.title = this.getNodeTitle(titleNode);
6249                this.openMenu(menu);
6250            },
6251
6252            setActiveMenu(menu) {
6253                Array.from(this.$root.querySelectorAll('[data-menu-lvl]')).forEach(e => e.classList.remove('active'));
6254                let tmp = menu;
6255                while (tmp) {
6256                    tmp?.classList?.add('active');
6257                    tmp = tmp.parentNode.closest('[data-menu-lvl]');
6258                }
6259            },
6260
6261            getNodeId(node) {
6262                return node instanceof Element ? node.closest('[data-node-id]')?.dataset?.nodeId || 0 : 0;
6263            },
6264
6265            getNodeById(id) {
6266                return this.$refs.nav.querySelector('[data-node-id="' + id + '"]') || null;
6267            },
6268
6269            getNodeTitle(node) {
6270                return node?.querySelector('[data-node-title]')?.innerText || this.defaultTitle;
6271            }
6272        }
6273    }
6274
6275</script>
6275
6276        </div>
6277
6278
6279</div>
6280
6281</div>
6282</header>
6283<script>
6284    function initBannershop() {
6285        const MS_PER_DAY = 24 * 3600 * 1000;
6286        const DEADLINE = 1790377199000;
6287        const DISPLAY_TIME = 0;
6288        const SHOW_COUNTDOWN = false;
6289
6290        return {
6291            show: !DEADLINE || !DISPLAY_TIME || (DEADLINE - Date.now() < DISPLAY_TIME),
6292            days: '-',
6293            hours: '--',
6294            minutes: '--',
6295            seconds: '--',
6296            interval: 0,
6297
6298            init() {
6299                if (this.show && SHOW_COUNTDOWN) {
6300                    if (DISPLAY_TIME) {
6301                        const remaining = DEADLINE - Date.now();
6302                        if (remaining > DISPLAY_TIME) {
6303                            setTimeout(() => {
6304                                this.init()
6305                            }, remaining - DISPLAY_TIME);
6306                            return;
6307                        }
6308                    }
6309                    this.interval = setInterval(() => {
6310                        const now = Date.now();
6311                        let remaining = DEADLINE - now;
6312                        if (remaining <= 0) {
6313                            this.show = false;
6314                            clearInterval(this.interval);
6315                        } else {
6316                            this.days = Math.floor(remaining / MS_PER_DAY);
6317                            remaining -= this.days * MS_PER_DAY;
6318                            this.hours = Math.floor(remaining / 3600000);
6319                            remaining -= this.hours * 3600000;
6320                            this.minutes = Math.floor(remaining / 60000);
6321                            remaining -= this.minutes * 60000;
6322                            this.seconds = Math.floor(remaining / 1000);
6323                        }
6324                    }, 1000);
6325                }
6326            }
6327        }
6328    }
6329</script>
6329
6330<div x-data="initBannershop()"
6331     x-show="show"
6332     class="u-full-width h-[40px] flex items-center justify-center"
6333     style="
6334         background-color: &#x23;55011d;
6335         color: &#x23;FFFFFF     "
6336>
6337<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/fruitiers-a-coques?promo&amp;availability=Disponibles+uniquement"
6338           title="En&#x20;ce&#x20;moment&#x20;&#x3A;&#x20;Profitez&#x20;des&#x20;fruitiers&#x20;&#xE0;&#x20;coques&#x20;&#xE0;&#x20;-30&#x25;&#x20;&#x21;"
6339                           data-ga4-promo-id="banner_shop"
6340                           data-ga4-promo-name="En&#x20;ce&#x20;moment&#x20;&#x3A;&#x20;Profitez&#x20;des&#x20;fruitiers&#x20;&#xE0;&#x20;coques&#x20;&#xE0;&#x20;-30&#x25;&#x20;&#x21;"
6341                           data-ga4-promo-creative="shop"
6342                           data-ga4-promo-position="header"
6343                   >
6344<div class="text-2xs&#x20;sm&#x3A;text-sm&#x20;xl&#x3A;text-lg text-center">
6345En ce moment : Profitez des fruitiers à coques à -30% !                    </div>
6346</a>
6347</div>
6348<div class="top-container">    <nav class="breadcrumbs bg-container-lighter shadow-sm"
6349         aria-label="Breadcrumb"
6350    >
6351<div class="container">
6352<ol class="items list-reset py-4 rounded flex flex-wrap text-grey text-xs">
6353<li class="item flex home">
6354<a href="https://www.jardindupicvert.com/"
6355                           class="hover:underline"
6356                           title="Aller&#x20;&#xE0;&#x20;la&#x20;page&#x20;d&#x2019;accueil"
6357                        >Accueil</a>
6358</li>
6359<li class="item flex cms_page">
6360<span aria-hidden="true"
6361                              class="separator text-primary-lighter px-2">/</span>
6362<span
6363                           class="text-primary-lighter"
6364                           aria-current="page"
6365                        >Mentions légales (PV)</span>
6366</li>
6367</ol>
6368</div>
6369</nav>
6370</div><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div>
6371<div id="fp.wp.marker-top"></div><div class="page messages">
6371<script>
6372    
6373        let NO_SUCCESS_MESSAGE = false;
6374
6375    function initMessages() {
6376        "use strict";
6377        return {
6378            messages: window.mageMessages || [],
6379
6380            isEmpty() {
6381                return this.messages.reduce(
6382                    function (isEmpty, message) {
6383                        return isEmpty && message === undefined
6384                    }, true
6385                )
6386            },
6387
6388            hasMessages() {
6389                return !this.isEmpty();
6390            },
6391
6392            hasMessage() {
6393                return !!this.message;
6394            },
6395
6396            removeMessage() {
6397                this.messages[this.index] = undefined;
6398            },
6399
6400            addMessages(messages, hideAfter) {
6401                messages.map((message) => {
6402                                        if (message.type !== 'success' || (message.type === 'success' && !window.NO_SUCCESS_MESSAGE)) {
6403                        this.messages = this.messages.concat(message);
6404                    }
6405                    if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) {
6406                        hideAfter = window.defaultSuccessMessageTimeout;
6407                    }
6408                    if (hideAfter) {
6409                        this.setHideTimeOut(this.messages.length -1, hideAfter);
6410                    }
6411                });
6412                                window.NO_SUCCESS_MESSAGE = false;
6413            },
6414
6415            setHideTimeOut(messageIndex, hideAfter) {
6416                setTimeout((messageIndex) => {
6417                    this.removeMessage(messageIndex);
6418                }, hideAfter, messageIndex);
6419            },
6420
6421            eventListeners: {
6422                ['@messages-loaded.window'](event) {
6423                    this.addMessages(event.detail.messages, event.detail.hideAfter)
6424                },
6425                ['@private-content-loaded.window'](event) {
6426                    const data = event.detail.data;
6427                    if (
6428                        data.messages &&
6429                        data.messages.messages &&
6430                        data.messages.messages.length
6431                    ) {
6432                        this.addMessages(data.messages.messages);
6433                    }
6434                },
6435                ['@clear-messages.window']() {
6436                    this.messages = [];
6437                }
6438            },
6439
6440            getMessageUiId() {
6441                return 'message-' + this.message.type;
6442            }
6443        }
6444    }
6445    window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true})
6446</script>
6446
6447
6448<section id="messages"
6449         x-data="initMessages"
6450         x-bind="eventListeners"
6451         aria-live="assertive"
6452         role="alert"
6453>
6454<template x-if="hasMessages">
6455<div class="w-full">
6456<div class="messages fixed z-header top-0 inset-x-0">
6457<template x-for="(message, index) in messages"
6458                          :key="index"
6459                >
6460<div>
6461<template x-if="hasMessage">
6462<div class="message flex items-center justify-between font-bold"
6463                                 :class="message.type"
6464                                 :ui-id="getMessageUiId"
6465                            >
6466<span x-html="message.text"></span>
6467<button type="button"
6468                                        class="hover:text-hover"
6469                                        aria-label="Close message"
6470                                        @click.prevent="removeMessage"
6471                                >
6472&times;
6473</button>
6474</div>
6475</template>
6476</div>
6477</template>
6478</div>
6479</div>
6480</template>
6481</section>
6482</div>    <div class="page-main-title">
6483<h1             class="&#x20;text-3xl&#x20;lg&#x3A;text-4xl&#x20;font-bold&#x20;text-center&#x20;font-serif"
6484        >
6485<span class="base" data-ui-id="page-title-wrapper" >Mentions légales</span>        </h1>
6486</div>
6487<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>
6488<p style="text-align: justify;">Forme juridique : <span data-gp-noloc="node">Société par actions simplifiée (SAS)</span></p>
6489<p style="text-align: justify;">Siège social : <span data-gp-noloc="node">1012 rue Roger Lecerf - 59840 Prémesques</span></p>
6490<p style="text-align: justify;">Montant du capital social : 7620€</p>
6491<p style="text-align: justify;">Adresse mail : [email protected]</p>
6492<p style="text-align: justify;">Téléphone : 03 20 59 49 74</p>
6493<p style="text-align: justify;">RCS de Lille métropole : 422 537 100</p>
6494<p style="text-align: justify;">Nom du responsable de la publication : M. Fasson Olivier</p>
6495<p style="text-align: justify;">Site hébergé par : OVHCloud, </p>
6496<p style="text-align: justify;"><span data-gp-noloc="node">2 rue Kellermann</span></p>
6497<p style="text-align: justify;"><span data-gp-noloc="node"> 59100 Roubaix France</span></p>
6498<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>
6499<h3 style="text-align: justify;">Les cookies :</h3>
6500<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>
6501</div></div><div id="fp.wp.marker-bottom"></div></main><footer class="bg-container-dark py-16"><div class="container"><section id="reinsurance-blocks"
6502         class="text-center mb-12"
6503>
6504<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">
6505<div class="flex flex-col justify-center items-center gap-2">
6506<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#cursor-symbol"></use></svg>
6507<p class="text-white font-bold font-serif text-sm">
650814 899 plantes
6509</p>
6510<p class="text-secondary-lighter text-xs">
6511en 39 337 tailles
6512</p>
6513</div>
6514<div class="flex flex-col justify-center items-center gap-2">
6515<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#customer-service-symbol"></use></svg>
6516<p class="text-white font-bold font-serif text-sm">
6517Nous contacter
6518</p>
6519<p class="text-secondary-lighter text-xs">
6520<span class="glopal-hide">par téléphone au <a href="tel:0320594974" class="text-white">
652003 20 59 49 74</a><br></span>
6521par <a href="https://www.jardindupicvert.com/contact/" class="text-white">formulaire de contact</a><br>
6522Service client disponible du lundi au vendredi.<br>
6523<span data-gp-noloc="node">23 route du Fresnel 59116 Houplines</span>
6524</p>
6525</div>
6526<div class="flex flex-col justify-center items-center gap-2">
6527<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#security-symbol"></use></svg>
6528<p class="mb-2 text-white font-bold font-serif text-sm">
6529Paiement 100% sécurisé
6530</p>
6531<img src="https://www.jardindupicvert.com/static/version1790243132/frontend/PicVert/hyva/fr_FR/images/footer-payment-methods.svg"
6532                 class="inline-block w-2/3"
6533                 title="Paiement 100% sécurisé Visa - CB - Mastercard - Paypal"
6534            />
6535</div>
6536<div class="flex flex-col justify-center items-center gap-2">
6537<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#warranty-symbol"></use></svg>
6538<p class="mb-2 text-white font-bold font-serif text-sm">
6539Garantie de reprise
6540</p>
6541<p class="text-secondary-lighter text-xs">
6542sur toutes nos plantes
6543</p>
6544</div>
6545<div class="flex flex-col justify-center items-center gap-2">
6546<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#shipping-symbol"></use></svg>
6547<p class="mb-2 text-white font-bold font-serif text-sm">
6548Informations livraison
6549</p>
6550<p class="text-secondary-lighter text-xs">
6551Livraison rapide, sous 3 à 4 jours<span class="glopal-hide"><br>
6552ou sur rendez-vous</span>
6553</p>
6554</div>
6555<div class="flex flex-col justify-center items-center gap-2">
6556<span class="h-12 text-xl text-secondary-lighter">&#x2605;&#x2605;&#x2605;&#x2605;&#x2605;</span>
6557<p class="mb-2 text-white font-bold font-serif text-sm">
6558Avis clients Google
6559</p>
6560<p class="text-secondary-lighter text-xs">
65614.4 / 5
6562</p>
6563</div>
6564</div>
6565</section>
6566<form x-data="initNewsletterForm()"
6567      x-defer="intersect"
6568      @submit.prevent="submitForm()"
6569      id="newsletter-validate-detail"
6570      class="form subscribe"
6571      :class="{'u-loader': loading}"
6572      action="https://www.jardindupicvert.com/newsletter/subscriber/new/"
6573      method="post"
6574>
6575<div class="my-8 py-4 px-8 border-primary-lighter border-t border-b">
6576<div class="flex flex-col md:flex-row items-center justify-center gap-x-4 gap-y-2">
6577<label for="newsletter-subscribe"
6578                   class="text-white leading-tight"
6579            >
6580<span class="text-sm font-bold">La newsletter préférée des jardins</span>
6581<br>                    <span class="text-xs">Recevez nos actualités et des idées pour profiter de votre jardin toute l&#039;année.</span>
6582</label>
6583<div>
6584<input name="email"
6585                       type="email"
6586                       required
6587                       id="newsletter-subscribe"
6588                       class="form-input w-full px-4 py-2 border-primary-lighter border rounded-3xl shadow-sm text-sm"
6589                       placeholder="Votre&#x20;adresse&#x20;email"
6590                >
6591<input name="form_key" type="hidden" value="GlviVI2SJRtUGRrR" />            </div>
6592<div>
6593<button class="inline-flex shrink-0 ml-auto xl:mt-0 text-primary-lighter hover:underline">
6594Je m&#039;inscris &rarr;
6595</button>
6596<div class="control">
6597<input type="hidden"
6598           value=""
6599           name="g-recaptcha-response"
6600    >
6601</div>
6602</div>
6603</div>
6604<template x-if="displayErrorMessage">
6605<p class="flex items-center text-red">
6606<template x-for="errorMessage in errorMessages">
6607<svg class="w-4 sm:w-6 h-4 sm:h-6 mx-1"><use xlink:href="#warning-symbol"></use></svg>
6608<span x-html="errorMessage"></span>
6609</template>
6610</p>
6611</template>
6612<div class="text-white">
6613<p class="my-4 text-2xs text-center leading-tight">
6614<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>
6615</p>
6616</div>
6617</div>
6618</form>
6619
6620<script>
6621        function initNewsletterForm() {
6622            return {
6623                errors: 0,
6624                hasCaptchaToken: 0,
6625                displayErrorMessage: false,
6626                errorMessages: [],
6627                loading: false,
6628
6629                setErrorMessages(messages) {
6630                    this.errorMessages = [messages]
6631                    this.displayErrorMessage = this.errorMessages.length
6632                },
6633                submitForm() {
6634                    this.loading = true;
6635                    // Do not rename $form, the variable is expected to be declared in the child block output
6636                    const $form = document.querySelector('#newsletter-validate-detail');
6637                        if (!this.hasCaptchaToken) {
6638        this.errors = 1;
6639
6640        const lockSubmitButton = () => {
6641            $form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
6642        };
6643
6644        const failCaptcha = (errorMessage, exception = null) => {
6645            this.errors = 1;
6646            lockSubmitButton();
6647
6648            if (this.setErrorMessages) {
6649                this.setErrorMessages([errorMessage]);
6650                this.displayErrorMessage = true;
6651            } else {
6652                window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
6653            }
6654
6655            if (exception) {
6656                console.error(
6657                    exception ||
6658                    'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
6659                );
6660            }
6661        };
6662
6663        const executeGreCaptcha = () => {
6664            grecaptcha.ready(() => {
6665                grecaptcha.execute(
6666                    '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV',
6667                    {action: 'submit'}
6668                ).then((token) => {
6669                    const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
6670
6671                    if (tokenElement && token && token.length > 0) {
6672                        $form['g\u002Drecaptcha\u002Dresponse'].value = token;
6673                        this.errors = 0;
6674                        this.hasCaptchaToken = 1;
6675                        (this.submitForm || $form.submit).call(this);
6676                    } else {
6677                        failCaptcha(
6678                            tokenElement
6679                                ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
6680                                : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
6681                        );
6682                    }
6683                }).catch((exception) => {
6684                    failCaptcha(
6685                        'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
6686                        exception
6687                    );
6688                });
6689            });
6690        };
6691
6692        if (window.grecaptcha) {
6693            executeGreCaptcha();
6694        } else {
6695            const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV";
6696            const script = document.createElement('script');
6697            script.setAttribute('type', 'text/javascript');
6698            script.setAttribute('src', recaptchaUrl);
6699            document.head.appendChild(script);
6700
6701            script.addEventListener("load", executeGreCaptcha, false);
6702        }
6703    }
6704                    if (this.errors === 0) {
6705                        $form.submit();
6706                    }
6707                }
6708            }
6709        }
6710    </script>
6710
6711</div>
6712<h4 class="mt-12 text-white font-bold lg:text-lg text-center">
6713<span data-gp-noloc="node">Le Jardin du Pic-Vert</span>, Jardinerie en ligne depuis 2003
6714</h4>
6715<div class="flex justify-center gap-1 mt-12 font-serif text-white">
6716<a href="/notre-entreprise"
6717       class="hover:underline"
6718    >
6719Qui sommes-nous ?
6720</a>
6721|
6722<a href="/questions-frequentes"
6723       class="hover:underline"
6724    >
6725Questions fréquentes
6726</a>
6727|
6728<a href="/mentions-legales"
6729       class="hover:underline"
6730    >
6731Mentions légales
6732</a>
6733|
6734<a href="/conditions-generales-de-vente"
6735       class="hover:underline"
6736    >
6737CGV
6738</a>
6739</div>
6740<p class="mt-24 text-right text-xs text-white font-bold">
6741© 2009/2025 - Tous droits réservés - <span data-gp-noloc="node">Le Jardin du Pic</span> Vert est une marque déposée
6742</p>
6743<div class="my-8 text-sm text-white font-bold text-center">
6744</div>
6745
6746</div></footer>
6747<script>
6748    let SnapSlider = class {
6749        constructor(el, {
6750            labelSepparator = 'sur',
6751            autoPager,
6752            groupPager,
6753            loop,
6754            forcePager
6755        } = {}) {
6756            this.el = el;
6757            this.track = this.el.querySelector("[data-track]");
6758            if (!this.track) {
6759                console.warn(
6760                    "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track",
6761                    this.el
6762                );
6763                return;
6764            }
6765            this.initialLoad = true;
6766            this.slides = [];
6767            this.inViewObserver;
6768            this.mutationObserver;
6769            this.resizeObserver;
6770            this.pager = this.el.querySelector("[data-pager]");
6771            this.navBtns = Array.from(
6772                this.el.querySelectorAll("[data-next], [data-prev]")
6773            );
6774            this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator;
6775            this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false;
6776            this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false;
6777            this.useLoop = loop || this.el.hasAttribute("data-loop") || false;
6778            this.forcePager = forcePager || this.el.hasAttribute("data-force-pager") || false;
6779            this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
6780            this.sliderId = this.el.id || this.sliderLabel || "slider";
6781            this.markerIdName = "data-target-id";
6782            this.pagerClasses = this.el.dataset.pagerClass || "snap-pager";
6783            this.markerClasses = this.el.dataset.markerClass || "snap-marker";
6784            this.init();
6785        }
6786        init() {
6787            this.setupSlides();
6788            this.setupNav();
6789            if (this.useAutoPager) {
6790                this.createPager();
6791            } else {
6792                this.setupPager();
6793            }
6794            this.setupObservers();
6795            this.setupMutationObserver();
6796            this.setupResizeObserver();
6797            this.el.addEventListener("click", this.eventHandler.bind(this));
6798            this.el.addEventListener("keydown", this.eventHandler.bind(this));
6799            if ("onscrollend" in window) {
6800                this.track.addEventListener("scrollend", () => {
6801                    this.isNavigating = false;
6802                });
6803            } else {
6804                this.track.addEventListener("scroll", () => {
6805                    clearTimeout(this.scrollEndTimer);
6806                    this.scrollEndTimer = setTimeout(() => {
6807                        this.isNavigating = false;
6808                    }, 100);
6809                });
6810            }
6811        }
6812        destroy() {
6813            this.inViewObserver?.disconnect();
6814            this.mutationObserver?.disconnect();
6815            this.resizeObserver?.disconnect();
6816            this.el.removeEventListener("click", this.eventHandler.bind(this));
6817            this.el.removeEventListener("keydown", this.eventHandler.bind(this));
6818        }
6819        roundUpIfGreaterThan(number, min = 8) {
6820            const decimalPart = number - Math.floor(number);
6821            return decimalPart >= min ? Math.ceil(number) : Math.floor(number);
6822        }
6823        getInViewItems() {
6824            const inViewSlides = Array.from(this.track.querySelectorAll("[data-in-view]")).filter((el) => this.slides.includes(el));
6825            const firstInViewSlide = inViewSlides[0] || null;
6826            const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null;
6827            const isAtStart = firstInViewSlide === this.slides[0];
6828            const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1];
6829            return {
6830                inViewSlides,
6831                totalInViewSlides: inViewSlides.length,
6832                firstInViewSlide,
6833                lastInViewSlide,
6834                isAtStart,
6835                isAtEnd,
6836                hasNoOverflow: isAtStart && isAtEnd
6837            };
6838        }
6839        groupPagerMarkers() {
6840            if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return;
6841            const totalVisibleSlides = this.roundUpIfGreaterThan(
6842                this.track.offsetWidth / this.slides[0].offsetWidth
6843            );
6844            const markers = Array.from(this.pager.querySelectorAll("a, button"));
6845            markers.forEach((marker, index) => {
6846                marker.style.display = index % totalVisibleSlides === 0 ? null : "none";
6847            });
6848        }
6849        handleInView(entries) {
6850            entries.forEach((entry) => {
6851                const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector(
6852                    `[${this.markerIdName}="${entry.target.id}"]`
6853                ));
6854                entry.target.toggleAttribute("data-in-view", entry.isIntersecting);
6855                entry.target.toggleAttribute("inert", !entry.isIntersecting);
6856                marker?.setAttribute("aria-current", entry.isIntersecting);
6857                marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1");
6858            });
6859            const { isAtStart, isAtEnd, hasNoOverflow } = this.getInViewItems();
6860            this.navBtns.forEach((btn) => {
6861                if (btn.hasAttribute("data-next")) {
6862                    btn.style.visibility = hasNoOverflow ? "hidden" : null;
6863                    isAtEnd && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
6864                }
6865                if (btn.hasAttribute("data-prev")) {
6866                    btn.style.visibility = hasNoOverflow ? "hidden" : null;
6867                    isAtStart && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled");
6868                }
6869            });
6870            if (this.pager) {
6871                const hidePager = hasNoOverflow && !this.forcePager;
6872                this.pager.style.visibility = hidePager ? "hidden" : null;
6873                this.pager.toggleAttribute("inert", hidePager);
6874            }
6875            if (!this.initialLoad) {
6876                this.el.dispatchEvent(
6877                    new CustomEvent("slideChange", {
6878                        detail: this.getInViewItems()
6879                    })
6880                );
6881            } else {
6882                this.initialLoad = false;
6883            }
6884            if (document.activeElement.parentElement.hasAttribute("data-pager")) {
6885                const activeItems = this.pager.querySelectorAll('[tabindex="0"]');
6886                if (activeItems.length) {
6887                    activeItems[0].focus({ preventScroll: true });
6888                }
6889            }
6890        }
6891        getSlides() {
6892            if (!this.track) return [];
6893            return Array.from(this.track.children).filter(
6894                (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" && child.style.display !== "none"
6895            );
6896        }
6897        refreshSlides() {
6898            this.initialLoad = true;
6899            this.slides = this.getSlides();
6900            this.setupSlides();
6901            if (this.useAutoPager) {
6902                this.createPager();
6903            } else {
6904                this.setupPager();
6905            }
6906            this.groupPagerMarkers();
6907            this.setupObservers();
6908        }
6909        setupSlides() {
6910            this.slides = this.getSlides();
6911            this.slides.forEach((slide, index) => {
6912                const totalSlides = this.slides.length;
6913                const currentSlide = index + 1;
6914                const existingLabel = slide.getAttribute("aria-label") || "";
6915                const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture";
6916                const slideLabelTag = isImage ? "alt" : "aria-label";
6917                const hasAutoLabel = existingLabel.startsWith(
6918                    `${currentSlide} ${this.slideLabelSepparator} `
6919                );
6920                if (!slide.hasAttribute("id")) {
6921                    slide.setAttribute(
6922                        "id",
6923                        `${this.sliderId}-item-${currentSlide}`
6924                    );
6925                }
6926                if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) {
6927                    slide.setAttribute(
6928                        slideLabelTag,
6929                        `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}`
6930                    );
6931                }
6932                if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) {
6933                    slide.setAttribute("role", "group");
6934                }
6935                if (this.pager && !isImage) {
6936                    slide.setAttribute("role", "tabpanel");
6937                }
6938                if (slide.getAttribute("role") === "group") {
6939                    slide.setAttribute("aria-roledescription", "item");
6940                }
6941            });
6942            if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") {
6943                this.el.setAttribute("role", "region");
6944            }
6945            if (!this.el.hasAttribute("aria-roledescription")) {
6946                this.el.setAttribute("aria-roledescription", "carousel");
6947            }
6948            if (!this.track.hasAttribute("tabindex")) {
6949                this.track.setAttribute("tabindex", 0);
6950            }
6951            this.track.setAttribute("aria-live", "polite");
6952        }
6953        setupNav() {
6954            this.navBtns.forEach((btn) => {
6955                btn.setAttribute("disabled", "");
6956                btn.removeAttribute("hidden");
6957                btn.classList.remove("invisible");
6958                btn.style.visibility = null;
6959            });
6960        }
6961        createPager() {
6962            const newPager = document.createElement("nav");
6963            newPager.setAttribute("data-pager", "");
6964            newPager.setAttribute("role", "tablist");
6965            newPager.classList.add(...this.pagerClasses.split(" "));
6966            this.slides.forEach((slide, index) => {
6967                const marker = document.createElement("button");
6968                const slideId = slide.id || `${this.sliderId}-item-${index + 1}`;
6969                marker.setAttribute(this.markerIdName, slideId);
6970                marker.classList.add(...this.markerClasses.split(" "));
6971                this.setupPagerMarker(marker, index);
6972                newPager.appendChild(marker);
6973                if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") {
6974                    slide.removeAttribute("aria-roledescription");
6975                    slide.setAttribute("role", "tabpanel");
6976                }
6977            });
6978            if (this.pager) {
6979                this.pager.setAttribute("role", "tablist");
6980                this.pager.replaceChildren(...newPager.children);
6981            } else {
6982                this.track.after(newPager);
6983                this.pager = this.el.querySelector("[data-pager]");
6984            }
6985        }
6986        setupPager() {
6987            if (!this.pager) return;
6988            this.pager.setAttribute("role", "tablist");
6989            const items = Array.from(this.pager.querySelectorAll("a, button"));
6990            items.forEach((marker, index) => this.setupPagerMarker(marker, index));
6991        }
6992        setupPagerMarker(marker, index) {
6993            const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
6994            const slideId = markerId || `${this.sliderId}-item-${index + 1}`;
6995            if (!markerId) {
6996                marker.setAttribute(this.markerIdName, slideId);
6997            }
6998            marker.setAttribute("role", "tab");
6999            marker.setAttribute("aria-controls", slideId);
7000            marker.setAttribute("aria-posinset", index + 1);
7001            marker.setAttribute("aria-setsize", this.slides.length);
7002            marker.setAttribute("tabindex", "-1");
7003            if (!marker.hasAttribute("aria-label")) {
7004                marker.setAttribute("aria-label", `Slide ${index + 1}`);
7005            }
7006        }
7007        setupObservers() {
7008            if (this.inViewObserver) {
7009                this.inViewObserver.disconnect();
7010            }
7011            this.inViewObserver = new IntersectionObserver(
7012                this.handleInView.bind(this), {
7013                    root: this.track,
7014                    threshold: 0.8
7015                }
7016            );
7017            this.slides.forEach((slide) => this.inViewObserver.observe(slide));
7018        }
7019        setupMutationObserver() {
7020            this.mutationObserver = new MutationObserver((mutations) => {
7021                if (mutations.some((m) => m.type === "childList" || m.target.parentElement === this.track)) {
7022                    this.refreshSlides();
7023                }
7024            });
7025            this.mutationObserver.observe(this.track, {
7026                childList: true,
7027                subtree: true,
7028                attributeFilter: ["style"]
7029            });
7030        }
7031        setupResizeObserver() {
7032            this.resizeObserver = new ResizeObserver(
7033                this.groupPagerMarkers.bind(this)
7034            );
7035            this.resizeObserver.observe(this.el);
7036        }
7037        goToSlideDir(dir = "next") {
7038            if (this.isNavigating) return;
7039            const { firstInViewSlide, lastInViewSlide } = this.getInViewItems();
7040            const isPrev = dir === "prev";
7041            const referenceSlide = isPrev ? firstInViewSlide : lastInViewSlide;
7042            const currentIndex = this.slides.indexOf(referenceSlide);
7043            let targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1;
7044            if (targetIndex < 0 || targetIndex >= this.slides.length) {
7045                if (!this.useLoop) return;
7046                targetIndex = isPrev ? this.slides.length - 1 : 0;
7047            }
7048            const targetSlide = this.slides[targetIndex];
7049            if (!targetSlide) return;
7050            this.isNavigating = true;
7051            targetSlide.scrollIntoView({
7052                block: "nearest",
7053                inline: isPrev ? "end" : "start"
7054            });
7055        }
7056        pagerToSlide(event) {
7057            if (!event.target.closest("[data-pager]")) return;
7058            const marker = event.target.closest("a, button");
7059            if (!marker) return;
7060            event.preventDefault();
7061            const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName);
7062            const targetSlide = this.track.querySelector(`#${slideId}`);
7063            targetSlide?.scrollIntoView({ block: "nearest", inline: "start" });
7064        }
7065        eventHandler(event) {
7066            const target = event.target.closest(
7067                "[data-next], [data-prev], [data-pager]"
7068            );
7069            if (!target) return;
7070            if (event.type === "click") {
7071                if (target.hasAttribute("data-next")) {
7072                    this.goToSlideDir("next");
7073                } else if (target.hasAttribute("data-prev")) {
7074                    this.goToSlideDir("prev");
7075                } else if (target.closest("[data-pager]")) {
7076                    this.pagerToSlide(event);
7077                }
7078            }
7079            if (event.type === "keydown" && target.closest("[data-pager]")) {
7080                if (event.key === "ArrowRight" || event.key === "ArrowDown") {
7081                    event.preventDefault();
7082                    this.goToSlideDir("next");
7083                } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
7084                    event.preventDefault();
7085                    this.goToSlideDir("prev");
7086                }
7087            }
7088        }
7089    };
7090
7091    (() => {
7092        function alpineSnapSlider(Alpine) {
7093            Alpine.directive("snap-slider", (el, {
7094                modifiers
7095            }, {
7096                cleanup
7097            }) => {
7098                const slider = new SnapSlider(el, {
7099                    autoPager: modifiers.includes("auto-pager"),
7100                    groupPager: modifiers.includes("group-pager"),
7101                    loop: modifiers.includes("loop"),
7102                    forcePager: modifiers.includes("force-pager")
7103                });
7104                cleanup(() => {
7105                    slider.destroy();
7106                });
7107            });
7108        }
7109
7110        document.addEventListener("alpine:init", () => {
7111            window.Alpine.plugin(alpineSnapSlider);
7112        });
7113    })();
7114    //# sourceURL=alpine-snap-slider.js
7115</script>
vendor: 1 bytes, line 7115
7115
7116<script>
7117    (() => {
7118        'use strict';
7119
7120        if (typeof SnapSlider === 'undefined') {
7121            return;
7122        }
7123
7124        const RESIZE_DEBOUNCE_MS = 150;
7125        const SCROLL_FALLBACK_THROTTLE_MS = 100;
7126
7127        window.AmSnapSlider = class AmSnapSlider extends SnapSlider {
7128            init() {
7129                this.useInfinite = this.el.hasAttribute('data-am-infinity-loop');
7130
7131                super.init();
7132
7133                if (!this.useInfinite || !this.track) {
7134                    return;
7135                }
7136
7137                this._cloneCount = 0;
7138                this._isCloning = false;
7139                this._isJumping = false;
7140                this._onInfiniteScrollEnd = this._onInfiniteScrollEnd.bind(this);
7141
7142                this._setupInfiniteLoop();
7143                this._bindInfiniteScrollEnd();
7144            }
7145
7146            getSlides() {
7147                const slides = super.getSlides();
7148
7149                if (!this.useInfinite) {
7150                    return slides;
7151                }
7152
7153                return slides.filter((child) => !child.hasAttribute('data-clone'));
7154            }
7155
7156            refreshSlides() {
7157                if (!this.useInfinite) {
7158                    return super.refreshSlides();
7159                }
7160
7161                if (this._isCloning) {
7162                    return;
7163                }
7164
7165                this._removeClones();
7166                super.refreshSlides();
7167                this._setupInfiniteLoop();
7168            }
7169
7170            setupResizeObserver() {
7171                this.resizeObserver = new ResizeObserver(() => {
7172                    requestAnimationFrame(() => {
7173                        if (this._isCloning || this._isJumping) {
7174                            return;
7175                        }
7176
7177                        this.groupPagerMarkers();
7178
7179                        if (!this.useInfinite) {
7180                            return;
7181                        }
7182
7183                        clearTimeout(this._resizeInfiniteTimer);
7184                        this._resizeInfiniteTimer = setTimeout(() => {
7185                            this._setupInfiniteLoop();
7186                        }, RESIZE_DEBOUNCE_MS);
7187                    });
7188                });
7189                this.resizeObserver.observe(this.el);
7190            }
7191
7192            goToSlideDir(dir = 'next') {
7193                if (!this.useInfinite || !this._cloneCount) {
7194                    return super.goToSlideDir(dir);
7195                }
7196
7197                if (this.isNavigating || this._isJumping) {
7198                    return;
7199                }
7200
7201                const allSlides = this._getAllTrackSlides();
7202
7203                if (!allSlides.length) {
7204                    return;
7205                }
7206
7207                // Same page-step as SnapSlider: next from last in-view, prev from first.
7208                const inViewSlides = this._getVisibleTrackSlides(allSlides);
7209                const isPrev = dir === 'prev';
7210                const referenceSlide = isPrev
7211                    ? inViewSlides[0]
7212                    : inViewSlides[inViewSlides.length - 1];
7213                const currentIndex = allSlides.indexOf(referenceSlide);
7214
7215                if (currentIndex < 0) {
7216                    return;
7217                }
7218
7219                const targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1;
7220
7221                if (targetIndex < 0 || targetIndex >= allSlides.length) {
7222                    return;
7223                }
7224
7225                const targetSlide = allSlides[targetIndex];
7226
7227                if (!targetSlide) {
7228                    return;
7229                }
7230
7231                this.isNavigating = true;
7232                targetSlide.scrollIntoView({
7233                    block: 'nearest',
7234                    inline: isPrev ? 'end' : 'start'
7235                });
7236            }
7237
7238            handleInView(entries) {
7239                this.focusOnActivePageMarker();
7240
7241                if (!this.useInfinite) {
7242                    const focusedNavBtn = this.navBtns.includes(document.activeElement)
7243                        ? document.activeElement
7244                        : null;
7245
7246                    super.handleInView(entries);
7247
7248                    if (focusedNavBtn?.disabled) {
7249                        this.navBtns.find((btn) =>
7249 !btn.disabled)?.focus({ preventScroll: true });;
7250                    }
7251
7252                    return;
7253                }
7254
7255                const realEntries = [];
7256
7257                entries.forEach((entry) => {
7258                    if (entry.target.hasAttribute('data-clone')) {
7259                        entry.target.toggleAttribute('data-in-view', entry.isIntersecting);
7260                        entry.target.setAttribute('inert', '');
7261                        entry.target.setAttribute('aria-hidden', 'true');
7262                        return;
7263                    }
7264
7265                    realEntries.push(entry);
7266                });
7267
7268                if (realEntries.length) {
7269                    super.handleInView(realEntries);
7270                }
7271
7272                this.navBtns.forEach((btn) => {
7273                    btn.removeAttribute('disabled');
7274                    btn.style.visibility = null;
7275                });
7276            }
7277
7278            focusOnActivePageMarker() {
7279                if (!this.useGroupPager || !this.pager || !this.slides.length) {
7280                    return;
7281                }
7282
7283                const totalVisibleSlides = this.roundUpIfGreaterThan(
7284                    this.track.offsetWidth / this.slides[0].offsetWidth
7285                );
7286                const markers = Array.from(this.pager.querySelectorAll('a, button'));
7287                const { lastInViewSlide } = this.getInViewItems();
7288                const activeIndex = lastInViewSlide ? this.slides.indexOf(lastInViewSlide) : -1;
7289                const activeGroupLeaderIndex = activeIndex >= 0
7290                    ? activeIndex - (activeIndex % totalVisibleSlides)
7291                    : -1;
7292
7293                let currentMarker = null;
7294
7295                markers.forEach((marker, index) => {
7296                    const isGroupLeader = index % totalVisibleSlides === 0;
7297
7298                    if (!isGroupLeader) {
7299                        marker.setAttribute('aria-current', 'false');
7300                        marker.setAttribute('tabindex', '-1');
7301                        return;
7302                    }
7303
7304                    const isCurrent = index === activeGroupLeaderIndex;
7305
7306                    marker.setAttribute('aria-current', String(isCurrent));
7307                    marker.setAttribute('tabindex', isCurrent ? '0' : '-1');
7308
7309                    if (isCurrent) {
7310                        currentMarker = marker;
7311                    }
7312                });
7313
7314                if (currentMarker && this.pager.contains(document.activeElement)
7315                    && document.activeElement !== currentMarker
7316                ) {
7317                    currentMarker.focus({ preventScroll: true });
7318                }
7319            }
7320
7321            destroy() {
7322                if (this.useInfinite) {
7323                    this._unbindInfiniteScrollEnd();
7324                    clearTimeout(this._resizeInfiniteTimer);
7325                    clearTimeout(this._infiniteScrollTimer);
7326                    this._removeClones();
7327                }
7328
7329                super.destroy();
7330            }
7331
7332            _getAllTrackSlides() {
7333                return this.track ? super.getSlides() : [];
7334            }
7335
7336            _getClosestSlideIndex(slides) {
7337                const trackLeft = this.track.getBoundingClientRect().left;
7338                let closest = 0;
7339                let minDist = Infinity;
7340
7341                slides.forEach((slide, index) => {
7342                    const dist = Math.abs(slide.getBoundingClientRect().left - trackLeft);
7343                    if (dist < minDist) {
7344                        minDist = dist;
7345                        closest = index;
7346                    }
7347                });
7348
7349                return closest;
7350            }
7351
7352            _getVisibleTrackSlides(slides) {
7353                const marked = slides.filter((slide) => slide.hasAttribute('data-in-view'));
7354                if (marked.length) {
7355                    return marked;
7356                }
7357
7358                const trackRect = this.track.getBoundingClientRect();
7359                const threshold = 0.8;
7360
7361                return slides.filter((slide) => {
7362                    const rect = slide.getBoundingClientRect();
7363                    const visibleWidth = Math.min(rect.right, trackRect.right)
7364                        - Math.max(rect.left, trackRect.left);
7365
7366                    if (visibleWidth <= 0) {
7367                        return false;
7368                    }
7369
7370                    return (visibleWidth / Math.max(rect.width, 1)) >= threshold;
7371                });
7372            }
7373
7374            _getSlideScrollLeft(slide) {
7375                const trackRect = this.track.getBoundingClientRect();
7376                const slideRect = slide.getBoundingClientRect();
7377
7378                return this.track.scrollLeft + (slideRect.left - trackRect.left);
7379            }
7380
7381            _createClone(slide, position, index) {
7382                const clone = slide.cloneNode(true);
7383                const baseId = slide.id || `${this.sliderId}-item-${index + 1}`;
7384
7385                clone.setAttribute('data-clone', position);
7386                clone.setAttribute('data-clone-of', baseId);
7387                clone.setAttribute('aria-hidden', 'true');
7388                clone.setAttribute('inert', '');
7389                clone.setAttribute('x-ignore', '');
7390                clone.id = `${baseId}-clone-${position}-${index}`;
7391                clone.removeAttribute('data-in-view');
7392
7393                clone.querySelectorAll('[id]').forEach((el) => {
7394                    if (el !== clone) {
7395                        el.removeAttribute('id');
7396                    }
7397                });
7398                clone.querySelectorAll('[name]').forEach((el) => {
7399                    el.removeAttribute('name');
7400                });
7401
7402                return clone;
7403            }
7404
7405            _removeClones() {
7406                if (!this.track) {
7407                    return;
7408                }
7409
7410                this.track.querySelectorAll('[data-clone]').forEach((clone) => {
7411                    clone.remove();
7412                });
7413                this._cloneCount = 0;
7414            }
7415
7416            _silentScrollTo(slide) {
7417                if (!slide || !this.track) {
7418                    return;
7419                }
7420
7421                this._isJumping = true;
7422
7423                const track = this.track;
7424                const prevBehavior = track.style.scrollBehavior;
7425                const prevSnap = track.style.scrollSnapType;
7426
7427                track.style.scrollBehavior = 'auto';
7428                track.style.scrollSnapType = 'none';
7429                track.scrollLeft = this._getSlideScrollLeft(slide);
7430
7431                requestAnimationFrame(() => {
7432                    track.style.scrollBehavior = prevBehavior;
7433                    track.style.scrollSnapType = prevSnap;
7434                    this._isJumping = false;
7435                    this.isNavigating = false;
7436                });
7437            }
7438
7439            _canUseInfinite(realSlides) {
7440                if (!realSlides.length || realSlides.length < 2) {
7441                    return false;
7442                }
7443
7444                return this.track.scrollWidth > this.track.clientWidth + 1;
7445            }
7446
7447            _setupInfiniteLoop() {
7448                if (!this.useInfinite || !this.track || this._isCloning) {
7449                    return;
7450                }
7451
7452                this._isCloning = true;
7453                this.mutationObserver?.disconnect();
7454
7455                let restoreIndex = 0;
7456                const { firstInViewSlide } = this.getInViewItems();
7457                const currentIndex = this.slides.indexOf(firstInViewSlide);
7458
7459                if (currentIndex >= 0) {
7460                    restoreIndex = currentIndex;
7461                }
7462
7463                this._removeClones();
7464
7465                const realSlides = this.getSlides();
7466
7467                this.slides = realSlides;
7468
7469                if (!this._canUseInfinite(realSlides)) {
7470                    this._cloneCount = 0;
7471                    this._isCloning = false;
7472                    this._reobserveMutations();
7473                    this.setupObservers();
7474
7475                    return;
7476                }
7477
7478                const slideWidth = realSlides[0].offsetWidth || 1;
7479                const visibleCount = Math.max(
7480                    1,
7481                    this.roundUpIfGreaterThan(this.track.offsetWidth / slideWidth)
7482                );
7483
7484                this._cloneCount = Math.min(visibleCount, realSlides.length);
7485
7486                const prependFragment = document.createDocumentFragment();
7487
7488                for (let i = realSlides.length - this._cloneCount; i < realSlides.length; i++) {
7489                    prependFragment.appendChild(
7490                        this._createClone(realSlides[i], 'pre', i)
7491                    );
7492                }
7493                this.track.insertBefore(prependFragment, this.track.firstChild);
7494
7495                const appendFragment = document.createDocumentFragment();
7496                for (let i = 0; i < this._cloneCount; i++) {
7497                    appendFragment.appendChild(
7498                        this._createClone(realSlides[i], 'post', i)
7499                    );
7500                }
7501                this.track.appendChild(appendFragment);
7502
7503                this.slides = this.getSlides();
7504                this.setupObservers();
7505
7506                this._getAllTrackSlides().forEach((slide) => {
7507                    if (slide.hasAttribute('data-clone')) {
7508                        this.inViewObserver.observe(slide);
7509                    }
7510                });
7511
7512                const target = this.slides[restoreIndex] || this.slides[0];
7513                requestAnimationFrame(() => {
7514                    this._silentScrollTo(target);
7515                    this._isCloning = false;
7516                    this._reobserveMutations();
7517                });
7518            }
7519
7520            _reobserveMutations() {
7521                if (!this.mutationObserver || !this.track) {
7522                    return;
7523                }
7524
7525                // Same as base SnapSlider. Watching `style` re-enters refreshSlides
7526                // when _silentScrollTo toggles scrollBehavior / scrollSnapType.
7527                this.mutationObserver.observe(this.track, {
7528                    childList: true,
7529                    subtree: false
7530                });
7531            }
7532
7533            _bindInfiniteScrollEnd() {
7534                if (!this.track) {
7535                    return;
7536                }
7537
7538                if ('onscrollend' in window) {
7539                    this.track.addEventListener('scrollend', this._onInfiniteScrollEnd);
7540                    return;
7541                }
7542
7543                this._onInfiniteScrollFallback = () => {
7544                    clearTimeout(this._infiniteScrollTimer);
7545                    this._infiniteScrollTimer = setTimeout(() => {
7546                        this._onInfiniteScrollEnd();
7547                    }, SCROLL_FALLBACK_THROTTLE_MS);
7548                };
7549                this.track.addEventListener('scroll', this._onInfiniteScrollFallback);
7550            }
7551
7552            _unbindInfiniteScrollEnd() {
7553                if (!this.track) {
7554                    return;
7555                }
7556
7557                this.track.removeEventListener('scrollend', this._onInfiniteScrollEnd);
7558                if (this._onInfiniteScrollFallback) {
7559                    this.track.removeEventListener('scroll', this._onInfiniteScrollFallback);
7560                }
7561            }
7562
7563            _onInfiniteScrollEnd() {
7564                if (this._isJumping || this._isCloning || this._isSimulateDragging) {
7565                    return;
7566                }
7567
7568                if (!this.useInfinite || !this._cloneCount) {
7569                    this.isNavigating = false;
7570
7571                    return;
7572                }
7573
7574                const allSlides = this._getAllTrackSlides();
7575                const realCount = this.slides.length;
7576
7577                if (!realCount || allSlides.length < realCount + this._cloneCount) {
7578                    this.isNavigating = false;
7579
7580                    return;
7581                }
7582
7583                const currentIndex = this._getClosestSlideIndex(allSlides);
7584
7585                if (currentIndex < this._cloneCount) {
7586                    this._silentScrollTo(allSlides[currentIndex + realCount]);
7587
7588                    return;
7589                }
7590
7591                if (currentIndex >= this._cloneCount + realCount) {
7592                    this._silentScrollTo(allSlides[currentIndex - realCount]);
7593
7594                    return;
7595                }
7596
7597                this.isNavigating = false;
7598            }
7599        };
7600
7601        function alpineAmSnapSlider(Alpine) {
7602            Alpine.directive('am-snap-slider', (el, { modifiers }, { cleanup }) => {
7603                const slider = new window.AmSnapSlider(el, {
7604                    autoPager: modifiers.includes('auto-pager'),
7605                    groupPager: modifiers.includes('group-pager')
7606                });
7607                cleanup(() => {
7608                    slider.destroy();
7609                });
7610            });
7611        }
7612
7613        document.addEventListener('alpine:init', () => {
7614            window.Alpine.plugin(alpineAmSnapSlider);
7615        });
7616    })();
7617</script>
vendor: 1 bytes, line 7617
7617
7618<script>
7619    (() => {
7620        'use strict';
7621
7622        if (typeof window.AmSnapSlider === 'undefined') {
7623            return;
7624        }
7625
7626        // Ignore tiny jitter so a plain click on an item still opens the link.
7627        const DRAG_THRESHOLD_PX = 8;
7628
7629        // Listeners that only exist while an actual drag is in progress.
7630        const DOC_DRAG_EVENTS = ['pointermove', 'pointerup', 'pointercancel'];
7631
7632        const AmSnapSliderBase = window.AmSnapSlider;
7633
7634        window.AmSnapSlider = class AmSnapSlider extends AmSnapSliderBase {
7635            init() {
7636                this.useSimulateTouch = this.el.hasAttribute('data-am-simulate-touch');
7637
7638                super.init();
7639
7640                if (!this.useSimulateTouch || !this.track) {
7641                    return;
7642                }
7643
7644                this._dragTracking = false;
7645                this._dragMoved = false;
7646                this._isSimulateDragging = false;
7647                this._dragStartX = 0;
7648                this._dragScrollLeft = 0;
7649                this._dragPointerId = null;
7650                this._suppressClick = false;
7651
7652                this._onSimulatePointerDown = this._onSimulatePointerDown.bind(this);
7653                this._onSimulatePointerMove = this._onSimulatePointerMove.bind(this);
7654                this._onSimulatePointerUp = this._onSimulatePointerUp.bind(this);
7655                this._onSimulateClickCapture = this._onSimulateClickCapture.bind(this);
7656                this._onSimulateDragStart = this._onSimulateDragStart.bind(this);
7657
7658                this._bindSimulateTouch();
7659            }
7660
7661            destroy() {
7662                if (this.useSimulateTouch) {
7663                    this._unbindSimulateTouch();
7664                }
7665
7666                super.destroy();
7667            }
7668
7669            _bindSimulateTouch() {
7670                if (!this.track) {
7671                    return;
7672                }
7673
7674                this.track.classList.add('am-snap-simulate-touch');
7675                this.track.addEventListener('pointerdown', this._onSimulatePointerDown);
7676                this.track.addEventListener('dragstart', this._onSimulateDragStart, true);
7677                this.track.addEventListener('click', this._onSimulateClickCapture, true);
7678            }
7679
7680            _unbindSimulateTouch() {
7681                if (!this.track) {
7682                    return;
7683                }
7684
7685                this._endSimulateDrag();
7686                this.track.classList.remove('am-snap-simulate-touch', 'is-dragging');
7687                this.track.removeEventListener('pointerdown', this._onSimulatePointerDown);
7688                this.track.removeEventListener('dragstart', this._onSimulateDragStart, true);
7689                this.track.removeEventListener('click', this._onSimulateClickCapture, true);
7690            }
7691
7692            _onSimulateDragStart(event) {
7693                event.preventDefault();
7694            }
7695
7696            _onSimulatePointerDown(event) {
7697                if (event.pointerType !== 'mouse' || event.button !== 0) {
7698                    return;
7699                }
7700
7701                if (this._isJumping || this._isCloning || !this.track) {
7702                    return;
7703                }
7704
7705                this._dragTracking = true;
7706                this._dragMoved = false;
7707                this._suppressClick = false;
7708                this._dragStartX = event.clientX;
7709                this._dragScrollLeft = this.track.scrollLeft;
7710                this._dragPointerId = event.pointerId;
7711
7712                DOC_DRAG_EVENTS.forEach((name) => {
7713                    const handler = name === 'pointermove'
7714                        ? this._onSimulatePointerMove
7715                        : this._onSimulatePointerUp;
7716                    document.addEventListener(name, handler);
7717                });
7718            }
7719
7720            _onSimulatePointerMove(event) {
7721                if (!this._dragTracking || event.pointerId !== this._dragPointerId || !this.track) {
7722                    return;
7723                }
7724
7725                const deltaX = event.clientX - this._dragStartX;
7726
7727                if (!this._dragMoved) {
7728                    if (Math.abs(deltaX) < DRAG_THRESHOLD_PX) {
7729                        return;
7730                    }
7731
7732                    this._dragMoved = true;
7733                    this._isSimulateDragging = true;
7734                    this._suppressClick = true;
7735                    this.track.style.scrollSnapType = 'none';
7736                    this.track.style.scrollBehavior = 'auto';
7737                    this.track.classList.add('is-dragging');
7738
7739                    try {
7740                        this.track.setPointerCapture(event.pointerId);
7741                    } catch (e) {
7742                        // Ignore capture errors on unsupported targets.
7743                    }
7744                }
7745
7746                event.preventDefault();
7747                this.track.scrollLeft = this._dragScrollLeft - deltaX;
7748            }
7749
7750            _onSimulatePointerUp(event) {
7751                if (!this._dragTracking || event.pointerId !== this._dragPointerId) {
7752                    return;
7753                }
7754
7755                this._endSimulateDrag();
7756            }
7757
7758            /**
7759             * Instantly align to the closest slide without CSS smooth scrolling.
7760             * Restoring snap+smooth from a mid-snap offset is what causes desktop jerk.
7761             */
7762            _snapToNearestAfterDrag() {
7763                if (!this.track) {
7764                    return;
7765                }
7766
7767                const slides = typeof this._getAllTrackSlides === 'function'
7768                    ? this._getAllTrackSlides()
7769                    : Array.from(this.track.children);
7770
7771                if (!slides.length) {
7772                    return;
7773                }
7774
7775                if (typeof this._getClosestSlideIndex === 'function'
7776                    && typeof this._getSlideScrollLeft === 'function'
7777                ) {
7778                    const slide = slides[this._getClosestSlideIndex(slides)];
7779
7780                    if (slide) {
7781                        this.track.scrollLeft = this._getSlideScrollLeft(slide);
7782                    }
7783
7784                    return;
7785                }
7786
7787                const trackLeft = this.track.getBoundingClientRect().left;
7788                let closest = null;
7789                let minDist = Infinity;
7790
7791                for (const slide of slides) {
7792                    const dist = Math.abs(slide.getBoundingClientRect().left - trackLeft);
7793                    if (dist < minDist) {
7794                        minDist = dist;
7795                        closest = slide;
7796                    }
7797                }
7798
7799                if (closest) {
7800                    this.track.scrollLeft += closest.getBoundingClientRect().left - trackLeft;
7801                }
7802            }
7803
7804            _endSimulateDrag() {
7805                DOC_DRAG_EVENTS.forEach((name) => {
7806                    const handler = name === 'pointermove'
7807                        ? this._onSimulatePointerMove
7808                        : this._onSimulatePointerUp;
7809                    document.removeEventListener(name, handler);
7810                });
7811
7812                if (!this.track) {
7813                    this._dragTracking = false;
7814                    this._dragMoved = false;
7815                    this._isSimulateDragging = false;
7816                    this._dragPointerId = null;
7817
7818                    return;
7819                }
7820
7821                if (this._dragPointerId !== null) {
7822                    try {
7823                        if (this.track.hasPointerCapture?.(this._dragPointerId)) {
7824                            this.track.releasePointerCapture(this._dragPointerId);
7825                        }
7826                    } catch (e) {
7827                        // Ignore release errors.
7828                    }
7829                }
7830
7831                if (this._dragMoved) {
7832                    // Keep snap off and behavior auto: settle instantly, then re-enable.
7833                    this.track.style.scrollSnapType = 'none';
7834                    this.track.style.scrollBehavior = 'auto';
7835                    this._snapToNearestAfterDrag();
7836
7837                    // Allow infinite correction now that the gesture ended.
7838                    this._isSimulateDragging = false;
7839                    this._onInfiniteScrollEnd?.();
7840
7841                    // Two frames: 1) drop snap-none + dragging class, 2) restore scroll-behavior.
7842                    requestAnimationFrame(() => {
7843                        if (!this.track) {
7844                            return;
7845                        }
7846                        this.track.style.scrollSnapType = '';
7847                        this.track.classList.remove('is-dragging');
7848
7849                        requestAnimationFrame(() => {
7850                            if (this.track) {
7851                                this.track.style.scrollBehavior = '';
7852                            }
7853                        });
7854                    });
7855                } else {
7856                    this._isSimulateDragging = false;
7857                }
7858
7859                this._dragTracking = false;
7860                this._dragMoved = false;
7861                this._dragPointerId = null;
7862
7863                if (this._suppressClick) {
7864                    requestAnimationFrame(() => {
7865                        this._suppressClick = false;
7866                    });
7867                }
7868            }
7869
7870            _onSimulateClickCapture(event) {
7871                if (!this._suppressClick) {
7872                    return;
7873                }
7874
7875                event.preventDefault();
7876                event.stopPropagation();
7877                this._suppressClick = false;
7878            }
7879        };
7880    })();
7881</script>
vendor: 1 bytes, line 7881
7881
7882<script>
7883    (() => {
7884        // src/dialog.js
7885        function dialog_default(Alpine) {
7886            Alpine.directive("htmldialog", fylgjaAlpineDialog);
7887            function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) {
7888            const evaluate = expression.length ? evaluateLater(expression) : () => {};
7889            const lockPageScroll = modifiers.includes("noscroll");
7890            const isModeless = modifiers.includes("modeless");
7891            const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest");
7892            el.style.display = null;
7893            el.style.length === 0 && el.removeAttribute("style");
7894            if (el._x_isShown) {
7895                open();
7896            }
7897            const closeBySupported = (() => {
7898                return "closedBy" in HTMLDialogElement.prototype;
7899            })();
7900            function scrollLock(use = true) {
7901                document.body.style.overflow = use ? "hidden" : "";
7902            }
7903            function dialogSubmit(event) {
7904                if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") {
7905                event.preventDefault();
7906                evaluate();
7907                }
7908            }
7909            function escapeDialog(event) {
7910                if (event.key !== "Escape") return;
7911                event.preventDefault();
7912                if (closeBy === "none") return;
7913                evaluate();
7914            }
7915            function handleCloseByEvent(event) {
7916                if (event.target !== el) return;
7917                const rect = el.getBoundingClientRect();
7918                const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width;
7919                if (!isInDialog) {
7920                if (closeBy === "any") {
7921                    if (closeBySupported) {
7922                    event.preventDefault();
7923                    }
7924                    evaluate();
7925                }
7926                }
7927            }
7928            function handleCloseEvent() {
7929                evaluate();
7930            }
7931            function open() {
7932                if (el.hasAttribute("open")) return;
7933                isModeless ? el.show() : el.showModal();
7934                scrollLock(lockPageScroll);
7935            }
7936            function close() {
7937                if (!el.hasAttribute("open")) return;
7938                el.close();
7939                scrollLock(false);
7940            }
7941            el._x_doShow = () => open();
7942            el._x_doHide = () => close();
7943            el.addEventListener("keydown", escapeDialog);
7944            el.addEventListener("submit", dialogSubmit);
7945            el.addEventListener("click", handleCloseByEvent);
7946            el.addEventListener("cancel", handleCloseEvent);
7947            cleanup(() => {
7948                el.removeEventListener("keydown", escapeDialog);
7949                el.removeEventListener("submit", dialogSubmit);
7950                el.removeEventListener("click", handleCloseByEvent);
7951                el.removeEventListener("cancel", handleCloseEvent);
7952                scrollLock(false);
7953            });
7954            }
7955        }
7956        function modifierValue(modifiers, key, fallback) {
7957            if (modifiers.indexOf(key) === -1) return fallback;
7958            const rawValue = modifiers[modifiers.indexOf(key) + 1];
7959            if (!rawValue) return fallback;
7960            if (key === "closeby") {
7961            const allowedValues = ["auto", "none", "closerequest", "any"];
7962            const options = allowedValues.join(", ");
7963            if (!allowedValues.includes(rawValue)) {
7964                console.warn(
7965                `"${rawValue}" is not one of the allowed values for closeby: ${options}`
7966                );
7967                return fallback;
7968            }
7969            }
7970            return rawValue;
7971        }
7972
7973        // src/cdn.js
7974        document.addEventListener("alpine:init", () => {
7975            window.Alpine.plugin(dialog_default);
7976        });
7977    })();
7978    //# sourceURL=alpine-htmldialog.js
7979</script>
vendor: 1 bytes, line 7979
7979
vendor: 2,386 bytes, lines 7980-8040
7980<script>
7981    (() => {
7982        function src_default(Alpine) {
7983            Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {
7984                let evaluate = evaluateLater(expression);
7985                let options = {
7986                    rootMargin: getRootMargin(modifiers),
7987                    threshold: getThreshold(modifiers)
7988                };
7989                let observer = new IntersectionObserver((entries) => {
7990                    entries.forEach((entry) => {
7991                        if (entry.isIntersecting === (value === "leave"))
7992                            return;
7993                        evaluate();
7994                        modifiers.includes("once") && observer.disconnect();
7995                    });
7996                }, options);
7997                observer.observe(el);
7998                cleanup(() => {
7999                    observer.disconnect();
8000                });
8001            }));
8002        }
8003        function getThreshold(modifiers) {
8004            if (modifiers.includes("full"))
8005                return 0.99;
8006            if (modifiers.includes("half"))
8007                return 0.5;
8008            if (!modifiers.includes("threshold"))
8009                return 0;
8010            let threshold = modifiers[modifiers.indexOf("threshold") + 1];
8011            if (threshold === "100")
8012                return 1;
8013            if (threshold === "0")
8014                return 0;
8015            return Number(`.${threshold}`);
8016        }
8017        function getLengthValue(rawValue) {
8018            let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/);
8019            return match ? match[1] + (match[2] || "px") : void 0;
8020        }
8021        function getRootMargin(modifiers) {
8022            const key = "margin";
8023            const fallback = "0px 0px 0px 0px";
8024            const index = modifiers.indexOf(key);
8025            if (index === -1)
8026                return fallback;
8027            let values = [];
8028            for (let i = 1; i < 5; i++) {
8029                values.push(getLengthValue(modifiers[index + i] || ""));
8030            }
8031            values = values.filter((v) => v !== void 0);
8032            return values.length ? values.join(" ").trim() : fallback;
8033        }
8034
8035        document.addEventListener("alpine:init", () => {
8036            window.Alpine.plugin(src_default);
8037        });
8038    })();
8039    //# sourceURL=alpine-intersect.js
8040</script>
8040
8041
8042<script>
8043    (() => {
8044        const hasAlpine = new Promise(resolve => {
8045            window.addEventListener('alpine:initialized', resolve, {once: true, passive: true});
8046        });
8047
8048        const hasInteract = new Promise(resolve => {
8049            (events => {
8050                const onInteract = () => {
8051                    resolve();
8052                    events.forEach(type => window.removeEventListener(type, onInteract));
8053                }
8054                events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true}))
8055            })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown'])
8056        });
8057
8058        const onIntersect = (el) => {
8059            return new Promise(resolve => {
8060                const observer = new IntersectionObserver(entries => {
8061                    for (const entry of entries) {
8062                        if (entry.isIntersecting) {
8063                            observer.disconnect()
8064                            resolve();
8065                        }
8066                    }
8067                }, {});
8068                observer.observe(el);
8069            });
8070        }
8071
8072        function runComponent(el) {
8073            hasAlpine.then(() => {
8074                el.removeAttribute('x-ignore');
8075                queueMicrotask(() => Alpine.initTree(el));
8076            });
8077        }
8078
8079        function initDeferredComponents() {
8080            document.querySelectorAll('[x-data][x-defer]').forEach(el => {
8081                el.setAttribute('x-ignore', '');
8082                const deferUntil = (el.getAttribute('x-defer') || '').trim();
8083                switch (deferUntil) {
8084                    case 'interact':
8085                        hasInteract.then(() => runComponent(el));
8086                        break;
8087                    case 'intersect':
8088                        onIntersect(el).then(() => runComponent(el))
8089                        break;
8090                    case 'idle':
8091                        window.requestIdleCallback
8092                            ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000})
8093                            : setTimeout(() => runComponent(el), 4000);
8094                        break;
8095                    case 'eager':
8096                        runComponent(el);
8097                        break;
8098                    default:
8099                        if (deferUntil.startsWith('event:') && deferUntil.length > 6) {
8100                            window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true});
8101                        }
8102                }
8103            });
8104        }
8105
8106        window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true});
8107    })();
8108    //# sourceURL=alpine-defer.js
8109</script>
8109
8110
8111
8112<script type="module"
8113        src="https://www.jardindupicvert.com/static/version1790243132/frontend/PicVert/hyva/fr_FR/Hyva_Theme/js/alpine3.min.js"
8114        defer
8115        crossorigin
8116></script>
vendor: 1 bytes, line 8116
8116
8117<script>
8118    function dispatchMessages(messages, hideAfter) {
8119        const messagesEvent = new CustomEvent("messages-loaded", {
8120            detail: {
8121                messages: messages,
8122                hideAfter: hideAfter
8123            }
8124        });
8125        window.dispatchEvent(messagesEvent);
8126    }
8127
8128        if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
8129        console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
8130    }
8131
8132    (function( hyva, undefined ) {
8133
8134        hyva.initFormKey = () => {
8135            if (typeof hyva.getFormKey !== 'function') return;
8136
8137            const formKey = hyva.getFormKey();
8138            if (!formKey) return;
8139
8140            document.querySelectorAll('input[name="form_key"]').forEach((input) => {
8141                input.value = formKey;
8142            });
8143        }
8144
8145        hyva.initMessages = () => {
8146            try {
8147                const messages = hyva.getCookie('mage-messages');
8148                window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : [];
8149
8150                dispatchMessages(window.mageMessages);
8151
8152                                // empty `mage-messages` cookie
8153                const skipSetDomain = true;
8154                hyva.setCookie('mage-messages','', -1, skipSetDomain);
8155
8156            } catch (error) {
8157                console.warn('Error parsing Cookie Messages:', error);
8158            }
8159        }
8160
8161        window.addEventListener('DOMContentLoaded', hyva.initFormKey);
8162
8163        window.addEventListener('pageshow', (event) => {
8164            if (event.persisted) {
8165                hyva.initFormKey();
8166            }
8167        });
8168
8169        hyva.alpineInitialized(hyva.initMessages)
8170    }( window.hyva = window.hyva || {} ));
8171    //# sourceURL=hyva-cookies.js
8172</script>
vendor: 1 bytes, line 8172
8172
8173<script>
8174    (() => {
8175        const private_content_key = 'mage-cache-storage';
8176        const private_content_expire_key = 'mage-cache-timeout';
8177        const private_content_version_key = 'private_content_version';
8178        const section_data_ids_key = 'section_data_ids';
8179        const mage_cache_session_id_key = 'mage-cache-sessid';
8180        const last_visited_store_key = 'last_visited_store';
8181
8182        const ttl = 86400;
8183
8184                if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) {
8185            console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script");
8186        }
8187
8188        function loadSectionData () {
8189            const browserStorage = hyva.getBrowserStorage();
8190            if (!browserStorage) {
8191                typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(
8192                    [{
8193                        type: "warning",
8194                        text: "Please enable LocalStorage in your browser."
8195                    }]
8196                );
8197                return;
8198            }
8199            try {
8200                let isInvalid = false;
8201
8202                                if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) {
8203                    isInvalid = true;
8204                }
8205                hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false);
8206
8207                                if (!hyva.getCookie(mage_cache_session_id_key)) {
8208                    isInvalid = true;
8209                    browserStorage.removeItem(private_content_key);
8210                    const skipSetDomain = true;
8211                    const days = false;
8212                    hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain)
8213                }
8214
8215                const cookieVersion = hyva.getCookie(private_content_version_key);
8216                const storageVersion = browserStorage.getItem(private_content_version_key);
8217
8218                if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) {
8219                    isInvalid = true;
8220                }
8221
8222                const privateContentExpires = browserStorage.getItem(private_content_expire_key);
8223                if (privateContentExpires && new Date(privateContentExpires) < new Date()) {
8224                    browserStorage.removeItem(private_content_key);
8225                }
8226
8227                if (isInvalid && cookieVersion) {
8228                    fetchPrivateContent([]);
8229                } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) {
8230                    const privateContent = JSON.parse(browserStorage.getItem(private_content_key));
8231                    if (
8232                        privateContent &&
8233                        privateContentExpires &&
8234                        privateContent.cart &&
8235                        privateContent.customer
8236                    ) {
8237                        dispatchPrivateContent(privateContent);
8238                    } else {
8239                        fetchPrivateContent([]);
8240                    }
8241                } else {
8242                    if (document.getElementById('default-section-data')) {
8243                        const privateContent = JSON.parse(document.getElementById('default-section-data').textContent.trim());
8244                        dispatchPrivateContent(privateContent);
8245                    } else {
8246                        dispatchPrivateContent({});
8247                    }
8248                }
8249
8250            } catch (error) {
8251                console.warn('Error retrieving Private Content:', error);
8252            }
8253        }
8254
8255        hyva.alpineInitialized(loadSectionData)
8256        window.addEventListener('reload-customer-section-data', loadSectionData);
8257
8258                window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data);
8259
8260        function dispatchPrivateContent(data) {
8261
8262            const privateContentEvent = new CustomEvent("private-content-loaded", {
8263                detail: {
8264                    data: window.processSectionDataBeforeDispatch(data)
8265                }
8266            });
8267            window.dispatchEvent(privateContentEvent);
8268        }
8269
8270                function fetchPrivateContent(sections) {
8271            fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, {
8272                method: 'GET',
8273                headers: {
8274                    'Content-Type': 'application/json',
8275                    'X-Requested-With': 'XMLHttpRequest'
8276                }
8277            })
8278                .then(response => response.ok && response.json())
8279                .then(
8280                    data => {
8281                        if (data) {
8282                            try {
8283                                const browserStorage = hyva.getBrowserStorage();
8284
8285                                // merge new data preserving non-invalidated sections
8286                                const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {};
8287
8288                                                                if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) {
8289                                    delete oldSectionData['checkout-data'];
8290                                }
8291                                const newSectionData = Object.assign(oldSectionData, data);
8292
8293                                dispatchPrivateContent(newSectionData);
8294
8295                                // don't persist messages, they've been dispatched already
8296                                if (newSectionData.messages && newSectionData.messages.messages ) {
8297                                    newSectionData.messages.messages = [];
8298                                }
8299
8300                                browserStorage.setItem(private_content_key, JSON.stringify(newSectionData));
8301
8302                                const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString();
8303                                browserStorage.setItem(private_content_expire_key, expiresAt);
8304
8305                                const newCookieVersion = hyva.getCookie(private_content_version_key);
8306                                browserStorage.setItem(private_content_version_key, newCookieVersion);
8307
8308                                // We don't need the section_data_ids in Hyvä, but we store them for compatibility
8309                                // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout
8310                                hyva.setCookie(
8311                                    section_data_ids_key,
8312                                    JSON.stringify(
8313                                        Object.keys(data).reduce((sectionDataIds, sectionKey) => {
8314                                            sectionDataIds[sectionKey] = data[sectionKey]['data_id'];
8315                                            return sectionDataIds;
8316                                        }, {})
8317                                    ),
8318                                    false,
8319                                    true
8320                                );
8321                            } catch (error) {
8322                                console.warn("Couldn't store privateContent", error);
8323                            }
8324                        }
8325                    }
8326                )
8327                .catch(error => {
8328                    console.warn("Couldn't fetch privateContent", error);
8329                });
8330        }
8331    })();
8332    //# sourceURL=hyva-private-content.js
8333</script>
vendor: 1 bytes, line 8333
8333
8334<script>
8335    (() => {
8336        document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc()));
8337    })()
8338</script>
vendor: 1 bytes, line 8338
8338
8339<script>
8340    (events => {
8341        const dispatchUserInteractionEvent = () => {
8342            events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent))
8343            window.dispatchEvent(new Event('init-external-scripts'))
8344        };
8345        events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true}))
8346    })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']);
8347    //# sourceURL=hyva-init-external-scripts.js
8348</script>
8348
8349<!--OX7wOp4TiO5hLyFeO0pUjRq0pBPeKzri-->
8349<script>
8350    function initConfigurableOptions(productId, optionConfig) {
8351
8352        function findPathParam(key) {
8353                        const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL;
8354            const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/');
8355            const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3);
8356            for (let i = 0; i < pathParts.length; i += 2) {
8357                if (pathParts[i] === key && pathParts.length > i) {
8358                    return pathParts[i + 1];
8359                }
8360            }
8361        }
8362
8363        return {
8364            optionConfig,
8365            productId,
8366            itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'),
8367            allowedAttributeOptions: [],
8368            selectedValues: [],
8369            selectedOptions: {},
8370            init() {
8371                this.baseInit();
8372            },
8373            baseInit() {
8374                this.buildLookupMap();
8375                this.findAllowedAttributeOptions();
8376                this.$nextTick(() => {
8377                    if (typeof this.optionConfig.defaultValues === 'object') {
8378                        for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) {
8379                            this.changeOption(attributeId, value + '');
8380                        }
8381                    }
8382                                        this.applyCheckedState();
8383                });
8384            },
8385            applyCheckedState() {
8386                this.$root.querySelectorAll('input[data-attribute-id], select[data-attribute-id]').forEach(el => {
8387                    const val = this.selectedValues[el.dataset.attributeId];
8388                    if (!val) return;
8389                    if (el.tagName === 'SELECT') {
8390                        el.value = val;
8391                        this.selectedOptions[el.dataset.attributeId] = el.options[el.selectedIndex]?.text || '';
8392                    } else if (el.value === val && this.optionIsActive(el.dataset.attributeId, el.value)) {
8393                        el.checked = true;
8394                        this.selectedOptions[el.dataset.attributeId] = el.dataset.optionLabel || '';
8395                    }
8396                });
8397            },
8398            productIndex: 0,
8399            productIndexForPrice: 0,
8400            productIndexesMap: null,
8401            productIndexesKeys: null,
8402            attributeCount: 0,
8403            optionIsActive(attributeId, optionId) {
8404                                return !!this.getAllowedAttributeOptions(attributeId).find(
8405                    option => option.id === optionId
8406                )
8407            },
8408            optionIsDisabled() {
8409                const attributeId = this.$el.dataset.attributeId;
8410                if (!attributeId) {
8411                    throw new Error('data-attribute-id missing, in item template');
8412                }
8413                return !this.optionIsActive(attributeId, this.$el.value);
8414            },
8415            findSimpleIndex() {
8416                                this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues);
8417                this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues);
8418            },
8419            calculateSimpleIndexForPartialSelection(selectedValues) {
8420                if (selectedValues.length === 0) return 0;
8421                return this.findProductIdsForPartialSelection(selectedValues)[0];
8422            },
8423            buildLookupMap() {
8424                                this.productIndexesMap = new Map();
8425                this.attributeCount = Object.keys(this.optionConfig.attributes).length;
8426                for (const id in this.optionConfig.index) {
8427                    const options = this.optionConfig.index[id];
8428                    if (! this.productIndexesKeys) {
8429                        this.productIndexesKeys = Object.keys(options).sort();
8430                    }
8431                    const key = JSON.stringify(options, this.productIndexesKeys);
8432                    this.productIndexesMap.set(key, id);
8433                }
8434            },
8435            findAllowedAttributeOptions() {
8436                                this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues);
8437            },
8438            calculateAllowedAttributeOptions(selectedValues) {
8439                const allAttributes = this.optionConfig.attributes;
8440                const allAttributesSorted = Object.values(allAttributes).sort((a,b) => {
8441                    return a.position - b.position
8442                });
8443
8444                const newAllowedAttributeOptions = [];
8445
8446                allAttributesSorted.forEach(attribute => {
8447                    const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id));
8448                    const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr);
8449                    newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => {
8450                        return !!option.products.find(product => {
8451                            return availableIndexes.includes(product);
8452                        })
8453                    });
8454                });
8455                return newAllowedAttributeOptions;
8456            },
8457            calculateAvailableProductIndexes(selectedOptions) {
8458                if (Object.keys(selectedOptions).length === 0) {
8459                                        if (Object.values(this.optionConfig.salable || {}).length) {
8460                                                return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i)
8461                    }
8462                                        return Object.keys(this.optionConfig.index);
8463                }
8464
8465                                const selectedIds = Object.keys(selectedOptions);
8466                if (Object.values(this.optionConfig.salable || {}).length) {
8467                                        const selectedOptionIndexes = selectedIds.map(attrId => {
8468                        const optionValue = selectedOptions[attrId];
8469                        return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || []
8470                    })
8471                                        return selectedOptionIndexes.reduce((acc, optionIndexes) => {
8472                        return acc.filter(index => optionIndexes.includes(index));
8473                    });
8474                } else {
8475                                        const productIndexes = this.optionConfig.index;
8476                    return Object.keys(productIndexes).filter(index => {
8477                                                for (const attrId of selectedIds) {
8478                            if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false
8479                        }
8480                        return true
8481                    });
8482                }
8483            },
8484            findAttributeByOptionId(optionId) {
8485                for (const attributeId in this.optionConfig.attributes) {
8486                    const attributeOptions = this.optionConfig.attributes[attributeId].options || [];
8487                    if (attributeOptions.find(option => option.id === optionId)) {
8488                        return attributeId;
8489                    }
8490                }
8491            },
8492            getAllowedAttributeOptions(attributeId) {
8493                return this.allowedAttributeOptions[attributeId] || []
8494            },
8495            getAllAttributeOptions(attributeId) {
8496                return (
8497                    this.optionConfig.attributes[attributeId] &&
8498                    this.optionConfig.attributes[attributeId].options
8499                ) || []
8500            },
8501            getProductIdsForOption(option) {
8502                const attributeId = this.findAttributeByOptionId(option.id);
8503                const allOptions = this.optionConfig.attributes[attributeId];
8504                const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id);
8505                return opt && opt.products
8506                    ? opt.products
8507                    : [];
8508            },
8509            findProductIdsForPartialSelection(optionSelection) {
8510                const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => {
8511                    const newCandidates = this.getProductIdsForOption({id: optionId});
8512                    return candidates === null
8513                        ? newCandidates
8514                        : candidates.filter(productId => newCandidates.includes(productId));
8515                }, null);
8516                return candidateProducts || [];
8517            },
8518            findCheapestProductForPartialSelection(optionSelection) {
8519                const candidateProducts = this.findProductIdsForPartialSelection(optionSelection);
8520                return candidateProducts.reduce((cheapest, simpleIdx) => {
8521                    // in the first iteration we start with simpleIdx as the currently cheapest product
8522                    if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx;
8523                    const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount;
8524                    return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount
8525                        ? simpleIdx
8526                        : cheapest;
8527                }, 0)
8528            },
8529            removeAttrFromSelection(selectedValues, attributeId) {
8530                                attributeId = parseInt(attributeId);
8531                return selectedValues.reduce((newSelection, val, attr) => {
8532                    if (attr !== attributeId) {
8533                        newSelection[attr] = val;
8534                    }
8535                    return newSelection;
8536                }, []);
8537            },
8538            reflectOption(event) {
8539                const attributeId = event.target.dataset.attributeId;
8540                const label = event.target.dataset.optionLabel
8541                    || event.target.options?.[event.target.selectedIndex]?.text
8542                    || '';
8543                this.selectedOptions[attributeId] = label;
8544                this.changeOption(attributeId, event.target.value);
8545            },
8546            baseChangeOption(attributeId, value) {
8547                if (value === '') {
8548                    this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId)
8549                } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) {
8550                                        this.selectedValues[attributeId] = value;
8551                }
8552                this.findSimpleIndex();
8553                this.findAllowedAttributeOptions();
8554                this.updatePrices();
8555                this.updateGallery();
8556            },
8557            changeOption(attributeId, value) {
8558                this.baseChangeOption(attributeId, value);
8559
8560                const candidates = this.findProductIdsForPartialSelection(this.selectedValues);
8561
8562                                window.dispatchEvent(
8563                    new CustomEvent(
8564                        'configurable-selection-changed',
8565                        {
8566                            detail: {
8567                                productId: this.productId,
8568                                optionId: attributeId,
8569                                value: value,
8570                                productIndex: this.productIndex,
8571                                selectedValues: this.selectedValues,
8572                                candidates: candidates,
8573                                skuCandidates: Object.values(candidates).map(id => this.optionConfig.sku?.[id] ?? null).filter(Boolean),
8574                            }
8575                        }
8576                    )
8577                );
8578            },
8579            calculateIsMinimalPrice() {
8580                return ! this.isFullSelection(this.selectedValues);
8581            },
8582            isFullSelection(selectedValues) {
8583                return Object.keys(selectedValues).length === this.attributeCount;
8584            },
8585            updatePrices() {
8586                const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices;
8587                window.dispatchEvent(
8588                    new CustomEvent(
8589                        "update-prices-" + this.productId,
8590                        {
8591                            detail: Object.assign(
8592                                value,
8593                                { isMinimalPrice: this.calculateIsMinimalPrice() }
8594                            )
8595                        }
8596                    )
8597                );
8598            },
8599            updateGallery () {
8600                if (this.productIndex) {
8601                    const images = this.optionConfig.images[this.productIndex];
8602                    images && window.dispatchEvent(new CustomEvent(
8603                        "update-gallery",
8604                        { detail: this.sortImagesByPosition(images) }
8605                    ));
8606                } else {
8607                    window.dispatchEvent(new Event("reset-gallery"));
8608                }
8609            },
8610            sortImagesByPosition(images) {
8611                return images.sort((x, y) => {
8612                    return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1)
8613                });
8614            },
8615            preselectQuerystringItems() {
8616                // pre-select option like ?size=167
8617                const urlQueryParams = new URLSearchParams(window.location.search.replace('?',''));
8618                this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code));
8619            },
8620            preselectLocationHashItems() {
8621                // pre-select option like #144=167
8622                const urlHashParams = new URLSearchParams(window.location.hash.replace('#',''));
8623                this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id));
8624            },
8625            preselectItemsBasedOnLocation(getLocationValue) {
8626                Object.values(this.optionConfig.attributes).map(attribute => {
8627                    const v = getLocationValue(attribute);
8628                    v && this.changeOption(attribute.id, v)
8629                });
8630            },
8631            findProductForOptionPrice(attributeId, value) {
8632                const options = this.optionConfig.attributes[attributeId]?.options || [];
8633                const option = options.find(o => o.id === value);
8634                if (!option?.products?.length) return null;
8635                return option.products.reduce((cheapest, productId) => {
8636                    if (!cheapest) return productId;
8637                    const cheapestPrice = this.optionConfig.optionPrices[cheapest]?.finalPrice?.amount ?? Infinity;
8638                    const thisPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount ?? Infinity;
8639                    return thisPrice < cheapestPrice ? productId : cheapest;
8640                }, null);
8641            },
8642            getOptionLabel() {
8643                const value = this.$el.value;
8644                const attributeId = this.$el.dataset.attributeId;
8645                const label = this.$el.dataset.optionLabel || '';
8646                if (!value || !attributeId) return label;
8647
8648                const productId = this.findProductForOptionPrice(attributeId, value);
8649                if (!productId) return label;
8650
8651                const optionPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount;
8652                const basePrice = this.optionConfig.prices?.finalPrice?.amount;
8653                if (optionPrice == null || basePrice == null) return label;
8654
8655                const adjustment = optionPrice - basePrice;
8656                if (Math.abs(adjustment) < 0.001) return label;
8657
8658                const formatted = hyva.formatPrice(Math.abs(adjustment));
8659                return `${label} (${adjustment > 0 ? '+' : '-'}${formatted})`;
8660            },
8661        }
8662    }
8663</script>
vendor: 1 bytes, line 8663
8663
8664<script>
8665    function initSwatchOptions() {
8666        return {
8667            activeTooltipItem: false,
8668            tooltipPositionElement: false,
8669            isTooltipVisible() {
8670                return !!this.activeTooltipItem;
8671            },
8672            isCurrentTooltipVisual() {
8673                return this.activeTooltipItem && ['color', 'image'].includes(this.activeTooltipItem.type);
8674            },
8675            getTooltipImageStyle() {
8676                const item = this.activeTooltipItem;
8677                if (item?.type === 'color') return {
8678                    backgroundColor: item.preview,
8679                    width: `${item.width ?? 90}px`,
8680                    height: `${item.height ?? 90}px`
8681                };
8682                if (item?.type === 'image') return {
8683                    backgroundImage: `url(${item.preview})`,
8684                    backgroundSize: 'cover',
8685                    backgroundPosition: 'center',
8686                    backgroundRepeat: 'no-repeat',
8687                    width: `${item.width ?? 90}px`,
8688                    height: `${item.height ?? 90}px`
8689                };
8690                return null;
8691            },
8692            getTooltipPosition() {
8693                if (!this.tooltipPositionElement) return null;
8694                const el = this.tooltipPositionElement;
8695                const elRect = el.getBoundingClientRect();
8696                const left = elRect.left + elRect.width / 2;
8697
8698                return {
8699                    bottom: `${window.innerHeight - elRect.top}px`,
8700                    left: `${left}px`,
8701                    translate: '-50% 0'
8702                };
8703            },
8704            getTooltipLabel() {
8705                return this.activeTooltipItem ? this.activeTooltipItem.label : '';
8706            },
8707            showTooltip(event) {
8708                if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;
8709                const input = event.currentTarget.querySelector('input');
8710                this.activeTooltipItem = JSON.parse(input.dataset.tooltip);
8711                this.tooltipPositionElement = event.currentTarget;
8712            },
8713            hideTooltip() {
8714                this.activeTooltipItem = false;
8715            },
8716        }
8717    }
8718</script>
vendor: 1 bytes, line 8718
8718
8719<script>
8720        function amastyRewardsCatalog() {
8721            return {
8722                productId: this.$el.dataset.productId,
8723                formSelector: 'product_addtocart_form',
8724                refreshUrl: this.$el.dataset.refreshUrl,
8725                loader: false,
8726                isFetching: false,
8727                abortFetchController: false,
8728                highlight: {
8729                    caption_color: '',
8730                    caption_text: '',
8731                    visible: false
8732                },
8733
8734                init() {
8735                    this.formObserver();
8736                    document.addEventListener(`update-qty-${this.productId}`, () => {
8737                        this.updateData();
8738                    });
8739                    this.$nextTick(() => this.updateData());
8740                },
8741
8742                hideBlock() {
8743                    this.highlight.visible = false;
8744                    this.loader = true;
8745                },
8746
8747                dispatchStatus(type, message) {
8748                    window.dispatchMessages([{
8749                        type: type,
8750                        text: message
8751                    }], 5000);
8752                },
8753
8754                formObserver() {
8755                    const product = document.querySelector(`input[name="product"][value="${this.productId}"]`);
8756
8757                    if (product) {
8758                        const productForm = product.form;
8759                        if (productForm) {
8760                            productForm.addEventListener('change', () => {
8761                                this.updateData();
8762                            });
8763                        }
8764                    }
8765                },
8766
8767                updateData() {
8768                    if (!this.refreshUrl || this.isFetching) return false;
8769                    this.hideBlock();
8770
8771                    if (this.abortFetchController) {
8772                        this.abortFetchController.abort();
8773                    }
8774                    this.abortFetchController = new AbortController();
8775
8776                    const product = document.querySelector(`input[name='product'][value='${this.productId}']`);
8777                    if (!product) return false;
8778
8779                    const form = product.form;
8780                    const formData = new FormData(form);
8781                    const formParams = new URLSearchParams(formData).toString();
8782                    const formJson = JSON.stringify({
8783                        productId: this.productId,
8784                        attributes: formParams
8785                    });
8786
8787                    const requestOptions = {
8788                        method: 'POST',
8789                        body: formJson,
8790                        headers: {
8791                            'Content-Type': 'application/json',
8792                            'x-requested-with': 'XMLHttpRequest',
8793                        },
8794                        signal: this.abortFetchController.signal
8795                    };
8796
8797                    this.isFetching = true;
8798                    fetch(this.refreshUrl, requestOptions).then(response => {
8799                        if (!response.ok) {
8800                            return Promise.reject(`${response.status} ${response.statusText}`);
8801                        }
8802                        return response.json();
8803                    }).then(data => {
8804                        this.highlight.visible = data.visible;
8805                        this.highlight.caption_text = data.caption_text;
8806                        this.highlight.caption_color = data.caption_color;
8807                    }).catch(error => {
8808                        if (error.name !== 'AbortError'
8809                                && typeof error === 'string'
8810                                && error.match(/'401'/g) !== null
8811                            ) {
8812                            this.dispatchStatus('error', error);
8813                        }
8814                    }).finally(() => {
8815                        this.loader = false;
8816                        this.abortFetchController = false;
8817                        this.isFetching = false;
8818                    });
8819                },
8820
8821                highlightVisible() {
8822                    return this.highlight.visible && !this.loader;
8823                },
8824
8825                highlightStyle() {
8826                    return `color: ${this.highlight.caption_color}`;
8827                },
8828            }
8829        }
8830
8831        window.addEventListener(
8832            'alpine:init',
8833            () => Alpine.data('amastyRewardsCatalog', amastyRewardsCatalog),
8834            { once: true }
8835        );
8836 </script>
vendor: 1 bytes, line 8836
8836
8837<script>
8838    'use strict';
8839
8840    const grecaptchaV2LoadCallbacks = [];
8841
8842    function executeRecaptchaLoadCallbacks () {
8843        while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) {
8844            const callback = grecaptchaV2LoadCallbacks.pop();
8845            typeof callback === 'string' ? window[callback]() : callback();
8846        }
8847    }
8848
8849    (function() {
8850        const loadRecaptchaScript = (event) => {
8851
8852            if (window.grecaptcha || !event.target.form) {
8853                return;
8854            }
8855
8856            const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks';
8857            const siteKey = '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV';
8858            const script = document.createElement('script');
8859            script.type = 'text/javascript';
8860            script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`;
8861            script.async = true;
8862            document.head.appendChild(script);
8863
8864            script.addEventListener('load', () => {
8865                Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled'));
8866            });
8867        }
8868
8869        window.forceLoadRecaptchaScript = (form) => {
8870            loadRecaptchaScript({target: {form: form || 'dummy'}});
8871            executeRecaptchaLoadCallbacks();
8872        };
8873
8874        document.body.addEventListener('input', loadRecaptchaScript, { once: true });
8875        document.body.addEventListener('focus', loadRecaptchaScript, { once: true });
8876
8877    }());
8878
8879</script>
vendor: 1 bytes, line 8879
8879
8880<script>
8881    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');
8882
8883    document.addEventListener('alpine:init', () => {
8884        Alpine.store('customer', {
8885            isInit: false,
8886            isLoggedIn: false,
8887            customerId: 0,
8888            fullName: '',
8889            visitorCountry: '',
8890            isInferredCountry: true,
8891            customerId: 0,
8892
8893            init() {
8894                window.addEventListener(
8895                    "private-content-loaded",
8896                    (event) => {
8897                        const privateData = event?.detail?.data;
8898                        this.isInit = true;
8899                        this.customerId = privateData?.customer?.customerId || ''
8900                        this.fullName = privateData?.customer?.fullname || '';
8901                        this.isLoggedIn = !!privateData?.customer?.fullname;
8902                        this.customerId = privateData?.customer?.customerId || 0;
8903                        this.visitorCountry = (hyva.getCookie('visitor_country') || this.getGlopalHtmlLang() || 'FR').toLowerCase();
8904                        this.isInferredCountry = !hyva.getCookie('visitor_country');
8905                        this.setStoredVisitorCountry(this.visitorCountry, false);
8906                        Alpine.nextTick(() => {window.dispatchEvent(
8907                            new CustomEvent("customer-alpine-init")
8908                        )});
8909                    }
8910                );
8911            },
8912
8913            setStoredVisitorCountry(country, reloadPage = true) {
8914                if (ALLOWED_SHIPPING_COUNTRIES?.[country.toLowerCase()]) {
8915                    hyva.setCookie('visitor_country', country.toUpperCase(), 10, true);
8916                    this.visitorCountry = country;
8917                    if (reloadPage && false) {
8918                        document.querySelector('body').classList.add('u-loader');
8919                        const formData = new FormData();
8920                        formData.append('form_key', hyva.getFormKey());
8921                        fetch('https://www.jardindupicvert.com/pdfcheckout/cart/collectTotals/', {
8922                            method: 'POST',
8923                            headers: {
8924                                "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
8925                                'X-Requested-With': 'XMLHttpRequest',
8926                                'pragma': 'no-cache',
8927                                'cache-control': 'no-cache'
8928                            },
8929                            mode: 'cors',
8930                            credentials: 'include',
8931                            body: formData
8932                        }).then(response => {
8933                            window.location.reload();
8934                        })
8935                    }
8936                }
8937                Alpine.nextTick(() => {window.dispatchEvent(
8938                    new CustomEvent(
8939                        "visitor_country_change",
8940                        { detail: country }
8941                    )
8942                )});
8943                return !!ALLOWED_SHIPPING_COUNTRIES?.[country];
8944            },
8945
8946            get visitorCountryName() {
8947                return ALLOWED_SHIPPING_COUNTRIES?.[this.visitorCountry] || '';
8948            },
8949
8950            getGlopalHtmlLang() {
8951                return document.documentElement.contains(document.querySelector('glopal')) ? 
8952                    document.documentElement.lang.substr(3, 2).toUpperCase() : '';
8953
8954            }
8955        });
8956    })
8957</script>
vendor: 1 bytes, line 8957
8957
8958<script>
8959document.addEventListener('alpine:init', () => {
8960    Alpine.store('minicart', {
8961        cart: {
8962            summary_count: 0,
8963            subtotal: '0',
8964            items: [],
8965            isMergedCart: false
8966        },
8967        init() {
8968            window.addEventListener(
8969                "private-content-loaded",
8970                (event) => {
8971                    event.detail?.data?.cart?.items && (this.cart = event.detail.data.cart);
8972                    this.isMergedCart = this.cart.items.some(i => i?.merged_qty > 0);
8973                }
8974            );
8975        }
8976    });
8977})
8978</script>
vendor: 1 bytes, line 8978
8978
8979<script>
8980    (function () {
8981        const modals = [];
8982                let lastHide = 0;
8983
8984                function resolveElement($refs, value) {
8985            if (!value) return null;
8986                        if (value instanceof Element) return value;
8987                        if (typeof value === 'string') {
8988                try {
8989                    return ($refs && $refs[value]) || document.querySelector(value) || null;
8990                } catch (e) {}
8991            }
8992            return null;
8993        }
8994
8995                function determineTrigger($refs, dialog, trigger) {
8996                        if (!trigger && dialog?.target instanceof HTMLElement) {
8997                return dialog.target;
8998            }
8999
9000                        if (typeof dialog === 'string' && trigger?.target instanceof HTMLElement) {
9001                return trigger.target;
9002            }
9003
9004            return resolveElement($refs, trigger);
9005        }
9006
9007                function setFocusFirstElement(dialogElement) {
9008            if (!dialogElement) return;
9009
9010            window.setTimeout(() => {
9011                const candidates = dialogElement.querySelectorAll('[x-focus-first]');
9012                for (const candidate of candidates) {
9013                    if (candidate.closest('dialog') === dialogElement) {
9014                        candidate.focus();
9015                        return;
9016                    }
9017                }
9018            }, 50);
9019        }
9020
9021        window.hyva.modal = function(options = {}) {
9022                        if (this.$el && this.$el.dataset && this.$el.dataset.options) {
9023                try {
9024                    options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}'));
9025                } catch (e) {
9026                    throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON');
9027                }
9028            }
9029
9030            const config = Object.assign({
9031                dialog: 'dialog',                 duration: 300,                 transitionEnter: 'transition ease-out duration-300',
9032                transitionEnterStart: 'opacity-0',
9033                transitionEnterEnd: 'opacity-100',
9034                transitionLeave: 'transition ease-in duration-300',
9035                transitionLeaveStart: 'opacity-100',
9036                transitionLeaveEnd: 'opacity-0',
9037            }, options);
9038
9039            return {
9040                opened: {},
9041                show(dialog, trigger) {
9042                    const name = typeof dialog === 'string' ? dialog : config.dialog;
9043                    if (!name || this.opened[name]) return;
9044
9045                    this.opened[name] = true;
9046                    const focusTarget = determineTrigger(this.$refs, dialog, trigger);
9047                    const dialogEl = this.$refs && this.$refs[name];
9048                    const frame = { name, instance: this, focusTarget, time: Date.now() };
9049                    modals.push(frame);
9050                    setFocusFirstElement(dialogEl);
9051                    return new Promise(resolve => { frame.resolve = resolve; });
9052                },
9053                cancel() {
9054                    this.hide(false);
9055                },
9056                ok() {
9057                    this.hide(true);
9058                },
9059                hide(value) {
9060                                        if (Date.now() - lastHide < config.duration) return;
9061                    lastHide = Date.now();
9062
9063                                        const modal = modals.pop();
9064                    if (!modal) return;
9065
9066                    modal.instance.opened[modal.name] = false;
9067
9068                                        const focusTarget = modal.focusTarget;
9069                    focusTarget && window.setTimeout(() => focusTarget.focus(), config.duration + 50);
9070                    modal.resolve && modal.resolve(value);
9071                },
9072                /**
9073                 * @deprecated Use dialogConfig() instead, which is used by the default modal-container.phtml template.
9074                 * This method is kept for backwards compatibility with custom container templates.
9075                 */
9076                overlay(dialog) {
9077                    dialog = this.$el.dataset.dialogRefName || dialog;
9078                    const name = typeof dialog === 'string' ? dialog : config.dialog;
9079                    if (this.$el.tagName !== 'DIALOG' && ! window.hyva.modal.legacyModalCompatibility) {
9080                        console.warn(
9081                            '[hyva] Deprecated modal markup detected (x-bind="overlay" on a non-dialog element' +
9082                            (name ? ` for "${name}"` : '') + ').\n' +
9083                            'Escape and click-outside closing are not available for such dialogs anymore.\n' +
9084                            'Install hyva-themes/magento2-legacy-modal-compatibility or migrate to the native <dialog> markup.'
9085                        );
9086                    }
9087                    return Object.assign({}, this.dialogConfig(name), {
9088                        ['@hyva-modal-show.window'](event) {
9089                            event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide)
9090                        }
9091                    });
9092                },
9093                dialogConfig(name) {
9094                    name = name || this.$el.dataset.dialogRefName || config.dialog;
9095                    return {
9096                        ['x-show']: () => name ? this.opened[name] : false,
9097                        ['x-transition:enter']: config.transitionEnter,
9098                        ['x-transition:enter-start']: config.transitionEnterStart,
9099                        ['x-transition:enter-end']: config.transitionEnterEnd,
9100                        ['x-transition:leave']: config.transitionLeave,
9101                        ['x-transition:leave-start']: config.transitionLeaveStart,
9102                        ['x-transition:leave-end']: config.transitionLeaveEnd,
9103                        ['@hyva-modal-show.window'](event) {
9104                            event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide);
9105                        },
9106                    };
9107                },
9108                showDialogOnInit() {
9109                    const name = this.$el.dataset.dialogRefName;
9110                    if (name) {
9111                        this.show(name);
9112                    }
9113                }
9114            };
9115        }
9116
9117        window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length - 1]
9118
9119        window.hyva.modal.pop = function () {
9120            if (modals.length > 0) {
9121                modals[modals.length - 1].instance.hide();
9122            }
9123        }
9124
9125        /**
9126         * @deprecated Native <dialog> handles focus trapping automatically.
9127         * Calling this function has no effect. Kept for backwards compatibility.
9128         */
9129        window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) {}
9130
9131        /**
9132         * @deprecated Native <dialog> with x-htmldialog handles ESC key and click-outside events.
9133         * These functions have no effect. Kept for backwards compatibility.
9134         */
9135        window.hyva.modal.eventListeners = {
9136            keydown: event => {},
9137            click: event => {}
9138        };
9139    })();
9140
9141    window.addEventListener('alpine:init', () => {
9142        Alpine.data('hyvaModal', window.hyva.modal);
9143    }, {once: true});
9144</script>
9144
9145<style>
9146    .wishlist-list {background-color: rgb(241, 243, 242);}
9147</style>
9148<datalist id="presets">
9149<option value="#ffb3ba">Red</option>
9150<option value="#ffdfba">Orange</option>
9151<option value="#ffffba">Yellow</option>
9152<option value="#baffc9">Green</option>
9153<option value="#bae1ff">Blue</option>
9154</datalist>
9155
9156<script>
9157    function getTextColorForBackground(color) { // See https://css-tricks.com/switch-font-color-for-different-backgrounds-with-css/
9158        if (!color) {
9159            return '';
9160        }
9161        color = color.charAt(0) === '#' ? color.substring(1) : color;
9162        if (color.length !== 6) {
9163            return '';
9164        }
9165        const THRESHOLD = .5;
9166        const parts = (color.match(/.{1,2}/g) ?? []).map(h => parseInt(h, 16));
9167        const red = .2126 * parts[0];
9168        const green = .7152 * parts[1];
9169        const blue = .0722 * parts[2];
9170        const textColor = -10000000 * (((red + green + blue) / 255) - THRESHOLD);
9171        return `hsl(0, 0%, ${textColor}%`;
9172    }
9173
9174        
9175    function initMWishlistPopup() {
9176        return {
9177            ...hyva.modal(),
9178
9179            isProcessing: false,
9180            excludedListIds: [],
9181            newListActive: false,
9182            newListName: '',
9183            newListColor: '',
9184            addItemToWishlistUrl: 'https://www.jardindupicvert.com/mwishlist/item/add/',
9185            removeItemFromWishlistUrl: 'https://www.jardindupicvert.com/mwishlist/item/remove/',
9186            addNewListUrl: 'https://www.jardindupicvert.com/mwishlist/wishlist/create/',
9187            deleteListUrl: 'https://www.jardindupicvert.com/mwishlist/wishlist/delete/',
9188            moveItemsUrl: 'https://www.jardindupicvert.com/mwishlist/item/move/',
9189            copyItemsUrl: 'https://www.jardindupicvert.com/mwishlist/item/copy/',
9190            actionNote: '',
9191
9192            eventListeners: {
9193                // Called from vmAMWishlist (js/alpine-data.phtml)
9194                ['@update-product-in-wishlist.window'](event) {
9195                    const params = { ...event.detail };
9196                    this.loginIfRequired(() => {this.updateProductInWishlist(params);});
9197                },
9198                // Called from mwishlist popup or wishlists page
9199                ['@create-new-wishlist.window'](event) {
9200                    this.addNewList(event.detail);
9201                },
9202                // Called from wishlists page or wishlist detail page
9203                ['@delete-wishlist.window'](event) {
9204                    this.deleteList(event.detail);
9205                },
9206                // copy|move items from a wish list to another: called from wishlists detail page
9207                ['@change-wishlist-items.window'](event) {
9208                    const params = { ...event.detail };
9209                    if (params?.action === 'move' || params?.action === 'copy' || params?.action === 'addtocart') {
9210                        let formData = {};
9211                        if (params?.form) {
9212                            formData = this.extractFormData(params.form);
9213                            params.data.data = { ...params.data.data, ...formData };
9214                        }
9215                        this.changeItemsToList(params?.data?.action, params?.data?.data);
9216                    }
9217                },
9218                // Called from wishlists detail page (search results)
9219                ['@add-product-to-wishlist.window'](event) {
9220                    const params = { ...event.detail };
9221                    this.loginIfRequired(() => {this.addProductToWishlist(params);});
9222
9223                },
9224                // Called from wishlists detail page
9225                ['@remove-item-from-wishlist.window'](event) {
9226                    const params = { ...event.detail };
9227                    if (params?.wishlist && params?.item) {
9228                        this.loginIfRequired(() => {this.removeProductFromWishlist(params, [{ list: params?.wishlist, item: params?.item }]);});
9229                    }
9230                },
9231            },
9232
9233            getLists() {
9234                return Alpine.store('amwishlist').loaded ? Alpine.store('amwishlist').lists : [];
9235            },
9236
9237            // If customer is not logged in, we open login in panel
9238            loginIfRequired(callback = false) {
9239                if (!Alpine.store('customer').isLoggedIn) {
9240                    window.dispatchEvent(
9241                        new CustomEvent('toggle-authentication', {
9242                            detail: {
9243                                callback: callback,
9244                                text: "Veuillez vous connecter à votre compte pour pouvoir gérer vos listes de favoris."
9245                            }
9246                        })
9247                    );
9248                } else if (typeof callback === 'function') {
9249                    callback();
9250                }
9251            },
9252
9253            /**
9254             * Enable customer to add/remove product to/from wishlist
9255             * A [remove] button is add to every wishlist the product is included in
9256             * A [add] button is add to every wishlist the product isn't included in
9257             *
9258             * @param params
9259             */
9260            updateProductInWishlist(params) {
9261                if(this.isProcessing) {
9262                    return;
9263                }
9264                const remove = (list, item) => {
9265                    this.ajaxAction(
9266                        this.removeItemFromWishlistUrl,
9267                        { item: item, wishlist_id: list, ...params }
9268                    );
9269                };
9270                const add = (id) => {
9271                    this.ajaxAction(
9272                        this.addItemToWishlistUrl,
9273                        { wishlist_id: id, ...params }
9274                    );
9275                };
9276                // We add a "isIn" attribute to each list whether it includes the product or not
9277                this.getLists().forEach(l => {
9278                    l.isIn = !!l.items.find(i => i.product_id == params.product);
9279                });
9280                const wishlistItems = this.getWishlistItemsForProductId(params.product);
9281                this.actionNote = wishlistItems.length ?
9282                    "Ajouter ou supprimer cet article de vos listes de favoris." :
9283                    "Choisissez une liste à laquelle ajouter cet article."
9284
9285                this.show().then(
9286                    (id) => {
9287                        const wishlist = this.getWishlistById(id);
9288                        if (wishlist) {
9289                            if (wishlist.isIn) {
9290                                const item = wishlistItems.find(i => i.list == id)?.item;
9291                                if (item) {
9292                                    remove(id, item);
9293                                }
9294                            } else {
9295                                add(id);
9296                            }
9297                        }
9298                    }
9299                );
9300            },
9301
9302            /**
9303             * Required key: product
9304             * Extra keys from wishlist search lock: wishlist, block
9305             * @param params
9306             */
9307            addProductToWishlist(params) {
9308                if(this.isProcessing) {
9309                    return;
9310                }
9311                const add = (id) => {
9312                    this.ajaxAction(
9313                        this.addItemToWishlistUrl,
9314                        { wishlist_id: id, ...params }
9315                    );
9316                };
9317                params.qty = params?.qty || 1;
9318                if (params?.wishlist) {
9319                    add(params.wishlist);
9320                } else {
9321                    this.show().then(
9322                        (id) => {
9323                            if (id) {
9324                                add(id);
9325                            }
9326                        }
9327                    );
9328                }
9329            },
9330
9331            /**
9332             * items pattern []{list: int, item: int}
9333             */
9334            removeProductFromWishlist(params, items = []) {
9335                const remove = (list, item) => {
9336                    this.ajaxAction(
9337                        this.removeItemFromWishlistUrl,
9338                        { item: item, wishlist_id: list, ...params }
9339                    );
9340                };
9341                this.actionNote = "Choisissez une liste de destination.";
9342                const wishlistItems = items || this.getWishlistItemsForProductId(params.product);
9343                if (wishlistItems.length) {
9344                    if (wishlistItems.length === 1) {
9345                        remove(wishlistItems[0].list, wishlistItems[0].item);
9346                    } else {
9347                        const lists = wishlistItems.map(i => i.list);
9348                        this.excludedListIds = this.getLists().filter(l => !lists.includes(l.wishlist_id)).map(l => l.wishlist_id);
9349                        this.show().then(
9350                            (id) => {
9351                                if (id) {
9352                                    const item = wishlistItems.find(i => i.list == id)?.item;
9353                                    remove(id, item);
9354                                }
9355                            }
9356                        );
9357                    }
9358                }
9359            },
9360
9361            changeItemsToList(actionUrl, params) {
9362                const change = (params) => {
9363                    this.ajaxAction(
9364                        actionUrl,
9365                        { ...params }
9366                    );
9367                };
9368                const listFrom = this.getWishlistById(params?.wishlist_id);
9369                if (listFrom) {
9370                    params['wishlist[name]'] = listFrom.name;
9371                    params['wishlist[type]'] = 0;
9372                    this.excludedListIds = [listFrom.wishlist_id];
9373                    this.show().then(
9374                        (id) => {
9375                            if (id) {
9376                                params.to_wishlist_id = id;
9377                                change(params);
9378                            }
9379                        }
9380                    );
9381                }
9382            },
9383
9384            /**
9385             * May be called within the mwishlist popup (no 'name' provided, will require reloading sections) or
9386             * within the wishlists page ('name' and 'blocks')
9387             */
9388            addNewList(params) {
9389                const name = params?.name || this.newListName;
9390                const color = params?.color || this.newListColor;
9391                this.ajaxAction(
9392                    this.addNewListUrl,
9393                    {
9394                        'wishlist[name]': name,
9395                        'wishlist[color]': color,
9396                        'wishlist[type]': 1,
9397                        ...(params || {})
9398                    },
9399                    () => {
9400                        this.newListActive = false;
9401                        this.newListName = '';
9402                        this.newListColor = '';
9403                    }
9404                );
9405            },
9406
9407            deleteList(params) {
9408                const id = params?.id;
9409                if (id && window.confirm("Êtes-vous sûr(e) de vouloir supprimer cette liste de favoris ?")) {
9410                    this.ajaxAction(
9411                        this.deleteListUrl,
9412                        { 'wishlist_id': id, ...(params || {}) }
9413                    );
9414                }
9415            },
9416
9417            ajaxAction(url, formData) {
9418                this.processing = true;
9419                formData.form_key = hyva.getFormKey();
9420                if (formData?.block === 'customer.wishlist') {
9421                    document.querySelector('.amwishlist-items')?.classList?.add('u-loader');
9422                }
9423                fetch(
9424                    url,
9425                    {
9426                        method: 'POST',
9427                        headers: {
9428                            "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
9429                            'X-Requested-With': 'XMLHttpRequest',
9430                            'pragma': 'no-cache',
9431                            'cache-control': 'no-cache'
9432                        },
9433                        mode: 'cors',
9434                        credentials: 'include',
9435                        body: Object
9436                                .keys(formData)
9437                                .map(value => `${value}=${encodeURIComponent(formData[value])}`)
9438                                .join('&')
9439                    }
9440                ).then(
9441                    (response) => {
9442                        console.log(response);
9443                        this.excludedListIds = [];
9444                        const redirectUrl = formData?.redirect || response?.backUrl;
9445                        if (redirectUrl) {
9446                            window.location.href = redirectUrl;
9447                        }
9448                        if (formData.reload) {
9449                            window.location.reload();
9450                        }
9451                        this.reloadSectionData();
9452                        if (formData.callback && typeof formData.callback === 'function') {
9453                            formData.callback(response);
9454                        }
9455                        if (formData?.block === 'customer.wishlist') {
9456                            document.querySelector('.amwishlist-items')?.classList?.remove('u-loader');
9457                        }
9458                        return response.json()
9459                    }
9460                ).then(
9461                    (response) => {
9462                        if (response.blocks) {
9463                            this.reloadBlocks(response.blocks);
9464                            // self._toggleMassActions();
9465                        }
9466                        /**
9467                        if (document.querySelector('body.checkout-cart-index').length) {
9468                            window.location.reload();
9469                            return true;
9470                        }*/
9471                        this.processing = false;
9472                        this.newListActive = false;
9473                    }
9474                );
9475            },
9476
9477            getWishlistById(id) {
9478                return this.getLists().find((l) => l.wishlist_id == id);
9479            },
9480
9481            getWishlistItem(list, id) {
9482                const wishlist = this.getWishlistById(list);
9483                return wishlist ? wishlist.items.find(i => i.wishlist_item_id == id) : null;
9484            },
9485
9486            extractFormData(formId) {
9487                const form = document.querySelector(formId);
9488                const data = new FormData(form);
9489                let formData = {};
9490                for (let [key, value] of data) {
9491                    if (key.includes('qty') || key.includes('selected') || key.includes('simple_id')) {
9492                        formData[key] = value;
9493                    }
9494                }
9495                return formData;
9496            },
9497
9498            /**
9499             * Get wishlist items for a given product
9500             * return [{list: int, item: int}]
9501             */
9502            getWishlistItemsForProductId(productId) {
9503                const items = [];
9504                this.getLists().forEach(l => {
9505                    const item = l.items.find(i => i.product_id == productId);
9506                    if (item) {
9507                        items.push({ list: l.wishlist_id, item: item.wishlist_item_id });
9508                    }
9509                })
9510                return items;
9511            },
9512
9513            // See https://docs.hyva.io/hyva-themes/writing-code/working-with-sectiondata.html
9514            reloadSectionData() {
9515                hyva.setCookie('mage-cache-sessid', '', -1, true); // remove the cookie
9516                window.dispatchEvent(
9517                    new CustomEvent("reload-customer-section-data")
9518                ); // reload the data
9519            },
9520
9521            reloadBlocks(blocks) {
9522                for (const [name, content] of Object.entries(blocks)) {
9523                    const block = document.createElement('div');
9524                    block.innerHTML = content;
9525                    let selectors = [];
9526                    switch (name) {
9527                        case 'mwishlist.list.contrainer':
9528                            selectors = ['content-tabs-block', 'tabs-block'];
9529                            break;
9530                        case 'customer.wishlist':
9531                            selectors = ['items-block', 'pager'];
9532                            break;
9533                    }
9534                    selectors.forEach((s) => {
9535                        const srcElmt = block.querySelector('[data-amwishlist-js="' + s + '"]');
9536                        const destElmt = document.querySelector('[data-amwishlist-js="' + s + '"]');
9537                        if (srcElmt && destElmt) {
9538                            destElmt.innerHTML = srcElmt.innerHTML;
9539                        }
9540                    });
9541                }
9542            }
9543        }
9544    }
9545</script>
9545
9546<aside x-data="initMWishlistPopup()"
9547       x-bind="eventListeners"
9548       class="amwishlist-popup-block"
9549>
9550<div x-cloak
9551         x-bind="overlay()"
9552         class="w-screen fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-modal"
9553    >
9554<div x-ref="dialog"
9555             role="dialog"
9556             class="relative inline-block w-full md:max-w-xl m-2 overflow-auto bg-white shadow-xl rounded-lg p-4"
9557        >
9558<div x-focus-first
9559                 @click.prevent="hide()"
9560                 class="absolute top-2 right-2 cursor-pointer"
9561            >
9562<svg class="w-8 h-8 text-primary cursor-pointer">
9563                    <use xlink:href="#close-symbol"></use>
9564                </svg>
9565</div>
9566<div>
9567<div class="amwishlist-title mb-8">
9568<p class="amwishlist-header mb-4 text-lg font-bold text-center">
9569Vos listes de favoris                    </p>
9570</div>
9571<p x-html="actionNote"
9572                   x-show="actionNote"
9573                   class="my-2 text-sm"></p>
9574
9575<div class="amwishlist-tabs-block -block flex flex-col gap-2 max-h-[250px] overflow-y-auto pr-4 font-sm">
9576<template x-for="(list, index) in getLists()"
9577                              :key="list.wishlist_id"
9578                    >
9579<div @click.prevent="hide(list.wishlist_id)"
9580                             :class="{ 'hidden': excludedListIds.includes(list.wishlist_id), ['wishlist-' + index]: true }"
9581                             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"
9582                             :style="`background-color: ${list.color}; color: ${getTextColorForBackground(list.color) || '#000000'}`"
9583                             list="presets"
9584                        >
9585<span>
9586<span x-text="list.name"
9587                                      class="font-bold leading-tight hover:underline"></span>
9588<span class="text-xs">
9589<span x-text="list.items_count"></span>
9590<span x-show="list.items_count < 2">article</span>
9591<span x-show="list.items_count > 1">articles</span>
9592</span>
9593</span>
9594<button class="btn btn-secondary btn-size-xs">
9595<span x-show="list.isIn">Supprimer</span>
9596<span x-show="!list.isIn">Ajouter</span>
9597</button>
9598</div>
9599</template>
9600</div>
9601
9602<div class="amwishlist-list-block amwishlist-newlist-block my-4">
9603<div @click.prevent="newListActive = !newListActive; $nextTick(() => {if (newListActive) {$refs?.newListInput?.focus();}})"
9604                         class="mt-8 cursor-pointer"
9605                    >
9606<span class="text-2xl">+</span>
9607<span class="hover:underline">
9608Créer une nouvelle liste                        </span>
9609</div>
9610
9611<div x-show="newListActive"
9612                         class="amwishlist-newlist flex flex-col xs:flex-row gap-4 items-center justify-between my-2"
9613                    >
9614<div class="form-field field required grow">
9615<label class="label"
9616                                   for="wishlist-name"
9617                            >
9618<span>Nom de la liste<sup>*</sup></span>
9619</label>
9620<div class="control">
9621<input x-model="newListName"
9622                                       name="wishlist-name"
9623                                       type="text"
9624                                       class="amwishlist-input form-input"
9625                                       maxlength="32"
9626                                       required
9627                                />
9628</div>
9629</div>
9630<span class="flex items-center gap-2 justify-center">
9631<input x-model="newListColor"
9632                                   type="color"
9633                                   class="w-8 h-8"
9634                                   required
9635                            />
9636<button @click.prevent="$dispatch('create-new-wishlist')"
9637                                    class="amwishlist-button btn btn-primary btn-size-sm"
9638                                    type="button"
9639                            >
9640Créer                            </button>
9641</span>
9642</div>
9643</div>
9644</div>
9645</div>
9646</div>
9647</aside>
9648<script>
9649    function hyvaModalContent() {
9650        return {
9651            modalContentElement: document.querySelector('#hyva-modal-content [data-role="content"]'),
9652            isFullScreen: false,
9653            aspectRatio: 'auto',
9654
9655            loadContent(content) {
9656                var content = event?.detail;
9657                switchBodyOverflow(false); /** see js-library.phtml */
9658                this.modalContentElement.innerHTML = '';
9659                const element = content?.template || content;
9660                let popupContent = '';
9661                try {
9662                    const contentElement = document.querySelector(element);
9663                    if (contentElement instanceof HTMLElement) {
9664                        this.isFullScreen = contentElement.hasAttribute('data-zoom');
9665                        this.aspectRatio = this.isFullScreen ? contentElement.getAttribute('data-zoom') || 'auto' : 'auto';
9666                        if (contentElement.tagName === 'TEMPLATE') {
9667                            popupContent = contentElement.content.children[0].cloneNode(true);
9668                        } else {
9669                            popupContent = contentElement.innerHTML;
9670                        }
9671                    }
9672                } catch(error) {
9673                    popupContent = content?.innerHTML || content;
9674                } finally {
9675                    if (popupContent) {
9676                        popupContent instanceof HTMLElement ?
9677                            this.modalContentElement.append(popupContent) :
9678                            this.modalContentElement.innerHTML = popupContent;
9679                        this.processContent();
9680                        this.show();
9681                        typeof content?.callback === 'function' && content?.callback();
9682                    }
9683                }
9684            },
9685
9686            processContent() {
9687                const srcs = this.modalContentElement.querySelectorAll('[src]');
9688                for (let i = 0; i < srcs.length; ++i) {
9689                    const src = srcs[i];
9690                    src.classList.add('u-loader', 'w-full');
9691                    src.onload = () => {src.classList.remove('u-loader')};
9692                }
9693            },
9694
9695            // We stop all possible players before closing popup
9696            shutAndClose() {
9697                this.hide();
9698                setTimeout(() => {
9699                    switchBodyOverflow(true);
9700                    this.modalContentElement.innerHTML = '';
9701                }, 500);
9702            },
9703
9704            getModalClasses() {
9705                return {
9706                    'max-h-screen-75 overflow-auto': !this.isFullScreen,
9707                    'min-w-xs max-h-screen overflow-none': this.isFullScreen
9708                }
9709            },
9710
9711            getModalStyle() {
9712                return {'aspect-ratio': this.isFullScreen ? this.aspectRatio : 'auto'}
9713            },
9714
9715            getContainerClass() {
9716                return {
9717                    'overflow-auto': !this.isFullScreen,
9718                    'h-full': this.isFullScreen
9719                }
9720            },
9721
9722            getContentClass() {
9723                return {'h-full': this.isFullScreen}
9724            }
9725        }
9726    }
9727
9728    window.addEventListener(
9729        'alpine:init',
9730        () => Alpine.data(
9731            'initHyvaModalContent', () => {
9732                return Object.assign(
9733                    hyva.modal.call(this),
9734                    hyvaModalContent()
9735                );
9736            }
9737        ),
9738        {once: true}
9739    );
9740</script>
9740
9741
9742<div x-data="initHyvaModalContent"
9743     x-defer="idle"
9744     id="hyva-modal-content"
9745     @open-modal-content.window="loadContent"
9746     @close-modal-content.window="shutAndClose"
9747>
9748<div x-cloak
9749         x-bind="overlay"
9750         class="w-screen fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-modal"
9751    >
9752<div x-ref="dialog"
9753             role="dialog"
9754             @click.outside.prevent.stop="shutAndClose"
9755             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"
9756             :class="getModalClasses"
9757             :style="getModalStyle"
9758        >
9759<div x-focus-first
9760                 @click="shutAndClose"
9761                 class="absolute z-1 top-1 right-1 bg-white cursor-pointer"
9762            >
9763<svg class="w-6 sm:w-8 h-6 sm:h-8 text-primary hover:text-primary-lighter">
9764                    <use xlink:href="#close-symbol"></use>
9765                </svg>
9766</div>
9767<div class="max-sm:text-sm"
9768                 :class="getContainerClass"
9769            >
9770<div data-role="content"
9771                     :class="getContentClass"
9772                ></div>
9773</div>
9774</div>
9775</div>
9776</div>
9777<script>
9778    (function () {
9779        if (! window.hyva || ! window.hyva.modal) {
9780            return;
9781        }
9782
9783                window.hyva.modal.legacyModalCompatibility = true;
9784
9785        const refElement = frame =>
9786            frame && frame.instance && frame.instance.$refs && frame.instance.$refs[frame.name];
9787
9788        const isLegacyElement = el => !! el && el.tagName !== 'DIALOG';
9789
9790        const isOverlayDisabled = el => !! el && el.hasAttribute('x-no-overlay');
9791
9792                window.hyva.modal.eventListeners = Object.assign(window.hyva.modal.eventListeners || {}, {
9793            keydown: event => {
9794                if (event.key !== 'Escape') {
9795                    return;
9796                }
9797                const frame = window.hyva.modal.peek();
9798                if (frame && isLegacyElement(refElement(frame))) {
9799                    frame.instance.hide();
9800                }
9801            },
9802            click: event => {
9803                const frame = window.hyva.modal.peek();
9804                const dialog = refElement(frame);
9805                if (! frame || ! isLegacyElement(dialog)) {
9806                    return;
9807                }
9808                if (frame.time + 50 < Date.now() &&                     ! isOverlayDisabled(dialog) &&
9809                    ! dialog.contains(event.target)
9810                ) {
9811                    frame.instance.hide();
9812                }
9813            }
9814        });
9815
9816        document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown);
9817        document.addEventListener('click', window.hyva.modal.eventListeners.click);
9818
9819                window.hyva.modal = new Proxy(window.hyva.modal, {
9820            apply(target, thisArg, args) {
9821                const instance = Reflect.apply(target, thisArg, args);
9822
9823                const originalShow = instance.show;
9824                instance.show = function (dialog, trigger) {
9825                    const frameBefore = window.hyva.modal.peek();
9826                    const openerCandidate = document.activeElement;
9827                    const result = originalShow.call(this, dialog, trigger);
9828                    const frame = window.hyva.modal.peek();
9829                    if (! frame || frame === frameBefore) {
9830                        return result;                     }
9831                    const el = refElement(frame);
9832                    if (isLegacyElement(el)) {
9833                        frame.legacyFocusTarget = openerCandidate;
9834                        if (! isOverlayDisabled(el)) {
9835                            document.body.classList.add('overflow-hidden');
9836                            this.$nextTick
9837                                ? this.$nextTick(() => hyva.trapFocus(el))
9838                                : hyva.trapFocus(el);
9839                        }
9840                        window.setTimeout(() => {
9841                            const focusFirst = el.querySelector('[x-focus-first]');
9842                            focusFirst && focusFirst.focus();
9843                        }, 50);
9844                    }
9845                    return result;
9846                };
9847
9848                const originalHide = instance.hide;
9849                instance.hide = function (value) {
9850                    const frame = window.hyva.modal.peek();
9851                    const el = refElement(frame);
9852                    const wasLegacy = frame && isLegacyElement(el);
9853                    const result = originalHide.call(this, value);
9854                    if (! wasLegacy || window.hyva.modal.peek() === frame) {
9855                        return result;                     }
9856                    hyva.releaseFocus(el);
9857
9858                    const next = window.hyva.modal.peek();
9859                    const nextEl = next ? refElement(next) : null;
9860                    if (isLegacyElement(nextEl) && ! isOverlayDisabled(nextEl)) {
9861                        hyva.trapFocus(nextEl);
9862                    } else {
9863                        document.body.classList.remove('overflow-hidden');
9864                    }
9865
9866                    const focusTarget = frame.legacyFocusTarget;
9867                    focusTarget && window.setTimeout(() =>
9867 focusTarget.focus(), 50);
9868
9869                    return result;
9870                };
9871
9872                return instance;
9873            }
9874        });
9875    })();
9876</script>
vendor: 1 bytes, line 9876
9876
9877<script>
9878document.addEventListener('alpine:init', () => {
9879    Alpine.store('amwishlist', {
9880        lists: [],
9881        loaded: false,
9882        init() {
9883            window.addEventListener(
9884                "private-content-loaded",
9885                (event) => {
9886                    this.loaded = true;
9887                    this.lists = event.detail.data?.mwishlist?.wishlist_list?.[1] || [];
9888                    Alpine.nextTick(() => {
9889                        window.dispatchEvent(new CustomEvent("amwishlist-alpine-init"))
9890                    });
9891                }
9892            );
9893        }
9894    });
9895
9896    Alpine.data('vmAMWishlist', (id, fn = null) => ({
9897        id: id,
9898        callback: fn,
9899        get isIn() {
9900            return Alpine.store('amwishlist').loaded
9901                && Alpine.store('amwishlist').lists.filter(l => l.items.find(i => i.product_id == id)).length > 0;
9902        },
9903        get title() {
9904            return this.isIn ? "Enlever de vos favoris" :
9905                "Ajouter à mes listes d’envie";
9906        },
9907        get color() {
9908            return Alpine.store('amwishlist').loaded
9909                && (Alpine.store('amwishlist').lists.find(l => l.items.find(i => i.product_id == id))?.color || '');
9910        },
9911
9912        trigger: {
9913            ['@click.prevent']() {
9914                if (Alpine.store('amwishlist').loaded) {
9915                    this.$dispatch('update-product-in-wishlist', {
9916                        'product': this.id,
9917                        'callback': this.callback
9918                    });
9919                }
9920            }
9921        }
9922    }))
9923})
9924</script>
9924
9925
9926<script>
9927    'use strict';
9928    (() => {
9929        function _calculateStrength({elementID, valid}) {
9930            const password = document.getElementById(elementID),
9931                emailElm = document.getElementById('email_address');
9932            let displayScore;
9933            // Display score is based on combination of whether password is empty, valid, and zxcvbn strength
9934            if (!password || !password.value) {
9935                displayScore = 0;
9936            } else {
9937                // We should only perform this check in case there is an email field on screen
9938                if (emailElm && password.value && emailElm.value &&
9939                    password.value.toLowerCase() === emailElm.value.toLowerCase()) {
9940                    displayScore = 1;
9941                } else {
9942                    const zxcvbnScore = zxcvbn(password.value).score;
9943                    displayScore = valid && zxcvbnScore > 0 ? zxcvbnScore : 1;
9944                }
9945            }
9946
9947            _displayStrength(displayScore);
9948        }
9949
9950        function _displayStrength(displayScore) {
9951            let strengthLabel = '',
9952                className;
9953
9954            switch (displayScore) {
9955                case 0:
9956                    strengthLabel = "Aucun\u0020mot\u0020de\u0020passe";
9957                    className = 'password-none';
9958                    break;
9959
9960                case 1:
9961                    strengthLabel = "Faible";
9962                    className = 'password-weak';
9963                    break;
9964
9965                case 2:
9966                    strengthLabel = "Moyen";
9967                    className = 'password-medium';
9968                    break;
9969
9970                case 3:
9971                    strengthLabel = "Elev\u00E9";
9972                    className = 'password-strong';
9973                    break;
9974
9975                case 4:
9976                    strengthLabel = "Tr\u00E8s\u0020\u00E9lev\u00E9";
9977                    className = 'password-very-strong';
9978                    break;
9979            }
9980            const meterElm = document.getElementById('password-strength-meter-container'),
9981                meterLabelElm = document.getElementById('password-strength-meter-label');
9982            meterElm.className = '';
9983            meterElm.classList.add(className);
9984            meterLabelElm.textContent = strengthLabel;
9985        }
9986
9987        let loading = false;
9988        const callbacks = [];
9989
9990        function loadZxcvbn(cb) {
9991            callbacks.push(cb);
9992            if (loading) return;
9993            loading = true;
9994
9995            const script = document.createElement('script');
9996            script.type = 'text/javascript';
9997            script.src = 'https\u003A\u002F\u002Fwww.jardindupicvert.com\u002Fstatic\u002Fversion1790243132\u002Ffrontend\u002FPicVert\u002Fhyva\u002Ffr_FR\u002Fjs\u002Fzxcvbn.min.js';
9998            script.async = true;
9999            script.onload = () => callbacks.forEach(cb => cb());
10000            document.head.appendChild(script);
10001        }
10002
10003        window.addEventListener('password-validate', function (evt) {
10004            const meterElm = document.getElementById('password-strength-meter-container'),
10005                meterLabelElm = document.getElementById('password-strength-meter-label');
10006            if (meterElm && meterLabelElm) {
10007                if (evt.detail && evt.detail.elementID) {
10008                    const cb = () => _calculateStrength(evt.detail);
10009                    window.zxcvbn ? cb() : loadZxcvbn(cb)
10010                }
10011            }
10012        });
10013
10014
10015        document.addEventListener('DOMContentLoaded', () => {
10016            hyva && hyva.formValidation && hyva.formValidation.addRule('password-strength', function(value, options, field, context) {
10017                let counter = 0;
10018                const minCharacterSets = options.minCharacterSets !== undefined ?  options.minCharacterSets : 1;
10019                if (value.match(/\d+/)) {
10020                    counter++;
10021                }
10022
10023                if (value.match(/[a-z]+/)) {
10024                    counter++;
10025                }
10026
10027                if (value.match(/[A-Z]+/)) {
10028                    counter++;
10029                }
10030
10031                if (value.match(/[^a-zA-Z0-9]+/)) {
10032                    counter++;
10033                }
10034
10035                queueMicrotask(() => {
10036                    window.dispatchEvent(new CustomEvent('password-validate', { detail: {
10037                            elementID: field.element.id || 'password',
10038                            valid: field.state.valid
10039                        }}));
10040                });
10041
10042                if (counter < minCharacterSets) {
10043                    const missing = minCharacterSets - counter;
10044                    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);
10045                }
10046                return true;
10047            });
10048        })
10049    })();
10050
10051</script>
vendor: 1 bytes, line 10051
10051
10052<script>
10053    function initDealCountDown(flashSaleData) {
10054        return {
10055            from: flashSaleData?.from || 0,
10056            expiry: flashSaleData?.to || 0,
10057            qty: flashSaleData?.qty || 0,
10058            isPending: false,
10059            isEnded: false,
10060            fromFormatted: null,
10061            remainingTime: null,
10062            days: 0,
10063            hours: 0,
10064            minutes: 0,
10065            seconds: 0,
10066
10067            init() {
10068                const now = new Date().getTime() / 1000;
10069                const fromDate = new Date(this.from * 1000);
10070                this.fromFormatted = ('0' + fromDate.getDate()).substr(-2) + '/' + ('0' + (fromDate.getMonth() + 1)).substr(-2) + '/' + fromDate.getFullYear();
10071                this.isPending = this.from > now;
10072                this.isEnded = !this.isPending && now > this.expiry;
10073                if (!this.isPending && !this.isEnded) {
10074                    this.updateRemainingTime();
10075                    let delay;
10076                    if (this.days) {
10077                        delay = 3600000;
10078                    } else if (this.hours) {
10079                        delay = 60000;
10080                    } else {
10081                        delay = 1000;
10082                    }
10083                    setInterval(() => {
10084                        this.updateRemainingTime();
10085                    }, delay);
10086                }
10087            },
10088
10089            updateRemainingTime() {
10090                this.remainingTime = parseInt(this.expiry - new Date().getTime() / 1000);
10091                let remaining = this.remainingTime;
10092                const d = Math.floor(this.remainingTime / 86400);
10093                this.days = d;
10094                remaining -= (86400 * d);
10095                const h = Math.floor(remaining / 3600);
10096                this.hours = h;
10097                remaining -= (3600 * h);
10098                const m = Math.floor(remaining / 60);
10099                this.minutes = m;
10100                remaining -= 60 * m;
10101                this.seconds = remaining;
10102            },
10103        };
10104    }
10105</script>
vendor: 1 bytes, line 10105
10105
10106<script>
10107document.addEventListener('alpine:init', () => {
10108    Alpine.data('vmMinisearch', () => ({
10109        show: false,
10110        input: "",
10111        url: "https://www.jardindupicvert.com/search/ajax/suggest/",
10112        templates: null,
10113        minSearchLength: 1,
10114        searchResultsByType: {},
10115        currentRequest: null,
10116
10117        getSearchResults: function () {
10118            let value = this.input.trim();
10119            if (value.length < parseInt(this.minSearchLength, 10)) {
10120                this.searchResultsByType = [];
10121                this.show = false;
10122                return false;
10123            }
10124            let url = this.url + '?' + new URLSearchParams({q: value, _: Date.now()}).toString();
10125            if (this.currentRequest !== null) {
10126                this.currentRequest.abort();
10127            }
10128            this.currentRequest = new AbortController();
10129
10130            fetch(url, {
10131                method: 'GET',
10132                signal: this.currentRequest.signal,
10133            }).then((response) => {
10134                if (response.ok) {
10135                    return response.json();
10136                }
10137            }).then((data) => {
10138                this.show = data.length > 0;
10139                // we restrict result types and force order
10140                this.searchResultsByType = data.reduce((acc, result) => {
10141                    if (acc?.[result.type]) acc[result.type].push(result);
10142                    return acc;
10143                }, {category: [], product: [], term: [], blog_post: []});
10144            }).catch((error) => {
10145                console.log(error);
10146            })
10147        },
10148
10149        formatOutput(text) {
10150            let value = text.replace(this.input, '<span class="font-normal">' + this.input + '</span>');
10151            const upperValue = this.input[0].toUpperCase() + this.input.substring(1);
10152            return value.replace(upperValue, '<span class="font-normal">' + upperValue + '</span>');
10153        }
10154    }));
10155})
10156</script>
vendor: 1 bytes, line 10156
10156
10157<script async src="//l.getsitecontrol.com/4m3x2om7.js"></script>
vendor: 1 bytes, line 10157
10157
10158<script type="text/json" id="default-section-data">
10159    {"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"}
10159,"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"}
10159,"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"}
10159,"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"}
10159,"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"}
10159,"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":1790262136},"captcha":[],"loggedAsCustomer":[],"persistent":[],"review":[],"wishlist":{"items":[]},"mwishlist":[],"ammessages":[],"rewards":[],"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":[],"ga4-datalayer":[],"meta_pixel_events":[],"openai_ads_events":[],"openai_ads_user":[],"pinterest_events":[]}</script>
10159
10160<section id="customer-drawer"
10161         x-data="initDrawer('#customer-menu')"
10162         @toggle-customer-panel.window="toggle(true)"
10163         x-bind="drawerListeners"
10164         :class="{ 'is-open': open }"
10165         x-cloak
10166         data-type="drawer"
10167>
10168<div class="backdrop hidden"
10169         @click="toggle(false)"
10170         aria-label="Close panel"
10171    ></div>
10172<div class="top-0"
10173         role="dialog"
10174         aria-modal="true"
10175         aria-describedby="customer-drawer-title"
10176    >
10177<div class="drawer-content">
10178<div class="absolute top-0 right-2">
10179<button @click="toggle(false)"
10180                        aria-label="Close panel"
10181                >
10182<span class="text-4xl">×</span>
10183</button>
10184</div>
10185<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto">
10186<header>
10187<p id="customer-drawer-title"
10188                       class="flex items-center gap-2 text-lg font-bold"
10189                    >
10190<svg class="w-8 h-8 p-1"><use xlink:href="#account-symbol"></use></svg>
10191Mon compte                    </p>
10192</header>
10193<!-- BLOCK customer-drawer.navigation --><div id="hello-customer"
10194     class="block account-nav my-4"
10195>
10196<p>
10197Bonjour <span x-text="$store.customer.fullName"></span>
10198</p>
10199
10200<nav x-data
10201         class="flex flex-col border-t border-primary-lighter py-4 gap-4"
10202    >
10203<ul class="flex flex-col gap-2"><li :class="{'active': location.pathname === '/customer/account/'}"
10204>
10205<a href="https://www.jardindupicvert.com/customer/account/">
10206<span>Mon espace client</span>
10207<span class="go">&rarr;</span>
10208</a>
10209</li>
10210<li :class="{'active': 0 === location.pathname.indexOf('/mwishlist/')}">
10211<a href="https://www.jardindupicvert.com/mwishlist/">
10212<span>Mes produits favoris</span>
10213<span x-show="0 !== location.pathname.indexOf('/mwishlist/')">&rarr;</span>
10214</a>
10215</li>
10216<li :class="{'active': location.pathname === '/sales/order/history/'}">
10217<a href="https://www.jardindupicvert.com/sales/order/history/">
10218<span>Suivre mes commandes</span>
10219<span class="go">&rarr;</span>
10220</a>
10221</li>
10222<li :class="{'active': location.pathname === '/contact/'}">
10223<a href="https://www.jardindupicvert.com/contact/">
10224<span>Contacter le service client</span>
10225<span class="go">&rarr;</span>
10226</a>
10227</li>
10228<li class="mt-2 pt-4 border-primary-lighter border-t">
10229<a class="flex items-center !justify-start gap-2 text-alert"
10230       href="https://www.jardindupicvert.com/customer/account/logout/"
10231    >
10232<svg class="w-6 h-6"><use xlink:href="#logout-symbol"></use></svg>
10233<span>Déconnexion</span>
10234</a>
10235</li>
10236</ul>    </nav>
10237</div>
10238<!-- /BLOCK customer-drawer.navigation -->            </div>
10239</div>
10240</div>
10241</section>
10242<section id="amwishlist-drawer"
10243         x-data="initDrawer('#wishlist-menu')"
10244         @toggle-wishlist-panel.window="toggle(true)"
10245         x-bind="drawerListeners"
10246         x-defer="event:amwishlist-alpine-init"
10247         x-cloak
10248         :class="{ 'is-open': open }"
10249         data-type="drawer"
10250>
10251<div class="backdrop hidden"
10252         @click="toggle(false)"
10253         aria-label="Close panel"
10254    ></div>
10255<div class="top-0"
10256         role="dialog"
10257         aria-modal="true"
10258         aria-describedby="drawer-wishlist-title"
10259    >
10260<div class="drawer-content">
10261<div class="absolute top-0 right-2">
10262<button @click="toggle(false)"
10263                        aria-label="Close panel"
10264                >
10265<span class="text-4xl">&times;</span>
10266</button>
10267</div>
10268<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto">
10269<header>
10270<p id="drawer-wishlist-title"
10271                       class="flex items-center gap-2 text-lg font-bold"
10272                    >
10273<svg class="w-8 h-8 p-1"><use xlink:href="#heart-empty-symbol"></use></svg>
10274Mes listes de favoris                    </p>
10275</header>
10276<div class="my-8">
10277<p x-show="$store.amwishlist.lists.length === 1">
10278Vous avez une liste de favoris                    </p>
10279<p x-show="$store.amwishlist.lists.length > 1"
10280                       x-html="hyva.str(`Vous avez %1 listes de favoris`, $store.amwishlist.lists.length)">
10281</p>
10282<p class="flex items-center justify-end gap-1 text-xs">
10283<svg class="w-4 h-4">
10284                            <use xlink:href="#edit-symbol"></use>
10285                        </svg>
10286<a href="https://www.jardindupicvert.com/mwishlist/"
10287                           title="G&#xE9;rer&#x20;mes&#x20;listes&#x20;de&#x20;favoris"
10288                        >
10289G&#xE9;rer&#x20;mes&#x20;listes&#x20;de&#x20;favoris                        </a>
10290</p>
10291<ul class="flex flex-col h-full py-6 px-4 sm:px-6 bg-white overflow-y-auto">
10292<template x-for="list in $store.amwishlist.lists">
10293<li class="flex items-center gap-2">
10294<span class="w-4 h-4 rounded-full border border-border-lighter shrink-0"
10295                                      :style="'background-color: ' + list.color">
10296</span>
10297<a :href="'https://www.jardindupicvert.com/mwishlist/wishlist/index/wishlist_id/' + list.wishlist_id "
10298                                   class="u-text-ellipsis hover:underline cursor-pointer"
10299                                   title="Consulter"
10300                                >
10301<span x-text="list.name"></span>
10302</a>
10303</li>
10304</template>
10305</ul>
10306</div>
10307</div>
10308</div>
10309</div>
10310</section>
10311<script>
10312    function initCartDrawer() {
10313        return {
10314            loading: false,
10315            maxItemsToDisplay: 999,
10316            summaryCount: -1,
10317            showMergedCartMessage: true,
10318
10319            init() {
10320                window.addEventListener(
10321                    "private-content-loaded",
10322                    (event) => {
10323                        event.detail?.data?.cart?.items
10324                            && !window.location.pathname.startsWith('/checkout/cart')
10325                            && this.summaryCount !== -1
10326                            && this.summaryCount != event.detail.data.cart.summary_count
10327                            && window.dispatchEvent(new CustomEvent('toggle-cart-panel'));
10328                        this.summaryCount = event.detail?.data?.cart?.summary_count || 0;
10329                        this.showMergedCartMessage = event.detail?.data?.cart?.items?.some(i => i?.merged_qty > 0);
10330                    }
10331                );
10332            },
10333
10334            cartItems() {
10335                const items = Alpine.store('minicart').cart.items || [];
10336                if (this.maxItemsToDisplay > 0) {
10337                    return items.slice(0, this.maxItemsToDisplay);
10338                }
10339                return items;
10340            },
10341
10342            deleteItemFromCart(itemId) {
10343                this.loading = true;
10344                fetch(BASE_URL + 'checkout/sidebar/removeItem/', {
10345                    "headers": {
10346                        "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
10347                    },
10348                    "body": "form_key=" + hyva.getFormKey() + "&item_id=" + itemId,
10349                    "method": "POST",
10350                    "mode": "cors",
10351                    "credentials": "include"
10352                }).then(response => {
10353                    if (response.redirected) {
10354                        window.location.href = response.url;
10355                    } else if (response.ok) {
10356                        return response.json();
10357                    } else {
10358                        window?.dispatchMessages([{
10359                            type: 'error',
10360                            text: 'Impossible\u0020de\u0020supprimer\u0020cet\u0020article\u0020du\u0020panier.'
10361                        }]);
10362                    }
10363                }).then(result => {
10364                    window?.dispatchMessages([{
10365                        type: result.success ? 'success' : 'error',
10366                        text: result.success
10367                            ? 'Article\u0020retir\u00E9\u0020du\u0020panier.'
10368                            : result.error_message
10369                    }], result.success ? 5000 : 0)
10370                    window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
10371                }).finally(() => {
10372                    this.loading = false;
10373                });
10374            }
10375        }
10376    }
10377</script>
10377
10378<section id="cart-drawer"
10379         x-data="{ ...initDrawer('#cart-menu'), ...initCartDrawer() }"
10380         @toggle-cart-panel.window="toggle(true)"
10381         @keydown.window.escape="toggle(false)"
10382         @close-merged-cart-popup.window="showMergedCartMessage = false"
10383         x-bind="drawerListeners"
10384         :class="{ 'is-open': open }"
10385         x-cloak
10386         data-type="drawer"
10387>
10388<template x-if="$store?.minicart?.cart?.items">
10389<div>
10390<div class="backdrop hidden"
10391                 @click="toggle(false)"
10392                 aria-label="Close panel"
10393            ></div>
10394<div class="top-0"
10395                 role="dialog"
10396                 aria-labelledby="cart-drawer-title"
10397                 aria-modal="true"
10398            >
10399<div class="drawer-content">
10400<div class="absolute top-0 right-2">
10401<button @click="toggle(false)"
10402                                aria-label="Close panel"
10403                        >
10404<span class="text-4xl">&times;</span>
10405</button>
10406</div>
10407<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto"
10408                         :class="{ 'u-loader': loading }"
10409                    >
10410<header>
10411<p id="cart-drawer-title"
10412                               class="flex items-center gap-2 text-lg font-bold"
10413                            >
10414<svg class="w-8 h-8 p-1"><use xlink:href="#basket-symbol"></use></svg>
10415Mon panier                                <span class="items-total text-xs"
10416                                      x-show="$store?.minicart.cart.items.length && maxItemsToDisplay && maxItemsToDisplay < $store.minicart.cart.items.length"
10417                                      x-text="hyva.strf('(%0 sur %1)', maxItemsToDisplay, $store.minicart.cart.items.length)">
10418</span>
10419</p>
10420</header>
10421<div x-show="showMergedCartMessage"
10422                             x-cloak
10423                             class="p-2 border-2 rounded-lg text-xs leading-tight"
10424                        >
10425Nous avons fusionné vos paniers !                            Les articles mis au panier lors d&#039;une précédente visite ont été récupérés.                        </div>
10426<div class="relative grid gap-2 overflow-y-auto bg-white border-b border-container">
10427<div x-show="!$store.minicart.cart.summary_count">
10428<p>Votre panier est vide.</p>
10429</div>
10430<template x-for="item in cartItems()">
10431<div class="grid grid-cols-4 gap-2 p-2 text-sm md:text-base border-2"
10432                                     :class="showMergedCartMessage && item.merged_qty > 0 ? 'rounded-lg' : 'border-white'"
10433                                >
10434<a :href="item.product_url"
10435                                       class="col-start-1 col-end-2"
10436                                    >
10437<img :src="item.product_image.src"
10438                                             :width="item.product_image.width"
10439                                             :height="item.product_image.height"
10440                                             :alt="item.product_name"
10441                                             loading="lazy"
10442
10443                                        />
10444</a>
10445<div class="col-span-2">
10446<div>
10447<p class="leading-tight font-bold">
10448<a :href="item.product_url">
10449<span x-html="item.product_name"></span>
10450</a>
10451</p>
10452<p x-html="item.product_conditionnement"
10453                                               class="text-xs"
10454                                            ></p>
10455<p class="text-xs">
10456Quantité: <span x-html="item.qty"></span>
10457</p>
10458</div>
10459</div>
10460<div class="col-start-4">
10461<div class="flex flex-col justify-end mb-2">
10462<p class="text-right font-bold">
10463<span x-html="item.product_price"></span>
10464</p>
10465<div class="flex items-center justify-end gap-2">
10466<button class="inline-flex"
10467                                                        @click="deleteItemFromCart(item.item_id)"
10468                                                        title="Supprimer"
10469                                                >
10470<svg class="w-5 h-5">
10471                                                        <use xlink:href="#delete-symbol"></use>
10472                                                    </svg>
10473</button>
10474</div>
10475</div>
10476</div>
10477</div>
10478</template>
10479</div>
10480<div x-show="$store.minicart.cart.summary_count"
10481                             class="relative bg-white"
10482                        >
10483<div class="flex items-center justify-between my-4 py-2 border-t border-border-light font-bold">
10484<span>Total panier</span>
10485<span x-html="$store.minicart.cart.subtotal"></span>
10486</div>
10487<div class="mb-4 text-center">
10488<a href="https://www.jardindupicvert.com/checkout/cart/"
10489                                   class="inline-flex btn btn-primary xs:btn-size-lg"
10490                                >
10491Voir le panier et commander                                </a>
10492</div>
10493<p @click.prevent="toggle(false)"
10494                               class="text-sm xs:text-base text-center underline cursor-pointer"
10495                            >
10496Continuer mes achats                            </p>
10497</div>
10498</div>
10499</div>
10500</div>
10501</div>
10502</template>
10503</section>
10504<!-- BLOCK authentication-popup -->
10504<script>
10505    function initAuthentication() {
10506        return {
10507            loading: false,
10508            errors: 0,
10509            hasCaptchaToken: 0,
10510            errorMessage: '',
10511            showPassword: false,
10512            username: '',
10513            password: '',
10514            request: null, /**
10515             {
10516                text: contextual text to output in panel,
10517                callback: function to be called after successful login,
10518                url: redirect url after successful login
10519             }
10520             */
10521
10522            submitForm: function () {
10523                // Do not rename $form, the variable is expected to be declared in the recaptcha output
10524                const $form = document.querySelector('#login-form');
10525                    if (!this.hasCaptchaToken) {
10526        this.errors = 1;
10527
10528        const lockSubmitButton = () => {
10529            $form.querySelector('[type="submit"]')?.setAttribute('disabled', true);
10530        };
10531
10532        const failCaptcha = (errorMessage, exception = null) => {
10533            this.errors = 1;
10534            lockSubmitButton();
10535
10536            if (this.setErrorMessages) {
10537                this.setErrorMessages([errorMessage]);
10538                this.displayErrorMessage = true;
10539            } else {
10540                window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000);
10541            }
10542
10543            if (exception) {
10544                console.error(
10545                    exception ||
10546                    'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?'
10547                );
10548            }
10549        };
10550
10551        const executeGreCaptcha = () => {
10552            grecaptcha.ready(() => {
10553                grecaptcha.execute(
10554                    '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV',
10555                    {action: 'submit'}
10556                ).then((token) => {
10557                    const tokenElement = $form['g\u002Drecaptcha\u002Dresponse'];
10558
10559                    if (tokenElement && token && token.length > 0) {
10560                        $form['g\u002Drecaptcha\u002Dresponse'].value = token;
10561                        this.errors = 0;
10562                        this.hasCaptchaToken = 1;
10563                        (this.submitForm || $form.submit).call(this);
10564                    } else {
10565                        failCaptcha(
10566                            tokenElement
10567                                ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
10568                                : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.'
10569                        );
10570                    }
10571                }).catch((exception) => {
10572                    failCaptcha(
10573                        'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.',
10574                        exception
10575                    );
10576                });
10577            });
10578        };
10579
10580        if (window.grecaptcha) {
10581            executeGreCaptcha();
10582        } else {
10583            const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV";
10584            const script = document.createElement('script');
10585            script.setAttribute('type', 'text/javascript');
10586            script.setAttribute('src', recaptchaUrl);
10587            document.head.appendChild(script);
10588
10589            script.addEventListener("load", executeGreCaptcha, false);
10590        }
10591    }
10592                if (this.errors === 0) {
10593                    this.dispatchLoginRequest($form);
10594                }
10595            },
10596
10597            toggleAuthentication(request) {
10598                this.request = request;
10599                Alpine.store('customer')?.isLoggedIn ? this.redirectIfAuthenticated() : this.toggle(true);
10600            },
10601
10602            redirectIfAuthenticated: function() {
10603                window.dispatchEvent(new CustomEvent("reload-customer-section-data"));
10604                if (this.request?.callback && typeof this.request.callback === 'function') {
10605                    this.request.callback();
10606                } else if (this.request?.url) {
10607                    if (location.pathname.startsWith('/checkout/cart')) {
10608                        // If login from cart, redirect to checkout after login
10609                        this.request.url = 'https://www.jardindupicvert.com/checkout/';
10610                    }
10611                    window.location.href = this.request.url;
10612                } else {
10613                    window.location.reload();
10614                }
10615                this.toggle(false);
10616            },
10617
10618            resetErrors() {
10619                this.errors = 0;
10620            },
10621
10622            dispatchLoginRequest: function(form) {
10623                this.loading = true;
10624                this.errorMessage = '';
10625                const bodyFields = {
10626                    'username': this.username,
10627                    'password': this.password,
10628                    'formKey': hyva.getFormKey()
10629                };
10630                                const fieldName = 'g\u002Drecaptcha\u002Dresponse';
10631                const recaptchaField = fieldName && form[fieldName];
10632                if (recaptchaField) {
10633                    bodyFields[fieldName] = recaptchaField.value;
10634                }
10635                fetch('https://www.jardindupicvert.com/customer/ajax/login/', {
10636                        method: 'POST',
10637                        headers: {
10638                            'Content-Type': 'application/json',
10639                            'X-Requested-With': 'XMLHttpRequest'
10640                        },
10641                        body: JSON.stringify(bodyFields)
10642                    }
10643                ).then(response => {
10644                        return response.json()
10645                    }
10646                ).then(data=> {
10647                        if (data.errors) {
10648                            this.errorMessage = data.message;
10649                            this.errors = 1;
10650                            this.hasCaptchaToken = 0;
10651                        } else {
10652                            this.redirectIfAuthenticated();
10653                        }
10654                    }
10655                ).finally(() => {
10656                    this.loading = false;
10657                    this.request = null;
10658                });
10659            }
10660        }
10661    }
10662
10663    function initAutoLogin() {
10664        return {
10665            init: function () {
10666                window?.AUTO_LOGIN_MESSAGE && window.dispatchEvent(
10667                    new CustomEvent(
10668                        'toggle-authentication',
10669                        {
10670                            detail: {
10671                                url: window.location.href,
10672                                text: window.AUTO_LOGIN_MESSAGE
10673                            }
10674                        }
10675                    )
10676                )
10677            }
10678        }
10679    }
10680</script>
10680
10681<section id="authentication-popup"
10682         x-data="{ ...initDrawer('#customer-menu'), ...initAuthentication() }"
10683         @toggle-authentication.window="toggleAuthentication($event?.detail)"
10684         @keydown.window.escape="toggle(false)"
10685         :class="{'is-open': open}"
10686         x-cloak
10687         data-type="drawer"
10688>
10689<div class="backdrop hidden"
10690         @click="toggle(false)"
10691         aria-label="Close panel"
10692    ></div>
10693<div x-data="initAutoLogin()"
10694         role="dialog"
10695         class="top-0"
10696    >
10697<div class="drawer-content">
10698<div class="absolute top-0 right-2">
10699<button @click="toggle(false)"
10700                        aria-label="Close panel"
10701                >
10702<span class="text-4xl">×</span>
10703</button>
10704</div>
10705<div class="h-full p-4 sm:px-6 bg-white overflow-y-auto"
10706                 :class="{ 'u-loader': loading }"
10707            >
10708<header>
10709<p id="authentication-title"
10710                       class="flex items-center gap-2 text-lg font-bold"
10711                    >
10712<svg class="w-8 h-8 p-1"><use xlink:href="#account-symbol"></use></svg>
10713Connexion / Inscription                    </p>
10714<p class="leading-tight italic text-sm"
10715                       x-html="request?.text || ''"></p>
10716</header>
10717<div class="block-customer-login">
10718<p class="my-4 font-bold text-lg">
10719Déjà client(e) ?                    </p>
10720<form class="form form-login pb-4"
10721                          method="post"
10722                          @submit.prevent="submitForm();"
10723                          id="login-form"
10724                    >
10725<div class="control">
10726<input type="hidden"
10727           value=""
10728           name="g-recaptcha-response"
10729    >
10730</div>
10731<div class="fieldset login">
10732<div class="form-field field email required">
10733<label class="label" for="customer-email">
10734<span>Adresse email <sup>*</sup></span>
10735</label>
10736<div class="control">
10737<input name="username"
10738                                           x-model="username"
10739                                           @keyup="errorMessage = ''"
10740                                           @change="resetErrors"
10741                                           type="email"
10742                                           required
10743                                           class="form-input input-text"
10744                                    >
10745</div>
10746</div>
10747<div class="form-field password required">
10748<label for="pass"
10749                                       class="label"
10750                                >
10751<span>Mot de passe <sup>*</sup></span>
10752</label>
10753<div class="control relative">
10754<input name="password"
10755                                           x-model="password"
10756                                           :type="showPassword ? 'text' : 'password'"
10757                                           class="form-input input-text"
10758                                           required
10759                                           @keyup="errorMessage = ''"
10760                                           @change="resetErrors"
10761                                    >
10762<svg @click.prevent="showPassword = !showPassword"
10763                                         class="w-6 h-6 absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer"
10764                                         :class="{ 'text-primary-light': !showPassword, 'text-primary-lighter': showPassword }"
10765                                    >
10766                                        <use xlink:href="#view-symbol"></use>
10767                                    </svg>
10768</div>
10769</div>
10770<p x-show="errorMessage"
10771                               class="flex items-center gap-1 mt-1 text-sm text-alert"
10772                            >
10773<span class="text-alert font-bold text-xl">&#9888;</span>
10774<span x-text="errorMessage"></span>
10775</p>
10776<input name="context" type="hidden" value="checkout" />
10777<div class="actions flex justify-between pt-6 pb-2 items-center">
10778<button type="submit"
10779                                        class="inline-flex btn btn-primary"
10780                                        :disabled="!username || !password || (errorMessage != '')"
10781                                >
10782Me connecter                                </button>
10783<a href="https://www.jardindupicvert.com/customer/account/forgotpassword/"
10784                                   class="text-xs italic hover:underline"
10785                                >
10786Mot de passe oublié ?                                </a>
10787</div>
10788</div>
10789</form>
10790</div>
10791<div class="mx-4">
10792<p class="my-4 text-2xs text-center leading-tight">
10793<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>
10794</p>
10795</div>
10796<div class="block-new-customer">
10797<p class="py-4 font-bold text-lg">
10798Pas encore client(e) ?                    </p>
10799<div class="block-content">
10800<p class="mb-1 text-sm">
10801Créez votre compte client pour passer commande sur notre site.                        </p>
10802<div class="actions flex justify-between mt-6 mb-2 items-center">
10803<a href="https://www.jardindupicvert.com/customer/account/login/"
10804                               class="inline-flex btn btn-primary"
10805                            >
10806Créer un compte                            </a>
10807</div>
10808</div>
10809</div>
10810</div>
10811</div>
10812</div>
10813</section>
10814<!-- /BLOCK authentication-popup --></div></body>
10815</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.