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&family=Quicksand:wght@400;700&display=swap" 959 as="style" 960 > 961<link href="https://fonts.googleapis.com/css2?family=Lora:wght@400;700&family=Quicksand:wght@400;700&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 notre 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'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'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'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'autres sites Web. Ils ne stockent pas directement des données personnelles, mais sont basés sur l'identification unique de votre navigateur et de votre appareil Internet. Si vous n'
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 'Google Ads Optimization' 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'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'intégrité et la sécurité de votre session lors de l'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'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'utilisateur afin de personnaliser l'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'interaction de l'utilisateur avec le site Web, telles que les publicités qu'il a vues et les actions qu'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'état de la session de l'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'état de la session de l'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'interaction de l'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'utilisateur et aide à personnaliser l'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 & 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'évaluer le nombre de visites et l'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'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'
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 flex-wrap md:flex-nowrap items-center justify-between gap-y-1 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 >≡</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 to Home 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 inline-flex items-start justify-center gap-2 order-4 md:order-2 grow w-full lg: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≡ 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 w-10 h-10 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 pl-8 pr-4 py-2 border border-dark text-sm leading-normal italic" 2757 autocapitalize="off" 2758 autocomplete="off" 2759 autocorrect="off" 2760 name="q" 2761 placeholder="Que cherchez-vous ?" 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 par 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 items-center justify-end gap-1 xs:gap-2 sm:gap-4 xl:gap-8 order-3 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 listes de 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 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 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">×</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 vivaces :  tous les 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 nos vivaces :  tous les 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é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émones du 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é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é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è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 herbacé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ées :  tous les 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é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 aux é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 des 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 de 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 de la 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 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 fougè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 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 vivaces par utilisation :  tous les 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 vivaces à floraison printaniè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 vivaces à floraison 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 vivaces à floraison 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 vivaces à floraison 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 vivaces d'ombre" 3549 class="u-text-ellipsis 3550 " 3551 style="" 3552 > 3553<span data-node-title> 3554Plantes vivaces d'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 vivaces 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 vivaces parfumé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 vivaces gé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 vivaces à feuillage 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 vivaces en grands 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 :  tous les 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 nos arbustes :  tous les 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é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è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="Érables du 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 du 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é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 par utilisation :  tous les 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 à floraison printaniè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 à floraison 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 à floraison 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 à floraison 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 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 parfumé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 à feuillage panaché" 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 à feuillage 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 de terre de bruyè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 pour les 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ères nains et petits conifè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 :  tous les 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 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 non traç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 :  tous les 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 nos arbres :  tous les 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ê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="É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ê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 conifères :  tous les 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èdres du 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ès d'Italie" 4410 class="u-text-ellipsis 4411 " 4412 style="" 4413 > 4414<span data-node-title> 4415Cyprès d'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ès de 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ès de 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="Épicé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é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 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 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 arbres par utilisation :  tous les 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 à écorce 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 parfumé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 à feuillage panaché" 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 à feuillage 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 méditerrané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 et petits fruits :  tous les 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 nos fruitiers :  tous les 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â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êchers - 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 - 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 à petits fruits :  tous les 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û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 - 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 nains et à port 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 potagè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 de 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 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 d'ornement" 5053 class="u-text-ellipsis 5054 " 5055 style="" 5056 > 5057<span data-node-title> 5058Potager d'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 grimpantes :  tous les 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 nos plantes grimpantes :  tous les 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é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è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é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 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 étoilé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 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 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 grimpantes par utilisation :  tous les 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 grimpantes à floraison printaniè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 grimpantes à floraison 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 grimpantes à floraison 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 grimpantes à floraison 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 grimpantes à feuillage 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 grimpantes parfumé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 grimpantes d'ombre" 5407 class="u-text-ellipsis 5408 " 5409 style="" 5410 > 5411<span data-node-title> 5412Plantes grimpantes d'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 :  tous les 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 à grandes fleurs :  tous les 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 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 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 Thé 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 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 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 anciens :  tous les 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 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 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 de 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 de 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 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 à massifs :  tous les 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 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 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 Dé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 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 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 et semences :  tous les 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 à floraison printanière :  tous les 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 de 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 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 d'ornement" 5898 class="u-text-ellipsis 5899 " 5900 style="" 5901 > 5902<span data-node-title> 5903Aulx d'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 à floraison estivale :  tous les 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 
5942- 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é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ï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 graines de 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 et semences potagères :  tous les 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 de 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, ails et é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 PLANTES EN 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">≡</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: #55011d; 6335 color: #FFFFFF " 6336> 6337<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/fruitiers-a-coques?promo&availability=Disponibles+uniquement" 6338 title="En ce moment : Profitez des fruitiers à coques à -30% !" 6339 data-ga4-promo-id="banner_shop" 6340 data-ga4-promo-name="En ce moment : Profitez des fruitiers à coques à -30% !" 6341 data-ga4-promo-creative="shop" 6342 data-ga4-promo-position="header" 6343 > 6344<div class="text-2xs sm:text-sm xl: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 à la page d’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× 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=" text-3xl lg:text-4xl font-bold text-center 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">★★★★★</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'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 adresse 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'inscris → 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'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">→</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/')">→</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">→</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">→</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">×</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érer mes listes de favoris" 10288 > 10289Gérer mes listes de 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">×</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'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">⚠</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'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.