1<!doctype html> 2<html lang="fr"> 3<head > 4<meta charset="utf-8"/> 5<meta name="title" content="Mentions légales (PV)"/> 6<meta name="description" content="Mentions légales"/> 7<meta name="robots" content="INDEX,FOLLOW"/> 8<meta name="viewport" content="width=device-width, initial-scale=1"/> 9<title>Mentions légales (PV)</title> 10<link rel="stylesheet" type="text/css" media="all" href="https://www.jardindupicvert.com/static/version1790796154/_cache/merged/b6ca73420e067085fafe23cb8c29a433.min.css" />
11<script type="text/javascript" defer="true" src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_AiChatbot/js/chat-core.min.js"></script>
vendor: 1 bytes, line 11
11
12<script type="text/javascript" defer="true" src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_AiChatbot/js/hyva-chat.min.js"></script>
12 13<link rel="canonical" href="https://www.jardindupicvert.com/mentions-legales" /> 14<link rel="icon" type="image/x-icon" href="https://www.jardindupicvert.com/media/favicon/stores/7/favicon-32x32.png" /> 15<link rel="shortcut icon" type="image/x-icon" href="https://www.jardindupicvert.com/media/favicon/stores/7/favicon-32x32.png" /> 16<meta name="google-site-verification" content="VIZKD3g2ECUvs8jeLlJrBqc2GZmNoaNzMIRBFlb2ivo" />
16<script> 17(function () { 18 // Runs before any cookie bar decides what to display, Luma or Hyva alike. An answer given 19 // for a previous set of cookie groups no longer means anything: drop it so the bar returns. 20 var VERSION_COOKIE = 'gdpr_cookie_consent_version'; 21 var VERSION = '1'; 22 23 function read(name) { 24 var match = document.cookie.match('(?:^|; )' + name + '=([^;]*)'); 25 return match ? decodeURIComponent(match[1]) : ''; 26 } 27 28 if (!VERSION || read(VERSION_COOKIE) === VERSION) { 29 return; 30 } 31 32 ['gdpr_cookie_consent', 33 'gdpr_cookie_groups'].forEach(function (name) { 34 document.cookie = name + '=; Max-Age=0; path=/'; 35 document.cookie = name + '=; Max-Age=0; path=/; domain=' + document.location.hostname; 36 document.cookie = name + '=; Max-Age=0; path=/; domain=.' + document.location.hostname.replace(/^www\./, ''); 37 }); 38})(); 39 40window.pdfConsent = window.pdfConsent || (function () { 41 var GROUPS_COOKIE = 'gdpr_cookie_groups'; 42 var SETTLE_MS = 8000; 43 var callbacks = [], timer = null, settleTimer = null, last = null; 44 45 function read(name) { 46 var match = document.cookie.match('(?:^|; )' + name + '=([^;]*)'); 47 return match ? decodeURIComponent(match[1]) : ''; 48 } 49 50 function allowedGroups() { 51 return read(GROUPS_COOKIE).split(',').map(function (id) { 52 return id.trim(); 53 }).filter(Boolean); 54 } 55 56 function start(settleMs) { 57 if (!timer) { 58 last = read(GROUPS_COOKIE); 59 timer = setInterval(tick, 1000); 60 } 61 if (settleTimer) { 62 clearTimeout(settleTimer); 63 settleTimer = null; 64 } 65 if (settleMs) { 66 settleTimer = setTimeout(stop, settleMs); 67 } 68 } 69 70 function stop() { 71 if (timer) { 72 clearInterval(timer); 73 timer = null; 74 } 75 if (settleTimer) { 76 clearTimeout(settleTimer); 77 settleTimer = null; 78 } 79 } 80 81 function tick() { 82 var current = read(GROUPS_COOKIE); 83 if (current === last) { 84 return; 85 } 86 last = current; 87 callbacks = callbacks.filter(function (cb) { 88 return !cb(); 89 }); 90 // Cookie settled. Remaining callbacks stay for a later revoke; polling 91 // restarts only on mst-gdpr-cookie-settings-save. 92 stop(); 93 } 94 95 window.addEventListener('mst-gdpr-cookie-settings-save', function () { 96 start(SETTLE_MS); 97 }); 98 99 return { 100 allows: function (groupCsv) { 101 var need = String(groupCsv || '').split(',').map(function (id) { 102 return id.trim(); 103 }).filter(Boolean); 104 if (!need.length) { 105 return false; 106 } 107 var have = allowedGroups(); 108 // OU : un seul groupe consenti suffit. Les groupes Mirasvit sont rattachés à 109 // des ensembles de stores â un même type (analyse, marketingâ¦) existe en 110 // plusieurs exemplaires selon les langues. Le visiteur ne consent qu'aux 111 // groupes de son store, on liste donc tous les IDs d'un type et on déclenche 112 // dès que l'un d'eux est présent. 113 return need.some(function (id) { 114 return have.indexOf(id) !== -1; 115 }); 116 }, 117 onChange: function (cb) { 118 callbacks.push(cb); 119 // First visit: no groups cookie yet, poll until the visitor decides. 120 if (!read(GROUPS_COOKIE)) { 121 start(); 122 } 123 } 124 }; 125})(); 126</script>
126 127<link rel="preconnect" href="https://www.googletagmanager.com">
128<script type="application/json" id="webcooking-gtm-config"> 129 {"containerId":"GTM-MBDD62PX","loaderUrl":"https:\/\/www.googletagmanager.com","serverContainerUrl":"","consent":{"cookieName":"gdpr_cookie_groups","analyticsValue":"3","marketingValue":"2","waitForUpdate":500},"events":{"search":false,"filters":true,"timeOnPage":[],"navigation":[]}}</script>
vendor: 1 bytes, line 129
129
130<script type="application/json" id="webcooking-gtm-datalayer"> 131 [{"page_type":"cms","env_currency":"eur","env_language":"fr-fr","env_date":"02\/10\/2026","env_work":"production"}]</script>
vendor: 1 bytes, line 131
131
132<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/consent.min.js"></script>
vendor: 1 bytes, line 132
132
133<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/datalayer.min.js"></script>
vendor: 1 bytes, line 133
133
134<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/events.min.js"></script>
vendor: 1 bytes, line 134
134
135<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/impressions.min.js"></script>
vendor: 1 bytes, line 135
135
136<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/search.min.js"></script>
vendor: 1 bytes, line 136
136
137<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/engagement.min.js"></script>
vendor: 1 bytes, line 137
137
138<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/navigation.min.js"></script>
vendor: 1 bytes, line 138
138
139<script src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Webcooking_GoogleTagManager/js/bootstrap.min.js"></script>
139 140 141 142<!--Custom Style--> 143<!-- glopal_head -->
144<script> 145// <![CDATA[ 146var _webinterpret = _webinterpret || {}; 147_webinterpret.plugin_version = 'magento2-1.21.1'; 148_webinterpret.page_store_view_id = '7'; 149_webinterpret.page_short_name = 'jardindupicvert'; 150// ]]> 151</script>
vendor: 1 bytes, line 151
151
152<script async type="text/javascript" src="https://cdn-redirector.glopal.com/common/js/webinterpret-loader.js"></script>
152 153<!-- end glopal_head -->
154<script> 155 var BASE_URL = 'https://www.jardindupicvert.com/'; 156 var THEME_PATH = 'https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR'; 157 var COOKIE_CONFIG = { 158 "expires": null, 159 "path": "\u002F", 160 "domain": ".www.jardindupicvert.com", 161 "secure": true, 162 "lifetime": "86400", 163 "cookie_restriction_enabled": false }; 164 var CURRENT_STORE_CODE = 'picvert_store'; 165 var CURRENT_WEBSITE_ID = '7'; 166 167 window.hyva = window.hyva || {} 168 169 window.cookie_consent_groups = window.cookie_consent_groups || {} 170 window.cookie_consent_groups['necessary'] = true; 171 172 window.cookie_consent_config = window.cookie_consent_config || {}; 173 window.cookie_consent_config['necessary'] = [].concat( 174 window.cookie_consent_config['necessary'] || [], 175 [ 176 'user_allowed_save_cookie', 177 'form_key', 178 'mage-messages', 179 'private_content_version', 180 'mage-cache-sessid', 181 'last_visited_store', 182 'section_data_ids' 183 ] 184 ); 185 //# sourceURL=hyva-variables.js 186</script>
vendor: 1 bytes, line 186
186
187<script> 188 (function( hyva, undefined ) { 189 190 function lifetimeToExpires(options, defaults) { 191 192 const lifetime = options.lifetime || defaults.lifetime; 193 194 if (lifetime) { 195 const date = new Date; 196 date.setTime(date.getTime() + lifetime * 1000); 197 return date; 198 } 199 200 return null; 201 } 202 203 function generateRandomString() { 204 205 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 206 length = 16; 207 208 let formKey = '', 209 charactersLength = allowedCharacters.length; 210 211 for (let i = 0; i < length; i++) { 212 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 213 } 214 215 return formKey; 216 } 217 218 const sessionCookieMarker = {noLifetime: true} 219 220 const cookieTempStorage = {}; 221 222 const internalCookie = { 223 get(name) { 224 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 225 return v ? v[2] : null; 226 }, 227 set(name, value, days, skipSetDomain) { 228 let expires, 229 path, 230 domain, 231 secure, 232 samesite; 233 234 const defaultCookieConfig = { 235 expires: null, 236 path: '/', 237 domain: null, 238 secure: false, 239 lifetime: null, 240 samesite: 'lax' 241 }; 242 243 const cookieConfig = window.COOKIE_CONFIG || {}; 244 245 expires = days && days !== sessionCookieMarker 246 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 247 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 248 249 path = cookieConfig.path || defaultCookieConfig.path; 250 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 251 secure = cookieConfig.secure || defaultCookieConfig.secure; 252 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 253 254 document.cookie = name + "=" + encodeURIComponent(value) + 255 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 256 (path ? '; path=' + path : '') + 257 (domain ? '; domain=' + domain : '') + 258 (secure ? '; secure' : '') + 259 (samesite ? '; samesite=' + samesite : 'lax'); 260 }, 261 isWebsiteAllowedToSaveCookie() { 262 const allowedCookies = this.get('user_allowed_save_cookie'); 263 if (allowedCookies) { 264 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 265 266 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 267 } 268 return false; 269 }, 270 getGroupByCookieName(name) { 271 const cookieConsentConfig = window.cookie_consent_config || {}; 272 let group = null; 273 for (let prop in cookieConsentConfig) { 274 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 275 if (cookieConsentConfig[prop].includes(name)) { 276 group = prop; 277 break; 278 } 279 } 280 return group; 281 }, 282 isCookieAllowed(name) { 283 const cookieGroup = this.getGroupByCookieName(name); 284 return cookieGroup 285 ? window.cookie_consent_groups[cookieGroup] 286 : this.isWebsiteAllowedToSaveCookie(); 287 }, 288 saveTempStorageCookies() { 289 for (const [name, data] of Object.entries(cookieTempStorage)) { 290 if (this.isCookieAllowed(name)) { 291 this.set(name, data['value'], data['days'], data['skipSetDomain']); 292 delete cookieTempStorage[name]; 293 } 294 } 295 } 296 }; 297 298 hyva.getCookie = (name) => { 299 const cookieConfig = window.COOKIE_CONFIG || {}; 300 301 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 302 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 303 } 304 305 return internalCookie.get(name); 306 } 307 308 hyva.setCookie = (name, value, days, skipSetDomain) => { 309 const cookieConfig = window.COOKIE_CONFIG || {}; 310 311 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 312 cookieTempStorage[name] = {value, days, skipSetDomain}; 313 return; 314 } 315 return internalCookie.set(name, value, days, skipSetDomain); 316 } 317 318 319 hyva.setSessionCookie = (name, value, skipSetDomain) => { 320 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 321 } 322 323 hyva.getBrowserStorage = () => { 324 const browserStorage = window.localStorage || window.sessionStorage; 325 if (!browserStorage) { 326 console.warn('Browser Storage is unavailable'); 327 return false;
328 } 329 try { 330 browserStorage.setItem('storage_test', '1'); 331 browserStorage.removeItem('storage_test'); 332 } catch (error) { 333 console.warn('Browser Storage is not accessible', error); 334 return false; 335 } 336 return browserStorage; 337 } 338 339 hyva.postForm = (postParams) => { 340 const form = document.createElement("form"); 341 342 let data = postParams.data; 343 344 if (! postParams.skipUenc && ! data.uenc) { 345 data.uenc = btoa(window.location.href); 346 } 347 form.method = "POST"; 348 form.action = postParams.action; 349 350 Object.keys(postParams.data).map(key => { 351 const field = document.createElement("input"); 352 field.type = 'hidden' 353 field.value = postParams.data[key]; 354 field.name = key; 355 form.appendChild(field); 356 }); 357 358 const form_key = document.createElement("input"); 359 form_key.type = 'hidden'; 360 form_key.value = hyva.getFormKey(); 361 form_key.name="form_key"; 362 form.appendChild(form_key); 363 364 document.body.appendChild(form); 365 366 form.submit(); 367 } 368 369 hyva.getFormKey = function () { 370 let formKey = hyva.getCookie('form_key'); 371 372 if (!formKey) { 373 formKey = generateRandomString(); 374 hyva.setCookie('form_key', formKey); 375 } 376 377 return formKey; 378 } 379 380 hyva.formatPrice = (value, showSign, options = {}) => { 381 const groupSeparator = options.groupSeparator; 382 const decimalSeparator = options.decimalSeparator 383 delete options.groupSeparator; 384 delete options.decimalSeparator; 385 const formatter = new Intl.NumberFormat( 386 'fr\u002DFR', 387 Object.assign({ 388 style: 'currency', 389 currency: 'EUR', 390 signDisplay: showSign ? 'always' : 'auto' 391 }, options) 392 ); 393 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 394 formatter.formatToParts(value).map(({type, value}) => { 395 switch (type) { 396 case 'currency': 397 return '\u20AC' || value; 398 case 'minusSign': 399 return '- '; 400 case 'plusSign': 401 return '+ '; 402 case 'group': 403 return groupSeparator !== undefined ? groupSeparator : value; 404 case 'decimal': 405 return decimalSeparator !== undefined ? decimalSeparator : value; 406 default : 407 return value; 408 } 409 }).reduce((string, part) => string + part) : 410 formatter.format(value); 411 } 412 413 const formatStr = function (str, nStart) { 414 const args = Array.from(arguments).slice(2); 415 416 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 417 const idx = parseInt(n) - nStart; 418 419 if (args[idx] === null || args[idx] === void 0) { 420 return m; 421 } 422 return p.length % 2 423 ? p.slice(0, -1).replace('%%', '%') + args[idx] 424 : p.replace('%%', '%') + n; 425 }) 426 } 427 428 hyva.str = function (string) { 429 const args = Array.from(arguments); 430 args.splice(1, 0, 1); 431 432 return formatStr.apply(undefined, args); 433 } 434 435 hyva.strf = function () { 436 const args = Array.from(arguments); 437 args.splice(1, 0, 0); 438 439 return formatStr.apply(undefined, args); 440 } 441 442 /** 443 * Take a html string as `content` parameter and 444 * extract an element from the DOM to replace in 445 * the current page under the same selector, 446 * defined by `targetSelector` 447 */ 448 hyva.replaceDomElement = (targetSelector, content) => { 449 // Parse the content and extract the DOM node using the `targetSelector` 450 const parser = new DOMParser(); 451 const doc = parser.parseFromString(content, 'text/html');
452 const contentNode = doc.querySelector(targetSelector); 453 454 // Bail if content or target can't be found 455 if (!contentNode || !document.querySelector(targetSelector)) { 456 return; 457 } 458 459 hyva.activateScripts(contentNode); 460 461 // Replace the old DOM node with the new content 462 document.querySelector(targetSelector).replaceWith(contentNode); 463 464 // Reload customerSectionData and display cookie-messages if present 465 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 466 hyva.initMessages(); 467 } 468 469 hyva.removeScripts = (contentNode) => { 470 const scripts = contentNode.getElementsByTagName('script'); 471 for (let i = 0; i < scripts.length; i++) { 472 scripts[i].parentNode.removeChild(scripts[i]); 473 } 474 const templates = contentNode.getElementsByTagName('template'); 475 for (let i = 0; i < templates.length; i++) { 476 const container = document.createElement('div'); 477 container.innerHTML = templates[i].innerHTML; 478 hyva.removeScripts(container); 479 templates[i].innerHTML = container.innerHTML; 480 } 481 } 482 483 hyva.activateScripts = (contentNode) => { 484 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 485 const scripts = Array.from(contentNode.getElementsByTagName('script')); 486 487 // Iterate over all script tags to duplicate+inject each into the head 488 for (const original of scripts) { 489 const script = document.createElement('script'); 490 original.type && (script.type = original.type); 491 script.innerHTML = original.innerHTML; 492 493 // Remove the original (non-executing) script from the contentNode 494 original.parentNode.removeChild(original) 495 496 // Add script to head 497 document.head.appendChild(script); 498 } 499 500 return contentNode; 501 } 502 503 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 504 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 505 506 let currentTrap; 507 508 const focusableElements = (rootElement) => { 509 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 510 return Array.from(rootElement.querySelectorAll(selector)) 511 .filter(el => { 512 return el.style.display !== 'none' 513 && !el.disabled 514 && el.tabIndex !== -1 515 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 516 }) 517 } 518 519 const focusTrap = (e) => { 520 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 521 if (!isTabPressed) return; 522 523 const focusable = focusableElements(currentTrap) 524 const firstFocusableElement = focusable[0] 525 const lastFocusableElement = focusable[focusable.length - 1] 526 527 e.shiftKey 528 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 529 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 530 }; 531 532 hyva.releaseFocus = (rootElement) => { 533 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 534 currentTrap.removeEventListener('keydown', focusTrap) 535 currentTrap = null 536 } 537 } 538 hyva.trapFocus = (rootElement) => { 539 if (!rootElement) return; 540 hyva.releaseFocus() 541 currentTrap = rootElement 542 rootElement.addEventListener('keydown', focusTrap) 543 const firstElement = focusableElements(rootElement)[0] 544 firstElement && firstElement.focus() 545 } 546 547 hyva.safeParseNumber = (rawValue) => { 548 const number = rawValue ? parseFloat(rawValue) : null; 549 550 return Array.isArray(number) || isNaN(number) ? rawValue : number; 551 } 552 553 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 554 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 555 556 const camelCase = toCamelCase(name);
557 const key = '__hyva_bool_' + name 558 559 return new Proxy(Object.assign( 560 additionalMethods, 561 { 562 [key]: !!value, 563 [name]() {return !!this[key]}, 564 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 565 ['not' + camelCase]() {return !this[key]}, 566 ['toggle' + camelCase]() {this[key] = !this[key]}, 567 [`set${camelCase}True`]() {this[key] = true}, 568 [`set${camelCase}False`]() {this[key] = false}, 569 } 570 ), { 571 set(target, prop, value) { 572 return prop === name 573 ? (target[key] = !!value) 574 : Reflect.set(...arguments); 575 } 576 }) 577 } 578 579 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 580 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 581 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 582 583 }( window.hyva = window.hyva || {} )); 584 //# sourceURL=hyva.js 585</script>
585 586<base href="https://www.jardindupicvert.com/"> 587<link rel="preconnect" href="https://fonts.googleapis.com"> 588<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 589 590<link rel="preload" 591 href="https://fonts.googleapis.com/css2?family=Lora:wght@400;700&family=Quicksand:wght@400;700&display=swap" 592 as="style" 593 > 594<link href="https://fonts.googleapis.com/css2?family=Lora:wght@400;700&family=Quicksand:wght@400;700&display=swap" 595 rel="stylesheet" 596 media="print" 597 onload="this.onload=null;this.removeAttribute('media');" 598 > 599</head> 600<body id="html-body" class="cms-mentions-legales cms-page-view page-layout-1column">
vendor: 68 bytes, lines 600-601
600 601<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
601GTM-MBDD62PX
vendor: 88 bytes, lines 601-603
601" 602 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 603
604<script> 605 console.warn( 606 `Crisp chatbox is installed but not configured - 607 To enable the chatbox please login to your store as 608 admin then go to: Stores > Settings > Configuration 609 > Crisp > Settings and configure your Crisp websiteID.` 610 ); 611 </script>
611 612<div class="mst-gdpr-cookie-bar-wrapper" 613 id="gdprCookieBar" 614 x-data="initMstGdprCookieBar()" 615 x-init="initDisplay()" 616> 617<div class="fixed z-modal bottom-0 sm:bottom-4 left-0 sm:left-4 z-modal flex max-w-full sm:max-w-sm translate-y-full bg-container-darker text-white font-bold transition-transform duration-700 ease-out" 618 :class="{'opacity-70': isLoading, 'translate-y-0': isBarVisible, 'translate-y-full': !isBarVisible}" 619 > 620<div> 621<div class="flex flex-col items-center justify-center gap-2 lg:gap-8 p-8" 622 x-show="isBarVisible" 623 > 624<div class="absolute top-2 right-2"> 625<button @click="hide" 626 aria-label="Close panel" 627 > 628<svg class="w-4 h-4 text-white hover:text-primary-lighter"> 629 <use xlink:href="#close-symbol"></use> 630 </svg> 631</button> 632</div> 633<div class="consent-text text-sm"> 634<button 635 class="block ml-auto mr-0 mb-4 text-white underline " 636 data-trigger-settings="agree" 637 x-bind:class="{'opacity-0': isLoading}" 638 @click="handleDecline" 639 > 640<span>Continuer sans accepter</span> 641</button> 642Les cookies nous aident à vous offrir une expérience de navigation personnalisée et mesurer notre audience. Vous pouvez les paramétrer à tout moment et consulter notre politique de confidentialité. <p class="mb-4"> 643<a href="https://www.jardindupicvert.com/mentions-legales/" 644 class="underline" 645 title="Lire notre politique" 646 > 647Lire notre politique </a> 648</p> 649</div> 650 651<div class="mst-gdpr-buttons w-full flex flex-row items-center justify-around gap-2"> 652<button type="button" 653 class="grow action btn btn-secondary justify-center text-sm w-auto bg-white text-primary" 654 x-bind:class="{'opacity-0': isLoading}" 655 @click="openSettings"> 656<span>Paramétrer</span> 657</button> 658 659<button class="grow action btn btn-primary justify-center text-sm w-auto bg-white text-primary" 660 data-trigger-settings="agree" 661 x-bind:class="{'opacity-0': isLoading}" 662 @click="handleAllow(1)"><span>Accepter</span></button> 663 664</div> 665</div> 666</div> 667<div class="mst-gdpr-cookie-bar-overlay bg-white fixed h-full left-0 opacity-60 top-0 w-full z-40" 668 style="display: none" 669 id="gdprCookieBarOverlay" x-show="isScreenLocked" 670 > 671</div> 672</div> 673</div>
674<script> 675 function initMstGdprCookieBar() { 676 'use strict'; 677 const cookieGroupName = 'gdpr_cookie_groups'; 678 const consentCookieName = 'gdpr_cookie_consent' 679 680 return { 681 isLoading: false, 682 isBarVisible: false, 683 isScreenLocked: false, 684 initDisplay: function () { 685 !hyva.getCookie(cookieGroupName) || !hyva.getCookie(consentCookieName) 686 ? this.show() 687 : this.hide(); 688 window.addEventListener('mst-gdpr-cookie-settings-save', () => { 689 this.handleAllow(); 690 }) 691 }, 692 show: function () { 693 this.isBarVisible = true; 694 this.isScreenLocked = window.location.href.indexOf('cookie') === -1 && 0; 695 if (this.isScreenLocked) { 696 document.querySelector('body').style.overflow = 'hidden'; 697 } 698 }, 699 hide: function () { 700 this.isBarVisible = false; 701 this.isScreenLocked = false; 702 document.querySelector('body').style.overflowY = 'auto'; 703 document.querySelector('body').style.overflowX = 'clip'; 704 }, 705 handleAllow: function (agreeAll) { 706 this.isLoading = true; 707 708 let checkedGroups = []; 709 if (agreeAll) { 710 checkedGroups = document.querySelectorAll('.cookie-group-container .checkbox'); 711 } else { 712 checkedGroups = document.querySelectorAll('.cookie-group-container .checkbox:checked'); 713 } 714 715 const checked = Array.from(checkedGroups || []); 716 const body = checked.reduce((body, item) => { 717 body.append('group_ids[]', item.dataset.groupId); 718 return body; 719 }, new URLSearchParams({form_key: hyva.getFormKey()})) 720 721 fetch('https://www.jardindupicvert.com/gdpr_cookie/cookie/allow/', { 722 method: 'post', 723 body: body, 724 headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'} 725 }) 726 .then(() => this.hide()) 727 .finally(() => this.isLoading = false) 728 }, 729 730 handleDecline: function () { 731 this.isLoading = true; 732 733 const body = new URLSearchParams({form_key: hyva.getFormKey()}); 734 fetch('https://www.jardindupicvert.com/gdpr_cookie/cookie/decline/', { 735 method: 'post', 736 body: body, 737 headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'} 738 }) 739 .then(() => this.hide()) 740 .finally(() => this.isLoading = false) 741 }, 742 743 openSettings: function () { 744 window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-open')); 745 } 746 }; 747 } 748</script>
vendor: 1 bytes, line 748
748
749<script> 750 751 (function (config) { 752 function deleteDisallowedCookies() { 753 754 if (!hyva.getCookie(config.consentCookieName)) { 755 return; 756 } 757 758 const allowedGroups = unescape(hyva.getCookie(config.groupCookieName)).split(','); 759 const groupIds = Object.keys(config.groups || {}); 760 const disallowedGroupIds = groupIds.filter(groupId => !allowedGroups.includes(groupId)); 761 762 setInterval(() => { 763 disallowedGroupIds.forEach(groupId => { 764 config.groups[groupId].forEach(cookieCode => hyva.setCookie(cookieCode, '', -1)); 765 }); 766 }, 5000); 767 } 768 769 window.addEventListener('DOMContentLoaded', deleteDisallowedCookies, {once: true}); 770 771 })({"groups":{"2":["AdWords","__Secure-3PSIDCC","SIDCC","__Secure-1PAPISID","SAPISID","SSID","__Secure-3PSIDD","__Secure-1PSIDD","__Secure-1PSIDTS","HSID","APISID","__Secure-1PSIDCC","__Secure-3PSIDTS","__Secure-3PAPISID","SID","_ga","SOCS"],"1":["Toky","user_allowed_save_cookie","intercom-device-id-cv6ld8kq","__cf_bm","intercom-id-cv6ld8kq","private_content_version","visitor_country","form_key","PHPSESSID","last_visited_store","CONSENT","section_data_ids"],"3":["_ga_RQXSGJFQ59","_ga_GJH9RGDDP5","_ga_X6LMX9VR0Y","_gid","_ga_4BXXKZJZTZ","_gcl_au","SEARCH_SAMESITE","_ga_1LGNSX0EVM","_ga_B8SKQ9HHPZ","_ga_Z574RD7GDB"]},"groupCookieName":"gdpr_cookie_groups","consentCookieName":"gdpr_cookie_consent"}) 772</script>
772 773 774<div x-data="initGdprSettingsModal()" 775 x-init="init" 776 class="relative z-modal" 777> 778<div class="fixed w-full h-full flex items-center justify-center" x-show="open"> 779<div class="absolute bg-black h-full opacity-50 w-full" x-on:click="close" 780 style="display: none" 781 x-show="open"> 782 783</div> 784<div class="bg-white border border-gray-200 content h-full lg:max-w-4xl max-w-sm md:h-4/6 md:max-w-md overflow-auto overscroll-contain p-2 xs:p-4 sm:p-6 lg:p-8 rounded-md z-20" 785 style="display: none" 786 x-show.transition.origin.top="open"> 787<div class="flex justify-between mb-3 pb-4"> 788<p class="text-2xl lg:text-3xl">Privacy Overview</p> 789<div class="cursor-pointer pt-1" 790 x-on:click="close" 791 > 792<svg class="w-8 h-8 text-primary-lighter hover:text-primary"><use xlink:href="#close-symbol"></use></svg> 793</div> 794</div> 795<div class="text-sm lf:text-base"> 796This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience. </div> 797 798<div class="group-content">
799<div x-data="{open1: false}" 800 x-defer="interact" 801 class="cookie-group-container cookie-group-container-1 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm" 802 data-nosnippet 803> 804<div class="flex flex justify-between"> 805<p class="title text-lg cursor-pointer" 806 x-on:click="open1 = !open1"> 807<span x-show="! open1"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span> 808<span x-show="open1" style="display: none"><svg class="w-8 h-8 p-1 inline-block"><use xlink:href="#drop-down-symbol"></use></svg></span> 809Essentiels </p> 810 811<input class="checkbox disabled:opacity-40" type="checkbox" value="1" disabled checked data-group-id="1" name="allowed-group-1"> 812</div> 813<div class="content mt-4 pl-5" x-show.transition.origin.top="open1" style="display: none"> 814<div> 815Ces cookies sont indispensables au bon fonctionnement de notre site et ne peuvent donc pas être désactivés sans rendre celui-ci inutilisable. Ces cookies ne stockent aucune information dâidentification personnelle. </div> 816<div class="cookie-list text-sm hidden"> 817<table class="block lg:table"> 818<tr class="hidden lg:table-row border-b"> 819<th class="p-2 text-left">Nom</th> 820<th class="p-2 text-left">Description</th> 821<th class="p-2 text-left">Durée max. validité</th> 822</tr> 823<tr class="block lg:table-row mb-2"> 824<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CART</td> 825<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The association with your shopping cart.</td> 826<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 827</tr> 828<tr class="block lg:table-row mb-2"> 829<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CATEGORY_INFO</td> 830<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Allows pages to be displayed more quickly.</td> 831<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 832</tr> 833<tr class="block lg:table-row mb-2"> 834<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>COMPARE</td> 835<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The items that you have in the Compare Products list.</td> 836<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 837</tr> 838<tr class="block lg:table-row mb-2"> 839<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER</td> 840<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An encrypted version of your customer id.</td> 841<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 842</tr> 843<tr class="block lg:table-row mb-2"> 844<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_AUTH</td> 845<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An indicator if you are signed into the store.</td> 846<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 847</tr> 848<tr class="block lg:table-row mb-2"> 849<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_INFO</td> 850<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An encrypted version of the customer group you belong to.</td> 851<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 852</tr> 853<tr class="block lg:table-row mb-2"> 854<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>toky_state</td> 855<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 856<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>20 jours</td> 857</tr> 858<tr class="block lg:table-row mb-2"> 859<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>user_allowed_save_cookie</td> 860<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Enregistre les préférences de l'utilisateur concernant les cookies sur le site.</td> 861<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td> 862</tr> 863<tr class="block lg:table-row mb-2"> 864<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>intercom-device-id-cv6ld8kq</td> 865<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant unique utilisé pour suivre les interactions de l'utilisateur avec le site via Intercom.</td> 866<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>63 jours</td> 867</tr> 868<tr class="block lg:table-row mb-2"> 869<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__cf_bm</td> 870<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifie de manière unique les clients individuels derrière une adresse IP partagée et applique des paramètres de sécurité par client.</td> 871<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>154 jours</td> 872</tr> 873<tr class="block lg:table-row mb-2"> 874<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>intercom-id-cv6ld8kq</td> 875<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 876<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>56 jours</td> 877</tr> 878<tr class="block lg:table-row mb-2"> 879<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>private_content_version</td> 880<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 881<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>55 jours</td> 882</tr> 883<tr class="block lg:table-row mb-2"> 884<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>visitor_country</td> 885<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span> Choix du volet pays</td> 886<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>17 jours</td> 887</tr> 888<tr class="block lg:table-row mb-2"> 889<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>form_key</td> 890<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 891<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>0</td> 892</tr> 893<tr class="block lg:table-row mb-2"> 894<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>PHPSESSID</td> 895<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 896<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td> 897</tr> 898<tr class="block lg:table-row mb-2"> 899<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>last_visited_store</td> 900<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 901<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>25 jours</td> 902</tr> 903<tr class="block lg:table-row mb-2"> 904<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CONSENT</td> 905<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke le statut du consentement des cookies de l'utilisateur pour le domaine actuel.</td> 906<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>18 jours</td> 907</tr> 908<tr class="block lg:table-row mb-2"> 909<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>section_data_ids</td> 910<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 911<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 912</tr> 913</table> 914</div> 915</div> 916</div> 917<div x-data="{open2: false}" 918 x-defer="interact" 919 class="cookie-group-container cookie-group-container-2 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm" 920 data-nosnippet 921> 922<div class="flex flex justify-between"> 923<p class="title text-lg cursor-pointer" 924 x-on:click="open2 = !open2"> 925<span x-show="! open2"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span> 926<span x-show="open2" style="display: none"><svg class="w-8 h-8 p-1 inline-block"><use xlink:href="#drop-down-symbol"></use></svg></span> 927Cookies commerciaux </p> 928 929<input class="checkbox disabled:opacity-40" type="checkbox" value="1" checked data-group-id="2" name="allowed-group-2"> 930</div> 931<div class="content mt-4 pl-5" x-show.transition.origin.top="open2" style="display: none"> 932<div> 933Ces cookies peuvent être utilisés par ces sociétés pour établir un profil de vos intérêts et vous proposer des publicités pertinentes sur d'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'
933autorisez pas ces cookies, vous ne serez pas nécessairement moins ciblé(e) par des publicités, mais celles-ci seront moins ciblées. </div> 934<div class="cookie-list text-sm hidden"> 935<table class="block lg:table"> 936<tr class="hidden lg:table-row border-b"> 937<th class="p-2 text-left">Nom</th> 938<th class="p-2 text-left">Description</th> 939<th class="p-2 text-left">Durée max. validité</th> 940</tr> 941<tr class="block lg:table-row mb-2"> 942<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>CUSTOMER_SEGMENT_IDS</td> 943<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stores your Customer Segment ID</td> 944<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 945</tr> 946<tr class="block lg:table-row mb-2"> 947<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>EXTERNAL_NO_CACHE</td> 948<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>A flag that, indicates whether caching is on or off.</td> 949<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 950</tr> 951<tr class="block lg:table-row mb-2"> 952<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>FRONTEND</td> 953<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Your session ID on the server.</td> 954<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 955</tr> 956<tr class="block lg:table-row mb-2"> 957<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>GUEST-VIEW</td> 958<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Allows guests to edit their orders.</td> 959<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 960</tr> 961<tr class="block lg:table-row mb-2"> 962<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>LAST_CATEGORY</td> 963<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The last category you visited.</td> 964<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 965</tr> 966<tr class="block lg:table-row mb-2"> 967<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>LAST_PRODUCT</td> 968<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The last product you looked at.</td> 969<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 970</tr> 971<tr class="block lg:table-row mb-2"> 972<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>NEWMESSAGE</td> 973<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Indicates whether a new message has been received.</td> 974<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 975</tr> 976<tr class="block lg:table-row mb-2"> 977<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>NO_CACHE</td> 978<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Indicates whether it is allowed to use cache.</td> 979<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 980</tr> 981<tr class="block lg:table-row mb-2"> 982<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>PERSISTENT_SHOPPING_CART</td> 983<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>A link to information about your cart and viewing history if you have asked the site.</td> 984<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 985</tr> 986<tr class="block lg:table-row mb-2"> 987<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>1P_JAR</td> 988<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Service 'Google Ads Optimization' pour la délivrance de publicités ciblées</td> 989<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>18 jours</td> 990</tr> 991<tr class="block lg:table-row mb-2"> 992<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDCC</td> 993<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations sur l'utilisation du site pour les annonces Google.</td> 994<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>90 jours</td> 995</tr> 996<tr class="block lg:table-row mb-2"> 997<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SIDCC</td> 998<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session Google utilisé pour maintenir l'intégrité et la sécurité de votre session lors de l'utilisation des services Google.</td> 999<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>81 jours</td> 1000</tr> 1001<tr class="block lg:table-row mb-2"> 1002<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PAPISID</td> 1003<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour livrer des annonces plus pertinentes et pour améliorer les rapports de performance des campagnes publicitaires.</td> 1004<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>51 jours</td> 1005</tr> 1006<tr class="block lg:table-row mb-2"> 1007<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SAPISID</td> 1008<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant unique utilisé pour suivre les préférences de l'utilisateur et fournir des recommandations de contenu personnalisé.</td> 1009<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>41 jours</td> 1010</tr> 1011<tr class="block lg:table-row mb-2"> 1012<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SSID</td> 1013<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations telles que la langue préférée de l'utilisateur afin de personnaliser l'expérience de navigation.</td> 1014<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>21 jours</td> 1015</tr> 1016<tr class="block lg:table-row mb-2"> 1017<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDD</td> 1018<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour collecter des informations sur l'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> 1019<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>167 jours</td> 1020</tr> 1021<tr class="block lg:table-row mb-2"> 1022<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDD</td> 1023<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session utilisé pour maintenir l'état de la session de l'utilisateur entre les demandes de page.</td> 1024<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>167 jours</td> 1025</tr> 1026<tr class="block lg:table-row mb-2"> 1027<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDTS</td> 1028<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour mesurer les performances du site et analyser les modèles de trafic des utilisateurs.</td> 1029<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>93 jours</td> 1030</tr> 1031<tr class="block lg:table-row mb-2"> 1032<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>HSID</td> 1033<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session utilisé pour maintenir l'état de la session de l'utilisateur.</td> 1034<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>21 jours</td> 1035</tr> 1036<tr class="block lg:table-row mb-2"> 1037<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>
1037APISID</td> 1038<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifie de manière unique votre navigateur pour fournir des publicités et des services personnalisés sur Google.</td> 1039<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>40 jours</td> 1040</tr> 1041<tr class="block lg:table-row mb-2"> 1042<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-1PSIDCC</td> 1043<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 1044<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>0</td> 1045</tr> 1046<tr class="block lg:table-row mb-2"> 1047<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PSIDTS</td> 1048<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé pour collecter des informations sur l'interaction de l'utilisateur avec le site Web</td> 1049<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>93 jours</td> 1050</tr> 1051<tr class="block lg:table-row mb-2"> 1052<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>__Secure-3PAPISID</td> 1053<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span></td> 1054<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>51 jours</td> 1055</tr> 1056<tr class="block lg:table-row mb-2"> 1057<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SID</td> 1058<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de session.</td> 1059<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>156 jours</td> 1060</tr> 1061<tr class="block lg:table-row mb-2"> 1062<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga</td> 1063<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour collecter des données sur le comportement des utilisateurs sur le site.</td> 1064<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>30 jours</td> 1065</tr> 1066<tr class="block lg:table-row mb-2"> 1067<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SOCS</td> 1068<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations sur les préférences de l'utilisateur et aide à personnaliser l'expérience de navigation.</td> 1069<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>58 jours</td> 1070</tr> 1071</table> 1072</div> 1073</div> 1074</div> 1075<div x-data="{open3: false}" 1076 x-defer="interact" 1077 class="cookie-group-container cookie-group-container-3 border border-gray-300 mt-4 p-6 rounded-2xl shadow-sm" 1078 data-nosnippet 1079> 1080<div class="flex flex justify-between"> 1081<p class="title text-lg cursor-pointer" 1082 x-on:click="open3 = !open3"> 1083<span x-show="! open3"><svg class="w-8 h-8 inline-block"><use xlink:href="#drop-up-symbol"></use></svg></span> 1084<span x-show="open3" style="display: none"><svg class="w-8 h-8 p-1 inline-block"><use xlink:href="#drop-down-symbol"></use></svg></span> 1085Analyse & performances </p> 1086 1087<input class="checkbox disabled:opacity-40" type="checkbox" value="1" checked data-group-id="3" name="allowed-group-3"> 1088</div> 1089<div class="content mt-4 pl-5" x-show.transition.origin.top="open3" style="display: none"> 1090<div> 1091Ces cookies nous permettent d'é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> 1092<div class="cookie-list text-sm hidden"> 1093<table class="block lg:table"> 1094<tr class="hidden lg:table-row border-b"> 1095<th class="p-2 text-left">Nom</th> 1096<th class="p-2 text-left">Description</th> 1097<th class="p-2 text-left">Durée max. validité</th> 1098</tr> 1099<tr class="block lg:table-row mb-2"> 1100<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>RECENTLYCOMPARED</td> 1101<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The items you recently compared.</td> 1102<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 1103</tr> 1104<tr class="block lg:table-row mb-2"> 1105<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>STF</td> 1106<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Information on products you emailed to friends.</td> 1107<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 1108</tr> 1109<tr class="block lg:table-row mb-2"> 1110<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>STORE</td> 1111<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The store view or language you have selected.</td> 1112<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 1113</tr> 1114<tr class="block lg:table-row mb-2"> 1115<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>USER_ALLOWED_SAVE_COOKIE</td> 1116<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Indicates whether a customer authorized cookies.</td> 1117<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 1118</tr> 1119<tr class="block lg:table-row mb-2"> 1120<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>VIEWED_PRODUCT_IDS</td> 1121<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The products that you recently looked at.</td> 1122<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 1123</tr> 1124<tr class="block lg:table-row mb-2"> 1125<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>WISHLIST</td> 1126<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>An encrypted list of products added to your wish list.</td> 1127<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 1128</tr> 1129<tr class="block lg:table-row mb-2"> 1130<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>WISHLIST_CNT</td> 1131<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>The number of items in your wish list.</td> 1132<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>1 Année</td> 1133</tr> 1134<tr class="block lg:table-row mb-2"> 1135<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_RQXSGJFQ59</td> 1136<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td> 1137<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td> 1138</tr> 1139<tr class="block lg:table-row mb-2"> 1140<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_GJH9RGDDP5</td> 1141<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td> 1142<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td> 1143</tr> 1144<tr class="block lg:table-row mb-2"> 1145<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_X6LMX9VR0Y</td> 1146<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td> 1147<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>60 jours</td> 1148</tr> 1149<tr class="block lg:table-row mb-2"> 1150<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_gid</td> 1151<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td> 1152<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>30 jours</td> 1153</tr> 1154<tr class="block lg:table-row mb-2"> 1155<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_4BXXKZJZTZ</td> 1156<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td> 1157<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td> 1158</tr> 1159<tr class="block lg:table-row mb-2"> 1160<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_gcl_au</td> 1161<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Utilisé par Google AdSense pour expérimenter l'
1161efficacité de la publicité sur les sites Web utilisant leurs services.</td> 1162<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>31 jours</td> 1163</tr> 1164<tr class="block lg:table-row mb-2"> 1165<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>SEARCH_SAMESITE</td> 1166<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Stocke des informations sur les paramètres de même site pour garantir le bon fonctionnement des fonctionnalités du site.</td> 1167<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>23 jours</td> 1168</tr> 1169<tr class="block lg:table-row mb-2"> 1170<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_1LGNSX0EVM</td> 1171<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td> 1172<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td> 1173</tr> 1174<tr class="block lg:table-row mb-2"> 1175<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_B8SKQ9HHPZ</td> 1176<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur la façon dont les visiteurs interagissent avec le site.</td> 1177<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>52 jours</td> 1178</tr> 1179<tr class="block lg:table-row mb-2"> 1180<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Nom</i>: </span>_ga_Z574RD7GDB</td> 1181<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Description</i>: </span>Identifiant de suivi unique utilisé pour recueillir des données sur le comportement des utilisateurs sur le site.</td> 1182<td class="block lg:table-cell lg:p-2"><span class="lg:hidden"><i>Durée max. validité</i>: </span>60 jours</td> 1183</tr> 1184</table> 1185</div> 1186</div> 1187</div> 1188</div> 1189<button class="btn btn-primary mx-auto mt-4 text-sm cursor-pointer" 1190 x-on:click="save"><span>Enregistrer</span></button> 1191</div> 1192</div> 1193</div>
1194<script> 1195 function initGdprSettingsModal() { 1196 return { 1197 open: false, 1198 close: function () { 1199 this.open = false; 1200 document.querySelector('body').style.overflowY = 'auto'; 1201 document.querySelector('body').style.overflowX = 'clip'; 1202 }, 1203 init: function () { 1204 window.addEventListener('mst-gdpr-cookie-settings-open', () => { 1205 document.querySelector('body').style.overflow = 'hidden'; 1206 this.open = true; 1207 }) 1208 }, 1209 save: function () { 1210 window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-save')); 1211 this.close(); 1212 } 1213 }; 1214 } 1215</script>
1215 1216<input name="form_key" type="hidden" value="jIeQ6NmqNDPAX5IC" /> 1217<noscript> 1218 <section 1219 class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal" 1220 aria-labelledby="messageGlobalNoScriptMessage" 1221 > 1222 <div class="container text-center"> 1223 <p id="messageGlobalNoScriptMessage"> 1224 <strong>Javascript est désactivé dans votre navigateur.</strong> 1225 <span> 1226 Pour une meilleure expérience sur notre site, assurez-vous dâactiver JavaScript dans votre navigateur. </span> 1227 </p> 1228 </div> 1229 </section> 1230 </noscript> 1231 1232 1233<span class="sr-only"> 1234<svg width="0" height="0" xmlns="http://www.w3.org/2000/svg"> 1235 <symbol id="account-symbol" viewBox="0 0 1024 1024"> 1236 <path d="M615.424 400.384c64.512-36.864 108.544-105.472 108.544-184.32 0-124.928-108.544-225.28-236.544-210.944-92.16 10.24-169.984 83.968-184.32 176.128-14.336 93.184 31.744 177.152 105.472 219.136-140.288 37.888-242.688 150.528-242.688 283.648v335.872h692.224v-335.872c0-133.12-102.4-245.76-242.688-283.648zM367.616 256c-30.72-113.664 71.68-216.064 185.344-185.344 50.176 13.312 91.136 54.272 104.448 104.448 30.72 114.688-71.68 216.064-185.344 185.344-50.176-13.312-91.136-54.272-104.448-104.448zM797.696 958.464h-570.368v-274.432c0-130.048 128-235.52 284.672-235.52s285.696 105.472 285.696 235.52v274.432z" fill="currentColor"></path> 1237 </symbol> 1238 1239 <symbol id="alert-symbol" viewBox="0 0 24 24" fill="none"> 1240 <path fill-rule="evenodd" d="M11.7489 3.5C11.4427 3.5 11.1526 3.61885 10.9416 3.82474C10.7312 4.03002 10.6165 4.30445 10.6165 4.5866V4.87466C10.6165 5.20192 10.4043 5.4914 10.0922 5.58989C9.00929 5.93166 8.06855 6.59852 7.40304 7.49118C6.73775 8.38355 6.38102 9.45633 6.38123 10.5554V14.2282L6.38123 14.2309C6.38036 14.4744 6.28111 14.7041 6.11104 14.8712C5.94158 15.0377 5.71552 15.1294 5.48271 15.1318L5.47564 15.1318C5.21104 15.1321 4.96095 15.2349 4.77937 15.4121C4.59846 15.5887 4.50022 15.8241 4.5 16.0656V16.9832C4.50024 16.9839 4.50107 16.9856 4.50349 16.988C4.50859 16.9929 4.51934 16.9989 4.53431 16.9989L18.9657 17C18.9657 17 18.9657 17 18.9657 17C18.9806 17 18.9914 16.994 18.9965 16.9891C18.9989 16.9867 18.9998 16.985 19 16.9843V16.0661C18.9998 15.8244 18.9014 15.5888 18.7202 15.4121C18.5385 15.2348 18.2882 15.132 18.0235 15.1318C17.9077 15.1319 17.7925 15.1099 17.6845 15.0665C17.5745 15.0224 17.4735 14.9569 17.3878 14.873C17.302 14.789 17.2332 14.6881 17.1863 14.5758C17.1402 14.4652 17.1165 14.3462 17.1171 14.2257C17.1171 14.2238 17.1171 14.2218 17.1171 14.2199L17.8671 14.2282H17.1171V14.2257V10.5556C17.1172 9.45642 16.7604 8.38354 16.095 7.49117C15.4294 6.5985 14.4886 5.93166 13.4055 5.5899C13.0934 5.49141 12.8812 5.20193 12.8812 4.87466V4.5866C12.8812 4.30446 12.7665 4.03002 12.5561 3.82474C12.3451 3.61885 12.0551 3.5 11.7489 3.5ZM9.89409 2.75111C10.3891 2.26815 11.0566 2 11.7489 2C12.4411 2 13.1087 2.26815 13.6037 2.75111C14.0409 3.17771 14.3118 3.74149 14.3696 4.34352C15.534 4.81382 16.5489 5.59058 17.2975 6.59453C18.1542 7.74353 18.6172 9.13026 18.6171 10.5556C18.6171 10.5556 18.6171 10.5555 18.6171 10.5556V13.7029C19.0473 13.8074 19.4461 14.0247 19.7676 14.3383C20.2337 14.7929 20.4993 15.4134 20.5 16.0646V16.9847C20.5 17.3926 20.3338 17.78 20.044 18.0627C19.755 18.3447 19.3667 18.5 18.9657 18.5L15.425 18.4997C15.0777 20.2115 13.5643 21.5 11.75 21.5C9.93549 21.5 8.42198 20.2113 8.07485 18.4992L4.53431 18.4989C4.53429 18.4989 4.53433 18.4989 4.53431 18.4989C4.13328 18.4989 3.74502 18.3436 3.45595 18.0616C3.16625 17.7789 3 17.3916 3 16.9837V16.0654C3.00043 15.4143 3.26581 14.7934 3.73166 14.3387C4.0529 14.0252 4.4513 13.8079 4.88123 13.7032V10.5557C4.88123 10.5557 4.88123 10.5557 4.88123 10.5557C4.88099 9.13047 5.34385 7.74362 6.20047 6.59462C6.94896 5.59066 7.96386 4.81385 9.12816 4.34354C9.18594 3.7415 9.45686 3.17771 9.89409 2.75111ZM9.62778 18.4993C9.93646 19.3736 10.7701 20 11.75 20C12.7298 20 13.5633 19.3737 13.8721 18.4996L9.62778 18.4993ZM18.6171 14.2365V14.2282C18.6171 14.231 18.6171 14.2338 18.6171 14.2365Z" fill="currentColor"/> 1241 </symbol> 1242 1243 <symbol id="basket-symbol" viewBox="0 0 1024 1024" fill="none"> 1244 <path d="M986.112 414.72h-196.608l-142.336-344.064c-7.168-17.408-26.624-25.6-44.032-18.432s-24.576 26.624-18.432 44.032l133.12 318.464h-411.648l133.12-318.464c7.168-17.408-1.024-36.864-18.432-44.032s-36.864 1.024-43.008 18.432l-143.36 344.064h-196.608c-18.432 0-32.768 15.36-32.768 33.792s14.336 33.792 32.768 33.792h20.48l65.536 357.376c14.336 77.824 81.92 134.144 160.768 134.144h455.68c78.848 0 146.432-56.32 160.768-134.144l
124465.536-357.376h19.456c18.432 0 33.792-15.36 33.792-33.792-1.024-18.432-15.36-33.792-33.792-33.792zM834.56 827.392c-8.192 46.080-48.128 79.872-95.232 79.872h-454.656c-47.104 0-87.040-33.792-95.232-79.872l-63.488-344.064h772.096l-63.488 344.064z" fill="currentColor"/> 1245 </symbol> 1246 1247 <symbol id="calendar-symbol" viewBox="0 0 24 24"> 1248 <path fill-rule="evenodd" d="M7.25 2C6.00736 2 5 3.00736 5 4.25V5H4.75C3.23122 5 2 6.23122 2 7.75V18.75C2 20.2688 3.23122 21.5 4.75 21.5H18.75C20.2688 21.5 21.5 20.2688 21.5 18.75V7.75C21.5 6.23122 20.2688 5 18.75 5H18.5V4.25C18.5 3.00736 17.4926 2 16.25 2C15.0074 2 14 3.00736 14 4.25V5H9.5V4.25C9.5 3.00736 8.49264 2 7.25 2ZM16.25 3.5C16.6642 3.5 17 3.83579 17 4.25V5.75V7.75C17 8.16421 16.6642 8.5 16.25 8.5C15.8358 8.5 15.5 8.16421 15.5 7.75V5.75V4.25C15.5 3.83579 15.8358 3.5 16.25 3.5ZM14 7.75V6.5H9.5V7.75C9.5 8.99264 8.49264 10 7.25 10C6.00736 10 5 8.99264 5 7.75V6.5H4.75C4.05964 6.5 3.5 7.05964 3.5 7.75V11.25H20V7.75C20 7.05964 19.4404 6.5 18.75 6.5H18.5V7.75C18.5 8.99264 17.4926 10 16.25 10C15.0074 10 14 8.99264 14 7.75ZM20 12.75H3.5V18.75C3.5 19.4404 4.05964 20 4.75 20H18.75C19.4404 20 20 19.4404 20 18.75V12.75ZM8 4.25C8 3.83579 7.66421 3.5 7.25 3.5C6.83579 3.5 6.5 3.83579 6.5 4.25V5.75V7.75C6.5 8.16421 6.83579 8.5 7.25 8.5C7.66421 8.5 8 8.16421 8 7.75V5.75V4.25Z" fill="currentColor"/> 1249 </symbol> 1250 1251 <symbol id="check-symbol" viewBox="0 0 24 24"> 1252 <path d="M5.52637 11.8235L10.6627 17L18.5264 7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/> 1253 </symbol> 1254 1255 <symbol id="chevron-symbol" viewBox="0 0 288 488"> 1256 <path d="M268.75 184c0 2-1 4.25-2.5 5.75l-116.5 116.5c-1.5 1.5-3.75 2.5-5.75 2.5s-4.25-1-5.75-2.5l-116.5-116.5c-1.5-1.5-2.5-3.75-2.5-5.75s1-4.25 2.5-5.75l12.5-12.5c1.5-1.5 3.5-2.5 5.75-2.5 2 0 4.25 1 5.75 2.5l98.25 98.25 98.25-98.25c1.5-1.5 3.75-2.5 5.75-2.5s4.25 1 5.75 2.5l12.5 12.5c1.5 1.5 2.5 3.75 2.5 5.75z" fill="currentColor" /> 1257 </symbol> 1258 1259 <symbol id="close-symbol" viewBox="0 0 24 24"> 1260 <path d="M6.2877 5.2184C5.99312 4.9272 5.51551 4.9272 5.22093 5.2184C4.92636 5.5096 4.92636 5.98172 5.22093 6.27292L11.0121 11.9976L5.22103 17.7221C4.92645 18.0133 4.92645 18.4854 5.22103 18.7766C5.51561 19.0678 5.99322 19.0678 6.2878 18.7766L12.0788 13.0521L17.7066 18.6153C18.0012 18.9065 18.4788 18.9065 18.7734 18.6153C19.068 18.3241 19.068 17.852 18.7734 17.5608L13.1456 11.9976L18.7735 6.43426C19.0681 6.14306 19.0681 5.67094 18.7735 5.37974C18.4789 5.08855 18.0013 5.08855 17.7067 5.37974L12.0788 10.943L6.2877 5.2184Z" fill="currentColor"/> 1261 <path d="M6.2877 5.2184C5.99312 4.9272 5.51551 4.9272 5.22093 5.2184C4.92636 5.5096 4.92636 5.98172 5.22093 6.27292L11.0121 11.9976L5.22103 17.7221C4.92645 18.0133 4.92645 18.4854 5.22103 18.7766C5.51561 19.0678 5.99322 19.0678 6.2878 18.7766L12.0788 13.0521L17.7066 18.6153C18.0012 18.9065 18.4788 18.9065 18.7734 18.6153C19.068 18.3241 19.068 17.852 18.7734 17.5608L13.1456 11.9976L18.7735 6.43426C19.0681 6.14306 19.0681 5.67094 18.7735 5.37974C18.4789 5.08855 18.0013 5.08855 17.7067 5.37974L12.0788 10.943L6.2877 5.2184Z" fill="currentColor"/> 1262 </symbol> 1263 1264 <symbol id="delete-symbol" viewBox="0 0 804 1024"> 1265 <path d="M292.864 420.864v328.704q0 8.192-5.12 13.312t-13.312 5.12h-36.864q-8.192 0-13.312-5.12t-5.12-13.312v-328.704q0-8.192 5.12-13.312t13.312-5.12h36.864q8.192 0 13.312 5.12t5.12 13.312zM439.296 420.864v328.704q0 8.192-5.12 13.312t-13.312 5.12h-36.864q-8.192 0-13.312-5.12t-5.12-13.312v-328.704q0-8.192 5.12-13.312t13.312-5.12h36.864q8.192 0 13.312 5.12t5.12 13.312zM584.704 420.864v328.704q0 8.192-5.12 13.312t-12.288 5.12h-36.864q-8.192 0-13.312-5.12t-5.12-13.312v-328.704q0-8.192 5.12-13.312t13.312-5.12h36.864q7.168 0 12.288 5.12t5.12 13.312zM658.432 834.56v-541.696h-512v541.696q0 12.288 4.096 22.528t8.192 15.36 6.144 5.12h475.136q2.048 0 6.144-5.12t8.192-15.36 4.096-22.528zM274.432 219.136h256l-27.648-66.56q-4.096-5.12-9.216-6.144h-181.248q-6.144 1.024-10.24 6.144zM804.864 237.568v36.864q0 8.192-5.12 13.3
126512t-13.312 5.12h-55.296v541.696q0 47.104-26.624 81.92t-64.512 34.816h-475.136q-37.888 0-64.512-33.792t-27.648-80.896v-543.744h-54.272q-8.192 0-13.312-5.12t-5.12-13.312v-36.864q0-8.192 5.12-13.312t13.312-5.12h176.128l39.936-95.232q9.216-21.504 31.744-35.84t45.056-15.36h182.272q23.552 0 45.056 15.36t30.72 35.84l39.936 95.232h177.152q8.192 0 13.312 5.12t5.12 13.312z" fill=""currentColor"/> 1266 </symbol> 1267 1268 <symbol id="edit-symbol" viewBox="0 0 878 1024"> 1269 <path d="M207.872 877.568l51.2-52.224-134.144-134.144-52.224 52.224v61.44h73.728v72.704h61.44zM505.856 347.136q0-12.288-12.288-12.288-5.12 0-9.216 4.096l-310.272 309.248q-4.096 4.096-4.096 10.24 0 12.288 13.312 12.288 5.12 0 9.216-4.096l310.272-309.248q3.072-4.096 3.072-10.24zM475.136 237.568l237.568 237.568-475.136 476.16h-237.568v-238.592zM865.28 292.864q0 29.696-20.48 51.2l-95.232 95.232-237.568-238.592 95.232-94.208q20.48-21.504 51.2-21.504 29.696 0 52.224 21.504l134.144 134.144q20.48 22.528 20.48 52.224z" fill="currentColor"/> 1270 </symbol> 1271 1272 <symbol id="filter-symbol" viewBox="0 0 1024 1024"> 1273 <path d="M801.792 168.96q9.216 22.528-8.192 39.936l-281.6 281.6v423.936q0 23.552-22.528 33.792-7.168 3.072-14.336 3.072-15.36 0-25.6-11.264l-146.432-146.432q-10.24-11.264-10.24-25.6v-277.504l-281.6-281.6q-18.432-17.408-8.192-39.936 9.216-22.528 33.792-22.528h731.136q23.552 0 33.792 22.528z" fill="currentColor"></path> 1274 </symbol> 1275 1276 <symbol id="flower-symbol" viewBox="0 0 16 16"> 1277 <path clip-rule="evenodd" d="M5.99999 2C5.99999 0.895431 6.89542 0 7.99999 0C9.10456 0 9.99999 0.895431 9.99999 2V2.0359L10.0311 2.01795C10.9877 1.46566 12.2108 1.79341 12.7631 2.75C13.3154 3.70659 12.9877 4.92977 12.0311 5.48205L12 5.5L12.0311 5.51795C12.9877 6.07023 13.3154 7.29342 12.7631 8.25C12.2108 9.20658 10.9877 9.53434 10.0311 8.98205L9.99999 8.9641V9C9.99999 10.1046 9.10456 11 7.99999 11C6.89542 11 5.99999 10.1046 5.99999 9V8.9641L5.9689 8.98205C5.01232 9.53434 3.78914 9.20658 3.23685 8.25C2.68457 7.29342 3.01232 6.07023 3.9689 5.51795L3.99999 5.5L3.9689 5.48205C3.01232 4.92977 2.68457 3.70659 3.23685 2.75C3.78913 1.79341 5.01232 1.46566 5.9689 2.01795L5.99999 2.0359V2ZM9.99999 5.5C9.99999 6.60457 9.10456 7.5 7.99999 7.5C6.89542 7.5 5.99999 6.60457 5.99999 5.5C5.99999 4.39543 6.89542 3.5 7.99999 3.5C9.10456 3.5 9.99999 4.39543 9.99999 5.5Z" fill="currentColor" fill-rule="evenodd"/><path d="M7 16H6C3.23858 16 1 13.7614 1 11V10H2C4.76142 10 7 12.2386 7 15V16Z" fill="currentColor"/><path d="M10 16H9V15C9 12.2386 11.2386 10 14 10H15V11C15 13.7614 12.7614 16 10 16Z" fill="currentColor"/> 1278 </symbol> 1279 1280 <symbol id="heart-empty-symbol" viewBox="0 0 24 24"> 1281 <path d="M2.75 9.39995L2.75 9.39982C2.74989 8.78186 2.87296 8.17008 3.11201 7.60023C3.35106 7.03038 3.7013 6.51389 4.14226 6.08095C4.58321 5.64801 5.10604 5.30731 5.68018 5.07876C6.25432 4.8502 6.86826 4.73838 7.48611 4.74982L7.49505 4.74999L7.50398 4.74994C8.24667 4.74599 8.98171 4.89994 9.66039 5.20158C10.3391 5.50322 10.9459 5.94565 11.4406 6.49956L12 7.12582L12.5594 6.49956C13.0541 5.94565 13.6609 5.50322 14.3396 5.20158C15.0183 4.89994 15.7533 4.74599 16.496 4.74994L16.505 4.74999L16.5139 4.74982C17.1317 4.73838 17.7457 4.8502 18.3198 5.07876C18.894 5.30731 19.4168 5.64801 19.8577 6.08095C20.2987 6.51389 20.6489 7.03038 20.888 7.60023C21.127 8.17008 21.2501 8.78186 21.25 9.39982V9.39995C21.25 11.773 19.8337 13.9394 17.8233 15.9824C16.8278 16.994 15.7154 17.9469 14.613 18.8557C14.2997 19.114 13.9855 19.3701 13.6749 19.6232C13.0944 20.0963 12.5268 20.5589 12.0024 21.0056C11.4518 20.5326 10.8538 20.0437 10.2429 19.5442C9.96049 19.3133 9.67529 19.0801 9.39074 18.8452C8.28813 17.9349 7.1753 16.9831 6.17907 15.9731C4.16742 13.9337 2.75 11.7743 2.75 9.39995Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none" /> 1282 </symbol> 1283 1284 <symbol id="heart-full-symbol" viewBox="0 0 128 128"> 1285 <path d="M88.064 9.344c-8.832 0 -17.152 2.944 -24.064 8.192 -6.784 -5.248 -15.232 -8.192 -24.064 -8.192C18.304 9.344 0.64 27.008 0.64 48.768c0 10.368 3.328 20.608 10.112 30.336C1
12855.744 86.4 22.784 93.44 31.36 100.096c13.952 10.496 27.648 16.384 29.184 17.152L64 118.656l3.328 -1.408c0.64 -0.256 14.976 -6.144 29.312 -17.024 8.576 -6.528 15.616 -13.568 20.608 -20.992 6.784 -9.728 10.112 -19.968 10.112 -30.464 0 -21.76 -17.664 -39.424 -39.296 -39.424" fill="currentColor"/> 1286 </symbol> 1287 1288 <symbol id="help-symbol" viewBox="0 0 24 24" fill="none"> 1289 <path d="M11.6304 2C13.4784 2 14.9717 2.52267 16.1104 3.568C17.249 4.61333 17.8184 6.01333 17.8184 7.768C17.8184 9.728 17.2117 11.184 15.9984 12.136C14.785 13.0693 13.1424 13.536 11.0704 13.536L10.9864 16.196H8.77436L8.66236 11.772H9.47436C11.3224 11.772 12.769 11.492 13.8144 10.932C14.8597 10.372 15.3824 9.31733 15.3824 7.768C15.3824 6.648 15.0464 5.76133 14.3744 5.108C13.7024 4.45467 12.797 4.128 11.6584 4.128C10.501 4.128 9.58636 4.44533 8.91436 5.08C8.26102 5.696 7.93436 6.54533 7.93436 7.628H5.52636C5.52636 6.508 5.77836 5.528 6.28236 4.688C6.78636 3.82933 7.49569 3.16667 8.41036 2.7C9.34369 2.23333 10.417 2 11.6304 2ZM9.86636 21.936C9.38102 21.936 8.97036 21.768 8.63436 21.432C8.29836 21.096 8.13036 20.6853 8.13036 20.2C8.13036 19.7147 8.29836 19.304 8.63436 18.968C8.97036 18.632 9.38102 18.464 9.86636 18.464C10.333 18.464 10.725 18.632 11.0424 18.968C11.3784 19.304 11.5464 19.7147 11.5464 20.2C11.5464 20.6853 11.3784 21.096 11.0424 21.432C10.725 21.768 10.333 21.936 9.86636 21.936Z" fill="currentColor"/> 1290 </symbol> 1291 1292 <symbol id="home-symbol" viewBox="0 0 30 32" fill="none"> 1293 <path d="M25.143 18v8.571c0 0.625-0.518 1.143-1.143 1.143h-6.857v-6.857h-4.571v6.857h-6.857c-0.625 0-1.143-0.518-1.143-1.143v-8.571c0-0.036 0.018-0.071 0.018-0.107l10.268-8.464 10.268 8.464c0.018 0.036 0.018 0.071 0.018 0.107zM29.125 16.768l-1.107 1.321c-0.089 0.107-0.232 0.179-0.375 0.196h-0.054c-0.143 0-0.268-0.036-0.375-0.125l-12.357-10.304-12.357 10.304c-0.125 0.089-0.268 0.143-0.429 0.125-0.143-0.018-0.286-0.089-0.375-0.196l-1.107-1.321c-0.196-0.232-0.161-0.607 0.071-0.804l12.839-10.696c0.75-0.625 1.964-0.625 2.714 0l4.357 3.643v-3.482c0-0.321 0.25-0.571 0.571-0.571h3.429c0.321 0 0.571 0.25 0.571 0.571v7.286l3.911 3.25c0.232 0.196 0.268 0.571 0.071 0.804z" fill="currentColor"></path> 1294 </symbol> 1295 1296 <symbol id="hourglass-symbol" viewBox="0 0 24 24" fill="none"> 1297 <path fill-rule="evenodd" d="M4.25 5C4.25 4.58579 4.58579 4.25 5 4.25H7.00001H18H20C20.4142 4.25 20.75 4.58579 20.75 5C20.75 5.41421 20.4142 5.75 20 5.75H18.721C18.495 8.65565 16.9687 11.1813 14.75 12.2355V12.7644C16.9687 13.8186 18.495 16.3443 18.721 19.25H20C20.4142 19.25 20.75 19.5858 20.75 20C20.75 20.4142 20.4142 20.75 20 20.75H5C4.58579 20.75 4.25 20.4142 4.25 20C4.25 19.5858 4.58579 19.25 5 19.25H6.27905C6.50495 16.3443 8.03133 13.8186 10.25 12.7644V12.2355C8.03134 11.1813 6.50497 8.65565 6.27905 5.75H5C4.58579 5.75 4.25 5.41421 4.25 5ZM11.254 11.0308C9.48502 10.394 8.02125 8.36874 7.78371 5.75001L12.5 5.75005H12.5L17.2163 5.75001C16.9788 8.36874 15.515 10.394 13.746 11.0308C13.4484 11.1379 13.25 11.4202 13.25 11.7365V13.2635C13.25 13.5797 13.4484 13.862 13.746 13.9691C15.515 14.6059 16.9788 16.6312 17.2163 19.2499L12.5 19.2499L7.78371 19.2499C8.02125 16.6312 9.48502 14.6059 11.254 13.9691C11.5516 13.862 11.75 13.5797 11.75 13.2635V11.7365C11.75 11.4202 11.5516 11.1379 11.254 11.0308Z" fill="currentColor"/> 1298 </symbol> 1299 1300 <symbol id="info-symbol" viewBox="0 0 24 24"> 1301 <path fill-rule="evenodd" d="M12 2.69231C6.8595 2.69231 2.69231 6.8595 2.69231 12C2.69231 17.1405 6.8595 21.3077 12 21.3077C17.1405 21.3077 21.3077 17.1405 21.3077 12C21.3077 6.8595 17.1405 2.69231 12 2.69231ZM1 12C1 5.92487 5.92487 1 12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12ZM12 10.8718C12.6231 10.8718 13.1282 11.3769 13.1282 12V16.5128C13.1282 17.1359 12.6231 17.641 12 17.641C11.3769 17.641 10.8718 17.1359 10.8718 16.5128V12C10.8718 11.3769 11.3769 10.8718 12 10.8718ZM12 8.61539C12.6231 8.61539 13.1282 8.11027 13.1282 7.48718C13.1282 6.86409 12.6231 6.35897 12 6.35897C11.3769 6.35897 10.8718 6.86409 10.8718 7.48718C10.8718 8.11027 11.3769 8.61539 12 8.61539Z" fill="currentColor"/> 1302 </symbol> 1303 1304 <symbol id="logout-symbol" viewBox="0 0 384 448"> 1305 <path d="M384 224c0 105.75-86.25 192-192 192s-192-86.25-192-192c0-60.75 28-116.75 76.75-153.25 14.25-10.75 34.25-8 44.75 6.25 10.75 14 7.75 34.25-6.25 44.75-32.5 24.5-51.25 61.75-51.25 102.25 0 70.5 57.5 128 128 128s128-57.5 128-128c0-40.5-18.75-77.75-51.25-102.25-14-10.5-17-30.75-6.25-44.75 10.5-14.25 30.75-17 44.75-6.25 48.75 36.5 76.75 92.5 76.75 153.25zM224 32v160c0 17.5-14.5 32-32 32s-32-14.5-32-32v-160c0-17.5 14.5-32 32-32s32 14.5 32 32z" fill="currentColor"></path> 1306 </symbol> 1307 1308 <symbol id="map-marker-symbol" viewBox="0 0 18 32"> 1309 <path d="M13.714 11.714c0-2.518-2.054-4.571-4.571-4.571s-4.571 2.054-4.571 4.571 2.054 4.571 4.571 4.571 4.571-2.054 4.571-4.571zM18.286 11.714c0 1.089-0.
1309125 2.214-0.589 3.196l-6.5 13.821c-0.375 0.786-1.196 1.268-2.054 1.268s-1.679-0.482-2.036-1.268l-6.518-13.821c-0.464-0.982-0.589-2.107-0.589-3.196 0-5.054 4.089-9.143 9.143-9.143s9.143 4.089 9.143 9.143z" fill="currentColor"></path> 1310 </symbol> 1311 1312 <symbol id="search-symbol" viewBox="0 0 24 24" fill="none"> 1313 <circle cx="11" cy="10" r="8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 1314 <path d="M16.3334 16.6667L21 21.3334" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 1315 </symbol> 1316 1317 <symbol id="sort-symbol" viewBox="0 0 1024 1024"> 1318 <path d="M680.96 233.472h100.352l-40.96-124.928-6.144-26.624q-2.048-9.216-2.048-11.264h-2.048l-1.024 11.264q0 0-2.048 10.24t-5.12 16.384zM420.864 823.296q0 6.144-6.144 13.312l-182.272 182.272q-5.12 5.12-13.312 5.12-6.144 0-12.288-5.12l-183.296-183.296q-8.192-9.216-4.096-19.456 4.096-11.264 17.408-11.264h109.568v-786.432q0-8.192 5.12-13.312t13.312-5.12h109.568q8.192 0 13.312 5.12t5.12 13.312v786.432h109.568q8.192 0 13.312 5.12t5.12 13.312zM898.048 890.88v133.12h-333.824v-51.2l210.944-302.080q7.168-11.264 12.288-16.384l6.144-5.12v-1.024q-1.024 0-3.072 0t-5.12 0q-6.144 2.048-16.384 2.048h-133.12v65.536h-68.608v-131.072h324.608v51.2l-210.944 303.104q-4.096 4.096-12.288 14.336l-6.144 7.168v1.024l8.192-1.024q5.12-2.048 16.384-2.048h142.336v-67.584h68.608zM949.248 377.856v61.44h-164.864v-61.44h43.008l-26.624-81.92h-139.264l-26.624 81.92h43.008v61.44h-163.84v-61.44h39.936l131.072-377.856h93.184l131.072 377.856h39.936z" fill="currentColor"/> 1319 </symbol> 1320 1321 <symbol id="star-symbol" viewBox="0 0 24 24"> 1322 <path fill-rule="evenodd" d="M12.7102 1.75862C12.6068 1.45452 12.3212 1.25 12.0001 1.25C11.6789 1.25 11.3933 1.45452 11.29 1.75862L10.0763 5.32895C9.35275 7.45766 7.354 8.88932 5.10566 8.88932H1.00006C0.672189 8.88932 0.382323 9.10229 0.284334 9.41517C0.186345 9.72805 0.302947 10.0683 0.572242 10.2553L3.65737 12.3979C5.58097 13.7338 6.38709 16.1823 5.63336 18.3997L4.49158 21.7586C4.38736 22.0652 4.49171 22.4041 4.75035 22.599C5.00899 22.7939 5.3635 22.8007 5.62949 22.616L9.00536 20.2715C10.806 19.021 13.1941 19.021 14.9947 20.2715L18.3706 22.616C18.6366 22.8007 18.9911 22.7939 19.2498 22.599C19.5084 22.4041 19.6128 22.0652 19.5085 21.7586L18.3667 18.3997C17.613 16.1823 18.4191 13.7338 20.3427 12.3979L23.4279 10.2553C23.6972 10.0683 23.8138 9.72805 23.7158 9.41517C23.6178 9.10229 23.3279 8.88932 23.0001 8.88932H18.8945C16.6461 8.88932 14.6474 7.45766 13.9238 5.32895L12.7102 1.75862Z" fill="currentColor"/> 1323 </symbol> 1324 1325 <symbol id="view-symbol" viewBox="0 0 24 24"> 1326 <path fill-rule="evenodd" d="M2.56353 12.246C2.32865 12.0035 2.12553 11.7885 1.95981 11.6105C2.12553 11.4325 2.32865 11.2175 2.56353 10.9749C3.25841 10.2573 4.22661 9.30305 5.3235 8.35124C6.42359 7.39666 7.63502 6.46045 8.81682 5.7672C10.0188 5.06213 11.0934 4.66654 11.9432 4.66654C12.7931 4.66654 13.8677 5.06213 15.0697 5.7672C16.2515 6.46045 17.4629 7.39666 18.563 8.35124C19.6599 9.30305 20.6281 10.2573 21.323 10.9749C21.5578 11.2175 21.7609 11.4325 21.9267 11.6105C21.7609 11.7885 21.5578 12.0035 21.323 12.246C20.6281 12.9636 19.6599 13.9179 18.563 14.8697C17.4629 15.8243 16.2515 16.7605 15.0697 17.4538C13.8677 18.1588 12.7931 18.5544 11.9432 18.5544C11.0934 18.5544 10.0188 18.1588 8.81682 17.4538C7.63502 16.7605 6.42359 15.8243 5.3235 14.8697C4.22661 13.9179 3.25841 12.9636 2.56353 12.246ZM23.0535 11.6105C23.6802 11.0613 23.6801 11.0612 23.68 11.061L23.0535 11.6105ZM23.6796 12.1604L23.6739 12.1668L23.6578 12.1851L23.597 12.2534C23.544 12.3126 23.4665 12.3986 23.3668 12.5074C23.1676 12.725 22.8792 13.0345 22.5202 13.4053C21.803 14.1459 20.799 15.136 19.6552 16.1284C18.5146 17.1182 17.217 18.1263 15.9129 18.8912C14.629 19.6444 13.241 20.221 11.9432 20.221C10.6454 20.221 9.25751 19.6444 7.97359 18.8912C6.66953 18.1263 5.37185 17.1182 4.23126 16.1284C3.08749 15.136 2.08347 14.1459 1.3663 13.4053C1.00724 13.0345 0.718915 12.725 0.519637 12.5074C0.419974 12.3986 0.34251 12.3126 0.289532 12.2534L0.228691 12.1851L0.212564 12.1668L0.208166 12.1618L0.206247 12.1596C-0.0691805 11.8453 -0.0685328 11.3749 0.206895 11.0606C0.206759 11.0607 0.206247 11.0613 0.832948 11.6105L0.206895 11.0606L0.208166 11.0591L0.212564 11.0541L0.228691 11.0359L0.289532 10.9675C0.34251 10.9083 0.419974 10.8224 0.519637 10.7135C0.718915 10.4959
13261.00724 10.1864 1.3663 9.81563C2.08347 9.07501 3.08749 8.085 4.23126 7.09251C5.37185 6.10279 6.66953 5.0947 7.97359 4.32972C9.25751 3.57657 10.6454 3 11.9432 3C13.241 3 14.629 3.57657 15.9129 4.32972C17.217 5.0947 18.5146 6.10279 19.6552 7.09251C20.799 8.085 21.803 9.07501 22.5202 9.81563C22.8792 10.1864 23.1676 10.4959 23.3668 10.7135C23.4665 10.8224 23.544 10.9083 23.597 10.9675L23.6578 11.0359L23.6739 11.0541L23.68 11.061C23.9554 11.3753 23.955 11.8461 23.6796 12.1604ZM23.0535 11.6105L23.6796 12.1604C23.6797 12.1602 23.6802 12.1596 23.0535 11.6105ZM9.44342 11.6105C9.44342 10.2299 10.5626 9.11065 11.9432 9.11065C13.3238 9.11065 14.443 10.2299 14.443 11.6105C14.443 12.9911 13.3238 14.1103 11.9432 14.1103C10.5626 14.1103 9.44342 12.9911 9.44342 11.6105ZM11.9432 7.44411C9.64221 7.44411 7.77687 9.30945 7.77687 11.6105C7.77687 13.9115 9.64221 15.7768 11.9432 15.7768C14.2442 15.7768 16.1096 13.9115 16.1096 11.6105C16.1096 9.30945 14.2442 7.44411 11.9432 7.44411Z" fill="currentColor"/> 1327 </symbol> 1328 1329 <symbol id="warning-symbol" viewBox="0 0 1024 1024"> 1330 <path d="M584.704 785.408v-108.544q0-8.192-5.12-13.312t-12.288-5.12h-110.592q-7.168 0-12.288 5.12t-5.12 13.312v108.544q0 8.192 5.12 13.312t12.288 6.144h110.592q7.168 0 12.288-6.144t5.12-13.312zM583.68 572.416l10.24-263.168q0-6.144-5.12-10.24-7.168-6.144-14.336-6.144h-124.928q-6.144 0-14.336 6.144-5.12 4.096-5.12 12.288l9.216 261.12q0 5.12 6.144 9.216t13.312 3.072h105.472q8.192 0 14.336-3.072t5.12-9.216zM576.512 37.888l438.272 804.864q20.48 35.84-1.024 71.68-9.216 17.408-26.624 26.624t-35.84 10.24h-878.592q-18.432 0-35.84-10.24t-26.624-26.624q-21.504-35.84-1.024-71.68l439.296-804.864q9.216-17.408 26.624-27.648t36.864-10.24 36.864 10.24 27.648 27.648z" fill="currentColor"></path> 1331 </symbol> 1332 </svg> 1333</span> 1334
1335<script> 1336 'use strict'; 1337 1338 const isTouchDevice = () => ('ontouchstart' in window) || 1339 (navigator.maxTouchPoints > 0) || 1340 (navigator.msMaxTouchPoints > 0); 1341 1342 function switchBodyOverflow(signal) { 1343 const body = document.querySelector('body'); 1344 if (signal) { 1345 // html.style.overflowY = 'auto'; 1346 body.style.overflowY = 'auto'; 1347 body.style.overflowX = 'clip'; 1348 } else { 1349 // html.style.overflowX = html.style.overflowY = 'hidden'; 1350 body.style.overflowX = body.style.overflowY = 'hidden'; 1351 } 1352 } 1353 1354 /** 1355 * View model for header drawers 1356 * 1357 * @param String srcElementSel 1358 */ 1359 function initDrawer(srcElementSel) { 1360 return { 1361 open: false, 1362 srcElements: null, 1363 1364 init() { 1365 this.srcElements = document.querySelectorAll(srcElementSel); 1366 }, 1367 1368 toggle(signal = null) { 1369 signal = typeof signal == "boolean" ? signal : !this.open 1370 if (signal !== this.open) { 1371 this.open = signal; 1372 switchBodyOverflow(!signal); 1373 if (this.srcElements) { 1374 for (let i = 0; i < this.srcElements.length; ++i) { 1375 this.srcElements[i].setAttribute('aria-expanded', this.open); 1376 } 1377 } 1378 } 1379 }, 1380 1381 drawerListeners: { 1382 ['@keydown.window.escape']() { 1383 this.toggle(false); 1384 } 1385 } 1386 } 1387 } 1388 1389 /** 1390 * Sticky page header: disparaît au scroll bas, réapparaît (compact) au rebond. 1391 * Actif sur toutes les pages. 1392 */ 1393 function initStickyPageHeader() { 1394 // Pages « shop » : catégorie, fiche produit et résultats de recherche. 1395 // page-with-filter est posé par la navigation à facettes : il rattrape les listings bâtis sur 1396 // les handles catégorie mais servis par leur propre contrôleur (Webcooking_Promotions par 1397 // exemple), dont la classe body n'est pas catalog-category-view. 1398 const isCatalogPage = document.body.classList.contains('catalog-category-view') 1399 || document.body.classList.contains('catalog-product-view') 1400 || document.body.classList.contains('catalogsearch-result-index') 1401 || document.body.classList.contains('page-with-filter'); 1402 1403 // Micro-mouvements de scroll : ils ne portent pas de sens de défilement. 1404 const SCROLL_DELTA = 8; 1405 1406 // Passer en mode compact raccourcit le header, donc la page. Le navigateur recale alors le 1407 // scroll d'autant (ancrage de scroll) pour garder le contenu en place : avec un seuil unique, 1408 // ce recul repasse sous le point de bascule, le header se redéploie, la page rallonge, le 1409 // scroll est recalé vers le bas... et l'aller-retour ne s'arrête plus (is-compact/is-hidden 1410 // qui clignotent). 1411 // On sort donc du mode compact beaucoup plus bas qu'on y entre : l'écart entre les deux 1412 // seuils doit dépasser le recalage, sinon la boucle se réinstalle. Quelques pixels de 1413 // tolérance plutôt que zéro strict : le scroll ne retombe pas toujours pile sur 0. 1414 const COMPACT_EXIT = 8; 1415 1416 // Fenêtre pendant laquelle un évènement de scroll est mis sur le compte de ce recalage 1417 // plutôt que sur celui de l'utilisateur. Le navigateur recale dans la foulée du changement 1418 // de hauteur (une frame) ; la borne évite qu'un recalage qui n'arrive jamais fasse avaler 1419 // le premier geste suivant, qui est précisément le rebond attendu. 1420 const REFLOW_WINDOW = 150; 1421 1422 return { 1423 lastScrollY: 0, 1424 // Hauteur du header déployé. On la remesure tant que le header n'est pas compact, 1425 // jamais en mode compact où il rétrécit : un seuil qui suit cette hauteur réduite 1426 // oscille autour du point de bascule. 1427 threshold: 0, 1428 // Instant de la dernière bascule, voir REFLOW_WINDOW. 1429 reflowAt: 0, 1430 header: null, 1431 1432 init() { 1433 if (!isCatalogPage) return; 1434 this.header = this.$root.closest('header') || this.$root; 1435 this.measureThreshold(); 1436 window.addEventListener('scroll', this.onScroll.bind(this), {passive: true}); 1437 window.addEventListener('resize', this.measureThreshold.bind(this), {passive: true}); 1438 }, 1439 1440 measureThreshold() { 1441 if (!this.header.classList.contains('is-compact')) { 1442 this.threshold = this.header.offsetHeight; 1443 } 1444 }, 1445 1446 onScroll() { 1447 this.measureThreshold(); 1448 1449 const scrollY = Math.max(0, window.scrollY || document.documentElement.scrollTop); 1450 1451 if (this.reflowAt && performance.now() - this.reflowAt < REFLOW_WINDOW) { 1452 this.reflowAt = 0; 1453 this.lastScrollY = scrollY; 1454 return; 1455 } 1456 1457 const delta = scrollY - this.lastScrollY; 1458 1459 // Le seuil de delta ne filtre que le SENS du défilement, jamais la décision 1460 // compact/déployé : une fin de scroll s'achève par des pas de quelques pixels, 1461 // et si on renonçait à décider sur ces évènements le header resterait compact 1462 // en haut de page. 1463 const isMove = Math.abs(delta) >= SCROLL_DELTA; 1464 if (isMove) { 1465 this.lastScrollY = scrollY; 1466 } 1467 1468 // On entre en mode compact une fois le header dépassé ; on n'en sort qu'en haut 1469 // de page. Le header disparait à la descente et revient en compact au rebond. 1470 const wasCompact = this.header.classList.contains('is-compact'); 1471 const compact = wasCompact ? scrollY > COMPACT_EXIT : scrollY > this.threshold; 1472 const hidden = isMove ? delta > 0 : this.header.classList.contains('is-hidden'); 1473 1474 this.header.classList.toggle('is-hidden', compact && hidden); 1475 1476 if (compact !== wasCompact) { 1477 this.header.classList.toggle('is-compact', compact); 1478 this.reflowAt = performance.now(); 1479 } 1480 } 1481 }; 1482 } 1483 1484 /** 1485 * VM StickyHeader
1486 * Element sticks to the viewport top, hides on scrolling down and shows on scrolling up 1487 */ 1488 function initStickyHeader(extraHeight = 200) { 1489 return { 1490 triggerLimit: 0, 1491 lastScrollTop: 0, 1492 active: false, 1493 hide: false, 1494 1495 init() { 1496 const eRect = this.$root.getBoundingClientRect(); 1497 this.triggerLimit = extraHeight + eRect.top + eRect.height + (window.scrollY || document.documentElement.scrollTop); 1498 document.addEventListener('scroll', this.onScroll.bind(this), {passive: true}); 1499 }, 1500 1501 onScroll() { 1502 const scroll = window.scrollY || document.documentElement.scrollTop; 1503 if (scroll <= this.triggerLimit) { 1504 this.active = this.hide = false; 1505 this.$root.classList.remove('u-sticky-header', 'active', 'hide'); 1506 } else { 1507 this.$root.classList.add('u-sticky-header'); 1508 const isSticky = scroll > this.triggerLimit; 1509 if (this.active !== isSticky) { 1510 this.active = isSticky; 1511 this.active ? this.$root.classList.add('active') : this.$root.classList.remove('active'); 1512 } 1513 const scrollingDown = scroll > this.lastScrollTop; 1514 if (this.hide !== scrollingDown) { 1515 this.hide = scrollingDown; 1516 this.hide ? this.$root.classList.add('hide') : this.$root.classList.remove('hide'); 1517 } 1518 } 1519 this.lastScrollTop = scroll; 1520 } 1521 }; 1522 } 1523 1524 /** 1525 * VM StickyFooter 1526 * Element sticks to the viewport bottom, hides on scrolling down and shows on scrolling up 1527 * Also hides when reach a given element 1528 * 1529 * @param DomElement maxScrollElement 1530 * @param Boolean hiddenOnScroll 1531 */ 1532 function initStickyFooter(maxScrollElement = null) { 1533 return { 1534 lastScrollTop: 0, 1535 maxScroll: Number.MAX_VALUE, 1536 1537 init() { 1538 this.$root.classList.add('u-sticky-footer'); 1539 this.$root.style.zIndex = 20; 1540 document.addEventListener('scroll', this.onScroll.bind(this), {passive: true}); 1541 if (maxScrollElement) { 1542 const element = document.querySelector(maxScrollElement); 1543 if (element) { 1544 this.maxScroll = element.getBoundingClientRect().top + window.scrollY; 1545 } 1546 } 1547 }, 1548 1549 onScroll() { 1550 const st = window.scrollY || document.documentElement.scrollTop; 1551 st > this.lastScrollTop && st < this.maxScroll ? 1552 this.$root.classList.add('hide') : this.$root.classList.remove('hide'); 1553 this.lastScrollTop = st; 1554 } 1555 }; 1556 } 1557 1558 /** 1559 * Makes element as a horizontal scrolling container for items with same width 1560 * Scroller must include a element with x-ref="slider" with its first child including items to be displayed 1561 * Left/right buttons may be defined through x-ref="left" and x-ref="right" 1562 */ 1563 function initScroller() { 1564 return { 1565 isLeftBtnVisible: false, 1566 isRightBtnVisible: false, 1567 items: [], 1568 itemsVisibleInSlider: 0, 1569 firstVisibleItemIndex: 0, 1570 1571 init() { 1572 if (!this.$refs.slider) { 1573 return; 1574 } 1575 this.items = Array.from(this.$refs.slider.firstElementChild.children); 1576 this.itemWidth = Math.abs(this.items[0].offsetLeft - (this.items?.[1]?.offsetLeft || 0)); 1577 this.firstVisibleItemIndex = 0; 1578 this.updateScroller(); 1579 }, 1580 1581 slideToRight() { 1582 const maxScrollItemIndex = this.items.length - this.itemsVisibleInSlider; 1583 this.scrollTo(Math.min(maxScrollItemIndex, this.firstVisibleItemIndex + this.itemsVisibleInSlider)); 1584 }, 1585 1586 slideToLeft() {
1587 this.scrollTo(Math.max(0, this.firstVisibleItemIndex - this.itemsVisibleInSlider)); 1588 }, 1589 1590 scrollTo(index) { 1591 if (index >= 0 && index < this.items.length) { 1592 this.$refs.slider.scroll( 1593 { left: this.items[index].offsetLeft, behavior: 'smooth' } 1594 ); 1595 this.firstVisibleItemIndex = index; 1596 this.updateScroller(); 1597 } 1598 }, 1599 1600 updateScroller() { 1601 this.itemsVisibleInSlider = Math.floor(this.$refs.slider.clientWidth / this.itemWidth); 1602 this.isLeftBtnVisible = this.firstVisibleItemIndex > 0; 1603 this.isRightBtnVisible = this.itemsVisibleInSlider < (this.items.length - this.firstVisibleItemIndex - 1); 1604 }, 1605 1606 eventListeners: { 1607 ['@resize.window.debounce']() { 1608 this.updateScroller(); 1609 }, 1610 ['@touchmove.passive']() { 1611 this.firstVisibleItemIndex = Math.floor(Math.abs(this.$refs.items.getBoundingClientRect().left) / this.itemWidth) 1612 this.updateScroller(); 1613 }, 1614 ['@click'](event) { 1615 const btn = event.target.closest('button'); 1616 if (btn) { 1617 const isLeftBtn = btn.isSameNode(this.$refs.left); 1618 isLeftBtn ? this.slideToLeft() : this.slideToRight(); 1619 } 1620 } 1621 } 1622 } 1623 } 1624 1625 document.addEventListener("DOMContentLoaded", function(event) { 1626 // Obfuscation (see https://www.410-gone.fr/seo/optimisation-on-site/maillage-interne/cocon-semantique/obfuscation.html) 1627 var classname = document.getElementsByClassName("qcd"); 1628 for (let i = 0; i < classname.length; ++i) { 1629 //click gauche 1630 classname[i].addEventListener('click', myFunction, false); 1631 //click droit 1632 classname[i].addEventListener('contextmenu', myRightFunction, false); 1633 } 1634 }); 1635 // fonction du click gauche 1636 var myFunction = function(event) { 1637 var attribute = this.getAttribute("data-qcd"); 1638 if(event.ctrlKey) { 1639 var newWindow = window.open(decodeURIComponent(window.atob(attribute)), '_blank'); 1640 newWindow.focus(); 1641 } else { 1642 document.location.href= decodeURIComponent(window.atob(attribute)); 1643 } 1644 }; 1645 //fonction du click droit 1646 var myRightFunction = function(event) { 1647 var attribute = this.getAttribute("data-qcd"); 1648 if(event.ctrlKey) { 1649 var newWindow = window.open(decodeURIComponent(window.atob(attribute)), '_blank'); 1650 newWindow.focus(); 1651 } else { 1652 window.open(decodeURIComponent(window.atob(attribute)),'_blank'); 1653 } 1654 } 1655 1656 /** 1657 * Fetch server content 1658 * @param Element|String content 1659 * @param String insertionNode 1660 */ 1661 function fetchContent(content, insertionNode = 'body') { 1662 const url = new URL('https://www.jardindupicvert.com/pdfcore/index/fetch/'); 1663 const params = { 1664 content: content, 1665 form_key: hyva.getFormKey(), 1666 }; 1667 Object.keys(params).forEach(key => url.searchParams.append(key, params[key])); 1668 const target = insertionNode instanceof Element ? insertionNode : document.querySelector(insertionNode); 1669 if (target) { 1670 return fetch(url, {headers: {"X-Requested-With": "XMLHttpRequest"}}) 1671 .then(response => response.json(response)) 1672 .then(response => { 1673 response?.result && target?.insertAdjacentHTML('beforeend', response?.result); 1674 return response?.result; 1675 }); 1676 } 1677 } 1678 1679 // Fetch non-essential svg symbols 1680 document.addEventListener("DOMContentLoaded", function() { 1681 setTimeout(() => { 1682 fetchContent('svg-symbols-defer'); 1683 }, 1000); 1684 }); 1685 1686</script>
1686 1687
1688<script> 1689 (function(hyva) { 1690 const formValidationRules = { 1691 required(value, options, field, context) { 1692 const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element, 1693 fieldName = getFieldName(field), 1694 msg = fieldName 1695 ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020est\u0020obligatoire.', fieldName) 1696 : 'Ce\u0020champ\u0020est\u0020obligatoire.'; 1697 1698 if (el.type === 'radio' || el.type === 'checkbox') { 1699 return (value === undefined || value.length === 0) ? msg : true; 1700 } 1701 1702 el.setAttribute('required', ''); 1703 el.checkValidity(); 1704 1705 return el.validity.valueMissing ? msg : true; 1706 }, 1707 maxlength(value, options, field, context) { 1708 const n = Number(options) 1709 if (value.length > n) { 1710 const fieldName = getFieldName(field); 1711 return fieldName 1712 ? n === 1 1713 ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020peut\u0020pas\u0020\u00EAtre\u0020plus\u0020long\u0020que\u00201\u0020caract\u00E8re.', fieldName) 1714 : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020peut\u0020pas\u0020\u00EAtre\u0020plus\u0020long\u0020que\u0020\u00252\u0020caract\u00E8res.', fieldName, options) 1715 : n === 1 1716 ? 'Veuillez\u0020entrer\u0020au\u0020maximum\u00201\u0020caract\u00E8re.' 1717 : hyva.strf('Veuillez\u0020entrer\u0020au\u0020maximum\u0020\u00250\u0020caract\u00E8res.', options); 1718 } 1719 return true; 1720 }, 1721 minlength(value, options, field, context) { 1722 const n = Number(options) 1723 if (value.length > 0 && value.length < n) { 1724 const fieldName = getFieldName(field); 1725 return fieldName 1726 ? n === 1 1727 ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020comporter\u0020au\u0020moins\u00201\u0020caract\u00E8re.', fieldName) 1728 : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020comporter\u0020au\u0020moins\u0020\u00252\u0020caract\u00E8res.', fieldName, options) 1729 : n === 1 1730 ? 'Veuillez\u0020entrer\u0020au\u0020moins\u00201\u0020caract\u00E8re.' 1731 : hyva.strf('Veuillez\u0020entrer\u0020au\u0020moins\u0020\u00250\u0020caract\u00E8res.', options); 1732 } 1733 return true; 1734 }, 1735 max(value, options, field, context) { 1736 field.element.setAttribute('max', options); 1737 field.element.checkValidity(); 1738 if (field.element.validity.rangeOverflow) { 1739 const fieldName = getFieldName(field); 1740 return fieldName 1741 ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options) 1742 : hyva.strf('Please\u0020enter\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options); 1743 } 1744 return true; 1745 }, 1746 min(value, options, field, context) { 1747 field.element.setAttribute('min', options); 1748 field.element.checkValidity(); 1749 if (field.element.validity.rangeUnderflow) { 1750 const fieldName = getFieldName(field); 1751 return fieldName 1752 ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options) 1753 : hyva.strf('Please\u0020enter\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options); 1754 } 1755 return true; 1756 }, 1757 step(value, options, field, context) { 1758 field.element.setAttribute('step', options); 1759 field.element.checkValidity(); 1760 if (field.element.validity.stepMismatch) { 1761 const val = Number(value), 1762 step = Number(options), 1763 fieldName = getFieldName(field), 1764 nearestLowerValue = Math.floor(val / step) * step,
1765 nearestUpperValue = Math.ceil(val / step) * step; 1766 return fieldName 1767 ? hyva.str('\u00251\u0020field\u0020is\u0020invalid.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00252\u0022\u0020and\u0020\u0022\u00253\u0022.', fieldName, nearestLowerValue, nearestUpperValue) 1768 : hyva.strf('Please\u0020enter\u0020a\u0020valid\u0020value.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00250\u0022\u0020and\u0020\u0022\u00251\u0022.', nearestLowerValue, nearestUpperValue); 1769 } 1770 return true; 1771 }, 1772 pattern(value, options, field, context) { 1773 field.element.setAttribute('pattern', options); 1774 field.element.checkValidity(); 1775 if (field.element.validity.patternMismatch) { 1776 const fieldName = getFieldName(field); 1777 return fieldName 1778 ? field.element.pattern 1779 ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020se\u0020conformer\u0020au\u0020format\u0020demand\u00E9\u003A\u0020\u00252.', fieldName, field.element.pattern) 1780 : hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020ne\u0020se\u0020conforme\u0020pas\u0020au\u0020format\u0020demand\u00E9.', fieldName) 1781 : field.element.pattern 1782 ? hyva.strf('Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9\u003A\u0020\u00250.', field.element.pattern) 1783 : 'Veuillez\u0020respecter\u0020le\u0020format\u0020demand\u00E9.'; 1784 } 1785 return true; 1786 }, 1787 email(value, options, field, context) { 1788 const rule = /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i; 1789 if (value.length > 0 && !rule.test(value)) { 1790 const fieldName = getFieldName(field); 1791 return fieldName 1792 ? hyva.str('Le\u0020champ\u0020\u0022\u00251\u0022\u0020doit\u0020contenir\u0020une\u0020adresse\u0020email\u0020valide\u0020\u0028par\u0020ex.\u0020jean\u0040domain.com\u0029.', fieldName) 1793 : 'Veuillez\u0020entrer\u0020une\u0020adresse\u0020email\u0020valide\u0020\u0028par\u0020ex.\u0020jean\u0040domain.com\u0029.'; 1794 } 1795 return true; 1796 }, 1797 password(value, options, field, context) { 1798 const rule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/; 1799 if (value.length > 0 && !rule.test(value)) { 1800 const fieldName = getFieldName(field); 1801 return fieldName 1802 ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020at\u0020least\u0020one\u0020upper\u0020case,\u0020one\u0020lower\u0020case,\u0020one\u0020digit\u0020and\u0020one\u0020special\u0020character\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026\u002A\u002D\u0029', fieldName) 1803 : 'Veuillez\u0020fournir\u0020au\u0020moins\u0020une\u0020majuscule,\u0020une\u0020minuscule,\u0020un\u0020chiffre\u0020et\u0020un\u0020caract\u00E8re\u0020sp\u00E9cial\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026\u002A\u002D\u0029'; 1804 } 1805 return true; 1806 }, 1807 equalTo(value, options, field, context) { 1808 const dependencyField = context.fields[options].element; 1809 if (value !== dependencyField.value) { 1810 const dependencyFieldName = 1811 dependencyField.label || 1812 dependencyField.title || 1813 (dependencyField.labels && dependencyField.labels[0] && dependencyField.labels[0].innerText) || 1814 dependencyField.name, 1815 fieldName = getFieldName(field); 1816 return fieldName
1817 ? hyva.str('\u00251\u0020field\u0020value\u0020must\u0020be\u0020the\u0020same\u0020as\u0020\u0022\u00252\u0022.', fieldName, dependencyFieldName) 1818 : hyva.strf('Ce\u0020champ\u0020doit\u0020correspondre\u0020au\u0020champ\u0020\u0022\u00250\u0022.', dependencyFieldName); 1819 } 1820 return true; 1821 } 1822 }; 1823 1824 function raceSome(promises, pred) { 1825 return new Promise((resolve, reject) => { 1826 1827 if (promises.length === 0) { 1828 return resolve(); 1829 } 1830 1831 let settled = false, nDone = 0; 1832 1833 const resolveIf = v => { 1834 if (!settled && (pred(v) || ++nDone === promises.length)) { 1835 settled = true; 1836 resolve(v); 1837 } 1838 return v; 1839 } 1840 1841 promises.map(promise => { 1842 promise.then(resolveIf).catch(reason => { 1843 settled = true; 1844 reject(reason) 1845 }); 1846 return promise; 1847 }); 1848 }); 1849 } 1850 1851 const INPUT_ATTRIBUTE_RULES = {min: 'min', max: 'max', required: 'required', minlength: 'minlength', maxlength: 'maxlength', step: 'step', pattern: 'pattern'} 1852 const INPUT_TYPE_RULES = {email: 'email'} 1853 1854 function getRules(element) { 1855 let rules = {}; 1856 Object.keys(INPUT_ATTRIBUTE_RULES).forEach(attrName => { 1857 if (element.hasAttribute(attrName)) { 1858 rules[INPUT_ATTRIBUTE_RULES[attrName]] = element.getAttribute(attrName); 1859 } 1860 }) 1861 if (INPUT_TYPE_RULES[element.type]) { 1862 rules[INPUT_TYPE_RULES[element.type]] = true; 1863 } 1864 1865 if (element.dataset.validate) { 1866 try { 1867 Object.assign(rules, JSON.parse(element.dataset.validate)); 1868 } catch (error) { 1869 console.error('Validator error. Cannot parse data-validate attribute of element:\n', element); 1870 } 1871 } 1872 1873 return rules; 1874 } 1875 1876 function isInvalidRuleResult(ruleState) { 1877 return typeof ruleState === 'string' || !ruleState || (ruleState.type && ruleState.content); 1878 } 1879 1880 async function runValidateFn(rule, options, value, field) { 1881 return formValidationRules[rule](value, options, field, this); 1882 } 1883 1884 function generateId() { 1885 let id; 1886 do { 1887 id = `${this.idPrefix}-${++this.idSeq}`; 1888 } while (document.getElementById(id)); 1889 return id; 1890 } 1891 1892 function isVisible(element) { 1893 const el = element.type !== 'hidden' ? element : (element.parentElement || {}); 1894 return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length) 1895 } 1896 1897 function elementWillValidate(element) { 1898 return (element.willValidate || element.type === 'hidden') 1899 && element.tagName !== 'BUTTON' 1900 && element.disabled === false 1901 && !(element.tagName === 'INPUT' && element.type === 'submit') 1902 && (element.hasAttribute('data-validate-hidden') || isVisible(element)) 1903 } 1904 1905 function createMessageContainer(el, fieldWrapperClassName) { 1906 if (! el.parentElement) { 1907 return; 1908 } 1909 const refocus = document.activeElement === el; 1910 const wrapper = document.createElement('div'); 1911 wrapper.classList.add.apply(wrapper.classList, fieldWrapperClassName.split(' ')); 1912 el.parentElement.insertBefore(wrapper, el); 1913 wrapper.appendChild(el); 1914 refocus && document.activeElement !== el && el.focus(); 1915 return wrapper; 1916 } 1917 1918 function containerNotFound(selector, el) { 1919 const msg = `Cannot find message container element ${selector} of ${el.name}`; 1920 console.error(msg, el); 1921 throw msg; 1922 } 1923 1924 function createTextInputFrom(el) { 1925 const text = document.createElement('INPUT'); 1926 text.type = 'text'; 1927 text.value = el.value; 1928 return text; 1929 } 1930 1931 function classNamesToSelector(classNames) { 1932 return classNames.split(' ') 1933 .filter(className => className.length > 0) 1934 .map(className => `.${className}`) 1935 .join('') 1936 } 1937 1938 function hasMessagesWrapper(field, messagesWrapperClassName) { 1939 return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName)); 1940 } 1941
1942 function getMessagesWrapper(field, messagesWrapperClassName) { 1943 if (hasMessagesWrapper.call(this, field, messagesWrapperClassName)) { 1944 return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName)); 1945 } 1946 1947 const msgWrapper = document.createElement('ul'); 1948 const msgId = generateId.call(this); 1949 msgWrapper.id = msgId; 1950 field.element.setAttribute('aria-errormessage', msgId); 1951 field.element.setAttribute('aria-describedby', msgId); 1952 msgWrapper.classList.add.apply(msgWrapper.classList, messagesWrapperClassName.split(' ')); 1953 if (field.validateOnChange) { 1954 msgWrapper.setAttribute('aria-live', 'polite'); 1955 } 1956 this.getMessageContainer(field).appendChild(msgWrapper); 1957 1958 return msgWrapper; 1959 } 1960 1961 function getCheckedValues(field) { 1962 const name = field.element.name.replace(/([\\"])/g, '\\$1'); 1963 const elements = field.element.form.querySelectorAll('input[name="' + name + '"]:checked'); 1964 return Array.from(elements).map(el => el.value); 1965 } 1966 1967 function escapeHtml(s) { 1968 const div = document.createElement('div') 1969 div.innerText = s; 1970 return div.innerHTML; 1971 } 1972 1973 1974 function formValidation(form, options = {}) { 1975 const formElement = form || this.$el; 1976 1977 if (formElement.dataset && formElement.dataset.options) { 1978 try { 1979 options = Object.assign(options, JSON.parse(formElement.dataset.options || '{}')); 1980 } catch (e) { 1981 throw new Error('Cannot read the form options from the data-options attribute: not valid JSON'); 1982 } 1983 } 1984 1985 // Disable browser default validation 1986 if (formElement.tagName === 'FORM') { 1987 formElement.setAttribute('novalidate', ''); 1988 } else { 1989 console.error('formValidation can be initialized only on FORM element', formElement); 1990 return; 1991 } 1992 1993 options = Object.assign({ 1994 fieldWrapperClassName: 'field field-reserved', 1995 messagesWrapperClassName: 'messages', 1996 validClassName: 'field-success', 1997 invalidClassName: 'field-error', 1998 pageMessagesWrapperSelector: null, 1999 scrollToFirstError: true, 2000 }, options || {}); 2001 2002 return { 2003 state: { 2004 valid: false, 2005 }, 2006 isSubmitting: false, 2007 fields: {}, 2008 idSeq: 0, 2009 idPrefix: formElement.id || 'vld-msg', 2010 setupFields(elements) { 2011 this.fields = {}; 2012 Array.from(elements).forEach(element => { 2013 if (elementWillValidate(element)) { 2014 this.setupField(element); 2015 } 2016 }); 2017 }, 2018 setupField(element) { 2019 if (! element) return; 2020 const onChange = !!element.dataset.onChange; 2021 if (elementWillValidate(element)) { 2022 const rules = getRules(element); 2023 if (Object.keys(rules).length > 0) { 2024 if (this.fields[element.name]) { 2025 Object.assign(this.fields[element.name].rules, rules); 2026 } else { 2027 this.fields[element.name] = { 2028 element, 2029 rules: rules, 2030 validateOnChange: onChange, 2031 state: { 2032 valid: null, 2033 rules: {} 2034 } 2035 } 2036 } 2037 } 2038 } else { 2039 console.error('Element will not validate', element); 2040 } 2041 }, 2042 onSubmit(event) { 2043 if (event.target.tagName === 'FORM') { 2044 event.preventDefault(); 2045 2046 if (this.isSubmitting) return; 2047 this.isSubmitting = true; 2048 2049 this.validate() 2050 .then(() => event.target.submit()) 2051 .catch(invalidElements => { 2052 this.isSubmitting = false;
2053 }); 2054 } 2055 }, 2056 onChange(event) { 2057 event.target.dataset.onChange = 'true'; 2058 if (!Object.keys(this.fields).length) { 2059 this.setupFields(formElement.elements); 2060 } 2061 if (!Object.keys(this.fields).includes(event.target.name)) { 2062 this.setupField(event.target); 2063 } 2064 const field = this.fields[event.target.name]; 2065 2066 this.validateField(field); 2067 field && field.element.removeAttribute('data-on-change') 2068 }, 2069 validateSafe() { 2070 return new Promise(resolve => this.validate().then(() => resolve(true)).catch(() => {})) 2071 }, 2072 validate() { 2073 if (!Object.keys(this.fields).length || !Object.keys(this.fields).length !== formElement.elements.length) { 2074 this.setupFields(formElement.elements); 2075 } 2076 return new Promise(async (resolve, reject) => { 2077 if (formElement.elements) { 2078 await raceSome(this.validateFields(), result => result !== true) 2079 const invalidFields = Object.values(this.fields).filter(field => !field.state.valid); 2080 this.state.valid = invalidFields.length === 0; 2081 if (this.state.valid) { 2082 resolve(); 2083 } else { 2084 if (options.scrollToFirstError && invalidFields.length > 0) { 2085 invalidFields[0].element.focus() 2086 invalidFields[0].element.select && invalidFields[0].element.select(); 2087 } 2088 reject(invalidFields.map(field => field.element)); 2089 } 2090 } 2091 }); 2092 }, 2093 validateFields() { 2094 const fields = Object.values(this.fields); 2095 2096 fields.forEach(field => { 2097 this.getMessageContainer(field).classList.remove(options.validClassName, options.invalidClassName) 2098 }); 2099 return fields.map(field => this.validateField(field)) 2100 }, 2101 validateField(field) { 2102 if (! field || ! elementWillValidate(field.element)) { 2103 return new Promise(resolve => resolve(true)) 2104 } 2105 2106 let value; 2107 if (field.element.type === 'checkbox') { 2108 value = getCheckedValues(field); 2109 } else if (field.element.type === 'radio') { 2110 value = getCheckedValues(field)[0] || undefined; 2111 } else if (field.element.tagName === 'SELECT' && field.element.multiple) { 2112 value = Array.from(field.element.selectedOptions).map(opt => opt.value); 2113 } else { 2114 value = field.element.value; 2115 } 2116 2117 const rules = field.rules || {}; 2118 2119 field.state.valid = true; 2120 this.showFieldState(field); 2121 2122 2123 const fieldValidations = Object.keys(rules).filter(rule => formValidationRules[rule]).map(async rule => { 2124 return runValidateFn.call(this, rule, rules[rule], value, field).then(result => { 2125 field.state.rules[rule] = result; 2126 return result; 2127 }) 2128 }); 2129 2130 return new Promise(resolve => { 2131 Promise.all(fieldValidations).then(results => { 2132 field.state.valid = !elementWillValidate(field.element) || rules.length === 0 || !results.some(isInvalidRuleResult)
2133 this.showFieldState(field); 2134 resolve(field.state.valid); 2135 }) 2136 }); 2137 }, 2138 getMessagesByField(field) { 2139 const messages = []; 2140 const invalidRules = Object.keys(field.state.rules).filter(rule => isInvalidRuleResult(field.state.rules[rule])); 2141 2142 field.rules && Object.keys(field.rules).forEach((rule) => { 2143 if (invalidRules.includes(rule)) { 2144 const customMessage = field.element.getAttribute('data-msg-' + rule); 2145 const message = customMessage ? customMessage : field.state.rules[rule]; 2146 const ruleOptions = JSON.parse(JSON.stringify(field.rules[rule])); 2147 2148 if (typeof message === 'undefined' || message === null || (typeof message !== 'string' && ! message.type)) { 2149 messages.push(hyva.strf('Validation rule "%0" failed.', rule)); 2150 } else if (Array.isArray(ruleOptions)) { 2151 ruleOptions.unshift(message.type ? message.content : message); 2152 const content = hyva.strf.apply(null, ruleOptions); 2153 messages.push(message.type ? {type: message.type, content} : content); 2154 } else { 2155 const content = hyva.strf(message.type ? message.content : message, ruleOptions) 2156 messages.push(message.type ? {type: message.type, content} : content); 2157 } 2158 } 2159 }); 2160 return messages; 2161 }, 2162 /** @deprecated */ 2163 getFieldWrapper(field) { 2164 return this.getMessageContainer(field) 2165 }, 2166 getMessageContainer(field) { 2167 let container; 2168 const pageSelector = field.element.getAttribute('data-validation-container') || options.pageMessagesContainerSelector; 2169 if (pageSelector) { 2170 container = document.querySelector(pageSelector) 2171 || containerNotFound(pageSelector, field.element) 2172 } else { 2173 const containerSelector = classNamesToSelector(options.fieldWrapperClassName); 2174 container = field.element.closest(containerSelector) 2175 || createMessageContainer(field.element, options.fieldWrapperClassName) 2176 || containerNotFound(containerSelector, field.element); 2177 } 2178 2179 return container; 2180 }, 2181 showFieldState(field) { 2182 const container = this.getMessageContainer(field), 2183 hasErrorMessages = hasMessagesWrapper.call(this, field, options.messagesWrapperClassName), 2184 messages = this.getMessagesByField(field).map(m => { 2185 return m.type !== 'html' ? escapeHtml(m.type ? m.content : m) : m.content; 2186 }); 2187 container.classList.toggle(options.validClassName, field.state.valid && ! hasErrorMessages); 2188 container.classList.toggle(options.invalidClassName, !field.state.valid || hasErrorMessages); 2189 this.createHtmlErrorMessage(field, messages); 2190 2191 if (field.state.valid) { 2192 field.element.removeAttribute('aria-invalid'); 2193 } else { 2194 field.element.setAttribute('aria-invalid', 'true'); 2195 if (! document.activeElement) { 2196 field.element.focus(); 2197 } 2198 } 2199 }, 2200 removeMessages(field, messagesClass) { 2201 if (! hasMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName)) { 2202 return; 2203 } 2204 2205 const msgWrapper = getMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName); 2206 const messages = msgWrapper.querySelectorAll(`[data-msg-field='${field.element.name}']`);
2207 Array.from(messages).forEach(msg => msg.remove()); 2208 if (msgWrapper && msgWrapper.childElementCount === 0) { 2209 field.element.removeAttribute('aria-errormessage'); 2210 field.element.removeAttribute('aria-describedby'); 2211 msgWrapper.remove(); 2212 } 2213 }, 2214 createErrorMessage(field, messages) { 2215 const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml) 2216 this.createHtmlErrorMessage(field, htmlMessages); 2217 }, 2218 createHtmlErrorMessage(field, messages) { 2219 this.removeMessages(field, options.messagesWrapperClassName); 2220 field.element.removeAttribute('aria-errormessage'); 2221 field.element.removeAttribute('aria-describedby'); 2222 2223 if (!field.state.valid) { 2224 const msgWrapper = this.addHtmlMessages(field, options.messagesWrapperClassName, messages); 2225 field.element.setAttribute('aria-errormessage', msgWrapper.id); 2226 field.element.setAttribute('aria-describedby', msgWrapper.id); 2227 } 2228 }, 2229 /** @deprecated */ 2230 createMessage(field, message) { 2231 return this.addMessages(field, options.messagesWrapperClassName, message); 2232 }, 2233 addMessages(field, messagesClass, messages) { 2234 const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml) 2235 return this.addHtmlMessages(field, messagesClass, htmlMessages); 2236 }, 2237 addHtmlMessages(field, messagesClass, htmlMessages) { 2238 const msgWrapper = getMessagesWrapper.call(this, field, messagesClass); 2239 2240 (Array.isArray(htmlMessages) ? htmlMessages : [htmlMessages]).forEach((htmlMessage) => { 2241 const li = document.createElement('li'); 2242 li.innerHTML = htmlMessage; 2243 li.setAttribute('data-msg-field', field.element.name); 2244 msgWrapper.appendChild(li); 2245 }); 2246 2247 return msgWrapper; 2248 }, 2249 setField(name, value) { 2250 this.fields[name].element.value = value; 2251 this.fields[name].element.dispatchEvent((new Event('input'))); 2252 this.validateField(this.fields[name]); 2253 } 2254 } 2255 } 2256 2257 function getFieldName(field) { 2258 const fieldName = field.element?.getAttribute('title') 2259 || document.querySelector(`label[for="${field.element?.id}"]`)?.innerText; 2260 2261 return fieldName 2262 ? fieldName.trim() 2263 : ''; 2264 } 2265 2266 hyva.formValidation = formValidation; 2267 hyva.formValidation.rules = formValidationRules; 2268 hyva.formValidation.setInputAttributeRuleName = (attrName, ruleName) => INPUT_ATTRIBUTE_RULES[attrName] = ruleName || attrName; 2269 hyva.formValidation.setInputTypeRuleName = (typeName, ruleName) => INPUT_TYPE_RULES[typeName] = ruleName || typeName; 2270 hyva.formValidation.addRule = (name, validator) => formValidationRules[name] = validator; 2271 hyva.formValidation.getFieldName = getFieldName; 2272 }(window.hyva = window.hyva || {})); 2273 2274 window.addEventListener('alpine:init', () => { 2275 Alpine.data('hyva.formValidation', hyva.formValidation); 2276 Alpine.data('hyva.formValidation($el)', hyva.formValidation); 2277 }, {once: true}); 2278 //# sourceURL=hyva-advanced-form-validation.js 2279</script>
2279 2280<div class="page-wrapper"><header class="page-header"><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white 2281 contentarea" 2282 href="#contentarea"> 2283<span> 2284Allez au contenu </span> 2285</a> 2286<div id="header" 2287 x-data="initStickyPageHeader()" 2288 class="relative z-header w-full bg-container-darker" 2289> 2290<div class="container"> 2291<div class="header-top-bar flex flex-wrap md:flex-nowrap items-center justify-between gap-y-1 py-2"> 2292 2293<button class="compact-burger hidden order-0 shrink-0 text-white text-4xl font-bold leading-none cursor-pointer" 2294 @click="$dispatch('open-main-menu')" 2295 aria-label="Menu" 2296 >≡</button> 2297 2298<div class="header-logo order-1 max-w-1/2 xs:max-w-[180px] sm:max-w-[240px] transition-all duration-500"> 2299<a href="https://www.jardindupicvert.com/" 2300 aria-label="Go to Home page" 2301 > 2302<svg class="logo-svg w-full aspect-[3.775]" 2303 viewBox="0 0 302 80" 2304 title="Le Jardin du Pic Vert" 2305 > 2306 <style type="text/css"> 2307 .st0{fill:#004650;} .st1{fill:#2DAFAA;} .st2{fill:#C86464;} .st3{fill:#FFFFFF;} 2308 </style> 2309 <g class="layer"> 2310 <g id="svg_2"> 2311 <path class="st1" d="m87.22,44.34284c-0.48,-1.85 -1.08,-3.67 -1.77,-5.45c0.17,5.03 -0.41,10.09 -1.85,14.93c-1.79,5.99 -5.37,11.88 -11.65,13.84c-0.68,0.21 -2.28,-1.55 -1.68,-1.73c6.21,-1.94 9.73,-7.89 11.43,-13.81c1.69,-5.86 2.18,-12.06 1.52,-18.12c-0.15,-0.37 -0.23,-0.62 -0.2,-0.66c-0.6,0.64 -0.87,1.98 -1.31,2.8c-0.51,0.95 -1.07,1.88 -1.68,2.76c-1.23,1.78 -2.67,3.41 -4.29,4.82c-2.79,2.43 -5.36,4.81 -7.64,7.73c-3.98,5.1 -7.79,14.98 -0.67,19.34c4.48,2.74 10.67,0.75 14.58,-2.11c2.95,-2.16 5.11,-5.4 5.92,-8.96c0.27,-1.17 0.39,-2.37 0.48,-3.56c0.3,-3.97 -0.2,-7.99 -1.19,-11.82" id="svg_3"/> 2312 <path class="st1" d="m56.83,55.35284c-0.54,4.44 -0.68,9.16 1,13.39c1.66,4.19 5.23,7.65 9.24,9.62c3.77,1.86 8.53,2.59 12.47,0.85c2.1,-0.93 4.07,-2.19 5.81,-3.69c1.94,-1.67 3.51,-3.68 5.22,-5.56c1.4,-1.54 3.29,-4.02 5.54,-4.21c2.55,-0.21 3.24,2.25 2.59,4.28c-0.34,1.07 2.77,3.63 3.12,2.54c0.76,-2.36 -0.26,-4.76 -1.81,-6.54c-1.41,-1.63 -3.64,-3.3 -5.88,-3.4c-2.1,-0.09 -3.81,1.61 -5.16,3c-1.64,1.69 -3.11,3.54 -4.74,5.24c-3.18,3.33 -7.54,6.38 -12.33,6.2c-3.67,-0.14 -7.71,-1.6 -9.94,-4.67c-2.94,-4.06 -2.58,-9.79 -2,-14.51c0.1,-0.82 -0.85,-1.72 -1.42,-2.19c-0.25,-0.19 -1.61,-1.14 -1.71,-0.35" id="svg_4"/> 2313 <path class="st1" d="m51.15,52.72284c-5.21,-5.84 -13.67,-7.6 -21.11,-8.06c-4.91,-0.3 -10.72,0.24 -15.41,-1.42c-3.85,-1.36 -7.52,-3.15 -10.9,-5.39c-1.29,-0.85 -2.53,-1.77 -3.73,-2.75c0.95,1.73 2.01,3.4 3.18,5c4.72,6.47 11.05,11.66 18.39,14.9c7.96,3.52 16.84,4.79 25.47,3.72c0.45,-0.06 0.93,0.3 1.26,0.62c0.53,0.31 1.03,0.85 1.31,1.2c0.2,0.25 1.15,1.58 0.35,1.7c-4.96,0.74 -10.02,0.64 -14.95,-0.24c-13.9,-2.46 -25.87,-10.87 -34.23,-22c3.61,9.27 8.63,18.06 16.21,24.61c5.9,5.1 14.46,7.1 22.06,7.02c6.53,-0.07 14.17,-4.02 14.89,-11.11c0.26,-2.83 -0.91,-5.68 -2.79,-7.8" id="svg_5"/> 2314 <path class="st2" d="m49.68,31.29284c0.55,1.06 0.98,1.9 1.32,2.4c0.12,0.18 0.24,0.38 0.36,0.58c0.03,-0.75 0.08,-1.49 0.13,-2.22c0.17,-2.26 0.33,-4.4 -0.36,-6.48c-0.47,-1.42 -0.86,-2.51 -1.58,-3.57l-0.25,-0.37c-0.72,-1.04 -1.53,-2.23 -1.65,-3.73c-0.21,-2.64 0.62,-5.7 2.18,-8c0.21,-0.31 0.42,-0.61 0.64,-0.91c1.22,-1.7 1.89,-2.75 1.44,-4.38c-0.37,-1.34 -1.69,-2.5 -3.08,-3.38c-2.9,1.85 -5.85,4.26 -6.26,7.62c-0.2,1.71 0.49,3.41 1.22,5.21c0.76,1.87 1.55,3.8 1.39,5.92c-0.07,0.91 -0.32,1.73 -0.72,2.41c2.43,3.54 4.06,6.66 5.22,8.9" id="svg_6"/> 2315 <path class="st2" d="m62.85,2.98284c-3,3.27 -4.78,6.98 -6.79,11.49c-1.51,3.38 -3.34,7.5 -2.89,11.1c0.6,2.24 0.44,4.46 0.28,6.62c-0.17,2.32 -0.32,4.52 0.44,6.62c0.45,0.63 0.93,1.15 1.47,1.44c0.11,0.06 0.19,0.09 0.25,0.12c0.07,-0.35 0.06,-1 0.06,-1.35l-0.01,-0.34c-0.02,-4.11 1.58,-8.59 4.61,-12.95c0.9,-1.29 2,-2.46 3.07,-3.6c1.89,-2.01 3.68,-3.91 4.39,-6.38c0.5,-1.73 0.21,-3.58 -0.09,-5.53c-0.2,-1.33 -0.42,-2.7 -0.38,-4.09c0.06,-2.44 1.13,-3.17 2.02,-3.36c1.64,-0.34 3.73,1.17 5.26,2.74c-0.06,-2.33 -0.4,-5.31 -4.02,-5.5c-2.89,-0.15 -5.34,1.03 -7.47,2.74c-0.06,0.09 -0.13,0.16 -0.2,0.23" id="svg_7"/> 2316 <path class="st2" d="m53.79,4.09284c0.72,2.62 -0.53,4.37 -1.74,6.05c-0.2,0.28 -0.41,0.57 -0.61,0.86c-1.32,1.94 -2.03,4.53 -1.85,6.74c0.08,0.97 0.68,1.84 1.31,2.77l0.26,0.38c0.11,0.16 0.2,0.33 0.3,0.49c0.57,-2.71 1.74,-5.35 2.76,-7.64c1.11,-2.48 2.14,-4.7 3.33,-6.77c-1.21,-2.5 -3.05,-4.6 -5.34,-5.51c0.73,0.77 1.3,1.64 1.58,2.63" id="svg_8"/> 2317 <path class="st2" d="m43.08,20.54284c0.05,-0.22 0.09,-0.45 0.11,-0.69c0.12,-1.66 -0.54,-3.3 -1.25,-5.03c-0.79,-1.95 -1.61,-3.97 -1.35,-6.18c0.22,-1.79 0.99,-3.33 2.04,-4.68c-0.38,0.12 -0.77,0.23 -1.
231716,0.34c-1.87,0.54 -3.8,1.59 -5,3.16c-1.17,1.53 -1.03,3.42 -0.51,5.22c2.89,2.67 5.22,5.34 7.12,7.86" id="svg_9"/> 2318 <path class="st2" d="m62.99,48.78284c0.51,-1.42 0.76,-2.97 1,-4.47c0.13,-0.83 0.22,-1.69 0.31,-2.52c0.21,-1.98 0.42,-4.02 1.26,-6c1.02,-2.38 2.61,-4.44 4.6,-5.94c3.98,-3.01 6.02,-6.71 6.06,-11c0.03,-3.03 -0.13,-6.9 -1.53,-9.95c-0.92,-2 -4.15,-4.36 -5,-4.19c-0.25,0.05 -0.43,0.64 -0.44,1.47c-0.03,1.21 0.16,2.44 0.36,3.74c0.32,2.08 0.65,4.24 0.03,6.38c-0.84,2.93 -2.88,5.09 -4.85,7.18c-1.06,1.13 -2.07,2.2 -2.89,3.37c-1.96,2.81 -4.28,7.13 -4.26,11.81l0,0.32c0.02,1.13 0.04,2.54 -0.98,3.16c-0.61,0.37 -1.36,0.31 -2.24,-0.16c-0.81,-0.44 -1.47,-1.12 -2.05,-1.91l-0.1,0.04c-0.05,-0.12 -0.09,-0.24 -0.13,-0.35c-0.62,-0.9 -1.14,-1.92 -1.62,-2.87c-0.4,-0.79 -0.78,-1.54 -1.16,-2.11c-0.4,-0.59 -0.85,-1.47 -1.43,-2.59c-2.28,-4.4 -6.39,-12.33 -15.39,-19.92c-0.03,-0.01 -0.05,-0.02 -0.08,-0.02c-0.19,-0.04 -0.41,-0.07 -0.57,0.04c-0.16,0.11 -0.22,0.31 -0.26,0.5c-0.3,1.33 -0.27,2.71 -0.22,4.07c0.13,3.97 0.22,8.59 2.68,11.85c2.51,3.32 5.93,6.08 8.96,8.92c1.64,1.54 3.28,3.11 4.75,4.81c2.82,3.27 4.65,8.11 9.11,9.54c0.16,0.05 0.32,0.1 0.48,0.14c0.97,0.25 2.01,0.26 2.95,-0.08c0.47,-0.17 0.85,-0.38 1.19,-0.62c0.59,-0.72 1.09,-1.59 1.46,-2.64" id="svg_10"/> 2319 </g> 2320 <g id="svg_11"> 2321 <path class="st3" d="m143.75561,18.30332l0,0c-0.09,-0.19 -0.21,-0.35 -0.35,-0.46c-0.14,-0.11 -0.28,-0.19 -0.43,-0.24c-0.78,-0.27 -1.44,0.12 -2.17,1.08c-0.53,0.69 -1.03,1.68 -1.48,2.94c-0.37,0.28 -0.81,0.54 -1.32,0.8c-0.54,0.27 -1.15,0.54 -1.81,0.79c-0.67,0.26 -1.37,0.5 -2.1,0.74c-0.74,0.24 -1.48,0.47 -2.23,0.68c-1.05,0.3 -2.01,0.65 -2.88,1.04c-0.88,0.4 -1.64,0.87 -2.26,1.39c-0.63,0.54 -1.13,1.16 -1.48,1.84c-0.36,0.7 -0.54,1.49 -0.54,2.37c0,1 0.21,1.89 0.62,2.64c0.41,0.74 0.94,1.36 1.59,1.85c0.64,0.48 1.37,0.84 2.17,1.07c0.79,0.23 1.6,0.34 2.4,0.34c0.24,0 0.45,-0.09 0.64,-0.26c0.19,-0.18 0.29,-0.41 0.29,-0.67c0,-0.26 -0.09,-0.49 -0.26,-0.67c-0.17,-0.18 -0.41,-0.28 -0.67,-0.28c-0.59,0 -1.19,-0.08 -1.78,-0.22c-0.58,-0.14 -1.11,-0.38 -1.57,-0.71c-0.46,-0.32 -0.83,-0.74 -1.11,-1.26c-0.28,-0.51 -0.42,-1.15 -0.42,-1.89c0,-0.63 0.13,-1.19 0.4,-1.67c0.27,-0.49 0.65,-0.93 1.14,-1.31c0.5,-0.39 1.11,-0.75 1.82,-1.05c0.72,-0.31 1.54,-0.59 2.42,-0.85c0.59,-0.17 1.2,-0.35 1.81,-0.53c0.61,-0.18 1.21,-0.37 1.79,-0.57c0.59,-0.19 1.15,-0.4 1.68,-0.62c0.31,-0.13 0.61,-0.26 0.89,-0.4c-0.18,0.76 -0.32,1.56 -0.43,2.4c-0.14,1.08 -0.22,2.22 -0.22,3.4c0,1.25 0.04,2.48 0.12,3.65c0.07,1.1 0.12,2.22 0.15,3.31c-0.68,0.3 -1.45,0.67 -2.28,1.11c-0.92,0.48 -1.86,1.05 -2.81,1.69c-0.94,0.64 -1.88,1.36 -2.79,2.15c-0.91,0.79 -1.73,1.66 -2.44,2.59c-0.71,0.93 -1.3,1.94 -1.73,3.01c-0.44,1.07 -0.66,2.22 -0.66,3.4c0,1.08 0.17,2.04 0.49,2.86c0.33,0.81 0.76,1.5 1.29,2.05c0.53,0.55 1.15,0.97 1.84,1.24c0.68,0.27 1.39,0.41 2.09,0.41c1.64,0 3.06,-0.46 4.21,-1.38c1.13,-0.91 2.06,-2.18 2.75,-3.78c0.68,-1.58 1.18,-3.5 1.48,-5.68c0.3,-2.18 0.46,-4.6 0.46,-7.19l0,-1.29c0.34,-0.15 0.61,-0.28 0.81,-0.38c0.32,-0.17 0.5,-0.46 0.5,-0.82c0,-0.26 -0.1,-0.48 -0.29,-0.65c-0.29,-0.25 -0.64,-0.29 -1.06,-0.16c-0.04,-1.07 -0.09,-2.08 -0.15,-3.02c-0.07,-1.06 -0.1,-2.12 -0.1,-3.16c0,-1.46 0.11,-2.81 0.34,-4.02c0.22,-1.18 0.48,-2.24 0.8,-3.16c0.88,-0.65 1.59,-1.29 2.11,-1.93c0.57,-0.7 0.85,-1.32 0.85,-1.9c0,-0.25 -0.04,-0.47 -0.13,-0.66zm-5.56,20.7c-0.01,1.35 -0.05,2.69 -0.13,3.99c-0.09,1.44 -0.24,2.81 -0.46,4.09c-0.21,1.27 -0.5,2.46 -0.84,3.51c-0.34,1.04 -0.78,1.96 -1.29,2.71c-0.5,0.74 -1.1,1.33 -1.78,1.74c-0.67,0.41 -1.45,0.61 -2.34,0.61c-0.51,0 -1,-0.1 -1.48,-0.29c-0.48,-0.19 -0.91,-0.49 -1.28,-0.88c-0.37,-0.39 -0.68,-0.88 -0.9,-1.47c-0.23,-0.59 -0.34,-1.29 -0.34,-2.08c0,-0.94 0.19,-1.86 0.55,-2.73c0.37,-0.89 0.87,-1.75 1.48,-2.55c0.62,-0.81 1.33,-1.57 2.11,-2.28c0.79,-0.71 1.62,-1.36 2.45,-1.94c0.84,-0.59 1.67,-1.1 2.47,-1.54c0.64,-0.34 1.23,-0.64 1.78,-0.89z" id="svg_12"/> 2322 <path class="st3" d="m180.38561,33.66332c0.51,0 0.96,-0.18 1.31,-0.54c0.36,-0.36 0.54,-0.8 0.54,-1.31c0,-0.25 -0.05,-0.5 -0.14,-0.72c-0.09,-0.22 -0.23,-0.42 -0.4,-0.59s-0.37,-0.3 -0.59,-0.4c-0.45,-0.19 -1,-0.19 -1.45,0c-0.22,0.09 -0.42,0.23 -0.59,0.4c-0.17,0.17 -0.3,0.37 -0.4,0.59c-0.1,0.22 -0.14,0.47 -0.14,0.72c0,0.51 0.18,0.96 0.54,1.31c0.36,0.36 0.8,0.54 1.32,0.54zm-0.28,-1.85c0,-0.08 0.03,-0.15 0.09,-0.21l0,0c0.06,-0.06 0.11,-0.09 0.19,-0.09c0.08,0 0.14,0.03 0.21,0.09s0.09,0.13 0.09,0.21c0,0.08 -0.03,0.13 -0.09,0.19c-0.13,0.12 -0.29,0.13 -0.41,0c-0.06,-0.05 -0.08,-0.11 -0.08,-0.19z" id="svg_13"/> 2323 <path class="st3" d="m203.35561,39.57332l0,0c-0.29,-0.35 -0.82,-0.42 -1.21,-0.17c-0.16,0.1 -0.28,0.24 -0.36,0.43c-0.12,0.29 -0.31,0.67 -0.56,1.14c-0.25,0.47 -0.55,0.93 -0.88,1.37c-0.33,0.44 -0.7,0.83 -1.09,1.15c-0.36,0.29 -0.71,0.44 -1.07,0.44c-0.17,0 -0.31,-0.04 -0.41,-0.11c-0.1,-0.08 -0.18,-0.18 -0.24,-0.32c-0.07,-0.16 -0.12,-0.36 -0.14,-0.58c-0.03,-0.24 -0.04,-0.49 -0.04,-0.75c0,-0.21 0.01,-0.43 0.03,-0.67l0.1,-1.4c0.02,-0.22 0.03,-0.41 0.03,-0.56c0,-0.69 -0.16,-1.29 -0.48,-1.77c-0.34,-0.52 -0.87,-0.79 -1.57,-0.79c-0.34,0 -0.71,0.1 -1.09,0.3c-0.37,0.19 -0.74,0.51 -1.09,0.94c-0.33,0.41 -0.66,0.86 -0.96,1.32c-0.31,0.46 -0.6,0.92 -0.87,1.39c-0.25,0.42 -0.49,0.84 -0.71,1.25c0.03,-0.39 0.07,-0.78 0.1,-1.18c0.04,-0.5 0.08,-0.96 0.11,-1.4c0.03,-0.44 0.04,-0.77 0.04,-0.98c0,-0.29 -0.03,-0.58 -0.08,-0.86c-0.06,-0.29 -0.
232315,-0.55 -0.26,-0.79c-0.13,-0.26 -0.31,-0.47 -0.53,-0.63c-0.23,-0.17 -0.52,-0.25 -0.84,-0.25c-0.54,0 -1.07,0.33 -1.58,0.98c-0.47,0.6 -0.96,1.52 -1.49,2.77l-0.02,0.06c-0.33,0.66 -0.67,1.25 -1,1.77c-0.36,0.56 -0.71,1.04 -1.06,1.44c-0.34,0.39 -0.68,0.69 -0.99,0.91c-0.47,0.31 -0.87,0.36 -1.34,0.2c-0.16,-0.05 -0.32,-0.16 -0.47,-0.33c-0.16,-0.17 -0.29,-0.42 -0.4,-0.75c-0.11,-0.34 -0.17,-0.8 -0.17,-1.37c0,-0.44 0.01,-0.92 0.04,-1.45c0.03,-0.53 0.06,-1.02 0.1,-1.49l0.1,-1.22c0.03,-0.36 0.04,-0.57 0.04,-0.64c0,-0.24 -0.08,-0.46 -0.25,-0.65c-0.35,-0.41 -0.99,-0.38 -1.34,-0.03c-0.17,0.17 -0.27,0.36 -0.3,0.59c-0.11,0.85 -0.19,1.78 -0.24,2.83c-0.03,0.03 -0.05,0.07 -0.08,0.12c-0.16,0.36 -0.36,0.78 -0.61,1.26c-0.24,0.47 -0.52,0.93 -0.84,1.35c-0.31,0.42 -0.64,0.77 -1,1.05c-0.32,0.26 -0.65,0.39 -0.99,0.39c-0.87,0 -1.6,-1.25 -2.11,-3.62c0.3,-0.73 0.63,-1.59 0.99,-2.57c0.38,-1.02 0.74,-2.16 1.08,-3.37c0.33,-1.2 0.62,-2.49 0.85,-3.82c0.23,-1.33 0.35,-2.68 0.35,-4.02c0,-0.63 -0.04,-1.21 -0.12,-1.74c-0.08,-0.53 -0.21,-1 -0.39,-1.39c-0.18,-0.41 -0.43,-0.73 -0.73,-0.97c-0.67,-0.52 -1.74,-0.5 -2.47,0.14c-0.36,0.31 -0.67,0.75 -0.93,1.28c-0.25,0.51 -0.47,1.12 -0.65,1.8c-0.17,0.67 -0.31,1.38 -0.42,2.13c-0.1,0.76 -0.18,1.52 -0.22,2.28c-0.04,0.77 -0.07,1.52 -0.07,2.23c0,1.62 0.08,3.1 0.24,4.4c-0.08,-0.02 -0.17,-0.04 -0.26,-0.04c-0.57,0 -1.15,0.14 -1.71,0.42c-0.56,0.28 -1.08,0.67 -1.53,1.17c-0.28,0.31 -0.54,0.68 -0.79,1.16l-0.04,0.02c-0.15,0.09 -0.27,0.21 -0.36,0.36c-0.19,0.37 -0.43,0.81 -0.72,1.3c-0.28,0.48 -0.6,0.95 -0.96,1.39c-0.35,0.43 -0.73,0.8 -1.14,1.1c-0.38,0.28 -0.78,0.42 -1.21,0.42c-0.13,0 -0.28,-0.03 -0.44,-0.08c-0.15,-0.05 -0.29,-0.14 -0.43,-0.27c-0.14,-0.13 -0.26,-0.31 -0.36,-0.54c-0.1,-0.23 -0.15,-0.53 -0.15,-0.9c0,-0.27 0.02,-0.55 0.05,-0.84c0.03,-0.29 0.07,-0.59 0.12,-0.89c0.05,-0.3 0.09,-0.6 0.12,-0.89c0.04,-0.29 0.05,-0.58 0.05,-0.86c0,-0.74 -0.21,-1.29 -0.62,-1.63c-0.49,-0.41 -1.25,-0.52 -2.23,-0.49c-0.09,0 -0.18,0 -0.27,0.01c-0.01,-0.16 -0.03,-0.34 -0.05,-0.54c-0.04,-0.32 -0.11,-0.64 -0.21,-0.93c-0.1,-0.32 -0.25,-0.59 -0.44,-0.81c-0.42,-0.49 -1.16,-0.58 -1.77,0.04c-0.25,0.25 -0.47,0.55 -0.66,0.89c-0.19,0.33 -0.35,0.68 -0.46,1.03c-0.12,0.37 -0.18,0.65 -0.18,0.88c0,0.33 0.08,0.6 0.23,0.8c0.15,0.19 0.34,0.33 0.56,0.42c0.21,0.08 0.43,0.13 0.66,0.14c0.08,0 0.17,0.01 0.25,0.01c-0.07,0.32 -0.13,0.56 -0.18,0.74c-0.06,0.21 -0.11,0.36 -0.12,0.39c-0.03,0.03 -0.08,0.08 -0.12,0.16c-0.1,0.21 -0.23,0.47 -0.38,0.76c-0.14,0.29 -0.31,0.59 -0.5,0.9c-0.19,0.31 -0.4,0.62 -0.63,0.93c-0.22,0.3 -0.46,0.57 -0.7,0.8c-0.24,0.23 -0.48,0.41 -0.72,0.54c-0.56,0.31 -1.13,0.23 -1.43,-0.14c-0.21,-0.25 -0.37,-0.56 -0.48,-0.9c-0.11,-0.37 -0.19,-0.74 -0.22,-1.11c-0.03,-0.39 -0.06,-0.69 -0.07,-0.91c-0.02,-0.23 -0.11,-0.43 -0.28,-0.61c-0.35,-0.37 -0.92,-0.35 -1.28,-0.04c-0.18,0.16 -0.29,0.35 -0.32,0.59c-0.08,0.56 -0.21,1.05 -0.39,1.45c-0.19,0.41 -0.4,0.75 -0.62,1.01c-0.22,0.25 -0.45,0.44 -0.68,0.56c-0.55,0.28 -0.89,0.19 -1.14,0.04c-0.15,-0.09 -0.27,-0.2 -0.36,-0.35c-0.09,-0.15 -0.16,-0.32 -0.2,-0.51c-0.04,-0.2 -0.06,-0.4 -0.06,-0.6c0,-0.65 0.1,-1.22 0.31,-1.68c0.21,-0.47 0.47,-0.87 0.77,-1.18c0.3,-0.3 0.63,-0.53 0.99,-0.67c0.61,-0.24 1.18,-0.26 1.58,-0.15c0.17,0.04 0.31,0.1 0.43,0.16c0.15,0.07 0.23,0.13 0.27,0.17c0.07,0.05 0.11,0.09 0.13,0.1c0.36,0.36 0.96,0.38 1.34,-0.01c0.18,-0.19 0.27,-0.41 0.27,-0.66c0,-0.23 -0.09,-0.45 -0.28,-0.68c-0.01,-0.01 -0.08,-0.07 -0.2,-0.17c-0.13,-0.11 -0.31,-0.23 -0.54,-0.35c-0.23,-0.12 -0.5,-0.23 -0.81,-0.34c-0.8,-0.26 -1.81,-0.2 -2.81,0.2c-0.6,0.24 -1.15,0.61 -1.64,1.09c-0.49,0.48 -0.9,1.08 -1.22,1.79c-0.32,0.71 -0.48,1.54 -0.48,2.47c0,0.48 0.07,0.92 0.21,1.33c0.14,0.41 0.35,0.77 0.61,1.08c0.27,0.31 0.6,0.56 0.98,0.73c0.86,0.39 2.01,0.37 3.05,-0.37c0.42,-0.3 0.81,-0.69 1.14,-1.15c0.21,0.45 0.5,0.84 0.84,1.16c0.51,0.47 1.14,0.71 1.87,0.71c0.51,0 1.01,-0.12 1.47,-0.37c0.44,-0.23 0.86,-0.53 1.24,-0.89c0.38,-0.35 0.72,-0.75 1.03,-1.17c0.3,-0.41 0.56,-0.81 0.79,-1.2c0.23,-0.38 0.41,-0.72 0.56,-1.02l0.27,-0.55c0.03,-0.05 0.06,-0.12 0.11,-0.26c0.05,-0.13 0.1,-0.29 0.17,-0.5s0.13,-0.44 0.2,-0.72c0.05,-0.21 0.1,-0.42 0.14,-0.65c0.12,0 0.24,-0.01 0.35,-0.01l0.52,0c0.33,0 0.42,0.06 0.42,0.06c0.04,0.05 0.07,0.15 0.07,0.29c0,0.49 -0.06,1.01 -0.16,1.56c-0.12,0.58 -0.18,1.17 -0.18,1.76c0,0.57 0.09,1.09 0.26,1.55c0.17,0.46 0.41,0.86 0.7,1.17c0.29,0.32 0.65,0.57 1.05,0.74c1.04,0.44 2.29,0.3 3.26,-0.32c0.57,-0.37 1.1,-0.82 1.56,-1.36c0.09,-0.11 0.18,-0.22 0.27,-0.33c0.02,0.08 0.05,0.16 0.07,0.23c0.16,0.43 0.38,0.79 0.64,1.07c0.27,0.28 0.6,0.49 0.96,0.61c0.35,0.12 0.72,0.18 1.09,0.18c0.73,0 1.4,-0.29 2.02,-0.87c0.47,-0.45 0.95,-1.11 1.41,-1.98c0.36,0.93 0.78,1.61 1.25,2.07c0.6,0.58 1.33,0.88 2.17,0.88c0.46,0 0.9,-0.11 1.31,-0.33c0.39,-0.21 0.76,-0.48 1.11,-0.81c0.34,-0.32 0.66,-0.69 0.95,-1.09c0.04,-0.06 0.09,-0.12 0.13,-0.19c0.01,0.04 0.02,0.08 0.03,0.11c0.14,0.53 0.36,1 0.65,1.39c0.29,0.4 0.65,0.72 1.08,0.96c0.43,0.24 0.93,0.36 1.5,0.36c0.45,0 0.89,-0.11 1.31,-0.32c0.41,-0.2 0.81,-0.47 1.18,-0.8c0.37,-0.33 0.71,-0.69 1.04,-1.1c0.32,-0.4 0.62,-0.81 0.88,-1.21c0.27,-0.41 0.51,-0.8 0.71,-1.18c0.21,-0.38 0.38,-0.7 0.51,-0.95l0.04,-0.07c0.4,-0.97 0.73,-1.65 0.98,-2.03c0.05,-0.08 0.1,-0.15 0.14,-0.21c0.02,0.23 0.03,0.46 0.03,0.7c0,0.21 -0.01,0.47 -0.
232303,0.78c-0.02,0.32 -0.05,0.66 -0.08,1.03l-0.1,1.12c-0.03,0.38 -0.07,0.72 -0.1,1.05c-0.04,0.33 -0.06,0.61 -0.09,0.84c-0.02,0.25 -0.04,0.42 -0.04,0.5c0,0.45 0.13,0.8 0.39,1.06c0.45,0.45 1.22,0.56 1.88,0.08c0.27,-0.2 0.53,-0.55 0.78,-1.08c0.11,-0.25 0.27,-0.56 0.46,-0.93c0.2,-0.38 0.41,-0.78 0.65,-1.2c0.23,-0.42 0.48,-0.84 0.74,-1.26c0.26,-0.42 0.52,-0.8 0.77,-1.13c0.24,-0.32 0.48,-0.59 0.7,-0.79c0.23,-0.21 0.36,-0.24 0.4,-0.24c0,0 0.04,0.02 0.11,0.1c0.02,0.02 0.1,0.14 0.1,0.55c0,0.21 -0.01,0.43 -0.02,0.66c-0.02,0.23 -0.04,0.47 -0.07,0.7c-0.03,0.25 -0.05,0.48 -0.07,0.7c-0.02,0.23 -0.03,0.43 -0.03,0.61c0,0.41 0.03,0.83 0.1,1.23c0.07,0.43 0.2,0.82 0.4,1.18c0.21,0.37 0.49,0.67 0.85,0.89c0.69,0.43 1.88,0.5 2.86,-0.03c0.44,-0.24 0.85,-0.54 1.22,-0.9c0.37,-0.35 0.71,-0.75 1.02,-1.18c0.3,-0.42 0.57,-0.82 0.79,-1.2c0.23,-0.39 0.41,-0.71 0.55,-1.01c0.14,-0.28 0.23,-0.47 0.28,-0.58c0.05,-0.12 0.08,-0.24 0.08,-0.36c0.03,-0.18 -0.05,-0.39 -0.21,-0.59zm-32.9,2.47c-0.27,0.5 -0.52,0.89 -0.74,1.16c-0.21,0.25 -0.39,0.42 -0.55,0.49c-0.16,0.08 -0.32,0.12 -0.45,0.12c-0.35,0 -0.6,-0.12 -0.77,-0.36c-0.19,-0.26 -0.29,-0.65 -0.29,-1.15c0,-0.65 0.1,-1.22 0.29,-1.68c0.2,-0.46 0.44,-0.85 0.74,-1.14c0.3,-0.3 0.62,-0.53 0.98,-0.68c0.36,-0.16 0.7,-0.26 1.01,-0.3c0.14,-0.02 0.27,-0.06 0.38,-0.13c0.09,0.62 0.19,1.19 0.29,1.72c-0.33,0.8 -0.63,1.46 -0.89,1.95zm3.53,-9.75c-0.22,0.97 -0.48,1.92 -0.77,2.82c-0.16,0.5 -0.33,1.01 -0.5,1.5c-0.05,-0.45 -0.09,-0.92 -0.13,-1.41c-0.08,-0.98 -0.12,-1.99 -0.12,-2.98c0,-1.04 0.05,-2.07 0.16,-3.09c0.11,-1.01 0.25,-1.93 0.43,-2.73c0.17,-0.79 0.38,-1.43 0.62,-1.91c0.18,-0.37 0.37,-0.58 0.53,-0.58c0.02,0 0.08,0 0.14,0.13c0.09,0.17 0.16,0.39 0.22,0.65c0.06,0.27 0.1,0.57 0.11,0.88c0.02,0.32 0.03,0.63 0.03,0.91c0,0.96 -0.07,1.94 -0.19,2.91c-0.14,0.96 -0.32,1.94 -0.53,2.9zm-17.89,4.34c0,0 0,0 0,0l-0.04,0c0.01,-0.03 0.02,-0.06 0.03,-0.09c0.01,0.03 0.01,0.06 0.01,0.09z" id="svg_14"/> 2324 </g> 2325 <g id="svg_15"> 2326 <path class="st3" d="m97.89561,45.22332l0,-0.65c0.5,-0.03 0.84,-0.14 1.02,-0.34c0.18,-0.2 0.28,-0.48 0.3,-0.84c0.02,-0.36 0.03,-0.77 0.03,-1.23l0,-8.48c0,-0.26 0.01,-0.51 0.02,-0.76c0.01,-0.24 0.03,-0.46 0.04,-0.66c-0.24,0.01 -0.47,0.03 -0.71,0.04c-0.24,0.01 -0.47,0.03 -0.71,0.04l0,-0.86l4.41,0l0,0.65c-0.48,0.01 -0.82,0.12 -1.01,0.33c-0.19,0.21 -0.29,0.49 -0.31,0.84c-0.02,0.35 -0.03,0.76 -0.03,1.24l0,8.42c0,0.35 0,0.65 -0.01,0.9c-0.01,0.25 -0.02,0.46 -0.05,0.63l3.67,-0.06c0.82,-0.01 1.45,-0.27 1.87,-0.78c0.42,-0.51 0.64,-1.34 0.64,-2.49l0.67,0l-0.12,4.06l-9.72,0z" id="svg_16"/> 2327 <path class="st3" d="m113.77561,45.54332c-0.9,0 -1.72,-0.21 -2.44,-0.64c-0.73,-0.43 -1.3,-1.03 -1.72,-1.81s-0.63,-1.7 -0.63,-2.76c0,-0.92 0.21,-1.77 0.62,-2.57c0.41,-0.8 0.99,-1.44 1.74,-1.93c0.75,-0.49 1.61,-0.74 2.59,-0.74c0.55,0 1.06,0.09 1.54,0.26c0.48,0.18 0.9,0.45 1.27,0.8c0.37,0.36 0.65,0.81 0.86,1.35c0.21,0.54 0.31,1.18 0.31,1.91l-6.91,0.12c0,0.99 0.11,1.87 0.32,2.62s0.57,1.33 1.05,1.75s1.1,0.62 1.86,0.62c0.41,0 0.82,-0.07 1.25,-0.22c0.42,-0.14 0.82,-0.34 1.19,-0.59c0.37,-0.25 0.66,-0.52 0.88,-0.82l0.47,0.39c-0.35,0.55 -0.78,0.99 -1.27,1.31c-0.5,0.33 -1.01,0.56 -1.53,0.71c-0.53,0.16 -1.01,0.24 -1.45,0.24zm-2.71,-6.81l5,0c0,-0.47 -0.07,-0.92 -0.21,-1.36c-0.14,-0.44 -0.36,-0.8 -0.68,-1.08s-0.73,-0.42 -1.24,-0.42c-0.76,0 -1.39,0.23 -1.89,0.68s-0.82,1.17 -0.98,2.18z" id="svg_17"/> 2328 <path class="st3" d="m213.52561,45.54332c-0.8,0 -1.52,-0.2 -2.16,-0.6c-0.64,-0.4 -1.15,-0.97 -1.52,-1.72c-0.37,-0.75
2328-0.56,-1.62 -0.56,-2.63c0,-1.07 0.22,-2.02 0.65,-2.85c0.43,-0.82 1.03,-1.47 1.79,-1.94c0.77,-0.47 1.63,-0.71 2.6,-0.71c0.43,0 0.86,0.06 1.29,0.17s0.76,0.24 1.01,0.38l0,-2.69c0,-0.21 0,-0.41 0.01,-0.6c0.01,-0.19 0.02,-0.42 0.05,-0.68c-0.24,0.01 -0.47,0.03 -0.7,0.04c-0.23,0.01 -0.46,0.03 -0.7,0.04l0,-0.82c0.58,0 1.02,-0.03 1.33,-0.08c0.31,-0.05 0.55,-0.12 0.72,-0.2c0.16,-0.08 0.29,-0.16 0.38,-0.26l0.57,0l0,12.73c0,0.21 -0.01,0.42 -0.02,0.63c-0.01,0.21 -0.03,0.45 -0.06,0.71c0.24,-0.01 0.47,-0.03 0.7,-0.04c0.23,-0.01 0.46,-0.03 0.7,-0.04l0,0.82l-2.81,0c-0.04,-0.2 -0.07,-0.38 -0.09,-0.54c-0.02,-0.16 -0.04,-0.32 -0.05,-0.48c-0.37,0.41 -0.82,0.73 -1.35,0.97c-0.53,0.26 -1.13,0.39 -1.78,0.39zm0.7,-0.97c0.43,0 0.87,-0.12 1.3,-0.37c0.44,-0.25 0.8,-0.56 1.09,-0.92c-0.01,-0.16 -0.02,-0.32 -0.02,-0.5s0,-0.37 0,-0.58l0.02,-5.65c-0.31,-0.24 -0.66,-0.41 -1.03,-0.52c-0.37,-0.11 -0.75,-0.17 -1.15,-0.17c-0.65,0 -1.22,0.19 -1.71,0.57c-0.48,0.38 -0.85,0.91 -1.1,1.59c-0.25,0.68 -0.36,1.48 -0.33,2.39c0.03,0.8 0.15,1.51 0.38,2.14c0.23,0.63 0.56,1.12 0.98,1.48c0.44,0.36 0.96,0.54 1.57,0.54z" id="svg_18"/> 2329 <path class="st3" d="m225.19561,45.54332c-0.71,0 -1.3,-0.13 -1.78,-0.39c-0.48,-0.26 -0.84,-0.71 -1.08,-1.33c-0.24,-0.63 -0.36,-1.48 -0.36,-2.55l0,-3.49c0,-0.21 0,-0.42 0.01,-0.63c0.01,-0.21 0.03,-0.43 0.07,-0.65c-0.22,0.01 -0.45,0.02 -0.68,0.03c-0.23,0.01 -0.45,0.02 -0.68,0.03l0,-0.81l0.61,0c0.56,0 0.97,-0.06 1.23,-0.17c0.25,-0.11 0.45,-0.23 0.6,-0.36l0.57,0l0,5.98c0,1.12 0.16,1.97 0.48,2.52c0.32,0.56 0.87,0.83 1.64,0.81c0.5,-0.01 0.97,-0.17 1.42,-0.46c0.45,-0.29 0.81,-0.64 1.09,-1.05l0,-5.04c0,-0.31 0.01,-0.58 0.02,-0.81c0.01,-0.23 0.04,-0.46 0.08,-0.68c-0.24,0.01 -0.47,0.02 -0.71,0.03s-0.47,0.02 -0.71,0.03l0,-0.8l0.61,0c0.56,0 0.97,-0.06 1.23,-0.17c0.25,-0.11 0.45,-0.23 0.6,-0.36l0.57,0l-0.02,7.42c0,0.21 -0.01,0.5 -0.02,0.88c-0.01,0.38 -0.03,0.7 -0.06,0.96c0.24,-0.01 0.47,-0.03 0.71,-0.04c0.24,-0.01 0.47,-0.03 0.71,-0.04l0,0.82l-2.81,0c-0.04,-0.22 -0.07,-0.43 -0.09,-0.63s-0.04,-0.38 -0.05,-0.55c-0.41,0.41 -0.9,0.75 -1.47,1.05c-0.58,0.3 -1.15,0.45 -1.73,0.45z" id="svg_19"/> 2330 <path class="st3" d="m238.14561,44.57332c0.5,-0.03 0.84,-0.14 1.02,-0.34c0.18,-0.2 0.28,-0.48 0.3,-0.84c0.02,-0.36 0.03,-0.77 0.03,-1.23l0,-8.48c0,-0.26 0.01,-0.51 0.02,-0.76c0.01,-0.24 0.03,-0.46 0.04,-0.66c-0.24,0.01 -0.47,0.03 -0.71,0.04c-0.24,0.01 -0.47,0.03 -0.71,0.04l0,-0.86c0.69,-0.01 1.41,-0.02 2.14,-0.03c0.73,-0.01 1.48,-0.01 2.24,-0.01c1.27,0 2.33,0.14 3.2,0.43c0.86,0.29 1.52,0.71 1.98,1.28s0.71,1.26 0.75,2.1c0.03,0.51 -0.05,1.04 -0.23,1.6c-0.18,0.56 -0.5,1.08 -0.98,1.57c-0.48,0.49 -1.15,0.89 -2.01,1.19s-1.97,0.45 -3.32,0.45c-0.05,0 -0.15,0 -0.29,0s-0.28,-0.01 -0.41,-0.02l0,2.84c0,0.35 0,0.66 -0.01,0.91c-0.01,0.26 -0.02,0.47 -0.05,0.64c0.21,-0.01 0.41,-0.03 0.61,-0.04c0.2,-0.01 0.4,-0.02 0.6,-0.03c0.2,-0.01 0.4,-0.02 0.6,-0.03l0,0.88l-4.81,0l0,-0.64zm3.06,-5.33c0.25,0.03 0.46,0.04 0.64,0.05c0.18,0.01 0.39,0.01 0.64,0.01c0.75,0 1.43,-0.15 2.04,-0.44c0.61,-0.29 1.1,-0.72 1.47,-1.27c0.37,-0.55 0.55,-1.2 0.55,-1.96c0,-0.62 -0.1,-1.
233014 -0.29,-1.58c-0.2,-0.44 -0.47,-0.79 -0.83,-1.06c-0.36,-0.27 -0.79,-0.46 -1.29,-0.59c-0.5,-0.12 -1.05,-0.19 -1.65,-0.19c-0.46,0 -0.78,0.1 -0.95,0.29c-0.18,0.2 -0.28,0.47 -0.29,0.81s-0.03,0.75 -0.03,1.23l0,4.7l-0.01,0z" id="svg_20"/> 2331 <path class="st3" d="m249.81561,44.63332c0.41,0 0.69,-0.1 0.84,-0.3s0.25,-0.48 0.27,-0.84s0.04,-0.78 0.04,-1.25l0,-4.47c0,-0.21 0.01,-0.41 0.02,-0.6c0.01,-0.19 0.03,-0.42 0.06,-0.68c-0.24,0.01 -0.47,0.03 -0.7,0.04c-0.23,0.01 -0.46,0.03 -0.7,0.04l0,-0.82c0.58,0 1.02,-0.03 1.33,-0.08c0.31,-0.05 0.55,-0.12 0.72,-0.2c0.16,-0.08 0.29,-0.16 0.38,-0.25l0.57,0l0,7.93c0,0.26 0,0.49 -0.01,0.7c-0.01,0.2 -0.03,0.42 -0.07,0.64c0.21,-0.01 0.42,-0.02 0.62,-0.03c0.2,-0.01 0.41,-0.02 0.62,-0.03l0,0.8l-4,0l0,-0.6l0.01,0zm1.91,-11.36c-0.27,0 -0.52,-0.11 -0.73,-0.33c-0.21,-0.22 -0.31,-0.5 -0.31,-0.82c0,-0.33 0.11,-0.6 0.32,-0.83c0.22,-0.23 0.46,-0.34 0.74,-0.34c0.3,0 0.55,0.11 0.75,0.34c0.2,0.23 0.3,0.51 0.3,0.83c0,0.33 -0.11,0.6 -0.32,0.82c-0.21,0.22 -0.47,0.33 -0.75,0.33z" id="svg_21"/> 2332 <path class="st3" d="m260.11561,45.54332c-0.88,0 -1.68,-0.2 -2.42,-0.6c-0.74,-0.4 -1.33,-0.97 -1.77,-1.73c-0.44,-0.75 -0.66,-1.66 -0.66,-2.72c0,-0.68 0.12,-1.34 0.37,-1.98c0.25,-0.64 0.6,-1.22 1.05,-1.74s0.99,-0.93 1.62,-1.23s1.32,-0.45 2.08,-0.45c0.73,0 1.37,0.11 1.91,0.33s0.96,0.52 1.27,0.88s0.45,0.76 0.45,1.2c0,0.29 -0.08,0.53 -0.24,0.74s-0.39,0.3 -0.69,0.3c-0.33,0.01 -0.56,-0.09 -0.7,-0.3c-0.14,-0.22 -0.21,-0.41 -0.21,-0.58c0,-0.13 0.02,-0.26 0.06,-0.4c0.04,-0.14 0.12,-0.26 0.24,-0.38c-0.1,-0.31 -0.29,-0.55 -0.55,-0.7c-0.26,-0.15 -0.53,-0.25 -0.81,-0.29s-0.51,-0.07 -0.7,-0.07c-0.89,0 -1.64,0.36 -2.25,1.07c-0.61,0.71 -0.91,1.75 -0.91,3.11c0,0.88 0.14,1.65 0.42,2.33c0.28,0.68 0.68,1.21 1.19,1.6c0.51,0.39 1.1,0.58 1.77,0.58c0.61,0 1.2,-0.16 1.77,-0.49c0.56,-0.33 1,-0.73 1.31,-1.2l0.51,0.39c-0.34,0.55 -0.75,0.99 -1.23,1.33c-0.48,0.34 -0.97,0.59 -1.47,0.75c-0.49,0.17 -0.96,0.25 -1.41,0.25z" id="svg_22"/> 2333 <path class="st3" d="m269.94561,45.42332l-4.45,-10.44c-0.29,-0.67 -0.49,-1.21 -0.61,-1.62c-0.12,-0.41 -0.2,-0.76 -0.24,-1.05c-0.18,0.01 -0.37,0.02 -0.55,0.02s-0.37,0.01 -0.55,0.02l0,-0.86l4.55,0l-0.02,0.67c-0.65,0.04 -1.05,0.24 -1.18,0.6c-0.13,0.36 -0.07,0.87 0.2,1.52c0.31,0.77 0.61,1.52 0.9,2.24c0.29,0.72 0.61,1.5 0.96,2.33c0.31,0.73 0.62,1.44 0.91,2.11c0.29,0.67 0.52,1.23 0.68,1.68l0.04,0c0.14,-0.46 0.29,-0.9 0.44,-1.31s0.33,-0.91 0.54,-1.49c0.39,-1.1 0.72,-2.03 0.99,-2.79c0.27,-0.76 0.5,-1.41 0.7,-1.94s0.36,-0.99 0.49,-1.37c0.12,-0.34 0.22,-0.63 0.31,-0.86s0.18,-0.43 0.26,-0.59c-0.25,0.01 -0.5,0.03 -0.75,0.04c-0.25,0.01 -0.5,0.03 -0.76,0.04l0,-0.86l3.98,0l0,0.65c-0.58,0.03 -1.02,0.18 -1.32,0.45c-0.31,0.28 -0.59,0.77 -0.83,1.47c-0.03,0.07 -0.06,0.15 -0.1,0.27c-0.04,0.11 -0.11,0.29 -0.2,0.54c-0.09,0.25 -0.22,0.61 -0.39,1.09s-0.4,1.12 -0.7,1.93c-0.29,0.81 -0.67,1.83 -1.12,3.06c-0.45,1.23 -1,2.72 -1.64,4.47l-0.54,0l0,-0.02z" id="svg_23"/> 2334 <path class="st3" d="m280.50561,45.54332c-0.9,0 -1.72,-0.21 -2.44,-0.64c-0.73,-0.43 -1.3,-1.03 -1.72,-1.81c-0.42,-0.78 -0.63,-1.7 -0.63,-2.76c0,-0.92 0.21,-1.77 0.62,-2.57c0.41,-0.8 0.99,-1.44 1.74,-1.93c0.75,-0.49 1.61,-0.74 2.59,-0.74c0.55,0 1.06,0.09 1.54,0.26c0.48,0.18 0.9,0.45 1.27,0.8c0.37,0.36 0.65,0.81 0.86,1.35c0.21,0.54 0.31,1.18 0.31,1.91l-6.91,0.12c0,0.99 0.11,1.87 0.32,2.62s0.57,1.33 1.05,1.75c0.48,0.41 1.1,0.62 1.86,0.62c0.41,0 0.82,-0.07 1.25,-0.22s0.82,-0.34 1.19,-0.59c0.37,-0.25 0.66,-0.52 0.88,-0.82l0.47,0.39c-0.35,0.55 -0.78,0.99 -1.28,1.31c-0.5,0.33 -1.01,0.56 -1.53,0.71c-0.51,0.16 -1,0.24 -1.44,0.24zm-2.71,-6.81l5,0c0,-0.47 -0.07,-0.92 -0.21,-1.36c-0.14,-0.44 -0.36,-0.8 -0.68,-1.08c-0.31,-0.28 -0.73,-0.42 -1.24,-0.42c-0.76,0 -1.39,0.23 -1.89,0.68c-0.49,0.44 -0.82,1.17 -0.98,2.18z" id="svg_24"/> 2335 <path class="st3" d="m286.38561,44.63332c0.41,0 0.69,-0.1 0.84,-0.3s0.25,-0.48 0.27,-0.84s0.04,-0.78 0.04,-1.25l0,-4.47c0,-0.21 0,-0.42 0.01,-0.63c0.01,-0.21 0.03,-0.43 0.07,-0.65c-0.24,0.01 -0.47,0.02 -0.7,0.03c-0.23,0.01 -0.46,0.02 -0.7,0.03l0,-0.8l0.61,0c0.56,0 0.95,-0.06 1.17,-0.17c0.22,-0.11 0.4,-0.23 0.54,-0.36l0.57,0c0.03,0.21 0.04,0.47 0.06,0.77c0.01,0.31 0.03,0.7 0.04,1.17c0.2,-0.33 0.46,-0.65 0.8,-0.96c0.34,-0.31 0.72,-0.58 1.15,-0.78c0.42,-0.21 0.87,-0.31 1.34,-0.31c0.37,0 0.69,0.1 0.96,0.29c0.27,0.2 0.41,0.51 0.41,0.94c0,0.1 -0.03,0.23 -0.1,0.38s-0.17,0.28 -0.31,0.39c-0.14,0.11 -0.33,0.17 -0.57,0.17c-0.29,-0.01 -0.52,-0.13 -0.69,-0.34s-0.24,-0.47 -0.2,-0.76c-0.33,-0.01 -0.66,0.07 -1.01,0.25c-0.35,0.18 -0.67,0.44 -0.97,0.76s-0.57,0.7 -0.8,1.13l0.02,4.83c0,0.26 0,0.49 -0.01,0.7c-0.01,0.2 -0.03,0.42 -0.07,0.64c0.21,-0.01 0.42,-0.02 0.62,-0.
233503c0.2,-0.01 0.41,-0.02 0.62,-0.03l0,0.8l-4.02,0l0,-0.6l0.01,0z" id="svg_25"/> 2336 <path class="st3" d="m298.57561,45.54332c-0.3,0 -0.61,-0.04 -0.92,-0.13c-0.31,-0.08 -0.61,-0.25 -0.87,-0.5c-0.27,-0.25 -0.48,-0.61 -0.64,-1.09s-0.24,-1.11 -0.24,-1.89l0.04,-5.69l-1.51,0.02l0,-0.84c0.34,-0.01 0.69,-0.14 1.04,-0.38c0.35,-0.24 0.67,-0.57 0.95,-0.99c0.28,-0.42 0.47,-0.88 0.58,-1.37l0.67,0l0,2.75l3.3,0l0,0.76l-3.3,0.04l-0.04,5.45c0,0.59 0.05,1.09 0.15,1.5c0.1,0.41 0.26,0.72 0.48,0.93c0.22,0.21 0.51,0.31 0.86,0.31c0.37,0 0.71,-0.1 1.03,-0.31s0.61,-0.5 0.85,-0.86l0.53,0.43c-0.29,0.43 -0.57,0.77 -0.85,1.02c-0.28,0.25 -0.55,0.43 -0.81,0.56s-0.5,0.2 -0.73,0.24c-0.23,0.02 -0.41,0.04 -0.57,0.04z" id="svg_26"/> 2337 </g> 2338 </g> 2339 </svg> 2340<svg class="logo-svg-compact hidden w-full max-h-10" 2341 viewBox="0 0 102 80" 2342 title="Le Jardin du Pic Vert" 2343 > 2344 <style type="text/css"> 2345 .st0{fill:#004650;} .st1{fill:#2DAFAA;} .st2{fill:#C86464;} .st3{fill:#FFFFFF;} 2346 </style> 2347 <g class="layer"> 2348 <g id="svg_2"> 2349 <path class="st1" d="m87.22,44.34284c-0.48,-1.85 -1.08,-3.67 -1.77,-5.45c0.17,5.03 -0.41,10.09 -1.85,14.93c-1.79,5.99 -5.37,11.88 -11.65,13.84c-0.68,0.21 -2.28,-1.55 -1.68,-1.73c6.21,-1.94 9.73,-7.89 11.43,-13.81c1.69,-5.86 2.18,-12.06 1.52,-18.12c-0.15,-0.37 -0.23,-0.62 -0.2,-0.66c-0.6,0.64 -0.87,1.98 -1.31,2.8c-0.51,0.95 -1.07,1.88 -1.68,2.76c-1.23,1.78 -2.67,3.41 -4.29,4.82c-2.79,2.43 -5.36,4.81 -7.64,7.73c-3.98,5.1 -7.79,14.98 -0.67,19.34c4.48,2.74 10.67,0.75 14.58,-2.11c2.95,-2.16 5.11,-5.4 5.92,-8.96c0.27,-1.17 0.39,-2.37 0.48,-3.56c0.3,-3.97 -0.2,-7.99 -1.19,-11.82" id="svg_3"/> 2350 <path class="st1" d="m56.83,55.35284c-0.54,4.44 -0.68,9.16 1,13.39c1.66,4.19 5.23,7.65 9.24,9.62c3.77,1.86 8.53,2.59 12.47,0.85c2.1,-0.93 4.07,-2.19 5.81,-3.69c1.94,-1.67 3.51,-3.68 5.22,-5.56c1.4,-1.54 3.29,-4.02 5.54,-4.21c2.55,-0.21 3.24,2.25 2.59,4.28c-0.34,1.07 2.77,3.63 3.12,2.54c0.76,-2.36 -0.26,-4.76 -1.81,-6.54c-1.41,-1.63 -3.64,-3.3 -5.88,-3.4c-2.1,-0.09 -3.81,1.61 -5.16,3c-1.64,1.69 -3.11,3.54 -4.74,5.24c-3.18,3.33 -7.54,6.38 -12.33,6.2c-3.67,-0.14 -7.71,-1.6 -9.94,-4.67c-2.94,-4.06 -2.58,-9.79 -2,-14.51c0.1,-0.82 -0.85,-1.72 -1.42,-2.19c-0.25,-0.19 -1.61,-1.14 -1.71,-0.35" id="svg_4"/> 2351 <path class="st1" d="m51.15,52.72284c-5.21,-5.84 -13.67,-7.6 -21.11,-8.06c-4.91,-0.3 -10.72,0.24 -15.41,-1.42c-3.85,-1.36 -7.52,-3.15 -10.9,-5.39c-1.29,-0.85 -2.53,-1.77 -3.73,-2.75c0.95,1.73 2.01,3.4 3.18,5c4.72,6.47 11.05,11.66 18.39,14.9c7.96,3.52 16.84,4.79 25.47,3.72c0.45,-0.06 0.93,0.3 1.26,0.62c0.53,0.31 1.03,0.85 1.31,1.2c0.2,0.25 1.15,1.58 0.35,1.7c-4.96,0.74 -10.02,0.64 -14.95,-0.24c-13.9,-2.46 -25.87,-10.87 -34.23,-22c3.61,9.27 8.63,18.06 16.21,24.61c5.9,5.1 14.46,7.1 22.06,7.02c6.53,-0.07 14.17,-4.02 14.89,-11.11c0.26,-2.83 -0.91,-5.68 -2.79,-7.8" id="svg_5"/> 2352 <path class="st2" d="m49.68,31.29284c0.55,1.06 0.98,1.9 1.32,2.4c0.12,0.18 0.24,0.38 0.36,0.58c0.03,-0.75 0.08,-1.49 0.13,-2.22c0.17,-2.26 0.33,-4.4 -0.36,-6.48c-0.47,-1.42 -0.86,-2.51 -1.58,-3.57l-0.25,-0.37c-0.72,-1.04 -1.53,-2.23 -1.65,-3.73c-0.21,-2.64 0.62,-5.7 2.18,-8c0.21,-0.31 0.42,-0.61 0.64,-0.91c1.22,-1.7 1.89,-2.75 1.44,-4.38c-0.37,-1.34 -1.69,-2.5 -3.08,-3.38c-2.9,1.85 -5.85,4.26 -6.26,7.62c-0.2,1.71 0.49,3.41 1.22,5.21c0.76,1.87 1.55,3.8 1.39,5.92c-0.07,0.91 -0.32,1.73 -0.72,2.41c2.43,3.54 4.06,6.66 5.22,8.9" id="svg_6"/> 2353 <path class="st2" d="m62.85,2.98284c-3,3.27 -4.78,6.98 -6.79,11.49c-1.51,3.38 -3.34,7.5 -2.89,11.1c0.6,2.24 0.44,4.46 0.28,6.62c-0.17,2.32 -0.32,4.52 0.44,6.62c0.45,0.63 0.93,1.15 1.47,1.44c0.11,0.06 0.19,0.09 0.25,0.12c0.07,-0.35 0.06,-1 0.06,-1.35l-0.01,-0.34c-0.02,-4.11 1.58,-8.59 4.61,-12.95c0.9,-1.29 2,-2.46 3.07,-3.6c1.89,-2.01 3.68,-3.91 4.39,-6.38c0.5,-1.73 0.21,-3.58 -0.09,-5.53c-0.2,-1.33 -0.42,-2.7 -0.38,-4.09c0.06,-2.44 1.13,-3.17 2.02,-3.36c1.64,-0.34 3.73,1.17 5.26,2.74c-0.06,-2.33 -0.4,-5.31 -4.02,-5.5c-2.89,-0.15 -5.34,1.03 -7.47,2.74c-0.06,0.09 -0.13,0.16 -0.2,0.23" id="svg_7"/> 2354 <path class="st2" d="m53.79,4.09284c0.72,2.62 -0.53,4.37 -1.74,6.05c-0.2,0.28 -0.41,0.57 -0.61,0.86c-1.32,1.94 -2.03,4.53 -1.85,6.74c0.08,0.97 0.68,1.84 1.31,2.77l0.26,0.38c0.11,0.16 0.2,0.33 0.3,0.49c0.57,-2.71 1.74,-5.35 2.76,-7.64c1.11,-2.48 2.14,-4.7 3.33,-6.77c-1.21,-2.5 -3.05,-4.6 -5.34,-5.51c0.73,0.77 1.3,1.64 1.58,2.63" id="svg_8"/> 2355 <path class="st2" d="m43.08,20.54284c0.05,-0.22 0.09,-0.45 0.11,-0.69c0.12,-1.66 -0.54,-3.3 -1.25,-5.03c-0.79,-1.95 -1.61,-3.97 -1.35,-6.18c0.22,-1.79 0.99,-3.33 2.04,-4.68c-0.38,0.12 -0.77,0.23 -1.
235516,0.34c-1.87,0.54 -3.8,1.59 -5,3.16c-1.17,1.53 -1.03,3.42 -0.51,5.22c2.89,2.67 5.22,5.34 7.12,7.86" id="svg_9"/> 2356 <path class="st2" d="m62.99,48.78284c0.51,-1.42 0.76,-2.97 1,-4.47c0.13,-0.83 0.22,-1.69 0.31,-2.52c0.21,-1.98 0.42,-4.02 1.26,-6c1.02,-2.38 2.61,-4.44 4.6,-5.94c3.98,-3.01 6.02,-6.71 6.06,-11c0.03,-3.03 -0.13,-6.9 -1.53,-9.95c-0.92,-2 -4.15,-4.36 -5,-4.19c-0.25,0.05 -0.43,0.64 -0.44,1.47c-0.03,1.21 0.16,2.44 0.36,3.74c0.32,2.08 0.65,4.24 0.03,6.38c-0.84,2.93 -2.88,5.09 -4.85,7.18c-1.06,1.13 -2.07,2.2 -2.89,3.37c-1.96,2.81 -4.28,7.13 -4.26,11.81l0,0.32c0.02,1.13 0.04,2.54 -0.98,3.16c-0.61,0.37 -1.36,0.31 -2.24,-0.16c-0.81,-0.44 -1.47,-1.12 -2.05,-1.91l-0.1,0.04c-0.05,-0.12 -0.09,-0.24 -0.13,-0.35c-0.62,-0.9 -1.14,-1.92 -1.62,-2.87c-0.4,-0.79 -0.78,-1.54 -1.16,-2.11c-0.4,-0.59 -0.85,-1.47 -1.43,-2.59c-2.28,-4.4 -6.39,-12.33 -15.39,-19.92c-0.03,-0.01 -0.05,-0.02 -0.08,-0.02c-0.19,-0.04 -0.41,-0.07 -0.57,0.04c-0.16,0.11 -0.22,0.31 -0.26,0.5c-0.3,1.33 -0.27,2.71 -0.22,4.07c0.13,3.97 0.22,8.59 2.68,11.85c2.51,3.32 5.93,6.08 8.96,8.92c1.64,1.54 3.28,3.11 4.75,4.81c2.82,3.27 4.65,8.11 9.11,9.54c0.16,0.05 0.32,0.1 0.48,0.14c0.97,0.25 2.01,0.26 2.95,-0.08c0.47,-0.17 0.85,-0.38 1.19,-0.62c0.59,-0.72 1.09,-1.59 1.46,-2.64" id="svg_10"/> 2357 </g> 2358 </g> 2359 </svg> 2360</a> 2361</div> 2362 2363<div class="header-search inline-flex items-start justify-center gap-2 order-4 md:order-2 grow w-full lg:w-auto"> 2364<span class="header-mobile-burger lg:hidden text-3xl text-white cursor-pointer" 2365 @click.prevent="$dispatch('open-main-menu')" 2366 > 2367≡ 2368</span> 2369 2370<div data-role="search" 2371 class="relative w-full max-w-xl" 2372> 2373<div class="hidden lg:block mb-1 leading-none text-xs text-center text-white font-bold"> 237414 900 variétés en 39 337 tailles </div> 2375<div x-data="vmMinisearch()" 2376 x-defer="interact" 2377 @click.outside="show = false" 2378 class="container md:my-0 mx-auto" 2379 > 2380<form class="form minisearch" 2381 action="https://www.jardindupicvert.com/catalogsearch/result/" 2382 method="get" 2383 > 2384<div class="relative"> 2385<svg class="absolute w-10 h-10 p-2"> 2386 <use xlink:href="#search-symbol"></use> 2387 </svg> 2388<input x-model="input" 2389 data-clarity-event="clic_champ_recherche" 2390 @input.debounce="getSearchResults()" 2391 type="search" 2392 class="w-full pl-8 pr-4 py-2 border border-dark text-sm leading-normal italic" 2393 autocapitalize="off" 2394 autocomplete="off" 2395 autocorrect="off" 2396 name="q" 2397 placeholder="Que cherchez-vous ?" 2398 maxlength="128" 2399 /> 2400<div class="hidden sm:block text-right leading-none"> 2401<a class="underline text-2xs text-white font-bold hover:text-highlight" 2402 href="https://www.jardindupicvert.com/toutes-les-plantes" 2403 title="Recherche par filtres" 2404 data-action="layers-search" 2405 > 2406Recherche par filtres </a> 2407</div> 2408</div> 2409<div class="search-autocomplete relative w-full" 2410 x-show="show" 2411 x-cloak 2412 > 2413<div class="absolute -top-4 z-modal w-full max-h-screen-75 overflow-y-auto px-4 py-3 bg-white border border-border shadow-2xl text-left"> 2414<svg @click.prevent="show = false" 2415 class="absolute right-1 top-1 absolute w-6 h-6 text-primary" 2416 > 2417 <use xlink:href="#close-symbol"></use> 2418 </svg> 2419<template x-for="searchResultByType in Object.values(searchResultsByType)"> 2420<div class="font-bold text-sm"> 2421<template x-for="searchResult in searchResultByType"> 2422<div class="hover:bg-container-lighter pb-1"> 2423 2424<template x-if="searchResult.type == 'term'"> 2425<a class="u-test-ellipsis w-full block p-1" :href="searchResult.url" :title="searchResult.title"> 2426<span x-html="formatOutput(searchResult.title)"></span> 2427<span class="text-xs bg-container-lighter p-1 rounded-xl" x-text="searchResult.num_results"></span> 2428</a> 2429</template> 2430 2431<template x-if="searchResult.type == 'product'"> 2432<a class="w-full block" 2433 :class="{ 2434 'text-primary': searchResult?.available === 'available' 2435 }" 2436 :href="searchResult.url" 2437 :title="searchResult.title" 2438 > 2439<div class="grid grid-cols-4 gap-4 p-3"> 2440<div> 2441<img :src="searchResult.image" class="inline-block" /> 2442</div> 2443<div class="col-span-3"> 2444<span class="text-sm" x-text="searchResult.title"></span> 2445<span class="text-sm font-bold" x-html="searchResult.price"></span> 2446</div> 2447</div> 2448</a> 2449</template> 2450 2451<template x-if="searchResult.type == 'category'"> 2452<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title"> 2453<span class="text-sm italic block text-gray-500" x-text="searchResult.breadcrumb.join(' > ').concat(' > ')"></span> 2454<span class="text-sm" x-text="searchResult.title"></span> 2455</a> 2456</template> 2457 2458<template x-if="searchResult.type == 'product_attribute'"> 2459<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title"> 2460<span class="text-sm" x-text="searchResult.title"></span> 2461<span class="text-xs uppercase text-gray-500" x-text="searchResult.attribute_label" style="vertical-align: super;"></span> 2462</a> 2463</template> 2464
2465<script> 2466 function renderEsAutocompleteTitleAttribute(data) 2467 { 2468 data = data.filter(function(item) { 2469 return item.type === 'product_attribute'; 2470 }).map(function(item) { 2471 return item['attribute_label'] 2472 }).reduce(function(prev, item) { 2473 if (item in prev) { 2474 prev[item]++; 2475 } else { 2476 prev[item] = 1; 2477 } 2478 return prev; 2479 }, {}); 2480 2481 data = Object.entries(data).sort(function(item1, item2) { 2482 return item2[1] - item1[1] 2483 }).map(function(item) {return item[0]}); 2484 2485 if (data.length > 2) { 2486 data = data.slice(0, 2); 2487 data.push('...'); 2488 } 2489 2490 return data.join(', '); 2491 } 2492</script>
2492 2493 2494<template x-if="searchResult.type == 'cms_page'"> 2495<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title"> 2496<span class="text-sm" x-text="searchResult.title"></span> 2497</a> 2498</template> 2499<template x-if="searchResult.type == 'blog_post'"> 2500<a class="w-full block p-2" :href="searchResult.url" :title="searchResult.title"> 2501<span class="text-sm" x-text="searchResult.title"></span> 2502</a> 2503</template> 2504</div> 2505</template> 2506</div> 2507</template> 2508</div> 2509</div> 2510</form> 2511</div> 2512</div> 2513</div> 2514 2515<div id="header-icons" 2516 class="inline-flex items-center justify-end gap-1 xs:gap-2 sm:gap-4 xl:gap-8 order-3 text-white" 2517 > 2518<div id="wishlist-menu" 2519 x-data 2520 x-defer="event:amwishlist-alpine-init" 2521 @click.prevent="$store.customer.isLoggedIn ? 2522 $dispatch('toggle-wishlist-panel') : 2523 $dispatch('toggle-authentication', { 2524 url: `https://www.jardindupicvert.com/mwishlist/`, 2525 text: `Veuillez vous connecter à votre compte pour pouvoir gérer vos listes de favoris.` 2526 }) 2527 " 2528 :class="{ 2529 'text-primary-lighter': !$store.customer.isLoggedIn, 2530 'cursor-pointer': $store.customer.isLoggedIn 2531 }" 2532 class="relative inline-block lg:px-2 no-underline whitespace-nowrap" 2533 title="Mes listes de favoris" 2534 role="button" 2535 aria-haspopup="true" 2536 aria-expanded="false" 2537 aria-controls="amwishlist-drawer" 2538> 2539<span class="sr-only label"> 2540Mes listes de favoris </span> 2541<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight"> 2542 <use xlink:href="#heart-empty-symbol"></use> 2543 </svg>
2544<span x-show="$store.customer.isLoggedIn && $store.amwishlist?.lists" 2545 x-text="$store.amwishlist.lists.reduce((acc, l) => acc += l.items.length, 0) || 0" 2546 x-cloak 2547 class="absolute -right-2 top-0 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold" 2548 ></span> 2549</div> 2550<span id="customer-menu" 2551 x-data 2552 x-defer="event:customer-alpine-init" 2553 @click.prevent="$store.customer.isLoggedIn ? $dispatch('toggle-customer-panel') : $dispatch('toggle-authentication', {})" 2554 :class="{ 2555 'text-white cursor-pointer': $store.customer.isInit, 2556 }" 2557 class="relative text-primary-darker" 2558 title="Mon compte" 2559 role="button" 2560 aria-haspopup="true" 2561 aria-expanded="false" 2562 aria-controls="customer-drawer" 2563> 2564<span class="sr-only label"> 2565Mon compte </span> 2566<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight" 2567 :class="{ 'text-primary-lighter': $store.customer.isLoggedIn }" 2568 > 2569 <use xlink:href="#account-symbol"></use> 2570 </svg> 2571<template x-if="$store.customer.isLoggedIn"> 2572<span x-text="$store.customer.fullName.split(' ', 2).map(s => s?.[0]).join('')" 2573 class="absolute top-0 -right-2 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"></span> 2574</template> 2575</span> 2576<span id="cart-menu" 2577 x-data 2578 x-defer="event:customer-alpine-init" 2579 @click.prevent="$dispatch('toggle-cart-panel', {});" 2580 :class="{ 2581 'text-primary-lighter': !$store.customer.isInit, 2582 'cursor-pointer': $store.customer.isInit 2583 }" 2584 class="relative lg:px-2 no-underline whitespace-nowrap" 2585 title="Mon panier" 2586 role="button" 2587 aria-haspopup="true" 2588 aria-expanded="false" 2589 aria-controls="cart-drawer" 2590> 2591<span class="sr-only label"> 2592Panier </span> 2593<svg class="w-8 xs:w-10 h-8 xs:h-10 p-1 hover:text-highlight"> 2594 <use xlink:href="#basket-symbol"></use> 2595 </svg> 2596<span x-text="$store?.minicart?.cart?.summary_count || '0'" 2597 class="absolute -right-2 top-0 px-2 py-px bg-secondary-lighter text-white rounded-xl text-2xs font-bold"></span> 2598</span> 2599<div id="glopal_cs_position"></div> 2600</div> 2601</div> 2602 2603<div id="main_nav" 2604 class="relative z-header" 2605 > 2606 2607<div x-data="initMainMenu()" 2608 @open-main-menu.window="openAt()" 2609 @close-main-menu.window="closeNav()" 2610 class="grow" 2611> 2612<nav x-cloak 2613 id="drawer-nav" 2614 class="fixed inset-y-0 left-0 z-50 flex flex-col w-drawer max-w-screen overflow-x-hidden overflow-y-scroll bg-white transition-transform duration-700 ease-out" 2615 :class="isOpen ? 'translate-x-0' : '-translate-x-full'" 2616 @keydown.window.escape="closeNav()" 2617 > 2618<div class="relative flex items-center justify-between gap-2 p-4 bg-container-dark text-white"> 2619<a x-show="backId" 2620 class="leading-none" 2621 @click.prevent.stop="navBack()" 2622 > 2623<svg class="w-8 h-8 hover:text-primary-lighter rotate-90"> 2624 <use xlink:href="#chevron-symbol"></use> 2625 </svg> 2626</a> 2627<p class="flex grow py-2 whitespace-nowrap font-bold" 2628 x-html="title"></p> 2629<a @click.prevent.stop="closeNav()"> 2630<span class="text-white text-4xl hover:text-primary-lighter leading-none cursor-pointer">×</span> 2631</a> 2632</div> 2633 2634<div class="relative grow"> 2635<ol x-ref="nav" 2636 @click.stop="openAt" 2637 class="relative p-2 overflow-hidden text-base font-bold font-serif" 2638 data-menu-lvl="0" 2639 > 2640<li class="py-2 " 2641 data-node-id="758" 2642> 2643<span class="flex items-center justify-between cursor-pointer 2644 " 2645 style="" 2646 > 2647<span data-node-title> 2648Plantes vivaces </span> 2649<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 2650 <use xlink:href="#chevron-symbol"></use> 2651 </svg> 2652</span> 2653<ol class="p-2" 2654 style="z-index: 1" 2655 data-menu-lvl="1" 2656 > 2657<li class="py-2 heading" 2658 data-node-id="758_0" 2659> 2660<a href="https://www.jardindupicvert.com/vivaces" 2661 title="Plantes vivaces :  tous les produits" 2662 class="u-text-ellipsis 2663 " 2664 style="" 2665 > 2666<span data-node-title> 2667Plantes vivaces : tous les produits </span> 2668</a> 2669</li> 2670<li class="py-2 " 2671 data-node-id="758_0_1" 2672> 2673<span class="flex items-center justify-between cursor-pointer 2674 " 2675 style="" 2676 > 2677<span data-node-title> 2678Toutes nos vivaces </span> 2679<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 2680 <use xlink:href="#chevron-symbol"></use> 2681 </svg> 2682</span> 2683<ol class="p-2" 2684 style="z-index: 2" 2685 data-menu-lvl="2" 2686 > 2687<li class="py-2 heading" 2688 data-node-id="758_0_1_0" 2689> 2690<a href="https://www.jardindupicvert.com/vivaces" 2691 title="Toutes nos vivaces :  tous les produits" 2692 class="u-text-ellipsis 2693 " 2694 style="" 2695 > 2696<span data-node-title> 2697Toutes nos vivaces : tous les produits </span> 2698</a> 2699</li> 2700<li class="py-2 " 2701 data-node-id="758_0_1_0_1" 2702> 2703<a href="https://www.jardindupicvert.com/genre/achillea" 2704 title="Achillées" 2705 class="u-text-ellipsis 2706 " 2707 style="" 2708 > 2709<span data-node-title> 2710Achillées </span> 2711</a> 2712</li> 2713<li class="py-2 " 2714 data-node-id="758_0_1_0_1_2" 2715> 2716<a href="https://www.jardindupicvert.com/genre/aquilegia" 2717 title="Ancolies" 2718 class="u-text-ellipsis 2719 " 2720 style="" 2721 > 2722<span data-node-title> 2723Ancolies </span> 2724</a> 2725</li> 2726<li class="py-2 " 2727 data-node-id="758_0_1_0_1_2_3" 2728> 2729<a href="https://www.jardindupicvert.com/genre/anemone/anemone-hupehensis" 2730 title="Anémones du Japon" 2731 class="u-text-ellipsis 2732 " 2733 style="" 2734 > 2735<span data-node-title> 2736Anémones du Japon </span> 2737</a> 2738</li> 2739<li class="py-2 " 2740 data-node-id="758_0_1_0_1_2_3_4" 2741> 2742<a href="https://www.jardindupicvert.com/genre/campanula" 2743 title="Campanules" 2744 class="u-text-ellipsis 2745 " 2746 style="" 2747 > 2748<span data-node-title> 2749Campanules </span> 2750</a> 2751</li> 2752<li class="py-2 " 2753 data-node-id="758_0_1_0_1_2_3_4_5" 2754> 2755<a href="https://www.jardindupicvert.com/genre/echinacea" 2756 title="Rudbeckias" 2757 class="u-text-ellipsis 2758 " 2759 style="" 2760 > 2761<span data-node-title> 2762Rudbeckias </span> 2763</a> 2764</li> 2765<li class="py-2 " 2766 data-node-id="758_0_1_0_1_2_3_4_5_6" 2767> 2768<a href="https://www.jardindupicvert.com/genre/geranium" 2769 title="Géraniums" 2770 class="u-text-ellipsis 2771 " 2772 style="" 2773 > 2774<span data-node-title> 2775Géraniums </span> 2776</a> 2777</li> 2778<li class="py-2 " 2779 data-node-id="758_0_1_0_1_2_3_4_5_6_7" 2780> 2781<a href="https://www.jardindupicvert.com/genre/helleborus" 2782 title="Hellébores" 2783 class="u-text-ellipsis 2784 " 2785 style="" 2786 > 2787<span data-node-title> 2788Hellébores </span> 2789</a> 2790</li> 2791<li class="py-2 " 2792 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8" 2793> 2794<a href="https://www.jardindupicvert.com/genre/heuchera" 2795 title="Heuchères" 2796 class="u-text-ellipsis 2797 " 2798 style="" 2799 > 2800<span data-node-title> 2801Heuchères </span> 2802</a> 2803</li> 2804<li class="py-2 " 2805 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9" 2806> 2807<a href="https://www.jardindupicvert.com/genre/hosta" 2808 title="Hostas" 2809 class="u-text-ellipsis 2810 " 2811 style="" 2812 > 2813<span data-node-title> 2814Hostas </span> 2815</a> 2816</li> 2817<li class="py-2 " 2818 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10" 2819> 2820<a href="https://www.jardindupicvert.com/genre/dianthus" 2821 title="Oeillets" 2822 class="u-text-ellipsis 2823 " 2824 style="" 2825 > 2826<span data-node-title> 2827Oeillets </span> 2828</a> 2829</li> 2830<li class="py-2 " 2831 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11" 2832> 2833<a href="https://www.jardindupicvert.com/genre/persicaria" 2834 title="Persicaires" 2835 class="u-text-ellipsis 2836 " 2837 style="" 2838 > 2839<span data-node-title> 2840Persicaires </span> 2841</a> 2842</li> 2843<li class="py-2 " 2844 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12" 2845> 2846<a href="https://www.jardindupicvert.com/genre/vinca" 2847 title="Pervenches" 2848 class="u-text-ellipsis 2849 " 2850 style="" 2851 > 2852<span data-node-title> 2853Pervenches </span> 2854</a> 2855</li> 2856<li class="py-2 " 2857 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13" 2858> 2859<a href="https://www.jardindupicvert.com/genre/phlox" 2860 title="Phlox" 2861 class="u-text-ellipsis 2862 " 2863 style="" 2864 > 2865<span data-node-title> 2866Phlox </span> 2867</a> 2868</li> 2869<li class="py-2 " 2870 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14" 2871> 2872<a href="https://www.jardindupicvert.com/genre/paeonia/paeonia-lactiflora" 2873 title="Pivoines herbacées" 2874 class="u-text-ellipsis 2875 " 2876 style="" 2877 > 2878<span data-node-title> 2879Pivoines herbacées </span> 2880</a> 2881</li> 2882<li class="py-2 " 2883 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15" 2884> 2885<a href="https://www.jardindupicvert.com/genre/salvia" 2886 title="Sauges" 2887 class="u-text-ellipsis 2888 " 2889 style="" 2890 > 2891<span data-node-title> 2892Sauges </span> 2893</a> 2894</li> 2895<li class="py-2 " 2896 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16" 2897> 2898<a href="https://www.jardindupicvert.com/genre/sedum" 2899 title="Sedum" 2900 class="u-text-ellipsis 2901 " 2902 style="" 2903 > 2904<span data-node-title> 2905Sedum </span> 2906</a> 2907</li> 2908</ol> 2909</li> 2910<li class="py-2 " 2911 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2" 2912> 2913<span class="flex items-center justify-between cursor-pointer 2914 " 2915 style="" 2916 > 2917<span data-node-title>
2918Graminées </span> 2919<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 2920 <use xlink:href="#chevron-symbol"></use> 2921 </svg> 2922</span> 2923<ol class="p-2" 2924 style="z-index: 2" 2925 data-menu-lvl="2" 2926 > 2927<li class="py-2 heading" 2928 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0" 2929> 2930<a href="https://www.jardindupicvert.com/graminees" 2931 title="Graminées :  tous les produits" 2932 class="u-text-ellipsis 2933 " 2934 style="" 2935 > 2936<span data-node-title> 2937Graminées : tous les produits </span> 2938</a> 2939</li> 2940<li class="py-2 " 2941 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1" 2942> 2943<a href="https://www.jardindupicvert.com/genre/deschampsia" 2944 title="Canches" 2945 class="u-text-ellipsis 2946 " 2947 style="" 2948 > 2949<span data-node-title> 2950Canches </span> 2951</a> 2952</li> 2953<li class="py-2 " 2954 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2" 2955> 2956<a href="https://www.jardindupicvert.com/genre/carex" 2957 title="Carex" 2958 class="u-text-ellipsis 2959 " 2960 style="" 2961 > 2962<span data-node-title> 2963Carex </span> 2964</a> 2965</li> 2966<li class="py-2 " 2967 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3" 2968> 2969<a href="https://www.jardindupicvert.com/genre/festuca" 2970 title="Fétuques" 2971 class="u-text-ellipsis 2972 " 2973 style="" 2974 > 2975<span data-node-title> 2976Fétuques </span> 2977</a> 2978</li> 2979<li class="py-2 " 2980 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4" 2981> 2982<a href="https://www.jardindupicvert.com/genre/pennisetum" 2983 title="Herbes aux écouvillons" 2984 class="u-text-ellipsis 2985 " 2986 style="" 2987 > 2988<span data-node-title> 2989Herbes aux écouvillons </span> 2990</a> 2991</li> 2992<li class="py-2 " 2993 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5" 2994> 2995<a href="https://www.jardindupicvert.com/genre/cortaderia" 2996 title="Herbes des pampas" 2997 class="u-text-ellipsis 2998 " 2999 style="" 3000 > 3001<span data-node-title> 3002Herbes des pampas </span> 3003</a> 3004</li> 3005<li class="py-2 " 3006 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6" 3007> 3008<a href="https://www.jardindupicvert.com/genre/luzula" 3009 title="Luzules" 3010 class="u-text-ellipsis 3011 " 3012 style="" 3013 > 3014<span data-node-title> 3015Luzules </span> 3016</a> 3017</li> 3018<li class="py-2 " 3019 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7" 3020> 3021<a href="https://www.jardindupicvert.com/genre/miscanthus/miscanthus-sinensis" 3022 title="Roseaux de Chine" 3023 class="u-text-ellipsis 3024 " 3025 style="" 3026 > 3027<span data-node-title> 3028Roseaux de Chine </span> 3029</a> 3030</li> 3031<li class="py-2 " 3032 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8" 3033> 3034<a href="https://www.jardindupicvert.com/genre/phalaris" 3035 title="Rubans de la Vierge" 3036 class="u-text-ellipsis 3037 " 3038 style="" 3039 > 3040<span data-node-title> 3041Rubans de la Vierge </span> 3042</a> 3043</li> 3044<li class="py-2 " 3045 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9" 3046> 3047<a href="https://www.jardindupicvert.com/genre/stipa" 3048 title="Stipas" 3049 class="u-text-ellipsis 3050 " 3051 style="" 3052 > 3053<span data-node-title> 3054Stipas </span> 3055</a> 3056</li> 3057</ol> 3058</li> 3059<li class="py-2 " 3060 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3" 3061> 3062<a href="https://www.jardindupicvert.com/plantes-aromatiques" 3063 title="Les aromatiques" 3064 class="u-text-ellipsis 3065 " 3066 style="" 3067 > 3068<span data-node-title> 3069Les aromatiques </span> 3070</a> 3071</li> 3072<li class="py-2 " 3073 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4" 3074> 3075<a href="https://www.jardindupicvert.com/fougeres" 3076 title="Les fougères" 3077 class="u-text-ellipsis 3078 " 3079 style="" 3080 > 3081<span data-node-title> 3082Les fougères </span> 3083</a> 3084</li> 3085<li class="py-2 " 3086 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5" 3087> 3088<a href="https://www.jardindupicvert.com/plantes-aquatiques" 3089 title="Les aquatiques" 3090 class="u-text-ellipsis 3091 " 3092 style="" 3093 > 3094<span data-node-title> 3095Les aquatiques </span> 3096</a> 3097</li> 3098<li class="py-2 " 3099 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6" 3100> 3101<span class="flex items-center justify-between cursor-pointer 3102 " 3103 style="" 3104 > 3105<span data-node-title> 3106Plantes vivaces par utilisation </span> 3107<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 3108 <use xlink:href="#chevron-symbol"></use> 3109 </svg> 3110</span> 3111<ol class="p-2" 3112 style="z-index: 2" 3113 data-menu-lvl="2" 3114 > 3115<li class="py-2 heading" 3116 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0" 3117> 3118<a href="https://www.jardindupicvert.com/vivaces" 3119 title="Plantes vivaces par utilisation :  tous les produits" 3120 class="u-text-ellipsis 3121 " 3122 style="" 3123 > 3124<span data-node-title> 3125Plantes vivaces par utilisation : tous les produits </span> 3126</a> 3127</li> 3128<li class="py-2 " 3129 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1" 3130> 3131<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-printaniere" 3132 title="Plantes vivaces à floraison printanière" 3133 class="u-text-ellipsis 3134 " 3135 style="" 3136 > 3137<span data-node-title> 3138Plantes vivaces à floraison printanière </span> 3139</a> 3140</li> 3141<li class="py-2 " 3142 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2" 3143> 3144<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-estivale" 3145 title="Plantes vivaces à floraison estivale" 3146 class="u-text-ellipsis 3147 " 3148 style="" 3149 > 3150<span data-node-title> 3151Plantes vivaces à floraison estivale </span> 3152</a> 3153</li> 3154<li class="py-2 " 3155 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3" 3156> 3157<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-automnale" 3158 title="Plantes vivaces à floraison automnale" 3159 class="u-text-ellipsis 3160 " 3161 style="" 3162 > 3163<span data-node-title> 3164Plantes vivaces à floraison automnale </span> 3165</a> 3166</li> 3167<li class="py-2 " 3168 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4" 3169> 3170<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-floraison-hivernale" 3171 title="Plantes vivaces à floraison hivernale" 3172 class="u-text-ellipsis 3173 " 3174 style="" 3175 > 3176<span data-node-title> 3177Plantes vivaces à floraison hivernale </span> 3178</a> 3179</li> 3180<li class="py-2 " 3181 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5" 3182> 3183<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-d-ombre" 3184 title="Plantes vivaces d'ombre" 3185 class="u-text-ellipsis 3186 " 3187 style="" 3188 > 3189<span data-node-title> 3190Plantes vivaces d'ombre </span> 3191</a> 3192</li> 3193<li class="py-2 " 3194 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6" 3195> 3196<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-couvre-sol" 3197 title="Plantes vivaces couvre-sol" 3198 class="u-text-ellipsis 3199 " 3200 style="" 3201 > 3202<span data-node-title> 3203Plantes vivaces couvre-sol </span> 3204</a> 3205</li> 3206<li class="py-2 " 3207 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7" 3208> 3209<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-parfumees" 3210 title="Plantes vivaces parfumées" 3211 class="u-text-ellipsis 3212 " 3213 style="" 3214 > 3215<span data-node-title> 3216Plantes vivaces parfumées </span> 3217</a> 3218</li> 3219<li class="py-2 " 3220 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7_8" 3221> 3222<a href="https://www.jardindupicvert.com/vivaces/vivaces-d-ombre-geantes" 3223 title="Plantes vivaces géantes" 3224 class="u-text-ellipsis 3225 " 3226 style="" 3227 > 3228<span data-node-title> 3229Plantes vivaces géantes </span> 3230</a> 3231</li> 3232<li class="py-2 " 3233 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7_8_9" 3234> 3235<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-a-feuillage-persistant" 3236 title="Plantes vivaces à feuillage persistant" 3237 class="u-text-ellipsis 3238 " 3239 style="" 3240 > 3241<span data-node-title> 3242Plantes vivaces à feuillage persistant </span> 3243</a> 3244</li> 3245</ol> 3246</li> 3247<li class="py-2 " 3248 data-node-id="758_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_2_0_1_2_3_4_5_6_7_8_9_3_4_5_6_0_1_2_3_4_5_6_7_8_9_7" 3249> 3250<a href="https://www.jardindupicvert.com/vivaces/plantes-vivaces-en-pot-de-2-3l" 3251 title="Plantes vivaces en grands pots" 3252 class="u-text-ellipsis 3253 " 3254 style="" 3255 > 3256<span data-node-title> 3257Plantes vivaces en grands pots </span> 3258</a> 3259</li> 3260</ol> 3261</li> 3262<li class="py-2 " 3263 data-node-id="800" 3264> 3265<span class="flex items-center justify-between cursor-pointer 3266 " 3267 style="" 3268 > 3269<span data-node-title> 3270Arbustes </span> 3271<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 3272 <use xlink:href="#chevron-symbol"></use> 3273 </svg> 3274</span> 3275<ol class="p-2" 3276 style="z-index: 1" 3277 data-menu-lvl="1" 3278 > 3279<li class="py-2 heading" 3280 data-node-id="800_0" 3281> 3282<a href="https://www.jardindupicvert.com/arbustes" 3283 title="Arbustes :  tous les produits" 3284 class="u-text-ellipsis 3285 " 3286 style="" 3287 > 3288<span data-node-title> 3289Arbustes : tous les produits </span> 3290</a> 3291</li> 3292<li class="py-2 " 3293 data-node-id="800_0_1" 3294> 3295<span class="flex items-center justify-between cursor-pointer 3296 " 3297 style="" 3298 > 3299<span data-node-title> 3300Tous nos arbustes </span> 3301<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 3302 <use xlink:href="#chevron-symbol"></use> 3303 </svg> 3304</span> 3305<ol class="p-2" 3306 style="z-index: 2" 3307 data-menu-lvl="2" 3308 > 3309<li class="py-2 heading" 3310 data-node-id="800_0_1_0" 3311> 3312<a href="https://www.jardindupicvert.com/arbustes" 3313 title="Tous nos arbustes :  tous les produits" 3314 class="u-text-ellipsis 3315 " 3316 style="" 3317 > 3318<span data-node-title> 3319Tous nos arbustes : tous les produits </span> 3320</a> 3321</li> 3322<li class="py-2 " 3323 data-node-id="800_0_1_0_1" 3324> 3325<a href="https://www.jardindupicvert.com/genre/buxus" 3326 title="Buis" 3327 class="u-text-ellipsis 3328 " 3329 style="" 3330 > 3331<span data-node-title> 3332Buis </span> 3333</a> 3334</li> 3335<li class="py-2 " 3336 data-node-id="800_0_1_0_1_2" 3337> 3338<a href="https://www.jardindupicvert.com/genre/ceanothus" 3339 title="Céanothes" 3340 class="u-text-ellipsis 3341 " 3342 style="" 3343 > 3344<span data-node-title> 3345Céanothes </span> 3346</a> 3347</li> 3348<li class="py-2 " 3349 data-node-id="800_0_1_0_1_2_3" 3350> 3351<a href="https://www.jardindupicvert.com/genre/lonicera" 3352 title="Chèvrefeuilles" 3353 class="u-text-ellipsis 3354 " 3355 style="" 3356 > 3357<span data-node-title> 3358Chèvrefeuilles </span> 3359</a> 3360</li> 3361<li class="py-2 " 3362 data-node-id="800_0_1_0_1_2_3_4" 3363> 3364<a href="https://www.jardindupicvert.com/genre/cornus" 3365 title="Cornouillers" 3366 class="u-text-ellipsis 3367 " 3368 style="" 3369 > 3370<span data-node-title> 3371Cornouillers </span> 3372</a> 3373</li> 3374<li class="py-2 " 3375 data-node-id="800_0_1_0_1_2_3_4_5" 3376> 3377<a href="https://www.jardindupicvert.com/arbustes/erables-du-japon" 3378 title="Érables du Japon" 3379 class="u-text-ellipsis 3380 " 3381 style="" 3382 > 3383<span data-node-title> 3384Ãrables du Japon </span> 3385</a> 3386</li> 3387<li class="py-2 " 3388 data-node-id="800_0_1_0_1_2_3_4_5_6" 3389> 3390<a href="https://www.jardindupicvert.com/genre/euonymus" 3391 title="Fusains" 3392 class="u-text-ellipsis 3393 " 3394 style="" 3395 > 3396<span data-node-title> 3397Fusains </span> 3398</a> 3399</li> 3400<li class="py-2 " 3401 data-node-id="800_0_1_0_1_2_3_4_5_6_7" 3402> 3403<a href="https://www.jardindupicvert.com/genre/hydrangea" 3404 title="Hortensias" 3405 class="u-text-ellipsis 3406 " 3407 style="" 3408 > 3409<span data-node-title> 3410Hortensias </span> 3411</a> 3412</li> 3413<li class="py-2 " 3414 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8" 3415> 3416<a href="https://www.jardindupicvert.com/genre/ilex" 3417 title="Houx" 3418 class="u-text-ellipsis 3419 " 3420 style="" 3421 > 3422<span data-node-title> 3423Houx </span> 3424</a> 3425</li> 3426<li class="py-2 " 3427 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9" 3428> 3429<a href="https://www.jardindupicvert.com/genre/syringa" 3430 title="Lilas" 3431 class="u-text-ellipsis 3432 " 3433 style="" 3434 > 3435<span data-node-title> 3436Lilas </span> 3437</a> 3438</li> 3439<li class="py-2 " 3440 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10" 3441> 3442<a href="https://www.jardindupicvert.com/genre/magnolia" 3443 title="Magnolias" 3444 class="u-text-ellipsis 3445 " 3446 style="" 3447 > 3448<span data-node-title> 3449Magnolias </span> 3450</a> 3451</li> 3452<li class="py-2 " 3453 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11" 3454> 3455<a href="https://www.jardindupicvert.com/genre/choisya/choisya-ternata" 3456 title="Oranger du Mexique" 3457 class="u-text-ellipsis 3458 " 3459 style="" 3460 > 3461<span data-node-title> 3462Oranger du Mexique </span> 3463</a> 3464</li> 3465<li class="py-2 " 3466 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12" 3467> 3468<a href="https://www.jardindupicvert.com/genre/rhododendron" 3469 title="Rhododendrons" 3470 class="u-text-ellipsis 3471 " 3472 style="" 3473 > 3474<span data-node-title> 3475Rhododendrons </span> 3476</a> 3477</li> 3478<li class="py-2 " 3479 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13" 3480> 3481<a href="https://www.jardindupicvert.com/genre/spiraea" 3482 title="Spirées" 3483 class="u-text-ellipsis 3484 " 3485 style="" 3486 > 3487<span data-node-title> 3488Spirées </span> 3489</a> 3490</li> 3491<li class="py-2 " 3492 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14" 3493> 3494<a href="https://www.jardindupicvert.com/genre/sambucus" 3495 title="Sureaux" 3496 class="u-text-ellipsis 3497 " 3498 style="" 3499 > 3500<span data-node-title>
3500 3501Sureaux </span> 3502</a> 3503</li> 3504<li class="py-2 " 3505 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15" 3506> 3507<a href="https://www.jardindupicvert.com/genre/viburnum" 3508 title="Viornes" 3509 class="u-text-ellipsis 3510 " 3511 style="" 3512 > 3513<span data-node-title> 3514Viornes </span> 3515</a> 3516</li> 3517</ol> 3518</li> 3519<li class="py-2 " 3520 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2" 3521> 3522<span class="flex items-center justify-between cursor-pointer 3523 " 3524 style="" 3525 > 3526<span data-node-title> 3527Arbustes par utilisation </span> 3528<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 3529 <use xlink:href="#chevron-symbol"></use> 3530 </svg> 3531</span> 3532<ol class="p-2" 3533 style="z-index: 2" 3534 data-menu-lvl="2" 3535 > 3536<li class="py-2 heading" 3537 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0" 3538> 3539<a href="https://www.jardindupicvert.com/arbustes" 3540 title="Arbustes par utilisation :  tous les produits" 3541 class="u-text-ellipsis 3542 " 3543 style="" 3544 > 3545<span data-node-title> 3546Arbustes par utilisation : tous les produits </span> 3547</a> 3548</li> 3549<li class="py-2 " 3550 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1" 3551> 3552<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-printaniere" 3553 title="Arbustes à floraison printanière" 3554 class="u-text-ellipsis 3555 " 3556 style="" 3557 > 3558<span data-node-title> 3559Arbustes à floraison printanière </span> 3560</a> 3561</li> 3562<li class="py-2 " 3563 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2" 3564> 3565<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-estivale" 3566 title="Arbustes à floraison estivale" 3567 class="u-text-ellipsis 3568 " 3569 style="" 3570 > 3571<span data-node-title> 3572Arbustes à floraison estivale </span> 3573</a> 3574</li> 3575<li class="py-2 " 3576 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3" 3577> 3578<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-automnale" 3579 title="Arbustes à floraison automnale" 3580 class="u-text-ellipsis 3581 " 3582 style="" 3583 > 3584<span data-node-title> 3585Arbustes à floraison automnale </span> 3586</a> 3587</li> 3588<li class="py-2 " 3589 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4" 3590> 3591<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-floraison-hivernale" 3592 title="Arbustes à floraison hivernale" 3593 class="u-text-ellipsis 3594 " 3595 style="" 3596 > 3597<span data-node-title> 3598Arbustes à floraison hivernale </span> 3599</a> 3600</li> 3601<li class="py-2 " 3602 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5" 3603> 3604<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/arbustes-fruitiers" 3605 title="Arbustes fruitiers" 3606 class="u-text-ellipsis 3607 " 3608 style="" 3609 > 3610<span data-node-title> 3611Arbustes fruitiers </span> 3612</a> 3613</li> 3614<li class="py-2 " 3615 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6" 3616> 3617<a href="https://www.jardindupicvert.com/arbustes/arbustes-parfumes" 3618 title="Arbustes parfumés" 3619 class="u-text-ellipsis 3620 " 3621 style="" 3622 > 3623<span data-node-title> 3624Arbustes parfumés </span> 3625</a> 3626</li> 3627<li class="py-2 " 3628 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7" 3629> 3630<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-feuillage-panache" 3631 title="Arbustes à feuillage panaché" 3632 class="u-text-ellipsis 3633 " 3634 style="" 3635 > 3636<span data-node-title> 3637Arbustes à feuillage panaché </span> 3638</a> 3639</li> 3640<li class="py-2 " 3641 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8" 3642> 3643<a href="https://www.jardindupicvert.com/arbustes/arbustes-a-feuillage-persistant" 3644 title="Arbustes à feuillage persistant" 3645 class="u-text-ellipsis 3646 " 3647 style="" 3648 > 3649<span data-node-title> 3650Arbustes à feuillage persistant </span> 3651</a> 3652</li> 3653<li class="py-2 " 3654 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9" 3655> 3656<a href="https://www.jardindupicvert.com/arbustes/arbustes-de-terre-de-bruyere" 3657 title="Arbustes de terre de bruyère" 3658 class="u-text-ellipsis 3659 " 3660 style="" 3661 > 3662<span data-node-title> 3663Arbustes de terre de bruyère </span> 3664</a> 3665</li> 3666<li class="py-2 " 3667 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10" 3668> 3669<a href="https://www.jardindupicvert.com/arbustes/haies-pour-les-oiseaux" 3670 title="Haies pour les oiseaux" 3671 class="u-text-ellipsis 3672 " 3673 style="" 3674 > 3675<span data-node-title> 3676Haies pour les oiseaux </span> 3677</a> 3678</li> 3679<li class="py-2 " 3680 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11" 3681> 3682<a href="https://www.jardindupicvert.com/coniferes/petits-coniferes" 3683 title="Conifères nains et petits conifères" 3684 class="u-text-ellipsis 3685 " 3686 style="" 3687 > 3688<span data-node-title> 3689Conifères nains et petits conifères </span> 3690</a> 3691</li> 3692</ol> 3693</li> 3694<li class="py-2 " 3695 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3" 3696> 3697<span class="flex items-center justify-between cursor-pointer 3698 " 3699 style="" 3700 > 3701<span data-node-title> 3702Bambous </span> 3703<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 3704 <use xlink:href="#chevron-symbol"></use> 3705 </svg> 3706</span> 3707<ol class="p-2" 3708 style="z-index: 2" 3709 data-menu-lvl="2" 3710 > 3711<li class="py-2 heading" 3712 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3_0" 3713> 3714<a href="https://www.jardindupicvert.com/bambous" 3715 title="Bambous :  tous les produits" 3716 class="u-text-ellipsis 3717 " 3718 style="" 3719 > 3720<span data-node-title> 3721Bambous : tous les produits </span> 3722</a> 3723</li> 3724<li class="py-2 " 3725 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3_0_1" 3726> 3727<a href="https://www.jardindupicvert.com/genre/sasa" 3728 title="Bambous couvre-sol" 3729 class="u-text-ellipsis 3730 " 3731 style="" 3732 > 3733<span data-node-title> 3734Bambous couvre-sol </span> 3735</a> 3736</li> 3737<li class="py-2 " 3738 data-node-id="800_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_2_0_1_2_3_4_5_6_7_8_9_10_11_3_0_1_2" 3739> 3740<a href="https://www.jardindupicvert.com/genre/fargesia" 3741 title="Bambous non traçants" 3742 class="u-text-ellipsis 3743 " 3744 style="" 3745 > 3746<span data-node-title> 3747Bambous non traçants </span> 3748</a> 3749</li> 3750</ol> 3751</li> 3752</ol> 3753</li> 3754<li class="py-2 " 3755 data-node-id="832" 3756> 3757<span class="flex items-center justify-between cursor-pointer 3758 " 3759 style="" 3760 > 3761<span data-node-title> 3762Arbres </span> 3763<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 3764 <use xlink:href="#chevron-symbol"></use> 3765 </svg> 3766</span> 3767<ol class="p-2" 3768 style="z-index: 1" 3769 data-menu-lvl="1" 3770 > 3771<li class="py-2 heading" 3772 data-node-id="832_0" 3773> 3774<a href="https://www.jardindupicvert.com/arbres" 3775 title="Arbres :  tous les produits" 3776 class="u-text-ellipsis 3777 " 3778 style="" 3779 > 3780<span data-node-title> 3781Arbres : tous les produits </span> 3782</a> 3783</li> 3784<li class="py-2 " 3785 data-node-id="832_0_1" 3786> 3787<span class="flex items-center justify-between cursor-pointer 3788 " 3789 style="" 3790 > 3791<span data-node-title> 3792Tous nos arbres </span> 3793<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 3794 <use xlink:href="#chevron-symbol"></use> 3795 </svg> 3796</span> 3797<ol class="p-2" 3798 style="z-index: 2" 3799 data-menu-lvl="2" 3800 > 3801<li class="py-2 heading" 3802 data-node-id="832_0_1_0" 3803> 3804<a href="https://www.jardindupicvert.com/arbres" 3805 title="Tous nos arbres :  tous les produits" 3806 class="u-text-ellipsis 3807 " 3808 style="" 3809 > 3810<span data-node-title> 3811Tous nos arbres : tous les produits </span> 3812</a> 3813</li> 3814<li class="py-2 " 3815 data-node-id="832_0_1_0_1" 3816> 3817<a href="https://www.jardindupicvert.com/genre/arbutus" 3818 title="Arbousiers" 3819 class="u-text-ellipsis 3820 " 3821 style="" 3822 > 3823<span data-node-title> 3824Arbousiers </span> 3825</a> 3826</li> 3827<li class="py-2 " 3828 data-node-id="832_0_1_0_1_2" 3829> 3830<a href="https://www.jardindupicvert.com/genre/betula" 3831 title="Bouleaux" 3832 class="u-text-ellipsis 3833 " 3834 style="" 3835 > 3836<span data-node-title> 3837Bouleaux </span> 3838</a> 3839</li> 3840<li class="py-2 " 3841 data-node-id="832_0_1_0_1_2_3" 3842> 3843<a href="https://www.jardindupicvert.com/genre/catalpa" 3844 title="Catalpas" 3845 class="u-text-ellipsis 3846 " 3847 style="" 3848 > 3849<span data-node-title> 3850Catalpas </span> 3851</a> 3852</li> 3853<li class="py-2 " 3854 data-node-id="832_0_1_0_1_2_3_4" 3855> 3856<a href="https://www.jardindupicvert.com/genre/carpinus" 3857 title="Charmes" 3858 class="u-text-ellipsis 3859 " 3860 style="" 3861 > 3862<span data-node-title> 3863Charmes </span> 3864</a> 3865</li> 3866<li class="py-2 " 3867 data-node-id="832_0_1_0_1_2_3_4_5" 3868> 3869<a href="https://www.jardindupicvert.com/genre/quercus" 3870 title="Chênes" 3871 class="u-text-ellipsis 3872 " 3873 style="" 3874 > 3875<span data-node-title> 3876Chênes </span> 3877</a> 3878</li> 3879<li class="py-2 " 3880 data-node-id="832_0_1_0_1_2_3_4_5_6" 3881> 3882<a href="https://www.jardindupicvert.com/genre/acer" 3883 title="Érables" 3884 class="u-text-ellipsis 3885 " 3886 style="" 3887 > 3888<span data-node-title> 3889Ãrables </span> 3890</a> 3891</li> 3892<li class="py-2 " 3893 data-node-id="832_0_1_0_1_2_3_4_5_6_7" 3894> 3895<a href="https://www.jardindupicvert.com/genre/fraxinus" 3896 title="Frênes" 3897 class="u-text-ellipsis 3898 " 3899 style="" 3900 > 3901<span data-node-title> 3902Frênes </span> 3903</a> 3904</li> 3905<li class="py-2 " 3906 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8" 3907>
3908<a href="https://www.jardindupicvert.com/genre/liquidambar" 3909 title="Liquidambars" 3910 class="u-text-ellipsis 3911 " 3912 style="" 3913 > 3914<span data-node-title> 3915Liquidambars </span> 3916</a> 3917</li> 3918<li class="py-2 " 3919 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9" 3920> 3921<a href="https://www.jardindupicvert.com/genre/magnolia" 3922 title="Magnolias" 3923 class="u-text-ellipsis 3924 " 3925 style="" 3926 > 3927<span data-node-title> 3928Magnolias </span> 3929</a> 3930</li> 3931<li class="py-2 " 3932 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10" 3933> 3934<a href="https://www.jardindupicvert.com/genre/paulownia" 3935 title="Pawlonias" 3936 class="u-text-ellipsis 3937 " 3938 style="" 3939 > 3940<span data-node-title> 3941Pawlonias </span> 3942</a> 3943</li> 3944<li class="py-2 " 3945 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11" 3946> 3947<a href="https://www.jardindupicvert.com/genre/populus" 3948 title="Peupliers" 3949 class="u-text-ellipsis 3950 " 3951 style="" 3952 > 3953<span data-node-title> 3954Peupliers </span> 3955</a> 3956</li> 3957<li class="py-2 " 3958 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12" 3959> 3960<a href="https://www.jardindupicvert.com/genre/prunus" 3961 title="Prunus" 3962 class="u-text-ellipsis 3963 " 3964 style="" 3965 > 3966<span data-node-title> 3967Prunus </span> 3968</a> 3969</li> 3970<li class="py-2 " 3971 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13" 3972> 3973<a href="https://www.jardindupicvert.com/genre/salix" 3974 title="Saules" 3975 class="u-text-ellipsis 3976 " 3977 style="" 3978 > 3979<span data-node-title> 3980Saules </span> 3981</a> 3982</li> 3983<li class="py-2 " 3984 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14" 3985> 3986<a href="https://www.jardindupicvert.com/genre/sorbus" 3987 title="Sorbiers" 3988 class="u-text-ellipsis 3989 " 3990 style="" 3991 > 3992<span data-node-title> 3993Sorbiers </span> 3994</a> 3995</li> 3996</ol> 3997</li> 3998<li class="py-2 " 3999 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2" 4000> 4001<span class="flex items-center justify-between cursor-pointer 4002 " 4003 style="" 4004 > 4005<span data-node-title> 4006Les conifères </span> 4007<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4008 <use xlink:href="#chevron-symbol"></use> 4009 </svg> 4010</span> 4011<ol class="p-2" 4012 style="z-index: 2" 4013 data-menu-lvl="2" 4014 > 4015<li class="py-2 heading" 4016 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0" 4017> 4018<a href="https://www.jardindupicvert.com/coniferes" 4019 title="Les conifères :  tous les produits" 4020 class="u-text-ellipsis 4021 " 4022 style="" 4023 > 4024<span data-node-title> 4025Les conifères : tous les produits </span> 4026</a> 4027</li> 4028<li class="py-2 " 4029 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1" 4030> 4031<a href="https://www.jardindupicvert.com/genre/cryptomeria" 4032 title="Cèdres du Japon" 4033 class="u-text-ellipsis 4034 " 4035 style="" 4036 > 4037<span data-node-title> 4038Cèdres du Japon </span> 4039</a> 4040</li> 4041<li class="py-2 " 4042 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2" 4043> 4044<a href="https://www.jardindupicvert.com/genre/cupressus" 4045 title="Cyprès d'Italie" 4046 class="u-text-ellipsis 4047 " 4048 style="" 4049 > 4050<span data-node-title> 4051Cyprès d'Italie </span> 4052</a> 4053</li> 4054<li class="py-2 " 4055 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3" 4056> 4057<a href="https://www.jardindupicvert.com/genre/chamaecyparis/chamaecyparis-lawsoniana" 4058 title="Cyprès de Lawson" 4059 class="u-text-ellipsis 4060 " 4061 style="" 4062 > 4063<span data-node-title> 4064Cyprès de Lawson </span> 4065</a> 4066</li> 4067<li class="py-2 " 4068 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4" 4069> 4070<a href="https://www.jardindupicvert.com/genre/cupressocyparis" 4071 title="Cyprès de Leyland" 4072 class="u-text-ellipsis 4073 " 4074 style="" 4075 > 4076<span data-node-title> 4077Cyprès de Leyland </span> 4078</a> 4079</li> 4080<li class="py-2 " 4081 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5" 4082> 4083<a href="https://www.jardindupicvert.com/genre/picea" 4084 title="Épicéas" 4085 class="u-text-ellipsis 4086 " 4087 style="" 4088 > 4089<span data-node-title> 4090Ãpicéas </span> 4091</a> 4092</li> 4093<li class="py-2 " 4094 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6" 4095> 4096<a href="https://www.jardindupicvert.com/genre/juniperus" 4097 title="Genévriers" 4098 class="u-text-ellipsis 4099 " 4100 style="" 4101 > 4102<span data-node-title> 4103Genévriers </span> 4104</a> 4105</li> 4106<li class="py-2 " 4107 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7" 4108> 4109<a href="https://www.jardindupicvert.com/genre/ginkgo" 4110 title="Ginkgo biloba" 4111 class="u-text-ellipsis 4112 " 4113 style="" 4114 > 4115<span data-node-title> 4116Ginkgo biloba </span> 4117</a> 4118</li> 4119<li class="py-2 " 4120 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8" 4121> 4122<a href="https://www.jardindupicvert.com/genre/taxus" 4123 title="Ifs" 4124 class="u-text-ellipsis 4125 " 4126 style="" 4127 > 4128<span data-node-title> 4129Ifs </span> 4130</a> 4131</li> 4132<li class="py-2 " 4133 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9" 4134> 4135<a href="https://www.jardindupicvert.com/genre/pinus" 4136 title="Pins" 4137 class="u-text-ellipsis 4138 " 4139 style="" 4140 > 4141<span data-node-title> 4142Pins </span> 4143</a> 4144</li> 4145<li class="py-2 " 4146 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10" 4147> 4148<a href="https://www.jardindupicvert.com/genre/abies" 4149 title="Sapins" 4150 class="u-text-ellipsis 4151 " 4152 style="" 4153 > 4154<span data-node-title> 4155Sapins </span> 4156</a> 4157</li> 4158</ol> 4159</li> 4160<li class="py-2 " 4161 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3" 4162> 4163<a href="https://www.jardindupicvert.com/palmiers" 4164 title="Les palmiers" 4165 class="u-text-ellipsis 4166 " 4167 style="" 4168 > 4169<span data-node-title> 4170Les palmiers </span> 4171</a> 4172</li> 4173<li class="py-2 " 4174 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4" 4175> 4176<span class="flex items-center justify-between cursor-pointer 4177 " 4178 style="" 4179 > 4180<span data-node-title> 4181Les arbres par utilisation </span> 4182<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4183 <use xlink:href="#chevron-symbol"></use> 4184 </svg> 4185</span> 4186<ol class="p-2" 4187 style="z-index: 2" 4188 data-menu-lvl="2" 4189 > 4190<li class="py-2 heading" 4191 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0" 4192> 4193<a href="https://www.jardindupicvert.com/arbres" 4194 title="Les arbres par utilisation :  tous les produits" 4195 class="u-text-ellipsis 4196 " 4197 style="" 4198 > 4199<span data-node-title> 4200Les arbres par utilisation : tous les produits </span> 4201</a> 4202</li> 4203<li class="py-2 " 4204 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1" 4205> 4206<a href="https://www.jardindupicvert.com/arbres/arbres-a-ecorce-remarquable" 4207 title="Arbres à écorce remarquable" 4208 class="u-text-ellipsis 4209 " 4210 style="" 4211 > 4212<span data-node-title> 4213Arbres à écorce remarquable </span> 4214</a> 4215</li> 4216<li class="py-2 " 4217 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2" 4218> 4219<a href="https://www.jardindupicvert.com/arbres/arbres-parfumes" 4220 title="Arbres parfumés" 4221 class="u-text-ellipsis 4222 " 4223 style="" 4224 > 4225<span data-node-title> 4226Arbres parfumés </span> 4227</a> 4228</li> 4229<li class="py-2 " 4230 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2_3" 4231> 4232<a href="https://www.jardindupicvert.com/arbres/arbres-a-feuillage-panache" 4233 title="Arbres à feuillage panaché" 4234 class="u-text-ellipsis 4235 " 4236 style="" 4237 > 4238<span data-node-title> 4239Arbres à feuillage panaché </span> 4240</a> 4241</li> 4242<li class="py-2 " 4243 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2_3_4" 4244> 4245<a href="https://www.jardindupicvert.com/arbres/arbres-a-feuillage-persistant" 4246 title="Arbres à feuillage persistant" 4247 class="u-text-ellipsis 4248 " 4249 style="" 4250 > 4251<span data-node-title> 4252Arbres à feuillage persistant </span> 4253</a> 4254</li> 4255<li class="py-2 " 4256 data-node-id="832_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_14_2_0_1_2_3_4_5_6_7_8_9_10_3_4_0_1_2_3_4_5" 4257> 4258<a href="https://www.jardindupicvert.com/arbres/arbres-mediterraneens" 4259 title="Arbres méditerranéens" 4260 class="u-text-ellipsis 4261 " 4262 style="" 4263 > 4264<span data-node-title> 4265Arbres méditerranéens </span> 4266</a> 4267</li> 4268</ol> 4269</li> 4270</ol> 4271</li> 4272<li class="py-2 " 4273 data-node-id="866" 4274> 4275<span class="flex items-center justify-between cursor-pointer 4276 " 4277 style="" 4278 > 4279<span data-node-title> 4280Fruitiers et petits fruits </span> 4281<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4282 <use xlink:href="#chevron-symbol"></use> 4283 </svg> 4284</span> 4285<ol class="p-2" 4286 style="z-index: 1" 4287 data-menu-lvl="1" 4288 > 4289<li class="py-2 heading" 4290 data-node-id="866_0" 4291> 4292<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits" 4293 title="Fruitiers et petits fruits :  tous les produits" 4294 class="u-text-ellipsis 4295 " 4296 style="" 4297 > 4298<span data-node-title> 4299Fruitiers et petits fruits : tous les produits </span> 4300</a> 4301</li> 4302<li class="py-2 " 4303 data-node-id="866_0_1" 4304> 4305<span class="flex items-center justify-between cursor-pointer 4306 " 4307 style="" 4308 > 4309<span data-node-title> 4310Tous nos fruitiers </span> 4311<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4312 <use xlink:href="#chevron-symbol"></use> 4313 </svg> 4314</span> 4315<ol class="p-2" 4316 style="z-index: 2" 4317 data-menu-lvl="2" 4318 > 4319<li class="py-2 heading" 4320 data-node-id="866_0_1_0" 4321> 4322<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits" 4323 title="Tous nos fruitiers :  tous les produits" 4324 class="u-text-ellipsis 4325 " 4326 style="" 4327 > 4328<span data-node-title> 4329Tous nos fruitiers : tous les produits </span> 4330</a> 4331</li> 4332<li class="py-2 " 4333 data-node-id="866_0_1_0_1" 4334> 4335<a href="https://www.jardindupicvert.com/genre/prunus/prunus-armeniaca" 4336 title="Abricotiers" 4337 class="u-text-ellipsis 4338 " 4339 style="" 4340 > 4341<span data-node-title> 4342Abricotiers </span> 4343</a> 4344</li> 4345<li class="py-2 " 4346 data-node-id="866_0_1_0_1_2" 4347> 4348<a href="https://www.jardindupicvert.com/genre/prunus/prunus-dulcis" 4349 title="Amandiers" 4350 class="u-text-ellipsis 4351 " 4352 style="" 4353 > 4354<span data-node-title> 4355Amandiers </span> 4356</a> 4357</li> 4358<li class="py-2 " 4359 data-node-id="866_0_1_0_1_2_3" 4360> 4361<a href="https://www.jardindupicvert.com/genre/prunus/prunus-cerasus" 4362 title="Cerisiers" 4363 class="u-text-ellipsis 4364 " 4365 style="" 4366 > 4367<span data-node-title> 4368Cerisiers </span> 4369</a> 4370</li> 4371<li class="py-2 " 4372 data-node-id="866_0_1_0_1_2_3_4" 4373> 4374<a href="https://www.jardindupicvert.com/genre/castanea" 4375 title="Châtaigniers" 4376 class="u-text-ellipsis 4377 " 4378 style="" 4379 > 4380<span data-node-title> 4381Châtaigniers </span> 4382</a> 4383</li> 4384<li class="py-2 " 4385 data-node-id="866_0_1_0_1_2_3_4_5" 4386> 4387<a href="https://www.jardindupicvert.com/genre/ficus/ficus-carica" 4388 title="Figuiers" 4389 class="u-text-ellipsis 4390 " 4391 style="" 4392 > 4393<span data-node-title> 4394Figuiers </span> 4395</a> 4396</li> 4397<li class="py-2 " 4398 data-node-id="866_0_1_0_1_2_3_4_5_6" 4399> 4400<a href="https://www.jardindupicvert.com/genre/corylus" 4401 title="Noisetiers" 4402 class="u-text-ellipsis 4403 " 4404 style="" 4405 > 4406<span data-node-title> 4407Noisetiers </span> 4408</a> 4409</li> 4410<li class="py-2 " 4411 data-node-id="866_0_1_0_1_2_3_4_5_6_7" 4412> 4413<a href="https://www.jardindupicvert.com/genre/juglans" 4414 title="Noyers" 4415 class="u-text-ellipsis 4416 " 4417 style="" 4418 > 4419<span data-node-title> 4420Noyers </span> 4421</a> 4422</li> 4423<li class="py-2 " 4424 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8" 4425> 4426<a href="https://www.jardindupicvert.com/genre/prunus/prunus-persica" 4427 title="Pêchers - nectariniers" 4428 class="u-text-ellipsis 4429 " 4430 style="" 4431 > 4432<span data-node-title> 4433Pêchers - nectariniers </span> 4434</a> 4435</li> 4436<li class="py-2 " 4437 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9" 4438> 4439<a href="https://www.jardindupicvert.com/genre/pyrus" 4440 title="Poiriers" 4441 class="u-text-ellipsis 4442 " 4443 style="" 4444 > 4445<span data-node-title> 4446Poiriers </span> 4447</a> 4448</li> 4449<li class="py-2 " 4450 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10" 4451> 4452<a href="https://www.jardindupicvert.com/genre/malus" 4453 title="Pommiers" 4454 class="u-text-ellipsis 4455 " 4456 style="" 4457 > 4458<span data-node-title> 4459Pommiers </span> 4460</a> 4461</li> 4462<li class="py-2 " 4463 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11" 4464> 4465<a href="https://www.jardindupicvert.com/genre/prunus/prunus-domestica" 4466 title="Pruniers - mirabelliers" 4467 class="u-text-ellipsis 4468 " 4469 style="" 4470 > 4471<span data-node-title> 4472Pruniers - mirabelliers </span> 4473</a> 4474</li> 4475</ol> 4476</li> 4477<li class="py-2 " 4478 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2" 4479> 4480<span class="flex items-center justify-between cursor-pointer 4481 " 4482 style="" 4483 > 4484<span data-node-title> 4485Arbustes à petits fruits </span> 4486<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4487 <use xlink:href="#chevron-symbol"></use> 4488 </svg> 4489</span> 4490<ol class="p-2" 4491 style="z-index: 2" 4492 data-menu-lvl="2" 4493 > 4494<li class="py-2 heading" 4495 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0" 4496> 4497<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/petits-fruits" 4498 title="Arbustes à petits fruits :  tous les produits" 4499 class="u-text-ellipsis 4500 " 4501 style="" 4502 > 4503<span data-node-title> 4504Arbustes à petits fruits : tous les produits </span> 4505</a> 4506</li> 4507<li class="py-2 " 4508 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1" 4509> 4510<a href="https://www.jardindupicvert.com/genre/ribes/ribes-nigrum" 4511 title="Cassissiers" 4512 class="u-text-ellipsis 4513 " 4514 style="" 4515 > 4516<span data-node-title> 4517Cassissiers </span> 4518</a> 4519</li> 4520<li class="py-2 " 4521 data-node-id="866_0_1_0
4521_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2" 4522> 4523<a href="https://www.jardindupicvert.com/genre/fragaria" 4524 title="Fraisiers" 4525 class="u-text-ellipsis 4526 " 4527 style="" 4528 > 4529<span data-node-title> 4530Fraisiers </span> 4531</a> 4532</li> 4533<li class="py-2 " 4534 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3" 4535> 4536<a href="https://www.jardindupicvert.com/genre/rubus/rubus-idaeus" 4537 title="Framboisiers" 4538 class="u-text-ellipsis 4539 " 4540 style="" 4541 > 4542<span data-node-title> 4543Framboisiers </span> 4544</a> 4545</li> 4546<li class="py-2 " 4547 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4" 4548> 4549<a href="https://www.jardindupicvert.com/genre/ribes/ribes-rubrum" 4550 title="Groseilliers" 4551 class="u-text-ellipsis 4552 " 4553 style="" 4554 > 4555<span data-node-title> 4556Groseilliers </span> 4557</a> 4558</li> 4559<li class="py-2 " 4560 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5" 4561> 4562<a href="https://www.jardindupicvert.com/genre/actinidia" 4563 title="Kiwis" 4564 class="u-text-ellipsis 4565 " 4566 style="" 4567 > 4568<span data-node-title> 4569Kiwis </span> 4570</a> 4571</li> 4572<li class="py-2 " 4573 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6" 4574> 4575<a href="https://www.jardindupicvert.com/genre/morus" 4576 title="Mûriers" 4577 class="u-text-ellipsis 4578 " 4579 style="" 4580 > 4581<span data-node-title> 4582Mûriers </span> 4583</a> 4584</li> 4585<li class="py-2 " 4586 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6_7" 4587> 4588<a href="https://www.jardindupicvert.com/genre/vaccinium" 4589 title="Myrtilles - airelles" 4590 class="u-text-ellipsis 4591 " 4592 style="" 4593 > 4594<span data-node-title> 4595Myrtilles - airelles </span> 4596</a> 4597</li> 4598<li class="py-2 " 4599 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6_7_8" 4600> 4601<a href="https://www.jardindupicvert.com/genre/vitis/vitis-vinifera" 4602 title="Vignes" 4603 class="u-text-ellipsis 4604 " 4605 style="" 4606 > 4607<span data-node-title> 4608Vignes </span> 4609</a> 4610</li> 4611</ol> 4612</li> 4613<li class="py-2 " 4614 data-node-id="866_0_1_0_1_2_3_4_5_6_7_8_9_10_11_2_0_1_2_3_4_5_6_7_8_3" 4615> 4616<a href="https://www.jardindupicvert.com/fruitiers-et-petits-fruits/fruitiers-nains-a-port-colonnaire" 4617 title="Fruitiers nains et à port colonnaire" 4618 class="u-text-ellipsis 4619 " 4620 style="" 4621 > 4622<span data-node-title> 4623Fruitiers nains et à port colonnaire </span> 4624</a> 4625</li> 4626</ol> 4627</li> 4628<li class="py-2 " 4629 data-node-id="1115" 4630> 4631<span class="flex items-center justify-between cursor-pointer 4632 " 4633 style="" 4634 > 4635<span data-node-title> 4636Potager </span> 4637<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4638 <use xlink:href="#chevron-symbol"></use> 4639 </svg> 4640</span> 4641<ol class="p-2" 4642 style="z-index: 1" 4643 data-menu-lvl="1" 4644 > 4645<li class="py-2 " 4646 data-node-id="1115_1116" 4647> 4648<a href="https://www.jardindupicvert.com/bulbes-et-semences/graines-potageres" 4649 title="Graines potagères" 4650 class="u-text-ellipsis 4651 " 4652 style="" 4653 > 4654<span data-node-title> 4655Graines potagères </span> 4656</a> 4657</li> 4658<li class="py-2 " 4659 data-node-id="1115_1116_1119" 4660> 4661<a href="https://www.jardindupicvert.com/potager/plants-de-tomate" 4662 title="Plants de tomate" 4663 class="u-text-ellipsis 4664 " 4665 style="" 4666 > 4667<span data-node-title> 4668Plants de tomate </span> 4669</a> 4670</li> 4671<li class="py-2 " 4672 data-node-id="1115_1116_1119_1117" 4673> 4674<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-potagers" 4675 title="Bulbes potagers" 4676 class="u-text-ellipsis 4677 " 4678 style="" 4679 > 4680<span data-node-title> 4681Bulbes potagers </span> 4682</a> 4683</li> 4684<li class="py-2 " 4685 data-node-id="1115_1116_1119_1117_1118" 4686> 4687<a href="https://www.jardindupicvert.com/potager/potager-d-ornement" 4688 title="Potager d'ornement" 4689 class="u-text-ellipsis 4690 " 4691 style="" 4692 > 4693<span data-node-title> 4694Potager d'ornement </span> 4695</a> 4696</li> 4697</ol> 4698</li> 4699<li class="py-2 " 4700 data-node-id="889" 4701> 4702<span class="flex items-center justify-between cursor-pointer 4703 " 4704 style="" 4705 > 4706<span data-node-title> 4707Plantes grimpantes </span> 4708<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4709 <use xlink:href="#chevron-symbol"></use> 4710 </svg> 4711</span> 4712<ol class="p-2" 4713 style="z-index: 1" 4714 data-menu-lvl="1" 4715 > 4716<li class="py-2 heading" 4717 data-node-id="889_0" 4718> 4719<a href="https://www.jardindupicvert.com/plantes-grimpantes" 4720 title="Plantes grimpantes :  tous les produits" 4721 class="u-text-ellipsis 4722 " 4723 style="" 4724 > 4725<span data-node-title> 4726Plantes grimpantes : tous les produits </span> 4727</a> 4728</li> 4729<li class="py-2 " 4730 data-node-id="889_0_1" 4731> 4732<span class="flex items-center justify-between cursor-pointer 4733 " 4734 style="" 4735 > 4736<span data-node-title> 4737Toutes nos plantes grimpantes </span> 4738<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4739 <use xlink:href="#chevron-symbol"></use> 4740 </svg> 4741</span> 4742<ol class="p-2" 4743 style="z-index: 2" 4744 data-menu-lvl="2" 4745 > 4746<li class="py-2 heading" 4747 data-node-id="889_0_1_0" 4748> 4749<a href="https://www.jardindupicvert.com/plantes-grimpantes" 4750 title="Toutes nos plantes grimpantes :  tous les produits" 4751 class="u-text-ellipsis 4752 " 4753 style="" 4754 > 4755<span data-node-title> 4756Toutes nos plantes grimpantes : tous les produits </span> 4757</a> 4758</li> 4759<li class="py-2 " 4760 data-node-id="889_0_1_0_1" 4761> 4762<a href="https://www.jardindupicvert.com/genre/akebia" 4763 title="Akébies" 4764 class="u-text-ellipsis 4765 " 4766 style="" 4767 > 4768<span data-node-title> 4769Akébies </span> 4770</a> 4771</li> 4772<li class="py-2 " 4773 data-node-id="889_0_1_0_1_2" 4774> 4775<a href="https://www.jardindupicvert.com/genre/campsis" 4776 title="Campsis" 4777 class="u-text-ellipsis 4778 " 4779 style="" 4780 > 4781<span data-node-title> 4782Campsis </span> 4783</a> 4784</li> 4785<li class="py-2 " 4786 data-node-id="889_0_1_0_1_2_3" 4787> 4788<a href="https://www.jardindupicvert.com/genre/lonicera" 4789 title="Chèvrefeuilles" 4790 class="u-text-ellipsis 4791 " 4792 style="" 4793 > 4794<span data-node-title> 4795Chèvrefeuilles </span> 4796</a> 4797</li> 4798<li class="py-2 " 4799 data-node-id="889_0_1_0_1_2_3_4" 4800> 4801<a href="https://www.jardindupicvert.com/genre/clematis" 4802 title="Clématites" 4803 class="u-text-ellipsis 4804 " 4805 style="" 4806 > 4807<span data-node-title> 4808Clématites </span> 4809</a> 4810</li> 4811<li class="py-2 " 4812 data-node-id="889_0_1_0_1_2_3_4_5" 4813> 4814<a href="https://www.jardindupicvert.com/genre/wisteria"
4815 title="Glycines" 4816 class="u-text-ellipsis 4817 " 4818 style="" 4819 > 4820<span data-node-title> 4821Glycines </span> 4822</a> 4823</li> 4824<li class="py-2 " 4825 data-node-id="889_0_1_0_1_2_3_4_5_6" 4826> 4827<a href="https://www.jardindupicvert.com/genre/hydrangea/hydrangea-petiolaris" 4828 title="Hortensias grimpants" 4829 class="u-text-ellipsis 4830 " 4831 style="" 4832 > 4833<span data-node-title> 4834Hortensias grimpants </span> 4835</a> 4836</li> 4837<li class="py-2 " 4838 data-node-id="889_0_1_0_1_2_3_4_5_6_7" 4839> 4840<a href="https://www.jardindupicvert.com/genre/jasminum" 4841 title="Jasmins" 4842 class="u-text-ellipsis 4843 " 4844 style="" 4845 > 4846<span data-node-title> 4847Jasmins </span> 4848</a> 4849</li> 4850<li class="py-2 " 4851 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8" 4852> 4853<a href="https://www.jardindupicvert.com/genre/trachelospermum/trachelospermum-jasminoides" 4854 title="Jasmins étoilés" 4855 class="u-text-ellipsis 4856 " 4857 style="" 4858 > 4859<span data-node-title> 4860Jasmins étoilés </span> 4861</a> 4862</li> 4863<li class="py-2 " 4864 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9" 4865> 4866<a href="https://www.jardindupicvert.com/genre/hedera" 4867 title="Lierres" 4868 class="u-text-ellipsis 4869 " 4870 style="" 4871 > 4872<span data-node-title> 4873Lierres </span> 4874</a> 4875</li> 4876<li class="py-2 " 4877 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10" 4878> 4879<a href="https://www.jardindupicvert.com/genre/passiflora" 4880 title="Passiflores" 4881 class="u-text-ellipsis 4882 " 4883 style="" 4884 > 4885<span data-node-title> 4886Passiflores </span> 4887</a> 4888</li> 4889<li class="py-2 " 4890 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11" 4891> 4892<a href="https://www.jardindupicvert.com/rosiers/rosiers-grimpants" 4893 title="Rosiers grimpants" 4894 class="u-text-ellipsis 4895 " 4896 style="" 4897 > 4898<span data-node-title> 4899Rosiers grimpants </span> 4900</a> 4901</li> 4902<li class="py-2 " 4903 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12" 4904> 4905<a href="https://www.jardindupicvert.com/genre/schizophragma" 4906 title="Schizophragmas" 4907 class="u-text-ellipsis 4908 " 4909 style="" 4910 > 4911<span data-node-title> 4912Schizophragmas </span> 4913</a> 4914</li> 4915<li class="py-2 " 4916 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13" 4917> 4918<a href="https://www.jardindupicvert.com/genre/parthenocissus" 4919 title="Vignes vierges" 4920 class="u-text-ellipsis 4921 " 4922 style="" 4923 > 4924<span data-node-title> 4925Vignes vierges </span> 4926</a> 4927</li> 4928</ol> 4929</li> 4930<li class="py-2 " 4931 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2" 4932> 4933<span class="flex items-center justify-between cursor-pointer 4934 " 4935 style="" 4936 > 4937<span data-node-title> 4938Plantes grimpantes par utilisation </span> 4939<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 4940 <use xlink:href="#chevron-symbol"></use> 4941 </svg> 4942</span> 4943<ol class="p-2" 4944 style="z-index: 2" 4945 data-menu-lvl="2" 4946 > 4947<li class="py-2 heading" 4948 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0" 4949> 4950<a href="https://www.jardindupicvert.com/plantes-grimpantes" 4951 title="Plantes grimpantes par utilisation :  tous les produits" 4952 class="u-text-ellipsis 4953 " 4954 style="" 4955 > 4956<span data-node-title> 4957Plantes grimpantes par utilisation : tous les produits </span> 4958</a> 4959</li> 4960<li class="py-2 " 4961 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1" 4962> 4963<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-printaniere" 4964 title="Plantes grimpantes à floraison printanière" 4965 class="u-text-ellipsis 4966 " 4967 style="" 4968 > 4969<span data-node-title> 4970Plantes grimpantes à floraison printanière </span> 4971</a> 4972</li> 4973<li class="py-2 " 4974 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2" 4975> 4976<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-estivale" 4977 title="Plantes grimpantes à floraison estivale" 4978 class="u-text-ellipsis 4979 " 4980 style="" 4981 > 4982<span data-node-title> 4983Plantes grimpantes à floraison estivale </span> 4984</a> 4985</li> 4986<li class="py-2 " 4987 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3" 4988> 4989<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-automnale" 4990 title="Plantes grimpantes à floraison automnale" 4991 class="u-text-ellipsis 4992 " 4993 style="" 4994 > 4995<span data-node-title> 4996Plantes grimpantes à floraison automnale </span> 4997</a> 4998</li> 4999<li class="py-2 " 5000 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4" 5001> 5002<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-floraison-hivernale" 5003 title="Plantes grimpantes à floraison hivernale" 5004 class="u-text-ellipsis 5005 " 5006 style="" 5007 > 5008<span data-node-title> 5009Plantes grimpantes à floraison hivernale </span> 5010</a> 5011</li> 5012<li class="py-2 " 5013 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4_5" 5014> 5015<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-a-feuillage-persistant" 5016 title="Plantes grimpantes à feuillage persistant" 5017 class="u-text-ellipsis 5018 " 5019 style="" 5020 > 5021<span data-node-title> 5022Plantes grimpantes à feuillage persistant </span> 5023</a> 5024</li> 5025<li class="py-2 " 5026 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4_5_6" 5027> 5028<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-p
5028arfumees" 5029 title="Plantes grimpantes parfumées" 5030 class="u-text-ellipsis 5031 " 5032 style="" 5033 > 5034<span data-node-title> 5035Plantes grimpantes parfumées </span> 5036</a> 5037</li> 5038<li class="py-2 " 5039 data-node-id="889_0_1_0_1_2_3_4_5_6_7_8_9_10_11_12_13_2_0_1_2_3_4_5_6_7" 5040> 5041<a href="https://www.jardindupicvert.com/plantes-grimpantes/plantes-grimpantes-d-ombre" 5042 title="Plantes grimpantes d'ombre" 5043 class="u-text-ellipsis 5044 " 5045 style="" 5046 > 5047<span data-node-title> 5048Plantes grimpantes d'ombre </span> 5049</a> 5050</li> 5051</ol> 5052</li> 5053</ol> 5054</li> 5055<li class="py-2 " 5056 data-node-id="912" 5057> 5058<span class="flex items-center justify-between cursor-pointer 5059 " 5060 style="" 5061 > 5062<span data-node-title> 5063Rosiers </span> 5064<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5065 <use xlink:href="#chevron-symbol"></use> 5066 </svg> 5067</span> 5068<ol class="p-2" 5069 style="z-index: 1" 5070 data-menu-lvl="1" 5071 > 5072<li class="py-2 heading" 5073 data-node-id="912_0" 5074> 5075<a href="https://www.jardindupicvert.com/rosiers" 5076 title="Rosiers :  tous les produits" 5077 class="u-text-ellipsis 5078 " 5079 style="" 5080 > 5081<span data-node-title> 5082Rosiers : tous les produits </span> 5083</a> 5084</li> 5085<li class="py-2 " 5086 data-node-id="912_0_1" 5087> 5088<span class="flex items-center justify-between cursor-pointer 5089 " 5090 style="" 5091 > 5092<span data-node-title> 5093Rosiers à grandes fleurs </span> 5094<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5095 <use xlink:href="#chevron-symbol"></use> 5096 </svg> 5097</span> 5098<ol class="p-2" 5099 style="z-index: 2" 5100 data-menu-lvl="2" 5101 > 5102<li class="py-2 heading" 5103 data-node-id="912_0_1_0" 5104> 5105<a href="https://www.jardindupicvert.com/rosiers/rosiers-a-grandes-fleurs" 5106 title="Rosiers à grandes fleurs :  tous les produits" 5107 class="u-text-ellipsis 5108 " 5109 style="" 5110 > 5111<span data-node-title> 5112Rosiers à grandes fleurs : tous les produits </span> 5113</a> 5114</li> 5115<li class="py-2 " 5116 data-node-id="912_0_1_0_1" 5117> 5118<a href="https://www.jardindupicvert.com/rosiers/rosiers-anglais" 5119 title="Rosiers anglais" 5120 class="u-text-ellipsis 5121 " 5122 style="" 5123 > 5124<span data-node-title> 5125Rosiers anglais </span> 5126</a> 5127</li> 5128<li class="py-2 " 5129 data-node-id="912_0_1_0_1_2" 5130> 5131<a href="https://www.jardindupicvert.com/rosiers/rosiers-generosa" 5132 title="Rosiers Generosa" 5133 class="u-text-ellipsis 5134 " 5135 style="" 5136 > 5137<span data-node-title> 5138Rosiers Generosa </span> 5139</a> 5140</li> 5141<li class="py-2 " 5142 data-node-id="912_0_1_0_1_2_3" 5143> 5144<a href="https://www.jardindupicvert.com/rosiers/rosiers-the-moderne" 5145 title="Rosiers Thé moderne" 5146 class="u-text-ellipsis 5147 " 5148 style="" 5149 > 5150<span data-node-title> 5151Rosiers Thé moderne </span> 5152</a> 5153</li> 5154</ol> 5155</li> 5156<li class="py-2 " 5157 data-node-id="912_0_1_0_1_2_3_2" 5158> 5159<a href="https://www.jardindupicvert.com/rosiers/rosiers-grimpants" 5160 title="Rosiers grimpants" 5161 class="u-text-ellipsis 5162 " 5163 style="" 5164 > 5165<span data-node-title> 5166Rosiers grimpants </span> 5167</a> 5168</li> 5169<li class="py-2 " 5170 data-node-id="912_0_1_0_1_2_3_2_3" 5171> 5172<a href="https://www.jardindupicvert.com/rosiers/rosiers-lianes" 5173 title="Rosiers lianes" 5174 class="u-text-ellipsis 5175 " 5176 style="" 5177 > 5178<span data-node-title> 5179Rosiers lianes </span> 5180</a> 5181</li> 5182<li class="py-2 " 5183 data-node-id="912_0_1_0_1_2_3_2_3_4" 5184> 5185<span class="flex items-center justify-between cursor-pointer 5186 " 5187 style="" 5188 > 5189<span data-node-title> 5190Rosiers anciens </span> 5191<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5192 <use xlink:href="#chevron-symbol"></use> 5193 </svg> 5194</span> 5195<ol class="p-2" 5196 style="z-index: 2" 5197 data-menu-lvl="2" 5198 > 5199<li class="py-2 heading" 5200 data-node-id="912_0_1_0_1_2_3_2_3_4_0" 5201> 5202<a href="https://www.jardindupicvert.com/rosiers/rosiers-anciens" 5203 title="Rosiers anciens :  tous les produits" 5204 class="u-text-ellipsis 5205 " 5206 style="" 5207 > 5208<span data-node-title> 5209Rosiers anciens : tous les produits </span> 5210</a> 5211</li> 5212<li class="py-2 " 5213 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1" 5214> 5215<a href="https://www.jardindupicvert.com/genre/rosa/rosa-bourbon" 5216 title="Rosiers bourbons" 5217 class="u-text-ellipsis 5218 " 5219 style="" 5220 > 5221<span data-node-title> 5222Rosiers bourbons </span> 5223</a> 5224</li> 5225<li class="py-2 " 5226 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2" 5227> 5228<a href="https://www.jardindupicvert.com/genre/rosa/rosa-gallica" 5229 title="Rosiers galliques" 5230 class="u-text-ellipsis 5231 " 5232 style="" 5233 > 5234<span data-node-title> 5235Rosiers galliques </span> 5236</a> 5237</li> 5238<li class="py-2 " 5239 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3" 5240> 5241<a href="https://www.jardindupicvert.com/genre/rosa/rosa-damas" 5242 title="Rosiers de Damas" 5243 class="u-text-ellipsis 5244 " 5245 style="" 5246 > 5247<span data-node-title> 5248Rosiers de Damas </span> 5249</a> 5250</li> 5251<li class="py-2 " 5252 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4" 5253> 5254<a href="https://www.jardindupicvert.com/genre/rosa/rosa-portland" 5255 title="Rosiers de Portland" 5256 class="u-text-ellipsis 5257 " 5258 style="" 5259 > 5260<span data-node-title> 5261Rosiers de Portland </span> 5262</a> 5263</li> 5264<li class="py-2 " 5265 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5" 5266> 5267<a href="https://www.jardindupicvert.com/genre/rosa/rosa-rugosa" 5268 title="Rosiers rugueux" 5269 class="u-text-ellipsis 5270 " 5271 style="" 5272 > 5273<span data-node-title> 5274Rosiers rugueux </span> 5275</a> 5276</li> 5277</ol> 5278</li> 5279<li class="py-2 " 5280 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5" 5281> 5282<span class="flex items-center justify-between cursor-pointer 5283 " 5284 style="" 5285 > 5286<span data-node-title> 5287Rosiers à massifs </span> 5288<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5289 <use xlink:href="#chevron-symbol"></use> 5290 </svg> 5291</span> 5292<ol class="p-2" 5293 style="z-index: 2" 5294 data-menu-lvl="2" 5295 > 5296<li class="py-2 heading" 5297 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0" 5298> 5299<a href="https://www.jardindupicvert.com/rosiers" 5300 title="Rosiers à massifs :  tous les produits" 5301 class="u-text-ellipsis 5302 " 5303 style="" 5304 > 5305<span data-node-title> 5306Rosiers à massifs : tous les produits </span> 5307</a> 5308</li> 5309<li class="py-2 " 5310 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1" 5311> 5312<a href="https://www.jardindupicvert.com/genre/rosa/rosa-arbuste" 5313 title="Rosiers arbustifs"
5314 class="u-text-ellipsis 5315 " 5316 style="" 5317 > 5318<span data-node-title> 5319Rosiers arbustifs </span> 5320</a> 5321</li> 5322<li class="py-2 " 5323 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2" 5324> 5325<a href="https://www.jardindupicvert.com/genre/rosa/rosa-couvre-sol" 5326 title="Rosiers couvre-sol" 5327 class="u-text-ellipsis 5328 " 5329 style="" 5330 > 5331<span data-node-title> 5332Rosiers couvre-sol </span> 5333</a> 5334</li> 5335<li class="py-2 " 5336 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2_3" 5337> 5338<a href="https://www.jardindupicvert.com/rosiers/rosiers-decorosiers" 5339 title="Rosiers Décorosiers" 5340 class="u-text-ellipsis 5341 " 5342 style="" 5343 > 5344<span data-node-title> 5345Rosiers Décorosiers </span> 5346</a> 5347</li> 5348<li class="py-2 " 5349 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2_3_4" 5350> 5351<a href="https://www.jardindupicvert.com/genre/rosa/rosa-floribunda" 5352 title="Rosiers floribunda" 5353 class="u-text-ellipsis 5354 " 5355 style="" 5356 > 5357<span data-node-title> 5358Rosiers floribunda </span> 5359</a> 5360</li> 5361<li class="py-2 " 5362 data-node-id="912_0_1_0_1_2_3_2_3_4_0_1_2_3_4_5_5_0_1_2_3_4_5" 5363> 5364<a href="https://www.jardindupicvert.com/genre/rosa/rosa-polyantha" 5365 title="Rosiers polyantha" 5366 class="u-text-ellipsis 5367 " 5368 style="" 5369 > 5370<span data-node-title> 5371Rosiers polyantha </span> 5372</a> 5373</li> 5374</ol> 5375</li> 5376</ol> 5377</li> 5378<li class="py-2 " 5379 data-node-id="931" 5380> 5381<span class="flex items-center justify-between cursor-pointer 5382 " 5383 style="" 5384 > 5385<span data-node-title> 5386Bulbes et semences </span> 5387<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5388 <use xlink:href="#chevron-symbol"></use> 5389 </svg> 5390</span> 5391<ol class="p-2" 5392 style="z-index: 1" 5393 data-menu-lvl="1" 5394 > 5395<li class="py-2 heading" 5396 data-node-id="931_0" 5397> 5398<a href="https://www.jardindupicvert.com/bulbes-et-semences" 5399 title="Bulbes et semences :  tous les produits" 5400 class="u-text-ellipsis 5401 " 5402 style="" 5403 > 5404<span data-node-title> 5405Bulbes et semences : tous les produits </span> 5406</a> 5407</li> 5408<li class="py-2 " 5409 data-node-id="931_0_1" 5410> 5411<span class="flex items-center justify-between cursor-pointer 5412 " 5413 style="" 5414 > 5415<span data-node-title> 5416Bulbes à floraison printanière </span> 5417<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5418 <use xlink:href="#chevron-symbol"></use> 5419 </svg> 5420</span> 5421<ol class="p-2" 5422 style="z-index: 2" 5423 data-menu-lvl="2" 5424 > 5425<li class="py-2 heading" 5426 data-node-id="931_0_1_0" 5427> 5428<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-a-floraison-printaniere" 5429 title="Bulbes à floraison printanière :  tous les produits" 5430 class="u-text-ellipsis 5431 " 5432 style="" 5433 > 5434<span data-node-title> 5435Bulbes à floraison printanière : tous les produits </span> 5436</a> 5437</li> 5438<li class="py-2 " 5439 data-node-id="931_0_1_0_1" 5440> 5441<a href="https://www.jardindupicvert.com/genre/crocus" 5442 title="Crocus de printemps" 5443 class="u-text-ellipsis 5444 " 5445 style="" 5446 > 5447<span data-node-title> 5448Crocus de printemps </span> 5449</a> 5450</li> 5451<li class="py-2 " 5452 data-node-id="931_0_1_0_1_2" 5453> 5454<a href="https://www.jardindupicvert.com/genre/fritillaria" 5455 title="Fritillaires" 5456 class="u-text-ellipsis 5457 " 5458 style="" 5459 > 5460<span data-node-title> 5461Fritillaires </span> 5462</a> 5463</li> 5464<li class="py-2 " 5465 data-node-id="931_0_1_0_1_2_3" 5466> 5467<a href="https://www.jardindupicvert.com/genre/hyacinthus" 5468 title="Jacinthes" 5469 class="u-text-ellipsis 5470 " 5471 style="" 5472 > 5473<span data-node-title> 5474Jacinthes </span> 5475</a> 5476</li> 5477<li class="py-2 " 5478 data-node-id="931_0_1_0_1_2_3_4" 5479> 5480<a href="https://www.jardindupicvert.com/genre/muscari" 5481 title="Muscaris" 5482 class="u-text-ellipsis 5483 " 5484 style="" 5485 > 5486<span data-node-title> 5487Muscaris </span> 5488</a> 5489</li> 5490<li class="py-2 " 5491 data-node-id="931_0_1_0_1_2_3_4_5" 5492> 5493<a href="https://www.jardindupicvert.com/genre/narcissus" 5494 title="Narcisses" 5495 class="u-text-ellipsis 5496 " 5497 style="" 5498 > 5499<span data-node-title> 5500Narcisses </span> 5501</a> 5502</li> 5503<li class="py-2 " 5504 data-node-id="931_0_1_0_1_2_3_4_5_6" 5505> 5506<a href="https://www.jardindupicvert.com/genre/tulipa" 5507 title="Tulipes" 5508 class="u-text-ellipsis 5509 " 5510 style="" 5511 > 5512<span data-node-title> 5513Tulipes </span> 5514</a> 5515</li> 5516<li class="py-2 " 5517 data-node-id="931_0_1_0_1_2_3_4_5_6_7" 5518> 5519<a href="https://www.jardindupicvert.com/genre/tulipa/tulipa-gpe-botanique" 5520 title="Tulipes botaniques" 5521 class="u-text-ellipsis 5522 " 5523 style="" 5524 > 5525<span data-node-title> 5526Tulipes botaniques </span> 5527</a> 5528</li> 5529<li class="py-2 " 5530 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8" 5531> 5532<a href="https://www.jardindupicvert.com/bulbes-et-semences/ail-d-ornement" 5533 title="Aulx d'ornement" 5534 class="u-text-ellipsis 5535 " 5536 style="" 5537 > 5538<span data-node-title> 5539Aulx d'ornement </span> 5540</a> 5541</li> 5542</ol> 5543</li> 5544<li class="py-2 " 5545 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2" 5546> 5547<span class="flex items-center justify-between cursor-pointer 5548 " 5549 style="" 5550 > 5551<span data-node-title> 5552Bulbes à floraison estivale </span> 5553<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5554 <use xlink:href="#chevron-symbol"></use> 5555 </svg> 5556</span> 5557<ol class="p-2" 5558 style="z-index: 2" 5559 data-menu-lvl="2" 5560 > 5561<li class="py-2 heading" 5562 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0" 5563> 5564<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-a-floraison-estivale" 5565 title="Bulbes à floraison estivale :  tous les produits" 5566 class="u-text-ellipsis 5567 " 5568 style="" 5569 > 5570<span data-node-title> 5571Bulbes à floraison estivale : tous les produits </span> 5572</a> 5573</li> 5574<li class="py-2 " 5575 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1" 5576> 5577<a href="https://www.jardindupicvert.com/bulbes-et-semences/les-arums" 5578 title="Arums 
5578- Zantedeschia" 5579 class="u-text-ellipsis 5580 " 5581 style="" 5582 > 5583<span data-node-title> 5584Arums - Zantedeschia </span> 5585</a> 5586</li> 5587<li class="py-2 " 5588 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2" 5589> 5590<a href="https://www.jardindupicvert.com/genre/begonia" 5591 title="Bégonias" 5592 class="u-text-ellipsis 5593 " 5594 style="" 5595 > 5596<span data-node-title> 5597Bégonias </span> 5598</a> 5599</li> 5600<li class="py-2 " 5601 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3" 5602> 5603<a href="https://www.jardindupicvert.com/genre/canna" 5604 title="Cannas" 5605 class="u-text-ellipsis 5606 " 5607 style="" 5608 > 5609<span data-node-title> 5610Cannas </span> 5611</a> 5612</li> 5613<li class="py-2 " 5614 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4" 5615> 5616<a href="https://www.jardindupicvert.com/genre/dahlia" 5617 title="Dahlias" 5618 class="u-text-ellipsis 5619 " 5620 style="" 5621 > 5622<span data-node-title> 5623Dahlias </span> 5624</a> 5625</li> 5626<li class="py-2 " 5627 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5" 5628> 5629<a href="https://www.jardindupicvert.com/genre/freesia" 5630 title="Freesias" 5631 class="u-text-ellipsis 5632 " 5633 style="" 5634 > 5635<span data-node-title> 5636Freesias </span> 5637</a> 5638</li> 5639<li class="py-2 " 5640 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6" 5641> 5642<a href="https://www.jardindupicvert.com/genre/gladiolus" 5643 title="Glaïeuls" 5644 class="u-text-ellipsis 5645 " 5646 style="" 5647 > 5648<span data-node-title> 5649Glaïeuls </span> 5650</a> 5651</li> 5652<li class="py-2 " 5653 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7" 5654> 5655<a href="https://www.jardindupicvert.com/genre/lilium" 5656 title="Lis" 5657 class="u-text-ellipsis 5658 " 5659 style="" 5660 > 5661<span data-node-title> 5662Lis </span> 5663</a> 5664</li> 5665</ol> 5666</li> 5667<li class="py-2 " 5668 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3" 5669> 5670<a href="https://www.jardindupicvert.com/plantes-annuelles/graines-de-fleurs" 5671 title="Les graines de fleurs" 5672 class="u-text-ellipsis 5673 " 5674 style="" 5675 > 5676<span data-node-title> 5677Les graines de fleurs </span> 5678</a> 5679</li> 5680<li class="py-2 " 5681 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4" 5682> 5683<span class="flex items-center justify-between cursor-pointer 5684 " 5685 style="" 5686 > 5687<span data-node-title> 5688Bulbes et semences potagères </span> 5689<svg class="w-8 h-8 hover:text-primary-lighter -rotate-90"> 5690 <use xlink:href="#chevron-symbol"></use> 5691 </svg> 5692</span> 5693<ol class="p-2" 5694 style="z-index: 2" 5695 data-menu-lvl="2" 5696 > 5697<li class="py-2 heading" 5698 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4_0" 5699> 5700<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-et-semences-potageres" 5701 title="Bulbes et semences potagères :  tous les produits" 5702 class="u-text-ellipsis 5703 " 5704 style="" 5705 > 5706<span data-node-title> 5707Bulbes et semences potagères : tous les produits </span> 5708</a> 5709</li> 5710<li class="py-2 " 5711 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4_0_1" 5712> 5713<a href="https://www.jardindupicvert.com/genre/solanum/solanum-tuberosum" 5714 title="Pommes de terre" 5715 class="u-text-ellipsis 5716 " 5717 style="" 5718 > 5719<span data-node-title> 5720Pommes de terre </span> 5721</a> 5722</li> 5723<li class="py-2 " 5724 data-node-id="931_0_1_0_1_2_3_4_5_6_7_8_2_0_1_2_3_4_5_6_7_3_4_0_1_2" 5725> 5726<a href="https://www.jardindupicvert.com/bulbes-et-semences/bulbes-et-semences-potageres/oignons-ails-et-echalotes" 5727 title="Oignons, ails et échalottes" 5728 class="u-text-ellipsis 5729 " 5730 style="" 5731 > 5732<span data-node-title> 5733Oignons, ails et échalottes </span> 5734</a> 5735</li> 5736</ol> 5737</li> 5738</ol> 5739</li> 5740<li class="py-2 " 5741 data-node-id="953" 5742> 5743<a href="/nos-plantes-en-promotion" 5744 title="NOS PLANTES EN PROMOTION" 5745 class="u-text-ellipsis 5746 text-highlight" 5747 style="" 5748 > 5749<span data-node-title> 5750NOS PLANTES EN PROMOTION </span> 5751</a> 5752</li> 5753<li class="py-2 " 5754 data-node-id="1130" 5755> 5756<a href="https://www.jardindupicvert.com/nouveautes" 5757 title="NOUVEAUTES" 5758 class="u-text-ellipsis 5759 " 5760 style="color:#004650;font-weight:bold;" 5761 > 5762<span data-node-title> 5763NOUVEAUTES </span> 5764</a> 5765</li> 5766</ol> 5767</div> 5768</nav> 5769 5770<div class="nav-0-desktop hidden lg:flex items-center text-white text-sm font-serif" 5771 @click.prevent.stop="openAt" 5772 > 5773<span class="mr-8"> 5774<span class="text-4xl font-bold text-white cursor-pointer leading-none">≡</span> 5775</span> 5776<ol class="nav nav-0 flex items-center justify-between grow font-bold"> 5777<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5778 data-node-id="758" 5779 > 5780<span class="" 5781 style="" 5782 > 5783Plantes vivaces </span> 5784</li> 5785<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5786 data-node-id="800" 5787 > 5788<span class="" 5789 style="" 5790 > 5791Arbustes </span> 5792</li> 5793<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5794 data-node-id="832" 5795 > 5796<span class="" 5797 style="" 5798 > 5799Arbres </span> 5800</li> 5801<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5802 data-node-id="866" 5803 > 5804<span class="" 5805 style="" 5806 > 5807Fruitiers et petits fruits </span> 5808</li> 5809<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5810 data-node-id="1115" 5811 > 5812<span class="" 5813 style="" 5814 > 5815Potager </span> 5816</li> 5817<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5818 data-node-id="889" 5819 > 5820<span class="" 5821 style="" 5822 > 5823Plantes grimpantes </span> 5824</li> 5825<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5826 data-node-id="912" 5827 > 5828<span class="" 5829 style="" 5830 > 5831Rosiers </span> 5832</li> 5833<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5834 data-node-id="931" 5835 > 5836<span class="" 5837 style="" 5838 > 5839Bulbes et semences </span> 5840</li> 5841<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5842 data-node-id="953" 5843 > 5844<span class="text-highlight" 5845 style="" 5846 > 5847NOS PLANTES EN PROMOTION </span> 5848</li> 5849<li class="inline-flex items-center h-12 cursor-pointer border-b-[5px] border-transparent hover:border-highlight" 5850 data-node-id="1130" 5851 > 5852<span class="" 5853 style="color:#004650;font-weight:bold;" 5854 > 5855NOUVEAUTES </span> 5856</li> 5857</ol> 5858</div> 5859 5860<!--nav mask--> 5861<div class="backdrop" 5862 :class="isOpen ? '' : 'hidden'" 5863 @click.prevent="closeNav()"></div> 5864</div> 5865
5866<script> 5867 'use strict'; 5868 5869 function initMainMenu() { 5870 return { 5871 title: '', 5872 defaultTitle: '<span data-gp-noloc="node">Le\u0020Jardin\u0020du\u0020Pic\u0020Vert</span>', 5873 isOpen: false, 5874 backId: 0, 5875 5876 openAt($event = null) { 5877 if ($event && $event.target?.closest('a')) { 5878 return; 5879 } 5880 const nodeId = $event && this.getNodeId($event.target); 5881 const node = nodeId ? this.getNodeById(nodeId) : null; 5882 const menu = node?.querySelector('[data-menu-lvl]') || this.$refs.nav; 5883 this.backId = nodeId; 5884 this.title = this.getNodeTitle(node); 5885 this.openMenu(menu); 5886 }, 5887 5888 openMenu(menu = null) { 5889 this.isOpen = true; 5890 switchBodyOverflow(false); 5891 this.setActiveMenu(menu); 5892 }, 5893 5894 closeNav() { 5895 this.isOpen = false; 5896 switchBodyOverflow(true); 5897 }, 5898 5899 navBack() { 5900 const nodeId = this.backId; 5901 const node = nodeId ? this.getNodeById(nodeId) : null; 5902 const menu = node?.closest('[data-menu-lvl]') || this.$refs.nav; 5903 const titleNode = menu?.closest('[data-node-id]'); 5904 this.backId = this.getNodeId(titleNode); 5905 this.title = this.getNodeTitle(titleNode); 5906 this.openMenu(menu); 5907 }, 5908
5909 setActiveMenu(menu) { 5910 Array.from(this.$root.querySelectorAll('[data-menu-lvl]')).forEach(e => e.classList.remove('active')); 5911 let tmp = menu; 5912 while (tmp) { 5913 tmp?.classList?.add('active'); 5914 tmp = tmp.parentNode.closest('[data-menu-lvl]'); 5915 } 5916 }, 5917 5918 getNodeId(node) { 5919 return node instanceof Element ? node.closest('[data-node-id]')?.dataset?.nodeId || 0 : 0; 5920 }, 5921 5922 getNodeById(id) { 5923 return this.$refs.nav.querySelector('[data-node-id="' + id + '"]') || null; 5924 }, 5925 5926 getNodeTitle(node) { 5927 return node?.querySelector('[data-node-title]')?.innerText || this.defaultTitle; 5928 } 5929 } 5930 } 5931 5932</script>
5932 5933 </div> 5934 5935 5936</div> 5937 5938</div> 5939</header>
5940<script> 5941 function initBannershop() { 5942 const MS_PER_DAY = 24 * 3600 * 1000; 5943 const DEADLINE = 1791586799000; 5944 const DISPLAY_TIME = 0; 5945 const SHOW_COUNTDOWN = false; 5946 5947 return { 5948 show: !DEADLINE || !DISPLAY_TIME || (DEADLINE - Date.now() < DISPLAY_TIME), 5949 days: '-', 5950 hours: '--', 5951 minutes: '--', 5952 seconds: '--', 5953 interval: 0, 5954 5955 init() { 5956 if (this.show && SHOW_COUNTDOWN) { 5957 if (DISPLAY_TIME) { 5958 const remaining = DEADLINE - Date.now(); 5959 if (remaining > DISPLAY_TIME) { 5960 setTimeout(() => { 5961 this.init() 5962 }, remaining - DISPLAY_TIME); 5963 return; 5964 } 5965 } 5966 this.interval = setInterval(() => { 5967 const now = Date.now(); 5968 let remaining = DEADLINE - now; 5969 if (remaining <= 0) { 5970 this.show = false; 5971 clearInterval(this.interval); 5972 } else { 5973 this.days = Math.floor(remaining / MS_PER_DAY); 5974 remaining -= this.days * MS_PER_DAY; 5975 this.hours = Math.floor(remaining / 3600000); 5976 remaining -= this.hours * 3600000; 5977 this.minutes = Math.floor(remaining / 60000); 5978 remaining -= this.minutes * 60000; 5979 this.seconds = Math.floor(remaining / 1000); 5980 } 5981 }, 1000); 5982 } 5983 } 5984 } 5985 } 5986</script>
5986 5987<div x-data="initBannershop()" 5988 x-show="show" 5989 class="u-full-width h-[40px] flex items-center justify-center" 5990 style=" 5991 background-color: #55011d; 5992 color: #FFFFFF " 5993> 5994<a href="https://www.jardindupicvert.com/genre/sedum" 5995 title="En ce moment : Profitez des sédums à -30% !" 5996 data-gtm-promotion="{"item_id":"banner_shop","promotion_id":"banner_shop","promotion_name":"En ce moment : Profitez des s\u00e9dums \u00e0 -30% !","creative_name":"shop","creative_slot":"header"}" > 5997<div class="text-2xs sm:text-sm xl:text-lg text-center"> 5998En ce moment : Profitez des sédums à -30% ! </div> 5999</a> 6000</div> 6001<div class="top-container"> <nav class="breadcrumbs bg-container-lighter shadow-sm" 6002 aria-label="Breadcrumb" 6003 > 6004<div class="container"> 6005<ol class="items list-reset py-4 rounded flex flex-wrap text-grey text-xs"> 6006<li class="item flex home"> 6007<a href="https://www.jardindupicvert.com/" 6008 class="hover:underline" 6009 title="Aller à la page d’accueil" 6010 >Accueil</a> 6011</li> 6012<li class="item flex cms_page"> 6013<span aria-hidden="true" 6014 class="separator text-primary-lighter px-2">/</span> 6015<span 6016 class="text-primary-lighter" 6017 aria-current="page" 6018 >Mentions légales (PV)</span> 6019</li> 6020</ol> 6021</div> 6022</nav> 6023</div><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div> 6024<div id="fp.wp.marker-top"></div><div class="page messages">
6024<script> 6025 6026 let NO_SUCCESS_MESSAGE = false; 6027 6028 function initMessages() { 6029 "use strict"; 6030 return { 6031 messages: window.mageMessages || [], 6032 6033 isEmpty() { 6034 return this.messages.reduce( 6035 function (isEmpty, message) { 6036 return isEmpty && message === undefined 6037 }, true 6038 ) 6039 }, 6040 6041 hasMessages() { 6042 return !this.isEmpty(); 6043 }, 6044 6045 hasMessage() { 6046 return !!this.message; 6047 }, 6048 6049 removeMessage() { 6050 this.messages[this.index] = undefined; 6051 }, 6052 6053 addMessages(messages, hideAfter) { 6054 messages.map((message) => { 6055 if (message.type !== 'success' || (message.type === 'success' && !window.NO_SUCCESS_MESSAGE)) { 6056 this.messages = this.messages.concat(message); 6057 } 6058 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 6059 hideAfter = window.defaultSuccessMessageTimeout; 6060 } 6061 if (hideAfter) { 6062 this.setHideTimeOut(this.messages.length -1, hideAfter); 6063 } 6064 }); 6065 window.NO_SUCCESS_MESSAGE = false; 6066 }, 6067 6068 setHideTimeOut(messageIndex, hideAfter) { 6069 setTimeout((messageIndex) => { 6070 this.removeMessage(messageIndex); 6071 }, hideAfter, messageIndex); 6072 }, 6073 6074 eventListeners: { 6075 ['@messages-loaded.window'](event) { 6076 this.addMessages(event.detail.messages, event.detail.hideAfter) 6077 }, 6078 ['@private-content-loaded.window'](event) { 6079 const data = event.detail.data; 6080 if ( 6081 data.messages && 6082 data.messages.messages && 6083 data.messages.messages.length 6084 ) { 6085 this.addMessages(data.messages.messages); 6086 } 6087 }, 6088 ['@clear-messages.window']() { 6089 this.messages = []; 6090 } 6091 }, 6092 6093 getMessageUiId() { 6094 return 'message-' + this.message.type; 6095 } 6096 } 6097 } 6098 window.addEventListener('alpine:init', () => Alpine.data('initMessages', initMessages), {once: true}) 6099</script>
6099 6100 6101<section id="messages" 6102 x-data="initMessages" 6103 x-bind="eventListeners" 6104 aria-live="assertive" 6105 role="alert" 6106> 6107<template x-if="hasMessages"> 6108<div class="w-full"> 6109<div class="messages fixed z-header top-0 inset-x-0"> 6110<template x-for="(message, index) in messages" 6111 :key="index" 6112 > 6113<div> 6114<template x-if="hasMessage"> 6115<div class="message flex items-center justify-between font-bold" 6116 :class="message.type" 6117 :ui-id="getMessageUiId" 6118 > 6119<span x-html="message.text"></span> 6120<button type="button" 6121 class="hover:text-hover" 6122 aria-label="Close message" 6123 @click.prevent="removeMessage" 6124 > 6125× 6126</button> 6127</div> 6128</template> 6129</div> 6130</template> 6131</div> 6132</div> 6133</template> 6134</section> 6135</div> <div class="page-main-title"> 6136<h1 class=" text-3xl lg:text-4xl font-bold text-center font-serif" 6137 > 6138<span class="base" data-ui-id="page-title-wrapper" >Mentions légales</span> </h1> 6139</div> 6140<div class="columns"><div class="column main"><div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><p style="text-align: left;">Raison sociale : <span data-gp-noloc="node">Le Jardin du Pic Vert</span></p> 6141<p style="text-align: justify;">Forme juridique : <span data-gp-noloc="node">Société par actions simplifiée (SAS)</span></p> 6142<p style="text-align: justify;">Siège social : <span data-gp-noloc="node">1012 rue Roger Lecerf - 59840 Prémesques</span></p> 6143<p style="text-align: justify;">Montant du capital social : 7620â¬</p> 6144<p style="text-align: justify;">Adresse mail : [email protected]</p> 6145<p style="text-align: justify;">Téléphone : 03 20 59 49 74</p> 6146<p style="text-align: justify;">RCS de Lille métropole : 422 537 100</p> 6147<p style="text-align: justify;">Nom du responsable de la publication : M. Fasson Olivier</p> 6148<p style="text-align: justify;">Site hébergé par : OVHCloud, </p> 6149<p style="text-align: justify;"><span data-gp-noloc="node">2 rue Kellermann</span></p> 6150<p style="text-align: justify;"><span data-gp-noloc="node"> 59100 Roubaix France</span></p> 6151<p style="text-align: justify;">Les informations recueillies dans le cadre de ce site sont destinées uniquement au traitement des commandes et à l'usage exclusif du <span data-gp-noloc="node"> Jardin du Pic-Vert</span>. Nous nous engageons à ne pas communiquer à des tiers les informations personnelles que vous nous communiquerez sur notre site web. Conformément à la loi du 6 janvier 1978, vous disposez d'un droit d'accès, de modification, de rectification et de suppression des données vous concernant. Merci de votre confiance.</p> 6152<h3 style="text-align: justify;">Les cookies :</h3> 6153<p style="text-align: justify;">Lorsque vous vous connectez sur notre site, un « cookie » est installé sur votre ordinateur. Un cookie (petit fichier texte) est utilisé pour reconnaître l'internaute d'une page à l'autre et d'une visite à l'autre. Il permet de retrouver vos coordonnées (si vous les avez entrées), de garder en mémoire votre panier, vos commandes en cours ou passées. Les cookies ne sont pas dangereux, ils ne donnent pas accès à votre disque dur, ils ne peuvent pas le modifier. Si votre navigateur n'accepte pas les cookies, vous risquez de ne pas retrouver les informations que vous aurez entrées ou d'être obligé de vous reconnecter régulièrement.</p></div> 6154</div></div><div id="fp.wp.marker-bottom"></div></main><footer class="bg-container-dark py-16"><div class="container"><section id="reinsurance-blocks" 6155 class="text-center mb-12" 6156> 6157<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 lg:gap-8 lg:w-2/3 items-start m-auto leading-tight"> 6158<div class="flex flex-col justify-center items-center gap-2"> 6159<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#cursor-symbol"></use></svg> 6160<p class="text-white font-bold font-serif text-sm"> 616114 900 plantes 6162</p> 6163<p class="text-secondary-lighter text-xs"> 6164en 39 337 tailles 6165</p> 6166</div> 6167<div class="flex flex-col justify-center items-center gap-2"> 6168<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#customer-service-symbol"></use></svg> 6169<p class="text-white font-bold font-serif text-sm"> 6170Nous contacter 6171</p> 6172<p class="text-secondary-lighter text-xs"> 6173<span class="glopal-hide">par téléphone au <a href="tel:0320594974" class="text-white">
617303 20 59 49 74</a><br></span> 6174par <a href="https://www.jardindupicvert.com/contact/" class="text-white">formulaire de contact</a><br> 6175Service client disponible du lundi au vendredi.<br> 6176<span data-gp-noloc="node">23 route du Fresnel 59116 Houplines</span> 6177</p> 6178</div> 6179<div class="flex flex-col justify-center items-center gap-2"> 6180<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#security-symbol"></use></svg> 6181<p class="mb-2 text-white font-bold font-serif text-sm"> 6182Paiement 100% sécurisé 6183</p> 6184<img src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/images/footer-payment-methods.svg" 6185 class="inline-block w-2/3" 6186 title="Paiement 100% sécurisé Visa - CB - Mastercard - Paypal" 6187 /> 6188</div> 6189<div class="flex flex-col justify-center items-center gap-2"> 6190<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#warranty-symbol"></use></svg> 6191<p class="mb-2 text-white font-bold font-serif text-sm"> 6192Garantie de reprise 6193</p> 6194<p class="text-secondary-lighter text-xs"> 6195sur toutes nos plantes 6196</p> 6197</div> 6198<div class="flex flex-col justify-center items-center gap-2"> 6199<svg class="w-12 h-12 text-primary-lighter"><use xlink:href="#shipping-symbol"></use></svg> 6200<p class="mb-2 text-white font-bold font-serif text-sm"> 6201Informations livraison 6202</p> 6203<p class="text-secondary-lighter text-xs"> 6204Livraison rapide, sous 3 à 4 jours<span class="glopal-hide"><br> 6205ou sur rendez-vous</span> 6206</p> 6207</div> 6208<div class="flex flex-col justify-center items-center gap-2"> 6209<span class="h-12 text-xl text-secondary-lighter">★★★★★</span> 6210<p class="mb-2 text-white font-bold font-serif text-sm"> 6211Avis clients Google 6212</p> 6213<p class="text-secondary-lighter text-xs"> 62144.4 / 5 6215</p> 6216</div> 6217</div> 6218</section> 6219<form x-data="initNewsletterForm()" 6220 x-defer="intersect" 6221 @submit.prevent="submitForm()" 6222 id="newsletter-validate-detail" 6223 class="form subscribe" 6224 :class="{'u-loader': loading}" 6225 action="https://www.jardindupicvert.com/newsletter/subscriber/new/" 6226 method="post" 6227> 6228<div class="my-8 py-4 px-8 border-primary-lighter border-t border-b"> 6229<div class="flex flex-col md:flex-row items-center justify-center gap-x-4 gap-y-2"> 6230<label for="newsletter-subscribe" 6231 class="text-white leading-tight" 6232 > 6233<span class="text-sm font-bold">La newsletter préférée des jardins</span> 6234<br> <span class="text-xs">Recevez nos actualités et des idées pour profiter de votre jardin toute l'année.</span> 6235</label> 6236<div> 6237<input name="email" 6238 type="email" 6239 required 6240 id="newsletter-subscribe" 6241 class="form-input w-full px-4 py-2 border-primary-lighter border rounded-3xl shadow-sm text-sm" 6242 placeholder="Votre adresse email" 6243 > 6244<input name="form_key" type="hidden" value="jIeQ6NmqNDPAX5IC" /> </div> 6245<div> 6246<button class="inline-flex shrink-0 ml-auto xl:mt-0 text-primary-lighter hover:underline"> 6247Je m'inscris → 6248</button> 6249<div class="control"> 6250<input type="hidden" 6251 value="" 6252 name="g-recaptcha-response" 6253 > 6254</div> 6255</div> 6256</div> 6257<template x-if="displayErrorMessage"> 6258<p class="flex items-center text-red"> 6259<template x-for="errorMessage in errorMessages"> 6260<svg class="w-4 sm:w-6 h-4 sm:h-6 mx-1"><use xlink:href="#warning-symbol"></use></svg> 6261<span x-html="errorMessage"></span> 6262</template> 6263</p> 6264</template> 6265<div class="text-white"> 6266<p class="my-4 text-2xs text-center leading-tight"> 6267<em>Ce formulaire est protégé par reCAPTCHA: vous pouvez consulter la <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">politique de confidentialité</a> et <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">les conditions d'utilisation</a>.</em> 6268</p> 6269</div> 6270</div> 6271</form> 6272
6273<script> 6274 function initNewsletterForm() { 6275 return { 6276 errors: 0, 6277 hasCaptchaToken: 0, 6278 displayErrorMessage: false, 6279 errorMessages: [], 6280 loading: false, 6281 6282 setErrorMessages(messages) { 6283 this.errorMessages = [messages] 6284 this.displayErrorMessage = this.errorMessages.length 6285 }, 6286 submitForm() { 6287 this.loading = true; 6288 // Do not rename $form, the variable is expected to be declared in the child block output 6289 const $form = document.querySelector('#newsletter-validate-detail'); 6290 if (!this.hasCaptchaToken) { 6291 this.errors = 1; 6292 6293 const lockSubmitButton = () => { 6294 $form.querySelector('[type="submit"]')?.setAttribute('disabled', true); 6295 }; 6296 6297 const failCaptcha = (errorMessage, exception = null) => { 6298 this.errors = 1; 6299 lockSubmitButton(); 6300 6301 if (this.setErrorMessages) { 6302 this.setErrorMessages([errorMessage]); 6303 this.displayErrorMessage = true; 6304 } else { 6305 window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000); 6306 } 6307 6308 if (exception) { 6309 console.error( 6310 exception || 6311 'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?' 6312 ); 6313 } 6314 }; 6315 6316 const executeGreCaptcha = () => { 6317 grecaptcha.ready(() => { 6318 grecaptcha.execute( 6319 '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV', 6320 {action: 'submit'} 6321 ).then((token) => { 6322 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 6323 6324 if (tokenElement && token && token.length > 0) { 6325 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 6326 this.errors = 0; 6327 this.hasCaptchaToken = 1; 6328 (this.submitForm || $form.submit).call(this); 6329 } else { 6330 failCaptcha( 6331 tokenElement 6332 ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 6333 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 6334 ); 6335 } 6336 }).catch((exception) => { 6337 failCaptcha( 6338 'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.', 6339 exception 6340 ); 6341 }); 6342 }); 6343 }; 6344 6345 if (window.grecaptcha) { 6346 executeGreCaptcha(); 6347 } else { 6348 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV"; 6349 const script = document.createElement('script'); 6350 script.setAttribute('type', 'text/javascript'); 6351 script.setAttribute('src', recaptchaUrl); 6352 document.head.appendChild(script); 6353 6354 script.addEventListener("load", executeGreCaptcha, false); 6355 } 6356 } 6357 if (this.errors === 0) { 6358 $form.submit(); 6359 } 6360 } 6361 } 6362 } 6363 </script>
6363 6364</div> 6365<h4 class="mt-12 text-white font-bold lg:text-lg text-center"> 6366<span data-gp-noloc="node">Le Jardin du Pic-Vert</span>, Jardinerie en ligne depuis 2003 6367</h4> 6368<div class="flex justify-center gap-1 mt-12 font-serif text-white"> 6369<a href="/notre-entreprise" 6370 class="hover:underline" 6371 > 6372Qui sommes-nous ? 6373</a> 6374| 6375<a href="/questions-frequentes" 6376 class="hover:underline" 6377 > 6378Questions fréquentes 6379</a> 6380| 6381<a href="/mentions-legales" 6382 class="hover:underline" 6383 > 6384Mentions légales 6385</a> 6386| 6387<a href="/conditions-generales-de-vente" 6388 class="hover:underline" 6389 > 6390CGV 6391</a> 6392</div> 6393<p class="mt-24 text-right text-xs text-white font-bold"> 6394© 2009/2025 - Tous droits réservés - <span data-gp-noloc="node">Le Jardin du Pic</span> Vert est une marque déposée 6395</p> 6396<div class="my-8 text-sm text-white font-bold text-center"> 6397</div> 6398 6399</div></footer>
6400<script> 6401 let SnapSlider = class { 6402 constructor(el, { 6403 labelSepparator = 'sur', 6404 autoPager, 6405 groupPager, 6406 loop, 6407 forcePager 6408 } = {}) { 6409 this.el = el; 6410 this.track = this.el.querySelector("[data-track]"); 6411 if (!this.track) { 6412 console.warn( 6413 "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track", 6414 this.el 6415 ); 6416 return; 6417 } 6418 this.initialLoad = true; 6419 this.slides = []; 6420 this.inViewObserver; 6421 this.mutationObserver; 6422 this.resizeObserver; 6423 this.pager = this.el.querySelector("[data-pager]"); 6424 this.navBtns = Array.from( 6425 this.el.querySelectorAll("[data-next], [data-prev]") 6426 ); 6427 this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator; 6428 this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false; 6429 this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false; 6430 this.useLoop = loop || this.el.hasAttribute("data-loop") || false; 6431 this.forcePager = forcePager || this.el.hasAttribute("data-force-pager") || false; 6432 this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, ""); 6433 this.sliderId = this.el.id || this.sliderLabel || "slider"; 6434 this.markerIdName = "data-target-id"; 6435 this.pagerClasses = this.el.dataset.pagerClass || "snap-pager"; 6436 this.markerClasses = this.el.dataset.markerClass || "snap-marker"; 6437 this.init(); 6438 } 6439 init() { 6440 this.setupSlides(); 6441 this.setupNav(); 6442 if (this.useAutoPager) { 6443 this.createPager(); 6444 } else { 6445 this.setupPager(); 6446 } 6447 this.setupObservers(); 6448 this.setupMutationObserver(); 6449 this.setupResizeObserver(); 6450 this.el.addEventListener("click", this.eventHandler.bind(this)); 6451 this.el.addEventListener("keydown", this.eventHandler.bind(this)); 6452 if ("onscrollend" in window) { 6453 this.track.addEventListener("scrollend", () => { 6454 this.isNavigating = false; 6455 }); 6456 } else { 6457 this.track.addEventListener("scroll", () => { 6458 clearTimeout(this.scrollEndTimer); 6459 this.scrollEndTimer = setTimeout(() => { 6460 this.isNavigating = false; 6461 }, 100); 6462 }); 6463 } 6464 } 6465 destroy() { 6466 this.inViewObserver?.disconnect(); 6467 this.mutationObserver?.disconnect(); 6468 this.resizeObserver?.disconnect(); 6469 this.el.removeEventListener("click", this.eventHandler.bind(this)); 6470 this.el.removeEventListener("keydown", this.eventHandler.bind(this)); 6471 } 6472 roundUpIfGreaterThan(number, min = 8) { 6473 const decimalPart = number - Math.floor(number); 6474 return decimalPart >= min ? Math.ceil(number) : Math.floor(number); 6475 } 6476 getInViewItems() { 6477 const inViewSlides = Array.from(this.track.querySelectorAll("[data-in-view]")).filter((el) => this.slides.includes(el)); 6478 const firstInViewSlide = inViewSlides[0] || null; 6479 const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null; 6480 const isAtStart = firstInViewSlide === this.slides[0]; 6481 const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1]; 6482 return { 6483 inViewSlides, 6484 totalInViewSlides: inViewSlides.length, 6485 firstInViewSlide, 6486 lastInViewSlide, 6487 isAtStart, 6488 isAtEnd, 6489 hasNoOverflow: isAtStart && isAtEnd 6490 }; 6491 } 6492 groupPagerMarkers() { 6493 if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return; 6494 const totalVisibleSlides = this.roundUpIfGreaterThan( 6495 this.track.offsetWidth / this.slides[0].offsetWidth 6496 ); 6497 const markers = Array.from(this.pager.querySelectorAll("a, button"));
6498 markers.forEach((marker, index) => { 6499 marker.style.display = index % totalVisibleSlides === 0 ? null : "none"; 6500 }); 6501 } 6502 handleInView(entries) { 6503 entries.forEach((entry) => { 6504 const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector( 6505 `[${this.markerIdName}="${entry.target.id}"]` 6506 )); 6507 entry.target.toggleAttribute("data-in-view", entry.isIntersecting); 6508 entry.target.toggleAttribute("inert", !entry.isIntersecting); 6509 marker?.setAttribute("aria-current", entry.isIntersecting); 6510 marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1"); 6511 }); 6512 const { isAtStart, isAtEnd, hasNoOverflow } = this.getInViewItems(); 6513 this.navBtns.forEach((btn) => { 6514 if (btn.hasAttribute("data-next")) { 6515 btn.style.visibility = hasNoOverflow ? "hidden" : null; 6516 isAtEnd && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 6517 } 6518 if (btn.hasAttribute("data-prev")) { 6519 btn.style.visibility = hasNoOverflow ? "hidden" : null; 6520 isAtStart && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 6521 } 6522 }); 6523 if (this.pager) { 6524 const hidePager = hasNoOverflow && !this.forcePager; 6525 this.pager.style.visibility = hidePager ? "hidden" : null; 6526 this.pager.toggleAttribute("inert", hidePager); 6527 } 6528 if (!this.initialLoad) { 6529 this.el.dispatchEvent( 6530 new CustomEvent("slideChange", { 6531 detail: this.getInViewItems() 6532 }) 6533 ); 6534 } else { 6535 this.initialLoad = false; 6536 } 6537 if (document.activeElement.parentElement.hasAttribute("data-pager")) { 6538 const activeItems = this.pager.querySelectorAll('[tabindex="0"]'); 6539 if (activeItems.length) { 6540 activeItems[0].focus({ preventScroll: true }); 6541 } 6542 } 6543 } 6544 getSlides() { 6545 if (!this.track) return []; 6546 return Array.from(this.track.children).filter( 6547 (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" && child.style.display !== "none" 6548 ); 6549 } 6550 refreshSlides() { 6551 this.initialLoad = true; 6552 this.slides = this.getSlides(); 6553 this.setupSlides(); 6554 if (this.useAutoPager) { 6555 this.createPager(); 6556 } else { 6557 this.setupPager(); 6558 } 6559 this.groupPagerMarkers(); 6560 this.setupObservers(); 6561 } 6562 setupSlides() { 6563 this.slides = this.getSlides(); 6564 this.slides.forEach((slide, index) => { 6565 const totalSlides = this.slides.length; 6566 const currentSlide = index + 1; 6567 const existingLabel = slide.getAttribute("aria-label") || ""; 6568 const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture"; 6569 const slideLabelTag = isImage ? "alt" : "aria-label"; 6570 const hasAutoLabel = existingLabel.startsWith( 6571 `${currentSlide} ${this.slideLabelSepparator} ` 6572 ); 6573 if (!slide.hasAttribute("id")) { 6574 slide.setAttribute( 6575 "id", 6576 `${this.sliderId}-item-${currentSlide}` 6577 ); 6578 } 6579 if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) { 6580 slide.setAttribute( 6581 slideLabelTag, 6582 `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}` 6583 ); 6584 } 6585 if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) { 6586 slide.setAttribute("role", "group"); 6587 } 6588 if (this.pager && !isImage) { 6589 slide.setAttribute("role", "tabpanel"); 6590 } 6591 if (slide.getAttribute("role") === "group") { 6592 slide.setAttribute("aria-roledescription", "item"); 6593 } 6594 }); 6595 if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") { 6596 this.el.setAttribute("role", "region"); 6597 } 6598 if (!this.el.hasAttribute("aria-roledescription")) { 6599 this.el.setAttribute("aria-roledescription", "carousel"); 6600 } 6601 if (!this.track.hasAttribute("tabindex")) { 6602 this.track.setAttribute("tabindex", 0); 6603 } 6604 this.track.setAttribute("aria-live", "polite"); 6605 } 6606 setupNav() { 6607 this.navBtns.forEach((btn) => { 6608 btn.setAttribute("disabled", ""); 6609 btn.removeAttribute("hidden"); 6610 btn.classList.remove("invisible"); 6611 btn.style.visibility = null; 6612 }); 6613 } 6614 createPager() { 6615 const newPager = document.createElement("nav"); 6616 newPager.setAttribute("data-pager", ""); 6617 newPager.setAttribute("role", "tablist"); 6618 newPager.classList.add(...this.pagerClasses.split(" "));
6619 this.slides.forEach((slide, index) => { 6620 const marker = document.createElement("button"); 6621 const slideId = slide.id || `${this.sliderId}-item-${index + 1}`; 6622 marker.setAttribute(this.markerIdName, slideId); 6623 marker.classList.add(...this.markerClasses.split(" ")); 6624 this.setupPagerMarker(marker, index); 6625 newPager.appendChild(marker); 6626 if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") { 6627 slide.removeAttribute("aria-roledescription"); 6628 slide.setAttribute("role", "tabpanel"); 6629 } 6630 }); 6631 if (this.pager) { 6632 this.pager.setAttribute("role", "tablist"); 6633 this.pager.replaceChildren(...newPager.children); 6634 } else { 6635 this.track.after(newPager); 6636 this.pager = this.el.querySelector("[data-pager]"); 6637 } 6638 } 6639 setupPager() { 6640 if (!this.pager) return; 6641 this.pager.setAttribute("role", "tablist"); 6642 const items = Array.from(this.pager.querySelectorAll("a, button")); 6643 items.forEach((marker, index) => this.setupPagerMarker(marker, index)); 6644 } 6645 setupPagerMarker(marker, index) { 6646 const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 6647 const slideId = markerId || `${this.sliderId}-item-${index + 1}`; 6648 if (!markerId) { 6649 marker.setAttribute(this.markerIdName, slideId); 6650 } 6651 marker.setAttribute("role", "tab"); 6652 marker.setAttribute("aria-controls", slideId); 6653 marker.setAttribute("aria-posinset", index + 1); 6654 marker.setAttribute("aria-setsize", this.slides.length); 6655 marker.setAttribute("tabindex", "-1"); 6656 if (!marker.hasAttribute("aria-label")) { 6657 marker.setAttribute("aria-label", `Slide ${index + 1}`); 6658 } 6659 } 6660 setupObservers() { 6661 if (this.inViewObserver) { 6662 this.inViewObserver.disconnect(); 6663 } 6664 this.inViewObserver = new IntersectionObserver( 6665 this.handleInView.bind(this), { 6666 root: this.track, 6667 threshold: 0.8 6668 } 6669 ); 6670 this.slides.forEach((slide) => this.inViewObserver.observe(slide)); 6671 } 6672 setupMutationObserver() { 6673 this.mutationObserver = new MutationObserver((mutations) => { 6674 if (mutations.some((m) => m.type === "childList" || m.target.parentElement === this.track)) { 6675 this.refreshSlides(); 6676 } 6677 }); 6678 this.mutationObserver.observe(this.track, { 6679 childList: true, 6680 subtree: true, 6681 attributeFilter: ["style"] 6682 }); 6683 } 6684 setupResizeObserver() { 6685 this.resizeObserver = new ResizeObserver( 6686 this.groupPagerMarkers.bind(this) 6687 ); 6688 this.resizeObserver.observe(this.el); 6689 } 6690 goToSlideDir(dir = "next") { 6691 if (this.isNavigating) return; 6692 const { firstInViewSlide, lastInViewSlide } = this.getInViewItems(); 6693 const isPrev = dir === "prev"; 6694 const referenceSlide = isPrev ? firstInViewSlide : lastInViewSlide; 6695 const currentIndex = this.slides.indexOf(referenceSlide); 6696 let targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1; 6697 if (targetIndex < 0 || targetIndex >= this.slides.length) { 6698 if (!this.useLoop) return; 6699 targetIndex = isPrev ? this.slides.length - 1 : 0; 6700 } 6701 const targetSlide = this.slides[targetIndex]; 6702 if (!targetSlide) return; 6703 this.isNavigating = true; 6704 targetSlide.scrollIntoView({ 6705 block: "nearest", 6706 inline: isPrev ? "end" : "start" 6707 }); 6708 } 6709 pagerToSlide(event) { 6710 if (!event.target.closest("[data-pager]")) return; 6711 const marker = event.target.closest("a, button"); 6712 if (!marker) return; 6713 event.preventDefault(); 6714 const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 6715 const targetSlide = this.track.querySelector(`#${slideId}`);
6716 targetSlide?.scrollIntoView({ block: "nearest", inline: "start" }); 6717 } 6718 eventHandler(event) { 6719 const target = event.target.closest( 6720 "[data-next], [data-prev], [data-pager]" 6721 ); 6722 if (!target) return; 6723 if (event.type === "click") { 6724 if (target.hasAttribute("data-next")) { 6725 this.goToSlideDir("next"); 6726 } else if (target.hasAttribute("data-prev")) { 6727 this.goToSlideDir("prev"); 6728 } else if (target.closest("[data-pager]")) { 6729 this.pagerToSlide(event); 6730 } 6731 } 6732 if (event.type === "keydown" && target.closest("[data-pager]")) { 6733 if (event.key === "ArrowRight" || event.key === "ArrowDown") { 6734 event.preventDefault(); 6735 this.goToSlideDir("next"); 6736 } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") { 6737 event.preventDefault(); 6738 this.goToSlideDir("prev"); 6739 } 6740 } 6741 } 6742 }; 6743 6744 (() => { 6745 function alpineSnapSlider(Alpine) { 6746 Alpine.directive("snap-slider", (el, { 6747 modifiers 6748 }, { 6749 cleanup 6750 }) => { 6751 const slider = new SnapSlider(el, { 6752 autoPager: modifiers.includes("auto-pager"), 6753 groupPager: modifiers.includes("group-pager"), 6754 loop: modifiers.includes("loop"), 6755 forcePager: modifiers.includes("force-pager") 6756 }); 6757 cleanup(() => { 6758 slider.destroy(); 6759 }); 6760 }); 6761 } 6762 6763 document.addEventListener("alpine:init", () => { 6764 window.Alpine.plugin(alpineSnapSlider); 6765 }); 6766 })(); 6767 //# sourceURL=alpine-snap-slider.js 6768</script>
vendor: 1 bytes, line 6768
6768
6769<script> 6770 (() => { 6771 'use strict'; 6772 6773 if (typeof SnapSlider === 'undefined') { 6774 return; 6775 } 6776 6777 const RESIZE_DEBOUNCE_MS = 150; 6778 const SCROLL_FALLBACK_THROTTLE_MS = 100; 6779 6780 window.AmSnapSlider = class AmSnapSlider extends SnapSlider { 6781 init() { 6782 this.useInfinite = this.el.hasAttribute('data-am-infinity-loop'); 6783 6784 super.init(); 6785 6786 if (!this.useInfinite || !this.track) { 6787 return; 6788 } 6789 6790 this._cloneCount = 0; 6791 this._isCloning = false; 6792 this._isJumping = false; 6793 this._onInfiniteScrollEnd = this._onInfiniteScrollEnd.bind(this); 6794 6795 this._setupInfiniteLoop(); 6796 this._bindInfiniteScrollEnd(); 6797 } 6798 6799 getSlides() { 6800 const slides = super.getSlides(); 6801 6802 if (!this.useInfinite) { 6803 return slides; 6804 } 6805 6806 return slides.filter((child) => !child.hasAttribute('data-clone')); 6807 } 6808 6809 refreshSlides() { 6810 if (!this.useInfinite) { 6811 return super.refreshSlides(); 6812 } 6813 6814 if (this._isCloning) { 6815 return; 6816 } 6817 6818 this._removeClones(); 6819 super.refreshSlides(); 6820 this._setupInfiniteLoop(); 6821 } 6822 6823 setupResizeObserver() { 6824 this.resizeObserver = new ResizeObserver(() => { 6825 requestAnimationFrame(() => { 6826 if (this._isCloning || this._isJumping) { 6827 return; 6828 } 6829 6830 this.groupPagerMarkers(); 6831 6832 if (!this.useInfinite) { 6833 return; 6834 } 6835 6836 clearTimeout(this._resizeInfiniteTimer); 6837 this._resizeInfiniteTimer = setTimeout(() => { 6838 this._setupInfiniteLoop(); 6839 }, RESIZE_DEBOUNCE_MS); 6840 }); 6841 }); 6842 this.resizeObserver.observe(this.el); 6843 } 6844 6845 goToSlideDir(dir = 'next') { 6846 if (!this.useInfinite || !this._cloneCount) { 6847 return super.goToSlideDir(dir); 6848 } 6849 6850 if (this.isNavigating || this._isJumping) { 6851 return; 6852 } 6853 6854 const allSlides = this._getAllTrackSlides(); 6855 6856 if (!allSlides.length) { 6857 return; 6858 } 6859 6860 // Same page-step as SnapSlider: next from last in-view, prev from first. 6861 const inViewSlides = this._getVisibleTrackSlides(allSlides); 6862 const isPrev = dir === 'prev'; 6863 const referenceSlide = isPrev 6864 ? inViewSlides[0] 6865 : inViewSlides[inViewSlides.length - 1]; 6866 const currentIndex = allSlides.indexOf(referenceSlide); 6867 6868 if (currentIndex < 0) { 6869 return; 6870 } 6871 6872 const targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1; 6873 6874 if (targetIndex < 0 || targetIndex >= allSlides.length) { 6875 return; 6876 } 6877 6878 const targetSlide = allSlides[targetIndex]; 6879 6880 if (!targetSlide) { 6881 return; 6882 } 6883 6884 this.isNavigating = true; 6885 targetSlide.scrollIntoView({ 6886 block: 'nearest', 6887 inline: isPrev ? 'end' : 'start' 6888 }); 6889 } 6890 6891 handleInView(entries) { 6892 this.focusOnActivePageMarker(); 6893 6894 if (!this.useInfinite) { 6895 const focusedNavBtn = this.navBtns.includes(document.activeElement) 6896 ? document.activeElement 6897 : null; 6898 6899 super.handleInView(entries); 6900 6901 if (focusedNavBtn?.disabled) { 6902 this.navBtns.find((btn) =>
6902 !btn.disabled)?.focus({ preventScroll: true });; 6903 } 6904 6905 return; 6906 } 6907 6908 const realEntries = []; 6909 6910 entries.forEach((entry) => { 6911 if (entry.target.hasAttribute('data-clone')) { 6912 entry.target.toggleAttribute('data-in-view', entry.isIntersecting); 6913 entry.target.setAttribute('inert', ''); 6914 entry.target.setAttribute('aria-hidden', 'true'); 6915 return; 6916 } 6917 6918 realEntries.push(entry); 6919 }); 6920 6921 if (realEntries.length) { 6922 super.handleInView(realEntries); 6923 } 6924 6925 this.navBtns.forEach((btn) => { 6926 btn.removeAttribute('disabled'); 6927 btn.style.visibility = null; 6928 }); 6929 } 6930 6931 focusOnActivePageMarker() { 6932 if (!this.useGroupPager || !this.pager || !this.slides.length) { 6933 return; 6934 } 6935 6936 const totalVisibleSlides = this.roundUpIfGreaterThan( 6937 this.track.offsetWidth / this.slides[0].offsetWidth 6938 ); 6939 const markers = Array.from(this.pager.querySelectorAll('a, button')); 6940 const { lastInViewSlide } = this.getInViewItems(); 6941 const activeIndex = lastInViewSlide ? this.slides.indexOf(lastInViewSlide) : -1; 6942 const activeGroupLeaderIndex = activeIndex >= 0 6943 ? activeIndex - (activeIndex % totalVisibleSlides) 6944 : -1; 6945 6946 let currentMarker = null; 6947 6948 markers.forEach((marker, index) => { 6949 const isGroupLeader = index % totalVisibleSlides === 0; 6950 6951 if (!isGroupLeader) { 6952 marker.setAttribute('aria-current', 'false'); 6953 marker.setAttribute('tabindex', '-1'); 6954 return; 6955 } 6956 6957 const isCurrent = index === activeGroupLeaderIndex; 6958 6959 marker.setAttribute('aria-current', String(isCurrent)); 6960 marker.setAttribute('tabindex', isCurrent ? '0' : '-1'); 6961 6962 if (isCurrent) { 6963 currentMarker = marker; 6964 } 6965 }); 6966 6967 if (currentMarker && this.pager.contains(document.activeElement) 6968 && document.activeElement !== currentMarker 6969 ) {
6970 currentMarker.focus({ preventScroll: true }); 6971 } 6972 } 6973 6974 destroy() { 6975 if (this.useInfinite) { 6976 this._unbindInfiniteScrollEnd(); 6977 clearTimeout(this._resizeInfiniteTimer); 6978 clearTimeout(this._infiniteScrollTimer); 6979 this._removeClones(); 6980 } 6981 6982 super.destroy(); 6983 } 6984 6985 _getAllTrackSlides() { 6986 return this.track ? super.getSlides() : []; 6987 } 6988 6989 _getClosestSlideIndex(slides) { 6990 const trackLeft = this.track.getBoundingClientRect().left; 6991 let closest = 0; 6992 let minDist = Infinity; 6993 6994 slides.forEach((slide, index) => { 6995 const dist = Math.abs(slide.getBoundingClientRect().left - trackLeft); 6996 if (dist < minDist) { 6997 minDist = dist; 6998 closest = index; 6999 } 7000 }); 7001 7002 return closest; 7003 } 7004 7005 _getVisibleTrackSlides(slides) { 7006 const marked = slides.filter((slide) => slide.hasAttribute('data-in-view')); 7007 if (marked.length) { 7008 return marked; 7009 } 7010 7011 const trackRect = this.track.getBoundingClientRect(); 7012 const threshold = 0.8; 7013 7014 return slides.filter((slide) => { 7015 const rect = slide.getBoundingClientRect(); 7016 const visibleWidth = Math.min(rect.right, trackRect.right) 7017 - Math.max(rect.left, trackRect.left); 7018 7019 if (visibleWidth <= 0) { 7020 return false; 7021 } 7022 7023 return (visibleWidth / Math.max(rect.width, 1)) >= threshold; 7024 }); 7025 } 7026 7027 _getSlideScrollLeft(slide) { 7028 const trackRect = this.track.getBoundingClientRect(); 7029 const slideRect = slide.getBoundingClientRect(); 7030 7031 return this.track.scrollLeft + (slideRect.left - trackRect.left); 7032 } 7033 7034 _createClone(slide, position, index) { 7035 const clone = slide.cloneNode(true); 7036 const baseId = slide.id || `${this.sliderId}-item-${index + 1}`; 7037 7038 clone.setAttribute('data-clone', position); 7039 clone.setAttribute('data-clone-of', baseId); 7040 clone.setAttribute('aria-hidden', 'true'); 7041 clone.setAttribute('inert', ''); 7042 clone.setAttribute('x-ignore', ''); 7043 clone.id = `${baseId}-clone-${position}-${index}`; 7044 clone.removeAttribute('data-in-view'); 7045 7046 clone.querySelectorAll('[id]').forEach((el) => { 7047 if (el !== clone) { 7048 el.removeAttribute('id'); 7049 } 7050 }); 7051 clone.querySelectorAll('[name]').forEach((el) => { 7052 el.removeAttribute('name'); 7053 }); 7054 7055 return clone; 7056 } 7057 7058 _removeClones() { 7059 if (!this.track) { 7060 return; 7061 } 7062 7063 this.track.querySelectorAll('[data-clone]').forEach((clone) => { 7064 clone.remove(); 7065 }); 7066 this._cloneCount = 0; 7067 } 7068 7069 _silentScrollTo(slide) { 7070 if (!slide || !this.track) { 7071 return; 7072 } 7073 7074 this._isJumping = true; 7075 7076 const track = this.track; 7077 const prevBehavior = track.style.scrollBehavior; 7078 const prevSnap = track.style.scrollSnapType; 7079 7080 track.style.scrollBehavior = 'auto'; 7081 track.style.scrollSnapType = 'none'; 7082 track.scrollLeft = this._getSlideScrollLeft(slide); 7083 7084 requestAnimationFrame(() => { 7085 track.style.scrollBehavior = prevBehavior; 7086 track.style.scrollSnapType = prevSnap; 7087 this._isJumping = false;
7088 this.isNavigating = false; 7089 }); 7090 } 7091 7092 _canUseInfinite(realSlides) { 7093 if (!realSlides.length || realSlides.length < 2) { 7094 return false; 7095 } 7096 7097 return this.track.scrollWidth > this.track.clientWidth + 1; 7098 } 7099 7100 _setupInfiniteLoop() { 7101 if (!this.useInfinite || !this.track || this._isCloning) { 7102 return; 7103 } 7104 7105 this._isCloning = true; 7106 this.mutationObserver?.disconnect(); 7107 7108 let restoreIndex = 0; 7109 const { firstInViewSlide } = this.getInViewItems(); 7110 const currentIndex = this.slides.indexOf(firstInViewSlide); 7111 7112 if (currentIndex >= 0) { 7113 restoreIndex = currentIndex; 7114 } 7115 7116 this._removeClones(); 7117 7118 const realSlides = this.getSlides(); 7119 7120 this.slides = realSlides; 7121 7122 if (!this._canUseInfinite(realSlides)) { 7123 this._cloneCount = 0; 7124 this._isCloning = false; 7125 this._reobserveMutations(); 7126 this.setupObservers(); 7127 7128 return; 7129 } 7130 7131 const slideWidth = realSlides[0].offsetWidth || 1; 7132 const visibleCount = Math.max( 7133 1, 7134 this.roundUpIfGreaterThan(this.track.offsetWidth / slideWidth) 7135 ); 7136 7137 this._cloneCount = Math.min(visibleCount, realSlides.length); 7138 7139 const prependFragment = document.createDocumentFragment(); 7140 7141 for (let i = realSlides.length - this._cloneCount; i < realSlides.length; i++) { 7142 prependFragment.appendChild( 7143 this._createClone(realSlides[i], 'pre', i) 7144 ); 7145 } 7146 this.track.insertBefore(prependFragment, this.track.firstChild); 7147 7148 const appendFragment = document.createDocumentFragment(); 7149 for (let i = 0; i < this._cloneCount; i++) { 7150 appendFragment.appendChild( 7151 this._createClone(realSlides[i], 'post', i) 7152 ); 7153 } 7154 this.track.appendChild(appendFragment); 7155 7156 this.slides = this.getSlides(); 7157 this.setupObservers(); 7158 7159 this._getAllTrackSlides().forEach((slide) => { 7160 if (slide.hasAttribute('data-clone')) { 7161 this.inViewObserver.observe(slide); 7162 } 7163 }); 7164 7165 const target = this.slides[restoreIndex] || this.slides[0]; 7166 requestAnimationFrame(() => { 7167 this._silentScrollTo(target); 7168 this._isCloning = false; 7169 this._reobserveMutations(); 7170 }); 7171 } 7172 7173 _reobserveMutations() { 7174 if (!this.mutationObserver || !this.track) { 7175 return; 7176 } 7177 7178 // Same as base SnapSlider. Watching `style` re-enters refreshSlides 7179 // when _silentScrollTo toggles scrollBehavior / scrollSnapType. 7180 this.mutationObserver.observe(this.track, { 7181 childList: true, 7182 subtree: false 7183 }); 7184 } 7185 7186 _bindInfiniteScrollEnd() { 7187 if (!this.track) { 7188 return; 7189 } 7190 7191 if ('onscrollend' in window) { 7192 this.track.addEventListener('scrollend', this._onInfiniteScrollEnd); 7193 return; 7194 } 7195 7196 this._onInfiniteScrollFallback = () => { 7197 clearTimeout(this._infiniteScrollTimer); 7198 this._infiniteScrollTimer = setTimeout(() => { 7199 this._onInfiniteScrollEnd(); 7200 }, SCROLL_FALLBACK_THROTTLE_MS); 7201 }; 7202 this.track.addEventListener('scroll', this._onInfiniteScrollFallback); 7203 } 7204 7205 _unbindInfiniteScrollEnd() { 7206 if (!this.track) { 7207 return; 7208 } 7209 7210 this.track.removeEventListener('scrollend', this._onInfiniteScrollEnd); 7211 if (this._onInfiniteScrollFallback) { 7212 this.track.removeEventListener('scroll', this._onInfiniteScrollFallback); 7213 } 7214 } 7215 7216 _onInfiniteScrollEnd() { 7217 if (this._isJumping || this._isCloning || this._isSimulateDragging) { 7218 return; 7219 } 7220 7221 if (!this.useInfinite || !this._cloneCount) { 7222 this.isNavigating = false;
7223 7224 return; 7225 } 7226 7227 const allSlides = this._getAllTrackSlides(); 7228 const realCount = this.slides.length; 7229 7230 if (!realCount || allSlides.length < realCount + this._cloneCount) { 7231 this.isNavigating = false; 7232 7233 return; 7234 } 7235 7236 const currentIndex = this._getClosestSlideIndex(allSlides); 7237 7238 if (currentIndex < this._cloneCount) { 7239 this._silentScrollTo(allSlides[currentIndex + realCount]); 7240 7241 return; 7242 } 7243 7244 if (currentIndex >= this._cloneCount + realCount) { 7245 this._silentScrollTo(allSlides[currentIndex - realCount]); 7246 7247 return; 7248 } 7249 7250 this.isNavigating = false; 7251 } 7252 }; 7253 7254 function alpineAmSnapSlider(Alpine) { 7255 Alpine.directive('am-snap-slider', (el, { modifiers }, { cleanup }) => { 7256 const slider = new window.AmSnapSlider(el, { 7257 autoPager: modifiers.includes('auto-pager'), 7258 groupPager: modifiers.includes('group-pager') 7259 }); 7260 cleanup(() => { 7261 slider.destroy(); 7262 }); 7263 }); 7264 } 7265 7266 document.addEventListener('alpine:init', () => { 7267 window.Alpine.plugin(alpineAmSnapSlider); 7268 }); 7269 })(); 7270</script>
vendor: 1 bytes, line 7270
7270
7271<script> 7272 (() => { 7273 'use strict'; 7274 7275 if (typeof window.AmSnapSlider === 'undefined') { 7276 return; 7277 } 7278 7279 // Ignore tiny jitter so a plain click on an item still opens the link. 7280 const DRAG_THRESHOLD_PX = 8; 7281 7282 // Listeners that only exist while an actual drag is in progress. 7283 const DOC_DRAG_EVENTS = ['pointermove', 'pointerup', 'pointercancel']; 7284 7285 const AmSnapSliderBase = window.AmSnapSlider; 7286 7287 window.AmSnapSlider = class AmSnapSlider extends AmSnapSliderBase { 7288 init() { 7289 this.useSimulateTouch = this.el.hasAttribute('data-am-simulate-touch'); 7290 7291 super.init(); 7292 7293 if (!this.useSimulateTouch || !this.track) { 7294 return; 7295 } 7296 7297 this._dragTracking = false; 7298 this._dragMoved = false; 7299 this._isSimulateDragging = false; 7300 this._dragStartX = 0; 7301 this._dragScrollLeft = 0; 7302 this._dragPointerId = null; 7303 this._suppressClick = false; 7304 7305 this._onSimulatePointerDown = this._onSimulatePointerDown.bind(this); 7306 this._onSimulatePointerMove = this._onSimulatePointerMove.bind(this); 7307 this._onSimulatePointerUp = this._onSimulatePointerUp.bind(this); 7308 this._onSimulateClickCapture = this._onSimulateClickCapture.bind(this); 7309 this._onSimulateDragStart = this._onSimulateDragStart.bind(this); 7310 7311 this._bindSimulateTouch(); 7312 } 7313 7314 destroy() { 7315 if (this.useSimulateTouch) { 7316 this._unbindSimulateTouch(); 7317 } 7318 7319 super.destroy(); 7320 } 7321 7322 _bindSimulateTouch() { 7323 if (!this.track) { 7324 return; 7325 } 7326 7327 this.track.classList.add('am-snap-simulate-touch'); 7328 this.track.addEventListener('pointerdown', this._onSimulatePointerDown); 7329 this.track.addEventListener('dragstart', this._onSimulateDragStart, true); 7330 this.track.addEventListener('click', this._onSimulateClickCapture, true); 7331 } 7332 7333 _unbindSimulateTouch() { 7334 if (!this.track) { 7335 return; 7336 } 7337 7338 this._endSimulateDrag(); 7339 this.track.classList.remove('am-snap-simulate-touch', 'is-dragging'); 7340 this.track.removeEventListener('pointerdown', this._onSimulatePointerDown); 7341 this.track.removeEventListener('dragstart', this._onSimulateDragStart, true); 7342 this.track.removeEventListener('click', this._onSimulateClickCapture, true); 7343 } 7344 7345 _onSimulateDragStart(event) { 7346 event.preventDefault(); 7347 } 7348 7349 _onSimulatePointerDown(event) { 7350 if (event.pointerType !== 'mouse' || event.button !== 0) { 7351 return; 7352 } 7353 7354 if (this._isJumping || this._isCloning || !this.track) { 7355 return; 7356 } 7357 7358 this._dragTracking = true; 7359 this._dragMoved = false; 7360 this._suppressClick = false; 7361 this._dragStartX = event.clientX; 7362 this._dragScrollLeft = this.track.scrollLeft; 7363 this._dragPointerId = event.pointerId; 7364 7365 DOC_DRAG_EVENTS.forEach((name) => { 7366 const handler = name === 'pointermove' 7367 ? this._onSimulatePointerMove 7368 : this._onSimulatePointerUp; 7369 document.addEventListener(name, handler); 7370 }); 7371 } 7372 7373 _onSimulatePointerMove(event) { 7374 if (!this._dragTracking || event.pointerId !== this._dragPointerId || !this.track) { 7375 return; 7376 } 7377 7378 const deltaX = event.clientX - this._dragStartX; 7379 7380 if (!this._dragMoved) { 7381 if (Math.abs(deltaX) < DRAG_THRESHOLD_PX) { 7382 return; 7383 } 7384 7385 this._dragMoved = true; 7386 this._isSimulateDragging = true; 7387 this._suppressClick = true; 7388 this.track.style.scrollSnapType = 'none'; 7389 this.track.style.scrollBehavior = 'auto'; 7390 this.track.classList.add('is-dragging'); 7391 7392 try { 7393 this.track.setPointerCapture(event.pointerId); 7394 } catch (e) {
7395 // Ignore capture errors on unsupported targets. 7396 } 7397 } 7398 7399 event.preventDefault(); 7400 this.track.scrollLeft = this._dragScrollLeft - deltaX; 7401 } 7402 7403 _onSimulatePointerUp(event) { 7404 if (!this._dragTracking || event.pointerId !== this._dragPointerId) { 7405 return; 7406 } 7407 7408 this._endSimulateDrag(); 7409 } 7410 7411 /** 7412 * Instantly align to the closest slide without CSS smooth scrolling. 7413 * Restoring snap+smooth from a mid-snap offset is what causes desktop jerk. 7414 */ 7415 _snapToNearestAfterDrag() { 7416 if (!this.track) { 7417 return; 7418 } 7419 7420 const slides = typeof this._getAllTrackSlides === 'function' 7421 ? this._getAllTrackSlides() 7422 : Array.from(this.track.children); 7423 7424 if (!slides.length) { 7425 return; 7426 } 7427 7428 if (typeof this._getClosestSlideIndex === 'function' 7429 && typeof this._getSlideScrollLeft === 'function' 7430 ) { 7431 const slide = slides[this._getClosestSlideIndex(slides)]; 7432 7433 if (slide) { 7434 this.track.scrollLeft = this._getSlideScrollLeft(slide); 7435 } 7436 7437 return; 7438 } 7439 7440 const trackLeft = this.track.getBoundingClientRect().left; 7441 let closest = null; 7442 let minDist = Infinity; 7443 7444 for (const slide of slides) { 7445 const dist = Math.abs(slide.getBoundingClientRect().left - trackLeft); 7446 if (dist < minDist) { 7447 minDist = dist; 7448 closest = slide; 7449 } 7450 } 7451 7452 if (closest) { 7453 this.track.scrollLeft += closest.getBoundingClientRect().left - trackLeft; 7454 } 7455 } 7456 7457 _endSimulateDrag() { 7458 DOC_DRAG_EVENTS.forEach((name) => { 7459 const handler = name === 'pointermove' 7460 ? this._onSimulatePointerMove 7461 : this._onSimulatePointerUp; 7462 document.removeEventListener(name, handler); 7463 }); 7464 7465 if (!this.track) { 7466 this._dragTracking = false; 7467 this._dragMoved = false; 7468 this._isSimulateDragging = false; 7469 this._dragPointerId = null; 7470 7471 return; 7472 } 7473 7474 if (this._dragPointerId !== null) { 7475 try { 7476 if (this.track.hasPointerCapture?.(this._dragPointerId)) { 7477 this.track.releasePointerCapture(this._dragPointerId); 7478 } 7479 } catch (e) { 7480 // Ignore release errors. 7481 } 7482 } 7483 7484 if (this._dragMoved) { 7485 // Keep snap off and behavior auto: settle instantly, then re-enable. 7486 this.track.style.scrollSnapType = 'none'; 7487 this.track.style.scrollBehavior = 'auto'; 7488 this._snapToNearestAfterDrag(); 7489 7490 // Allow infinite correction now that the gesture ended. 7491 this._isSimulateDragging = false; 7492 this._onInfiniteScrollEnd?.(); 7493 7494 // Two frames: 1) drop snap-none + dragging class, 2) restore scroll-behavior. 7495 requestAnimationFrame(() => { 7496 if (!this.track) { 7497 return; 7498 } 7499 this.track.style.scrollSnapType = ''; 7500 this.track.classList.remove('is-dragging'); 7501 7502 requestAnimationFrame(() => { 7503 if (this.track) { 7504 this.track.style.scrollBehavior = ''; 7505 } 7506 }); 7507 }); 7508 } else { 7509 this._isSimulateDragging = false;
7510 } 7511 7512 this._dragTracking = false; 7513 this._dragMoved = false; 7514 this._dragPointerId = null; 7515 7516 if (this._suppressClick) { 7517 requestAnimationFrame(() => { 7518 this._suppressClick = false; 7519 }); 7520 } 7521 } 7522 7523 _onSimulateClickCapture(event) { 7524 if (!this._suppressClick) { 7525 return; 7526 } 7527 7528 event.preventDefault(); 7529 event.stopPropagation(); 7530 this._suppressClick = false; 7531 } 7532 }; 7533 })(); 7534</script>
vendor: 1 bytes, line 7534
7534
7535<script> 7536 (() => { 7537 // src/dialog.js 7538 function dialog_default(Alpine) { 7539 Alpine.directive("htmldialog", fylgjaAlpineDialog); 7540 function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) { 7541 const evaluate = expression.length ? evaluateLater(expression) : () => {}; 7542 const lockPageScroll = modifiers.includes("noscroll"); 7543 const isModeless = modifiers.includes("modeless"); 7544 const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest"); 7545 el.style.display = null; 7546 el.style.length === 0 && el.removeAttribute("style"); 7547 if (el._x_isShown) { 7548 open(); 7549 } 7550 const closeBySupported = (() => { 7551 return "closedBy" in HTMLDialogElement.prototype; 7552 })(); 7553 function scrollLock(use = true) { 7554 document.body.style.overflow = use ? "hidden" : ""; 7555 } 7556 function dialogSubmit(event) { 7557 if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") { 7558 event.preventDefault(); 7559 evaluate(); 7560 } 7561 } 7562 function escapeDialog(event) { 7563 if (event.key !== "Escape") return; 7564 event.preventDefault(); 7565 if (closeBy === "none") return; 7566 evaluate(); 7567 } 7568 function handleCloseByEvent(event) { 7569 if (event.target !== el) return; 7570 const rect = el.getBoundingClientRect(); 7571 const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; 7572 if (!isInDialog) { 7573 if (closeBy === "any") { 7574 if (closeBySupported) { 7575 event.preventDefault(); 7576 } 7577 evaluate(); 7578 } 7579 } 7580 } 7581 function handleCloseEvent() { 7582 evaluate(); 7583 } 7584 function open() { 7585 if (el.hasAttribute("open")) return; 7586 isModeless ? el.show() : el.showModal(); 7587 scrollLock(lockPageScroll); 7588 } 7589 function close() { 7590 if (!el.hasAttribute("open")) return; 7591 el.close(); 7592 scrollLock(false); 7593 } 7594 el._x_doShow = () => open(); 7595 el._x_doHide = () => close(); 7596 el.addEventListener("keydown", escapeDialog); 7597 el.addEventListener("submit", dialogSubmit); 7598 el.addEventListener("click", handleCloseByEvent); 7599 el.addEventListener("cancel", handleCloseEvent); 7600 cleanup(() => { 7601 el.removeEventListener("keydown", escapeDialog); 7602 el.removeEventListener("submit", dialogSubmit); 7603 el.removeEventListener("click", handleCloseByEvent); 7604 el.removeEventListener("cancel", handleCloseEvent); 7605 scrollLock(false); 7606 }); 7607 } 7608 } 7609 function modifierValue(modifiers, key, fallback) { 7610 if (modifiers.indexOf(key) === -1) return fallback; 7611 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 7612 if (!rawValue) return fallback; 7613 if (key === "closeby") { 7614 const allowedValues = ["auto", "none", "closerequest", "any"]; 7615 const options = allowedValues.join(", "); 7616 if (!allowedValues.includes(rawValue)) { 7617 console.warn( 7618 `"${rawValue}" is not one of the allowed values for closeby: ${options}` 7619 ); 7620 return fallback; 7621 } 7622 } 7623 return rawValue; 7624 } 7625 7626 // src/cdn.js 7627 document.addEventListener("alpine:init", () => { 7628 window.Alpine.plugin(dialog_default); 7629 }); 7630 })(); 7631 //# sourceURL=alpine-htmldialog.js 7632</script>
vendor: 1 bytes, line 7632
7632
7633<script> 7634 (() => { 7635 function src_default(Alpine) { 7636 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 7637 let evaluate = evaluateLater(expression); 7638 let options = { 7639 rootMargin: getRootMargin(modifiers), 7640 threshold: getThreshold(modifiers) 7641 }; 7642 let observer = new IntersectionObserver((entries) => { 7643 entries.forEach((entry) => { 7644 if (entry.isIntersecting === (value === "leave")) 7645 return; 7646 evaluate(); 7647 modifiers.includes("once") && observer.disconnect(); 7648 }); 7649 }, options); 7650 observer.observe(el); 7651 cleanup(() => { 7652 observer.disconnect(); 7653 }); 7654 })); 7655 } 7656 function getThreshold(modifiers) { 7657 if (modifiers.includes("full")) 7658 return 0.99; 7659 if (modifiers.includes("half")) 7660 return 0.5; 7661 if (!modifiers.includes("threshold")) 7662 return 0; 7663 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 7664 if (threshold === "100") 7665 return 1; 7666 if (threshold === "0") 7667 return 0; 7668 return Number(`.${threshold}`); 7669 } 7670 function getLengthValue(rawValue) { 7671 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 7672 return match ? match[1] + (match[2] || "px") : void 0; 7673 } 7674 function getRootMargin(modifiers) { 7675 const key = "margin"; 7676 const fallback = "0px 0px 0px 0px"; 7677 const index = modifiers.indexOf(key); 7678 if (index === -1) 7679 return fallback; 7680 let values = []; 7681 for (let i = 1; i < 5; i++) { 7682 values.push(getLengthValue(modifiers[index + i] || "")); 7683 } 7684 values = values.filter((v) => v !== void 0); 7685 return values.length ? values.join(" ").trim() : fallback; 7686 } 7687 7688 document.addEventListener("alpine:init", () => { 7689 window.Alpine.plugin(src_default); 7690 }); 7691 })(); 7692 //# sourceURL=alpine-intersect.js 7693</script>
7693 7694
7695<script> 7696 (() => { 7697 const hasAlpine = new Promise(resolve => { 7698 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 7699 }); 7700 7701 const hasInteract = new Promise(resolve => { 7702 (events => { 7703 const onInteract = () => { 7704 resolve(); 7705 events.forEach(type => window.removeEventListener(type, onInteract)); 7706 } 7707 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 7708 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 7709 }); 7710 7711 const onIntersect = (el) => { 7712 return new Promise(resolve => { 7713 const observer = new IntersectionObserver(entries => { 7714 for (const entry of entries) { 7715 if (entry.isIntersecting) { 7716 observer.disconnect() 7717 resolve(); 7718 } 7719 } 7720 }, {}); 7721 observer.observe(el); 7722 }); 7723 } 7724 7725 function runComponent(el) { 7726 hasAlpine.then(() => { 7727 el.removeAttribute('x-ignore'); 7728 queueMicrotask(() => Alpine.initTree(el)); 7729 }); 7730 } 7731 7732 function initDeferredComponents() { 7733 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 7734 el.setAttribute('x-ignore', ''); 7735 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 7736 switch (deferUntil) { 7737 case 'interact': 7738 hasInteract.then(() => runComponent(el)); 7739 break; 7740 case 'intersect': 7741 onIntersect(el).then(() => runComponent(el)) 7742 break; 7743 case 'idle': 7744 window.requestIdleCallback 7745 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 7746 : setTimeout(() => runComponent(el), 4000); 7747 break; 7748 case 'eager': 7749 runComponent(el); 7750 break; 7751 default: 7752 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 7753 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 7754 } 7755 } 7756 }); 7757 } 7758 7759 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 7760 })(); 7761 //# sourceURL=alpine-defer.js 7762</script>
7762 7763 7764
7765<script type="module" 7766 src="https://www.jardindupicvert.com/static/version1790796154/frontend/PicVert/hyva/fr_FR/Hyva_Theme/js/alpine3.min.js" 7767 defer 7768 crossorigin 7769></script>
vendor: 1 bytes, line 7769
7769
7770<script> 7771 function dispatchMessages(messages, hideAfter) { 7772 const messagesEvent = new CustomEvent("messages-loaded", { 7773 detail: { 7774 messages: messages, 7775 hideAfter: hideAfter 7776 } 7777 }); 7778 window.dispatchEvent(messagesEvent); 7779 } 7780 7781 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 7782 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 7783 } 7784 7785 (function( hyva, undefined ) { 7786 7787 hyva.initFormKey = () => { 7788 if (typeof hyva.getFormKey !== 'function') return; 7789 7790 const formKey = hyva.getFormKey(); 7791 if (!formKey) return; 7792 7793 document.querySelectorAll('input[name="form_key"]').forEach((input) => { 7794 input.value = formKey; 7795 }); 7796 } 7797 7798 hyva.initMessages = () => { 7799 try { 7800 const messages = hyva.getCookie('mage-messages'); 7801 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 7802 7803 dispatchMessages(window.mageMessages); 7804 7805 // empty `mage-messages` cookie 7806 const skipSetDomain = true; 7807 hyva.setCookie('mage-messages','', -1, skipSetDomain); 7808 7809 } catch (error) { 7810 console.warn('Error parsing Cookie Messages:', error); 7811 } 7812 } 7813 7814 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 7815 7816 window.addEventListener('pageshow', (event) => { 7817 if (event.persisted) { 7818 hyva.initFormKey(); 7819 } 7820 }); 7821 7822 hyva.alpineInitialized(hyva.initMessages) 7823 }( window.hyva = window.hyva || {} )); 7824 //# sourceURL=hyva-cookies.js 7825</script>
vendor: 1 bytes, line 7825
7825
7826<script> 7827 (() => { 7828 const private_content_key = 'mage-cache-storage'; 7829 const private_content_expire_key = 'mage-cache-timeout'; 7830 const private_content_version_key = 'private_content_version'; 7831 const section_data_ids_key = 'section_data_ids'; 7832 const mage_cache_session_id_key = 'mage-cache-sessid'; 7833 const last_visited_store_key = 'last_visited_store'; 7834 7835 const ttl = 86400; 7836 7837 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 7838 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 7839 } 7840 7841 function loadSectionData () { 7842 const browserStorage = hyva.getBrowserStorage(); 7843 if (!browserStorage) { 7844 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 7845 [{ 7846 type: "warning", 7847 text: "Please enable LocalStorage in your browser." 7848 }] 7849 ); 7850 return; 7851 } 7852 try { 7853 let isInvalid = false; 7854 7855 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 7856 isInvalid = true; 7857 } 7858 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 7859 7860 if (!hyva.getCookie(mage_cache_session_id_key)) { 7861 isInvalid = true; 7862 browserStorage.removeItem(private_content_key); 7863 const skipSetDomain = true; 7864 const days = false; 7865 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 7866 } 7867 7868 const cookieVersion = hyva.getCookie(private_content_version_key); 7869 const storageVersion = browserStorage.getItem(private_content_version_key); 7870 7871 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 7872 isInvalid = true; 7873 } 7874 7875 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 7876 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 7877 browserStorage.removeItem(private_content_key); 7878 } 7879 7880 if (isInvalid && cookieVersion) { 7881 fetchPrivateContent([]); 7882 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 7883 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 7884 if ( 7885 privateContent && 7886 privateContentExpires && 7887 privateContent.cart && 7888 privateContent.customer 7889 ) { 7890 dispatchPrivateContent(privateContent); 7891 } else { 7892 fetchPrivateContent([]); 7893 } 7894 } else { 7895 if (document.getElementById('default-section-data')) { 7896 const privateContent = JSON.parse(document.getElementById('default-section-data').textContent.trim()); 7897 dispatchPrivateContent(privateContent); 7898 } else { 7899 dispatchPrivateContent({}); 7900 } 7901 } 7902 7903 } catch (error) { 7904 console.warn('Error retrieving Private Content:', error); 7905 } 7906 } 7907 7908 hyva.alpineInitialized(loadSectionData) 7909 window.addEventListener('reload-customer-section-data', loadSectionData); 7910 7911 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 7912 7913 function dispatchPrivateContent(data) { 7914 7915 const privateContentEvent = new CustomEvent("private-content-loaded", { 7916 detail: { 7917 data: window.processSectionDataBeforeDispatch(data) 7918 } 7919 }); 7920 window.dispatchEvent(privateContentEvent); 7921 } 7922 7923 function fetchPrivateContent(sections) { 7924 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 7925 method: 'GET', 7926 headers: { 7927 'Content-Type': 'application/json', 7928 'X-Requested-With': 'XMLHttpRequest' 7929 } 7930 }) 7931 .then(response => response.ok && response.json()) 7932 .then( 7933 data => { 7934 if (data) { 7935 try { 7936 const browserStorage = hyva.getBrowserStorage(); 7937 7938 // merge new data preserving non-invalidated sections 7939 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 7940 7941 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 7942 delete oldSectionData['checkout-data']; 7943 } 7944 const newSectionData = Object.assign(oldSectionData, data); 7945 7946 dispatchPrivateContent(newSectionData); 7947 7948 // don't persist messages, they've been dispatched already 7949 if (newSectionData.messages && newSectionData.messages.messages ) { 7950 newSectionData.messages.messages = []; 7951 } 7952 7953 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 7954 7955 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 7956 browserStorage.setItem(private_content_expire_key, expiresAt); 7957 7958 const newCookieVersion = hyva.getCookie(private_content_version_key); 7959 browserStorage.setItem(private_content_version_key, newCookieVersion); 7960 7961 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 7962 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 7963 hyva.setCookie( 7964 section_data_ids_key, 7965 JSON.stringify( 7966 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 7967 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 7968 return sectionDataIds; 7969 }, {}) 7970 ), 7971 false, 7972 true 7973 ); 7974 } catch (error) { 7975 console.warn("Couldn't store privateContent", error); 7976 } 7977 } 7978 } 7979 ) 7980 .catch(error => { 7981 console.warn("Couldn't fetch privateContent", error); 7982 }); 7983 } 7984 })(); 7985 //# sourceURL=hyva-private-content.js 7986</script>
vendor: 1 bytes, line 7986
7986
7987<script> 7988 (() => { 7989 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 7990 })() 7991</script>
vendor: 1 bytes, line 7991
7991
7992<script> 7993 (events => { 7994 const dispatchUserInteractionEvent = () => { 7995 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 7996 window.dispatchEvent(new Event('init-external-scripts')) 7997 }; 7998 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 7999 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']); 8000 //# sourceURL=hyva-init-external-scripts.js 8001</script>
8001 8002<!--OX7wOp4TiO5hLyFeO0pUjRq0pBPeKzri-->
8002<script> 8003 function initConfigurableOptions(productId, optionConfig) { 8004 8005 function findPathParam(key) { 8006 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 8007 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 8008 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 8009 for (let i = 0; i < pathParts.length; i += 2) { 8010 if (pathParts[i] === key && pathParts.length > i) { 8011 return pathParts[i + 1]; 8012 } 8013 } 8014 } 8015 8016 return { 8017 optionConfig, 8018 productId, 8019 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 8020 allowedAttributeOptions: [], 8021 selectedValues: [], 8022 selectedOptions: {}, 8023 init() { 8024 this.baseInit(); 8025 }, 8026 baseInit() { 8027 this.buildLookupMap(); 8028 this.findAllowedAttributeOptions(); 8029 this.$nextTick(() => { 8030 if (typeof this.optionConfig.defaultValues === 'object') { 8031 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 8032 this.changeOption(attributeId, value + ''); 8033 } 8034 } 8035 this.applyCheckedState(); 8036 }); 8037 }, 8038 applyCheckedState() { 8039 this.$root.querySelectorAll('input[data-attribute-id], select[data-attribute-id]').forEach(el => { 8040 const val = this.selectedValues[el.dataset.attributeId]; 8041 if (!val) return; 8042 if (el.tagName === 'SELECT') { 8043 el.value = val; 8044 this.selectedOptions[el.dataset.attributeId] = el.options[el.selectedIndex]?.text || ''; 8045 } else if (el.value === val && this.optionIsActive(el.dataset.attributeId, el.value)) { 8046 el.checked = true; 8047 this.selectedOptions[el.dataset.attributeId] = el.dataset.optionLabel || ''; 8048 } 8049 }); 8050 }, 8051 productIndex: 0, 8052 productIndexForPrice: 0, 8053 productIndexesMap: null, 8054 productIndexesKeys: null, 8055 attributeCount: 0, 8056 optionIsActive(attributeId, optionId) { 8057 return !!this.getAllowedAttributeOptions(attributeId).find( 8058 option => option.id === optionId 8059 ) 8060 }, 8061 optionIsDisabled() { 8062 const attributeId = this.$el.dataset.attributeId; 8063 if (!attributeId) { 8064 throw new Error('data-attribute-id missing, in item template'); 8065 } 8066 return !this.optionIsActive(attributeId, this.$el.value); 8067 }, 8068 findSimpleIndex() { 8069 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 8070 this.productIndexForPrice = this.findCheapestProductForPartialSelection(this.selectedValues); 8071 }, 8072 calculateSimpleIndexForPartialSelection(selectedValues) { 8073 if (selectedValues.length === 0) return 0; 8074 return this.findProductIdsForPartialSelection(selectedValues)[0]; 8075 }, 8076 buildLookupMap() { 8077 this.productIndexesMap = new Map(); 8078 this.attributeCount = Object.keys(this.optionConfig.attributes).length; 8079 for (const id in this.optionConfig.index) { 8080 const options = this.optionConfig.index[id]; 8081 if (! this.productIndexesKeys) { 8082 this.productIndexesKeys = Object.keys(options).sort(); 8083 } 8084 const key = JSON.stringify(options, this.productIndexesKeys); 8085 this.productIndexesMap.set(key, id); 8086 } 8087 }, 8088 findAllowedAttributeOptions() { 8089 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 8090 }, 8091 calculateAllowedAttributeOptions(selectedValues) { 8092 const allAttributes = this.optionConfig.attributes; 8093 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 8094 return a.position - b.position 8095 }); 8096 8097 const newAllowedAttributeOptions = []; 8098 8099 allAttributesSorted.forEach(attribute => { 8100 const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); 8101 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 8102 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 8103 return !!option.products.find(product => { 8104 return availableIndexes.includes(product); 8105 }) 8106 }); 8107 }); 8108 return newAllowedAttributeOptions; 8109 }, 8110 calculateAvailableProductIndexes(selectedOptions) { 8111 if (Object.keys(selectedOptions).length === 0) { 8112 if (Object.values(this.optionConfig.salable || {}).length) { 8113 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 8114 } 8115 return Object.keys(this.optionConfig.index); 8116 } 8117 8118 const selectedIds = Object.keys(selectedOptions); 8119 if (Object.values(this.optionConfig.salable || {}).length) { 8120 const selectedOptionIndexes = selectedIds.map(attrId => { 8121 const optionValue = selectedOptions[attrId]; 8122 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 8123 }) 8124 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 8125 return acc.filter(index => optionIndexes.includes(index)); 8126 }); 8127 } else { 8128 const productIndexes = this.optionConfig.index; 8129 return Object.keys(productIndexes).filter(index => { 8130 for (const attrId of selectedIds) { 8131 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 8132 } 8133 return true 8134 }); 8135 } 8136 }, 8137 findAttributeByOptionId(optionId) { 8138 for (const attributeId in this.optionConfig.attributes) { 8139 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 8140 if (attributeOptions.find(option => option.id === optionId)) { 8141 return attributeId; 8142 } 8143 } 8144 }, 8145 getAllowedAttributeOptions(attributeId) { 8146 return this.allowedAttributeOptions[attributeId] || [] 8147 }, 8148 getAllAttributeOptions(attributeId) { 8149 return ( 8150 this.optionConfig.attributes[attributeId] && 8151 this.optionConfig.attributes[attributeId].options 8152 ) || [] 8153 }, 8154 getProductIdsForOption(option) { 8155 const attributeId = this.findAttributeByOptionId(option.id); 8156 const allOptions = this.optionConfig.attributes[attributeId]; 8157 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 8158 return opt && opt.products 8159 ? opt.products 8160 : []; 8161 }, 8162 findProductIdsForPartialSelection(optionSelection) { 8163 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 8164 const newCandidates = this.getProductIdsForOption({id: optionId}); 8165 return candidates === null 8166 ? newCandidates 8167 : candidates.filter(productId => newCandidates.includes(productId)); 8168 }, null); 8169 return candidateProducts || []; 8170 },
8171 findCheapestProductForPartialSelection(optionSelection) { 8172 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 8173 return candidateProducts.reduce((cheapest, simpleIdx) => { 8174 // in the first iteration we start with simpleIdx as the currently cheapest product 8175 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 8176 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 8177 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 8178 ? simpleIdx 8179 : cheapest; 8180 }, 0) 8181 }, 8182 removeAttrFromSelection(selectedValues, attributeId) { 8183 attributeId = parseInt(attributeId); 8184 return selectedValues.reduce((newSelection, val, attr) => { 8185 if (attr !== attributeId) { 8186 newSelection[attr] = val; 8187 } 8188 return newSelection; 8189 }, []); 8190 }, 8191 reflectOption(event) { 8192 const attributeId = event.target.dataset.attributeId; 8193 const label = event.target.dataset.optionLabel 8194 || event.target.options?.[event.target.selectedIndex]?.text 8195 || ''; 8196 this.selectedOptions[attributeId] = label; 8197 this.changeOption(attributeId, event.target.value); 8198 }, 8199 baseChangeOption(attributeId, value) { 8200 if (value === '') { 8201 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 8202 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 8203 this.selectedValues[attributeId] = value; 8204 } 8205 this.findSimpleIndex(); 8206 this.findAllowedAttributeOptions(); 8207 this.updatePrices(); 8208 this.updateGallery(); 8209 }, 8210 changeOption(attributeId, value) { 8211 this.baseChangeOption(attributeId, value); 8212 8213 const candidates = this.findProductIdsForPartialSelection(this.selectedValues); 8214 8215 window.dispatchEvent( 8216 new CustomEvent( 8217 'configurable-selection-changed', 8218 { 8219 detail: { 8220 productId: this.productId, 8221 optionId: attributeId, 8222 value: value, 8223 productIndex: this.productIndex, 8224 selectedValues: this.selectedValues, 8225 candidates: candidates, 8226 skuCandidates: Object.values(candidates).map(id => this.optionConfig.sku?.[id] ?? null).filter(Boolean), 8227 } 8228 } 8229 ) 8230 ); 8231 }, 8232 calculateIsMinimalPrice() { 8233 return ! this.isFullSelection(this.selectedValues); 8234 }, 8235 isFullSelection(selectedValues) { 8236 return Object.keys(selectedValues).length === this.attributeCount; 8237 }, 8238 updatePrices() { 8239 const value = this.optionConfig.optionPrices[this.productIndexForPrice] || this.optionConfig.prices; 8240 window.dispatchEvent( 8241 new CustomEvent( 8242 "update-prices-" + this.productId, 8243 { 8244 detail: Object.assign( 8245 value, 8246 { isMinimalPrice: this.calculateIsMinimalPrice() } 8247 ) 8248 } 8249 ) 8250 ); 8251 }, 8252 updateGallery () { 8253 if (this.productIndex) { 8254 const images = this.optionConfig.images[this.productIndex]; 8255 images && window.dispatchEvent(new CustomEvent( 8256 "update-gallery", 8257 { detail: this.sortImagesByPosition(images) } 8258 )); 8259 } else { 8260 window.dispatchEvent(new Event("reset-gallery")); 8261 } 8262 }, 8263 sortImagesByPosition(images) { 8264 return images.sort((x, y) => { 8265 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 8266 }); 8267 }, 8268 preselectQuerystringItems() { 8269 // pre-select option like ?size=167 8270 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 8271 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 8272 }, 8273 preselectLocationHashItems() { 8274 // pre-select option like #144=167 8275 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 8276 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 8277 }, 8278 preselectItemsBasedOnLocation(getLocationValue) { 8279 Object.values(this.optionConfig.attributes).map(attribute => { 8280 const v = getLocationValue(attribute); 8281 v && this.changeOption(attribute.id, v) 8282 }); 8283 }, 8284 findProductForOptionPrice(attributeId, value) { 8285 const options = this.optionConfig.attributes[attributeId]?.options || []; 8286 const option = options.find(o => o.id === value); 8287 if (!option?.products?.length) return null; 8288 return option.products.reduce((cheapest, productId) => { 8289 if (!cheapest) return productId; 8290 const cheapestPrice = this.optionConfig.optionPrices[cheapest]?.finalPrice?.amount ?? Infinity; 8291 const thisPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount ?? Infinity; 8292 return thisPrice < cheapestPrice ? productId : cheapest; 8293 }, null); 8294 }, 8295 getOptionLabel() { 8296 const value = this.$el.value; 8297 const attributeId = this.$el.dataset.attributeId; 8298 const label = this.$el.dataset.optionLabel || ''; 8299 if (!value || !attributeId) return label; 8300 8301 const productId = this.findProductForOptionPrice(attributeId, value); 8302 if (!productId) return label; 8303 8304 const optionPrice = this.optionConfig.optionPrices[productId]?.finalPrice?.amount; 8305 const basePrice = this.optionConfig.prices?.finalPrice?.amount; 8306 if (optionPrice == null || basePrice == null) return label; 8307 8308 const adjustment = optionPrice - basePrice; 8309 if (Math.abs(adjustment) < 0.001) return label; 8310 8311 const formatted = hyva.formatPrice(Math.abs(adjustment)); 8312 return `${label} (${adjustment > 0 ? '+' : '-'}${formatted})`; 8313 }, 8314 } 8315 } 8316</script>
vendor: 1 bytes, line 8316
8316
8317<script> 8318 function initSwatchOptions() { 8319 return { 8320 activeTooltipItem: false, 8321 tooltipPositionElement: false, 8322 isTooltipVisible() { 8323 return !!this.activeTooltipItem; 8324 }, 8325 isCurrentTooltipVisual() { 8326 return this.activeTooltipItem && ['color', 'image'].includes(this.activeTooltipItem.type); 8327 }, 8328 getTooltipImageStyle() { 8329 const item = this.activeTooltipItem; 8330 if (item?.type === 'color') return { 8331 backgroundColor: item.preview, 8332 width: `${item.width ?? 90}px`, 8333 height: `${item.height ?? 90}px` 8334 }; 8335 if (item?.type === 'image') return { 8336 backgroundImage: `url(${item.preview})`, 8337 backgroundSize: 'cover', 8338 backgroundPosition: 'center', 8339 backgroundRepeat: 'no-repeat', 8340 width: `${item.width ?? 90}px`, 8341 height: `${item.height ?? 90}px` 8342 }; 8343 return null; 8344 }, 8345 getTooltipPosition() { 8346 if (!this.tooltipPositionElement) return null; 8347 const el = this.tooltipPositionElement; 8348 const elRect = el.getBoundingClientRect(); 8349 const left = elRect.left + elRect.width / 2; 8350 8351 return { 8352 bottom: `${window.innerHeight - elRect.top}px`, 8353 left: `${left}px`, 8354 translate: '-50% 0' 8355 }; 8356 }, 8357 getTooltipLabel() { 8358 return this.activeTooltipItem ? this.activeTooltipItem.label : ''; 8359 }, 8360 showTooltip(event) { 8361 if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return; 8362 const input = event.currentTarget.querySelector('input'); 8363 this.activeTooltipItem = JSON.parse(input.dataset.tooltip); 8364 this.tooltipPositionElement = event.currentTarget; 8365 }, 8366 hideTooltip() { 8367 this.activeTooltipItem = false; 8368 }, 8369 } 8370 } 8371</script>
vendor: 1 bytes, line 8371
8371
8372<script> 8373 function amastyRewardsCatalog() { 8374 return { 8375 productId: this.$el.dataset.productId, 8376 formSelector: 'product_addtocart_form', 8377 refreshUrl: this.$el.dataset.refreshUrl, 8378 loader: false, 8379 isFetching: false, 8380 abortFetchController: false, 8381 highlight: { 8382 caption_color: '', 8383 caption_text: '', 8384 visible: false 8385 }, 8386 8387 init() { 8388 this.formObserver(); 8389 document.addEventListener(`update-qty-${this.productId}`, () => { 8390 this.updateData(); 8391 }); 8392 this.$nextTick(() => this.updateData()); 8393 }, 8394 8395 hideBlock() { 8396 this.highlight.visible = false; 8397 this.loader = true; 8398 }, 8399 8400 dispatchStatus(type, message) { 8401 window.dispatchMessages([{ 8402 type: type, 8403 text: message 8404 }], 5000); 8405 }, 8406 8407 formObserver() { 8408 const product = document.querySelector(`input[name="product"][value="${this.productId}"]`); 8409 8410 if (product) { 8411 const productForm = product.form; 8412 if (productForm) { 8413 productForm.addEventListener('change', () => { 8414 this.updateData(); 8415 }); 8416 } 8417 } 8418 }, 8419 8420 updateData() { 8421 if (!this.refreshUrl || this.isFetching) return false; 8422 this.hideBlock(); 8423 8424 if (this.abortFetchController) { 8425 this.abortFetchController.abort(); 8426 } 8427 this.abortFetchController = new AbortController(); 8428 8429 const product = document.querySelector(`input[name='product'][value='${this.productId}']`); 8430 if (!product) return false; 8431 8432 const form = product.form; 8433 const formData = new FormData(form); 8434 const formParams = new URLSearchParams(formData).toString(); 8435 const formJson = JSON.stringify({ 8436 productId: this.productId, 8437 attributes: formParams 8438 }); 8439 8440 const requestOptions = { 8441 method: 'POST', 8442 body: formJson, 8443 headers: { 8444 'Content-Type': 'application/json', 8445 'x-requested-with': 'XMLHttpRequest', 8446 }, 8447 signal: this.abortFetchController.signal 8448 }; 8449 8450 this.isFetching = true; 8451 fetch(this.refreshUrl, requestOptions).then(response => { 8452 if (!response.ok) { 8453 return Promise.reject(`${response.status} ${response.statusText}`); 8454 } 8455 return response.json(); 8456 }).then(data => { 8457 this.highlight.visible = data.visible; 8458 this.highlight.caption_text = data.caption_text; 8459 this.highlight.caption_color = data.caption_color; 8460 }).catch(error => { 8461 if (error.name !== 'AbortError' 8462 && typeof error === 'string' 8463 && error.match(/'401'/g) !== null 8464 ) { 8465 this.dispatchStatus('error', error); 8466 } 8467 }).finally(() => { 8468 this.loader = false;
8469 this.abortFetchController = false; 8470 this.isFetching = false; 8471 }); 8472 }, 8473 8474 highlightVisible() { 8475 return this.highlight.visible && !this.loader; 8476 }, 8477 8478 highlightStyle() { 8479 return `color: ${this.highlight.caption_color}`; 8480 }, 8481 } 8482 } 8483 8484 window.addEventListener( 8485 'alpine:init', 8486 () => Alpine.data('amastyRewardsCatalog', amastyRewardsCatalog), 8487 { once: true } 8488 ); 8489 </script>
vendor: 1 bytes, line 8489
8489
8490<script> 8491 'use strict'; 8492 8493 const grecaptchaV2LoadCallbacks = []; 8494 8495 function executeRecaptchaLoadCallbacks () { 8496 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 8497 const callback = grecaptchaV2LoadCallbacks.pop(); 8498 typeof callback === 'string' ? window[callback]() : callback(); 8499 } 8500 } 8501 8502 (function() { 8503 const loadRecaptchaScript = (event) => { 8504 8505 if (window.grecaptcha || !event.target.form) { 8506 return; 8507 } 8508 8509 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 8510 const siteKey = '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV'; 8511 const script = document.createElement('script'); 8512 script.type = 'text/javascript'; 8513 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 8514 script.async = true; 8515 document.head.appendChild(script); 8516 8517 script.addEventListener('load', () => { 8518 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 8519 }); 8520 } 8521 8522 window.forceLoadRecaptchaScript = (form) => { 8523 loadRecaptchaScript({target: {form: form || 'dummy'}}); 8524 executeRecaptchaLoadCallbacks(); 8525 }; 8526 8527 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 8528 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 8529 8530 }()); 8531 8532</script>
vendor: 1 bytes, line 8532
8532
8533<script> 8534 const ALLOWED_SHIPPING_COUNTRIES = JSON.parse('\u007B\u0022de\u0022\u003A\u0022Allemagne\u0022,\u0022ad\u0022\u003A\u0022Andorre\u0022,\u0022at\u0022\u003A\u0022Autriche\u0022,\u0022be\u0022\u003A\u0022Belgique\u0022,\u0022bg\u0022\u003A\u0022Bulgarie\u0022,\u0022cy\u0022\u003A\u0022Chypre\u0022,\u0022hr\u0022\u003A\u0022Croatie\u0022,\u0022dk\u0022\u003A\u0022Danemark\u0022,\u0022es\u0022\u003A\u0022Espagne\u0022,\u0022ee\u0022\u003A\u0022Estonie\u0022,\u0022fi\u0022\u003A\u0022Finlande\u0022,\u0022fr\u0022\u003A\u0022France\u0022,\u0022gr\u0022\u003A\u0022Gr\u005Cu00e8ce\u0022,\u0022hu\u0022\u003A\u0022Hongrie\u0022,\u0022ie\u0022\u003A\u0022Irlande\u0022,\u0022is\u0022\u003A\u0022Islande\u0022,\u0022it\u0022\u003A\u0022Italie\u0022,\u0022lv\u0022\u003A\u0022Lettonie\u0022,\u0022lt\u0022\u003A\u0022Lituanie\u0022,\u0022lu\u0022\u003A\u0022Luxembourg\u0022,\u0022mt\u0022\u003A\u0022Malte\u0022,\u0022mc\u0022\u003A\u0022Monaco\u0022,\u0022nl\u0022\u003A\u0022Pays\u002DBas\u0022,\u0022pl\u0022\u003A\u0022Pologne\u0022,\u0022pt\u0022\u003A\u0022Portugal\u0022,\u0022ro\u0022\u003A\u0022Roumanie\u0022,\u0022sm\u0022\u003A\u0022Saint\u002DMarin\u0022,\u0022sk\u0022\u003A\u0022Slovaquie\u0022,\u0022si\u0022\u003A\u0022Slov\u005Cu00e9nie\u0022,\u0022ch\u0022\u003A\u0022Suisse\u0022,\u0022se\u0022\u003A\u0022Su\u005Cu00e8de\u0022,\u0022cz\u0022\u003A\u0022Tch\u005Cu00e9quie\u0022,\u0022va\u0022\u003A\u0022\u005Cu00c9tat\u0020de\u0020la\u0020Cit\u005Cu00e9\u0020du\u0020Vatican\u0022\u007D'); 8535 8536 document.addEventListener('alpine:init', () => { 8537 Alpine.store('customer', { 8538 isInit: false, 8539 isLoggedIn: false, 8540 customerId: 0, 8541 fullName: '', 8542 visitorCountry: '', 8543 isInferredCountry: true, 8544 customerId: 0, 8545 8546 init() { 8547 window.addEventListener( 8548 "private-content-loaded", 8549 (event) => { 8550 const privateData = event?.detail?.data; 8551 this.isInit = true; 8552 this.customerId = privateData?.customer?.customerId || '' 8553 this.fullName = privateData?.customer?.fullname || ''; 8554 this.isLoggedIn = !!privateData?.customer?.fullname; 8555 this.customerId = privateData?.customer?.customerId || 0; 8556 this.visitorCountry = (hyva.getCookie('visitor_country') || this.getGlopalHtmlLang() || 'FR').toLowerCase(); 8557 this.isInferredCountry = !hyva.getCookie('visitor_country'); 8558 this.setStoredVisitorCountry(this.visitorCountry, false); 8559 Alpine.nextTick(() => {window.dispatchEvent( 8560 new CustomEvent("customer-alpine-init") 8561 )}); 8562 } 8563 ); 8564 }, 8565 8566 setStoredVisitorCountry(country, reloadPage = true) { 8567 if (ALLOWED_SHIPPING_COUNTRIES?.[country.toLowerCase()]) { 8568 hyva.setCookie('visitor_country', country.toUpperCase(), 10, true); 8569 this.visitorCountry = country; 8570 if (reloadPage && false) { 8571 document.querySelector('body').classList.add('u-loader'); 8572 const formData = new FormData(); 8573 formData.append('form_key', hyva.getFormKey()); 8574 fetch('https://www.jardindupicvert.com/pdfcheckout/cart/collectTotals/', { 8575 method: 'POST', 8576 headers: { 8577 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 8578 'X-Requested-With': 'XMLHttpRequest', 8579 'pragma': 'no-cache', 8580 'cache-control': 'no-cache' 8581 }, 8582 mode: 'cors', 8583 credentials: 'include', 8584 body: formData 8585 }).then(response => { 8586 window.location.reload(); 8587 }) 8588 } 8589 } 8590 Alpine.nextTick(() => {window.dispatchEvent( 8591 new CustomEvent( 8592 "visitor_country_change", 8593 { detail: country } 8594 ) 8595 )}); 8596 return !!ALLOWED_SHIPPING_COUNTRIES?.[country]; 8597 }, 8598 8599 get visitorCountryName() { 8600 return ALLOWED_SHIPPING_COUNTRIES?.[this.visitorCountry] || ''; 8601 }, 8602
8603 getGlopalHtmlLang() { 8604 return document.documentElement.contains(document.querySelector('glopal')) ? 8605 document.documentElement.lang.substr(3, 2).toUpperCase() : ''; 8606 8607 } 8608 }); 8609 }) 8610</script>
vendor: 1 bytes, line 8610
8610
8611<script> 8612document.addEventListener('alpine:init', () => { 8613 Alpine.store('minicart', { 8614 cart: { 8615 summary_count: 0, 8616 subtotal: '0', 8617 items: [], 8618 isMergedCart: false 8619 }, 8620 init() { 8621 window.addEventListener( 8622 "private-content-loaded", 8623 (event) => { 8624 event.detail?.data?.cart?.items && (this.cart = event.detail.data.cart); 8625 this.isMergedCart = this.cart.items.some(i => i?.merged_qty > 0); 8626 } 8627 ); 8628 } 8629 }); 8630}) 8631</script>
vendor: 1 bytes, line 8631
8631
8632<script> 8633 (function () { 8634 const modals = []; 8635 let lastHide = 0; 8636 8637 function resolveElement($refs, value) { 8638 if (!value) return null; 8639 if (value instanceof Element) return value; 8640 if (typeof value === 'string') { 8641 try { 8642 return ($refs && $refs[value]) || document.querySelector(value) || null; 8643 } catch (e) {} 8644 } 8645 return null; 8646 } 8647 8648 function determineTrigger($refs, dialog, trigger) { 8649 if (!trigger && dialog?.target instanceof HTMLElement) { 8650 return dialog.target; 8651 } 8652 8653 if (typeof dialog === 'string' && trigger?.target instanceof HTMLElement) { 8654 return trigger.target; 8655 } 8656 8657 return resolveElement($refs, trigger); 8658 } 8659 8660 function setFocusFirstElement(dialogElement) { 8661 if (!dialogElement) return; 8662 8663 window.setTimeout(() => { 8664 const candidates = dialogElement.querySelectorAll('[x-focus-first]'); 8665 for (const candidate of candidates) { 8666 if (candidate.closest('dialog') === dialogElement) { 8667 candidate.focus(); 8668 return; 8669 } 8670 } 8671 }, 50); 8672 } 8673 8674 window.hyva.modal = function(options = {}) { 8675 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 8676 try { 8677 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 8678 } catch (e) { 8679 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 8680 } 8681 } 8682 8683 const config = Object.assign({ 8684 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 8685 transitionEnterStart: 'opacity-0', 8686 transitionEnterEnd: 'opacity-100', 8687 transitionLeave: 'transition ease-in duration-300', 8688 transitionLeaveStart: 'opacity-100', 8689 transitionLeaveEnd: 'opacity-0', 8690 }, options); 8691 8692 return { 8693 opened: {}, 8694 show(dialog, trigger) { 8695 const name = typeof dialog === 'string' ? dialog : config.dialog; 8696 if (!name || this.opened[name]) return; 8697 8698 this.opened[name] = true; 8699 const focusTarget = determineTrigger(this.$refs, dialog, trigger); 8700 const dialogEl = this.$refs && this.$refs[name]; 8701 const frame = { name, instance: this, focusTarget, time: Date.now() }; 8702 modals.push(frame); 8703 setFocusFirstElement(dialogEl); 8704 return new Promise(resolve => { frame.resolve = resolve; }); 8705 }, 8706 cancel() { 8707 this.hide(false); 8708 }, 8709 ok() { 8710 this.hide(true); 8711 }, 8712 hide(value) { 8713 if (Date.now() - lastHide < config.duration) return; 8714 lastHide = Date.now(); 8715 8716 const modal = modals.pop(); 8717 if (!modal) return; 8718 8719 modal.instance.opened[modal.name] = false; 8720 8721 const focusTarget = modal.focusTarget; 8722 focusTarget && window.setTimeout(() => focusTarget.focus(), config.duration + 50); 8723 modal.resolve && modal.resolve(value); 8724 }, 8725 /** 8726 * @deprecated Use dialogConfig() instead, which is used by the default modal-container.phtml template. 8727 * This method is kept for backwards compatibility with custom container templates. 8728 */ 8729 overlay(dialog) { 8730 dialog = this.$el.dataset.dialogRefName || dialog; 8731 const name = typeof dialog === 'string' ? dialog : config.dialog; 8732 if (this.$el.tagName !== 'DIALOG' && ! window.hyva.modal.legacyModalCompatibility) { 8733 console.warn( 8734 '[hyva] Deprecated modal markup detected (x-bind="overlay" on a non-dialog element' + 8735 (name ? ` for "${name}"` : '') + ').\n' + 8736 'Escape and click-outside closing are not available for such dialogs anymore.\n' + 8737 'Install hyva-themes/magento2-legacy-modal-compatibility or migrate to the native <dialog> markup.' 8738 ); 8739 } 8740 return Object.assign({}, this.dialogConfig(name), { 8741 ['@hyva-modal-show.window'](event) { 8742 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 8743 } 8744 }); 8745 }, 8746 dialogConfig(name) { 8747 name = name || this.$el.dataset.dialogRefName || config.dialog; 8748 return { 8749 ['x-show']: () => name ? this.opened[name] : false, 8750 ['x-transition:enter']: config.transitionEnter, 8751 ['x-transition:enter-start']: config.transitionEnterStart, 8752 ['x-transition:enter-end']: config.transitionEnterEnd, 8753 ['x-transition:leave']: config.transitionLeave, 8754 ['x-transition:leave-start']: config.transitionLeaveStart, 8755 ['x-transition:leave-end']: config.transitionLeaveEnd, 8756 ['@hyva-modal-show.window'](event) { 8757 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide); 8758 }, 8759 }; 8760 },
8761 showDialogOnInit() { 8762 const name = this.$el.dataset.dialogRefName; 8763 if (name) { 8764 this.show(name); 8765 } 8766 } 8767 }; 8768 } 8769 8770 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length - 1] 8771 8772 window.hyva.modal.pop = function () { 8773 if (modals.length > 0) { 8774 modals[modals.length - 1].instance.hide(); 8775 } 8776 } 8777 8778 /** 8779 * @deprecated Native <dialog> handles focus trapping automatically. 8780 * Calling this function has no effect. Kept for backwards compatibility. 8781 */ 8782 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) {} 8783 8784 /** 8785 * @deprecated Native <dialog> with x-htmldialog handles ESC key and click-outside events. 8786 * These functions have no effect. Kept for backwards compatibility. 8787 */ 8788 window.hyva.modal.eventListeners = { 8789 keydown: event => {}, 8790 click: event => {} 8791 }; 8792 })(); 8793 8794 window.addEventListener('alpine:init', () => { 8795 Alpine.data('hyvaModal', window.hyva.modal); 8796 }, {once: true}); 8797</script>
8797 8798<style> 8799 .wishlist-list {background-color: rgb(241, 243, 242);} 8800</style> 8801<datalist id="presets"> 8802<option value="#ffb3ba">Red</option> 8803<option value="#ffdfba">Orange</option> 8804<option value="#ffffba">Yellow</option> 8805<option value="#baffc9">Green</option> 8806<option value="#bae1ff">Blue</option> 8807</datalist> 8808
8809<script> 8810 function getTextColorForBackground(color) { // See https://css-tricks.com/switch-font-color-for-different-backgrounds-with-css/ 8811 if (!color) { 8812 return ''; 8813 } 8814 color = color.charAt(0) === '#' ? color.substring(1) : color; 8815 if (color.length !== 6) { 8816 return ''; 8817 } 8818 const THRESHOLD = .5; 8819 const parts = (color.match(/.{1,2}/g) ?? []).map(h => parseInt(h, 16)); 8820 const red = .2126 * parts[0]; 8821 const green = .7152 * parts[1]; 8822 const blue = .0722 * parts[2]; 8823 const textColor = -10000000 * (((red + green + blue) / 255) - THRESHOLD); 8824 return `hsl(0, 0%, ${textColor}%`; 8825 } 8826 8827 8828 function initMWishlistPopup() { 8829 return { 8830 ...hyva.modal(), 8831 8832 isProcessing: false, 8833 excludedListIds: [], 8834 newListActive: false, 8835 newListName: '', 8836 newListColor: '', 8837 addItemToWishlistUrl: 'https://www.jardindupicvert.com/mwishlist/item/add/', 8838 removeItemFromWishlistUrl: 'https://www.jardindupicvert.com/mwishlist/item/remove/', 8839 addNewListUrl: 'https://www.jardindupicvert.com/mwishlist/wishlist/create/', 8840 deleteListUrl: 'https://www.jardindupicvert.com/mwishlist/wishlist/delete/', 8841 moveItemsUrl: 'https://www.jardindupicvert.com/mwishlist/item/move/', 8842 copyItemsUrl: 'https://www.jardindupicvert.com/mwishlist/item/copy/', 8843 actionNote: '', 8844 8845 eventListeners: { 8846 // Called from vmAMWishlist (js/alpine-data.phtml) 8847 ['@update-product-in-wishlist.window'](event) { 8848 const params = { ...event.detail }; 8849 this.loginIfRequired(() => {this.updateProductInWishlist(params);}); 8850 }, 8851 // Called from mwishlist popup or wishlists page 8852 ['@create-new-wishlist.window'](event) { 8853 this.addNewList(event.detail); 8854 }, 8855 // Called from wishlists page or wishlist detail page 8856 ['@delete-wishlist.window'](event) { 8857 this.deleteList(event.detail); 8858 }, 8859 // copy|move items from a wish list to another: called from wishlists detail page 8860 ['@change-wishlist-items.window'](event) { 8861 const params = { ...event.detail }; 8862 if (params?.action === 'move' || params?.action === 'copy' || params?.action === 'addtocart') { 8863 let formData = {}; 8864 if (params?.form) { 8865 formData = this.extractFormData(params.form); 8866 params.data.data = { ...params.data.data, ...formData }; 8867 } 8868 this.changeItemsToList(params?.data?.action, params?.data?.data); 8869 } 8870 }, 8871 // Called from wishlists detail page (search results) 8872 ['@add-product-to-wishlist.window'](event) { 8873 const params = { ...event.detail }; 8874 this.loginIfRequired(() => {this.addProductToWishlist(params);}); 8875 8876 }, 8877 // Called from wishlists detail page 8878 ['@remove-item-from-wishlist.window'](event) { 8879 const params = { ...event.detail }; 8880 if (params?.wishlist && params?.item) { 8881 this.loginIfRequired(() => {this.removeProductFromWishlist(params, [{ list: params?.wishlist, item: params?.item }]);}); 8882 } 8883 }, 8884 }, 8885 8886 getLists() { 8887 return Alpine.store('amwishlist').loaded ? Alpine.store('amwishlist').lists : []; 8888 }, 8889 8890 // If customer is not logged in, we open login in panel 8891 loginIfRequired(callback = false) { 8892 if (!Alpine.store('customer').isLoggedIn) { 8893 window.dispatchEvent( 8894 new CustomEvent('toggle-authentication', { 8895 detail: { 8896 callback: callback, 8897 text: "Veuillez vous connecter à votre compte pour pouvoir gérer vos listes de favoris." 8898 } 8899 }) 8900 ); 8901 } else if (typeof callback === 'function') { 8902 callback(); 8903 } 8904 }, 8905 8906 /** 8907 * Enable customer to add/remove product to/from wishlist 8908 * A [remove] button is add to every wishlist the product is included in 8909 * A [add] button is add to every wishlist the product isn't included in 8910 * 8911 * @param params 8912 */ 8913 updateProductInWishlist(params) { 8914 if(this.isProcessing) { 8915 return; 8916 } 8917 const remove = (list, item) => { 8918 this.ajaxAction( 8919 this.removeItemFromWishlistUrl, 8920 { item: item, wishlist_id: list, ...params } 8921 ); 8922 }; 8923 const add = (id) => { 8924 this.ajaxAction( 8925 this.addItemToWishlistUrl, 8926 { wishlist_id: id, ...params } 8927 ); 8928 }; 8929 // We add a "isIn" attribute to each list whether it includes the product or not
8930 this.getLists().forEach(l => { 8931 l.isIn = !!l.items.find(i => i.product_id == params.product); 8932 }); 8933 const wishlistItems = this.getWishlistItemsForProductId(params.product); 8934 this.actionNote = wishlistItems.length ? 8935 "Ajouter ou supprimer cet article de vos listes de favoris." : 8936 "Choisissez une liste à laquelle ajouter cet article." 8937 8938 this.show().then( 8939 (id) => { 8940 const wishlist = this.getWishlistById(id); 8941 if (wishlist) { 8942 if (wishlist.isIn) { 8943 const item = wishlistItems.find(i => i.list == id)?.item; 8944 if (item) { 8945 remove(id, item); 8946 } 8947 } else { 8948 add(id); 8949 } 8950 } 8951 } 8952 ); 8953 }, 8954 8955 /** 8956 * Required key: product 8957 * Extra keys from wishlist search lock: wishlist, block 8958 * @param params 8959 */ 8960 addProductToWishlist(params) { 8961 if(this.isProcessing) { 8962 return; 8963 } 8964 const add = (id) => { 8965 this.ajaxAction( 8966 this.addItemToWishlistUrl, 8967 { wishlist_id: id, ...params } 8968 ); 8969 }; 8970 params.qty = params?.qty || 1; 8971 if (params?.wishlist) { 8972 add(params.wishlist); 8973 } else { 8974 this.show().then( 8975 (id) => { 8976 if (id) { 8977 add(id); 8978 } 8979 } 8980 ); 8981 } 8982 }, 8983 8984 /** 8985 * items pattern []{list: int, item: int} 8986 */ 8987 removeProductFromWishlist(params, items = []) { 8988 const remove = (list, item) => { 8989 this.ajaxAction( 8990 this.removeItemFromWishlistUrl, 8991 { item: item, wishlist_id: list, ...params } 8992 ); 8993 }; 8994 this.actionNote = "Choisissez une liste de destination."; 8995 const wishlistItems = items || this.getWishlistItemsForProductId(params.product); 8996 if (wishlistItems.length) { 8997 if (wishlistItems.length === 1) { 8998 remove(wishlistItems[0].list, wishlistItems[0].item); 8999 } else { 9000 const lists = wishlistItems.map(i => i.list); 9001 this.excludedListIds = this.getLists().filter(l => !lists.includes(l.wishlist_id)).map(l => l.wishlist_id); 9002 this.show().then( 9003 (id) => { 9004 if (id) { 9005 const item = wishlistItems.find(i => i.list == id)?.item; 9006 remove(id, item); 9007 } 9008 } 9009 ); 9010 } 9011 } 9012 }, 9013 9014 changeItemsToList(actionUrl, params) { 9015 const change = (params) => { 9016 this.ajaxAction( 9017 actionUrl, 9018 { ...params } 9019 ); 9020 }; 9021 const listFrom = this.getWishlistById(params?.wishlist_id); 9022 if (listFrom) { 9023 params['wishlist[name]'] = listFrom.name; 9024 params['wishlist[type]'] = 0; 9025 this.excludedListIds = [listFrom.wishlist_id]; 9026 this.show().then( 9027 (id) => { 9028 if (id) { 9029 params.to_wishlist_id = id; 9030 change(params); 9031 } 9032 } 9033 ); 9034 } 9035 }, 9036 9037 /** 9038 * May be called within the mwishlist popup (no 'name' provided, will require reloading sections) or 9039 * within the wishlists page ('name' and 'blocks') 9040 */ 9041 addNewList(params) { 9042 const name = params?.name || this.newListName; 9043 const color = params?.color || this.newListColor; 9044 this.ajaxAction( 9045 this.addNewListUrl, 9046 { 9047 'wishlist[name]': name, 9048 'wishlist[color]': color, 9049 'wishlist[type]': 1, 9050 ...(params || {}) 9051 }, 9052 () => { 9053 this.newListActive = false;
9054 this.newListName = ''; 9055 this.newListColor = ''; 9056 } 9057 ); 9058 }, 9059 9060 deleteList(params) { 9061 const id = params?.id; 9062 if (id && window.confirm("Ãtes-vous sûr(e) de vouloir supprimer cette liste de favoris ?")) { 9063 this.ajaxAction( 9064 this.deleteListUrl, 9065 { 'wishlist_id': id, ...(params || {}) } 9066 ); 9067 } 9068 }, 9069 9070 ajaxAction(url, formData) { 9071 this.processing = true; 9072 formData.form_key = hyva.getFormKey(); 9073 if (formData?.block === 'customer.wishlist') { 9074 document.querySelector('.amwishlist-items')?.classList?.add('u-loader'); 9075 } 9076 fetch( 9077 url, 9078 { 9079 method: 'POST', 9080 headers: { 9081 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 9082 'X-Requested-With': 'XMLHttpRequest', 9083 'pragma': 'no-cache', 9084 'cache-control': 'no-cache' 9085 }, 9086 mode: 'cors', 9087 credentials: 'include', 9088 body: Object 9089 .keys(formData) 9090 .map(value => `${value}=${encodeURIComponent(formData[value])}`) 9091 .join('&') 9092 } 9093 ).then( 9094 (response) => { 9095 console.log(response); 9096 this.excludedListIds = []; 9097 const redirectUrl = formData?.redirect || response?.backUrl; 9098 if (redirectUrl) { 9099 window.location.href = redirectUrl; 9100 } 9101 if (formData.reload) { 9102 window.location.reload(); 9103 } 9104 this.reloadSectionData(); 9105 if (formData.callback && typeof formData.callback === 'function') { 9106 formData.callback(response); 9107 } 9108 if (formData?.block === 'customer.wishlist') { 9109 document.querySelector('.amwishlist-items')?.classList?.remove('u-loader'); 9110 } 9111 return response.json() 9112 } 9113 ).then( 9114 (response) => { 9115 if (response.blocks) { 9116 this.reloadBlocks(response.blocks); 9117 // self._toggleMassActions(); 9118 } 9119 /** 9120 if (document.querySelector('body.checkout-cart-index').length) { 9121 window.location.reload(); 9122 return true; 9123 }*/ 9124 this.processing = false; 9125 this.newListActive = false; 9126 } 9127 ); 9128 }, 9129 9130 getWishlistById(id) { 9131 return this.getLists().find((l) => l.wishlist_id == id); 9132 }, 9133 9134 getWishlistItem(list, id) { 9135 const wishlist = this.getWishlistById(list); 9136 return wishlist ? wishlist.items.find(i => i.wishlist_item_id == id) : null; 9137 }, 9138 9139 extractFormData(formId) { 9140 const form = document.querySelector(formId); 9141 const data = new FormData(form); 9142 let formData = {}; 9143 for (let [key, value] of data) { 9144 if (key.includes('qty') || key.includes('selected') || key.includes('simple_id')) { 9145 formData[key] = value; 9146 } 9147 } 9148 return formData; 9149 }, 9150 9151 /** 9152 * Get wishlist items for a given product 9153 * return [{list: int, item: int}] 9154 */ 9155 getWishlistItemsForProductId(productId) { 9156 const items = [];
9157 this.getLists().forEach(l => { 9158 const item = l.items.find(i => i.product_id == productId); 9159 if (item) { 9160 items.push({ list: l.wishlist_id, item: item.wishlist_item_id }); 9161 } 9162 }) 9163 return items; 9164 }, 9165 9166 // See https://docs.hyva.io/hyva-themes/writing-code/working-with-sectiondata.html 9167 reloadSectionData() { 9168 hyva.setCookie('mage-cache-sessid', '', -1, true); // remove the cookie 9169 window.dispatchEvent( 9170 new CustomEvent("reload-customer-section-data") 9171 ); // reload the data 9172 }, 9173 9174 reloadBlocks(blocks) { 9175 for (const [name, content] of Object.entries(blocks)) { 9176 const block = document.createElement('div'); 9177 block.innerHTML = content; 9178 let selectors = []; 9179 switch (name) { 9180 case 'mwishlist.list.contrainer': 9181 selectors = ['content-tabs-block', 'tabs-block']; 9182 break; 9183 case 'customer.wishlist': 9184 selectors = ['items-block', 'pager']; 9185 break; 9186 } 9187 selectors.forEach((s) => { 9188 const srcElmt = block.querySelector('[data-amwishlist-js="' + s + '"]'); 9189 const destElmt = document.querySelector('[data-amwishlist-js="' + s + '"]'); 9190 if (srcElmt && destElmt) { 9191 destElmt.innerHTML = srcElmt.innerHTML; 9192 } 9193 }); 9194 } 9195 } 9196 } 9197 } 9198</script>
9198 9199<aside x-data="initMWishlistPopup()" 9200 x-bind="eventListeners" 9201 class="amwishlist-popup-block" 9202> 9203<div x-cloak 9204 x-bind="overlay()" 9205 class="w-screen fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-modal" 9206 > 9207<div x-ref="dialog" 9208 role="dialog" 9209 class="relative inline-block w-full md:max-w-xl m-2 overflow-auto bg-white shadow-xl rounded-lg p-4" 9210 > 9211<div x-focus-first 9212 @click.prevent="hide()" 9213 class="absolute top-2 right-2 cursor-pointer" 9214 > 9215<svg class="w-8 h-8 text-primary cursor-pointer"> 9216 <use xlink:href="#close-symbol"></use> 9217 </svg> 9218</div> 9219<div> 9220<div class="amwishlist-title mb-8"> 9221<p class="amwishlist-header mb-4 text-lg font-bold text-center"> 9222Vos listes de favoris </p> 9223</div> 9224<p x-html="actionNote" 9225 x-show="actionNote" 9226 class="my-2 text-sm"></p> 9227 9228<div class="amwishlist-tabs-block -block flex flex-col gap-2 max-h-[250px] overflow-y-auto pr-4 font-sm"> 9229<template x-for="(list, index) in getLists()" 9230 :key="list.wishlist_id" 9231 > 9232<div @click.prevent="hide(list.wishlist_id)" 9233 :class="{ 'hidden': excludedListIds.includes(list.wishlist_id), ['wishlist-' + index]: true }" 9234 class="wishlist-list inline-flex flex-row items-center justify-between p-2 border border-border-lighter rounded-xl text-sm cursor-pointer hover:shadow-xl" 9235 :style="`background-color: ${list.color}; color: ${getTextColorForBackground(list.color) || '#000000'}`" 9236 list="presets" 9237 > 9238<span> 9239<span x-text="list.name" 9240 class="font-bold leading-tight hover:underline"></span> 9241<span class="text-xs"> 9242<span x-text="list.items_count"></span> 9243<span x-show="list.items_count < 2">article</span> 9244<span x-show="list.items_count > 1">articles</span> 9245</span> 9246</span> 9247<button class="btn btn-secondary btn-size-xs"> 9248<span x-show="list.isIn">Supprimer</span> 9249<span x-show="!list.isIn">Ajouter</span> 9250</button> 9251</div> 9252</template> 9253</div> 9254 9255<div class="amwishlist-list-block amwishlist-newlist-block my-4"> 9256<div @click.prevent="newListActive = !newListActive; $nextTick(() => {if (newListActive) {$refs?.newListInput?.focus();}})" 9257 class="mt-8 cursor-pointer" 9258 > 9259<span class="text-2xl">+</span> 9260<span class="hover:underline"> 9261Créer une nouvelle liste </span> 9262</div> 9263 9264<div x-show="newListActive" 9265 class="amwishlist-newlist flex flex-col xs:flex-row gap-4 items-center justify-between my-2" 9266 > 9267<div class="form-field field required grow"> 9268<label class="label" 9269 for="wishlist-name" 9270 > 9271<span>Nom de la liste<sup>*</sup></span> 9272</label> 9273<div class="control"> 9274<input x-model="newListName" 9275 name="wishlist-name" 9276 type="text" 9277 class="amwishlist-input form-input" 9278 maxlength="32" 9279 required 9280 /> 9281</div> 9282</div> 9283<span class="flex items-center gap-2 justify-center"> 9284<input x-model="newListColor" 9285 type="color" 9286 class="w-8 h-8" 9287 required 9288 /> 9289<button @click.prevent="$dispatch('create-new-wishlist')" 9290 class="amwishlist-button btn btn-primary btn-size-sm" 9291 type="button" 9292 > 9293Créer </button> 9294</span> 9295</div> 9296</div> 9297</div> 9298</div> 9299</div> 9300</aside>
9301<script> 9302 function hyvaModalContent() { 9303 return { 9304 modalContentElement: document.querySelector('#hyva-modal-content [data-role="content"]'), 9305 isFullScreen: false, 9306 aspectRatio: 'auto', 9307 9308 loadContent(content) { 9309 var content = event?.detail; 9310 switchBodyOverflow(false); /** see js-library.phtml */ 9311 this.modalContentElement.innerHTML = ''; 9312 const element = content?.template || content; 9313 let popupContent = ''; 9314 try { 9315 const contentElement = document.querySelector(element); 9316 if (contentElement instanceof HTMLElement) { 9317 this.isFullScreen = contentElement.hasAttribute('data-zoom'); 9318 this.aspectRatio = this.isFullScreen ? contentElement.getAttribute('data-zoom') || 'auto' : 'auto'; 9319 if (contentElement.tagName === 'TEMPLATE') { 9320 popupContent = contentElement.content.children[0].cloneNode(true); 9321 } else { 9322 popupContent = contentElement.innerHTML; 9323 } 9324 } 9325 } catch(error) { 9326 popupContent = content?.innerHTML || content; 9327 } finally { 9328 if (popupContent) { 9329 popupContent instanceof HTMLElement ? 9330 this.modalContentElement.append(popupContent) : 9331 this.modalContentElement.innerHTML = popupContent; 9332 this.processContent(); 9333 this.show(); 9334 typeof content?.callback === 'function' && content?.callback(); 9335 } 9336 } 9337 }, 9338 9339 processContent() { 9340 const srcs = this.modalContentElement.querySelectorAll('[src]'); 9341 for (let i = 0; i < srcs.length; ++i) { 9342 const src = srcs[i]; 9343 src.classList.add('u-loader', 'w-full'); 9344 src.onload = () => {src.classList.remove('u-loader')}; 9345 } 9346 }, 9347 9348 // We stop all possible players before closing popup 9349 shutAndClose() { 9350 this.hide(); 9351 setTimeout(() => { 9352 switchBodyOverflow(true); 9353 this.modalContentElement.innerHTML = ''; 9354 }, 500); 9355 }, 9356 9357 getModalClasses() { 9358 return { 9359 'max-h-screen-75 overflow-auto': !this.isFullScreen, 9360 'min-w-xs max-h-screen overflow-none': this.isFullScreen 9361 } 9362 }, 9363 9364 getModalStyle() { 9365 return {'aspect-ratio': this.isFullScreen ? this.aspectRatio : 'auto'} 9366 }, 9367 9368 getContainerClass() { 9369 return { 9370 'overflow-auto': !this.isFullScreen, 9371 'h-full': this.isFullScreen 9372 } 9373 }, 9374 9375 getContentClass() { 9376 return {'h-full': this.isFullScreen} 9377 } 9378 } 9379 } 9380 9381 window.addEventListener( 9382 'alpine:init', 9383 () => Alpine.data( 9384 'initHyvaModalContent', () => { 9385 return Object.assign( 9386 hyva.modal.call(this), 9387 hyvaModalContent() 9388 ); 9389 } 9390 ), 9391 {once: true} 9392 ); 9393</script>
9393 9394 9395<div x-data="initHyvaModalContent" 9396 x-defer="idle" 9397 id="hyva-modal-content" 9398 @open-modal-content.window="loadContent" 9399 @close-modal-content.window="shutAndClose" 9400> 9401<div x-cloak 9402 x-bind="overlay" 9403 class="w-screen fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-modal" 9404 > 9405<div x-ref="dialog" 9406 role="dialog" 9407 @click.outside.prevent.stop="shutAndClose" 9408 class="relative w-full sm:w-3/4 md:w-1/2 xl:w-1/3 p-4 sm:p-8 xl:p-12 bg-white shadow-2xl rounded-lg" 9409 :class="getModalClasses" 9410 :style="getModalStyle" 9411 > 9412<div x-focus-first 9413 @click="shutAndClose" 9414 class="absolute z-1 top-1 right-1 bg-white cursor-pointer" 9415 > 9416<svg class="w-6 sm:w-8 h-6 sm:h-8 text-primary hover:text-primary-lighter"> 9417 <use xlink:href="#close-symbol"></use> 9418 </svg> 9419</div> 9420<div class="max-sm:text-sm" 9421 :class="getContainerClass" 9422 > 9423<div data-role="content" 9424 :class="getContentClass" 9425 ></div> 9426</div> 9427</div> 9428</div> 9429</div>
9430<script> 9431 (function () { 9432 if (! window.hyva || ! window.hyva.modal) { 9433 return; 9434 } 9435 9436 window.hyva.modal.legacyModalCompatibility = true; 9437 9438 const refElement = frame => 9439 frame && frame.instance && frame.instance.$refs && frame.instance.$refs[frame.name]; 9440 9441 const isLegacyElement = el => !! el && el.tagName !== 'DIALOG'; 9442 9443 const isOverlayDisabled = el => !! el && el.hasAttribute('x-no-overlay'); 9444 9445 window.hyva.modal.eventListeners = Object.assign(window.hyva.modal.eventListeners || {}, { 9446 keydown: event => { 9447 if (event.key !== 'Escape') { 9448 return; 9449 } 9450 const frame = window.hyva.modal.peek(); 9451 if (frame && isLegacyElement(refElement(frame))) { 9452 frame.instance.hide(); 9453 } 9454 }, 9455 click: event => { 9456 const frame = window.hyva.modal.peek(); 9457 const dialog = refElement(frame); 9458 if (! frame || ! isLegacyElement(dialog)) { 9459 return; 9460 } 9461 if (frame.time + 50 < Date.now() && ! isOverlayDisabled(dialog) && 9462 ! dialog.contains(event.target) 9463 ) { 9464 frame.instance.hide(); 9465 } 9466 } 9467 }); 9468 9469 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 9470 document.addEventListener('click', window.hyva.modal.eventListeners.click); 9471 9472 window.hyva.modal = new Proxy(window.hyva.modal, { 9473 apply(target, thisArg, args) { 9474 const instance = Reflect.apply(target, thisArg, args); 9475 9476 const originalShow = instance.show; 9477 instance.show = function (dialog, trigger) { 9478 const frameBefore = window.hyva.modal.peek(); 9479 const openerCandidate = document.activeElement; 9480 const result = originalShow.call(this, dialog, trigger); 9481 const frame = window.hyva.modal.peek(); 9482 if (! frame || frame === frameBefore) { 9483 return result; } 9484 const el = refElement(frame); 9485 if (isLegacyElement(el)) { 9486 frame.legacyFocusTarget = openerCandidate; 9487 if (! isOverlayDisabled(el)) { 9488 document.body.classList.add('overflow-hidden'); 9489 this.$nextTick 9490 ? this.$nextTick(() => hyva.trapFocus(el)) 9491 : hyva.trapFocus(el); 9492 } 9493 window.setTimeout(() => { 9494 const focusFirst = el.querySelector('[x-focus-first]'); 9495 focusFirst && focusFirst.focus(); 9496 }, 50); 9497 } 9498 return result; 9499 }; 9500 9501 const originalHide = instance.hide; 9502 instance.hide = function (value) { 9503 const frame = window.hyva.modal.peek(); 9504 const el = refElement(frame); 9505 const wasLegacy = frame && isLegacyElement(el); 9506 const result = originalHide.call(this, value); 9507 if (! wasLegacy || window.hyva.modal.peek() === frame) { 9508 return result; } 9509 hyva.releaseFocus(el); 9510 9511 const next = window.hyva.modal.peek(); 9512 const nextEl = next ? refElement(next) : null; 9513 if (isLegacyElement(nextEl) && ! isOverlayDisabled(nextEl)) { 9514 hyva.trapFocus(nextEl); 9515 } else { 9516 document.body.classList.remove('overflow-hidden'); 9517 } 9518 9519 const focusTarget = frame.legacyFocusTarget; 9520 focusTarget && window.setTimeout(() =>
9520 focusTarget.focus(), 50); 9521 9522 return result; 9523 }; 9524 9525 return instance; 9526 } 9527 }); 9528 })(); 9529</script>
vendor: 1 bytes, line 9529
9529
9530<script> 9531document.addEventListener('alpine:init', () => { 9532 Alpine.store('amwishlist', { 9533 lists: [], 9534 loaded: false, 9535 init() { 9536 window.addEventListener( 9537 "private-content-loaded", 9538 (event) => { 9539 this.loaded = true; 9540 this.lists = event.detail.data?.mwishlist?.wishlist_list?.[1] || []; 9541 Alpine.nextTick(() => { 9542 window.dispatchEvent(new CustomEvent("amwishlist-alpine-init")) 9543 }); 9544 } 9545 ); 9546 } 9547 }); 9548 9549 Alpine.data('vmAMWishlist', (id, fn = null) => ({ 9550 id: id, 9551 callback: fn, 9552 get isIn() { 9553 return Alpine.store('amwishlist').loaded 9554 && Alpine.store('amwishlist').lists.filter(l => l.items.find(i => i.product_id == id)).length > 0; 9555 }, 9556 get title() { 9557 return this.isIn ? "Enlever de vos favoris" : 9558 "Ajouter à mes listes dâenvie"; 9559 }, 9560 get color() { 9561 return Alpine.store('amwishlist').loaded 9562 && (Alpine.store('amwishlist').lists.find(l => l.items.find(i => i.product_id == id))?.color || ''); 9563 }, 9564 9565 trigger: { 9566 ['@click.prevent']() { 9567 if (Alpine.store('amwishlist').loaded) { 9568 this.$dispatch('update-product-in-wishlist', { 9569 'product': this.id, 9570 'callback': this.callback 9571 }); 9572 } 9573 } 9574 } 9575 })) 9576}) 9577</script>
9577 9578
9579<script> 9580 'use strict'; 9581 (() => { 9582 function _calculateStrength({elementID, valid}) { 9583 const password = document.getElementById(elementID), 9584 emailElm = document.getElementById('email_address'); 9585 let displayScore; 9586 // Display score is based on combination of whether password is empty, valid, and zxcvbn strength 9587 if (!password || !password.value) { 9588 displayScore = 0; 9589 } else { 9590 // We should only perform this check in case there is an email field on screen 9591 if (emailElm && password.value && emailElm.value && 9592 password.value.toLowerCase() === emailElm.value.toLowerCase()) { 9593 displayScore = 1; 9594 } else { 9595 const zxcvbnScore = zxcvbn(password.value).score; 9596 displayScore = valid && zxcvbnScore > 0 ? zxcvbnScore : 1; 9597 } 9598 } 9599 9600 _displayStrength(displayScore); 9601 } 9602 9603 function _displayStrength(displayScore) { 9604 let strengthLabel = '', 9605 className; 9606 9607 switch (displayScore) { 9608 case 0: 9609 strengthLabel = "Aucun\u0020mot\u0020de\u0020passe"; 9610 className = 'password-none'; 9611 break; 9612 9613 case 1: 9614 strengthLabel = "Faible"; 9615 className = 'password-weak'; 9616 break; 9617 9618 case 2: 9619 strengthLabel = "Moyen"; 9620 className = 'password-medium'; 9621 break; 9622 9623 case 3: 9624 strengthLabel = "Elev\u00E9"; 9625 className = 'password-strong'; 9626 break; 9627 9628 case 4: 9629 strengthLabel = "Tr\u00E8s\u0020\u00E9lev\u00E9"; 9630 className = 'password-very-strong'; 9631 break; 9632 } 9633 const meterElm = document.getElementById('password-strength-meter-container'), 9634 meterLabelElm = document.getElementById('password-strength-meter-label'); 9635 meterElm.className = ''; 9636 meterElm.classList.add(className); 9637 meterLabelElm.textContent = strengthLabel; 9638 } 9639 9640 let loading = false; 9641 const callbacks = []; 9642 9643 function loadZxcvbn(cb) { 9644 callbacks.push(cb); 9645 if (loading) return; 9646 loading = true; 9647 9648 const script = document.createElement('script'); 9649 script.type = 'text/javascript'; 9650 script.src = 'https\u003A\u002F\u002Fwww.jardindupicvert.com\u002Fstatic\u002Fversion1790796154\u002Ffrontend\u002FPicVert\u002Fhyva\u002Ffr_FR\u002Fjs\u002Fzxcvbn.min.js'; 9651 script.async = true; 9652 script.onload = () => callbacks.forEach(cb => cb()); 9653 document.head.appendChild(script); 9654 } 9655 9656 window.addEventListener('password-validate', function (evt) { 9657 const meterElm = document.getElementById('password-strength-meter-container'), 9658 meterLabelElm = document.getElementById('password-strength-meter-label'); 9659 if (meterElm && meterLabelElm) { 9660 if (evt.detail && evt.detail.elementID) { 9661 const cb = () => _calculateStrength(evt.detail); 9662 window.zxcvbn ? cb() : loadZxcvbn(cb) 9663 } 9664 } 9665 }); 9666 9667 9668 document.addEventListener('DOMContentLoaded', () => { 9669 hyva && hyva.formValidation && hyva.formValidation.addRule('password-strength', function(value, options, field, context) { 9670 let counter = 0; 9671 const minCharacterSets = options.minCharacterSets !== undefined ? options.minCharacterSets : 1; 9672 if (value.match(/\d+/)) { 9673 counter++; 9674 } 9675 9676 if (value.match(/[a-z]+/)) { 9677 counter++; 9678 } 9679 9680 if (value.match(/[A-Z]+/)) { 9681 counter++; 9682 } 9683 9684 if (value.match(/[^a-zA-Z0-9]+/)) { 9685 counter++; 9686 } 9687 9688 queueMicrotask(() => { 9689 window.dispatchEvent(new CustomEvent('password-validate', { detail: {
9690 elementID: field.element.id || 'password', 9691 valid: field.state.valid 9692 }})); 9693 }); 9694 9695 if (counter < minCharacterSets) { 9696 const missing = minCharacterSets - counter; 9697 return hyva.str('The\u0020password\u0020must\u0020include\u0020at\u0020least\u0020\u00251\u0020or\u0020more\u0020of\u003A\u0020uppercase\u0020\u0028A\u002DZ\u0029,\u0020lowercase\u0020\u0028a\u002Dz\u0029,\u0020number\u0020and\u0020symbol.', missing); 9698 } 9699 return true; 9700 }); 9701 }) 9702 })(); 9703 9704</script>
vendor: 1 bytes, line 9704
9704
9705<script> 9706 function initDealCountDown(flashSaleData) { 9707 return { 9708 from: flashSaleData?.from || 0, 9709 expiry: flashSaleData?.to || 0, 9710 qty: flashSaleData?.qty || 0, 9711 isPending: false, 9712 isEnded: false, 9713 fromFormatted: null, 9714 remainingTime: null, 9715 days: 0, 9716 hours: 0, 9717 minutes: 0, 9718 seconds: 0, 9719 9720 init() { 9721 const now = new Date().getTime() / 1000; 9722 const fromDate = new Date(this.from * 1000); 9723 this.fromFormatted = ('0' + fromDate.getDate()).substr(-2) + '/' + ('0' + (fromDate.getMonth() + 1)).substr(-2) + '/' + fromDate.getFullYear(); 9724 this.isPending = this.from > now; 9725 this.isEnded = !this.isPending && now > this.expiry; 9726 if (!this.isPending && !this.isEnded) { 9727 this.updateRemainingTime(); 9728 let delay; 9729 if (this.days) { 9730 delay = 3600000; 9731 } else if (this.hours) { 9732 delay = 60000; 9733 } else { 9734 delay = 1000; 9735 } 9736 setInterval(() => { 9737 this.updateRemainingTime(); 9738 }, delay); 9739 } 9740 }, 9741 9742 updateRemainingTime() { 9743 this.remainingTime = parseInt(this.expiry - new Date().getTime() / 1000); 9744 let remaining = this.remainingTime; 9745 const d = Math.floor(this.remainingTime / 86400); 9746 this.days = d; 9747 remaining -= (86400 * d); 9748 const h = Math.floor(remaining / 3600); 9749 this.hours = h; 9750 remaining -= (3600 * h); 9751 const m = Math.floor(remaining / 60); 9752 this.minutes = m; 9753 remaining -= 60 * m; 9754 this.seconds = remaining; 9755 }, 9756 }; 9757 } 9758</script>
vendor: 1 bytes, line 9758
9758
9759<script> 9760document.addEventListener('alpine:init', () => { 9761 Alpine.data('vmMinisearch', () => ({ 9762 show: false, 9763 input: "", 9764 url: "https://www.jardindupicvert.com/search/ajax/suggest/", 9765 templates: null, 9766 minSearchLength: 1, 9767 searchResultsByType: {}, 9768 currentRequest: null, 9769 9770 getSearchResults: function () { 9771 let value = this.input.trim(); 9772 if (value.length < parseInt(this.minSearchLength, 10)) { 9773 this.searchResultsByType = []; 9774 this.show = false; 9775 return false; 9776 } 9777 let url = this.url + '?' + new URLSearchParams({q: value, _: Date.now()}).toString(); 9778 if (this.currentRequest !== null) { 9779 this.currentRequest.abort(); 9780 } 9781 this.currentRequest = new AbortController(); 9782 9783 fetch(url, { 9784 method: 'GET', 9785 signal: this.currentRequest.signal, 9786 }).then((response) => { 9787 if (response.ok) { 9788 return response.json(); 9789 } 9790 }).then((data) => { 9791 this.show = data.length > 0; 9792 // we restrict result types and force order 9793 this.searchResultsByType = data.reduce((acc, result) => { 9794 if (acc?.[result.type]) acc[result.type].push(result); 9795 return acc; 9796 }, {category: [], product: [], term: [], blog_post: []}); 9797 }).catch((error) => { 9798 console.log(error); 9799 }) 9800 }, 9801 9802 formatOutput(text) { 9803 let value = text.replace(this.input, '<span class="font-normal">' + this.input + '</span>'); 9804 const upperValue = this.input[0].toUpperCase() + this.input.substring(1); 9805 return value.replace(upperValue, '<span class="font-normal">' + upperValue + '</span>'); 9806 } 9807 })); 9808}) 9809</script>
vendor: 1 bytes, line 9809
9809
9810<script async src="//l.getsitecontrol.com/4m3x2om7.js"></script>
vendor: 1 bytes, line 9810
9810
9811<script type="text/json" id="default-section-data"> 9812 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorre"},"AT":{"name":"Autriche","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"BE":{"name":"Belgique"},"BG":{"name":"Bulgarie"},"CH":{"name":"Suisse","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CY":{"name":"Chypre"},"CZ":{"name":"Tch\u00e9quie","regions":{"736":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"744":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"738":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"743":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"741":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"740":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"747":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"745":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"742":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"737":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"734":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"735":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"739":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"746":{"code":"CZ-72","name":"Zl\u00ednsk\u00fd kraj"}}},"DE":{"name":"Allemagne","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DK":{"name":"Danemark","regions":{"546":{"code":"DK-84","name":"Hovedstaden"},"547":{"code":"DK-82","name":"Midtjylland"},"548":{"code":"DK-81","name":"Nordjylland"},"549":{"code":"DK-85","name":"Sj\u00e6lland"},"550":{"code":"DK-83","name":"Syddanmark"}}},"EE":{"name":"Estonie","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"ES":{"name":"Espagne","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"}
9812,"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"FI":{"name":"Finlande","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FR":{"name":"France","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"},"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"}
9812,"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GR":{"name":"Gr\u00e8ce","regions":{"588":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"575":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"576":{"code":"GR-I","name":"Attik\u00ed"},"577":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"578":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"579":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"580":{"code":"GR-D","name":"\u00cdpeiros"},"581":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"582":{"code":"GR-M","name":"Kr\u00edti"},"583":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"584":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"585":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"},"586":{"code":"GR-E","name":"Thessal\u00eda"},"587":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"HR":{"name":"Croatie"},"HU":{"name":"Hongrie"},"IE":{"name":"Irlande"},"IS":{"name":"Islande","regions":{"605":{"code":"IS-07","name":"Austurland"},"599":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"604":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"603":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"606":{"code":"IS-08","name":"Su\u00f0urland"},"600":{"code":"IS-02","name":"Su\u00f0urnes"},"602":{"code":"IS-04","name":"Vestfir\u00f0ir"},"601":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"Italie"},"LT":{"name":"Lituanie","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"}
9812,"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxembourg"},"LV":{"name":"Lettonie","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"}
9812,"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"MC":{"name":"Monaco"},"MT":{"name":"Malte"},"NL":{"name":"Pays-Bas"},"PL":{"name":"Pologne"},"PT":{"name":"Portugal","regions":{"651":{"code":"PT-01","name":"Aveiro"},"652":{"code":"PT-02","name":"Beja"},"653":{"code":"PT-03","name":"Braga"},"654":{"code":"PT-04","name":"Bragan\u00e7a"},"655":{"code":"PT-05","name":"Castelo Branco"},"656":{"code":"PT-06","name":"Coimbra"},"657":{"code":"PT-07","name":"\u00c9vora"},"658":{"code":"PT-08","name":"Faro"},"659":{"code":"PT-09","name":"Guarda"},"660":{"code":"PT-10","name":"Leiria"},"661":{"code":"PT-11","name":"Lisboa"},"662":{"code":"PT-12","name":"Portalegre"},"663":{"code":"PT-13","name":"Porto"},"670":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"669":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"664":{"code":"PT-14","name":"Santar\u00e9m"},"665":{"code":"PT-15","name":"Set\u00fabal"},"666":{"code":"PT-16","name":"Viana do Castelo"},"667":{"code":"PT-17","name":"Vila Real"},"668":{"code":"PT-18","name":"Viseu"}}},"RO":{"name":"Roumanie","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"SE":{"name":"Su\u00e8de","regions":{"681":{"code":"SE-K","name":"Blekinge l\u00e4n"}
9812,"682":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"684":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"683":{"code":"SE-I","name":"Gotlands l\u00e4n"},"685":{"code":"SE-N","name":"Hallands l\u00e4n"},"686":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"687":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"688":{"code":"SE-H","name":"Kalmar l\u00e4n"},"689":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"690":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"700":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"701":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"691":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"693":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"692":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"694":{"code":"SE-C","name":"Uppsala l\u00e4n"},"695":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"696":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"697":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"698":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"699":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SI":{"name":"Slov\u00e9nie"},"SK":{"name":"Slovaquie"},"SM":{"name":"Saint-Marin"},"VA":{"name":"\u00c9tat de la Cit\u00e9 du Vatican"},"data_id":1790934894},"captcha":[],"loggedAsCustomer":[],"persistent":[],"review":[],"wishlist":{"items":[]},"mwishlist":[],"ammessages":[],"rewards":[],"webcooking-gtm-events":[],"hyva_checkout":[],"payplug-payments-cards":[],"papercatalog":[],"stock_alert":[],"purchase_products":[],"plantfit":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[],"meta_pixel_events":[],"openai_ads_events":[],"openai_ads_user":[],"pinterest_events":[]}</script>
9812 9813<section id="customer-drawer" 9814 x-data="initDrawer('#customer-menu')" 9815 @toggle-customer-panel.window="toggle(true)" 9816 x-bind="drawerListeners" 9817 :class="{ 'is-open': open }" 9818 x-cloak 9819 data-type="drawer" 9820> 9821<div class="backdrop hidden" 9822 @click="toggle(false)" 9823 aria-label="Close panel" 9824 ></div> 9825<div class="top-0" 9826 role="dialog" 9827 aria-modal="true" 9828 aria-describedby="customer-drawer-title" 9829 > 9830<div class="drawer-content"> 9831<div class="absolute top-0 right-2"> 9832<button @click="toggle(false)" 9833 aria-label="Close panel" 9834 > 9835<span class="text-4xl">Ã</span> 9836</button> 9837</div> 9838<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto"> 9839<header> 9840<p id="customer-drawer-title" 9841 class="flex items-center gap-2 text-lg font-bold" 9842 > 9843<svg class="w-8 h-8 p-1"><use xlink:href="#account-symbol"></use></svg> 9844Mon compte </p> 9845</header> 9846<!-- BLOCK customer-drawer.navigation --><div id="hello-customer" 9847 class="block account-nav my-4" 9848> 9849<p> 9850Bonjour <span x-text="$store.customer.fullName"></span> 9851</p> 9852 9853<nav x-data 9854 class="flex flex-col border-t border-primary-lighter py-4 gap-4" 9855 > 9856<ul class="flex flex-col gap-2"><li :class="{'active': location.pathname === '/customer/account/'}" 9857> 9858<a href="https://www.jardindupicvert.com/customer/account/"> 9859<span>Mon espace client</span> 9860<span class="go">→</span> 9861</a> 9862</li> 9863<li :class="{'active': 0 === location.pathname.indexOf('/mwishlist/')}"> 9864<a href="https://www.jardindupicvert.com/mwishlist/"> 9865<span>Mes produits favoris</span> 9866<span x-show="0 !== location.pathname.indexOf('/mwishlist/')">→</span> 9867</a> 9868</li> 9869<li :class="{'active': location.pathname === '/sales/order/history/'}"> 9870<a href="https://www.jardindupicvert.com/sales/order/history/"> 9871<span>Suivre mes commandes</span> 9872<span class="go">→</span> 9873</a> 9874</li> 9875<li :class="{'active': location.pathname === '/contact/'}"> 9876<a href="https://www.jardindupicvert.com/contact/"> 9877<span>Contacter le service client</span> 9878<span class="go">→</span> 9879</a> 9880</li> 9881<li class="mt-2 pt-4 border-primary-lighter border-t"> 9882<a class="flex items-center !justify-start gap-2 text-alert" 9883 href="https://www.jardindupicvert.com/customer/account/logout/" 9884 > 9885<svg class="w-6 h-6"><use xlink:href="#logout-symbol"></use></svg> 9886<span>Déconnexion</span> 9887</a> 9888</li> 9889</ul> </nav> 9890</div> 9891<!-- /BLOCK customer-drawer.navigation --> </div> 9892</div> 9893</div> 9894</section> 9895<section id="amwishlist-drawer" 9896 x-data="initDrawer('#wishlist-menu')" 9897 @toggle-wishlist-panel.window="toggle(true)" 9898 x-bind="drawerListeners" 9899 x-defer="event:amwishlist-alpine-init" 9900 x-cloak 9901 :class="{ 'is-open': open }" 9902 data-type="drawer" 9903> 9904<div class="backdrop hidden" 9905 @click="toggle(false)" 9906 aria-label="Close panel" 9907 ></div> 9908<div class="top-0" 9909 role="dialog" 9910 aria-modal="true" 9911 aria-describedby="drawer-wishlist-title" 9912 > 9913<div class="drawer-content"> 9914<div class="absolute top-0 right-2"> 9915<button @click="toggle(false)" 9916 aria-label="Close panel" 9917 > 9918<span class="text-4xl">×</span> 9919</button> 9920</div> 9921<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto"> 9922<header> 9923<p id="drawer-wishlist-title" 9924 class="flex items-center gap-2 text-lg font-bold" 9925 > 9926<svg class="w-8 h-8 p-1"><use xlink:href="#heart-empty-symbol"></use></svg> 9927Mes listes de favoris </p> 9928</header> 9929<div class="my-8">
9930<p x-show="$store.amwishlist.lists.length === 1"> 9931Vous avez une liste de favoris </p> 9932<p x-show="$store.amwishlist.lists.length > 1" 9933 x-html="hyva.str(`Vous avez %1 listes de favoris`, $store.amwishlist.lists.length)"> 9934</p> 9935<p class="flex items-center justify-end gap-1 text-xs"> 9936<svg class="w-4 h-4"> 9937 <use xlink:href="#edit-symbol"></use> 9938 </svg> 9939<a href="https://www.jardindupicvert.com/mwishlist/" 9940 title="Gérer mes listes de favoris" 9941 > 9942Gérer mes listes de favoris </a> 9943</p> 9944<ul class="flex flex-col h-full py-6 px-4 sm:px-6 bg-white overflow-y-auto"> 9945<template x-for="list in $store.amwishlist.lists"> 9946<li class="flex items-center gap-2"> 9947<span class="w-4 h-4 rounded-full border border-border-lighter shrink-0" 9948 :style="'background-color: ' + list.color"> 9949</span> 9950<a :href="'https://www.jardindupicvert.com/mwishlist/wishlist/index/wishlist_id/' + list.wishlist_id " 9951 class="u-text-ellipsis hover:underline cursor-pointer" 9952 title="Consulter" 9953 > 9954<span x-text="list.name"></span> 9955</a> 9956</li> 9957</template> 9958</ul> 9959</div> 9960</div> 9961</div> 9962</div> 9963</section>
9964<script> 9965 function initCartDrawer() { 9966 return { 9967 loading: false, 9968 maxItemsToDisplay: 999, 9969 summaryCount: -1, 9970 showMergedCartMessage: true, 9971 9972 init() { 9973 window.addEventListener( 9974 "private-content-loaded", 9975 (event) => { 9976 event.detail?.data?.cart?.items 9977 && !window.location.pathname.startsWith('/checkout/cart') 9978 && this.summaryCount !== -1 9979 && this.summaryCount != event.detail.data.cart.summary_count 9980 && window.dispatchEvent(new CustomEvent('toggle-cart-panel')); 9981 this.summaryCount = event.detail?.data?.cart?.summary_count || 0; 9982 this.showMergedCartMessage = event.detail?.data?.cart?.items?.some(i => i?.merged_qty > 0); 9983 } 9984 ); 9985 }, 9986 9987 cartItems() { 9988 const items = Alpine.store('minicart').cart.items || []; 9989 if (this.maxItemsToDisplay > 0) { 9990 return items.slice(0, this.maxItemsToDisplay); 9991 } 9992 return items; 9993 }, 9994 9995 deleteItemFromCart(itemId) { 9996 this.loading = true; 9997 fetch(BASE_URL + 'checkout/sidebar/removeItem/', { 9998 "headers": { 9999 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 10000 }, 10001 "body": "form_key=" + hyva.getFormKey() + "&item_id=" + itemId, 10002 "method": "POST", 10003 "mode": "cors", 10004 "credentials": "include" 10005 }).then(response => { 10006 if (response.redirected) { 10007 window.location.href = response.url; 10008 } else if (response.ok) { 10009 return response.json(); 10010 } else { 10011 window?.dispatchMessages([{ 10012 type: 'error', 10013 text: 'Impossible\u0020de\u0020supprimer\u0020cet\u0020article\u0020du\u0020panier.' 10014 }]); 10015 } 10016 }).then(result => { 10017 window?.dispatchMessages([{ 10018 type: result.success ? 'success' : 'error', 10019 text: result.success 10020 ? 'Article\u0020retir\u00E9\u0020du\u0020panier.' 10021 : result.error_message 10022 }], result.success ? 5000 : 0) 10023 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 10024 }).finally(() => { 10025 this.loading = false; 10026 }); 10027 } 10028 } 10029 } 10030</script>
10030 10031<section id="cart-drawer" 10032 x-data="{ ...initDrawer('#cart-menu'), ...initCartDrawer() }" 10033 @toggle-cart-panel.window="toggle(true)" 10034 @keydown.window.escape="toggle(false)" 10035 @close-merged-cart-popup.window="showMergedCartMessage = false" 10036 x-bind="drawerListeners" 10037 :class="{ 'is-open': open }" 10038 x-cloak 10039 data-type="drawer" 10040> 10041<template x-if="$store?.minicart?.cart?.items"> 10042<div> 10043<div class="backdrop hidden" 10044 @click="toggle(false)" 10045 aria-label="Close panel" 10046 ></div> 10047<div class="top-0" 10048 role="dialog" 10049 aria-labelledby="cart-drawer-title" 10050 aria-modal="true" 10051 > 10052<div class="drawer-content"> 10053<div class="absolute top-0 right-2"> 10054<button @click="toggle(false)" 10055 aria-label="Close panel" 10056 > 10057<span class="text-4xl">×</span> 10058</button> 10059</div> 10060<div class="flex flex-col h-full py-6 space-y-6 px-4 sm:px-6 bg-white overflow-y-auto" 10061 :class="{ 'u-loader': loading }" 10062 > 10063<header> 10064<p id="cart-drawer-title" 10065 class="flex items-center gap-2 text-lg font-bold" 10066 > 10067<svg class="w-8 h-8 p-1"><use xlink:href="#basket-symbol"></use></svg> 10068Mon panier <span class="items-total text-xs" 10069 x-show="$store?.minicart.cart.items.length && maxItemsToDisplay && maxItemsToDisplay < $store.minicart.cart.items.length" 10070 x-text="hyva.strf('(%0 sur %1)', maxItemsToDisplay, $store.minicart.cart.items.length)"> 10071</span> 10072</p> 10073</header> 10074<div x-show="showMergedCartMessage" 10075 x-cloak 10076 class="p-2 border-2 rounded-lg text-xs leading-tight" 10077 > 10078Nous avons fusionné vos paniers ! Les articles mis au panier lors d'une précédente visite ont été récupérés. </div> 10079<div class="relative grid gap-2 overflow-y-auto bg-white border-b border-container"> 10080<div x-show="!$store.minicart.cart.summary_count"> 10081<p>Votre panier est vide.</p> 10082</div> 10083<template x-for="item in cartItems()"> 10084<div class="grid grid-cols-4 gap-2 p-2 text-sm md:text-base border-2" 10085 :class="showMergedCartMessage && item.merged_qty > 0 ? 'rounded-lg' : 'border-white'" 10086 > 10087<a :href="item.product_url" 10088 class="col-start-1 col-end-2" 10089 > 10090<img :src="item.product_image.src" 10091 :width="item.product_image.width" 10092 :height="item.product_image.height" 10093 :alt="item.product_name" 10094 loading="lazy" 10095 10096 /> 10097</a> 10098<div class="col-span-2"> 10099<div> 10100<p class="leading-tight font-bold"> 10101<a :href="item.product_url"> 10102<span x-html="item.product_name"></span> 10103</a> 10104</p> 10105<p x-html="item.product_conditionnement" 10106 class="text-xs" 10107 ></p> 10108<p class="text-xs"> 10109Quantité: <span x-html="item.qty"></span> 10110</p> 10111</div> 10112</div> 10113<div class="col-start-4"> 10114<div class="flex flex-col justify-end mb-2"> 10115<p class="text-right font-bold"> 10116<span x-html="item.product_price"></span> 10117</p> 10118<div class="flex items-center justify-end gap-2"> 10119<button class="inline-flex" 10120 @click="deleteItemFromCart(item.item_id)" 10121 title="Supprimer" 10122 > 10123<svg class="w-5 h-5"> 10124 <use xlink:href="#delete-symbol"></use> 10125 </svg> 10126</button> 10127</div> 10128</div> 10129</div> 10130</div> 10131</template> 10132</div> 10133<div x-show="$store.minicart.cart.summary_count" 10134 class="relative bg-white" 10135 > 10136<div class="flex items-center justify-between my-4 py-2 border-t border-border-light font-bold"> 10137<span>Total panier</span> 10138<span x-html="$store.minicart.cart.subtotal"></span> 10139</div> 10140<div class="mb-4 text-center"> 10141<a href="https://www.jardindupicvert.com/checkout/cart/" 10142 class="inline-flex btn btn-primary xs:btn-size-lg" 10143 > 10144Voir le panier et commander </a> 10145</div> 10146<p @click.prevent="toggle(false)" 10147 class="text-sm xs:text-base text-center underline cursor-pointer" 10148 > 10149Continuer mes achats </p> 10150</div> 10151</div> 10152</div> 10153</div> 10154</div> 10155</template> 10156</section> 10157<!-- BLOCK authentication-popup -->
10157<script> 10158 function initAuthentication() { 10159 return { 10160 loading: false, 10161 errors: 0, 10162 hasCaptchaToken: 0, 10163 errorMessage: '', 10164 showPassword: false, 10165 username: '', 10166 password: '', 10167 request: null, /** 10168 { 10169 text: contextual text to output in panel, 10170 callback: function to be called after successful login, 10171 url: redirect url after successful login 10172 } 10173 */ 10174 10175 submitForm: function () { 10176 // Do not rename $form, the variable is expected to be declared in the recaptcha output 10177 const $form = document.querySelector('#login-form'); 10178 if (!this.hasCaptchaToken) { 10179 this.errors = 1; 10180 10181 const lockSubmitButton = () => { 10182 $form.querySelector('[type="submit"]')?.setAttribute('disabled', true); 10183 }; 10184 10185 const failCaptcha = (errorMessage, exception = null) => { 10186 this.errors = 1; 10187 lockSubmitButton(); 10188 10189 if (this.setErrorMessages) { 10190 this.setErrorMessages([errorMessage]); 10191 this.displayErrorMessage = true; 10192 } else { 10193 window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000); 10194 } 10195 10196 if (exception) { 10197 console.error( 10198 exception || 10199 'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?' 10200 ); 10201 } 10202 }; 10203 10204 const executeGreCaptcha = () => { 10205 grecaptcha.ready(() => { 10206 grecaptcha.execute( 10207 '6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV', 10208 {action: 'submit'} 10209 ).then((token) => { 10210 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 10211 10212 if (tokenElement && token && token.length > 0) { 10213 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 10214 this.errors = 0; 10215 this.hasCaptchaToken = 1; 10216 (this.submitForm || $form.submit).call(this); 10217 } else { 10218 failCaptcha( 10219 tokenElement 10220 ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 10221 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 10222 ); 10223 } 10224 }).catch((exception) => { 10225 failCaptcha( 10226 'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.', 10227 exception 10228 ); 10229 }); 10230 }); 10231 }; 10232 10233 if (window.grecaptcha) { 10234 executeGreCaptcha(); 10235 } else { 10236 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfHNuwrAAAAAOzH2oXaK7qEiEsInjuu5Lb5B6aV"; 10237 const script = document.createElement('script'); 10238 script.setAttribute('type', 'text/javascript'); 10239 script.setAttribute('src', recaptchaUrl); 10240 document.head.appendChild(script); 10241 10242 script.addEventListener("load", executeGreCaptcha, false); 10243 } 10244 } 10245 if (this.errors === 0) { 10246 this.dispatchLoginRequest($form); 10247 } 10248 }, 10249 10250 toggleAuthentication(request) { 10251 this.request = request; 10252 Alpine.store('customer')?.isLoggedIn ? this.redirectIfAuthenticated() : this.toggle(true); 10253 }, 10254 10255 redirectIfAuthenticated: function() { 10256 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 10257 if (this.request?.callback && typeof this.request.callback === 'function') { 10258 this.request.callback(); 10259 } else if (this.request?.url) { 10260 if (location.pathname.startsWith('/checkout/cart')) { 10261 // If login from cart, redirect to checkout after login 10262 this.request.url = 'https://www.jardindupicvert.com/checkout/'; 10263 } 10264 window.location.href = this.request.url; 10265 } else { 10266 window.location.reload(); 10267 } 10268 this.toggle(false); 10269 }, 10270 10271 resetErrors() { 10272 this.errors = 0; 10273 }, 10274 10275 dispatchLoginRequest: function(form) { 10276 this.loading = true; 10277 this.errorMessage = ''; 10278 const bodyFields = { 10279 'username': this.username, 10280 'password': this.password, 10281 'formKey': hyva.getFormKey() 10282 }; 10283 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 10284 const recaptchaField = fieldName && form[fieldName]; 10285 if (recaptchaField) { 10286 bodyFields[fieldName] = recaptchaField.value; 10287 } 10288 fetch('https://www.jardindupicvert.com/customer/ajax/login/', { 10289 method: 'POST', 10290 headers: { 10291 'Content-Type': 'application/json', 10292 'X-Requested-With': 'XMLHttpRequest' 10293 }, 10294 body: JSON.stringify(bodyFields) 10295 } 10296 ).then(response => { 10297 return response.json() 10298 } 10299 ).then(data=> { 10300 if (data.errors) { 10301 this.errorMessage = data.message; 10302 this.errors = 1; 10303 this.hasCaptchaToken = 0; 10304 } else { 10305 this.redirectIfAuthenticated(); 10306 } 10307 } 10308 ).finally(() => { 10309 this.loading = false;
10310 this.request = null; 10311 }); 10312 } 10313 } 10314 } 10315 10316 function initAutoLogin() { 10317 return { 10318 init: function () { 10319 window?.AUTO_LOGIN_MESSAGE && window.dispatchEvent( 10320 new CustomEvent( 10321 'toggle-authentication', 10322 { 10323 detail: { 10324 url: window.location.href, 10325 text: window.AUTO_LOGIN_MESSAGE 10326 } 10327 } 10328 ) 10329 ) 10330 } 10331 } 10332 } 10333</script>
10333 10334<section id="authentication-popup" 10335 x-data="{ ...initDrawer('#customer-menu'), ...initAuthentication() }" 10336 @toggle-authentication.window="toggleAuthentication($event?.detail)" 10337 @keydown.window.escape="toggle(false)" 10338 :class="{'is-open': open}" 10339 x-cloak 10340 data-type="drawer" 10341> 10342<div class="backdrop hidden" 10343 @click="toggle(false)" 10344 aria-label="Close panel" 10345 ></div> 10346<div x-data="initAutoLogin()" 10347 role="dialog" 10348 class="top-0" 10349 > 10350<div class="drawer-content"> 10351<div class="absolute top-0 right-2"> 10352<button @click="toggle(false)" 10353 aria-label="Close panel" 10354 > 10355<span class="text-4xl">Ã</span> 10356</button> 10357</div> 10358<div class="h-full p-4 sm:px-6 bg-white overflow-y-auto" 10359 :class="{ 'u-loader': loading }" 10360 > 10361<header> 10362<p id="authentication-title" 10363 class="flex items-center gap-2 text-lg font-bold" 10364 > 10365<svg class="w-8 h-8 p-1"><use xlink:href="#account-symbol"></use></svg> 10366Connexion / Inscription </p> 10367<p class="leading-tight italic text-sm" 10368 x-html="request?.text || ''"></p> 10369</header> 10370<div class="block-customer-login"> 10371<p class="my-4 font-bold text-lg"> 10372Déjà client(e) ? </p> 10373<form class="form form-login pb-4" 10374 method="post" 10375 @submit.prevent="submitForm();" 10376 id="login-form" 10377 > 10378<div class="control"> 10379<input type="hidden" 10380 value="" 10381 name="g-recaptcha-response" 10382 > 10383</div> 10384<div class="fieldset login"> 10385<div class="form-field field email required"> 10386<label class="label" for="customer-email"> 10387<span>Adresse email <sup>*</sup></span> 10388</label> 10389<div class="control"> 10390<input name="username" 10391 x-model="username" 10392 @keyup="errorMessage = ''" 10393 @change="resetErrors" 10394 type="email" 10395 required 10396 class="form-input input-text" 10397 > 10398</div> 10399</div> 10400<div class="form-field password required"> 10401<label for="pass" 10402 class="label" 10403 > 10404<span>Mot de passe <sup>*</sup></span> 10405</label> 10406<div class="control relative"> 10407<input name="password" 10408 x-model="password" 10409 :type="showPassword ? 'text' : 'password'" 10410 class="form-input input-text" 10411 required 10412 @keyup="errorMessage = ''" 10413 @change="resetErrors" 10414 > 10415<svg @click.prevent="showPassword = !showPassword" 10416 class="w-6 h-6 absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer" 10417 :class="{ 'text-primary-light': !showPassword, 'text-primary-lighter': showPassword }" 10418 > 10419 <use xlink:href="#view-symbol"></use> 10420 </svg> 10421</div> 10422</div> 10423<p x-show="errorMessage" 10424 class="flex items-center gap-1 mt-1 text-sm text-alert" 10425 > 10426<span class="text-alert font-bold text-xl">⚠</span> 10427<span x-text="errorMessage"></span> 10428</p> 10429<input name="context" type="hidden" value="checkout" /> 10430<div class="actions flex justify-between pt-6 pb-2 items-center"> 10431<button type="submit" 10432 class="inline-flex btn btn-primary" 10433 :disabled="!username || !password || (errorMessage != '')" 10434 > 10435Me connecter </button> 10436<a href="https://www.jardindupicvert.com/customer/account/forgotpassword/" 10437 class="text-xs italic hover:underline" 10438 > 10439Mot de passe oublié ? </a> 10440</div> 10441</div> 10442</form> 10443</div> 10444<div class="mx-4"> 10445<p class="my-4 text-2xs text-center leading-tight"> 10446<em>Ce formulaire est protégé par reCAPTCHA: vous pouvez consulter la <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">politique de confidentialité</a> et <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">les conditions d'utilisation</a>.</em> 10447</p> 10448</div> 10449<div class="block-new-customer"> 10450<p class="py-4 font-bold text-lg"> 10451Pas encore client(e) ? </p> 10452<div class="block-content"> 10453<p class="mb-1 text-sm"> 10454Créez votre compte client pour passer commande sur notre site. </p> 10455<div class="actions flex justify-between mt-6 mb-2 items-center"> 10456<a href="https://www.jardindupicvert.com/customer/account/login/" 10457 class="inline-flex btn btn-primary" 10458 > 10459Créer un compte </a> 10460</div> 10461</div> 10462</div> 10463</div> 10464</div> 10465</div> 10466</section> 10467<!-- /BLOCK authentication-popup --></div></body> 10468</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.