1<!doctype html> 2<html lang="it"> 3<head > 4
5<script> window.dataLayer = window.dataLayer || []; 6 function gtag() { dataLayer.push(arguments) } 7 8 window.amConsentManager = window.amConsentManager || { 9 consentStates: { 10 denied: 'denied', 11 granted: 'granted' 12 }, 13 storageName: 'amConsentMode', 14 gdprCookie: { 15 cookieGroupName: 'amcookie_allowed', 16 allCookiesAllowed: '0' 17 }, 18 defaultConsentTypesData: {"ad_storage":{"default":"0","group":"2"},"analytics_storage":{"default":"0","group":"3"},"ad_user_data":{"default":"0","group":"2"},"ad_personalization":{"default":"0","group":"2"}}, 19 currentStoreId: 1, 20 init: function () { 21 this.initStorage(); 22 this.setDefaultConsent(); 23 }, 24 initStorage: function () { 25 const persistedConsentTypes = this.getPersistedConsentTypeState(); 26 27 if (Object.keys(persistedConsentTypes).length !== 0 && !this.shouldResetConsentState(persistedConsentTypes)) { 28 return; 29 } 30 31 let consentState = {}; 32 for (const [type, data] of Object.entries(this.defaultConsentTypesData)) { 33 consentState[type] = { 34 group: data.group, 35 status: data.default === '1' ? this.consentStates.granted : this.consentStates.denied 36 }; 37 } 38 39 this.resetAllowedCookiesGroups(); 40 this.persistConsentTypeState(consentState); 41 }, 42 setDefaultConsent: function () { 43 gtag('consent', 'default', this.getPersistedConsentTypeStateForGtag()); 44 }, 45 updateConsent: function (consent) { 46 const storageConsent = this.getPersistedConsentTypeState(); 47 const consentState = {...storageConsent, ...consent}; 48 49 this.persistConsentTypeState(consentState); 50 gtag('consent', 'update', this.getPersistedConsentTypeStateForGtag()); 51 }, 52 getConsentTypeStateByGroupIds: function (groups) { 53 let consentTypeState = {}; 54 55 for (const [type, data] of Object.entries(this.defaultConsentTypesData)) { 56 consentTypeState[type] = { 57 group: data.group, 58 status: (groups.includes(data.group) || groups.includes(this.gdprCookie.allCookiesAllowed)) 59 ? this.consentStates.granted 60 : this.consentStates.denied 61 } 62 } 63 64 return consentTypeState; 65 }, 66 persistConsentTypeState: function (consentTypeState) { 67 let persistedState = this.getPersistedConsentTypeState(false); 68 persistedState[this.currentStoreId] = consentTypeState; 69 localStorage.setItem(this.storageName, JSON.stringify(persistedState)); 70 }, 71 getPersistedConsentTypeState: function (forCurrentStore = true) { 72 let persistedStates = JSON.parse(localStorage.getItem(this.storageName)) ?? {}; 73 74 if (forCurrentStore) { 75 return persistedStates?.[this.currentStoreId] ?? {}; 76 } 77 78 return persistedStates; 79 }, 80 getPersistedConsentTypeStateForGtag: function () { 81 let consentTypeState = {}; 82 let persistedState = this.getPersistedConsentTypeState(); 83 84 for (const [type, data] of Object.entries(persistedState)) { 85 consentTypeState[type] = data.status; 86 } 87 88 return consentTypeState; 89 }, 90 shouldResetConsentState: function (persistedConsentTypes) { 91 if (Object.keys(persistedConsentTypes).length != Object.keys(this.defaultConsentTypesData).length) { 92 return true; 93 } 94 95 for (const [type, data] of Object.entries(persistedConsentTypes)) { 96 if (data.group !== this.defaultConsentTypesData[type].group) { 97 return true; 98 } 99 } 100 101 return false; 102 }, 103 resetAllowedCookiesGroups: function () { 104 document.cookie = this.gdprCookie.cookieGroupName + '=0;max-age=-1;domain=' + location.hostname 105 } 106 }; 107 108 window.amConsentManager.init(); 109</script>
109 110<meta charset="utf-8"/> 111<meta name="title" content="Come possiamo aiutarti? | NatureLab"/> 112<meta name="description" content="Contatta NatureLab per informazioni su prodotti, ordini, spedizioni e assistenza. Siamo a tua disposizione per aiutarti nella scelta."/> 113<meta name="robots" content="INDEX,FOLLOW"/> 114<meta name="viewport" content="width=device-width, initial-scale=1"/> 115<title>Come possiamo aiutarti? | NatureLab</title> 116<link rel="stylesheet" type="text/css" media="all" href="https://www.naturelab.it/static/version1786556693/frontend/Nature/naturelab/it_IT/Jajuma_WebpImages/css/web.css" /> 117<link rel="stylesheet" type="text/css" media="all" href="https://www.naturelab.it/static/version1786556693/frontend/Nature/naturelab/it_IT/css/styles.css" /> 118<link rel="canonical" href="https://www.naturelab.it/contact/" /> 119<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" /> 120<link rel="shortcut icon" type="image/x-icon" href="https://www.naturelab.it/media/favicon/default/favicon.ico_1.png" /> 121<link rel="icon" sizes="32x32" type="image/png" href="/favicon-32x32.png" /> 122<link rel="icon" sizes="16x16" type="image/png" href="/favicon-16x16.png" /> 123<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" /> 124<link rel="manifest" href="/site.webmanifest" /> 125<link rel="icon" type="image/x-icon" href="https://www.naturelab.it/media/favicon/default/favicon.ico_1.png" /> 126<meta name="geo.placename" content="Via Giovanni Berchet, 1, 50129 Firenze, Italia" /> 127<meta name="geo.position" content="43.7862330;11.2657510" /> 128<meta name="geo.region" content="IT-Toscana" /> 129<meta name="ICBM" content="43.7862330, 11.2657510" /> 130<meta name="DC.Title" content="NatureLab Srl"> 131<meta name="DC.Creator" content="NatureLab"> 132<meta name="DC.Subject" content="Integratori alimentari naturali, fitoterapia, cosmesi naturale "> 133<meta name="DC.Description" content="Distribuzione di integratori fitoterapici, nutraceutici, cosmesi naturale e biologica"> 134<meta name="DC.Language" content="it"> 135 136<meta name="google-site-verification" content="X0uzJ2loSyfVJG0qeBWCp-NECQKVGCLMtUWKsWItgBE" /> 137 138 <meta property="og:type" content="website"/> 139<meta property="og:url" content="https://www.naturelab.it/contact/"/> 140<meta property="og:title" content="Come possiamo aiutarti? | NatureLab"/> 141<meta property="og:description" content="Contatta NatureLab per informazioni su prodotti, ordini, spedizioni e assistenza. Siamo a tua disposizione per aiutarti nella scelta."/> 142<meta property="og:image" content="https://www.naturelab.it/media/wysiwyg/assets/naturelab-og-image.webp"/> 143<meta property="og:site_name" content="NatureLab"/> 144<meta name="twitter:card" content="summary_large_image"/> 145<meta name="twitter:url" content="https://www.naturelab.it/contact/"/> 146<meta name="twitter:title" content="Come possiamo aiutarti? | NatureLab"/> 147<meta name="twitter:description" content="Contatta NatureLab per informazioni su prodotti, ordini, spedizioni e assistenza. Siamo a tua disposizione per aiutarti nella scelta."/> 148<meta name="twitter:image" content="https://www.naturelab.it/media/wysiwyg/assets/naturelab-og-image.webp"/> 149<!-- Google Tag Manager --> 150 151
151<script> 152 document.addEventListener('scroll', mfGtmUserActionDetect); 153 document.addEventListener('mousemove', mfGtmUserActionDetect); 154 document.addEventListener('touchstart', mfGtmUserActionDetect); 155 function mfGtmUserActionDetect() 156 { 157 document.removeEventListener('scroll', mfGtmUserActionDetect); 158 document.removeEventListener('mousemove', mfGtmUserActionDetect); 159 document.removeEventListener('touchstart', mfGtmUserActionDetect); 160 window.mfGtmUserActionDetected = true; 161 mfLoadGtm(); 162 } 163 164 window.mfGtmUserCookiesAllowed = true; 165 mfLoadGtm(); 166 167 168 function getMfGtmCustomerIdentifier() { 169 return localStorage.getItem('mf_gtm_customer_identifier') ? localStorage.getItem('mf_gtm_customer_identifier') : null; 170 }; 171 172 function mfLoadGtm() { 173 if (!window.mfGtmUserActionDetected) return false; 174 if (!window.mfGtmLoadBeforeCookieAllowed && !window.mfGtmUserCookiesAllowed) return false; 175 176 if (window.mfGTMTriedToLoad) return; 177 window.mfGTMTriedToLoad = true; 178 179 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 180 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 181 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 182 'https:' + '/' + '/' + 'www.googletagmanager.com/gtm.js?id='
182+i+dl;f.parentNode.insertBefore(j,f); 183 })(window,document,'script','dataLayer','GTM-KM7RPJX9'); 184 185 }; 186 </script>
186 187
187<script> 188 /* Hyva code */ 189 function mfHyvaGtmSetCustomerIdentifier(event) { 190 let data, j; 191 let sections = event.detail.data; 192 for (j in sections) { 193 data = sections[j]; 194 if (data.mf_gtm_customer_identifier) { 195 localStorage.setItem('mf_gtm_customer_identifier', 'data.mf_gtm_customer_identifier'); 196 return; 197 } 198 } 199 }; 200 window.addEventListener('private-content-loaded', mfHyvaGtmSetCustomerIdentifier); 201 /* End Hyva code */ 202 </script>
202<!-- End Google Tag Manager --> 203
204<script> 205 var BASE_URL = 'https://www.naturelab.it/'; 206 var THEME_PATH = 'https://www.naturelab.it/static/version1786556693/frontend/Nature/naturelab/it_IT'; 207 var COOKIE_CONFIG = { 208 "expires": null, 209 "path": "\u002F", 210 "domain": ".www.naturelab.it", 211 "secure": true, 212 "lifetime": "3600", 213 "cookie_restriction_enabled": false }; 214 var CURRENT_STORE_CODE = 'default'; 215 var CURRENT_WEBSITE_ID = '1'; 216 217 window.hyva = window.hyva || {} 218 219 window.cookie_consent_groups = window.cookie_consent_groups || {} 220 window.cookie_consent_groups['necessary'] = true; 221 222 window.cookie_consent_config = window.cookie_consent_config || {}; 223 window.cookie_consent_config['necessary'] = [].concat( 224 window.cookie_consent_config['necessary'] || [], 225 [ 226 'user_allowed_save_cookie', 227 'form_key', 228 'mage-messages', 229 'private_content_version', 230 'mage-cache-sessid', 231 'last_visited_store', 232 'section_data_ids' 233 ] 234 ); 235</script>
vendor: 1 bytes, line 235
235
236<script> 237 'use strict'; 238 (function( hyva, undefined ) { 239 240 function lifetimeToExpires(options, defaults) { 241 242 const lifetime = options.lifetime || defaults.lifetime; 243 244 if (lifetime) { 245 const date = new Date; 246 date.setTime(date.getTime() + lifetime * 1000); 247 return date; 248 } 249 250 return null; 251 } 252 253 function generateRandomString() { 254 255 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 256 length = 16; 257 258 let formKey = '', 259 charactersLength = allowedCharacters.length; 260 261 for (let i = 0; i < length; i++) { 262 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 263 } 264 265 return formKey; 266 } 267 268 const sessionCookieMarker = {noLifetime: true} 269 270 const cookieTempStorage = {}; 271 272 const internalCookie = { 273 get(name) { 274 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 275 return v ? v[2] : null; 276 }, 277 set(name, value, days, skipSetDomain) { 278 let expires, 279 path, 280 domain, 281 secure, 282 samesite; 283 284 const defaultCookieConfig = { 285 expires: null, 286 path: '/', 287 domain: null, 288 secure: false, 289 lifetime: null, 290 samesite: 'lax' 291 }; 292 293 const cookieConfig = window.COOKIE_CONFIG || {}; 294 295 expires = days && days !== sessionCookieMarker 296 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 297 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 298 299 path = cookieConfig.path || defaultCookieConfig.path; 300 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 301 secure = cookieConfig.secure || defaultCookieConfig.secure; 302 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 303 304 document.cookie = name + "=" + encodeURIComponent(value) + 305 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 306 (path ? '; path=' + path : '') + 307 (domain ? '; domain=' + domain : '') + 308 (secure ? '; secure' : '') + 309 (samesite ? '; samesite=' + samesite : 'lax'); 310 }, 311 isWebsiteAllowedToSaveCookie() { 312 const allowedCookies = this.get('user_allowed_save_cookie'); 313 if (allowedCookies) { 314 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 315 316 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 317 } 318 return false; 319 }, 320 getGroupByCookieName(name) { 321 const cookieConsentConfig = window.cookie_consent_config || {}; 322 let group = null; 323 for (let prop in cookieConsentConfig) { 324 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 325 if (cookieConsentConfig[prop].includes(name)) { 326 group = prop; 327 break; 328 } 329 } 330 return group; 331 }, 332 isCookieAllowed(name) { 333 const cookieGroup = this.getGroupByCookieName(name); 334 return cookieGroup 335 ? window.cookie_consent_groups[cookieGroup] 336 : this.isWebsiteAllowedToSaveCookie(); 337 }, 338 saveTempStorageCookies() { 339 for (const [name, data] of Object.entries(cookieTempStorage)) { 340 if (this.isCookieAllowed(name)) { 341 this.set(name, data['value'], data['days'], data['skipSetDomain']); 342 delete cookieTempStorage[name]; 343 } 344 } 345 } 346 }; 347 348 hyva.getCookie = (name) => { 349 const cookieConfig = window.COOKIE_CONFIG || {}; 350 351 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 352 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 353 } 354 355 return internalCookie.get(name); 356 } 357 358 hyva.setCookie = (name, value, days, skipSetDomain) => { 359 const cookieConfig = window.COOKIE_CONFIG || {}; 360 361 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 362 cookieTempStorage[name] = {value, days, skipSetDomain}; 363 return; 364 } 365 return internalCookie.set(name, value, days, skipSetDomain); 366 } 367 368 369 hyva.setSessionCookie = (name, value, skipSetDomain) => { 370 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 371 } 372 373 hyva.getBrowserStorage = () => { 374 const browserStorage = window.localStorage || window.sessionStorage; 375 if (!browserStorage) { 376 console.warn('Browser Storage is unavailable'); 377 return false;
378 } 379 try { 380 browserStorage.setItem('storage_test', '1'); 381 browserStorage.removeItem('storage_test'); 382 } catch (error) { 383 console.warn('Browser Storage is not accessible', error); 384 return false; 385 } 386 return browserStorage; 387 } 388 389 hyva.postForm = (postParams) => { 390 const form = document.createElement("form"); 391 392 let data = postParams.data; 393 394 if (! postParams.skipUenc && ! data.uenc) { 395 data.uenc = btoa(window.location.href); 396 } 397 form.method = "POST"; 398 form.action = postParams.action; 399 400 Object.keys(postParams.data).map(key => { 401 const field = document.createElement("input"); 402 field.type = 'hidden' 403 field.value = postParams.data[key]; 404 field.name = key; 405 form.appendChild(field); 406 }); 407 408 const form_key = document.createElement("input"); 409 form_key.type = 'hidden'; 410 form_key.value = hyva.getFormKey(); 411 form_key.name="form_key"; 412 form.appendChild(form_key); 413 414 document.body.appendChild(form); 415 416 form.submit(); 417 } 418 419 hyva.getFormKey = function () { 420 let formKey = hyva.getCookie('form_key'); 421 422 if (!formKey) { 423 formKey = generateRandomString(); 424 hyva.setCookie('form_key', formKey); 425 } 426 427 return formKey; 428 } 429 430 hyva.formatPrice = (value, showSign, options = {}) => { 431 const formatter = new Intl.NumberFormat( 432 'it\u002DIT', 433 Object.assign({ 434 style: 'currency', 435 currency: 'EUR', 436 signDisplay: showSign ? 'always' : 'auto' 437 }, options) 438 ); 439 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 440 formatter.formatToParts(value).map(({type, value}) => { 441 switch (type) { 442 case 'currency': 443 return '\u20AC' || value; 444 case 'minusSign': 445 return '- '; 446 case 'plusSign': 447 return '+ '; 448 default : 449 return value; 450 } 451 }).reduce((string, part) => string + part) : 452 formatter.format(value); 453 } 454 455 const formatStr = function (str, nStart) { 456 const args = Array.from(arguments).slice(2); 457 458 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 459 const idx = parseInt(n) - nStart; 460 461 if (args[idx] === null || args[idx] === void 0) { 462 return m; 463 } 464 return p.length % 2 465 ? p.slice(0, -1).replace('%%', '%') + args[idx] 466 : p.replace('%%', '%') + n; 467 }) 468 } 469 470 hyva.str = function (string) { 471 const args = Array.from(arguments); 472 args.splice(1, 0, 1); 473 474 return formatStr.apply(undefined, args); 475 } 476 477 hyva.strf = function () { 478 const args = Array.from(arguments); 479 args.splice(1, 0, 0); 480 481 return formatStr.apply(undefined, args); 482 } 483 484 /** 485 * Take a html string as `content` parameter and 486 * extract an element from the DOM to replace in 487 * the current page under the same selector, 488 * defined by `targetSelector` 489 */ 490 hyva.replaceDomElement = (targetSelector, content) => { 491 // Parse the content and extract the DOM node using the `targetSelector` 492 const parser = new DOMParser(); 493 const doc = parser.parseFromString(content, 'text/html'); 494 const contentNode = doc.querySelector(targetSelector); 495 496 // Bail if content can't be found 497 if (!contentNode) { 498 return; 499 } 500 501 hyva.activateScripts(contentNode) 502 503 // Replace the old DOM node with the new content
504 document.querySelector(targetSelector).replaceWith(contentNode); 505 506 // Reload customerSectionData and display cookie-messages if present 507 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 508 hyva.initMessages(); 509 } 510 511 hyva.activateScripts = (contentNode) => { 512 // Extract all the script tags from the content. 513 // Script tags won't execute when inserted into a dom-element directly, 514 // therefore we need to inject them to the head of the document. 515 const tmpScripts = contentNode.getElementsByTagName('script'); 516 517 if (tmpScripts.length > 0) { 518 // Push all script tags into an array 519 // (to prevent dom manipulation while iterating over dom nodes) 520 const scripts = []; 521 for (let i = 0; i < tmpScripts.length; i++) { 522 scripts.push(tmpScripts[i]); 523 } 524 525 // Iterate over all script tags and duplicate+inject each into the head 526 for (let i = 0; i < scripts.length; i++) { 527 let script = document.createElement('script'); 528 script.innerHTML = scripts[i].innerHTML; 529 530 document.head.appendChild(script); 531 532 // Remove the original (non-executing) node from the content 533 scripts[i].parentNode.removeChild(scripts[i]); 534 } 535 } 536 return contentNode; 537 } 538 539 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 540 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 541 542 let currentTrap; 543 544 const focusableElements = (rootElement) => { 545 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 546 return Array.from(rootElement.querySelectorAll(selector)) 547 .filter(el => { 548 return el.style.display !== 'none' 549 && !el.disabled 550 && el.tabIndex !== -1 551 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 552 }) 553 } 554 555 const focusTrap = (e) => { 556 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 557 if (!isTabPressed) return; 558 559 const focusable = focusableElements(currentTrap) 560 const firstFocusableElement = focusable[0] 561 const lastFocusableElement = focusable[focusable.length - 1] 562 563 e.shiftKey 564 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 565 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 566 }; 567 568 hyva.releaseFocus = (rootElement) => { 569 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 570 currentTrap.removeEventListener('keydown', focusTrap) 571 currentTrap = null 572 } 573 } 574 hyva.trapFocus = (rootElement) => { 575 if (!rootElement) return; 576 hyva.releaseFocus() 577 currentTrap = rootElement 578 rootElement.addEventListener('keydown', focusTrap) 579 const firstElement = focusableElements(rootElement)[0] 580 firstElement && firstElement.focus() 581 } 582 583 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 584 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 585 586 }( window.hyva = window.hyva || {} )); 587</script>
vendor: 1 bytes, line 587
587
588<script> 589 if (!window.IntersectionObserver) { 590 window.IntersectionObserver = function (callback) { 591 this.observe = el => el && callback(this.takeRecords()); 592 this.takeRecords = () => [{isIntersecting: true, intersectionRatio: 1}]; 593 this.disconnect = () => {}; 594 this.unobserve = () => {}; 595 } 596 } 597</script>
597 598
599<script> 600 window.addEventListener('init-external-scripts', () => { 601 if (window._amPurifyLoaded) { 602 return; 603 } 604 605 // Load Purify script asynchronously 606 const script = document.createElement('script'); 607 script.src = 'https://www.naturelab.it/static/version1786556693/frontend/Nature/naturelab/it_IT/Amasty_XsearchHyvaCompatibility/js/purify.min.js'; 608 script.async = true; 609 document.body.appendChild(script); 610 611 window._amPurifyLoaded = true; 612 613 script.onload = () => { 614 // Dispatch custom event when Swiper is loaded 615 window.dispatchEvent(new CustomEvent('amPurifyLoaded', {})); 616 } 617 }, { once: true, passive: true }); 618</script>
618 619</head> 620<body class="hide-registration-note overflow-x-hidden contact-index-index page-layout-1column" id="html-body" ontouchstart="() => {}"> 621 <!-- Google Tag Manager (noscript) -->
vendor: 80 bytes, lines 621-622
621 622 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
622GTM-KM7RPJX9
vendor: 117 bytes, lines 622-624
622" 623 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 624
624<!-- End Google Tag Manager (noscript) --> 625 <input name="form_key" type="hidden" value="xzuVQOR9Ekj125Es" />
625<script type="application/ld+json"> 626{ 627 "@context":"https:\/\/schema.org", 628 "@type":"WebSite", 629 "url":"https:\/\/www.naturelab.it\/", 630 "name":"NatureLab", 631 "alternateName":"NatureLab Srl" 632} 633</script>
vendor: 1 bytes, line 633
633
634<script type="application/ld+json"> 635{ 636 "@context":"https://schema.org", 637 "@type":"OnlineStore", 638 "url":"https://www.naturelab.it/", 639 "logo":"https://www.naturelab.it/media/logo/default/naturelab-shop.png", 640 "image":"https://www.naturelab.it/media/wysiwyg/assets/naturelab-og-image.webp", 641 "name":"NatureLab Srl", 642 "description":"Vendita di integratori alimentari naturali. Fitoterapia e Nutraceutica. Silicio Organico.", 643 "telephone":"00390557478357", 644 "faxNumber":"00390557471053", 645 "email":"[email protected]", 646 "address": { 647 "@type":"PostalAddress", 648 "addressCountry":"IT", 649 "addressLocality":"Firenze", 650 "postalCode":"50129", 651 "streetAddress":"Via Giovanni Berchet 1", 652 "addressRegion":"Toscana" 653 }, 654 "sameAs": [ 655 "https://www.facebook.com/NatureLab.Srl", 656 "https://www.linkedin.com/company/naturelab-srl/", 657 "https://www.instagram.com/naturelab_/", 658 "https://www.pinterest.it/naturelab/", 659 "https://twitter.com/NatureLab_" 660 ] 661} 662</script>
662<script> 663 document.body.addEventListener('touchstart', () => {}, {passive: true, once: true}); 664</script>
vendor: 1 bytes, line 664
664
665<script> 666 (function (hyva) { 667 'use strict'; 668 669 /** 670 * We use multiple Store objects depending on which Alpine version is 671 */ 672 const isAlpineV3 = true; 673 674 /** 675 * @returns {string} 676 */ 677 function getInitEventName() { 678 return isAlpineV3 ? 'alpine:init' : 'spruce:init'; 679 } 680 681 /** 682 * @returns {Object} 683 */ 684 function getStoreObject() { 685 return isAlpineV3 ? Alpine : Spruce; 686 } 687 688 hyva.amStorage = { 689 /** 690 * @param {string} key 691 * @param {Object} object 692 * @returns {void} 693 */ 694 create: (key, object) => { 695 const eventName = key.toLowerCase() + '-created'; 696 697 document.addEventListener(getInitEventName(), () => { 698 getStoreObject().store(key, object); 699 document.dispatchEvent(new Event(eventName)); 700 }); 701 }, 702 703 /** 704 * @param {string} key 705 * @returns {Object} 706 */ 707 getStorage: (key) => { 708 return getStoreObject().store(key); 709 }, 710 711 /** 712 * @param {string} key 713 * @param {Object} object 714 * @returns {void} 715 */ 716 reInit: (key, object) => { 717 isAlpineV3 718 ? getStoreObject().store(key, object) 719 : getStoreObject().reset(key, object); 720 } 721 }; 722 723 724 }(window.hyva = window.hyva || {})); 725</script>
vendor: 1 bytes, line 725
725
726<script> 727 window.amastyCookieManager = window.amastyCookieManager || {}; 728</script>
728 729 730<div x-data="{ 731 ...hyva.modal({ 732 duration: 150, 733 transitionEnter: 'transform duration-150', 734 transitionLeave: 'transform duration-150' 735 }), 736 ...initAmastyCookieBar() 737 }" 738 x-init="initBar()" x-spread="eventListeners" x-bind="eventListeners" x-cloak id="am-cookie-bar" 739 class="w-full fixed bottom-0 z-40" 740 > 741 <div x-cloak x-bind="overlay('am-cookie-bar')" 742 x-spread="overlay('am-cookie-bar')" 743 class=""> 744 <div class="flex w-full bg-white inset-0"> 745 <div x-ref="am-cookie-bar" role="dialog" aria-modal="true" 746 x-no-overlay aria-label="Cookie Bar" 747 class="flex w-full p-4 md:p-2 bg-black relative"> 748 749<button @click="$dispatch('close-cookie-bar')" aria-label="Chiudi" 750 class="absolute right-2 top-2 text-gray-300 transition 751 hover:text-black focus:drop-shadow-md hover:drop-shadow-md"> 752 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" 753 stroke="currentColor" stroke-width="2"> 754 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 755 </svg> 756</button> 757<div class="flex w-full justify-center"> 758 <div class="flex w-full justify-center flex-col px-4 md:px-8"> 759 <div class="w-full"> 760 <p class="max-h-[30vh] text-sm text-white"> 761 Su www.naturelab.it usiamo cookie per scopi tecnici e, con il tuo consenso, per funzionalità , esperienza, misurazione e marketing, come da <a href="/cookie-policy/" title="Cookie Policy" class="font-bold">Cookie Policy</a>. Puoi gestire o revocare il consenso in qualsiasi momento cliccando su "Imposta cookies". Il rifiuto può limitare alcune funzionalità . Clicca âAccettaâ per acconsentire o âPersonalizzaâ per gestire le preferenze. Chiudi per continuare senza accettare. </p> 762 </div> 763 <div class="flex flex-wrap w-full justify-center gap-2"> 764 765 766<button 767 @click.prevent="$dispatch('cookiebar-action-allow')" 768 class="w-full justify-center w-auto mb-1 text-white bg-primary tracking-wider hover:bg-natlabLigthBlue py-1 px-4 rounded-lg" 769 data-role="action"> 770 Accetta</button> 771 772<button 773 @click.prevent="$dispatch('cookiebar-action-settings')" 774 class="w-full justify-center w-auto mb-1 text-bg-primary bg-white py-1 px-4 rounded-lg" 775 data-role="action"> 776 Personalizza</button> 777 </div> 778 </div> 779</div> 780 781 </div> 782 </div> 783 </div> 784</div> 785
786<script> 787 'use strict'; 788 789 function initAmastyCookieBar() { 790 return { 791 eventListeners: { 792 ['@close-cookie-bar']() { 793 this.hide('am-cookie-bar'); 794 }, 795 ['@open-cookie-bar']() { 796 this.show('am-cookie-bar'); 797 }, 798 ['@amasty-cookie-group-updated.window']() { 799 const lastUpdate = !!hyva.amStorage 800 ? hyva.amStorage.getStorage('AmastyCookieGroups').lastUpdate 801 : 0; 802 if (this.isShowNotificationBar(this.firstShowProcess, lastUpdate)) { 803 !this.opened['am-cookie-bar'] && 804 this.show('am-cookie-bar'); 805 } else { 806 !!this.opened['am-cookie-bar'] && 807 this.hide('am-cookie-bar'); 808 } 809 } 810 }, 811 812 firstShowProcess: '0', 813 814 initBar: function () { 815 window.isGdprCookieEnabled = true; 816 !!hyva.amStorage && hyva.amStorage.getStorage('AmastyCookieGroups').updateGroupData(); 817 }, 818 819 /** 820 * @param {string|number} firstShowProcess 821 * @param {number} lastUpdate 822 * @returns {boolean} 823 */ 824 isShowNotificationBar: function (firstShowProcess, lastUpdate) { 825 return (this.isNeedFirstShow(firstShowProcess, lastUpdate) && !hyva.getCookie('amcookie_allowed') 826 || this.isNeedShowOnUpdate(lastUpdate)); 827 }, 828 829 /** 830 * @param {string|number} firstShowProcess 831 * @param {number} lastUpdate 832 * @returns {boolean} 833 */ 834 isNeedFirstShow: function (firstShowProcess, lastUpdate) { 835 hyva.getBrowserStorage().setItem('amCookieBarFirstShowTime', lastUpdate); 836 837 if (firstShowProcess === '0') { 838 return true; 839 } 840 841 if (hyva.getBrowserStorage().getItem('amCookieBarFirstShow') !== '1') { 842 hyva.getBrowserStorage().setItem('amCookieBarFirstShow', '1'); 843 844 return true; 845 } 846 847 return false; 848 }, 849 850 /** 851 * @param {number} lastUpdate 852 * @returns {boolean} 853 */ 854 isNeedShowOnUpdate: function (lastUpdate) { 855 if (!lastUpdate) { 856 return false; 857 } 858 859 return this.isNeedShowAfterLastVisit(lastUpdate) || this.isNeedShowAfterLastAccept(lastUpdate); 860 }, 861 862 /** 863 * @param {number} lastUpdate 864 * @returns {boolean} 865 */ 866 isNeedShowAfterLastVisit: function (lastUpdate) { 867 let needToShowAfterLastVisit = 868 lastUpdate > hyva.getBrowserStorage().getItem('amCookieBarFirstShowTime'); 869 870 if (needToShowAfterLastVisit) { 871 hyva.getBrowserStorage().setItem('amCookieBarFirstShow', null); 872 hyva.setCookie('amcookie_allowed', '', -1, true); 873 } 874 875 return needToShowAfterLastVisit; 876 }, 877 878 /** 879 * @param {number} lastUpdate 880 * @returns {boolean} 881 */ 882 isNeedShowAfterLastAccept: function (lastUpdate) { 883 let needToShowAfterLastAccept = false; 884 885 if (hyva.getBrowserStorage().getItem('am-last-cookie-acceptance')) { 886 needToShowAfterLastAccept = 887 lastUpdate > hyva.getBrowserStorage().getItem('am-last-cookie-acceptance'); 888 } 889 890 return needToShowAfterLastAccept; 891 }, 892 }; 893 } 894</script>
894 895<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 896 contentarea" 897 href="#contentarea"> 898 <span> 899 Salta al contenuto </span> 900</a>
901<script> 902 function initHeader() { 903 const open = window.innerWidth > 1024 904 return { 905 searchOpen: false, 906 cart: {}, 907 isCartOpen: false, 908 getData(data) { 909 if (data.cart) { 910 this.cart = data.cart 911 } 912 }, 913 isCartEmpty() { 914 return !this.cart.summary_count 915 }, 916 toggleCart(event) { 917 if (event.detail && event.detail.isOpen !== undefined) { 918 this.isCartOpen = event.detail.isOpen 919 if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { 920 this.$refs.cartButton.focus() 921 } 922 } else { 923 this.isCartOpen = true 924 } 925 } 926 } 927 } 928 929 function initCompareHeader() { 930 return { 931 compareProducts: null, 932 itemCount: 0, 933 receiveCompareData(data) { 934 if (data['compare-products']) { 935 this.compareProducts = data['compare-products']; 936 this.itemCount = this.compareProducts.count; 937 } 938 } 939 } 940 } 941</script>
941 942<!-- Top Header --> 943<div class="bg-natlabLigthGreenVery text-natlabGreen"> 944<style>.cmsb219-col-span-1 { 945grid-column: span 1 / span 1 946} 947.cmsb219-col-span-4 { 948grid-column: span 4 / span 4 949} 950.cmsb219-mx-6 { 951margin-left: 1.5rem; 952margin-right: 1.5rem 953} 954.cmsb219-flex { 955display: flex 956} 957.cmsb219-grid { 958display: grid 959} 960.cmsb219-hidden { 961display: none 962} 963.cmsb219-h-4 { 964height: 1rem 965} 966.cmsb219-w-4 { 967width: 1rem 968} 969.cmsb219-transform { 970transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) 971} 972.cmsb219-grid-cols-1 { 973grid-template-columns: repeat(1, minmax(0, 1fr)) 974} 975.cmsb219-items-center { 976align-items: center 977} 978.cmsb219-gap-1 { 979gap: 0.25rem 980} 981.cmsb219-justify-self-end { 982justify-self: end 983} 984.cmsb219-justify-self-center { 985justify-self: center 986} 987.cmsb219-text-center { 988text-align: center 989} 990.cmsb219-text-\[0\.625rem\] { 991font-size: 0.625rem 992} 993.cmsb219-text-xs { 994font-size: 0.75rem; 995line-height: 1rem 996}
997.cmsb219-font-bold { 998font-weight: 700 999} 1000.cmsb219-uppercase { 1001text-transform: uppercase 1002} 1003.cmsb219-tracking-wider { 1004letter-spacing: 0.05em 1005} 1006.cmsb219-hover\:text-black:hover { 1007--tw-text-opacity: 1; 1008color: rgb(0 0 0 / var(--tw-text-opacity)) 1009} 1010@media (min-width: 1024px) { 1011.cmsb219-lg\:block { 1012display: block 1013} 1014.cmsb219-lg\:grid-cols-6 { 1015grid-template-columns: repeat(6, minmax(0, 1fr)) 1016} 1017.cmsb219-lg\:text-xs { 1018font-size: 0.75rem; 1019line-height: 1rem 1020} 1021}</style> 1022<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="cmsb219-grid cmsb219-grid-cols-1 cmsb219-lg:grid-cols-6 cmsb219-items-center cmsb219-mx-6"> 1023 <div class="cmsb219-hidden cmsb219-lg:block cmsb219-col-span-1"> 1024 <p class="cmsb219-flex cmsb219-items-center cmsb219-gap-1 cmsb219-tracking-wider cmsb219-text-xs cmsb219-font-bold"> 1025 1026 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 25 25" class="cmsb219-w-4 cmsb219-h-4" role="img" aria-hidden="true"><defs><clipPath id="clip-path"><rect id="img" width="25" height="25" rx="3" transform="translate(30 10.906)" fill="#0b4850"></rect></clipPath></defs><g id="Groupe_de_masques_16" data-name="Groupe de masques 16" transform="translate(-30 -10.906)" clip-path="url(#clip-path)"><g id="Calque_2" data-name="Calque 2" transform="translate(30 10.906)"><g id="Pictos-Basic"><g id="call-filled-green"><rect id="safe-zone-0_" data-name="safe-zone-0%" width="25" height="25" fill="none"></rect><path id="call-filled-green-2" data-name="call-filled-green" d="M20.253,15.892a11.16,11.16,0,0,1-3.472-.552.965.965,0,0,0-.983.233l-2.122,2.135a14.6,14.6,0,0,1-6.385-6.372L9.424,9.191a.979.979,0,0,0,.233-.983,11.056,11.056,0,0,1-.549-3.472.962.962,0,0,0-.962-.965h-3.4a.962.962,0,0,0-.965.965A16.465,16.465,0,0,0,20.247,21.219h0a.958.958,0,0,0,.965-.958v-3.4a.962.962,0,0,0-.958-.969Z" fill="#0b4850"></path></g></g></g></g></svg> 1027 <a href="tel:+393467306919" class="cmsb219-hover:text-black" title="Chiamaci" aria-label="Chiama il numero +39 346 7306919"> +39 346 7306919</a> 1028 </p> 1029 </div> 1030 <p class="cmsb219-justify-self-center cmsb219-font-bold cmsb219-tracking-wider cmsb219-text-[0.625rem] cmsb219-lg:text-xs cmsb219-uppercase cmsb219-col-span-4 cmsb219-text-center"> 1031 Spedizione GRATUITA in Italia da 69,00 ⬠1032 </p> 1033 <div class="cmsb219-hidden cmsb219-lg:block cmsb219-justify-self-end cmsb219-col-span-1"> 1034 <p class="cmsb219-flex cmsb219-items-center cmsb219-gap-1 cmsb219-tracking-wider cmsb219-text-xs cmsb219-uppercase cmsb219-font-bold"> 1035 Puoi pagare alla consegna 1036 </p> 1037 </div> 1038</div></div></div> 1039<div id="header" 1040 class="relative z-30 w-full bg-white border-b lg:border-b-0 shadow-lg" 1041 x-data="initHeader()" 1042 @keydown.window.escape="toggleSearch" 1043 @private-content-loaded.window="getData(event.detail.data)" 1044> 1045<div class="container px-0 flex flex-wrap items-center justify-between w-full py-3 lg:py-6"> 1046 <!-- Mobile Menu & Search triggers --> 1047 <div x-data="{ showSearchButton: true }" 1048 @menu-mobile-opened.window="showSearchButton = false" 1049 @menu-mobile-closed.window="showSearchButton = true" 1050 class="w-auto flex" 1051 > 1052 <nav x-data="initMenuMobile_6ac2bbece5921()" @load.window="setActiveMenu($root)" @keydown.window.escape="closeMenu()" class="relative z-20 navigation order-first lg:hidden w-12 h-12 text-natlabGreen" aria-label="Navigazione del sito" role="navigation"> 1053 <!-- mobile --> 1054 <button x-ref="mobileMenuTrigger" class="focus:outline-none focus:border-transparent lg:text-xl focus:ring-0" 1055 @click="openMenu()" :class="{'overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full' : open}" type="button" aria-label="Aprire il menu" aria-haspopup="menu" :aria-expanded="open" :hidden="open"> 1056 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="p-3" width="48" height="48" :class="{ 'hidden' : open, 'block': !open }" aria-hidden="true"> 1057 <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"/> 1058</svg> 1059 </button> 1060 <button @click="closeMenu()" class="absolute flex justify-start w-16 self-start mb-1" aria-label="Chiudi il menu" type="button"> 1061 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="hidden p-3" width="48" height="48" :class="{ 'hidden' : !open, 'block': open }" aria-hidden="true"> 1062 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1063</svg> 1064 </button> 1065 <div x-ref="mobileMenuNavLinks" class=" 1066 fixed top-[100px] right-0 w-full h-full hidden 1067 flex-col bg-natlabLigthGreenVery 1068 overflow-y-auto overflow-x-hidden 1069 " :class="{ 'flex': open, 'hidden': !open }" :aria-hidden="open ? 'false' : 'true'" role="dialog" aria-modal="true"> 1070 <ul class="border-t flex flex-col" aria-label="Link di navigazione del sito"> 1071 <li data-child-id="category-node-36-main" class="level-0"> 1072 <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{
1073 '-translate-x-full' : mobilePanelActiveId, 1074 'translate-x-0' : !mobilePanelActiveId 1075 }"> 1076 <a class="flex items-center w-full px-4 py-4 1077 border-b cursor-pointer bg-container-lighter border-container 1078 text-sm uppercase font-medium text-natlabGreen level-0 1079 " href="https://www.naturelab.it/integratori-naturali/" title="Integratori Naturali"> 1080 Integratori Naturali </a> 1081 <button @click="openSubcategory('category-node-36')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-2 cursor-pointer 1082 " aria-label="Aprire Integratori Naturali sottocategorie" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-36'"> 1083 <div class="w-6 h-6 rounded"> 1084 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1085 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1086</svg> 1087 </div> 1088 </button> 1089 </div> 1090 <div data-child-id="category-node-36" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 1091 'hidden': mobilePanelActiveId !== 'category-node-36' 1092 }"> 1093 <ul class="transition-transform duration-200 ease-in-out translate-x-full transform pb-48" :class="{ 1094 'translate-x-full' : mobilePanelActiveId !== 'category-node-36', 1095 'translate-x-0' : mobilePanelActiveId === 'category-node-36', 1096 }" aria-label="Sottocategorie"> 1097 <li> 1098 <button type="button" class="flex items-center px-2 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-36-main')" aria-label="Torna alle categorie principali"> 1099 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" aria-hidden="true"> 1100 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1101</svg> 1102 <span class="ml-4 text-sm uppercase font-medium"> 1103 Integratori Naturali </span> 1104 </button> 1105 </li> 1106 <li> 1107 <a href="https://www.naturelab.it/integratori-per-l-organismo/" title="Per il tuo Benessere" class="flex items-center w-full px-4 1108 cursor-pointer bg-natlabLigthGreenVery border-container 1109 pt-3 pb-3 text-sm uppercase font-medium text-natlabGreen"> 1110 <span class="ml-6"> 1111 Per il tuo Benessere </span> 1112 </a> 1113 1114 <ul class="border-b pb-4 bg-white"> 1115 <li class="ml-10 py-1"> 1116 <a href="https://www.naturelab.it/integratori-antiossidanti/" title="Antiossidanti" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
1117 <span class="font-medium">Antiossidanti </a> 1118 </li> 1119 <li class="ml-10 py-1"> 1120 <a href="https://www.naturelab.it/integratori-articolazioni-ossa-muscoli/" title="Articolazioni, Ossa e Muscoli" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1121 <span class="font-medium">Articolazioni, Ossa e Muscoli </a> 1122 </li> 1123 <li class="ml-10 py-1"> 1124 <a href="https://www.naturelab.it/integratori-microcircolo-e-gambe-pesanti/" title="Microcircolo e Gambe Pesanti" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1125 <span class="font-medium">Microcircolo e Gambe Pesanti </a> 1126 </li> 1127 <li class="ml-10 py-1"> 1128 <a href="https://www.naturelab.it/integratori-colesterolo/" title="Colesterolo" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1129 <span class="font-medium">Colesterolo </a> 1130 </li> 1131 <li class="ml-10 py-1"> 1132 <a href="https://www.naturelab.it/integratori-cuore-e-pressione/" title="Cuore e Pressione" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1133 <span class="font-medium">Cuore e Pressione </a> 1134 </li> 1135 <li class="ml-10 py-1"> 1136 <a href="https://www.naturelab.it/integratori-depurativi-e-drenanti/" title="Depurativi e Drenanti" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1137 <span class="font-medium">Depurativi e Drenanti </a> 1138 </li> 1139 <li class="ml-10 py-1"> 1140 <a href="https://www.naturelab.it/integratori-difese-immunitarie-raffreddore-e-tosse/" title="Difese Immunitarie" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
1141 <span class="font-medium">Difese Immunitarie </a> 1142 </li> 1143 <li class="ml-10 py-1"> 1144 <a href="https://www.naturelab.it/integratori-naturali-donna-menopausa/" title="Donna e Menopausa" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1145 <span class="font-medium">Donna e Menopausa </a> 1146 </li> 1147 <li class="ml-10 py-1"> 1148 <a href="https://www.naturelab.it/integratori-intestino-sano-digestione-transito/" title="Intestino Sano e Digestione" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1149 <span class="font-medium">Intestino Sano e Digestione </a> 1150 </li> 1151 <li class="ml-10 py-1"> 1152 <a href="https://www.naturelab.it/integratori-memoria-e-concentrazione/" title="Memoria e Concentrazione" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1153 <span class="font-medium">Memoria e Concentrazione </a> 1154 </li> 1155 <li class="ml-10 py-1"> 1156 <a href="https://www.naturelab.it/integratori-sistema-nervoso-ansia-stress-e-insonnia/" title="Sistema Nervoso, Stress e Insonnia" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1157 <span class="font-medium">Sistema Nervoso, Stress e Insonnia </a> 1158 </li> 1159 <li class="ml-10 py-1"> 1160 <a href="https://www.naturelab.it/integratori-a-supporto-per-l-oncologia/" title="Supporto per l'Oncologia" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1161 <span class="font-medium">Supporto per l'Oncologia </a> 1162 </li> 1163 <li class="ml-10 py-1"> 1164 <a href="https://www.naturelab.it/integratori-tonici-adattogeni-vitalita/" title="Tonici, Adattogeni, Vitalità" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
1165 <span class="font-medium">Tonici, Adattogeni, Vitalità </a> 1166 </li> 1167 <li class="ml-10 py-1"> 1168 <a href="https://www.naturelab.it/integratori-vie-urinarie/" title="Vie Urinarie" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1169 <span class="font-medium">Vie Urinarie </a> 1170 </li> 1171 </ul> 1172 1173 </li> 1174 <li> 1175 <a href="https://www.naturelab.it/integratori-per-il-corpo/" title="Per il tuo Equilibrio" class="flex items-center w-full px-4 1176 cursor-pointer bg-natlabLigthGreenVery border-container 1177 pt-3 pb-3 text-sm uppercase font-medium text-natlabGreen"> 1178 <span class="ml-6"> 1179 Per il tuo Equilibrio </span> 1180 </a> 1181 1182 <ul class="border-b pb-4 bg-white"> 1183 <li class="ml-10 py-1"> 1184 <a href="https://www.naturelab.it/integratori-per-capelli-e-unghie/" title="Capelli e Unghie" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1185 <span class="font-medium">Capelli e Unghie </a> 1186 </li> 1187 <li class="ml-10 py-1"> 1188 <a href="https://www.naturelab.it/integratori-controllo-del-peso-e-metabolismo/" title="Controllo del Peso e Metabolismo" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1189 <span class="font-medium">Controllo del Peso e Metabolismo </a> 1190 </li> 1191 <li class="ml-10 py-1"> 1192 <a href="https://www.naturelab.it/integratori-per-la-pelle-anti-aging/" title="Pelle e Anti Aging" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1193 <span class="font-medium">Pelle e Anti Aging </a> 1194 </li> 1195 <li class="ml-10 py-1"> 1196 <a href="https://www.naturelab.it/integratori-per-l-esposizione-
1196al-sole-e-preparazione-all-abbronzatura/" title="Esposizione al Sole e Abbronzatura" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1197 <span class="font-medium">Esposizione al Sole e Abbronzatura </a> 1198 </li> 1199 <li class="ml-10 py-1"> 1200 <a href="https://www.naturelab.it/inestetismi-della-cellulite/" title="Inestetismi della cellulite" class="block w-full pt-3 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 1201 <span class="font-medium">Inestetismi della cellulite </a> 1202 </li> 1203 </ul> 1204 1205 </li> 1206 </ul> 1207 1208 </div> 1209 </li> 1210 <li data-child-id="category-node-4-main" class="level-0"> 1211 <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ 1212 '-translate-x-full' : mobilePanelActiveId, 1213 'translate-x-0' : !mobilePanelActiveId 1214 }"> 1215 <a class="flex items-center w-full px-4 py-4 1216 border-b cursor-pointer bg-container-lighter border-container 1217 text-sm uppercase font-medium text-natlabGreen level-0 1218 " href="https://www.naturelab.it/silicio-organico/" title="Silicio Organico"> 1219 Silicio Organico </a> 1220 </div> 1221 </li> 1222 <li data-child-id="category-node-147-main" class="level-0"> 1223 <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ 1224 '-translate-x-full' : mobilePanelActiveId, 1225 'translate-x-0' : !mobilePanelActiveId 1226 }"> 1227 <a class="flex items-center w-full px-4 py-4 1228 border-b cursor-pointer bg-container-lighter border-container 1229 text-sm uppercase font-medium text-natlabGreen level-0 1230 " href="https://www.naturelab.it/vitamine-e-minerali/" title="Vitamine e Minerali"> 1231 Vitamine e Minerali </a> 1232 <button @click="openSubcategory('category-node-147')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-2 cursor-pointer 1233 " aria-label="Aprire Vitamine e Minerali sottocategorie" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-147'"> 1234 <div class="w-6 h-6 rounded"> 1235 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1236 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1237</svg> 1238 </div> 1239 </button> 1240 </div> 1241 <div data-child-id="category-node-147" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 1242 'hidden': mobilePanelActiveId !== 'category-node-147' 1243 }"> 1244 <ul class="transition-transform duration-200 ease-in-out translate-x-full transform pb-48" :class="{ 1245 'translate-x-full' : mobilePanelActiveId !== 'category-node-147', 1246 'translate-x-0' : mobilePanelActiveId === 'category-node-147', 1247 }" aria-label="Sottocategorie"> 1248 <li> 1249 <button type="button" class="flex items-center px-2 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-147-main')" aria-label="Torna alle categorie principali"> 1250 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" aria-hidden="true"> 1251 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1252</svg>
1253 <span class="ml-4 text-sm uppercase font-medium"> 1254 Vitamine e Minerali </span> 1255 </button> 1256 </li> 1257 <li> 1258 <a href="https://www.naturelab.it/integratori-vitamine-naturali/" title="Vitamine Naturali" class="flex items-center w-full px-4 1259 cursor-pointer bg-natlabLigthGreenVery border-container 1260 pt-5 font-medium text-natlabGreen"> 1261 <span class="ml-6"> 1262 Vitamine Naturali </span> 1263 </a> 1264 1265 1266 </li> 1267 <li> 1268 <a href="https://www.naturelab.it/biocean-plasma-di-quinton/" title="Acqua di Mare Plasma di Quinton" class="flex items-center w-full px-4 1269 cursor-pointer bg-natlabLigthGreenVery border-container 1270 pt-5 font-medium text-natlabGreen"> 1271 <span class="ml-6"> 1272 Acqua di Mare Plasma di Quinton </span> 1273 </a> 1274 1275 1276 </li> 1277 <li> 1278 <a href="https://www.naturelab.it/integratori-remineralizzanti/" title="Remineralizzanti" class="flex items-center w-full px-4 1279 cursor-pointer bg-natlabLigthGreenVery border-container 1280 pt-5 font-medium text-natlabGreen"> 1281 <span class="ml-6"> 1282 Remineralizzanti </span> 1283 </a> 1284 1285 1286 </li> 1287 <li> 1288 <a href="https://www.naturelab.it/oligoelementi-integratori-oligotracce/" title="Oligoelementi e Oligotracce" class="flex items-center w-full px-4 1289 cursor-pointer bg-natlabLigthGreenVery border-container 1290 pt-5 font-medium text-natlabGreen"> 1291 <span class="ml-6"> 1292 Oligoelementi e Oligotracce </span> 1293 </a> 1294 1295 1296 </li> 1297 <li> 1298 <a href="https://www.naturelab.it/argento-colloidale/" title="Argento Colloidale" class="flex items-center w-full px-4 1299 cursor-pointer bg-natlabLigthGreenVery border-container 1300 pt-5 font-medium text-natlabGreen"> 1301 <span class="ml-6"> 1302 Argento Colloidale </span> 1303 </a> 1304 1305 1306 </li> 1307 </ul> 1308 1309 </div> 1310 </li> 1311 <li data-child-id="category-node-126-main" class="level-0"> 1312 <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{
1313 '-translate-x-full' : mobilePanelActiveId, 1314 'translate-x-0' : !mobilePanelActiveId 1315 }"> 1316 <a class="flex items-center w-full px-4 py-4 1317 border-b cursor-pointer bg-container-lighter border-container 1318 text-sm uppercase font-medium text-natlabGreen level-0 1319 " href="https://www.naturelab.it/gemmoderivati/" title="Gemmoderivati"> 1320 Gemmoderivati </a> 1321 <button @click="openSubcategory('category-node-126')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-2 cursor-pointer 1322 " aria-label="Aprire Gemmoderivati sottocategorie" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-126'"> 1323 <div class="w-6 h-6 rounded"> 1324 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1325 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1326</svg> 1327 </div> 1328 </button> 1329 </div> 1330 <div data-child-id="category-node-126" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 1331 'hidden': mobilePanelActiveId !== 'category-node-126' 1332 }"> 1333 <ul class="transition-transform duration-200 ease-in-out translate-x-full transform pb-48" :class="{ 1334 'translate-x-full' : mobilePanelActiveId !== 'category-node-126', 1335 'translate-x-0' : mobilePanelActiveId === 'category-node-126', 1336 }" aria-label="Sottocategorie"> 1337 <li> 1338 <button type="button" class="flex items-center px-2 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-126-main')" aria-label="Torna alle categorie principali"> 1339 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" aria-hidden="true"> 1340 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1341</svg> 1342 <span class="ml-4 text-sm uppercase font-medium"> 1343 Gemmoderivati </span> 1344 </button> 1345 </li> 1346 <li> 1347 <a href="https://www.naturelab.it/sistema-cardiovascolare/" title="Sistema Cardiovascolare" class="flex items-center w-full px-4 1348 cursor-pointer bg-natlabLigthGreenVery border-container 1349 pt-5 font-medium text-natlabGreen"> 1350 <span class="ml-6"> 1351 Sistema Cardiovascolare </span> 1352 </a> 1353 1354 1355 </li> 1356 <li> 1357 <a href="https://www.naturelab.it/sistema-circolatorio/" title="Sistema Circolatorio" class="flex items-center w-full px-4 1358 cursor-pointer bg-natlabLigthGreenVery border-container 1359 pt-5 font-medium text-natlabGreen">
1360 <span class="ml-6"> 1361 Sistema Circolatorio </span> 1362 </a> 1363 1364 1365 </li> 1366 <li> 1367 <a href="https://www.naturelab.it/sistema-digestivo/" title="Sistema Digestivo" class="flex items-center w-full px-4 1368 cursor-pointer bg-natlabLigthGreenVery border-container 1369 pt-5 font-medium text-natlabGreen"> 1370 <span class="ml-6"> 1371 Sistema Digestivo </span> 1372 </a> 1373 1374 1375 </li> 1376 <li> 1377 <a href="https://www.naturelab.it/sistema-immunitario/" title="Sistema Immunitario" class="flex items-center w-full px-4 1378 cursor-pointer bg-natlabLigthGreenVery border-container 1379 pt-5 font-medium text-natlabGreen"> 1380 <span class="ml-6"> 1381 Sistema Immunitario </span> 1382 </a> 1383 1384 1385 </li> 1386 <li> 1387 <a href="https://www.naturelab.it/sistema-nervoso/" title="Sistema Nervoso" class="flex items-center w-full px-4 1388 cursor-pointer bg-natlabLigthGreenVery border-container 1389 pt-5 font-medium text-natlabGreen"> 1390 <span class="ml-6"> 1391 Sistema Nervoso </span> 1392 </a> 1393 1394 1395 </li> 1396 <li> 1397 <a href="https://www.naturelab.it/sistema-osteo-articolare/" title="Sistema Osteo-Articolare" class="flex items-center w-full px-4 1398 cursor-pointer bg-natlabLigthGreenVery border-container 1399 pt-5 font-medium text-natlabGreen"> 1400 <span class="ml-6"> 1401 Sistema Osteo-Articolare </span> 1402 </a> 1403 1404 1405 </li> 1406 <li> 1407 <a href="https://www.naturelab.it/sistema-respiratorio/" title="Sistema Respiratorio" class="flex items-center w-full px-4 1408 cursor-pointer bg-natlabLigthGreenVery border-container 1409 pt-5 font-medium text-natlabGreen"> 1410 <span class="ml-6"> 1411 Sistema Respiratorio </span> 1412 </a> 1413 1414 1415 </li> 1416 <li> 1417 <a href="https://www.naturelab.it/sistema-uro-genitale/" title="Sistema Uro-Genitale" class="flex items-center w-full px-4 1418 cursor-pointer bg-natlabLigthGreenVery border-container 1419 pt-5 font-medium text-natlabGreen">
1420 <span class="ml-6"> 1421 Sistema Uro-Genitale </span> 1422 </a> 1423 1424 1425 </li> 1426 </ul> 1427 1428 </div> 1429 </li> 1430 <li data-child-id="category-node-19-main" class="level-0"> 1431 <div class="flex items-center transition-transform duration-150 ease-in-out transform" :class="{ 1432 '-translate-x-full' : mobilePanelActiveId, 1433 'translate-x-0' : !mobilePanelActiveId 1434 }"> 1435 <a class="flex items-center w-full px-4 py-4 1436 border-b cursor-pointer bg-container-lighter border-container 1437 text-sm uppercase font-medium text-natlabGreen level-0 1438 " href="https://www.naturelab.it/rimedi-floreali/" title="Rimedi Floreali"> 1439 Rimedi Floreali </a> 1440 <button @click="openSubcategory('category-node-19')" class="absolute right-0 flex items-center justify-center w-11 h-11 mr-2 cursor-pointer 1441 " aria-label="Aprire Rimedi Floreali sottocategorie" aria-haspopup="true" :aria-expanded="mobilePanelActiveId === 'category-node-19'"> 1442 <div class="w-6 h-6 rounded"> 1443 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-full h-full p-1" width="24" height="24" aria-hidden="true"> 1444 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1445</svg> 1446 </div> 1447 </button> 1448 </div> 1449 <div data-child-id="category-node-19" class="absolute top-0 right-0 z-10 flex flex-col gap-1 w-full h-full p-1 bg-container-lighter" :class="{ 1450 'hidden': mobilePanelActiveId !== 'category-node-19' 1451 }"> 1452 <ul class="transition-transform duration-200 ease-in-out translate-x-full transform pb-48" :class="{ 1453 'translate-x-full' : mobilePanelActiveId !== 'category-node-19', 1454 'translate-x-0' : mobilePanelActiveId === 'category-node-19', 1455 }" aria-label="Sottocategorie"> 1456 <li> 1457 <button type="button" class="flex items-center px-2 py-4 border-b cursor-pointer bg-container border-container w-full border-t" @click="backToMainCategories('category-node-19-main')" aria-label="Torna alle categorie principali"> 1458 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" aria-hidden="true"> 1459 <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"/> 1460</svg> 1461 <span class="ml-4 text-sm uppercase font-medium"> 1462 Rimedi Floreali </span> 1463 </button> 1464 </li> 1465 <li> 1466 <a href="https://www.naturelab.it/fiori-per-problemi-emozionali/" title="Rimedi floreali per l'equilibrio emotivo" class="flex items-center w-full px-4 1467 cursor-pointer bg-natlabLigthGreenVery border-container 1468 pt-5 font-medium text-natlabGreen">
1469 <span class="ml-6"> 1470 Rimedi floreali per l'equilibrio emotivo </span> 1471 </a> 1472 1473 1474 </li> 1475 <li> 1476 <a href="https://www.naturelab.it/fiori-per-stati-d-animo-negativi/" title="Rimedi floreali per stati d'animo e momenti difficili" class="flex items-center w-full px-4 1477 cursor-pointer bg-natlabLigthGreenVery border-container 1478 pt-5 font-medium text-natlabGreen"> 1479 <span class="ml-6"> 1480 Rimedi floreali per stati d'animo e momenti difficili </span> 1481 </a> 1482 1483 1484 </li> 1485 <li> 1486 <a href="https://www.naturelab.it/fiori-per-disarmonie-del-carattere/" title="Rimedi floreali per equilibrio e consapevolezza personale" class="flex items-center w-full px-4 1487 cursor-pointer bg-natlabLigthGreenVery border-container 1488 pt-5 font-medium text-natlabGreen"> 1489 <span class="ml-6"> 1490 Rimedi floreali per equilibrio e consapevolezza personale </span> 1491 </a> 1492 1493 1494 </li> 1495 <li> 1496 <a href="https://www.naturelab.it/fiori-per-conflitti-e-difficolta-relazionali/" title="Rimedi floreali per relazioni e sfera affettiva" class="flex items-center w-full px-4 1497 cursor-pointer bg-natlabLigthGreenVery border-container 1498 pt-5 font-medium text-natlabGreen"> 1499 <span class="ml-6"> 1500 Rimedi floreali per relazioni e sfera affettiva </span> 1501 </a> 1502 1503 1504 </li> 1505 <li> 1506 <a href="https://www.naturelab.it/fiori-per-disagi-psicologici/" title="Rimedi floreali per paure, tensioni e insicurezze" class="flex items-center w-full px-4 1507 cursor-pointer bg-natlabLigthGreenVery border-container 1508 pt-5 font-medium text-natlabGreen"> 1509 <span class="ml-6"> 1510 Rimedi floreali per paure, tensioni e insicurezze </span> 1511 </a> 1512 1513 1514 </li> 1515 <li> 1516 <a href="https://www.naturelab.it/fiori-per-disturbi-fisici/" title="Rimedi floreali e benessere psicofisico" class="flex items-center w-full px-4 1517 cursor-pointer bg-natlabLigthGreenVery border-container 1518 pt-5 font-medium text-natlabGreen"> 1519 <span class="ml-6"> 1520 Rimedi floreali e benessere psicofisico </span> 1521 </a> 1522 1523 1524 </li> 1525 <li> 1526 <a href="https://www.naturelab.it/fiori-per-malattie-di-origine-psicosomatica/" title="Rimedi floreali per stress e somatizzazione" class="flex items-center w-full px-4 1527 cursor-pointer bg-natlabLigthGreenVery border-container 1528 pt-5 font-medium text-natlabGreen">
1529 <span class="ml-6"> 1530 Rimedi floreali per stress e somatizzazione </span> 1531 </a> 1532 1533 1534 </li> 1535 </ul> 1536 1537 </div> 1538 </li> 1539 <li class="level-0"> 1540 <div class="flex items-center transition-transform duration-150 ease-in-out transform translate-x-0" :class="{ 1541 '-translate-x-full' : mobilePanelActiveId, 1542 'translate-x-0' : !mobilePanelActiveId 1543 }"> 1544 <a class="flex items-center w-full px-4 py-4 1545 border-b cursor-pointer bg-natlabGreen border-container 1546 text-sm uppercase font-medium text-white level-0 1547 " href="/blog/" title="Blog Lab>"> 1548 Blog Lab<Label></Label></a> 1549 </div> 1550 </li> 1551 <li class="level-0"> 1552 <div class="flex items-center transition-transform duration-150 ease-in-out transform translate-x-0" :class="{ 1553 '-translate-x-full' : mobilePanelActiveId, 1554 'translate-x-0' : !mobilePanelActiveId 1555 }"> 1556 <a class="flex items-center w-full px-4 py-4 1557 border-b cursor-pointer bg-natlabGreen border-container 1558 text-sm uppercase font-medium text-white level-0 1559 " href="/chi-siamo/" title="Chi siamo>"> 1560 Chi siamo<Label></Label></a> 1561 </div> 1562 </li> 1563 </ul> 1564 </div> 1565 </nav>
1566<script> 1567 'use strict'; 1568 1569 const initMenuMobile_6ac2bbece5921 = () => { 1570 return { 1571 mobilePanelActiveId: null, 1572 open: false, 1573 setActiveMenu(menuNode) { 1574 Array.from(menuNode.querySelectorAll('a')).filter(link => { 1575 return link.href === window.location.href.split('?')[0]; 1576 }).map(item => { 1577 item.classList.remove('text-natlabGreen'); 1578 item.closest('li.level-0') && 1579 item.closest('li.level-0').querySelector('a.level-0').classList.add('bg-natlabLigthGreen'); 1580 }); 1581 }, 1582 openMenu() { 1583 this.open = true; 1584 this.$dispatch('menu-mobile-opened'); 1585 this.$nextTick(() => hyva.trapFocus(this.$refs['mobileMenuNavLinks'])); 1586 // Prevent from body scrolling while mobile menu opened 1587 //document.body.style.position = 'fixed'; 1588 }, 1589 closeMenu() { 1590 document.body.style.position = ''; 1591 1592 if (this.open) { 1593 this.$nextTick(() => this.$refs['mobileMenuTrigger'].focus() || hyva.releaseFocus()); 1594 }; 1595 1596 this.open = false; 1597 this.$dispatch('menu-mobile-closed'); 1598 this.mobilePanelActiveId = null; 1599 }, 1600 openSubcategory(index) { 1601 const menuNodeRef = document.querySelector('[data-child-id=' + index + ']') 1602 this.mobilePanelActiveId = this.mobilePanelActiveId === index ? 0 : index 1603 this.$nextTick(() => hyva.trapFocus(menuNodeRef)) 1604 }, 1605 backToMainCategories(index) { 1606 const menuNodeRef = document.querySelector('[data-child-id=' + index + ']') 1607 this.mobilePanelActiveId = 0 1608 this.$nextTick(() => { 1609 hyva.trapFocus(this.$refs['mobileMenuNavLinks']) 1610 menuNodeRef.querySelector('a').focus() 1611 }) 1612 } 1613 } 1614 } 1615</script>
1615 <!--Search Icon--> 1616 <button 1617 x-show="showSearchButton" 1618 id="menu-search-icon" 1619 class="no-underline hover:text-natlabLigthBlue flex items-center justify-center text-sm cursor-pointer" 1620 @click.prevent=" 1621 searchOpen = !searchOpen; 1622 $dispatch('search-open'); 1623 " 1624 aria-label="Attiva/disattiva il modulo di ricerca" 1625 aria-haspopup="true" 1626 :aria-expanded="searchOpen" 1627 x-ref="searchButton" 1628 > 1629 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6" width="14" height="14" aria-hidden="true"> 1630 <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/> 1631</svg> 1632 <span class="text-gray-600 hover:text-natlabLigthBlue text-xs uppercase hidden lg:block ml-2">Cerca</span> 1633 </button> 1634 1635 </div> 1636 1637 <!--Logo--> 1638 <div class="absolute transform -translate-x-1/2 left-1/2"> 1639 1640 <a 1641 class="flex items-center justify-center text-xl font-medium tracking-wide text-gray-800 1642 no-underline hover:no-underline font-title mt-1 lg:mt-0" 1643 href="https://www.naturelab.it/" 1644 aria-label="Vai alla pagina iniziale" 1645 > 1646 <img 1647 class="h-9 lg:h-auto" 1648 src="https://www.naturelab.it/media/logo/default/naturelab-shop.svg" 1649 alt="NatureLab" 1650 width="213" height="48" /> 1651 </a> 1652</div> 1653 <div 1654 1655 class="flex justify-between items-center mr-2 lg:mr-0"> 1656 <!--Customer Icon & Dropdown--> 1657 1658<div class="hidden lg:block mr-10"> 1659 <nav class="flex uppercase text-xs" aria-labelledby="customer-menu"> 1660 <a class="block text-gray-600 hover:text-black tracking-normal 1661 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 1662 before:bottom-0 before:left-0 before:bg-black 1663 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 1664 before:transition before:ease-in-out before:duration-300" 1665 onclick="hyva.setCookie && hyva.setCookie( 1666 'login_redirect', 1667 window.location.href, 1668 1 1669 )" 1670 href="https://www.naturelab.it/customer/account/login/"> 1671 Accedi </a> 1672 <span class="mx-2 inline-bloc text-gray-600 normal-case">o</span> 1673 <a class="block text-gray-600 hover:text-black tracking-normal 1674 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 1675 before:bottom-0 before:left-0 before:bg-black 1676 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 1677 before:transition before:ease-in-out before:duration-300" 1678 href="https://www.naturelab.it/customer/account/create/" 1679 > 1680 Crea un Account </a> 1681 </nav> 1682</div> 1683 1684 1685 1686<div class="lg:hidden relative inline-block" x-data="{ open: false }" @keyup.escape="open = false"> 1687 <button type="button" href="https://www.naturelab.it/customer/account/" id="customer-menu" class="block hover:text-black" @click="open = !open" @click.outside="open = false" :aria-expanded="open ? 'true' : 'false'" aria-label="Il mio Account" aria-haspopup="true"> 1688 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#08484E" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" class="h-7 w-7" aria-hidden="true"> 1689 <circle cx="12" cy="8" r="5"/><path d="M20 21a8 8 0 0 0-16 0"/></svg> 1690 </button> 1691 <nav 1692 class=" 1693 absolute right-0 z-20 w-40 py-2 mt-2 -mr-4 px-1 overflow-auto origin-top-right rounded-sm 1694 shadow-lg sm:w-48 lg:mt-3 bg-container-lighter 1695 " 1696 x-cloak 1697 x-show="open" 1698 aria-labelledby="customer-menu" 1699 @click.outside="open = false" 1700 > 1701 <a class="block px-4 text-sm py-1 text-gray-600 hover:text-black hover:bg-natlabLigthGreen" 1702 onclick="hyva.setCookie && hyva.setCookie( 1703 'login_redirect', 1704 window.location.href, 1705 1 1706 )" 1707 href="https://www.naturelab.it/customer/account/login/"> 1708 Accedi </a> 1709 <a class="block px-4 text-sm py-1 text-gray-600 hover:text-black hover:bg-natlabLigthGreen" 1710 href="https://www.naturelab.it/customer/account/create/" 1711 > 1712 Crea un Account </a> 1713 </nav> 1714</div> <div class="relative pt-1 ml-4 mr-2 lg:ml-0"> 1715 <!--Cart Icon--> 1716 <!-- <php if ($showMiniCart): ?>@click.prevent.stop="$dispatch('toggle-cart',{});"<php endif ?> --> 1717 <a id="menu-cart-icon" @click.prevent.stop="$dispatch('toggle-cart',{});" class="relative inline-block mt-1 lg:mt-0 no-underline hover:text-black" x-ref="cartButton" :aria-disabled="isCartEmpty()" title="Carrello" href="https://www.naturelab.it/checkout/cart/index/">
1718 <span class="sr-only label" x-text="` 1719 Attiva/disattiva il minicarrello, 1720 ${isCartEmpty() ? 1721 '255 255 255' : 1722 hyva.str( 1723 'You have %1 product%2 in your cart.', 1724 cart.summary_count, 1725 cart.summary_count === 1 ? '' : 's' 1726 )}` 1727 "></span> 1728 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 fill-natlabGreen text-natlabGreen hover:fill-natlabLigthBlue hover:text-natlabLigthBlue" viewBox="0 0 24 24"> 1729 <path fill-rule="nonzero" d="M19 7a1 1 0 0 1 1 1v13a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V8a1 1 0 0 1 1-1l3.014.002A31.37 31.37 0 0 1 4 6a6 6 0 0 1 11.996-.225L16 6v1h3zM4 8.5H1.5V21a1.5 1.5 0 0 0 1.356 1.493L3 22.5h14a1.5 1.5 0 0 0 1.493-1.356L18.5 21V8.5H16V12h-1.5V8.5h-9V12H4V8.5zm6-7A4.5 4.5 0 0 0 5.5 6c0 .253.002.485.007.696L5.515 7H14.5V6a4.5 4.5 0 0 0-4.288-4.495L10 1.5z"></path> 1730 </svg> 1731 <span x-text="cart.summary_count" x-show="!isCartEmpty()" x-cloak class="absolute top-0 right-0 hidden h-5 w-5 -mt-3 -mr-3 text-tiny leading-5 text-center text-xs 1732 text-white uppercase transform -translate-x-1 translate-y-1/2 rounded-full bg-natlabLigthBlue" :class="{ 1733 'hidden': !cart.summary_count, 1734 'block': cart.summary_count }" aria-hidden="true">0</span> 1735 </a>
1736 <!--Cart Drawer--> 1737
1737<script> 1738 console.log('init cart drawer'); 1739 function initCartDrawer() { 1740 return { 1741 open: false, 1742 isLoading: false, 1743 cart: {}, 1744 maxItemsToDisplay: 10, 1745 itemsCount: 0, 1746 totalCartAmount: 0, 1747 getData(data) { 1748 if (data.cart) { 1749 this.cart = data.cart; 1750 this.itemsCount = data.cart.items && data.cart.items.length || 0; 1751 this.totalCartAmount = this.cart.summary_count; 1752 this.setCartItems(); 1753 } 1754 this.isLoading = false; 1755 }, 1756 cartItems: [], 1757 getItemCountTitle() { 1758 return hyva.strf('Visualizzati\u0020\u00250\u0020di\u0020\u00251\u0020prodotti\u0020nel\u0020carrello', this.maxItemsToDisplay, this.totalCartAmount) 1759 }, 1760 setCartItems() { 1761 this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; 1762 if (this.maxItemsToDisplay > 0) { 1763 this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); 1764 } 1765 }, 1766 deleteItemFromCart(itemId) { 1767 this.isLoading = true; 1768 const formKey = hyva.getFormKey(); 1769 const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; 1770 fetch(postUrl, { 1771 "headers": { 1772 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 1773 }, 1774 "body": "form_key=" + formKey + "&item_id=" + itemId, 1775 "method": "POST", 1776 "mode": "cors", 1777 "credentials": "include" 1778 }).then(response => { 1779 if (response.redirected) { 1780 window.location.href = response.url; 1781 } else if (response.ok) { 1782 return response.json(); 1783 } else { 1784 window.dispatchMessages && window.dispatchMessages([{ 1785 type: 'warning', 1786 text: 'Impossibile\u0020rimuovere\u0020l\u0027articolo\u0020dal\u0020carrello.' 1787 }]); 1788 this.isLoading = false; 1789 } 1790 }).then(result => { 1791 window.dispatchMessages && window.dispatchMessages([{ 1792 type: result.success ? 'success' : 'error', 1793 text: result.success ? 1794 'Hai\u0020rimosso\u0020l\u0027articolo.' : 1795 result.error_message 1796 }], result.success ? 5000 : 0) 1797 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 1798 }); 1799 }, 1800 setItemQty(item, item_qty) { 1801 if (item && 1 <= item_qty && item_qty <= 999) { 1802 item.qty = item_qty; 1803 this.updateItemQtyCart(item.item_id, item_qty); 1804 } 1805 }, 1806 updateItemQtyCart(itemId, itemQty) { 1807 var formKey = document.querySelector('input[name=form_key]').value; 1808 this.isLoading = true; 1809 1810 fetch(BASE_URL + "checkout/sidebar/updateItemQty/", { 1811 "headers": { 1812 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 1813 }, 1814 "body": new URLSearchParams({ 1815 "form_key": formKey, 1816 "item_id": itemId, 1817 "item_qty": itemQty 1818 }).toString(), 1819 "method": "POST", 1820 "mode": "cors", 1821 "credentials": "include" 1822 }).then(function(response) { 1823 if (response.redirected) { 1824 window.location.href = response.url; 1825 } else if (response.ok) { 1826 return response.json(); 1827 } else { 1828 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 1829 [{ 1830 type: "warning", 1831 text: 'Could\u0020not\u0020update\u0020items.' 1832 }], 5000 1833 ); 1834 } 1835 }).then(function(response) { 1836 if (response.success) { 1837 // Success, add to cart 1838 document.querySelector(`[data-error-prod-id="${itemId}"]`).innerText = ''; 1839 var reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data"); 1840 window.dispatchEvent(reloadCustomerDataEvent); 1841 } else { 1842 // Error, set an error in the cart item 1843 document.querySelector(`[data-error-prod-id="${itemId}"]`).innerText = response.error_message; 1844 var reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data"); 1845 window.dispatchEvent(reloadCustomerDataEvent); 1846 } 1847 }); 1848 }, 1849 toggleCartDrawer(event) { 1850 if (event.detail && event.detail.isOpen !== undefined) { 1851 if (event.detail.isOpen) { 1852 this.openCartDrawer() 1853 } else { 1854 this.open = false 1855 this.$refs && this.$refs.cartDialogContent && hyva.releaseFocus(this.$refs.cartDialogContent) 1856 } 1857 } else { 1858 this.openCartDrawer() 1859 } 1860 }, 1861 openCartDrawer() { 1862 this.open = true; 1863 this.$nextTick(() => { 1864 this.$refs && this.$refs.cartDialogContent && hyva.trapFocus(this.$refs.cartDialogContent) 1865 }) 1866 }, 1867 closeCartDrawer() { 1868 this.$dispatch('toggle-cart', { 1869 isOpen: false 1870 }) 1871 } 1872 } 1873 } 1874</script>
1874 1875<section x-cloak 1876 x-show="cart" 1877 id="cart-drawer" 1878 x-data="initCartDrawer()" 1879 @private-content-loaded.window="getData($event.detail.data)" 1880 @toggle-cart.window="toggleCartDrawer($event)" 1881 @keydown.window.escape="closeCartDrawer" 1882> 1883<div role="dialog" 1884 aria-labelledby="cart-drawer-title" 1885 aria-modal="true" 1886 :aria-hidden="!open" 1887 class="fixed inset-y-0 right-0 z-30 flex max-w-full"> 1888 <div class="backdrop" 1889 x-show="open" 1890 x-transition:enter="ease-in-out duration-500" 1891 x-transition:enter-start="opacity-0" 1892 x-transition:enter-end="opacity-100" 1893 x-transition:leave="ease-in-out duration-500" 1894 x-transition:leave-start="opacity-100" 1895 x-transition:leave-end="opacity-0" 1896 role="button" 1897 @click="closeCartDrawer" 1898 aria-label="Chiudi il minicarrello"></div> 1899 <div class="relative w-screen max-w-md shadow-2xl" 1900 x-show="open" 1901 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 1902 x-transition:enter-start="translate-x-full" 1903 x-transition:enter-end="translate-x-0" 1904 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 1905 x-transition:leave-start="translate-x-0" 1906 x-transition:leave-end="translate-x-full" 1907 x-ref="cartDialogContent" 1908 role="region" 1909 :tabindex="open ? 0 : -1" 1910 aria-label="Il mio carrello" 1911 1912 > 1913 <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl"> 1914 <header class="px-4"> 1915 <div class="text-primary text-base lg:text-lg font-medium">Il mio carrello </div> 1916 </header> 1917 1918 1919 <template x-if="!itemsCount"> 1920 <div class="relative px-4 py-6 bg-white border-bs sm:px-6 border-container"> 1921 Il carrello è vuoto. </div> 1922 </template> 1923 1924 <template x-if="itemsCount"> 1925 <div class="overflow-y-auto"> 1926 <div class="relative grid gap-6 px-4 py-6 overflow-x-hidden bg-white border-b 1927 sm:gap-8 sm:px-6 border-container" 1928 > 1929 1930 <template x-for="item in cartItems"> 1931 <div class="flex items-start p-4 -m-4 border-b border-natlabLigthGreen last:border-0 space-x-4 transition duration-150 ease-in-out"> 1932 <a :href="item.product_url" 1933 class="w-1/4" 1934 :aria-label="hyva.strf('Prodotto\u0020\u0022\u00250\u0022', item.product_name)" 1935 > 1936 <img 1937 :src="item.product_image.src" 1938 :width="item.product_image.width" 1939 :height="item.product_image.height" 1940 loading="lazy" 1941 alt="" 1942 /> 1943 </a> 1944 <div class="w-3/4 space-y-1"> 1945 <div> 1946 <p class="p-0"> 1947 <span x-html="item.product_name"></span> 1948 </p> 1949 </div> 1950 <template x-for="option in item.options"> 1951 <div class="pt-2"> 1952 <p class="" x-text="option.label + ':'"></p> 1953 <p class="" x-html="option.value"></p> 1954 </div> 1955 </template> 1956 <p class="text-sm p-0"><span x-html="item.product_price"></span></p> 1957 <div class="flex justify-between pt-2"> 1958 <div class="inline-flex border border-gray-300"> 1959 <button class="px-3" data-action="decrement" @click="setItemQty(item, item.qty - 1)">
1960 <span class="m-auto text-lg">â</span> 1961 </button> 1962 <input class="remove-arrow border-0 py-3 px-0 text-center text-sm focus:ring-0" type="number" min="1" max="999" name="custom-input-number" :value="item.qty" @input="if($event.target.value) setItemQty(item, $event.target.value)" rel="no-arrows"> 1963 <button class="px-3" data-action="increment" @click="setItemQty(item, item.qty + 1)"> 1964 <span class="m-auto text-lg">+</span> 1965 </button> 1966 </div> 1967 1968 <div class="cursor-pointer flex items-center text-natlabLigthBlue hover:cursor-pointer" @click="deleteItemFromCart(item.item_id)"> 1969 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-7 w-7" width="20" height="20" aria-hidden="true"> 1970 <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"/> 1971</svg> 1972 </div> 1973 </div> 1974 </div> 1975 <div class="text-sm text-error" x-bind:data-error-prod-id="item.item_id"></div> 1976 1977 </div> 1978 </template> 1979 </div> 1980 1981 1982 <div class="relative grid gap-4 bg-white !mt-4" x-show="cart.summary_count > 0"> 1983 <div class="w-full px-4"> 1984 <p>Importo: <span x-html="cart.subtotal"></span></p> 1985 </div> 1986 <div class="w-full px-4 mb-4"> 1987 <a @click.prevent.stop="$dispatch('toggle-authentication', 1988 {url: 'https://www.naturelab.it/checkout/index/index/'});" 1989 href="https://www.naturelab.it/checkout/index/index/" 1990 class="inline-flex btn btn-primary icon-padlock w-full justify-center uppercase tracking-wider" 1991> 1992 <span></span> 1993 Checkout</a> 1994 <span></span> 1995 <a href="https://www.naturelab.it/checkout/cart/" 1996 class="text-gray-600 underline hover:text-black hover:no-underline text-sm w-full inline-block text-center mt-3" 1997 > 1998 Visualizza e modifica il carrello </a> 1999 </div> 2000 2001 2002 2003 2004 2005 </div> 2006 </div> 2007 </template> 2008 2009 </div> 2010 2011 <button 2012 type="button" 2013 @click="closeCartDrawer" 2014 aria-label="Chiudi il minicarrello" 2015 class="absolute top-0 right-0 p-4 mt-2 text-gray-500 transition-colors hover:text-black" 2016 > 2017 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" width="24" height="24" aria-hidden="true"> 2018 <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"/> 2019</svg> 2020 </button> 2021 </div> 2022 <div 2023 class="z-50 fixed inset-0 flex justify-center items-center bg-white/70 select-none" 2024 x-show="isLoading" 2025 x-cloak 2026 x-transition.opacity.duration.200ms 2027> 2028 <div class="flex text-primary items-center"> 2029 <svg height="40" width="40" viewBox="0 0 24 24" stroke="currentColor" fill="none" stroke-width="2" stroke-linecap="round" class="animate-spin" aria-hidden="true"> 2030 <circle style="opacity: .3;" cx="12" cy="12" r="10"/> 2031 <path fill="none" stroke-width="2" d="M12,2 a10,10 0 0,1 10,10"/> 2032</svg> 2033 </div> 2034</div> 2035 </div> 2036</section> <!--Authentication Pop-Up--> 2037
2037<script> 2038 function initAuthentication() { 2039 return { 2040 open: false, 2041 forceAuthentication: false, 2042 checkoutUrl: 'https://www.naturelab.it/checkout/index/', 2043 errors: 0, 2044 hasCaptchaToken: 0, 2045 displayErrorMessage: false, 2046 errorMessages: [], 2047 setErrorMessages: function setErrorMessages(messages) { 2048 this.errorMessages = [messages]; 2049 this.displayErrorMessage = this.errorMessages.length; 2050 }, 2051 submitForm: function () { 2052 // Do not rename $form, the variable is expected to be declared in the recaptcha output 2053 const $form = document.querySelector('#login-form'); 2054 2055 if (this.errors === 0) { 2056 this.dispatchLoginRequest($form); 2057 } 2058 }, 2059 onPrivateContentLoaded: function (data) { 2060 const isLoggedIn = data.customer && data.customer.firstname; 2061 if (data.cart && !isLoggedIn) { 2062 this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; 2063 } 2064 }, 2065 redirectIfAuthenticated: function (event) { 2066 if (event.detail && event.detail.url) { 2067 this.checkoutUrl = event.detail.url; 2068 } 2069 if (!this.forceAuthentication) { 2070 window.location.href = this.checkoutUrl; 2071 } 2072 }, 2073 dispatchLoginRequest: function(form) { 2074 this.isLoading = true; 2075 const username = this.$refs['customer-email'].value; 2076 const password = this.$refs['customer-password'].value; 2077 const formKey = hyva.getFormKey(); 2078 const bodyFields = { 2079 'username': username, 2080 'password': password, 2081 'formKey': formKey 2082 }; 2083 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 2084 const recaptchaField = fieldName && form[fieldName]; 2085 if (recaptchaField) { 2086 bodyFields[fieldName] = recaptchaField.value; 2087 } 2088 fetch('https://www.naturelab.it/customer/ajax/login/', { 2089 method: 'POST', 2090 headers: { 2091 'Content-Type': 'application/json', 2092 'X-Requested-With': 'XMLHttpRequest' 2093 }, 2094 body: JSON.stringify(bodyFields) 2095 } 2096 ).then(response => { 2097 return response.json() 2098 } 2099 ).then(data=> { 2100 this.isLoading = false; 2101 if (data.errors) { 2102 dispatchMessages([{ 2103 type: 'error', 2104 text: data.message 2105 }], 5000); 2106 this.errors = 1; 2107 this.hasCaptchaToken = 0; 2108 } else { 2109 window.location.href = this.checkoutUrl; 2110 } 2111 }); 2112 } 2113 } 2114 } 2115</script>
2115 2116<section id="authentication-popup" 2117 x-data="initAuthentication()" 2118 @private-content-loaded.window="onPrivateContentLoaded($event.detail.data)" 2119 @toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)" 2120 @keydown.window.escape="open = false" 2121> 2122 <div role="dialog" 2123 aria-modal="true" 2124 @click.outside="open = false" 2125 class="inset-y-0 right-0 z-30 flex max-w-full" 2126 :class="{'fixed': open }" x-cloak x-show="open" 2127 > 2128 <div class="relative w-screen max-w-md pt-16 bg-container-lighter" 2129 x-show="open" 2130 x-cloak="" 2131 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 2132 x-transition:enter-start="translate-x-full" 2133 x-transition:enter-end="translate-x-0" 2134 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 2135 x-transition:leave-start="translate-x-0" 2136 x-transition:leave-end="translate-x-full" 2137 > 2138 <div 2139 x-show="open" 2140 x-cloak="" 2141 x-transition:enter="ease-in-out duration-500" 2142 x-transition:enter-start="opacity-0" 2143 x-transition:enter-end="opacity-100" 2144 x-transition:leave="ease-in-out duration-500" 2145 x-transition:leave-start="opacity-100" 2146 x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2 mt-2"> 2147 <button @click="open = false;" aria-label="Close panel" 2148 class="p-2 text-gray-300 transition duration-150 ease-in-out hover:text-black"> 2149 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> 2150 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path></svg> 2151 </button> 2152 </div> 2153 <div class="flex flex-col h-full py-6 space-y-6 bg-white shadow-xl overflow-y-auto"> 2154 <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> 2155 <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> 2156 <strong class="font-medium">Checkout using your account</strong> 2157 </p> 2158 2159 <form class="form form-login" 2160 method="post" 2161 @submit.prevent="submitForm();" 2162 id="login-form" 2163 > 2164 <div class="fieldset login"> 2165 <div class="field email required"> 2166 <label class="label" for="form-login-username" form="login-form" > 2167 <span>Indirizzo email</span> 2168 </label> 2169 <div class="control"> 2170 <input name="username" 2171 id="form-login-username" 2172 x-ref="customer-email" 2173 @change="errors = 0" 2174 type="email" 2175 required 2176 class="form-input input-text" 2177 > 2178 </div> 2179 </div> 2180 <div class="field password required"> 2181 <label for="form-login-password" class="label" form="login-form"> 2182 <span>Password</span> 2183 </label> 2184 <div class="control"> 2185 <input name="password" 2186 id="form-login-password" 2187 type="password" 2188 class="form-input input-text" 2189 required 2190 x-ref="customer-password" 2191 @change="errors = 0" 2192 > 2193 </div> 2194 </div> 2195 2196 <input name="context" type="hidden" value="checkout" /> 2197 <div class="actions-toolbar flex justify-between pt-6 pb-2 items-center"> 2198 <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" 2199 > 2200 Accedi </button> 2201 <a href="https://www.naturelab.it/customer/account/forgotpassword/" 2202 > 2203 Hai dimenticato la password? </a> 2204 </div> 2205 2206 </div> 2207 </form> 2208 </div> 2209 <div class="mx-4"> 2210 </div> 2211 <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm">
2212 <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> 2213 <strong class="font-medium">Checkout as a new customer</strong> 2214 </p> 2215 2216 <div class="block-content"> 2217 <p class="mb-1"> 2218 La creazione di un account ha molti vantaggi: </p> 2219 <ul class="list-disc pl-5"> 2220 <li> Vedere lo stato dell'ordine e della spedizione</li> 2221 <li> Cronologia ordini</li> 2222 <li> Checkout più veloce</li> 2223 </ul> 2224 <div class="actions-toolbar flex justify-between mt-6 mb-2 items-center"> 2225 <a href="https://www.naturelab.it/customer/account/create/" 2226 class="inline-flex btn btn-primary"> 2227 Crea un Account </a> 2228 </div> 2229 </div> 2230 </div> 2231 </div> 2232 </div> 2233 </div> 2234</section> 2235 </div> 2236 </div> 2237 </div> 2238 <!--Main Navigation--> 2239 <div x-data="initMenuDesktop_6ac2bbed0b008()" class="z-20 order-2 sm:order-1 lg:order-2 navigation hidden lg:flex pt-2"> 2240 <!-- desktop --> 2241 <div x-ref="nav-desktop" @load.window="setActiveMenu($root)" class="hidden lg:block lg:relative lg:min-h-0 lg:px-0 lg:pt-0 w-full text-center container"> 2242 <nav class="w-full duration-150 ease-in-out transform flex justify-center relative min-h-0 transition-display" aria-label="Menu principale"> 2243 <ul class="flex justify-start"> 2244 <li class="relative level-0" @mouseenter="hoverPanelActiveId = 'category-node-36'; searchOpen = false" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0"> 2245 <span class="flex items-center mx-4 xl:mx-6 mb-3"> 2246 <a class="w-full py-4.5 pb-1 uppercase tracking-normal relative 2247 before:content-[''] before:absolute before:block before:w-full before:h-[2px] 2248 before:bottom-0 before:left-0 before:bg-black 2249 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 2250 before:transition before:ease-in-out before:duration-300 level-0 main-menu-item" href="https://www.naturelab.it/integratori-naturali/" title="Integratori Naturali" @focus="hoverPanelActiveId = 0"> 2251 Integratori Naturali </a> 2252 </span> 2253 <ul class="absolute z-20 px-10 py-4 -ml-16 border bg-white text-left min-w-[230px] transition ease-in-out duration-200 left-1/4 2254 transform opacity-0 pointer-events-none -translate-x-1/4 2255 grid flex-1 grid-cols-2 gap-y-4 gap-x-8 p-4 min-w-[550px]" :class="{ 2256 'opacity-0 pointer-events-none -translate-x-1/4' : hoverPanelActiveId !== 'category-node-36', 2257 'opacity-100 pointer-events-auto translate-x-0' : hoverPanelActiveId === 'category-node-36' 2258 }"> 2259 <li> 2260 <a href="https://www.naturelab.it/integratori-per-l-organismo/" title="Per il tuo Benessere" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
2261 <span class="pb-0.5 tracking-normal 2262 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2263 before:bottom-0 before:left-0 before:bg-black 2264 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2265 before:transition before:ease-in-out before:duration-300 main-menu-item 2266 uppercase before:h-[2px] "> 2267 Per il tuo Benessere </span> 2268 </a> 2269 <ul> 2270 <li> 2271 <a href="https://www.naturelab.it/integratori-antiossidanti/" title="Antiossidanti" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2272 <span class="pb-0.5 tracking-normal 2273 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2274 before:bottom-0 before:left-0 before:bg-black 2275 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2276 before:transition before:ease-in-out before:duration-300 main-menu-item">Antiossidanti </a> 2277 </li> 2278 <li> 2279 <a href="https://www.naturelab.it/integratori-articolazioni-ossa-muscoli/" title="Articolazioni, Ossa e Muscoli" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2280 <span class="pb-0.5 tracking-normal 2281 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2282 before:bottom-0 before:left-0 before:bg-black 2283 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2284 before:transition before:ease-in-out before:duration-300 main-menu-item">Articolazioni, Ossa e Muscoli </a> 2285 </li> 2286 <li> 2287 <a href="https://www.naturelab.it/integratori-microcircolo-e-gambe-pesanti/" title="Microcircolo e Gambe Pesanti" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2288 <span class="pb-0.5 tracking-normal 2289 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2290 before:bottom-0 before:left-0 before:bg-black 2291 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2292 before:transition before:ease-in-out before:duration-300 main-menu-item">Microcircolo e Gambe Pesanti </a> 2293 </li> 2294 <li> 2295 <a href="https://www.naturelab.it/integratori-colesterolo/" title="Colesterolo" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
2296 <span class="pb-0.5 tracking-normal 2297 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2298 before:bottom-0 before:left-0 before:bg-black 2299 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2300 before:transition before:ease-in-out before:duration-300 main-menu-item">Colesterolo </a> 2301 </li> 2302 <li> 2303 <a href="https://www.naturelab.it/integratori-cuore-e-pressione/" title="Cuore e Pressione" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2304 <span class="pb-0.5 tracking-normal 2305 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2306 before:bottom-0 before:left-0 before:bg-black 2307 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2308 before:transition before:ease-in-out before:duration-300 main-menu-item">Cuore e Pressione </a> 2309 </li> 2310 <li> 2311 <a href="https://www.naturelab.it/integratori-depurativi-e-drenanti/" title="Depurativi e Drenanti" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2312 <span class="pb-0.5 tracking-normal 2313 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2314 before:bottom-0 before:left-0 before:bg-black 2315 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2316 before:transition before:ease-in-out before:duration-300 main-menu-item">Depurativi e Drenanti </a> 2317 </li> 2318 <li> 2319 <a href="https://www.naturelab.it/integratori-difese-immunitarie-raffreddore-e-tosse/" title="Difese Immunitarie" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2320 <span class="pb-0.5 tracking-normal 2321 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2322 before:bottom-0 before:left-0 before:bg-black 2323 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2324 before:transition before:ease-in-out before:duration-300 main-menu-item">Difese Immunitarie </a> 2325 </li> 2326 <li> 2327 <a href="https://www.naturelab.it/integratori-naturali-donna-menopausa/" title="Donna e Menopausa" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
2328 <span class="pb-0.5 tracking-normal 2329 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2330 before:bottom-0 before:left-0 before:bg-black 2331 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2332 before:transition before:ease-in-out before:duration-300 main-menu-item">Donna e Menopausa </a> 2333 </li> 2334 <li> 2335 <a href="https://www.naturelab.it/integratori-intestino-sano-digestione-transito/" title="Intestino Sano e Digestione" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2336 <span class="pb-0.5 tracking-normal 2337 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2338 before:bottom-0 before:left-0 before:bg-black 2339 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2340 before:transition before:ease-in-out before:duration-300 main-menu-item">Intestino Sano e Digestione </a> 2341 </li> 2342 <li> 2343 <a href="https://www.naturelab.it/integratori-memoria-e-concentrazione/" title="Memoria e Concentrazione" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2344 <span class="pb-0.5 tracking-normal 2345 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2346 before:bottom-0 before:left-0 before:bg-black 2347 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2348 before:transition before:ease-in-out before:duration-300 main-menu-item">Memoria e Concentrazione </a> 2349 </li> 2350 <li> 2351 <a href="https://www.naturelab.it/integratori-sistema-nervoso-ansia-stress-e-insonnia/" title="Sistema Nervoso, Stress e Insonnia" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2352 <span class="pb-0.5 tracking-normal 2353 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2354 before:bottom-0 before:left-0 before:bg-black 2355 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2356 before:transition before:ease-in-out before:duration-300 main-menu-item">Sistema Nervoso, Stress e Insonnia </a> 2357 </li> 2358 <li> 2359 <a href="https://www.naturelab.it/integratori-a-supporto-per-l-oncologia/" title="Supporto per l'Oncologia" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
2360 <span class="pb-0.5 tracking-normal 2361 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2362 before:bottom-0 before:left-0 before:bg-black 2363 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2364 before:transition before:ease-in-out before:duration-300 main-menu-item">Supporto per l'Oncologia </a> 2365 </li> 2366 <li> 2367 <a href="https://www.naturelab.it/integratori-tonici-adattogeni-vitalita/" title="Tonici, Adattogeni, Vitalità" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2368 <span class="pb-0.5 tracking-normal 2369 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2370 before:bottom-0 before:left-0 before:bg-black 2371 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2372 before:transition before:ease-in-out before:duration-300 main-menu-item">Tonici, Adattogeni, Vitalità </a> 2373 </li> 2374 <li> 2375 <a href="https://www.naturelab.it/integratori-vie-urinarie/" title="Vie Urinarie" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2376 <span class="pb-0.5 tracking-normal 2377 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2378 before:bottom-0 before:left-0 before:bg-black 2379 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2380 before:transition before:ease-in-out before:duration-300 main-menu-item">Vie Urinarie </a> 2381 </li> 2382 </ul> 2383 </li> 2384 <li> 2385 <a href="https://www.naturelab.it/integratori-per-il-corpo/" title="Per il tuo Equilibrio" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2386 <span class="pb-0.5 tracking-normal 2387 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2388 before:bottom-0 before:left-0 before:bg-black 2389 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2390 before:transition before:ease-in-out before:duration-300 main-menu-item 2391 uppercase before:h-[2px] "> 2392 Per il tuo Equilibrio </span> 2393 </a> 2394 <ul> 2395 <li> 2396 <a href="https://www.naturelab.it/integratori-per-capelli-e-unghie/" title="Capelli e Unghie" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
2397 <span class="pb-0.5 tracking-normal 2398 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2399 before:bottom-0 before:left-0 before:bg-black 2400 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2401 before:transition before:ease-in-out before:duration-300 main-menu-item">Capelli e Unghie </a> 2402 </li> 2403 <li> 2404 <a href="https://www.naturelab.it/integratori-controllo-del-peso-e-metabolismo/" title="Controllo del Peso e Metabolismo" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2405 <span class="pb-0.5 tracking-normal 2406 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2407 before:bottom-0 before:left-0 before:bg-black 2408 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2409 before:transition before:ease-in-out before:duration-300 main-menu-item">Controllo del Peso e Metabolismo </a> 2410 </li> 2411 <li> 2412 <a href="https://www.naturelab.it/integratori-per-la-pelle-anti-aging/" title="Pelle e Anti Aging" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2413 <span class="pb-0.5 tracking-normal 2414 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2415 before:bottom-0 before:left-0 before:bg-black 2416 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2417 before:transition before:ease-in-out before:duration-300 main-menu-item">Pelle e Anti Aging </a> 2418 </li> 2419 <li> 2420 <a href="https://www.naturelab.it/integratori-per-l-esposizione-al-sole-e-preparazione-all-abbronzatura/" title="Esposizione al Sole e Abbronzatura" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())"> 2421 <span class="pb-0.5 tracking-normal 2422 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2423 before:bottom-0 before:left-0 before:bg-black 2424 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2425 before:transition before:ease-in-out before:duration-300 main-menu-item">Esposizione al Sole e Abbronzatura </a> 2426 </li> 2427 <li> 2428 <a href="https://www.naturelab.it/inestetismi-della-cellulite/" title="Inestetismi della cellulite" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D36]').focus())">
2429 <span class="pb-0.5 tracking-normal 2430 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2431 before:bottom-0 before:left-0 before:bg-black 2432 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2433 before:transition before:ease-in-out before:duration-300 main-menu-item">Inestetismi della cellulite </a> 2434 </li> 2435 </ul> 2436 </li> 2437 </ul> 2438 </li> 2439 <li class="relative level-0" @mouseenter="hoverPanelActiveId = 'category-node-4'; searchOpen = false" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0"> 2440 <span class="flex items-center mx-4 xl:mx-6 mb-3"> 2441 <a class="w-full py-4.5 pb-1 uppercase tracking-normal relative 2442 before:content-[''] before:absolute before:block before:w-full before:h-[2px] 2443 before:bottom-0 before:left-0 before:bg-black 2444 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 2445 before:transition before:ease-in-out before:duration-300 level-0 main-menu-item" href="https://www.naturelab.it/silicio-organico/" title="Silicio Organico" @focus="hoverPanelActiveId = 0"> 2446 Silicio Organico </a> 2447 </span> 2448 </li> 2449 <li class="relative level-0" @mouseenter="hoverPanelActiveId = 'category-node-147'; searchOpen = false" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0"> 2450 <span class="flex items-center mx-4 xl:mx-6 mb-3"> 2451 <a class="w-full py-4.5 pb-1 uppercase tracking-normal relative 2452 before:content-[''] before:absolute before:block before:w-full before:h-[2px] 2453 before:bottom-0 before:left-0 before:bg-black 2454 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 2455 before:transition before:ease-in-out before:duration-300 level-0 main-menu-item" href="https://www.naturelab.it/vitamine-e-minerali/" title="Vitamine e Minerali" @focus="hoverPanelActiveId = 0"> 2456 Vitamine e Minerali </a> 2457 </span> 2458 <ul class="absolute z-20 px-10 py-4 -ml-16 border bg-white text-left min-w-[230px] transition ease-in-out duration-200 left-1/4 2459 transform opacity-0 pointer-events-none -translate-x-1/4 2460 " :class="{ 2461 'opacity-0 pointer-events-none -translate-x-1/4' : hoverPanelActiveId !== 'category-node-147', 2462 'opacity-100 pointer-events-auto translate-x-0' : hoverPanelActiveId === 'category-node-147' 2463 }"> 2464 <li> 2465 <a href="https://www.naturelab.it/integratori-vitamine-naturali/" title="Vitamine Naturali" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D147]').focus())">
2466 <span class="pb-0.5 tracking-normal 2467 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2468 before:bottom-0 before:left-0 before:bg-black 2469 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2470 before:transition before:ease-in-out before:duration-300 main-menu-item 2471 "> 2472 Vitamine Naturali </span> 2473 </a> 2474 </li> 2475 <li> 2476 <a href="https://www.naturelab.it/biocean-plasma-di-quinton/" title="Acqua di Mare Plasma di Quinton" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D147]').focus())"> 2477 <span class="pb-0.5 tracking-normal 2478 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2479 before:bottom-0 before:left-0 before:bg-black 2480 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2481 before:transition before:ease-in-out before:duration-300 main-menu-item 2482 "> 2483 Acqua di Mare Plasma di Quinton </span> 2484 </a> 2485 </li> 2486 <li> 2487 <a href="https://www.naturelab.it/integratori-remineralizzanti/" title="Remineralizzanti" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D147]').focus())"> 2488 <span class="pb-0.5 tracking-normal 2489 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2490 before:bottom-0 before:left-0 before:bg-black 2491 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2492 before:transition before:ease-in-out before:duration-300 main-menu-item 2493 "> 2494 Remineralizzanti </span> 2495 </a> 2496 </li> 2497 <li> 2498 <a href="https://www.naturelab.it/oligoelementi-integratori-oligotracce/" title="Oligoelementi e Oligotracce" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D147]').focus())"> 2499 <span class="pb-0.5 tracking-normal 2500 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2501 before:bottom-0 before:left-0 before:bg-black 2502 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2503 before:transition before:ease-in-out before:duration-300 main-menu-item 2504 "> 2505 Oligoelementi e Oligotracce </span> 2506 </a> 2507 </li> 2508 <li> 2509 <a href="https://www.naturelab.it/argento-colloidale/" title="Argento Colloidale" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D147]').focus())">
2510 <span class="pb-0.5 tracking-normal 2511 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2512 before:bottom-0 before:left-0 before:bg-black 2513 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2514 before:transition before:ease-in-out before:duration-300 main-menu-item 2515 "> 2516 Argento Colloidale </span> 2517 </a> 2518 </li> 2519 </ul> 2520 </li> 2521 <li class="relative level-0" @mouseenter="hoverPanelActiveId = 'category-node-126'; searchOpen = false" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0"> 2522 <span class="flex items-center mx-4 xl:mx-6 mb-3"> 2523 <a class="w-full py-4.5 pb-1 uppercase tracking-normal relative 2524 before:content-[''] before:absolute before:block before:w-full before:h-[2px] 2525 before:bottom-0 before:left-0 before:bg-black 2526 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 2527 before:transition before:ease-in-out before:duration-300 level-0 main-menu-item" href="https://www.naturelab.it/gemmoderivati/" title="Gemmoderivati" @focus="hoverPanelActiveId = 0"> 2528 Gemmoderivati </a> 2529 </span> 2530 <ul class="absolute z-20 px-10 py-4 -ml-16 border bg-white text-left min-w-[230px] transition ease-in-out duration-200 left-1/4 2531 transform opacity-0 pointer-events-none -translate-x-1/4 2532 " :class="{ 2533 'opacity-0 pointer-events-none -translate-x-1/4' : hoverPanelActiveId !== 'category-node-126', 2534 'opacity-100 pointer-events-auto translate-x-0' : hoverPanelActiveId === 'category-node-126' 2535 }"> 2536 <li> 2537 <a href="https://www.naturelab.it/sistema-cardiovascolare/" title="Sistema Cardiovascolare" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())"> 2538 <span class="pb-0.5 tracking-normal 2539 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2540 before:bottom-0 before:left-0 before:bg-black 2541 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2542 before:transition before:ease-in-out before:duration-300 main-menu-item 2543 "> 2544 Sistema Cardiovascolare </span> 2545 </a> 2546 </li> 2547 <li> 2548 <a href="https://www.naturelab.it/sistema-circolatorio/" title="Sistema Circolatorio" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())">
2549 <span class="pb-0.5 tracking-normal 2550 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2551 before:bottom-0 before:left-0 before:bg-black 2552 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2553 before:transition before:ease-in-out before:duration-300 main-menu-item 2554 "> 2555 Sistema Circolatorio </span> 2556 </a> 2557 </li> 2558 <li> 2559 <a href="https://www.naturelab.it/sistema-digestivo/" title="Sistema Digestivo" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())"> 2560 <span class="pb-0.5 tracking-normal 2561 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2562 before:bottom-0 before:left-0 before:bg-black 2563 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2564 before:transition before:ease-in-out before:duration-300 main-menu-item 2565 "> 2566 Sistema Digestivo </span> 2567 </a> 2568 </li> 2569 <li> 2570 <a href="https://www.naturelab.it/sistema-immunitario/" title="Sistema Immunitario" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())"> 2571 <span class="pb-0.5 tracking-normal 2572 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2573 before:bottom-0 before:left-0 before:bg-black 2574 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2575 before:transition before:ease-in-out before:duration-300 main-menu-item 2576 "> 2577 Sistema Immunitario </span> 2578 </a> 2579 </li> 2580 <li> 2581 <a href="https://www.naturelab.it/sistema-nervoso/" title="Sistema Nervoso" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())"> 2582 <span class="pb-0.5 tracking-normal 2583 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2584 before:bottom-0 before:left-0 before:bg-black 2585 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2586 before:transition before:ease-in-out before:duration-300 main-menu-item 2587 "> 2588 Sistema Nervoso </span> 2589 </a> 2590 </li> 2591 <li> 2592 <a href="https://www.naturelab.it/sistema-osteo-articolare/" title="Sistema Osteo-Articolare" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())">
2593 <span class="pb-0.5 tracking-normal 2594 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2595 before:bottom-0 before:left-0 before:bg-black 2596 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2597 before:transition before:ease-in-out before:duration-300 main-menu-item 2598 "> 2599 Sistema Osteo-Articolare </span> 2600 </a> 2601 </li> 2602 <li> 2603 <a href="https://www.naturelab.it/sistema-respiratorio/" title="Sistema Respiratorio" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())"> 2604 <span class="pb-0.5 tracking-normal 2605 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2606 before:bottom-0 before:left-0 before:bg-black 2607 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2608 before:transition before:ease-in-out before:duration-300 main-menu-item 2609 "> 2610 Sistema Respiratorio </span> 2611 </a> 2612 </li> 2613 <li> 2614 <a href="https://www.naturelab.it/sistema-uro-genitale/" title="Sistema Uro-Genitale" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D126]').focus())"> 2615 <span class="pb-0.5 tracking-normal 2616 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2617 before:bottom-0 before:left-0 before:bg-black 2618 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2619 before:transition before:ease-in-out before:duration-300 main-menu-item 2620 "> 2621 Sistema Uro-Genitale </span> 2622 </a> 2623 </li> 2624 </ul> 2625 </li> 2626 <li class="relative level-0" @mouseenter="hoverPanelActiveId = 'category-node-19'; searchOpen = false" @mouseleave="hoverPanelActiveId = 0" @keyup.escape="hoverPanelActiveId = 0"> 2627 <span class="flex items-center mx-4 xl:mx-6 mb-3"> 2628 <a class="w-full py-4.5 pb-1 uppercase tracking-normal relative 2629 before:content-[''] before:absolute before:block before:w-full before:h-[2px] 2630 before:bottom-0 before:left-0 before:bg-black 2631 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 2632 before:transition before:ease-in-out before:duration-300 level-0 main-menu-item" href="https://www.naturelab.it/rimedi-floreali/" title="Rimedi Floreali" @focus="hoverPanelActiveId = 0"> 2633 Rimedi Floreali </a> 2634 </span> 2635 <ul class="absolute z-20 px-10 py-4 -ml-16 border bg-white text-left min-w-[230px] transition ease-in-out duration-200 left-1/4 2636 transform opacity-0 pointer-events-none -translate-x-1/4 2637 " :class="{ 2638 'opacity-0 pointer-events-none -translate-x-1/4' : hoverPanelActiveId !== 'category-node-19', 2639 'opacity-100 pointer-events-auto translate-x-0' : hoverPanelActiveId === 'category-node-19' 2640 }"> 2641 <li> 2642 <a href="https://www.naturelab.it/fiori-per-problemi-emozionali/" title="Rimedi floreali per l'equilibrio emotivo" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D19]').focus())">
2643 <span class="pb-0.5 tracking-normal 2644 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2645 before:bottom-0 before:left-0 before:bg-black 2646 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2647 before:transition before:ease-in-out before:duration-300 main-menu-item 2648 "> 2649 Rimedi floreali per l'equilibrio emotivo </span> 2650 </a> 2651 </li> 2652 <li> 2653 <a href="https://www.naturelab.it/fiori-per-stati-d-animo-negativi/" title="Rimedi floreali per stati d'animo e momenti difficili" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D19]').focus())"> 2654 <span class="pb-0.5 tracking-normal 2655 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2656 before:bottom-0 before:left-0 before:bg-black 2657 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2658 before:transition before:ease-in-out before:duration-300 main-menu-item 2659 "> 2660 Rimedi floreali per stati d'animo e momenti difficili </span> 2661 </a> 2662 </li> 2663 <li> 2664 <a href="https://www.naturelab.it/fiori-per-disarmonie-del-carattere/" title="Rimedi floreali per equilibrio e consapevolezza personale" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D19]').focus())"> 2665 <span class="pb-0.5 tracking-normal 2666 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2667 before:bottom-0 before:left-0 before:bg-black 2668 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2669 before:transition before:ease-in-out before:duration-300 main-menu-item 2670 "> 2671 Rimedi floreali per equilibrio e consapevolezza personale </span> 2672 </a> 2673 </li> 2674 <li> 2675 <a href="https://www.naturelab.it/fiori-per-conflitti-e-difficolta-relazionali/" title="Rimedi floreali per relazioni e sfera affettiva" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D19]').focus())"> 2676 <span class="pb-0.5 tracking-normal 2677 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2678 before:bottom-0 before:left-0 before:bg-black 2679 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2680 before:transition before:ease-in-out before:duration-300 main-menu-item 2681 "> 2682 Rimedi floreali per relazioni e sfera affettiva </span> 2683 </a> 2684 </li> 2685 <li> 2686 <a href="https://www.naturelab.it/fiori-per-disagi-psicologici/" title="Rimedi floreali per paure, tensioni e insicurezze" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D19]').focus())">
2687 <span class="pb-0.5 tracking-normal 2688 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2689 before:bottom-0 before:left-0 before:bg-black 2690 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2691 before:transition before:ease-in-out before:duration-300 main-menu-item 2692 "> 2693 Rimedi floreali per paure, tensioni e insicurezze </span> 2694 </a> 2695 </li> 2696 <li> 2697 <a href="https://www.naturelab.it/fiori-per-disturbi-fisici/" title="Rimedi floreali e benessere psicofisico" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D19]').focus())"> 2698 <span class="pb-0.5 tracking-normal 2699 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2700 before:bottom-0 before:left-0 before:bg-black 2701 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2702 before:transition before:ease-in-out before:duration-300 main-menu-item 2703 "> 2704 Rimedi floreali e benessere psicofisico </span> 2705 </a> 2706 </li> 2707 <li> 2708 <a href="https://www.naturelab.it/fiori-per-malattie-di-origine-psicosomatica/" title="Rimedi floreali per stress e somatizzazione" class="block w-full py-1 mt-1 mb-2 whitespace-nowrap first:mt-0 last:mb-0" @keyup.escape="$nextTick(() => document.querySelector('[data-sr-button-id=category\u002Dnode\u002D19]').focus())"> 2709 <span class="pb-0.5 tracking-normal 2710 relative before:content-[''] before:absolute before:block before:w-full before:h-[1px] 2711 before:bottom-0 before:left-0 before:bg-black 2712 before:hover:scale-x-100 before:scale-x-0 before:origin-top-left 2713 before:transition before:ease-in-out before:duration-300 main-menu-item 2714 "> 2715 Rimedi floreali per stress e somatizzazione </span> 2716 </a> 2717 </li> 2718 </ul> 2719 </li> 2720 <li class="relative level-0"> 2721 <span class="flex items-center mx-4 xl:mx-6 mb-3"> 2722 <a class="w-full py-4.5 pb-1 uppercase tracking-normal relative 2723 before:content-[''] before:absolute before:block before:w-full before:h-[2px] 2724 before:bottom-0 before:left-0 before:bg-black 2725 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 2726 before:transition before:ease-in-out before:duration-300 level-0 main-menu-item" href="/blog/" title="Blog Lab>"> 2727 Blog Lab 2728 </a> 2729 </li> 2730 <li class="relative level-0">
2731 <span class="flex items-center mx-4 xl:mx-6 mb-3"> 2732 <a class="w-full py-4.5 pb-1 uppercase tracking-normal relative 2733 before:content-[''] before:absolute before:block before:w-full before:h-[2px] 2734 before:bottom-0 before:left-0 before:bg-black 2735 before:hover:scale-x-100 before:scale-x-0 before:origin-top-center 2736 before:transition before:ease-in-out before:duration-300 level-0 main-menu-item" href="/chi-siamo/" title="Chi siamo>"> 2737 Chi siamo 2738 </a> 2739 </li> 2740 </ul> 2741 </nav> 2742 </div> 2743</div>
2744<script> 2745 'use strict'; 2746 const initMenuDesktop_6ac2bbed0b008 = () => { 2747 return { 2748 hoverPanelActiveId: null, 2749 setActiveMenu(menuNode) { 2750 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2751 return link.href === window.location.href.split('?')[0]; 2752 }).forEach(item => { 2753 // Aggiunge 'underline' solo se l'elemento non è un link di livello 0 2754 if (!item.closest('li').classList.contains('level-0')) { 2755 item.classList.add('underline'); 2756 item.classList.add('underline-offset-4'); 2757 } 2758 item.closest('li.level-0') && 2759 item.closest('li.level-0').querySelector('a.level-0').classList.add('before:scale-x-100'); 2760 }); 2761 }, 2762 openMenuOnClick(menuNode) { 2763 if (menuNode === this.hoverPanelActiveId) { 2764 this.hoverPanelActiveId = 0; 2765 } else { 2766 this.hoverPanelActiveId = menuNode 2767 } 2768 } 2769 } 2770 } 2771</script>
2771 <!--Search--> 2772 <div class="absolute z-10 w-full border-t shadow-sm bg-container-lighter border-container-lighter" 2773 id="search-content" 2774 x-cloak x-show="searchOpen" 2775 @click.outside="searchOpen = false" 2776 @keydown.escape=" 2777 searchOpen = false; 2778 $refs.searchButton.focus(); 2779 " 2780 > 2781
2782<script> 2783 'use strict'; 2784 2785 function amXsearchProductsComponent() { 2786 const postFormRequest = (postUrl, id) => { 2787 const req = fetch(BASE_URL + postUrl, { 2788 "headers": { 2789 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 2790 }, 2791 "body": "form_key=" + hyva.getFormKey() + "&product=" + id + "&uenc=" + hyva.getUenc(), 2792 "method": "POST", 2793 "mode": "cors", 2794 "credentials": "include" 2795 }); 2796 2797 req.finally(() => this.isLoading = false); 2798 2799 return req; 2800 } 2801 2802 return { 2803 mutationAddToCartQuery: "mutation addProductsToCart($cartId: String!, $cartItems: [CartItemInput!]!) {addProductsToCart(\n cartId: $cartId,\n cartItems: $cartItems\n ) {\n cart {\n items {\n product {\n name\n }\n }\n total_quantity\n }\n user_errors {\n code\n message\n }\n }}", 2804 mutationAddToWishlistQuery: "mutation addProductsToWishlist($wishlistId: ID!, $wishlistItems: [WishlistItemInput!]!) {addProductsToWishlist(\n wishlistId: $wishlistId,\n wishlistItems: $wishlistItems\n ) {\n wishlist {\n items {\n id\n product {\n name\n }\n }\n items_count\n }\n user_errors {\n code\n message\n }\n }}", 2805 mutationAddToCompareListQuery: "mutation addProductsToCompareList($uid: ID!, $products: [ID!]!) {addProductsToCompareList(input: {\n uid: $uid,\n products: $products\n }) {\n items {\n product {\n name\n }\n }\n item_count\n }}", 2806 2807 sliderInitialization(event) { 2808 this[event.detail.key] = event.detail.value; 2809 }, 2810 2811 getResultProductsCount() { 2812 const suggestions = this.sections.products; 2813 const totalCount = suggestions?.total_count ?? 0; 2814 const itemsCount = suggestions?.items?.length ?? 0; 2815 2816 return totalCount > 0 ? totalCount - itemsCount : 0; 2817 }, 2818 2819 processProductName(value) { 2820 if (value.items) { 2821 value.items = value.items.map(item => { 2822 item.name = this.addHighlight(item, 'name'); 2823 item.sku = this.addHighlight(item, 'sku'); 2824 item.name = this.truncateWithDots(item.name, this.productNameMaxLength, true); 2825 2826 return item; 2827 }); 2828 } 2829 return value; 2830 }, 2831 2832 addHighlight(product, key = 'name') { 2833 const name = product[key]; 2834 const { latestQuery } = this; 2835 const queries = latestQuery.toLowerCase().split(" "); 2836 2837 let highlightedName = name; 2838 2839 for (const query of queries) { 2840 const regex = new RegExp(`(?!<[^>]*)(${query})(?![^<]*>)`, "gi"); 2841 highlightedName = highlightedName.replace(regex, match => `<span class="amsearch-highlight">${match}</span>`); 2842 } 2843 2844 return highlightedName; 2845 }, 2846 2847 truncateWithDots(str, maxLength, returnOriginal = false) { 2848 if (maxLength === '' || maxLength < 1) { 2849 return returnOriginal ? str : ""; 2850 } 2851 2852 let output = []; 2853 let tagBuffer = []; 2854 let count = 0; 2855 let inTag = false;
2856 2857 for (const char of str) { 2858 if (char === "<") { 2859 inTag = true; 2860 } 2861 2862 if (inTag) { 2863 tagBuffer.push(char); 2864 } else { 2865 count++; 2866 } 2867 2868 if (char === ">") { 2869 inTag = false; 2870 output.push(tagBuffer.join("")); 2871 tagBuffer = []; 2872 } else if (!inTag) { 2873 output.push(char); 2874 } 2875 2876 if (count >= maxLength) { 2877 break; 2878 } 2879 } 2880 2881 if (count >= maxLength) { 2882 output.push("..."); 2883 } 2884 2885 // Close any unclosed tags 2886 while (tagBuffer.length > 0) { 2887 const closingTagPos = str.indexOf(">", str.indexOf(tagBuffer.join("")) + tagBuffer.length); 2888 if (closingTagPos !== -1) { 2889 output.push(str.slice(str.indexOf(tagBuffer.join("")) + tagBuffer.length, closingTagPos + 1)); 2890 tagBuffer = []; 2891 } else { 2892 break; 2893 } 2894 } 2895 2896 return output.join(""); 2897 }, 2898 2899 getProductUrl(product) { 2900 return window.BASE_URL + product.url_key + (product.url_suffix || ''); 2901 }, 2902 2903 getProductImageUrl(product) { 2904 const imageUrl = product.image.url; 2905 let mediaURL = this.config.customMediaUrl || imageUrl; 2906 2907 if (mediaURL.includes('/media') && imageUrl.startsWith('media/')) { 2908 mediaURL = mediaURL.replace('/media', ''); 2909 } 2910 2911 return (imageUrl.includes('://') ? '' : mediaURL) + imageUrl; 2912 }, 2913 2914 /** 2915 * @param Product {id: string} 2916 */ 2917 addToWishlist({id}) { 2918 postFormRequest('wishlist/index/add/', id).then(response => { 2919 if (response.redirected) { 2920 window.location.href = response.url; 2921 } else if (response.ok) { 2922 return response.json(); 2923 } else { 2924 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 2925 [{ 2926 type: "warning", 2927 text: "Impossibile aggiungere l'articolo alla lista desideri." 2928 }], 5000 2929 ); 2930 } 2931 }).then(response => { 2932 if (!response) { return } 2933 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 2934 [{ 2935 type: response.success ? "success" : "error", 2936 text: response.success 2937 ? "Prodotto has been added to your Wish List." : response.error_message 2938 }], 5000 2939 ); 2940 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 2941 }).catch(function (error) { 2942 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 2943 [{ 2944 type: "error", 2945 text: error 2946 }], 5000 2947 ); 2948 }); 2949 }, 2950 2951 /** 2952 * @param Product {id: string} 2953 */ 2954 addToCompare({id}) { 2955 postFormRequest('catalog/product_compare/add', id) 2956 .then(response => { 2957 if (response.redirected) { 2958 window.location.href = response.url; 2959 } 2960 this.isLoading = false; 2961 }).catch(error => { 2962 this.isLoading = false;
2963 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 2964 [{ 2965 type: "error", 2966 text: error 2967 }], 5000 2968 ); 2969 }); 2970 }, 2971 2972 /** 2973 * 2974 * @param product 2975 */ 2976 getRating(product) { 2977 const { rating_summary } = product; 2978 product.ratingData = { 2979 ratingSteps: 5, 2980 starsFilled: Math.floor(+rating_summary / 100 * 5), 2981 starFragment: rating_summary / 100 * 5 % 1, 2982 starsEmpty: Math.floor(5 - (+rating_summary / 100 * 5)), 2983 yellowHex: '#f6e05e', 2984 greyHex: '#cbd5e0' 2985 }; 2986 return product; 2987 }, 2988 2989 2990 /** 2991 * Compatibility function for Amasty_AjaxCart module 2992 * 2993 * @param id 2994 * @param $event 2995 */ 2996 addToCart({id}, $event) { 2997 this.isLoading = true; 2998 2999 const action = 'https://www.naturelab.it/checkout/cart/add/'; 3000 const data = { product: id, qty: 1 }; 3001 3002 hyva.postForm({ action, data }); 3003 } 3004 } 3005 } 3006</script>
vendor: 1 bytes, line 3006
3006
3007<script> 3008 'use strict'; 3009 3010 (()=> { 3011 const browserCache = { 3012 set(key, value) { 3013 const now = new Date(); 3014 const item = { 3015 value: value, 3016 expiry: now.getTime() + 5 * 60 * 1000, // 5 minutes from now 3017 }; 3018 localStorage.setItem(key, JSON.stringify(item)); 3019 }, 3020 get(key) { 3021 const itemStr = localStorage.getItem(key); 3022 if (!itemStr) { 3023 return null; 3024 } 3025 const item = JSON.parse(itemStr); 3026 const now = new Date(); 3027 if (now.getTime() > item.expiry) { 3028 localStorage.removeItem(key); 3029 return null; 3030 } 3031 return item.value; 3032 } 3033 }; 3034 3035 window._amXSearchConfigFetcher = null; 3036 3037 window.amXsearchAutocompleteComponent = () => { 3038 const INITIAL_QUERY_CACHE_KEY = 'x.InitialQuery'; 3039 const CONFIG_QUERY_CACHE_KEY = 'x.ConfigQuery'; 3040 const PREV_QUERY_CACHE_KEY = 'x.PrevQuery'; 3041 // TODO: Possible it will needs to change after the configurations are added to Admin 3042 const HEADER_TYPE = 'a'; 3043 3044 const cache = {}; 3045 const dataSections = { 3046 products: false, 3047 category: false, 3048 page: false, 3049 faq: false, 3050 landingPage: false, 3051 browsingHistory: false, 3052 popularSearches: false, 3053 bestsellers: false, 3054 recentSearches: false, 3055 recentlyViewed: false, 3056 brand: false, 3057 blog: false 3058 }; 3059 3060 return { 3061 isLoading: false, 3062 searchInitialized: false, 3063 latestQuery: '', 3064 productNameMaxLength: 50, 3065 resultPageUrl: 'https://www.naturelab.it/ricerca/', 3066 minSearchLength: 3, 3067 maxSearchLength: 128, 3068 isDefaultSearchInput: true, 3069 isFullWidthSearch: false, 3070 searchPopupWidth: 900, 3071 showOverlay: false, 3072 config: {}, 3073 slider: { 3074 bestsellers: false, 3075 recentlyViewed: false 3076 }, 3077 isHorizontalView: true, 3078 noResultsFound: false, 3079 errorMessage: null, 3080 // sections 3081 sections: Object.create(dataSections), 3082 3083 isHyvaUiHeader() { 3084 return HEADER_TYPE.length && HEADER_TYPE !== 'default'; 3085 }, 3086 3087 checkHyvaUiHeaderVariant(needle) { 3088 return this.isHyvaUiHeader() && needle === HEADER_TYPE; 3089 }, 3090 3091 dynamicLayout($el) { 3092 const matchMedia = window.matchMedia('(max-width: 768px)'); 3093 const isHorizontalViewPopupWidth = this.searchPopupWidth < 700 && !this.isDefaultSearchInput && !this.isFullWidthSearch; 3094 3095 this.isHorizontalView = !matchMedia.matches ? isHorizontalViewPopupWidth : true; 3096 matchMedia.addEventListener('change', event => { 3097 this.isHorizontalView = !matchMedia.matches ? isHorizontalViewPopupWidth : true; 3098 }) 3099 3100 if (!window._amXSearchConfigFetcher) { 3101 window._amXSearchConfigFetcher = new Promise(async resolve => { 3102 const cachedData = browserCache.get(CONFIG_QUERY_CACHE_KEY); 3103 3104 if (cachedData) { 3105 return resolve(cachedData); 3106 } 3107 3108 const query = `query {config: storeConfig { 3109 isProductReviewsBlockEnabled: amasty_xsearch_product_reviews 3110 isProductAddToCartBlockEnabled: amasty_xsearch_product_add_to_cart 3111 isRedirectToSingleProductEnabled: amasty_xsearch_product_redirect_single_product 3112 isFullScreenMode: amasty_xsearch_general_full_screen 3113 isGridView: amasty_xsearch_product_popup_display 3114 isShowSku: amasty_xsearch_product_show_sku 3115 shortDescriptionLength: amasty_xsearch_product_desc_length 3116 3117 customMediaUrl: secure_base_media_url 3118 3119 amasty_xsearch_products_title: amasty_xsearch_product_title 3120 amasty_xsearch_popularSearches_title: amasty_xsearch_popular_searches_title 3121 amasty_xsearch_browsingHistory_title: amasty_xsearch_browsing_history_title 3122 amasty_xsearch_recentSearches_title: amasty_xsearch_recent_searches_title 3123 amasty_xsearch_recentlyViewed_title: amasty_xsearch_recently_viewed_title 3124 amasty_xsearch_landingPage_title: amasty_xsearch_landing_page_title 3125 amasty_xsearch_bestsellers_position 3126 3127 amasty_xsearch_faq_title 3128 amasty_xsearch_brand_title 3129 amasty_xsearch_blog_title 3130 amasty_xsearch_category_title 3131 amasty_xsearch_bestsellers_title 3132 amasty_xsearch_page_title 3133 3134 amasty_xsearch_popularSearches_first_click: amasty_xsearch_popular_searches_first_click 3135 amasty_xsearch_browsingHistory_first_click: amasty_xsearch_browsing_history_first_click 3136 amasty_xsearch_recentSearches_first_click: amasty_xsearch_recent_searches_first_click 3137 3138 amasty_xsearch_layout_enabled 3139 amasty_xsearch_layout_border 3140 amasty_xsearch_layout_hover 3141 amasty_xsearch_layout_highlight 3142 amasty_xsearch_layout_background 3143 amasty_xsearch_layout_text 3144 amasty_xsearch_layout_hover_text 3145 amasty_xsearch_layout_search_button 3146 amasty_xsearch_layout_search_button_text 3147 }}`; 3148 const response = await this.fetch(query, {}, CONFIG_QUERY_CACHE_KEY); 3149 if (response.errors && response.errors.length > 0) { 3150 console.error(response.errors); 3151 } 3152 3153 browserCache.set(CONFIG_QUERY_CACHE_KEY, response); 3154 resolve(response); 3155 }); 3156 } 3157 3158 _amXSearchConfigFetcher.then(response => { 3159 if (!response?.data?.config) { 3160 return; 3161 } 3162 3163 this.config = response.data.config; 3164 this.processCustomLayoutStyles($el); 3165 }); 3166 3167 if (typeof this.searchOpen !== "undefined") { 3168 this.$watch('searchOpen', val => { 3169 if (!val) { 3170 return; 3171 } 3172 3173 requestAnimationFrame(() => { 3174 const searchInput = document.querySelector('#search'); 3175 searchInput && searchInput.focus(); 3176 }); 3177 }); 3178 } 3179 3180 if (typeof this.showOverlay !== "undefined") { 3181 this.$watch('showOverlay', val => { 3182 if (!val) { 3183 return; 3184 } 3185 3186 this.applyHyvaUiHeaderConfig() 3187 }); 3188 } 3189 3190 this.applyHeaderTypeToContainers(); 3191 }, 3192 3193 isSidebarSectionsDisabled() { 3194 if (!this.isHorizontalView) { 3195 return !Object.entries(this.sections).some(([key, value]) =>
3196 key !== 'products' && key !== 'bestsellers' && key !== 'recentlyViewed' && value.total_count > 0 3197 ); 3198 } 3199 }, 3200 3201 showSideBar() { 3202 const recentlyViewed = this.sections?.recentlyViewed; 3203 return this.latestQuery.length >= 3 3204 || (recentlyViewed && recentlyViewed?.items?.length); 3205 }, 3206 3207 3208 showOnFirstClick(blockName) { 3209 const sectionsToCheck = [ 3210 'popularSearches', 3211 'browsingHistory', 3212 'recentSearches' 3213 ]; 3214 3215 if (!sectionsToCheck.includes(blockName)) { 3216 return false; 3217 } 3218 3219 return this.latestQuery.length < this.minSearchLength 3220 && this.config[`amasty_xsearch_${blockName}_first_click`] 3221 && this.sections[blockName]?.items?.length; 3222 }, 3223 3224 processCustomLayoutStyles() { 3225 const conf = key => this.config[`amasty_xsearch_layout_${key}`]; 3226 3227 if (!conf("enabled")) { 3228 return ""; 3229 } 3230 3231 const styles = [ 3232 "border", 3233 "hover", 3234 "highlight", 3235 "background", 3236 "text", 3237 "hover_text", 3238 'search_button', 3239 'search_button_text' 3240 ]; 3241 3242 const cachedConf = styles.reduce((acc, key) => { 3243 acc[key] = conf(key); 3244 return acc; 3245 }, {}); 3246 3247 const getDarken = (color, amount) => { 3248 const hex = parseInt(color.slice(1), 16); 3249 const r = Math.min(255, Math.max(0, ((hex >> 16) & 0xff) + amount)); 3250 const g = Math.min(255, Math.max(0, ((hex >> 8) & 0xff) + amount)); 3251 const b = Math.min(255, Math.max(0, (hex & 0xff) + amount)); 3252 3253 return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`; 3254 }; 3255 3256 const prefix = "--amsearch-color-"; 3257 styles.forEach((key) => { 3258 const color = cachedConf[key]; 3259 3260 document.body.style.setProperty(prefix + key, `#${color}`); 3261 document.body.style.setProperty(`${prefix + key}-focus`, getDarken(`#${color}`, -12)); 3262 document.body.style.setProperty(`${prefix + key}-hover`, getDarken(`#${color}`, -16)); 3263 }); 3264 }, 3265 3266 canShowSection(sectionData) { 3267 return sectionData && sectionData.items && sectionData.items.length > 0; 3268 }, 3269 3270 initialSectionLoad() { 3271 const req = this.fetch(`query xSearchQuery { 3272recentlyViewed: xsearchRecentlyViewed { 3273 items { 3274 image { 3275 label 3276 url 3277 } 3278 id 3279 is_salable 3280 short_description { 3281 html 3282 } 3283 name 3284 options_container 3285 rating_summary 3286 reviews_count 3287 sku 3288 url_key 3289 url_suffix 3290 price_range { 3291 minimum_price { 3292 regular_price { 3293 value 3294 currency 3295 } 3296 final_price { 3297 value 3298 currency 3299 } 3300 } 3301 maximum_price { 3302 regular_price { 3303 value 3304 currency 3305 } 3306 final_price { 3307 value 3308 currency 3309 } 3310 } 3311 } 3312 } 3313 } 3314 3315popularSearches: xsearchPopularSearches { 3316 code 3317 items { 3318 name 3319 num_results 3320 url 3321 } 3322 total_count 3323 } 3324recentSearches: xsearchRecentSearches { 3325 code 3326 items { 3327 name 3328 num_results 3329 url 3330 } 3331 total_count 3332 } 3333 3334}`, {}, INITIAL_QUERY_CACHE_KEY); 3335 req.then(response => { 3336 if (response.errors && response.errors.length > 0) { 3337 console.error(response.errors); 3338 } 3339 3340 this.searchInitialized = true; 3341 this.processResponse(response); 3342 }); 3343 }, 3344 3345 encodeHtml(html) { 3346 const txt = document.createElement('textarea'); 3347 txt.textContent = html; 3348 return txt.innerHTML; 3349 }, 3350 3351 sanitize(value) { 3352 if (typeof DOMPurify === 'function') { 3353 return DOMPurify.sanitize(value) 3354 } else { 3355 return this.encodeHtml(value) 3356 } 3357 }, 3358 3359 doSearch() { 3360 const { searchInput } = this.$refs; 3361 const { latestQuery, minSearchLength } = this; 3362 const inputText = this.sanitize(searchInput.value); 3363 3364 if (inputText !== latestQuery && cache[PREV_QUERY_CACHE_KEY]) { 3365 delete cache[PREV_QUERY_CACHE_KEY]; 3366 } 3367 3368 this.latestQuery = this.sanitize(searchInput.value); 3369 3370 if (inputText.length < minSearchLength) { 3371 this.initialSectionLoad(); 3372 return; 3373 } 3374 3375 this.noResultsFound = null; 3376 this.errorMessage = null; 3377 3378 const query = `query xSearchQuery($inputText: String!) {products: xsearchProducts(search: $inputText) { 3379 code 3380 items { 3381 __typename 3382 image { 3383 label 3384 url 3385 } 3386 3387 id 3388 is_salable 3389 short_description { 3390 html 3391 } 3392 name 3393 rating_summary 3394 reviews_count 3395 sku 3396 url_key 3397 url_suffix 3398 3399 price_range { 3400 minimum_price { 3401 regular_price { 3402 value 3403 currency 3404 } 3405 final_price { 3406 value 3407 currency 3408 } 3409 } 3410 maximum_price { 3411 regular_price { 3412 value 3413 currency 3414 } 3415 final_price { 3416 value 3417 currency 3418 } 3419 } 3420 } 3421 } 3422 total_count 3423 } 3424 3425 3426 3427recentSearches: xsearchRecentSearches { 3428 code 3429 items { 3430 name 3431 num_results 3432 url 3433 } 3434 total_count 3435 } 3436popularSearches: xsearchPopularSearches { 3437 code 3438 items { 3439 name 3440 num_results 3441 url 3442 } 3443 total_count 3444 } 3445 3446 3447terms: xsearchRelatedTerms(search: $inputText) { 3448 items { 3449 count 3450 name 3451 } 3452 } 3453 3454}`; 3455 const req = this.fetch(query, { inputText }, PREV_QUERY_CACHE_KEY); 3456 3457 req.then(response => { 3458 if (response.errors && response.errors.length > 0) { 3459 this.errorMessage = response.errors[0].message; 3460 console.error(this.errorMessage); 3461 } 3462 3463 this.searchInitialized = true; 3464 this.processResponse(response); 3465 }); 3466 }, 3467 3468 fetch(query, variables = {}, cacheKey = null, useLoading = true) {
3469 if (cacheKey && cache[cacheKey]) { 3470 return Promise.resolve(cache[cacheKey]); 3471 } 3472 3473 if (useLoading) { 3474 this.isLoading = true; 3475 } 3476 3477 const req = fetch(`${BASE_URL}graphql`, { 3478 method: 'POST', 3479 headers: { 3480 'Content-Type': 'application/json', 3481 'Store': 'default' 3482 }, 3483 credentials: 'include', 3484 body: JSON.stringify({query, variables}), 3485 }); 3486 3487 req.catch(reason => console.error(reason)); 3488 3489 return req.then(response => { 3490 if (!response.ok) { 3491 throw new Error(`HTTP error: ${response.status}`); 3492 } 3493 3494 const body = response.json(); 3495 if (cacheKey) { 3496 cache[cacheKey] = body; 3497 } 3498 3499 return body; 3500 }); 3501 }, 3502 3503 checkSearchInput() { 3504 if (this.$refs.searchInput.value === '') { 3505 this.clear(); 3506 } 3507 }, 3508 3509 redirect() { 3510 this.isLoading = true; 3511 const { searchInput } = this.$refs; 3512 const inputText = this.sanitize(searchInput.value); 3513 3514 const products = this.sections.products; 3515 if (products && products.items.length === 1 && this.config.isRedirectToSingleProductEnabled) { 3516 location.href = this.getProductUrl(products.items[0]); 3517 return; 3518 } 3519 3520 const url = 'https://www.naturelab.it/ricerca/'; 3521 location.href = url + inputText; 3522 }, 3523 3524 focusElement(element) { 3525 if (element && element.nodeName === "DIV") { 3526 element.focus(); 3527 return true; 3528 } 3529 return false; 3530 }, 3531 3532 processResponse(response) { 3533 this.updateSections(response.data); 3534 }, 3535 3536 clear() { 3537 const initialQueryCache = cache[INITIAL_QUERY_CACHE_KEY]; 3538 if (!initialQueryCache) { 3539 return; 3540 } 3541 3542 initialQueryCache.then(result => { 3543 this.updateSections(result.data ?? {}); 3544 }); 3545 }, 3546 3547 closeSearch() { 3548 if (this.searchOpen) { 3549 this.searchOpen = false; 3550 } 3551 3552 this.$nextTick(() => { 3553 this.showOverlay = false; 3554 this.searchInitialized = false; 3555 }) 3556 3557 if (this.checkHyvaUiHeaderVariant('c')) { 3558 this.$refs.searchContainerDesktop.classList.remove(HEADER_TYPE + '-header-type'); 3559 } 3560 }, 3561 3562 processItemsWithRating(value) { 3563 if (value.items) { 3564 value.items = value.items.map(this.getRating.bind(this)); 3565 } 3566 return value; 3567 }, 3568 3569 processSection(key, value) { 3570 if (!value) { 3571 return value; 3572 } 3573 3574 let processedValue; 3575 3576 switch (key) { 3577 case 'recentlyViewed': 3578 case 'bestsellers': 3579 processedValue = this.processItemsWithRating(value); 3580 if (processedValue.items) { 3581 processedValue.items = (processedValue.items || []).map(item => { 3582 item.isSliderItem = true; 3583 return item; 3584 }); 3585 } 3586 break; 3587 case 'products': 3588 processedValue = this.processItemsWithRating(value); 3589 processedValue = this.processProductName(processedValue); 3590 break; 3591 default: 3592 processedValue = value; 3593 } 3594 3595 processedValue.title = this.config[`amasty_xsearch_${key}_title`]; 3596 return processedValue; 3597 }, 3598 3599 updateSections(rows) { 3600 if (!this.showOverlay) { 3601 this.showOverlay = true; 3602 } 3603 3604 this.isLoading = false;
3605 3606 this.noResultsFound = !rows.products?.total_count && this.latestQuery.length >= this.minSearchLength; 3607 if (!this.noResultsFound) { 3608 this.errorMessage = null; 3609 } 3610 3611 for (const key in dataSections) { 3612 const data = rows[key]; 3613 this.sections[key] = data?.items?.length > 0 3614 ? this.processSection(key, data) 3615 : {items: [], total_count: 0}; 3616 } 3617 3618 if (this.latestQuery.length >= this.minSearchLength) { 3619 return; 3620 } 3621 3622 for (const key in this.slider) { 3623 const items = rows[key]?.items; 3624 3625 if (rows.hasOwnProperty(key) && items?.length && !this.slider[key]) { 3626 this.slider[key] = this.amXsearchCarouselComponent(key, items.length); 3627 } 3628 } 3629 } 3630 } 3631 } 3632 })(); 3633</script>
vendor: 1 bytes, line 3633
3633
3634<script> 3635 'use strict'; 3636 3637 /** 3638 * Carousel component for xsearch 3639 * 3640 * @param key 3641 * @param itemCount 3642 * @returns Object 3643 */ 3644 function amXsearchCarouselComponent(key, itemCount) { 3645 return { 3646 itemCount, 3647 pageSize: 4, 3648 active: 0, 3649 slider: null, 3650 pageFillers: 0, 3651 sliderEl: false, 3652 smallWindowItemWidth: false, 3653 init($refs) { 3654 const sliderEl = $refs[`${key}Container`]; 3655 if (!sliderEl || itemCount === 0) { 3656 return this; 3657 } 3658 3659 if (sliderEl) { 3660 if (!this.isDefaultSearchInput && !this.isFullWidthSearch) { 3661 if (this.searchPopupWidth <= 900) { 3662 this.smallWindowItemWidth = sliderEl.clientWidth / 3; 3663 } 3664 if (this.searchPopupWidth <= 700) { 3665 this.smallWindowItemWidth = sliderEl.clientWidth / 2; 3666 } 3667 if (this.searchPopupWidth <= 500) { 3668 this.smallWindowItemWidth = sliderEl.clientWidth - 30; 3669 } 3670 } 3671 } 3672 3673 this.sliderEl = sliderEl; 3674 this.recalculate(); 3675 }, 3676 getSlider() { 3677 return this.sliderEl.querySelector('.carousel-slides'); 3678 }, 3679 calcPageSize() { 3680 const slider = this.getSlider(); 3681 if (!slider) { 3682 return this; 3683 } 3684 3685 const slides = slider.querySelectorAll('.carousel-slide'); 3686 if (this.smallWindowItemWidth) {
3687 slides.forEach(slide => { 3688 slide.style.width = `${this.smallWindowItemWidth}px`; 3689 }); 3690 } 3691 3692 const firstSlide = slides[0]; 3693 3694 this.itemCount = slides.length; 3695 this.pageSize = Math.round(slider.clientWidth / firstSlide.clientWidth); 3696 3697 this.pageFillers = this.pageSize * Math.ceil(this.itemCount / this.pageSize) - this.itemCount; 3698 }, 3699 calcActive() { 3700 const slider = this.getSlider(); 3701 if (!slider) { 3702 return this; 3703 } 3704 3705 const sliderItems = Math.round(this.itemCount) + Math.round(this.pageFillers); 3706 const calculatedActiveSlide = Math.round( 3707 Math.round(slider.scrollLeft) / (Math.round(slider.scrollWidth) / sliderItems) 3708 ); 3709 3710 this.active = Math.round(calculatedActiveSlide / Math.round(this.pageSize)) * Math.round(this.pageSize); 3711 }, 3712 prev() { 3713 this.scrollTo(this.active - this.pageSize); 3714 }, 3715 next() { 3716 this.scrollTo(this.active + this.pageSize); 3717 }, 3718 scrollTo(index) { 3719 const slider = this.getSlider(); 3720 if (!slider) { 3721 return this; 3722 } 3723 3724 const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers); 3725 slider.scrollLeft = Math.floor(slideWidth) * index; 3726 3727 this.calcActive(); 3728 }, 3729 3730 isActive(index) { 3731 return index === this.active; 3732 }, 3733 3734 recalculate() { 3735 this.calcPageSize(); 3736 setTimeout(() => this.calcActive(), 100); 3737 }, 3738 onResize() { 3739 this.calcPageSize(); 3740 setTimeout(() => this.calcActive(), 100); 3741 } 3742 }; 3743 } 3744</script>
3744 3745 3746
3746<script> 3747 'use strict'; 3748 3749 function amXsearchAutocompleteHyvaUIHeaderCompat() { 3750 const HEADER_TYPE = 'a'; 3751 3752 return { 3753 applyHyvaUiHeaderConfig() { 3754 const searchContent = document.getElementById('search-content'); 3755 3756 if (this.isFullWidthSearch) { 3757 if (!this.isHorizontalView) { 3758 if (this.checkHyvaUiHeaderVariant('b')) { 3759 searchContent.style = 'max-width:none'; 3760 searchContent.parentNode.style = 'padding-right:0; padding-left:0;'; 3761 } 3762 3763 if (this.checkHyvaUiHeaderVariant('c')) { 3764 this.$refs.searchContainerDesktop.classList.add(HEADER_TYPE + '-header-type'); 3765 this.$refs.searchForm.style = 'padding-right:0; padding-left:0;'; 3766 } 3767 } 3768 3769 if (this.checkHyvaUiHeaderVariant('a')) { 3770 searchContent.style = 'max-width: none'; 3771 } 3772 } 3773 }, 3774 3775 applyHeaderTypeToContainers() { 3776 const searchHeader = document.getElementById('header'); 3777 const columnMain = document.querySelector('.column.main'); 3778 const searchContent = document.getElementById('search-content'); 3779 const headerTypeClass = HEADER_TYPE + '-header-type'; 3780 3781 if (searchHeader || columnMain) { 3782 searchHeader.classList.add(headerTypeClass); 3783 columnMain.classList.add(headerTypeClass); 3784 } 3785 3786 if (this.checkHyvaUiHeaderVariant('a')) { 3787 searchContent.className = 'container'; 3788 } 3789 } 3790 } 3791 } 3792</script>
3792 3793 3794<div :class="{ 3795 'container': !config.isFullScreenMode, 3796 'relative py-2 mx-auto text-black z-20': true, 3797 'max-w-none px-0': isHyvaUiHeader() && isFullWidthSearch, 3798 'px-0': isHyvaUiHeader() && isHorizontalView 3799 }" 3800 x-data="Object.assign( 3801 {amXsearchCarouselComponent}, 3802 amXsearchProductsComponent(), 3803 amXsearchAutocompleteComponent(), 3804 amXsearchAutocompleteHyvaUIHeaderCompat(), 3805 )" 3806 x-init="dynamicLayout($el)"> 3807 3808 <div 3809 class="z-50 fixed inset-0 flex justify-center items-center bg-white/70 select-none" 3810 x-show="isLoading" 3811 x-cloak 3812 x-transition.opacity.duration.200ms 3813> 3814 <div class="flex text-primary items-center"> 3815 <svg height="40" width="40" viewBox="0 0 24 24" stroke="currentColor" fill="none" stroke-width="2" stroke-linecap="round" class="animate-spin" aria-hidden="true"> 3816 <circle style="opacity: .3;" cx="12" cy="12" r="10"/> 3817 <path fill="none" stroke-width="2" d="M12,2 a10,10 0 0,1 10,10"/> 3818</svg> 3819 </div> 3820</div> 3821 3822 <div x-show="showOverlay" 3823 class="fixed inset-0 bg-black bg-opacity-50 z-20 w-full h-full top-0 left-0 right-0 bottom-0" 3824 @click.prevent="closeSearch()" 3825 @keydown.window.escape="closeSearch()"></div> 3826 3827 <div class="form mini-search z-20 relative p-3 bg-white" 3828 :class="{ 3829 'right-0': !isHyvaUiHeader(), 3830 'md:flex md:justify-center': checkHyvaUiHeaderVariant('c') && !isDefaultSearchInput && !isFullWidthSearch 3831 }" 3832 > 3833 <form id="search_mini_form" @submit.prevent="redirect()" 3834 action="https://www.naturelab.it/ricerca/" 3835 :class="{ 3836 'w-full absolute right-0': checkHyvaUiHeaderVariant('a') && !isDefaultSearchInput && !isFullWidthSearch, 3837 'justify-end': !checkHyvaUiHeaderVariant('c') 3838 }" 3839 class="flex" method="GET"> 3840 <label class="hidden" for="search" data-role="mini-search-label"> 3841 <span>Cerca</span> 3842 </label> 3843 <div class="w-full flex align-center justify-center" 3844 :style="`max-width: ${!isDefaultSearchInput && !isFullWidthSearch ? searchPopupWidth + 'px' : '100%'}`"> 3845 <input id="search" 3846 x-ref="searchInput" 3847 maxlength="128" 3848 form="search_mini_form" 3849 type="search" 3850 name="q" 3851 value="" 3852 autocomplete="off" 3853 placeholder="Cerca in NatureLab..." 3854 class="p-2 text-lg leading-normal transition appearance-none text-grey-800 relative z-20 3855 focus:outline-none focus:border-transparent lg:text-xl flex-am-search-sidebar rounded border-gray-300 custom-ring-input" 3856 @focus="doSearch()" 3857 @search="checkSearchInput()" 3858 @input.debounce.500="doSearch()" 3859 x-intersect:enter.once="applyHyvaUiHeaderConfig()" 3860 @keydown.arrow-down.prevent="focusElement($el.querySelector('[tabindex]'))"/> 3861 </div> 3862 </form> 3863 <template x-if="searchInitialized"> 3864 <div 3865 class="overflow-x-hidden w-full -right-position -bottom-position top-8 bg-white shadow-lg max-h-screen-75 overflow-y-auto text-sm amsearch-container" 3866 :class="{ 3867 'absolute': !config.isFullScreenMode || isHyvaUiHeader(), 3868 'rounded-br rounded-bl': isHyvaUiHeader(), 3869 'right-0': !checkHyvaUiHeaderVariant('c'), 3870 'top-12': checkHyvaUiHeaderVariant('c') && !isHorizontalView, 3871 'top-14': checkHyvaUiHeaderVariant('a') && isHorizontalView 3872 }" 3873 tabindex="-1" 3874 x-cloak 3875 :style="`${!isDefaultSearchInput && !isFullWidthSearch ? 'max-width:' + searchPopupWidth + 'px' : ''}; ${!isHorizontalView && checkHyvaUiHeaderVariant('a') ? 'top: 44px;
3875 margin-top: 1px;' : ''}`" 3876 x-show="!isLoading && showOverlay"> 3877 <div 3878 class="flex w-full content-start flex-wrap box-border relative" 3879 :class="{ 3880 'flex-col': isHorizontalView, 3881 'flex-col md:flex-row': !isHorizontalView, 3882 }"> 3883 <div class="relative" 3884 :class="{ 3885 'am-search-content p-2 pt-0 lg:pt-6': latestQuery.length >= minSearchLength || ( 3886 showOnFirstClick('recentSearches') || showOnFirstClick('popularSearches') || showOnFirstClick('browsingHistory') 3887 ), 3888 'w-full': latestQuery.length < minSearchLength && ( 3889 !showOnFirstClick('recentSearches') && !showOnFirstClick('popularSearches') && !showOnFirstClick('browsingHistory') 3890 ), 3891 'am-search-horizontal-view': isHorizontalView, 3892 'p-2 pt-0 lg:pt-6': slider.recentlyViewed || slider.bestsellers, 3893 'am-search-sidebar-disabled': isSidebarSectionsDisabled(), 3894 }"> 3895 <div class="flex flex-nowrap flex-col" x-show="latestQuery.length < minSearchLength" x-cloak> 3896 3897 </div> 3898 3899 <template x-if="!noResultsFound && !isHorizontalView && latestQuery.length >= minSearchLength"> 3900 <div class="w-full"> 3901 <div class="flex row justify-between w-full mb-2 pb-4 p-2 items-center"> 3902 <h3 class="text-sm font-medium tracking-wider uppercase text-natlabGreenOpac"> 3903 <span x-text="sections.products.title"></span> (<span x-text="sections.products.total_count"></span>) 3904 </h3> 3905 3906 <div x-show="getResultProductsCount() >= 1"> 3907 <a :href="resultPageUrl + latestQuery" class="text-sm text-natlabGreen hover:natlabBlue"> 3908 Mostra tutti <span x-show="getResultProductsCount() > 0">(+<span x-text="getResultProductsCount()"></span>)</span> 3909 </a> 3910 </div> 3911 </div> 3912 3913 <div class="relative grid grid-cols-1 md:grid-cols-2 w-full"> 3914 <template x-for="(product, index) in (sections.products.items || [])" :key="index"> 3915 3916<div class="card pb-4 item product product-item flex flex-col md:flex-row mb-4 mx-2"> 3917 3918 <a :href="getProductUrl(product)" 3919 class="product photo product-item-photo block mx-auto md:w-2/6 md:mr-5" 3920 tabindex="-1" 3921 > 3922 <img style="min-width: 200px;" class="object-contain product-image-photo mb-3" 3923 :src="getProductImageUrl(product)" 3924 :alt="product.image.label" 3925 width="200" 3926 /> 3927 </a> 3928 <div class="product-info flex flex-col grow"> 3929 <div class="items-center justify-center text-center md:text-left"> 3930 <a class="product-item-link action link" 3931 :href="getProductUrl(product)" 3932 > 3933 <span x-html="product.name" class="amsearch-product-name"></span> 3934 </a> 3935 3936 </div> 3937 <template x-if="config.isProductReviewsBlockEnabled"> 3938 <div class="py-1" 3939 :class="{'mx-0 w-full': config.isGridView, 'mx-auto': !config.isGridView}"> 3940 <div class="rating-summary cursor-pointer text-center inline-block" 3941 :class="{'flex items-center': config.isGridView && !product.isSliderItem}" 3942 :title="product.rating_summary === 0 ? 'Sii il primo a recensire questo prodotto' : ''"> 3943 <div class="flex"> 3944 <template x-for="starFilled in product.ratingData.starsFilled"> 3945 <svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" 3946 :style="`color: ${product.ratingData.yellowHex}`" 3947 fill="currentColor"> 3948 <path 3949 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 3950 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 3951 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 3952 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
3952 3953 </svg> 3954 </template> 3955 <template x-if="product.ratingData.starFragment > 0"> 3956 <svg xmlns="http://www.w3.org/2000/svg" viewBox="3 0 20 20" fill="currentColor" class="w-6 h-6"> 3957 <defs> 3958 <linearGradient :id="'partialFill' + product.id"> 3959 <stop offset="0%" :stop-color="product.ratingData.yellowHex"/> 3960 <stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.yellowHex"/> 3961 <stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.greyHex"/> 3962 <stop offset="100%" :stop-color="product.ratingData.greyHex"/> 3963 </linearGradient> 3964 </defs> 3965 <g :fill="'url(#partialFill' + product.id + ')'"> 3966 <path 3967 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 3968 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 3969 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 3970 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 3971 </g> 3972 </svg> 3973 </template> 3974 <template x-for="starEmpty in product.ratingData.starsEmpty"> 3975 <svg xmlns="http://www.w3.org/2000/svg" 3976 class="fill-current w-6 h-6" 3977 :style="`color: ${product.ratingData.greyHex}`"
3978 viewBox="3 0 20 20" 3979 fill="currentColor"> 3980 <path 3981 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 3982 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 3983 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 3984 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" 3985 /> 3986 </svg> 3987 </template> 3988 </div> 3989 3990 <template x-if="product.rating_summary > 0"> 3991 <a :href="`${getProductUrl(product)}`" class="inline-block reviews-link text-blue-500 hover:text-blue-800"> 3992 <span class="ml-2 text-sm" x-html="product.reviews_count"></span> 3993 Recensioni </a> 3994 </template> 3995 </div> 3996</div> 3997 </template> 3998 <!-- <div class="items-center justify-center text-primary text-base" 3999 :class="{'text-left': config.isGridView, 'text-center': !config.isGridView}" 4000 x-html="truncateWithDots(product.short_description.html, config.shortDescriptionLength)" 4001 ></div> --> 4002 <div class="items-center justify-center text-primary text-sm text-center md:text-left" 4003 x-data 4004 x-init=" 4005 $nextTick(() => { 4006 let descriptionElement = $el.querySelector('.product-description'); 4007 if (descriptionElement) { 4008 let descriptionHtml = descriptionElement.innerHTML 4009 .replace(/<h\d>/gi, '') 4010 .replace(/<\/h\d>/gi, '<br>') 4011 descriptionElement.innerHTML = descriptionHtml; 4012 } 4013 }); 4014 "> 4015 4016 <div class="product-description" 4017 x-html="truncateWithDots(product.short_description.html, config.shortDescriptionLength)"> 4018 </div> 4019 </div> 4020 <div class="md:flex md:items-center mx-auto md:mx-0 "> 4021 <div class="price-container text-center md:text-left"> 4022 <div class="final-price"> 4023 <template x-if="product.price_range.minimum_price.final_price.value < product.price_range.maximum_price.final_price.value"> 4024 <span class="price-label"> 4025 A partire da </span> 4026 </template> 4027 4028 <span class="price-wrapper title-font font-medium text-2xl text-gray-900"> 4029 <span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value)"></span> 4030 </span> 4031 4032 <template x-if="product.price_range.minimum_price.regular_price.value !== product.price_range.minimum_price.final_price.value"> 4033 <div class="old-price text-grey-900"> 4034 <span class="price-container"> 4035 <span class="price-label ">Prezzo normale: </span> 4036 <span class="price-wrapper" x-html="hyva.formatPrice(product.price_range.minimum_price.regular_price.value)"></span> 4037 </span> 4038 </div> 4039 </template> 4040 </div> 4041 </div> 4042 <div class="pt-3 flex items-center mx-4"> 4043 <template x-if="config.isProductAddToCartBlockEnabled && product.is_salable"> 4044 <button type="button" 4045 x-on:click.prevent="addToCart(product, $event)" 4046 class="btn btn-primary flex items-center justify-center text-sm" 4047 > 4048 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="h-6 w-6 border-current inline ml-1" width="25" height="25" aria-hidden="true"> 4049 <path fill="#ffffff" fill-rule="nonzero" d="M19 7a1 1 0 0 1 1 1v13a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V8a1 1 0 0 1 1-1l3.014.002A31.37 31.37 0 0 1 4 6a6 6 0 0 1 11.996-.225L16 6v1h3zM4 8.5H1.5V21a1.5 1.5 0 0 0 1.356 1.493L3 22.5h14a1.5 1.5 0 0 0 1.493-1.356L18.5 21V8.5H16V12h-1.5V8.5h-9V12H4V8.5zm6-7A4.5 4.5 0 0 0 5.5 6c0 .253.002.485.007.696L5.515 7H14.5V6a4.5 4.5 0 0 0-4.288-4.495L10 1.5z"/> 4050</svg>
4051 <span class="mr-1 ml-2 hidden uppercase whitespace-nowrap lg:ml-2 lg:inline"> 4052 Acquista </span> 4053 </button> 4054 4055 </template> 4056 <template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable"> 4057 <div class="w-auto justify-center text-sm text-left"> 4058 <span class="inline-block w-3 h-3 bg-red-500 rounded-full flex-shrink-0"></span> 4059 <span class="text-sm text-gray-700 text-left">Non Disponibile</span> 4060 </div> 4061 </template> 4062 </div> 4063 </div> 4064 </div> 4065</div> 4066 </template> 4067 </div> 4068</div> 4069 </template> 4070 4071 <div class="p-4 box-border w-full h-full flex" x-show="noResultsFound && !errorMessage" x-cloak> 4072 <div class="flex justify-center content-center flex-row items-center flex-wrap align-center 4073 w-full h-full max-h-[90vh] text-center text-xl word-break" 4074 x-html="'ð Non abbiamo trovato niente per <strong>"%s"</strong>'.replace('%s', latestQuery)"> 4075 </div> 4076 </div> 4077 4078 <div class="p-4 box-border w-full h-full flex" x-show="noResultsFound && errorMessage" x-cloak> 4079 <div 4080 class="text-center flex align-center w-full text-xl justify-center content-center flex-row items-center flex-wrap h-full max-h-[90vh] word-break" 4081 x-html="errorMessage"> 4082 </div> 4083 </div> 4084 </div> 4085 <div class="w-full md:border-r pt-6" 4086 :class="{ 4087 'border-gray-600': showSideBar() && getResultProductsCount() > 0, 4088 'hidden': latestQuery.length < minSearchLength && ( 4089 !showOnFirstClick('recentSearches') && !showOnFirstClick('popularSearches') && !showOnFirstClick('browsingHistory') 4090 ) || isSidebarSectionsDisabled(), 4091 'am-search-horizontal-view': isHorizontalView, 4092 }"> 4093 <template 4094 x-if=" sections?.blog?.items?.length"> 4095 <div 4096 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('blog'))" 4097 x-cloak> 4098 <div class="w-full mb-6 am-search-item-list"> 4099 <h3 class="text-lg font-bold mb-2 px-4" x-text="sections.blog.title"></h3> 4100 4101 <div> 4102 <template x-for="(item, index) in sections.blog.items" :key="index"> 4103 <div> 4104 <a class="w-full block hover:bg-gray-100 py-2 px-4" 4105 :href="window.BASE_URL + item.url"> 4106 <span x-html="item.title" class="font-semibold"></span> 4107 </a> 4108 <span class="text-black block mt-1 px-4 block" 4109 x-html="item.description"></span> 4110 </div> 4111 </template> 4112 </div> 4113</div> 4114 </div> 4115 </template> 4116 <template 4117 x-if=" sections?.faq?.items?.length"> 4118 <div 4119 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('faq'))" 4120 x-cloak> 4121 <div class="w-full mb-6 am-search-item-list"> 4122 <h3 class="text-lg font-bold mb-2 px-4" x-text="sections.faq.title"></h3> 4123 4124 <template x-for="(item, index) in sections.faq.items" :key="index"> 4125 <a class="w-full block hover:bg-gray-100 py-2 px-4" 4126 :href="window.BASE_URL + item.url" 4127 x-html="item.name"> 4128 </a> 4129 </template> 4130</div> 4131 </div> 4132 </template> 4133 <template 4134 x-if=" sections?.brand?.items?.length"> 4135 <div 4136 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('brand'))" 4137 x-cloak> 4138 <div class="w-full mb-6 am-search-item-list"> 4139 <h3 class="text-lg font-bold mb-2 px-4" x-text="sections.brand.title"></h3> 4140 4141 <template x-for="(item, index) in sections.brand.items" :key="index"> 4142 <a class="w-full block hover:bg-gray-100 py-2 px-4" 4143 :href="`${BASE_URL + item.url}`" 4144 x-html="item.name"> 4145 </a> 4146 </template> 4147</div> 4148 </div> 4149 </template> 4150 <template 4151 x-if=" sections?.landingPage?.items?.length"> 4152 <div 4153 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('landingPage'))" 4154 x-cloak> 4155 <div class="w-full mb-6 am-search-item-list"> 4156 <h3 class="text-lg font-bold mb-2 px-4" x-text="sections.landingPage.title"></h3> 4157 4158 <template x-for="(item, index) in sections.landingPage.items" :key="index"> 4159 <a class="w-full block hover:bg-gray-100 py-2 px-4" 4160 :href="window.BASE_URL + item.url" 4161 x-html="item.title"> 4162 </a> 4163 </template> 4164</div> 4165 </div> 4166 </template> 4167 <template 4168 x-if="isHorizontalView && !noResultsFound && sections?.products?.items?.length"> 4169 <div 4170 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('products'))" 4171 x-cloak> 4172 <div class="w-full"> 4173 <div class="flex row justify-between w-full mb-2 pb-4 p-2 items-center">
4174 <h3 class="text-sm font-medium tracking-wider uppercase text-natlabGreenOpac"> 4175 <span x-text="sections.products.title"></span> (<span x-text="sections.products.total_count"></span>) 4176 </h3> 4177 4178 <div x-show="getResultProductsCount() >= 1"> 4179 <a :href="resultPageUrl + latestQuery" class="text-sm text-natlabGreen hover:natlabBlue"> 4180 Mostra tutti <span x-show="getResultProductsCount() > 0">(+<span x-text="getResultProductsCount()"></span>)</span> 4181 </a> 4182 </div> 4183 </div> 4184 4185 <div class="relative grid grid-cols-1 md:grid-cols-2 w-full"> 4186 <template x-for="(product, index) in (sections.products.items || [])" :key="index"> 4187 4188<div class="card pb-4 item product product-item flex flex-col md:flex-row mb-4 mx-2"> 4189 4190 <a :href="getProductUrl(product)" 4191 class="product photo product-item-photo block mx-auto md:w-2/6 md:mr-5" 4192 tabindex="-1" 4193 > 4194 <img style="min-width: 200px;" class="object-contain product-image-photo mb-3" 4195 :src="getProductImageUrl(product)" 4196 :alt="product.image.label" 4197 width="200" 4198 /> 4199 </a> 4200 <div class="product-info flex flex-col grow"> 4201 <div class="items-center justify-center text-center md:text-left"> 4202 <a class="product-item-link action link" 4203 :href="getProductUrl(product)" 4204 > 4205 <span x-html="product.name" class="amsearch-product-name"></span> 4206 </a> 4207 4208 </div> 4209 <template x-if="config.isProductReviewsBlockEnabled"> 4210 <div class="py-1" 4211 :class="{'mx-0 w-full': config.isGridView, 'mx-auto': !config.isGridView}"> 4212 <div class="rating-summary cursor-pointer text-center inline-block" 4213 :class="{'flex items-center': config.isGridView && !product.isSliderItem}" 4214 :title="product.rating_summary === 0 ? 'Sii il primo a recensire questo prodotto' : ''"> 4215 <div class="flex"> 4216 <template x-for="starFilled in product.ratingData.starsFilled"> 4217 <svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-6 h-6" viewBox="3 0 20 20" 4218 :style="`color: ${product.ratingData.yellowHex}`" 4219 fill="currentColor"> 4220 <path 4221 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 4222 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 4223 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 4224 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> 4225 </svg> 4226 </template> 4227 <template x-if="product.ratingData.starFragment > 0"> 4228 <svg xmlns="http://www.w3.org/2000/svg" viewBox="3 0 20 20" fill="currentColor" class="w-6 h-6"> 4229 <defs> 4230 <linearGradient :id="'partialFill' + product.id"> 4231 <stop offset="0%" :stop-color="product.ratingData.yellowHex"/> 4232 <stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.yellowHex"/> 4233 <stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.greyHex"/> 4234 <stop offset="100%" :stop-color="product.ratingData.greyHex"/> 4235 </linearGradient> 4236 </defs> 4237 <g :fill="'url(#partialFill' + product.id + ')'"> 4238 <path 4239 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 4240 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 4241 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 4242 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
4242 4243 </g> 4244 </svg> 4245 </template> 4246 <template x-for="starEmpty in product.ratingData.starsEmpty"> 4247 <svg xmlns="http://www.w3.org/2000/svg" 4248 class="fill-current w-6 h-6" 4249 :style="`color: ${product.ratingData.greyHex}`" 4250 viewBox="3 0 20 20" 4251 fill="currentColor"> 4252 <path 4253 d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 4254 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 4255 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 4256 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z" 4257 /> 4258 </svg> 4259 </template> 4260 </div> 4261 4262 <template x-if="product.rating_summary > 0"> 4263 <a :href="`${getProductUrl(product)}`" class="inline-block reviews-link text-blue-500 hover:text-blue-800"> 4264 <span class="ml-2 text-sm" x-html="product.reviews_count"></span> 4265 Recensioni </a> 4266 </template> 4267 </div> 4268</div> 4269 </template> 4270 <!-- <div class="items-center justify-center text-primary text-base" 4271 :class="{'text-left': config.isGridView, 'text-center': !config.isGridView}" 4272 x-html="truncateWithDots(product.short_description.html, config.shortDescriptionLength)" 4273 ></div> --> 4274 <div class="items-center justify-center text-primary text-sm text-center md:text-left" 4275 x-data 4276 x-init=" 4277 $nextTick(() => { 4278 let descriptionElement = $el.querySelector('.product-description'); 4279 if (descriptionElement) { 4280 let descriptionHtml = descriptionElement.innerHTML 4281 .replace(/<h\d>/gi, '') 4282 .replace(/<\/h\d>/gi, '<br>') 4283 descriptionElement.innerHTML = descriptionHtml; 4284 } 4285 }); 4286 "> 4287 4288 <div class="product-description" 4289 x-html="truncateWithDots(product.short_description.html, config.shortDescriptionLength)"> 4290 </div> 4291 </div> 4292 <div class="md:flex md:items-center mx-auto md:mx-0 "> 4293 <div class="price-container text-center md:text-left"> 4294 <div class="final-price"> 4295 <template x-if="product.price_range.minimum_price.final_price.value < product.price_range.maximum_price.final_price.value"> 4296 <span class="price-label"> 4297 A partire da </span> 4298 </template> 4299 4300 <span class="price-wrapper title-font font-medium text-2xl text-gray-900"> 4301 <span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value)"></span> 4302 </span> 4303 4304 <template x-if="product.price_range.minimum_price.regular_price.value !== product.price_range.minimum_price.final_price.value"> 4305 <div class="old-price text-grey-900"> 4306 <span class="price-container"> 4307 <span class="price-label ">Prezzo normale: </span> 4308 <span class="price-wrapper" x-html="hyva.formatPrice(product.price_range.minimum_price.regular_price.value)"></span> 4309 </span> 4310 </div> 4311 </template> 4312 </div> 4313 </div> 4314 <div class="pt-3 flex items-center mx-4"> 4315 <template x-if="config.isProductAddToCartBlockEnabled && product.is_salable"> 4316 <button type="button" 4317 x-on:click.prevent="addToCart(product, $event)" 4318 class="btn btn-primary flex items-center justify-center text-sm" 4319 > 4320 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="h-6 w-6 border-current inline ml-1" width="25" height="25" aria-hidden="true"> 4321 <path fill="#ffffff" fill-rule="nonzero" d="M19 7a1 1 0 0 1 1 1v13a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V8a1 1 0 0 1 1-1l3.014.002A31.37 31.37 0 0 1 4 6a6 6 0 0 1 11.996-.225L16 6v1h3zM4 8.5H1.5V21a1.5 1.5 0 0 0 1.356 1.493L3 22.5h14a1.5 1.5 0 0 0 1.493-1.356L18.5 21V8.5H16V12h-1.5V8.5h-9V12H4V8.5zm6-7A4.5 4.5 0 0 0 5.5 6c0 .253.002.485.007.696L5.515 7H14.5V6a4.5 4.5 0 0 0-4.288-4.495L10 1.5z"/> 4322</svg>
4323 <span class="mr-1 ml-2 hidden uppercase whitespace-nowrap lg:ml-2 lg:inline"> 4324 Acquista </span> 4325 </button> 4326 4327 </template> 4328 <template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable"> 4329 <div class="w-auto justify-center text-sm text-left"> 4330 <span class="inline-block w-3 h-3 bg-red-500 rounded-full flex-shrink-0"></span> 4331 <span class="text-sm text-gray-700 text-left">Non Disponibile</span> 4332 </div> 4333 </template> 4334 </div> 4335 </div> 4336 </div> 4337</div> 4338 </template> 4339 </div> 4340</div> 4341 </div> 4342 </template> 4343 <template 4344 x-if=" sections?.category?.items?.length"> 4345 <div 4346 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('category'))" 4347 x-cloak> 4348 <div class="w-full mb-6 am-search-item-list"> 4349<p class="text-sm font-medium tracking-wider uppercase text-natlabGreenOpac mb-2 px-4" x-text="sections.category.title"></p> 4350 <template x-for="(item, index) in sections.category.items" :key="index"> 4351 <div> 4352 <a class="w-full block hover:bg-gray-100 py-2 px-4" 4353 :href="window.BASE_URL + item.url"> 4354 <span x-html="item.name" class="font-semibold"></span> 4355 </a> 4356 <span class="text-black block mt-1 px-4 block" 4357 x-html="item.description" 4358 x-show="item.description"></span> 4359 </div> 4360 </template> 4361</div> 4362 </div> 4363 </template> 4364 <template 4365 x-if=" sections?.popularSearches?.items?.length"> 4366 <div 4367 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('popularSearches'))" 4368 x-cloak> 4369 <div class="w-full mb-6 am-search-item-list"> 4370 <p class="text-sm font-medium tracking-wider uppercase text-natlabGreenOpac mb-2 mx-4" x-text="sections.popularSearches.title"></p> 4371 <div class="flex direction-row flex-wrap mx-4"> 4372 <template x-for="(searchItem, index) in sections.popularSearches.items" :key="index"> 4373 <a class="py-1 px-2 rounded-lg mr-2 mb-2 border border-slate-200 hover:border-natlabLigthBlue" 4374 :href="resultPageUrl + searchItem.name.toLowerCase().replace(/<[^>]*>?/gm, '')" 4375 x-html="searchItem.name"> 4376 </a> 4377 </template> 4378 </div> 4379</div> 4380 </div> 4381 </template> 4382 <template 4383 x-if=" sections?.page?.items?.length"> 4384 <div 4385 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('page'))" 4386 x-cloak> 4387 <div class="w-full mb-6 am-search-item-list"> 4388 <h3 class="text-lg font-bold mb-2 px-4" x-text="sections.page.title"></h3> 4389 4390 <template x-for="(item, index) in sections.page.items" :key="index"> 4391 <div> 4392 <a class="w-full block hover:bg-gray-100 py-2 px-4" 4393 :href="`${BASE_URL + item.url}`"> 4394 <span x-html="item.title" class="font-semibold"></span> 4395 </a> 4396 <span class="text-black block mt-1 px-4 block" 4397 x-html="item.description"></span> 4398 </div> 4399 </template> 4400</div> 4401 </div> 4402 </template> 4403 <template 4404 x-if=" sections?.recentSearches?.items?.length"> 4405 <div 4406 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('recentSearches'))" 4407 x-cloak> 4408 <div class="w-full mb-6 am-search-item-list">
4409<p class="text-sm font-medium tracking-wider uppercase text-natlabGreenOpac mb-2 px-4" x-text="sections.recentSearches.title"></p> 4410 4411 <div class="flex direction-row flex-wrap mx-4"> 4412 <template x-for="(searchItem, index) in sections.recentSearches.items" :key="index"> 4413 <a class="py-1 px-2 rounded-lg mr-2 mb-2 bg-white border border-slate-200 hover:border-natlabLigthBlue hover:bg-white" 4414 :href="resultPageUrl + searchItem.name.toLowerCase().replace(/<[^>]*>?/gm, '')" 4415 x-html="searchItem.name"> 4416 </a> 4417 </template> 4418 </div> 4419</div> 4420 </div> 4421 </template> 4422 <template 4423 x-if=" sections?.browsingHistory?.items?.length"> 4424 <div 4425 x-show="(latestQuery.length >= minSearchLength || showOnFirstClick('browsingHistory'))" 4426 x-cloak> 4427 <div class="w-full mb-6 am-search-item-list"> 4428 <h3 class="text-lg font-bold mb-2 px-4" 4429 x-text="sections.browsingHistory.title"></h3> 4430 4431 <template x-for="(searchItem, index) in sections.browsingHistory.items" :key="index"> 4432 <a class="w-full block hover:bg-gray-100 py-2 px-4" 4433 :href="resultPageUrl + searchItem.name.toLowerCase().replace(/<[^>]*>?/gm, '')" 4434 x-html="searchItem.name"> 4435 </a> 4436 </template> 4437</div> 4438 </div> 4439 </template> 4440 </div> 4441 4442 </div> 4443 </div> 4444 </template> 4445 </div> 4446</div> 4447 </div> 4448 4449</div></header><div class="top-container"><nav class="breadcrumbs" aria-label="Breadcrumb"> 4450 <div class="container"> 4451 <ol class="items list-reset py-4 rounded flex flex-wrap text-grey text-sm"> 4452 <li class="item flex Home"> 4453 <a href="https://www.naturelab.it/" 4454 class="no-underline hover:text-natlabLigthBlue" 4455 title="Home" 4456 >Home</a> 4457 </li> 4458 <li class="item flex Come possiamo aiutarti?"> 4459 <span aria-hidden="true" class="separator text-secondary-lighter px-2">|</span> 4460 <span 4461 class="text-primary-lighter" 4462 aria-current="page" 4463 >Come possiamo aiutarti?</span> 4464 </li> 4465 </ol> 4466 </div> 4467</nav> 4468</div><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div> 4469<div id="fp.wp.marker-top"></div><div class="page messages">
4469<script> 4470 window.defaultSuccessMessageTimeout = 5000; 4471 function initMessages() { 4472 "use strict"; 4473 return { 4474 messages: window.mageMessages || [], 4475 isEmpty() { 4476 return this.messages.reduce( 4477 function (isEmpty, message) { 4478 return isEmpty && message === undefined 4479 }, true 4480 ) 4481 }, 4482 removeMessage(messageIndex) { 4483 this.messages[messageIndex] = undefined; 4484 }, 4485 addMessages(messages, hideAfter) { 4486 4487 messages.map((message) => { 4488 // Assicurati che la variabile message sia definita prima di usarla 4489 if (message && message.text && message.text.includes('Hai scelto')) { 4490 return; // Ignora il messaggio 4491 } 4492 this.messages = this.messages.concat(message); 4493 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 4494 hideAfter = window.defaultSuccessMessageTimeout; 4495 } 4496 if (hideAfter) { 4497 this.setHideTimeOut(this.messages.length -1, hideAfter); 4498 } 4499 }); 4500 }, 4501 setHideTimeOut(messageIndex, hideAfter) { 4502 setTimeout((messageIndex) => { 4503 this.removeMessage(messageIndex); 4504 }, hideAfter, messageIndex); 4505 }, 4506 getIcon(messageType) { 4507 let iconHtml; 4508 switch (messageType) { 4509 case 'success': 4510 iconHtml = "<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"fill-current\" width=\"56\" height=\"56\" role=\"img\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\"\/><\/svg>\n"; 4511 break; 4512 case 'error': 4513 iconHtml = "<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"fill-current\" width=\"56\" height=\"56\" role=\"img\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\"\/><\/svg>\n"; 4514 break; 4515 case 'warning': 4516 iconHtml = "<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"fill-current\" width=\"56\" height=\"56\" role=\"img\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\"\/><\/svg>\n"; 4517 break; 4518 case 'notice': 4519 iconHtml = "<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"fill-current\" width=\"56\" height=\"56\" role=\"img\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\"\/><\/svg>\n"; 4520 break; 4521 case 'info': 4522 iconHtml = "<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" class=\"fill-current\" width=\"56\" height=\"56\" role=\"img\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\"\/><\/svg>\n"; 4523 break; 4524 // phpcs:enable Generic.Files.LineLength.TooLong 4525 } 4526 return iconHtml; 4527 }, 4528 getColor(messageType) { 4529 let color; 4530 switch (messageType) { 4531 case 'success': 4532 color = 'text-green-600'; 4533 break; 4534 case 'error': 4535 color = 'text-natlabRed'; 4536 break; 4537 case 'warning': 4538 color = 'text-bg-natlabLigthBlue'; 4539 break; 4540 case 'notice': 4541 color = 'text-bg-natlabLigthBlue'; 4542 break; 4543 case 'info': 4544 color = 'text-bg-natlabLigthBlue'; 4545 break; 4546 } 4547 return color; 4548 }, 4549 eventListeners: { 4550 ['@messages-loaded.window'](event) { 4551 this.addMessages(event.detail.messages, event.detail.hideAfter) 4552 }, 4553 ['@private-content-loaded.window'](event) { 4554 const data = event.detail.data; 4555 if ( 4556 data.messages && 4557 data.messages.messages && 4558 data.messages.messages.length 4559 ) { 4560 this.addMessages(data.messages.messages); 4561 } 4562 }, 4563 ['@clear-messages.window']() { 4564 this.messages = []; 4565 } 4566 } 4567 } 4568 } 4569</script>
4569 4570<section id="messages" 4571 x-data="initMessages()" 4572 x-bind="eventListeners" 4573 aria-live="assertive" 4574 role="alert" 4575 class="relative" 4576> 4577 <template x-if="!isEmpty()"> 4578 <div class="absolute right-0 top-0"> 4579 <template x-for="(message, index) in messages" :key="index"> 4580 <div> 4581 <template x-if="message"> 4582 <div class="w-full p-6 max-w-x" 4583 :ui-id="'message-' + message.type" 4584 > 4585 <div class="shadow-xl rounded-xl bg-white p-6 pl-8 flex flex-col gap-4 sm:flex-row items-center"> 4586 <div class="flex justify-center 4587 sm:block sm:w-14 sm:pt-1 sm:grow-0 sm:shrink-0" 4588 :class="getColor(message.type)" 4589 x-html="getIcon(message.type)" 4590 ></div> 4591 <div class="text-center sm:text-left sm:pr-12"> 4592 4593 <div class="text-gray-600 mt-2 text-sm"> 4594 <span x-html="message.text"></span> 4595 </div> 4596 </div> 4597 </div> 4598 4599 <div class="absolute right-12 top-12"> 4600 <button 4601 type="button" 4602 class="text-gray-300 hover:text-gray-400" 4603 aria-label="Chiudi il messaggio" 4604 @click.prevent="removeMessage(index)" 4605 > 4606 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="fill-current" width="24" height="24" aria-hidden="true"> 4607 <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"/> 4608</svg> 4609 </button> 4610 </div> 4611 </div> 4612 </template> 4613 </div> 4614 </template> 4615 </div> 4616 </template> 4617</section> 4618</div><div class="columns"><div class="column main"><style>.cmsb220-container { 4619width: 100% 4620} 4621@media (min-width: 640px) { 4622.cmsb220-container { 4623max-width: 640px 4624} 4625} 4626@media (min-width: 768px) { 4627.cmsb220-container { 4628max-width: 768px 4629} 4630} 4631@media (min-width: 1024px) { 4632.cmsb220-container { 4633max-width: 1024px 4634} 4635} 4636@media (min-width: 1280px) { 4637.cmsb220-container { 4638max-width: 1280px 4639} 4640} 4641@media (min-width: 1536px) { 4642.cmsb220-container { 4643max-width: 1536px 4644} 4645} 4646.cmsb220-mx-auto { 4647margin-left: auto; 4648margin-right: auto 4649} 4650.cmsb220-w-full { 4651width: 100% 4652} 4653.cmsb220-p-0 { 4654padding: 0px 4655} 4656.cmsb220-px-6 { 4657padding-left: 1.5rem; 4658padding-right: 1.5rem 4659} 4660.cmsb220-pb-8 { 4661padding-bottom: 2rem 4662} 4663.cmsb220-text-center { 4664text-align: center 4665}</style> 4666<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><h1 class="page-title title-font cmsb220-w-full cmsb220-text-center"><span class="base" data-ui-id="page-title-wrapper">Come possiamo aiutarti?</span></h1> 4667<div class="cmsb220-container cmsb220-mx-auto cmsb220-px-6"> 4668<h2 class="cmsb220-w-full cmsb220-text-center cmsb220-pb-8">Contattaci per prodotti, ordini e assistenza</h2> 4669<p class="cmsb220-p-0 cmsb220-w-full cmsb220-text-center">Per noi è importante accompagnarti in ogni fase della tua esperienza su NatureLab: dalla scelta dei prodotti alle informazioni su ordini, spedizioni e assistenza post-vendita.</p> 4670<p class="cmsb220-p-0 cmsb220-w-full cmsb220-text-center">Se hai una domanda o una richiesta specifica, chiamaci, scrivici o compila il modulo: ti risponderemo il prima possibile.</p> 4671</div><div class="flex flex-col md:flex-row justify-between lg:mt-10 py-2 gap-20 lg:gap-40"> 4672<div class=" lg:w-1/2 w-full"> 4673<style>.cmsb221-mb-6 { 4674margin-bottom: 1.5rem 4675}
4676.cmsb221-mt-1 { 4677margin-top: 0.25rem 4678} 4679.cmsb221-flex { 4680display: flex 4681} 4682.cmsb221-items-start { 4683align-items: flex-start 4684} 4685.cmsb221-gap-4 { 4686gap: 1rem 4687} 4688.cmsb221-p-0 { 4689padding: 0px 4690} 4691.cmsb221-pt-1 { 4692padding-top: 0.25rem 4693} 4694.cmsb221-text-sm { 4695font-size: 0.875rem; 4696line-height: 1.25rem 4697} 4698.cmsb221-font-semibold { 4699font-weight: 600 4700} 4701.cmsb221-uppercase { 4702text-transform: uppercase 4703} 4704.cmsb221-tracking-wider { 4705letter-spacing: 0.05em 4706}</style> 4707<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="cmsb221-flex cmsb221-gap-4 cmsb221-mb-6 cmsb221-items-start"> 4708 <img src="https://www.naturelab.it/media/wysiwyg/icons/servizio-clienti-green.svg" alt="servizio-clienti" width="32" height="32" class="cmsb221-mt-1" /> 4709 <div> 4710 <p class="cmsb221-text-sm cmsb221-uppercase text-natlabGreenOpac cmsb221-font-semibold cmsb221-tracking-wider">Chiamaci dal lunedì al venerdì</p> 4711 <p class="cmsb221-p-0">Mob +39 346 7306919<br>Tel +39 055 7478357</p> 4712 <p class="cmsb221-pt-1 cmsb221-text-sm">Se trovi occupato, lascia un messaggio e ti richiameremo.</p> 4713 </div> 4714 </div> 4715 <div class="cmsb221-flex cmsb221-gap-4 cmsb221-items-start"> 4716 <img src="https://www.naturelab.it/media/wysiwyg/icons/scrivici.svg" alt="scrivici" width="32" height="32" class="cmsb221-mt-1" /> 4717 <div> 4718 <p class="cmsb221-text-sm cmsb221-uppercase text-natlabGreenOpac cmsb221-font-semibold cmsb221-tracking-wider">Scrivici</p> 4719 <p class="cmsb221-p-0"><a href="mailto:[email protected]">[email protected]</a></p> 4720 <p class="cmsb221-pt-1 cmsb221-text-sm">Ti risponderemo entro 24 ore.</p> 4721 </div> 4722 </div></div><form class="form contact" action="https://www.naturelab.it/contact/index/post/" 4723 id="contact" method="post" x-data="initContactForm()" 4724 @submit.prevent="submitForm()"> 4725 <fieldset class="mt-10"> 4726 <div class="flex flex-col w-full mb-6"> 4727 <p class="leading-relaxed text-lg"> 4728 ... oppure, compila e invia il modulo. </p> 4729 </div> 4730 <div class="flex flex-wrap -m-2"> 4731 <div class="field name required p-2 w-full md:w-1/2 text-left"> 4732 <label class="sr-only" for="name"><span> 4733 Nome </span></label> 4734 <input name="name" id="name" required title="Nome" 4735 value="" 4736 class="border-gray-300 rounded-md border p-3 w-full 4737 shadow-sm focus:border-natlabLigthBlue focus:ring focus:ring-natlabLigthBlue focus:ring-opacity-50" type="text" 4738 placeholder="Nome *" /> 4739 </div> 4740 <div class="field email required p-2 w-full md:w-1/2 text-left"> 4741 <label class="sr-only" for="email"><span> 4742 Email </span></label> 4743 <input name="email" id="email" required title="Email" 4744 value="" 4745 class="border-gray-300 rounded-md border p-3 w-full 4746 shadow-sm focus:border-natlabLigthBlue focus:ring focus:ring-natlabLigthBlue focus:ring-opacity-50" 4747 placeholder="Email *" type="email" /> 4748 </div> 4749 4750 <div class="field comment required p-2 w-full text-left"> 4751 <label class="sr-only" for="comment"><span> 4752 A che cosa stai pensando? </span></label> 4753 <textarea name="comment" id="comment" required 4754 placeholder="Il tuo messaggio *" 4755 title="Il tuo messaggio" 4756 class="mt-2 input input-light border-gray-300 rounded-md border p-3 w-full 4757 shadow-sm focus:border-natlabLigthBlue focus:ring focus:ring-natlabLigthBlue focus:ring-opacity-50" cols="5" 4758 rows="2"></textarea> 4759 </div> 4760 4761 <!-- Aggiunta del campo checkbox per la privacy policy --> 4762 <div class="field required privacy-policy-checkbox w-full flex p-2"> 4763 <input type="checkbox" id="privacy-policy" name="privacy_policy" required class="checkbox"> 4764 <label for="privacy-policy" class="text-sm text-gray-600"> 4765 Ho letto e accetto l' 4766 <a href="https://www.naturelab.it/la-tua-privacy/" 4767 title="La tua Privacy" class="underline hover:text-black"> 4768 informativa sulla privacy 4769 </a> 4770 </label> 4771 </div> 4772 4773 <div class="control"> 4774 <input type="hidden" 4775 value="" 4776 name="g-recaptcha-response" 4777 /> 4778</div> 4779 </div> 4780 </fieldset> 4781 <div class="w-full my-3 text-center"> 4782 <input name="form_key" type="hidden" value="xzuVQOR9Ekj125Es" /> <button type="submit" title="Invia messaggio" 4783 class="mx-auto px-6 py-2 btn btn-primary-blu">
4784 <span> 4785 Invia messaggio </span> 4786 </button> 4787 </div> 4788 <div class="w-full"> 4789 <p class="my-4 text-xs text-gray-500"> 4790Questo form è protetto da reCAPTCHA - si applicano le <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">norme sulla privacy</a> e i <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">termini di servizio</a> di <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Google</a>.</p> 4791 </div> 4792</form>
4793<script> 4794 function initContactForm() { 4795 return { 4796 errors: 0, 4797 hasCaptchaToken: 0, 4798 submitForm() { 4799 // Do not rename $form, the variable is expected to be declared in the recaptcha output 4800 const $form = document.querySelector('#contact'); 4801 if (!this.hasCaptchaToken) { 4802 this.errors = 1; 4803 4804 4805 const executeGreCaptcha = () => { 4806 grecaptcha.ready(() => { 4807 grecaptcha.execute( 4808 '6LfEvTcqAAAAAP4jwfTRh8tMSlXxl\u002D8VBqmwaGnN', 4809 {action: 'submit'} 4810 ).then((token) => { 4811 if (token && token.length > 0) { 4812 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 4813 this.errors = 0; 4814 this.hasCaptchaToken = 1; 4815 (this.submitForm || $form.submit).call(this); 4816 } else { 4817 this.errors = 1; 4818 const error = 'La\u0020verifica\u0020reCAPTCHA\u0020non\u0020\u00E8\u0020riuscita,\u0020riprova.'; 4819 if (this.setErrorMessages) { 4820 this.setErrorMessages([error]) 4821 this.displayErrorMessage = true; 4822 } else { 4823 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 4824 } 4825 } 4826 }).catch(exception => { 4827 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 4828 }); 4829 }) 4830 } 4831 4832 if (window.grecaptcha) { 4833 executeGreCaptcha(); 4834 } else { 4835 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfEvTcqAAAAAP4jwfTRh8tMSlXxl\u002D8VBqmwaGnN"; 4836 const script = document.createElement('script'); 4837 script.setAttribute('type', 'text/javascript'); 4838 script.setAttribute('src', recaptchaUrl); 4839 document.head.appendChild(script); 4840 4841 script.addEventListener("load", executeGreCaptcha, false); 4842 } 4843 } 4844 4845 if (this.errors === 0) { 4846 $form.submit(); 4847 } 4848 } 4849 } 4850 } 4851</script>
4851 4852</div> 4853<div class=" lg:w-1/2 w-full"> 4854<style>.cmsb222-relative { 4855position: relative 4856} 4857.cmsb222-mb-6 { 4858margin-bottom: 1.5rem 4859} 4860.cmsb222-mt-1 { 4861margin-top: 0.25rem 4862} 4863.cmsb222-flex { 4864display: flex 4865} 4866.cmsb222-max-h-0 { 4867max-height: 0px 4868} 4869.cmsb222-w-full { 4870width: 100% 4871} 4872.cmsb222-rotate-180 { 4873--tw-rotate: 180deg; 4874transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) 4875} 4876.cmsb222-cursor-pointer { 4877cursor: pointer 4878} 4879.cmsb222-items-start { 4880align-items: flex-start 4881} 4882.cmsb222-items-center { 4883align-items: center 4884} 4885.cmsb222-gap-2 { 4886gap: 0.5rem 4887} 4888.cmsb222-gap-4 { 4889gap: 1rem 4890} 4891.cmsb222-divide-y > :not([hidden]) ~ :not([hidden]) { 4892--tw-divide-y-reverse: 0; 4893border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); 4894border-bottom-width: calc(1px * var(--tw-divide-y-reverse)) 4895} 4896.cmsb222-overflow-hidden { 4897overflow: hidden 4898} 4899.cmsb222-py-3 { 4900padding-top: 0.75rem; 4901padding-bottom: 0.75rem 4902} 4903.cmsb222-pb-3 { 4904padding-bottom: 0.75rem 4905} 4906.cmsb222-text-left { 4907text-align: left 4908} 4909.cmsb222-text-sm { 4910font-size: 0.875rem; 4911line-height: 1.25rem 4912} 4913.cmsb222-font-semibold {
4914font-weight: 600 4915} 4916.cmsb222-uppercase { 4917text-transform: uppercase 4918} 4919.cmsb222-tracking-wider { 4920letter-spacing: 0.05em 4921} 4922.cmsb222-transition-all { 4923transition-property: all; 4924transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 4925transition-duration: 150ms 4926} 4927.cmsb222-transition-transform { 4928transition-property: transform; 4929transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 4930transition-duration: 150ms 4931} 4932.cmsb222-duration-700 { 4933transition-duration: 700ms 4934}</style> 4935<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="cmsb222-flex cmsb222-gap-4 cmsb222-mb-6 cmsb222-items-start"> 4936 <img src="https://www.naturelab.it/media/wysiwyg/icons/faq.svg" alt="faq" width="32" height="32" class="cmsb222-mt-1" /> 4937 <div> 4938 <p class="cmsb222-text-sm cmsb222-uppercase text-natlabGreenOpac cmsb222-font-semibold cmsb222-tracking-wider">Domande frequenti</p> 4939<div class="cmsb222-divide-y" x-data="{ selected: 1 }"> 4940 <ul aria-label="Accordion"> 4941 <li class="cmsb222-relative"> 4942 <button aria-controls="content-1" :aria-expanded="selected == 1 ? 'true' : 'false'" id="accordion-control-1" type="button" :class="{ 'text-natlabGreenOpac': selected == 1 }" class="cmsb222-text-left hover:text-natlabGreenOpac cmsb222-cursor-pointer group cmsb222-flex cmsb222-w-full cmsb222-items-center cmsb222-py-3 cmsb222-gap-2 text-natlabGreenOpac" @click="selected !== 1 ? selected = 1 : selected = null" aria-expanded="true"> 4943 <span>Quali sono i vostri tempi di consegna?</span> 4944 <span :class="{ 'cmsb222-rotate-180': selected == 1 }" class="cmsb222-transition-transform cmsb222-rotate-180"> 4945 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" aria-hidden="true"> 4946 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path> 4947 </svg> 4948 </span> 4949 </button> 4950 <div :aria-hidden="selected !== 1 ? 'true' : 'false'" id="content-1" class="cmsb222-relative cmsb222-overflow-hidden cmsb222-transition-all cmsb222-max-h-0 cmsb222-duration-700" x-ref="container1" x-bind:style="selected == 1 ? 'max-height: ' + $refs.container1.scrollHeight + 'px' : ''" aria-hidden="false" style="max-height: 366px"> 4951 <div class="cmsb222-pb-3 cmsb222-text-left"> 4952 <p>Dal lunedì al venerdì, gli ordini effettuati prima delle 12:00 saranno spediti il giorno stesso, mentre gli ordini effettuati dopo le 12:00 saranno spediti il giorno successivo (esclusi i fine settimana e i giorni festivi). Riceverai un'e-mail con le informazioni di tracciamento non appena il tuo ordine sarà stato spedito. I tempi di consegna sono generalmente tra le 24 e le 72 ore, dipende dalle zone.</p> 4953 </div> 4954 </div> 4955 </li> 4956 <li class="cmsb222-relative"> 4957 <button aria-controls="content-2" :aria-expanded="selected == 2 ? 'true' : 'false'" id="accordion-control-2" type="button" :class="{ 'text-natlabGreenOpac': selected == 2 }" class="cmsb222-text-left hover:text-natlabGreenOpac cmsb222-cursor-pointer group cmsb222-flex cmsb222-w-full cmsb222-items-center cmsb222-py-3 cmsb222-gap-2" @click="selected !== 2 ? selected = 2 : selected = null" aria-expanded="false"> 4958 <span>Pagamento alla consegna: posso pagare con un assegno o con la carta?</span> 4959 <span :class="{ 'cmsb222-rotate-180': selected == 2 }" class="cmsb222-transition-transform"> 4960 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" aria-hidden="true"> 4961 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path> 4962 </svg> 4963 </span> 4964 </button> 4965 <div :aria-hidden="selected !== 2 ? 'true' : 'false'" id="content-2" class="cmsb222-relative cmsb222-overflow-hidden cmsb222-transition-all cmsb222-max-h-0 cmsb222-duration-700" x-ref="container2" x-bind:style="selected == 2 ? 'max-height: ' + $refs.container2.scrollHeight + 'px' : ''" aria-hidden="true" style=""> 4966 <div class="cmsb222-pb-3 cmsb222-text-left"> 4967 <p>No, per il pagamento in contrassegno, il corriere accetta solo contanti (pensa a preparare l'importo corretto).</p> 4968 </div> 4969 </div> 4970 </li> 4971 <li class="cmsb222-relative"> 4972 <button aria-controls="content-3" :aria-expanded="selected == 3 ? 'true' : 'false'" id="accordion-control-3" type="button" :class="{ 'text-natlabGreenOpac': selected == 3 }" class="cmsb222-text-left hover:text-natlabGreenOpac cmsb222-cursor-pointer group cmsb222-flex cmsb222-w-full cmsb222-items-center cmsb222-py-3 cmsb222-gap-2" @click="selected !== 3 ? selected = 3 : selected = null" aria-expanded="false">
4973 <span>Ho effettuato l'ordine ma vorrei modificarlo: cosa posso fare?</span> 4974 <span :class="{ 'cmsb222-rotate-180': selected == 3 }" class="cmsb222-transition-transform"> 4975 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" aria-hidden="true"> 4976 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path> 4977 </svg> 4978 </span> 4979 </button> 4980 <div :aria-hidden="selected !== 3 ? 'true' : 'false'" id="content-3" class="cmsb222-relative cmsb222-overflow-hidden cmsb222-transition-all cmsb222-max-h-0 cmsb222-duration-700" x-ref="container3" x-bind:style="selected == 3 ? 'max-height: ' + $refs.container3.scrollHeight + 'px' : ''" aria-hidden="true" style=""> 4981 <div class="cmsb222-pb-3 cmsb222-text-left"> 4982 <p>Purtroppo non è possibile modificare il contenuto di un ordine convalidato. Per modificare il contenuto dell'ordine, è necessario contattarci rapidamente per telefono o per e-mail nei fine settimana, in modo da poter annullare l'ordine e poterne effettuare uno nuovo con il contenuto desiderato.</p> 4983 </div> 4984 </div> 4985 </li> 4986 <li class="cmsb222-relative"> 4987 <button aria-controls="content-4" :aria-expanded="selected == 4 ? 'true' : 'false'" id="accordion-control-4" type="button" :class="{ 'text-natlabGreenOpac': selected == 4 }" class="cmsb222-text-left hover:text-natlabGreenOpac cmsb222-cursor-pointer group cmsb222-flex cmsb222-w-full cmsb222-items-center cmsb222-py-3 cmsb222-gap-2" @click="selected !== 4 ? selected = 4 : selected = null" aria-expanded="false"> 4988 <span>Come posso tracciare il mio pacco?</span> 4989 <span :class="{ 'cmsb222-rotate-180': selected == 4 }" class="cmsb222-transition-transform"> 4990 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" aria-hidden="true"> 4991 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path> 4992 </svg> 4993 </span> 4994 </button> 4995 <div :aria-hidden="selected !== 4 ? 'true' : 'false'" id="content-4" class="cmsb222-relative cmsb222-overflow-hidden cmsb222-transition-all cmsb222-max-h-0 cmsb222-duration-700" x-ref="container4" x-bind:style="selected == 4 ? 'max-height: ' + $refs.container4.scrollHeight + 'px' : ''" aria-hidden="true" style=""> 4996 <div class="cmsb222-pb-3 cmsb222-text-left"> 4997 <p>Dopo la spedizione, riceverai un'e-mail con il numero di tracking del tuo pacco. Conserva questa e-mail per controllare lo stato della consegna.</p> 4998 </div> 4999 </div> 5000 </li> 5001 <li class="cmsb222-relative"> 5002 <button aria-controls="content-5" :aria-expanded="selected == 5 ? 'true' : 'false'" id="accordion-control-5" type="button" :class="{ 'text-natlabGreenOpac': selected == 5 }" class="cmsb222-text-left hover:text-natlabGreenOpac cmsb222-cursor-pointer group cmsb222-flex cmsb222-w-full cmsb222-items-center cmsb222-py-3 cmsb222-gap-2" @click="selected !== 5 ? selected = 5 : selected = null" aria-expanded="false"> 5003 <span>Posso restituire un prodotto?</span> 5004 <span :class="{ 'cmsb222-rotate-180': selected == 5 }" class="cmsb222-transition-transform"> 5005 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" aria-hidden="true"> 5006 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path> 5007 </svg> 5008 </span> 5009 </button> 5010 <div :aria-hidden="selected !== 5 ? 'true' : 'false'" id="content-5" class="cmsb222-relative cmsb222-overflow-hidden cmsb222-transition-all cmsb222-max-h-0 cmsb222-duration-700" x-ref="container5" x-bind:style="selected == 5 ? 'max-height: ' + $refs.container5.scrollHeight + 'px' : ''" aria-hidden="true" style=""> 5011 <div class="cmsb222-pb-3 cmsb222-text-left"> 5012 <p>Se desideri restituire uno dei nostri prodotti, devi informarci della tua decisione entro 14 giorni lavorativi dalla ricezione dell'ordine contattandoci telefonicamente o via e-mail. Ricorda che è possibile restituire solo i <strong>prodotti che non sono mai stati aperti</strong>.</p> 5013 </div> 5014 </div> 5015 </li> 5016 <li class="cmsb222-relative"> 5017 <button aria-controls="content-6" :aria-expanded="selected == 6 ? 'true' : 'false'" id="accordion-control-6" type="button" :class="{ 'text-natlabGreenOpac': selected == 6 }" class="cmsb222-text-left hover:text-natlabGreenOpac cmsb222-cursor-pointer group cmsb222-flex cmsb222-w-full cmsb222-items-center cmsb222-py-3 cmsb222-gap-2" @click="selected !== 6 ? selected = 6 : selected = null" aria-expanded="false">
5018 <span>Ho ricevuto dei prodotti danneggiati: che cosa devo fare?</span> 5019 <span :class="{ 'cmsb222-rotate-180': selected == 6 }" class="cmsb222-transition-transform"> 5020 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" aria-hidden="true"> 5021 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path> 5022 </svg> 5023 </span> 5024 </button> 5025 <div :aria-hidden="selected !== 6 ? 'true' : 'false'" id="content-6" class="cmsb222-relative cmsb222-overflow-hidden cmsb222-transition-all cmsb222-max-h-0 cmsb222-duration-700" x-ref="container6" x-bind:style="selected == 6 ? 'max-height: ' + $refs.container6.scrollHeight + 'px' : ''" aria-hidden="true" style=""> 5026 <div class="cmsb222-pb-3 cmsb222-text-left"> 5027 <p>Se dovessi ricevere prodotti danneggiati, comunicacelo entro massimo 5 giorni lavorativi via email, allegando una foto. Ti contatteremo immediatamente per pianificare la sostituzione.</p> 5028 </div> 5029 </div> 5030 </li> 5031 </ul> 5032 </div> 5033 5034 </div> 5035 </div></div></div> 5036</div> 5037</div></div><div id="fp.wp.marker-bottom"></div></main><footer class="page-footer"><div class="footer content"><div class="body-font"> 5038 <div class="py-14 text-center mt-0 lg:mt-14 sm:bg-white md:bg-transparent" x-data="{ showWidget: false }" x-intersect="showWidget = true"> 5039 5040 <h2 class="text-lg leading-5 font-medium tracking-wider uppercase text-natlabGreen pb-4"> 5041 Dicono di noi </h2> 5042 <template x-if="showWidget || (window.productPage ?? false)"> 5043 <div> 5044
5044<script class="feedaty_sdk" src="https://widget.feedaty.com/v3.0.0/js/2021/10214357/feedaty.min.js" defer></script>
5044 5045 <div class="container feedaty_widget lg:block hidden" data-ver="2021" data-id="645e358e4b54b" data-type="carousel" data-variant="carosello-1" data-lang="all" data-gui="it-IT"></div> 5046 <div class="feedaty_widget lg:hidden" data-ver="2021" data-id="646646b30e237" data-type="carousel" data-variant="carosello-3" data-lang="all" data-gui="all"></div> 5047 </div> 5048 </template> 5049 </div> 5050 <div class="bg-footer-mobile-bg lg:bg-footer-bg bg-left-top bg-cover pb-4 pt-20 md:pt-32 2xl:pt-24 "> 5051 <div class="border-b border-b-white border-opacity-5 pb-4"> 5052 <div class="container flex flex-col-reverse lg:flex-row justify-between mt-3 xl:mt-10"> 5053 <div class="w-full lg:w-1/2 pb-6 pt-2"> 5054 <div class="divide-gray-300 divide-opacity-10 divide-y space-y-4 lg:flex lg:divide-none lg:justify-between lg:space-y-0 w-full"> 5055 <div x-data="{ open: false }"> 5056 <style>.cmsb214-sr-only { 5057position: absolute; 5058width: 1px; 5059height: 1px; 5060padding: 0; 5061margin: -1px; 5062overflow: hidden; 5063clip: rect(0, 0, 0, 0); 5064white-space: nowrap; 5065border-width: 0 5066} 5067.cmsb214-mt-6 { 5068margin-top: 1.5rem 5069} 5070.cmsb214-flex { 5071display: flex 5072} 5073.cmsb214-hidden { 5074display: none 5075} 5076.cmsb214-w-full { 5077width: 100% 5078} 5079.cmsb214-rotate-180 { 5080--tw-rotate: 180deg; 5081transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) 5082} 5083.cmsb214-cursor-pointer { 5084cursor: pointer 5085} 5086.cmsb214-flex-col { 5087flex-direction: column 5088} 5089.cmsb214-justify-between { 5090justify-content: space-between 5091} 5092.cmsb214-gap-4 { 5093gap: 1rem 5094} 5095.cmsb214-align-middle { 5096vertical-align: middle 5097} 5098.cmsb214-text-gray-300 { 5099--tw-text-opacity: 1; 5100color: rgb(209 213 219 / var(--tw-text-opacity)) 5101} 5102.cmsb214-transition-transform { 5103transition-property: transform; 5104transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 5105transition-duration: 150ms 5106} 5107.cmsb214-hover\:text-white:hover { 5108--tw-text-opacity: 1; 5109color: rgb(255 255 255 / var(--tw-text-opacity)) 5110} 5111.cmsb214-hover\:underline:hover { 5112text-decoration-line: underline 5113} 5114@media (min-width: 1024px) { 5115.cmsb214-lg\:mt-2 { 5116margin-top: 0.5rem 5117} 5118.cmsb214-lg\:flex { 5119display: flex 5120} 5121.cmsb214-lg\:hidden { 5122display: none 5123} 5124.cmsb214-lg\:cursor-default { 5125cursor: default 5126} 5127.cmsb214-lg\:gap-2 { 5128gap: 0.5rem 5129} 5130.cmsb214-lg\:pr-6 { 5131padding-right: 1.5rem 5132} 5133.cmsb214-lg\:text-sm { 5134font-size: 0.875rem; 5135line-height: 1.25rem 5136} 5137}</style> 5138<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><h2 class="cmsb214-sr-only">Informazioni e servizi NatureLab</h2> 5139<button @click="open = ! open" class="cmsb214-flex cmsb214-justify-between cmsb214-align-middle cmsb214-cursor-pointer group cmsb214-lg:cursor-default cmsb214-w-full"> 5140 <h3 class="footer-title">Scopri NatureLab</h3> 5141 <span class="cmsb214-transition-transform text-natlabGreenOpac cmsb214-lg:hidden" :class="{ 'cmsb214-rotate-180': open }"> 5142 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="20" height="20" stroke="currentColor" stroke-width="2" aria-hidden="true"> 5143 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" /> 5144 </svg> 5145 </span> 5146</button> 5147<ul class="cmsb214-flex-col cmsb214-gap-4 cmsb214-lg:gap-2 cmsb214-mt-6 cmsb214-lg:mt-2 cmsb214-lg:flex cmsb214-lg:text-sm cmsb214-lg:pr-6" :class="{ 'cmsb214-flex': open, 'cmsb214-hidden': ! open }"> 5148 <li><a href="https://www.naturelab.it/chi-siamo/" title="Chi siamo e com'è nata NatureLab" class="cmsb214-hover:underline cmsb214-text-gray-300 cmsb214-hover:text-white">Chi siamo e com'è nata NatureLab</a></li> 5149<li><a href="https://www.naturelab.it/francesco-mando-tacconi/" title="Profilo scientifico del Dottor Francesco Mandò Tacconi, consulente NatureLab" class="cmsb214-hover:underline cmsb214-text-gray-300 cmsb214-hover:text-white">Il nostro consulente scientifico</a></li> 5150 <li><a href="/blog/" title="Blog Lab: la fitoterapia secondo noi" class="cmsb214-hover:underline cmsb214-text-gray-300 cmsb214-hover:text-white">Blog Lab: la fitoterapia secondo noi</a></li> 5151<li><a href="/tutto-sul-silicio-organico/" title="Guida completa sul Silicio Organico" class="cmsb214-hover:underline cmsb214-text-gray-300 cmsb214-hover:text-white">Guida al Silicio Organico</a></li> 5152 <li><a href="https://www.naturelab.it/contact/" title="Contattaci" class="cmsb214-hover:underline cmsb214-text-gray-300 cmsb214-hover:text-white">Contattaci</a></li> 5153 <li><a href="https://www.feedaty.com/recensioni/naturelab?gui=it-IT" target="_blank" rel="noopener noreferrer" title="Dicono di noi" class="cmsb214-hover:underline cmsb214-text-gray-300 cmsb214-hover:text-white">Dicono di noi</a></li> 5154</ul></div> 5155 </div> 5156 <div x-data="{ open: false }" class="pt-4 lg:p-0"> 5157 <style>.cmsb215-mt-6 { 5158margin-top: 1.5rem 5159}
5160.cmsb215-flex { 5161display: flex 5162} 5163.cmsb215-hidden { 5164display: none 5165} 5166.cmsb215-w-full { 5167width: 100% 5168} 5169.cmsb215-rotate-180 { 5170--tw-rotate: 180deg; 5171transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) 5172} 5173.cmsb215-cursor-pointer { 5174cursor: pointer 5175} 5176.cmsb215-flex-col { 5177flex-direction: column 5178} 5179.cmsb215-justify-between { 5180justify-content: space-between 5181} 5182.cmsb215-gap-4 { 5183gap: 1rem 5184} 5185.cmsb215-align-middle { 5186vertical-align: middle 5187} 5188.cmsb215-text-gray-300 { 5189--tw-text-opacity: 1; 5190color: rgb(209 213 219 / var(--tw-text-opacity)) 5191} 5192.cmsb215-transition-transform { 5193transition-property: transform; 5194transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 5195transition-duration: 150ms 5196} 5197.cmsb215-hover\:text-white:hover { 5198--tw-text-opacity: 1; 5199color: rgb(255 255 255 / var(--tw-text-opacity)) 5200} 5201.cmsb215-hover\:underline:hover { 5202text-decoration-line: underline 5203} 5204@media (min-width: 1024px) { 5205.cmsb215-lg\:mt-2 { 5206margin-top: 0.5rem 5207} 5208.cmsb215-lg\:flex { 5209display: flex 5210} 5211.cmsb215-lg\:hidden { 5212display: none 5213} 5214.cmsb215-lg\:cursor-default { 5215cursor: default 5216} 5217.cmsb215-lg\:gap-2 { 5218gap: 0.5rem 5219} 5220.cmsb215-lg\:pr-6 { 5221padding-right: 1.5rem 5222} 5223.cmsb215-lg\:text-sm { 5224font-size: 0.875rem; 5225line-height: 1.25rem 5226} 5227}</style> 5228<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><button @click="open = ! open" class="cmsb215-flex cmsb215-justify-between cmsb215-align-middle cmsb215-cursor-pointer group cmsb215-lg:cursor-default cmsb215-w-full"> 5229 <h3 class="footer-title">Per saperne di più</h3> 5230 <span class="cmsb215-transition-transform text-natlabGreenOpac cmsb215-lg:hidden" :class="{ 'cmsb215-rotate-180': open }"> 5231 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="20" height="20" stroke="currentColor" stroke-width="2" aria-hidden="true"> 5232 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" /> 5233 </svg> 5234 </span> 5235</button> 5236<ul class="cmsb215-flex-col cmsb215-gap-4 cmsb215-lg:gap-2 cmsb215-mt-6 cmsb215-lg:mt-2 cmsb215-lg:flex cmsb215-lg:text-sm cmsb215-lg:pr-6" :class="{ 'cmsb215-flex': open, 'cmsb215-hidden': ! open }"> 5237 <li><a href="/condizioni-di-vendita/" title="Condizioni di vendita" class="cmsb215-hover:underline cmsb215-text-gray-300 cmsb215-hover:text-white">Condizioni di vendita</a></li> 5238 <li><a href="/metodi-di-pagamento/" title="Modalità di pagamento" class="cmsb215-hover:underline cmsb215-text-gray-300 cmsb215-hover:text-white">Modalità di pagamento</a></li> 5239 <li><a href="/tempi-e-spese-di-spedizione/" title="Tempi di spedizione" class="cmsb215-hover:underline cmsb215-text-gray-300 cmsb215-hover:text-white">Tempi di spedizione</a></li> 5240 <li><a href="/diritto-di-recesso/" title="Diritto di recesso" class="cmsb215-hover:underline cmsb215-text-gray-300 cmsb215-hover:text-white">Diritto di recesso</a></li> 5241</ul></div> 5242 </div> 5243 <div x-data="{ open: false }" class="pt-4 lg:p-0"> 5244 <style>.cmsb216-mt-6 { 5245margin-top: 1.5rem 5246} 5247.cmsb216-flex { 5248display: flex 5249} 5250.cmsb216-hidden { 5251display: none 5252} 5253.cmsb216-w-full { 5254width: 100% 5255} 5256.cmsb216-rotate-180 { 5257--tw-rotate: 180deg; 5258transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) 5259} 5260.cmsb216-cursor-pointer { 5261cursor: pointer 5262} 5263.cmsb216-flex-col { 5264flex-direction: column 5265} 5266.cmsb216-justify-between { 5267justify-content: space-between 5268} 5269.cmsb216-gap-4 { 5270gap: 1rem 5271} 5272.cmsb216-align-middle { 5273vertical-align: middle 5274} 5275.cmsb216-text-gray-300 { 5276--tw-text-opacity: 1; 5277color: rgb(209 213 219 / var(--tw-text-opacity)) 5278} 5279.cmsb216-transition-transform { 5280transition-property: transform; 5281transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 5282transition-duration: 150ms 5283} 5284.cmsb216-hover\:text-white:hover { 5285--tw-text-opacity: 1; 5286color: rgb(255 255 255 / var(--tw-text-opacity)) 5287} 5288.cmsb216-hover\:underline:hover { 5289text-decoration-line: underline 5290} 5291@media (min-width: 1024px) { 5292.cmsb216-lg\:mt-2 { 5293margin-top: 0.5rem 5294}
5295.cmsb216-lg\:flex { 5296display: flex 5297} 5298.cmsb216-lg\:hidden { 5299display: none 5300} 5301.cmsb216-lg\:cursor-default { 5302cursor: default 5303} 5304.cmsb216-lg\:gap-2 { 5305gap: 0.5rem 5306} 5307.cmsb216-lg\:pr-6 { 5308padding-right: 1.5rem 5309} 5310.cmsb216-lg\:text-sm { 5311font-size: 0.875rem; 5312line-height: 1.25rem 5313} 5314}</style> 5315<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><button @click="open = ! open" class="cmsb216-flex cmsb216-justify-between cmsb216-align-middle cmsb216-cursor-pointer group cmsb216-lg:cursor-default cmsb216-w-full"> 5316 <h3 class="footer-title">Il mio account</h3> 5317 <span class="cmsb216-transition-transform text-natlabGreenOpac cmsb216-lg:hidden" :class="{ 'cmsb216-rotate-180': open }"> 5318 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="20" height="20" stroke="currentColor" stroke-width="2" aria-hidden="true"> 5319 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" /> 5320 </svg> 5321 </span> 5322</button> 5323<ul class="cmsb216-flex-col cmsb216-gap-4 cmsb216-lg:gap-2 cmsb216-mt-6 cmsb216-lg:mt-2 cmsb216-lg:flex cmsb216-lg:text-sm cmsb216-lg:pr-6" :class="{ 'cmsb216-flex': open, 'cmsb216-hidden': ! open }"> 5324 <li><a href="/customer/account/login/" title="Accedi" class="cmsb216-hover:underline cmsb216-text-gray-300 cmsb216-hover:text-white">Accedi</a></li> 5325 <li><a href="/customer/account/create/" title="Crea un Account" class="cmsb216-hover:underline cmsb216-text-gray-300 cmsb216-hover:text-white">Crea un Account</a></li> 5326 <li><a href="/customer/account/forgotpassword/" title="Hai dimenticato la password?" class="cmsb216-hover:underline cmsb216-text-gray-300 cmsb216-hover:text-white">Hai dimenticato la password?</a></li> 5327 <li><a href="/customer/account/login/" title="Dov'è il mio pacco?" class="cmsb216-hover:underline cmsb216-text-gray-300 cmsb216-hover:text-white">Dov'è il mio pacco?</a></li> 5328</ul></div> 5329 </div> 5330 </div> 5331 </div> 5332 <div class="w-full lg:w-1/2 lg:border-l border-white border-opacity-5 ml-0 pl-0 lg:ml-10 lg:pl-10 mb-10 lg:mb-0 pb-6 pt-2"> 5333 <style>.cmsb213-m-0 { 5334margin: 0px 5335} 5336.cmsb213-mx-auto { 5337margin-left: auto; 5338margin-right: auto 5339} 5340.cmsb213-block { 5341display: block 5342} 5343.cmsb213-flex { 5344display: flex 5345} 5346.cmsb213-h-10 { 5347height: 2.5rem 5348} 5349.cmsb213-w-10 { 5350width: 2.5rem 5351} 5352.cmsb213-w-full { 5353width: 100% 5354} 5355.cmsb213-flex-wrap { 5356flex-wrap: wrap 5357} 5358.cmsb213-justify-center { 5359justify-content: center 5360} 5361.cmsb213-gap-x-0 { 5362column-gap: 0px 5363} 5364.cmsb213-gap-x-8 { 5365column-gap: 2rem 5366} 5367.cmsb213-gap-y-2 { 5368row-gap: 0.5rem 5369} 5370.cmsb213-gap-y-6 { 5371row-gap: 1.5rem 5372} 5373.cmsb213-p-0 { 5374padding: 0px 5375} 5376.cmsb213-text-center { 5377text-align: center 5378} 5379.cmsb213-text-sm { 5380font-size: 0.875rem; 5381line-height: 1.25rem 5382} 5383.cmsb213-font-medium { 5384font-weight: 500 5385} 5386.cmsb213-uppercase { 5387text-transform: uppercase 5388} 5389.cmsb213-tracking-wider { 5390letter-spacing: 0.05em 5391} 5392.cmsb213-text-gray-400 { 5393--tw-text-opacity: 1; 5394color: rgb(156 163 175 / var(--tw-text-opacity)) 5395} 5396.cmsb213-opacity-60 { 5397opacity: 0.6 5398} 5399@media (min-width: 1024px) { 5400.cmsb213-lg\:mx-0 { 5401margin-left: 0px; 5402margin-right: 0px 5403} 5404.cmsb213-lg\:mb-0 { 5405margin-bottom: 0px 5406} 5407.cmsb213-lg\:flex { 5408display: flex 5409} 5410.cmsb213-lg\:justify-between { 5411justify-content: space-between 5412} 5413.cmsb213-lg\:gap-x-4 { 5414column-gap: 1rem 5415} 5416.cmsb213-lg\:gap-y-0 { 5417row-gap: 0px 5418} 5419.cmsb213-lg\:text-start { 5420text-align: start 5421} 5422}</style> 5423<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="cmsb213-w-full cmsb213-flex cmsb213-flex-wrap cmsb213-justify-center cmsb213-lg:justify-between cmsb213-gap-x-8 cmsb213-gap-y-6"> 5424 <div class="cmsb213-text-sm cmsb213-text-gray-400 cmsb213-text-center cmsb213-lg:text-start cmsb213-block cmsb213-lg:flex cmsb213-gap-y-2 cmsb213-gap-x-0 cmsb213-lg:gap-y-0 cmsb213-lg:gap-x-4"> 5425 <img class="cmsb213-w-10 cmsb213-h-10 cmsb213-mx-auto cmsb213-lg:mx-0 cmsb213-lg:mb-0 cmsb213-opacity-60" alt="Servizio clienti" width="40" height="40" src="/media/wysiwyg/icons/servizio-clienti.svg" /> 5426 <p class="cmsb213-p-0 cmsb213-m-0"><span class="cmsb213-uppercase cmsb213-font-medium cmsb213-tracking-wider">Servizio clienti</span><br />Mob +39 346 7306919 - Tel +39 055 7478357</p> 5427 </div> 5428 <div class="cmsb213-text-sm cmsb213-text-gray-400 cmsb213-text-center cmsb213-lg:text-start cmsb213-block cmsb213-lg:flex cmsb213-gap-y-2 cmsb213-gap-x-0 cmsb213-lg:gap-y-0 cmsb213-lg:gap-x-4"> 5429 <img class="cmsb213-w-10 cmsb213-h-10 cmsb213-mx-auto cmsb213-lg:mx-0 cmsb213-lg:mb-0 cmsb213-opacity-60" alt="Pagamenti sicuri" width="40" height="40" src="/media/wysiwyg/icons/pagamento-sicuro.svg" /> 5430 <p class="cmsb213-p-0 cmsb213-m-0"><span class="cmsb213-uppercase cmsb213-font-medium cmsb213-tracking-wider">Pagamenti sicuri</span><br />Transazioni con crittografia SSL</p> 5431 </div> 5432 <div class="cmsb213-text-sm cmsb213-text-gray-400 cmsb213-text-center cmsb213-lg:text-start cmsb213-block cmsb213-lg:flex cmsb213-gap-y-2 cmsb213-gap-x-0 cmsb213-lg:gap-y-0 cmsb213-lg:gap-x-4"> 5433 <img class="cmsb213-w-10 cmsb213-h-10 cmsb213-mx-auto cmsb213-lg:mx-0 cmsb213-lg:mb-0 cmsb213-opacity-60" alt="Conseg
5433na gratuita" width="40" height="40" src="/media/wysiwyg/icons/consegna-gratuita.svg" /> 5434 <p class="cmsb213-p-0 cmsb213-m-0"><span class="cmsb213-uppercase cmsb213-font-medium cmsb213-tracking-wider">Spedizione gratuita</span><br />In Italia da <strong>69,00 â¬</strong></p> 5435 </div> 5436 <div class="cmsb213-text-sm cmsb213-text-gray-400 cmsb213-text-center cmsb213-lg:text-start cmsb213-block cmsb213-lg:flex cmsb213-gap-y-2 cmsb213-gap-x-0 cmsb213-lg:gap-y-0 cmsb213-lg:gap-x-4"> 5437 <img class="cmsb213-w-10 cmsb213-h-10 cmsb213-mx-auto cmsb213-lg:mx-0 cmsb213-lg:mb-0 cmsb213-opacity-60" alt="Consegna veloce" width="40" height="40" src="/media/wysiwyg/icons/consegna-veloce.svg" /> 5438 <p class="cmsb213-p-0 cmsb213-m-0"><span class="cmsb213-uppercase cmsb213-font-medium cmsb213-tracking-wider">Consegna veloce</span><br />In 24-48-72 ore, secondo le zone</p> 5439 </div> 5440</div></div> 5441 </div> 5442 </div> 5443 <div class="container"> 5444 <style>.cmsb208-mb-6 { 5445margin-bottom: 1.5rem 5446} 5447.cmsb208-ml-0 { 5448margin-left: 0px 5449} 5450.cmsb208-ml-4 { 5451margin-left: 1rem 5452} 5453.cmsb208-flex { 5454display: flex 5455} 5456.cmsb208-w-full { 5457width: 100% 5458} 5459.cmsb208-flex-col { 5460flex-direction: column 5461} 5462.cmsb208-flex-wrap { 5463flex-wrap: wrap 5464} 5465.cmsb208-items-baseline { 5466align-items: baseline 5467} 5468.cmsb208-justify-center { 5469justify-content: center 5470} 5471.cmsb208-justify-between { 5472justify-content: space-between 5473} 5474.cmsb208-gap-2 { 5475gap: 0.5rem 5476} 5477.cmsb208-gap-3 { 5478gap: 0.75rem 5479} 5480.cmsb208-gap-6 { 5481gap: 1.5rem 5482} 5483.cmsb208-border-l-0 { 5484border-left-width: 0px 5485} 5486.cmsb208-border-white { 5487--tw-border-opacity: 1; 5488border-color: rgb(255 255 255 / var(--tw-border-opacity)) 5489} 5490.cmsb208-border-opacity-5 { 5491--tw-border-opacity: 0.05 5492} 5493.cmsb208-py-2 { 5494padding-top: 0.5rem; 5495padding-bottom: 0.5rem 5496} 5497.cmsb208-pb-3 { 5498padding-bottom: 0.75rem 5499} 5500.cmsb208-pb-4 { 5501padding-bottom: 1rem 5502} 5503.cmsb208-pl-0 { 5504padding-left: 0px 5505} 5506.cmsb208-pt-10 { 5507padding-top: 2.5rem 5508} 5509.cmsb208-text-center { 5510text-align: center 5511} 5512.cmsb208-opacity-60 { 5513opacity: 0.6 5514} 5515@media (min-width: 1024px) { 5516.cmsb208-lg\:mb-0 { 5517margin-bottom: 0px 5518} 5519.cmsb208-lg\:ml-10 { 5520margin-left: 2.5rem 5521} 5522.cmsb208-lg\:w-1\/2 { 5523width: 50% 5524} 5525.cmsb208-lg\:w-1\/3 { 5526width: 33.333333% 5527} 5528.cmsb208-lg\:w-2\/3 { 5529width: 66.666667% 5530} 5531.cmsb208-lg\:flex-row { 5532flex-direction: row 5533} 5534.cmsb208-lg\:flex-nowrap { 5535flex-wrap: nowrap 5536} 5537.cmsb208-lg\:justify-start { 5538justify-content: flex-start 5539} 5540.cmsb208-lg\:border-l { 5541border-left-width: 1px 5542} 5543.cmsb208-lg\:pl-10 { 5544padding-left: 2.5rem 5545} 5546.cmsb208-lg\:text-start { 5547text-align: start 5548} 5549}</style> 5550<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="cmsb208-flex cmsb208-flex-col cmsb208-lg:flex-row cmsb208-justify-between"> 5551 <div class="cmsb208-w-full cmsb208-lg:w-1/2 cmsb208-pt-10"> 5552 <div class="cmsb208-w-full cmsb208-flex cmsb208-flex-wrap cmsb208-lg:flex-nowrap cmsb208-gap-2"> 5553 <div class="cmsb208-w-full cmsb208-lg:w-2/3"> 5554<h3 class="footer-title cmsb208-pb-3 cmsb208-text-center">Acquista con serenità </h3> 5555 <div class="cmsb208-w-full cmsb208-flex cmsb208-flex-wrap cmsb208-gap-3 cmsb208-justify-center"> 5556<img class="cmsb208-opacity-60" alt="Visa" width="40" height="27" src="/media/wysiwyg/icons/visa.svg" loading="lazy" /> 5557<img class="cmsb208-opacity-60" alt="Mastercard" width="40" height="27" src="/media/wysiwyg/icons/mastercard.svg" loading="lazy" /> 5558<img class="cmsb208-opacity-60" alt="Maestro" width="40" height="27" src="/media/wysiwyg/icons/maestro.svg" loading="lazy" /> 5559<img class="cmsb208-opacity-60" alt="PostePay" width="40" height="27" src="/media/wysiwyg/icons/poste-pay.svg" loading="lazy" /> 5560<img class="cmsb208-opacity-60" alt="PayPal" width="40" height="27" src="/media/wysiwyg/icons/paypal.svg" loading="lazy" /> 5561<img class="cmsb208-opacity-60" alt="Bonifico bancario" width="77" height="20" src="/media/wysiwyg/icons/bonifico.svg" loading="lazy" /> 5562<img class="cmsb208-opacity-60" alt="Contrassegno contanti" width="116" height="20" src="/media/wysiwyg/icons/contrassegno.svg" loading="lazy"/> 5563 </div> 5564 </div> 5565 <div class="cmsb208-w-full cmsb208-lg:w-1/3"><h3 class="footer-title cmsb208-pb-3 cmsb208-text-center">Ricevi dove vuoi</h3> 5566 <div class="cmsb208-flex cmsb208-flex-wrap cmsb208-gap-3 cmsb208-justify-center"> 5567<img class="cmsb208-opacity-60 cmsb208-py-2" class="cmsb208-ml-4" alt="Corriere GLS" width="59" height="20" src="/media/wysiwyg/icons/gls.svg" loading="lazy" /> 5568<img class="cmsb208-opacity-60" alt="TNT Express" width="55" height="20" src="/media/wysiwyg/icons/tnt-express.svg" loading="lazy" /> 5569<img class="cmsb208-opacity-60" alt="Fedex" width="67" height="20" src="/media/wysiwyg/icons/fedex.svg" loading="lazy" /> 5570 </div> 5571 </div> 5572 </div> 5573</div> 5574<div class="cmsb208-w-full cmsb208-lg:w-1/2 cmsb208-pt-10 cmsb208-mb-6 cmsb208-lg:mb-0 cmsb208-border-l-0 cmsb208-lg:border-l cmsb208-ml-0 cmsb208-pl-0 cmsb208-border-white cmsb208-border-opacity-5 cmsb208-lg:ml-10 cmsb208-lg:pl-10 "> 5575<h3 class="footer-title cmsb208-pb-4 cmsb208-text-center cmsb208-lg:text-start">E-commerce certificato sicuro e affidabile</h3> 5576<ul class="cmsb208-gap-6 cmsb208-flex cmsb208-items-baseline cmsb208-justify-center cmsb208-lg:justify-start"> 5577<li><a href="https://www.aicel.org/categorie/cura-della-persona-14/naturelab-integratori-alimentari-fitoterapici-3624/" title="Aicel certificato Sono Sicuro" rel="noopener" target="_blank"><img alt="Sito certificato Aicel negozio #1989" width="200" height="70" src="/media/wysiwyg/icons/aicel-sito-certificato-1989-white.svg" class="cmsb208-opacity-60" loading="lazy" /></a> </li> 5578</ul> 5579</div> 5580</div> </div> 5581 </div> 5582 <div class="container"> 5583 <style>.cmsb207-mt-0 { 5584margin-top: 0px 5585} 5586.cmsb207-block { 5587display: block 5588} 5589.cmsb207-flex { 5590display: flex 5591} 5592.cmsb207-w-full { 5593width: 100% 5594} 5595.cmsb207-flex-col { 5596flex-direction: column 5597} 5598.cmsb207-flex-col-reverse { 5599flex-direction: column-reverse 5600} 5601.cmsb207-items-center { 5602align-items: center 5603} 5604.cmsb207-justify-center { 5605justify-content: center 5606} 5607.cmsb207-justify-between { 5608justify-content: space-between 5609} 5610.cmsb207-gap-6 { 5611gap: 1.5rem 5612}
5613.cmsb207-text-center { 5614text-align: center 5615} 5616.cmsb207-text-xs { 5617font-size: 0.75rem; 5618line-height: 1rem 5619} 5620.cmsb207-uppercase { 5621text-transform: uppercase 5622} 5623.cmsb207-text-gray-300 { 5624--tw-text-opacity: 1; 5625color: rgb(209 213 219 / var(--tw-text-opacity)) 5626} 5627.cmsb207-hover\:text-white:hover { 5628--tw-text-opacity: 1; 5629color: rgb(255 255 255 / var(--tw-text-opacity)) 5630} 5631.cmsb207-hover\:underline:hover { 5632text-decoration-line: underline 5633} 5634@media (min-width: 768px) { 5635.cmsb207-md\:justify-start { 5636justify-content: flex-start 5637} 5638} 5639@media (min-width: 1024px) { 5640.cmsb207-lg\:mt-10 { 5641margin-top: 2.5rem 5642} 5643.cmsb207-lg\:w-2\/3 { 5644width: 66.666667% 5645} 5646.cmsb207-lg\:flex-row { 5647flex-direction: row 5648} 5649}</style> 5650<div data-content-type="html" data-appearance="default" data-element="main" data-decoded="true"><div class="cmsb207-flex cmsb207-flex-col-reverse cmsb207-lg:flex-row cmsb207-justify-between cmsb207-items-center cmsb207-mt-0 cmsb207-lg:mt-10"> 5651<ul class="cmsb207-flex cmsb207-flex-col cmsb207-lg:flex-row cmsb207-justify-center cmsb207-md:justify-start cmsb207-gap-6 cmsb207-text-center cmsb207-w-full cmsb207-lg:w-2/3"> 5652<li><a href="https://www.naturelab.it/la-tua-privacy/" title="La tua Privacy" class="cmsb207-hover:underline cmsb207-text-gray-300 cmsb207-hover:text-white cmsb207-uppercase cmsb207-text-xs">La tua Privacy</a></li> 5653<li><a href="https://www.naturelab.it/cookie-policy/" title="Informativa estesa sui Cookies" class="cmsb207-hover:underline cmsb207-text-gray-300 cmsb207-hover:text-white cmsb207-uppercase cmsb207-text-xs">Informativa estesa sui Cookies</a></li> 5654<li><a href="https://www.naturelab.it/cookie-settings/" title="Imposta Cookies" class="cmsb207-hover:underline cmsb207-text-gray-300 cmsb207-hover:text-white cmsb207-uppercase cmsb207-text-xs">Imposta Cookies</a></li> 5655<li><a href="https://www.naturelab.it/html-sitemap/" title="Mappa del sito" class="cmsb207-hover:underline cmsb207-text-gray-300 cmsb207-hover:text-white cmsb207-uppercase cmsb207-text-xs">Mappa del sito</a></li> 5656</ul> 5657 5658<ul class="flex flex-row justify-center lg:justify-end items-center gap-3 my-10 lg:my-0 w-full lg:w-1/3" aria-label="Seguici sui nostri social"> 5659 <li> 5660 <a href="https://www.facebook.com/NatureLab.Srl" rel="noopener" target="_blank" aria-label="Seguici su Facebook" title="Seguici su Facebook"> 5661 <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="#000000" width="800px" height="24" viewbox="0 0 32 32" class="w-8 h-8 fill-gray-400 hover:fill-white" role="img"><path d="M21.95 5.005l-3.306-.004c-3.206 0-5.277 2.124-5.277 5.415v2.495H10.05v4.515h3.317l-.004 9.575h4.641l.004-9.575h3.806l-.003-4.514h-3.803v-2.117c0-1.018.241-1.533 1.566-1.533l2.366-.001.01-4.256z"></path></svg> 5662 </a> 5663 </li> 5664 <li> 5665 <a href="https://www.instagram.com/naturelab_/" rel="noopener" target="_blank" aria-label="Seguici su Instagram" title="Seguici su Instagram"> 5666 <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="#000000" width="800px" height="24" viewbox="0 0 32 32" class="w-8 h-8 fill-gray-400 hover:fill-white" role="img"><path d="M20.445 5h-8.891A6.559 6.559 0 0 0 5 11.554v8.891A6.559 6.559 0 0 0 11.554 27h8.891a6.56 6.56 0 0 0 6.554-6.555v-8.891A6.557 6.557 0 0 0 20.445 5zm4.342 15.445a4.343 4.343 0 0 1-4.342 4.342h-8.891a4.341 4.341 0 0 1-4.341-4.342v-8.891a4.34 4.34 0 0 1 4.341-4.341h8.891a4.342 4.342 0 0 1 4.341 4.341l.001 8.891z"></path><path d="M16 10.312c-3.138 0-5.688 2.551-5.688 5.688s2.551 5.688 5.688 5.688 5.688-2.551 5.688-5.688-2.55-5.688-5.688-5.688zm0 9.163a3.475 3.475 0 1 1-.001-6.95 3.475 3.475 0 0 1 .001 6.95zM21.7 8.991a1.363 1.363 0 1 1-1.364 1.364c0-.752.51-1.364 1.364-1.364z"></path></svg> 5667 </a> 5668 </li> 5669 <li> 5670 <a href="https://www.pinterest.com/naturelab/" rel="noopener" target="_blank" aria-label="Seguici su Pinterest" title="Seguici su Pinterest"> 5671 <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="#000000" width="800px" height="24" viewbox="0 0 32 32" class="w-8 h-8 fill-gray-400 hover:fill-white" role="img"><path d="M16.292 5C10.536 5 7.48 8.866 7.48 13.077c0 1.955 1.039 4.392 2.707 5.168.253.118.387.064.443-.18.047-.185.273-1.089.373-1.511a.402.402 0 0 0-.095-.386c-.55-.667-.988-1.896-.988-3.041 0-2.942 2.228-5.787 6.021-5.787 3.28 0 5.571 2.23 5.571 5.426 0 3.61-1.82 6.108-4.191 6.108-1.309 0-2.291-1.081-1.978-2.413.378-1.584 1.106-3.298 1.106-4.438 0-1.026-.552-1.883-1.685-1.883-1.341 0-2.415 1.385-2.415 3.241 0 1.182.4 1.978.4 1.978s-1.323 5.593-1.563 6.634c-.413 1.765.051 4.625.094 4.876.021.134.172.18.252.066.129-.175 1.725-2.565 2.174-4.292l.828-3.171c.439.829 1.707 1.531 3.061 1.531 4.021 0 6.923-3.703 6.923-8.299C24.52 8.301 20.92 5 16.292 5z"></path></svg> 5672 </a> 5673 </li> 5674</ul> 5675</div> 5676</div> 5677 </div> 5678 </div> 5679 <div class="container text-sm lg:text-xs text-gray-400 my-6 text-center lg:text-start"> 5680<p>Copyright© 2014-2026 <strong>NatureLab Srl</strong> - Tutti i diritti riservati<br>NatureLab® è un marchio registrato: 302018000023751<br>Tel +39 055 7478357 - Mob +39 346 7306919 - <a href="mailto:[email protected]" class="text-white hover:underline">[email protected]</a></p> 5681 <p class="py-1">Sede Legale: Via G. Berchet 1 - 50129 Firenze (Italia)<br>Sede Operativa: c/o MOST' Str. S. Secondo, 15 - 12060 Pocapaglia CN (Italia)<br>P. Iva IT06455550480 - REA FI-629978 - Cap. Soc. ⬠10.200,00 (<span class="italic">interamente versato</span>)</p> 5682 <p class="italic mt-6">à vietata la riproduzione (anche parziale) dei testi, dei loghi e delle immagini dei prodotti che sono di proprietà de
5682i rispettivi marchi o dell'azienda. Le informazioni contenute in questo sito sono fornite a scopo puramente informativo ed educativo. Non intendono sostituire il parere di un professionista medico o di un dietologo qualificato. Ogni individuo è unico, e le soluzioni naturali possono variare in efficacia da persona a persona.</p> 5683 5684</div> 5685 </div> 5686</div> 5687<div x-data="{ showScript: false }" x-intersect="showScript = true"> 5688 <template x-if="showScript"> 5689
5689<script type="text/javascript" async src="https://userlike-cdn-widgets.s3-eu-west-1.amazonaws.com/42165bce03a5db1d53cd3ed989845ed61738bd7aea569cabf0c5ce9a287764f1.js"></script>
5689 5690 </template> 5691</div> 5692<div id="newsletter-modal" x-data="Object.assign({}, hyva.modal(), initNewsletterFormModal())"> 5693 5694 <div x-cloak x-bind="overlay('dialog6ac2bbed30e8a')" 5695 x-spread="overlay('dialog6ac2bbed30e8a')" 5696 class="fixed inset-0 bg-black bg-opacity-50 z-50"> 5697 <div class="fixed flex justify-center items-center text-left z-40 inset-0"> 5698 <div x-ref="dialog6ac2bbed30e8a" role="dialog" aria-modal="true" 5699 aria-labelledby="modal-title" 5700 class="inline-block bg-white shadow-xl max-h-screen overflow-auto overscroll-y-contain relative rounded-xl flex flex-col lg:flex-row mx-8 sm:mx-16 lg:w-1/2 p-6"> 5701 5702 <button type="button" 5703 @click="closeModal()" 5704 aria-label="Chiudi" 5705 class="absolute right-4 top-4 text-gray-400" 5706 > 5707 5708 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="fill-current" width="28" height="28" aria-hidden="true" focusable="false"> 5709 <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path> 5710</svg> 5711 </button> 5712 5713 <div class="w-auto lg:h-auto w-full lg:w-1/2 p-2"> 5714 <svg alt="Iscriviti alla nostra newsletter" id="uuid-d27a452a-42f5-48fd-9992-af10e782c332" xmlns="http://www.w3.org/2000/svg" class="w-full h-full" viewBox="0 0 3384.99 2056.75"><g id="uuid-c5b77499-a8c2-40c6-9948-3befca9eff99"><path d="m2575.17,263.13l-184.71-90.35c-14.73-7.2-11.34-29.1,4.88-31.51L3299.38,6.57c6.06-.9,8.32,7.65,2.61,9.87l-690.84,267.88c-6.43,2.49-10.66,8.68-10.66,15.57v241.03c0,14.25,16.7,21.95,27.54,12.7l152.73-130.33c5.7-4.87,13.95-5.34,20.17-1.15l215.64,145.27c7.86,5.29,18.55,2.99,23.53-5.07L3377.68,16.45c2.78-4.49-2.22-9.75-6.85-7.2l-497.18,274.51c-88.93,49.1-159.26,126.03-200.31,218.95-33.49,75.8-74.31,160.3-102.84,193-313.79,359.64-950.58,152.16-922.27,344.44,47.97,325.82,341.43-166.5-5.01-188.7-415.56-26.63-916.31,797.72-971.91,816.26-55.6,18.53-653.27-436.61-610.29-445.88,42.99-9.27,1069.04-148.27,1124.64-92.67,55.6,55.6,118.58,734.21,74.13,787.68-46.36,55.77-1062.04,185.19-1148.78,111.06C24.25,1953.77-12.92,1454.95,16.38,1324.8" style="fill:none; stroke:#0b4850; stroke-linecap:round; stroke-linejoin:round; stroke-width:13.02px;"/><circle cx="669.91" cy="1597.69" r="145.57" style="fill:#fff; stroke-width:0px;"/><path d="m703.11,1451.34c-95.61-14.18-184.61,51.82-198.79,147.43-4.61,31.05-.78,62.77,11.09,91.84-2.15-25.02,5.66-62.66,50.31-94.69,61.84-44.31,139.14-53.79,173.72-70.14,34.58-16.35,44.8-39.52,44.8-39.52,0,0,10.69,201.73-156.01,262.7-7.18,2.81-14.8,4.3-22.5,4.42-22.62,3.41-70.26-33.44-22.99-92.89,17.04-20.92,38.34-37.98,62.48-50.04,4.94-2.47,13.88-7.41,24.7-12.77,12.01-5.64,23.56-12.19,34.58-19.58,13.87-9.16,27.24-19.05,40.06-29.64,0,0-19.63,13.06-43.12,25.36-11.53,6.19-23.46,11.59-35.71,16.18-11.36,4.62-20.89,8.94-26.06,11.61-9.63,5.21-68.24,32.11-89.85,86.69-14.82,29.64-1.73,54.33.59,57.15,25.34,31.17,56.24,45.42,101.26,52.11,95.61,14.21,184.63-51.78,198.84-147.39,14.21-95.61-51.78-184.63-147.39-198.84Z" style="fill:#8ecede; stroke-width:0px;"/><path d="m785.54,1487.22s-10.27,23.24-44.83,39.52c-34.55,16.28-111.78,25.91-173.62,70.21-44.68,32.01-52.41,69.79-50.36,94.69-36.55-89.48,6.36-191.64,95.84-228.18,57.1-23.32,122.25-14.86,171.51,22.26l1.46,1.51Z" style="fill:#8ecede; stroke-width:0px;"/></g></svg> 5715 </div> 5716 <div class="text-center bg-white lg:text-left lg:grow pt-2 lg:pl-6 lg:pt-0"> 5717 <div id="modal-title" class="text-lg md:text-2xl leading-9 mb-1 lg:mb-2"> 5718 Iscriviti alla nostra newsletter 5719 </div> 5720 <div class="text-gray-600"> 5721 Unisciti a noi e approfitta di contenuti esclusivi e di offerte personalizzate. 5722 </div> 5723 <div class="text-gray-600"> 5724 Massimo un'e-mail a settimana, promesso! 5725 </div> 5726 <form action="https://www.naturelab.it/newsletter/subscriber/new/" 5727 method="post" 5728 class="flex flex-col gap-2 mt-2 lg:gap-4 lg:mt-6 lg:items-end"
5729 @submit.prevent="submitForm()" 5730 id="newsletter-validate-modal" 5731 > 5732 <label class="sr-only" 5733 for="newsletter-subscribe-modal" 5734 aria-label="Indirizzo email" 5735 > 5736 Indirizzo email 5737 </label> 5738 <input x-focus-first 5739 type="email" 5740 name="modal_email" 5741 id="newsletter-subscribe-modal" 5742 required 5743 class="border-gray-300 rounded-md border p-3 w-full 5744 shadow-sm focus:border-natlabLigthBlue focus:ring focus:ring-natlabLigthBlue focus:ring-opacity-50" 5745 placeholder="Inserisci la tua email" 5746 /> 5747 <input name="form_key" type="hidden" value="xzuVQOR9Ekj125Es" /> 5748 <!-- Aggiunta del campo checkbox per la privacy policy --> 5749 <div class="privacy-policy-checkbox w-full flex"> 5750 <input type="checkbox" id="privacy-policy-modal" name="privacy_policy" required class="checkbox"> 5751 <label for="privacy-policy-modal" class="text-sm text-gray-600"> 5752 Ho letto e accetto la 5753 <a 5754 href="https://www.naturelab.it/la-tua-privacy/" 5755 title="La tua Privacy" 5756 class="underline hover:text-black" 5757 > 5758 Privacy Policy 5759 </a> 5760 </label> 5761 </div> 5762 <button type="submit" 5763 class="btn btn-primary-blu text-center px-8 mx-auto" 5764 > 5765 Iscriviti 5766 </button> 5767 5768 <template x-if="displayErrorMessage"> 5769 <p class="flex items-center"> 5770 <template x-for="errorMessage in errorMessages"> 5771 <span x-html="errorMessage"></span> 5772 </template> 5773 </p> 5774 </template> 5775 </form> 5776 5777 5778 5779 </div> </div> 5780 </div> 5781 </div> 5782</div> 5783
5784<script> 5785 function initNewsletterFormModal() { 5786 const closedCookieName = 'newsletter-modal-closed'; 5787 5788 /** 5789 * Add closedCookieName to list of first-party cookies 5790 * otherwise it would keep reappearing while cookie consent is missing 5791 */ 5792 window.cookie_consent_config['necessary'] = [].concat( 5793 window.cookie_consent_config['necessary'] || [], 5794 [closedCookieName] 5795 ); 5796 5797 return { 5798 closedCookieName: closedCookieName, 5799 errors: 0, 5800 hasCaptchaToken: 0, 5801 displayErrorMessage: false, 5802 errorMessages: [], 5803 init() { 5804 /** 5805 * Customize when this modal should appear here 5806 */ 5807 this.shouldShowModal() && setTimeout(() => { 5808 this.show('dialog6ac2bbed30e8a'); 5809 }, 120000); 5810 }, 5811 closeModal() { 5812 this.hide(); 5813 this.setCloseCookie(); 5814 }, 5815 setErrorMessages(messages) { 5816 this.errorMessages = [messages] 5817 this.displayErrorMessage = this.errorMessages.length 5818 }, 5819 submitForm() { 5820 const $form = document.querySelector('#newsletter-validate-modal'); 5821 5822 if (this.errors === 0) { 5823 this.setCloseCookie(); 5824 $form.submit(); 5825 } 5826 }, 5827 setCloseCookie() { 5828 hyva.setCookie(this.closedCookieName, true, 365); 5829 }, 5830 shouldShowModal() { 5831 return !hyva.getCookie(this.closedCookieName); 5832 } 5833 } 5834 } 5835</script>
5835 5836</div></footer>
5836<script> 5837 'use strict'; 5838 5839 (function() { 5840 const allGroups = ['0']; 5841 5842 const resolveAllowEvent = { 5843 getAllowedGroups: () => allGroups 5844 } 5845 5846 const resolveAcceptEvent = { 5847 getAllowedGroups: () => hyva.amStorage.getStorage('AmastyCookieGroups').getCheckedGroupIds() ?? [] 5848 } 5849 5850 function updateConsent () { 5851 if (!window.amConsentManager) { 5852 return; 5853 } 5854 5855 window.amConsentManager.updateConsent( 5856 window.amConsentManager.getConsentTypeStateByGroupIds(this.getAllowedGroups()) 5857 ); 5858 } 5859 5860 window.addEventListener('cookiebar-action-accept-finish', updateConsent.bind(resolveAcceptEvent)); 5861 window.addEventListener('cookiebar-action-allow-finish', updateConsent.bind(resolveAllowEvent)); 5862 })() 5863</script>
vendor: 1 bytes, line 5863
5863
5864<script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/www.naturelab.it\/","name":"Home"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/www.naturelab.it\/contact\/","name":"Come possiamo aiutarti?"}}]}</script>
5864<div data-mage-init='{"Swissup_Firecheckout/js/prefetch": {}}'></div>
5865<script> 5866 (() => { 5867 function src_default(Alpine) { 5868 Alpine.directive("intersect", (el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 5869 let evaluate = evaluateLater(expression); 5870 let options = { 5871 rootMargin: getRootMargin(modifiers), 5872 threshold: getThreshhold(modifiers) 5873 }; 5874 let observer = new IntersectionObserver((entries) => { 5875 entries.forEach((entry) => { 5876 if (entry.isIntersecting === (value === "leave")) 5877 return; 5878 evaluate(); 5879 modifiers.includes("once") && observer.disconnect(); 5880 }); 5881 }, options); 5882 observer.observe(el); 5883 cleanup(() => { 5884 observer.disconnect(); 5885 }); 5886 }); 5887 } 5888 function getThreshhold(modifiers) { 5889 if (modifiers.includes("full")) 5890 return 0.99; 5891 if (modifiers.includes("half")) 5892 return 0.5; 5893 if (!modifiers.includes("threshold")) 5894 return 0; 5895 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 5896 if (threshold === "100") 5897 return 1; 5898 if (threshold === "0") 5899 return 0; 5900 return Number(`.${threshold}`); 5901 } 5902 function getLengthValue(rawValue) { 5903 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 5904 return match ? match[1] + (match[2] || "px") : void 0; 5905 } 5906 function getRootMargin(modifiers) { 5907 const key = "margin"; 5908 const fallback = "0px 0px 0px 0px"; 5909 const index = modifiers.indexOf(key); 5910 if (index === -1) 5911 return fallback; 5912 let values = []; 5913 for (let i = 1; i < 5; i++) { 5914 values.push(getLengthValue(modifiers[index + i] || "")); 5915 } 5916 values = values.filter((v) => v !== void 0); 5917 return values.length ? values.join(" ").trim() : fallback; 5918 } 5919 5920 document.addEventListener("alpine:init", () => { 5921 window.Alpine.plugin(src_default); 5922 }); 5923 })(); 5924</script>
vendor: 1 bytes, line 5924
5924
5925<script> 5926 for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]":"intersect",".product-info [x-data]":"intersect","#filters-content [x-data]":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]":"intersect","#notice-cookie-block":"intersect"})) { 5927 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 5928 } 5929</script>
vendor: 1 bytes, line 5929
5929
5930<script> 5931 (function () { 5932 "use strict"; 5933 5934 const hasAlpine = new Promise(resolve => { 5935 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 5936 }); 5937 5938 const hasInteract = new Promise(resolve => { 5939 (events => { 5940 const onInteract = () => { 5941 resolve(); 5942 events.forEach(type => window.removeEventListener(type, onInteract)); 5943 } 5944 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 5945 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 5946 }); 5947 5948 const onIntersect = (el) => { 5949 return new Promise(resolve => { 5950 const observer = new IntersectionObserver(entries => { 5951 for (const entry of entries) { 5952 if (entry.isIntersecting) { 5953 observer.disconnect() 5954 resolve(); 5955 } 5956 } 5957 }, {}); 5958 observer.observe(el); 5959 }); 5960 } 5961 5962 function runComponent(el) { 5963 hasAlpine.then(() => { 5964 el.removeAttribute('x-ignore'); 5965 queueMicrotask(() => Alpine.initTree(el)); 5966 }); 5967 } 5968 5969 function initDeferredComponents() { 5970 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 5971 el.setAttribute('x-ignore', ''); 5972 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 5973 switch (deferUntil) { 5974 case 'interact': 5975 hasInteract.then(() => runComponent(el)); 5976 break; 5977 case 'intersect': 5978 onIntersect(el).then(() => runComponent(el)) 5979 break; 5980 case 'idle': 5981 window.requestIdleCallback 5982 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 5983 : setTimeout(() => runComponent(el), 4000); 5984 break; 5985 case 'eager': 5986 runComponent(el); 5987 break; 5988 default: 5989 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 5990 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 5991 } 5992 } 5993 }); 5994 } 5995 5996 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 5997 })() 5998</script>
5998 5999
6000<script> 6001 function createAjaxLoader() { 6002 const loader = document.createElement('div'); 6003 loader.className = 'absolute inset-0 flex justify-center items-center loader'; 6004 loader.innerHTML = `<svg height="24" width="24" viewBox="0 0 24 24" stroke="currentColor" fill="none" stroke-width="2" stroke-linecap="round" class="w-full h-full p-2" role="img"> 6005 <circle style="opacity: .3;" cx="12" cy="12" r="10"/> 6006 <path fill="none" stroke-width="2" d="M12,2 a10,10 0 0,1 10,10"/> 6007</svg>`; 6008 return loader; 6009 } 6010 6011 function addAjaxLoader(button, loader) { 6012 button.setAttribute('data-label', button.getAttribute('aria-label')); 6013 button.removeAttribute('aria-label'); 6014 button.prepend(loader); 6015 button.classList.add('relative', '[&>:not(.loader)]:invisible'); 6016 button.disabled = true; 6017 } 6018 6019 function removeAjaxLoader(button, loader) { 6020 button.setAttribute('aria-label', button.getAttribute('data-label')); 6021 button.removeAttribute('data-label'); 6022 loader.remove(); 6023 button.classList.remove('[&>:not(.loader)]:invisible'); 6024 button.disabled = false; 6025 } 6026 6027 async function addAjaxCartForm(form, extraDelay = 500) { 6028 if (!form) return; 6029 event.preventDefault(); 6030 6031 if (!form.reportValidity()) { 6032 return form.submit(); 6033 } 6034 6035 const formData = new FormData(form); 6036 const button = form.querySelector('button:not([type=button], [type=reset])') 6037 ? form.querySelector('button:not([type=button], [type=reset])') 6038 : document.getElementById('product-addtocart-button'); 6039 const loader = createAjaxLoader(button); 6040 const formUenc = hyva.getUenc(); 6041 const postUrl = event.target.action.replace('%25uenc%25', formUenc); 6042 6043 let bodyUrl = new URLSearchParams(formData); 6044 bodyUrl.append("uenc", formUenc); 6045 addAjaxLoader(button, loader); 6046 6047 try { 6048 const response = await fetch(postUrl, { 6049 method: 'POST', 6050 body: bodyUrl.toString(), 6051 mode: "cors", 6052 credentials: "include", 6053 headers: { 6054 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 6055 'X-Requested-With': 'XMLHttpRequest' 6056 } 6057 }); 6058 6059 if (!response.ok) { 6060 return form.submit(); 6061 } 6062 6063 if (response.redirected) { 6064 return window.location.href = response.url; 6065 } 6066 6067 const responseData = await response.json(); 6068 if (responseData.backUrl) { 6069 return window.location.href = data.backUrl; 6070 } 6071 6072 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 6073 6074 const productFormData = { 6075 productId: formData.get("product"), 6076 options: {} 6077 } 6078 6079 for (const formEntry of formData.entries()) { 6080 if (!formEntry[0].startsWith('super_attribute')) continue; 6081 const formEntryOption = { [formEntry[0].match(/\[(\d+)\]/)[1]]: formEntry[1] }; 6082 productFormData.options = { ...productFormData.options, ...formEntryOption }; 6083 } 6084 6085 window.dispatchEvent(new CustomEvent('open-ajax-cart', { detail: productFormData })); 6086 } catch (err) { 6087 console.warn(err); 6088 window.dispatchEvent(new CustomEvent('product-addtocart-error')); 6089 6090 if (typeof window.dispatchMessages === "undefined") return; 6091 window.dispatchMessages([{ 6092 text:'Problema per aggiungere Il prodotto al tuo carrello: contattaci.', 6093 type: 'error' 6094 }], 5000); 6095 } finally { 6096 setTimeout(() => removeAjaxLoader(button, loader), extraDelay); 6097 } 6098 } 6099 6100 function removeAjaxCartForm(form) { 6101 removeEventListener('submit', form); 6102 } 6103 6104 document.addEventListener('submit', function(event) { 6105 if (!event.target.matches('#product_addtocart_form, .product_addtocart_form')) return; 6106 addAjaxCartForm(event.target, 100); 6107 }); 6108</script>
6108 6109 6110 6111 <dialog 6112 class="w-[640px] rounded-xl bg-white text-slate-800 p-0 shadow-xl backdrop:bg-black/75 backdrop:backdrop-blur-sm" 6113 x-data="initAjaxCartModal" 6114 x-show="open" 6115 x-transition.duration.500ms 6116 @keydown.window.escape="closeDialog()" 6117 @click="!onDialogBackdropClickHelper(event) && closeDialog()" 6118 @open-ajax-cart.window="setNewCartData(event)" 6119 > 6120 <template x-if="open && cartItem"> 6121 <div> 6122 <div class="flex gap-6 justify-between items-center p-6"> 6123 <span class="text-base text-natlabGreenOpac uppercase font-medium tracking-wider"> 6124 Il prodotto è stato aggiunto al tuo carrello 6125 </span> 6126 <button 6127 title="Chiudi la visualizzazione a schermo intero" 6128 aria-label="Chiudi la visualizzazione a schermo intero" 6129 @click="closeDialog()" 6130 class="text-slate-300 hover:text-slate-500 focus:text-slate-500" 6131 > 6132 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="32" height="32" aria-hidden="true"> 6133 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 6134</svg> 6135 </button> 6136 </div> 6137 <div class="flex gap-3 sm:gap-x-6 items-start p-6"> 6138 <div class="border p-2 rounded shrink-0 max-w-[theme(spacing.20)] sm:max-w-[theme(spacing.32)]"> 6139 <img 6140 loading="lazy" 6141 :src="cartItem.product_image.src" 6142 :width="cartItem.product_image.width" 6143 :height="cartItem.product_image.height" 6144 :alt="hyva.str('Product\u0020\u0022\u00251\u0022', cartItem.product_name)" 6145 > 6146 </div> 6147 <div class="grow flex gap-2 flex-col sm:flex-row"> 6148 <div class="grow"> 6149 <p class="text-lg"> 6150 <strong x-html="cartItem.product_name"></strong> 6151 </p> 6152 </div> 6153 <div class="leading-7 shrink-0 [&_.price]:font-normal" x-html="cartItem.product_price"></div> 6154 </div> 6155 </div> 6156 <div class="flex gap-2 justify-between items-end p-6 pt-0 text-slate-600"> 6157 <span> 6158 <span class="font-bold">Totale carrello</span> 6159 <span x-text="getItemCountText()"></span> 6160 </span> 6161 <span x-html="cart.subtotal"></span> 6162 </div> 6163 <div class="flex flex-col sm:flex-row lg:justify-end gap-4 p-6 pt-0 bg-white"> 6164 <button 6165 @click="closeDialog()" 6166 class="sm:w-1/2 lg:w-auto btn justify-center rounded-md py-3 px-6 text-base shadow-none hover:shadow-lg active:shadow disabled:shadow-none transition 6167 bg-white text-natlabBlue hover:text-natlabLigthBlu border border-natlabBlue hover:border-natlabLigthBlue hover:bg-white focus:ring-natlabLigthBlue " 6168 >Continua gli Acquisti</button> 6169 <a 6170 href="https://www.naturelab.it/checkout/index/index/" 6171 @click.prevent.stop="closeDialog(); $dispatch('toggle-authentication', { 6172 url: 'https://www.naturelab.it/checkout/index/index/' 6173 });" 6174 class="sm:w-1/2 lg:w-auto btn btn-primary justify-center uppercase tracking-widest shadow-none hover:shadow-lg active:shadow transition" 6175>Checkout</a> 6176 </div> 6177 </div> 6178 </template> 6179 </dialog> 6180 6181
6181<script> 6182 function initAjaxCartModal() { 6183 return { 6184 open: false, 6185 cart: {}, 6186 initialTotalCartAmount: 0, 6187 totalCartAmount: 0, 6188 cartItem: null, 6189 showSku: false, 6190 init() { 6191 window.addEventListener('private-content-loaded', (event) => { 6192 const cartData = event.detail.data && event.detail.data.cart; 6193 if (!cartData) return; 6194 6195 this.cart = cartData; 6196 this.totalCartAmount = this.cart.summary_count; 6197 this.initialTotalCartAmount = this.cart.summary_count; 6198 }, { once: true }); 6199 6200 this.$watch('totalCartAmount', (value, oldValue) => { 6201 if (this.initialTotalCartAmount === this.totalCartAmount) return; 6202 this.openDialog(); 6203 this.initialTotalCartAmount = this.totalCartAmount; 6204 }) 6205 }, 6206 sortObjectByNumberKey(obj) { 6207 let keys = Object.keys(obj).map(Number).sort((a, b) => a - b); 6208 let sortedObj = {}; 6209 keys.forEach(key => sortedObj[key] = obj[key]); 6210 return sortedObj; 6211 }, 6212 setNewCartData(event) { 6213 const productData = event.detail; 6214 window.addEventListener('private-content-loaded', (event) => { 6215 const cartData = event.detail.data && event.detail.data.cart; 6216 if (!cartData) return; 6217 this.cart = cartData; 6218 this.totalCartAmount = this.cart.summary_count; 6219 6220 if (!productData) return; 6221 this.getCurrentProductFromCart(productData); 6222 }, { once: true }); 6223 }, 6224 getCurrentProductFromCart(productData) { 6225 if (!this.cart.items) return; 6226 this.cartItem = this.cart.items.filter((item) => { 6227 if (item.product_id !== productData.productId) return; 6228 if (item.product_type !== "configurable") { 6229 return item; 6230 } 6231 6232 let cartItemOptions = {}; 6233 for (const option of item.options) { 6234 const filterOptions = { [option.option_id]: option.option_value }; 6235 cartItemOptions = { ...cartItemOptions, ...filterOptions } 6236 } 6237 6238 const cartItemOptionsCompare = JSON.stringify(this.sortObjectByNumberKey(cartItemOptions)); 6239 const productDataOptionsCompare = JSON.stringify(this.sortObjectByNumberKey(productData.options)); 6240 if (cartItemOptionsCompare === productDataOptionsCompare) { 6241 return item; 6242 } 6243 }); 6244 6245 if (this.cartItem > 1) { 6246 this.cartItem = this.cartItem.slice(0, 1); 6247 } 6248 6249 this.cartItem = this.cartItem[0]; 6250 }, 6251 getItemCountText() { 6252 if (this.totalCartAmount > 1) { 6253 return hyva.str('(\u00251\u0020prodotti)', this.totalCartAmount); 6254 } 6255 6256 return hyva.str('1 prodotto', this.totalCartAmount); 6257 }, 6258 openDialog() { 6259 if (!this.cartItem) return; 6260 this.$root.showModal(); 6261 this.open = true; 6262 this.scrollLock(this.open); 6263 }, 6264 closeDialog() { 6265 this.$root.close(); 6266 this.open = false; 6267 this.scrollLock(this.open); 6268 }, 6269 scrollLock(use = true) { 6270 document.body.style.overflow = use ? "hidden" : ""; 6271 }, 6272 onDialogBackdropClickHelper(event, target = this.$root) { 6273 const rect = target.getBoundingClientRect(); 6274 const isInDialog = 6275 rect.top <= event.clientY && 6276 event.clientY <= rect.top + rect.height && 6277 rect.left <= event.clientX && 6278 event.clientX <= rect.left + rect.width; 6279 return isInDialog; 6280 } 6281 } 6282 } 6283 </script>
6283 6284
6285<script type="module" 6286 src="https://www.naturelab.it/static/version1786556693/frontend/Nature/naturelab/it_IT/Hyva_Theme/js/alpine3.min.js" 6287 defer 6288 crossorigin 6289></script>
vendor: 1 bytes, line 6289
6289
6290<script> 6291 'use strict'; 6292 function dispatchMessages(messages, hideAfter) { 6293 const messagesEvent = new CustomEvent("messages-loaded", { 6294 detail: { 6295 messages: messages, 6296 hideAfter: hideAfter 6297 } 6298 }); 6299 window.dispatchEvent(messagesEvent); 6300 } 6301 6302 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 6303 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 6304 } 6305 6306 (function( hyva, undefined ) { 6307 6308 hyva.initFormKey = () => { 6309 const inputSelector = 'input[name="form_key"]', 6310 formKey = hyva.getFormKey(); 6311 6312 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 6313 input.value = formKey 6314 }); 6315 } 6316 6317 hyva.initMessages = () => { 6318 try { 6319 const messages = hyva.getCookie('mage-messages'); 6320 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 6321 6322 dispatchMessages(window.mageMessages); 6323 6324 // empty `mage-messages` cookie 6325 const skipSetDomain = true; 6326 hyva.setCookie('mage-messages','', -1, skipSetDomain); 6327 6328 } catch (error) { 6329 console.warn('Error parsing Cookie Messages:', error); 6330 } 6331 } 6332 6333 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 6334 hyva.alpineInitialized(hyva.initMessages) 6335 6336 }( window.hyva = window.hyva || {} )); 6337</script>
vendor: 1 bytes, line 6337
6337
6338<script> 6339 'use strict'; 6340 { 6341 const private_content_key = 'mage-cache-storage'; 6342 const private_content_expire_key = 'mage-cache-timeout'; 6343 const private_content_version_key = 'private_content_version'; 6344 const section_data_ids_key = 'section_data_ids'; 6345 const mage_cache_session_id_key = 'mage-cache-sessid'; 6346 const last_visited_store_key = 'last_visited_store'; 6347 6348 const ttl = 3600; 6349 6350 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 6351 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 6352 } 6353 6354 function loadSectionData () { 6355 const browserStorage = hyva.getBrowserStorage(); 6356 if (!browserStorage) { 6357 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 6358 [{ 6359 type: "warning", 6360 text: "Abilita LocalStorage nel tuo browser." 6361 }] 6362 ); 6363 return; 6364 } 6365 try { 6366 let isInvalid = false; 6367 6368 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 6369 isInvalid = true; 6370 } 6371 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 6372 6373 if (!hyva.getCookie(mage_cache_session_id_key)) { 6374 isInvalid = true; 6375 browserStorage.removeItem(private_content_key); 6376 const skipSetDomain = true; 6377 const days = false; 6378 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 6379 } 6380 6381 const cookieVersion = hyva.getCookie(private_content_version_key); 6382 const storageVersion = browserStorage.getItem(private_content_version_key); 6383 6384 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 6385 isInvalid = true; 6386 } 6387 6388 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 6389 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 6390 browserStorage.removeItem(private_content_key); 6391 } 6392 6393 if (isInvalid && cookieVersion) { 6394 fetchPrivateContent([]); 6395 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 6396 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 6397 if ( 6398 privateContent && 6399 privateContentExpires && 6400 privateContent.cart && 6401 privateContent.customer 6402 ) { 6403 dispatchPrivateContent(privateContent); 6404 } else { 6405 fetchPrivateContent([]); 6406 } 6407 } else { 6408 if (document.getElementById('default-section-data')) { 6409 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 6410 dispatchPrivateContent(privateContent); 6411 } else { 6412 dispatchPrivateContent({}); 6413 } 6414 } 6415 6416 } catch (error) { 6417 console.warn('Error retrieving Private Content:', error); 6418 } 6419 } 6420 6421 hyva.alpineInitialized(loadSectionData) 6422 window.addEventListener('reload-customer-section-data', loadSectionData); 6423 6424 function dispatchPrivateContent(data) { 6425 const privateContentEvent = new CustomEvent("private-content-loaded", { 6426 detail: { 6427 data: data 6428 } 6429 }); 6430 window.dispatchEvent(privateContentEvent); 6431 } 6432 6433 function fetchPrivateContent(sections) { 6434 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 6435 method: 'GET', 6436 headers: { 6437 'Content-Type': 'application/json', 6438 'X-Requested-With': 'XMLHttpRequest' 6439 } 6440 }) 6441 .then(response => response.json()) 6442 .then( 6443 data => { 6444 if (data) { 6445 try { 6446 const browserStorage = hyva.getBrowserStorage(); 6447 6448 // merge new data preserving non-invalidated sections 6449 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 6450 6451 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 6452 delete oldSectionData['checkout-data']; 6453 } 6454 const newSectionData = Object.assign(oldSectionData, data); 6455 6456 dispatchPrivateContent(newSectionData); 6457 6458 // don't persist messages, they've been dispatched already 6459 if (newSectionData.messages && newSectionData.messages.messages ) { 6460 newSectionData.messages.messages = []; 6461 } 6462 6463 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 6464 6465 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 6466 browserStorage.setItem(private_content_expire_key, expiresAt); 6467 6468 const newCookieVersion = hyva.getCookie(private_content_version_key); 6469 browserStorage.setItem(private_content_version_key, newCookieVersion); 6470 6471 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 6472 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 6473 hyva.setCookie( 6474 section_data_ids_key, 6475 JSON.stringify( 6476 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 6477 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 6478 return sectionDataIds; 6479 }, {}) 6480 ), 6481 false, 6482 true 6483 ); 6484 } catch (error) { 6485 console.warn("Couldn't store privateContent", error); 6486 } 6487 } 6488 } 6489 ); 6490 } 6491 } 6492</script>
vendor: 1 bytes, line 6492
6492
6493<script> 6494 (() => { 6495 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 6496 })() 6497</script>
vendor: 1 bytes, line 6497
6497
6498<script> 6499 (events => { 6500 const dispatchUserInteractionEvent = () => { 6501 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 6502 window.dispatchEvent(new Event('init-external-scripts')) 6503 }; 6504 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 6505 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 6506</script>
vendor: 1 bytes, line 6506
6506
6507<script> 6508 function initConfigurableOptions(productId, optionConfig) { 6509 6510 function findPathParam(key) { 6511 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 6512 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 6513 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 6514 for (let i = 0; i < pathParts.length; i += 2) { 6515 if (pathParts[i] === key && pathParts.length > i) { 6516 return pathParts[i + 1]; 6517 } 6518 } 6519 } 6520 6521 return { 6522 optionConfig, 6523 productId, 6524 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 6525 allowedAttributeOptions: [], 6526 selectedValues: [], 6527 init() { 6528 this.findAllowedAttributeOptions(); 6529 this.$nextTick(() => { 6530 if (typeof this.optionConfig.defaultValues === 'object') { 6531 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 6532 this.changeOption(attributeId, value + ''); 6533 } 6534 } 6535 }); 6536 }, 6537 findSimpleIndex() { 6538 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 6539 }, 6540 calculateSimpleIndexForPartialSelection(selectedValues) { 6541 if (selectedValues.length === 0) return 0; 6542 let productIndexIds = Object.keys(this.optionConfig.index); 6543 Object.keys(this.optionConfig.attributes).forEach((attribute) => { 6544 const productsWithAttributeMatch = selectedValues[attribute] 6545 ? productIndexIds.filter((productIndex) => { 6546 return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute] 6547 }) 6548 : []; 6549 6550 productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds 6551 }) 6552 return productIndexIds[0]; 6553 }, 6554 calculateSimpleIndexForFullSelection(selectedValues) { 6555 const productIndexes = this.optionConfig.index; 6556 return Object.keys(productIndexes).find(productIndex => { 6557 const productCandidateOptions = productIndexes[productIndex]; 6558 6559 for (const productOption in productCandidateOptions) { 6560 if ( 6561 ! selectedValues[productOption] || 6562 selectedValues[productOption] !== productCandidateOptions[productOption] 6563 ) { 6564 return false; 6565 } 6566 } 6567 return productIndex; 6568 }); 6569 }, 6570 productIndex: 0, 6571 findAllowedAttributeOptions() { 6572 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 6573 }, 6574 calculateAllowedAttributeOptions(selectedValues) { 6575 const allAttributes = this.optionConfig.attributes; 6576 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 6577 return a.position - b.position 6578 }); 6579 6580 const newAllowedAttributeOptions = []; 6581 6582 allAttributesSorted.forEach(attribute => { 6583 const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); 6584 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 6585 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 6586 return !!option.products.find(product => { 6587 return availableIndexes.includes(product); 6588 }) 6589 }); 6590 }); 6591 return newAllowedAttributeOptions; 6592 }, 6593 calculateAvailableProductIndexes(selectedOptions) { 6594 if (Object.keys(selectedOptions).length === 0) { 6595 if (Object.values(this.optionConfig.salable || {}).length) { 6596 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 6597 } 6598 return Object.keys(this.optionConfig.index); 6599 } 6600 6601 const selectedIds = Object.keys(selectedOptions); 6602 if (Object.values(this.optionConfig.salable || {}).length) { 6603 const selectedOptionIndexes = selectedIds.map(attrId => { 6604 const optionValue = selectedOptions[attrId]; 6605 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 6606 }) 6607 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 6608 return acc.filter(index => optionIndexes.includes(index)); 6609 }); 6610 } else { 6611 const productIndexes = this.optionConfig.index; 6612 return Object.keys(productIndexes).filter(index => { 6613 for (const attrId of selectedIds) { 6614 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 6615 } 6616 return true 6617 }); 6618 } 6619 }, 6620 findAttributeByOptionId(optionId) { 6621 for (const attributeId in this.optionConfig.attributes) { 6622 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 6623 if (attributeOptions.find(option => option.id === optionId)) { 6624 return attributeId; 6625 } 6626 } 6627 }, 6628 getAllowedAttributeOptions(attributeId) { 6629 return this.allowedAttributeOptions[attributeId] || [] 6630 }, 6631 getProductIdsForOption(option) { 6632 const attributeId = this.findAttributeByOptionId(option.id); 6633 const allOptions = this.optionConfig.attributes[attributeId]; 6634 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 6635 return opt && opt.products 6636 ? opt.products 6637 : []; 6638 }, 6639 findProductIdsForPartialSelection(optionSelection) { 6640 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 6641 const newCandidates = this.getProductIdsForOption({id: optionId}); 6642 return candidates === null 6643 ? newCandidates 6644 : candidates.filter(productId => newCandidates.includes(productId)); 6645 }, null); 6646 return candidateProducts || []; 6647 },
6648 findCheapestProductForPartialSelection(optionSelection) { 6649 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 6650 return candidateProducts.reduce((cheapest, simpleIdx) => { 6651 // in the first iteration we start with simpleIdx as the currently cheapest product 6652 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 6653 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 6654 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 6655 ? simpleIdx 6656 : cheapest; 6657 }, 0) 6658 }, 6659 findProductIdToUseForOptionPrice(option) { 6660 // try to find a product for a complete selection 6661 const attributeId = this.findAttributeByOptionId(option.id); 6662 const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); 6663 const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); 6664 // if there is no complete selection, use the cheapest product for the option 6665 return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); 6666 }, 6667 getAttributeOptionLabel(option) { 6668 const optionProduct = this.findProductIdToUseForOptionPrice(option); 6669 if ((! optionProduct) || (optionProduct === this.productIndex)) { 6670 return option.label; 6671 } 6672 6673 const currentPrice = this.getOptionPriceAdjustmentBasePrice(); 6674 6675 if (this.optionConfig.optionPrices[optionProduct]) { 6676 const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; 6677 if (optionPrice !== currentPrice){ 6678 return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); 6679 } 6680 } 6681 return option.label; 6682 }, 6683 getOptionPriceAdjustmentBasePrice() { 6684 if (this.optionConfig.optionPrices[this.productIndex]) { 6685 return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount 6686 } 6687 const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues); 6688 return this.optionConfig.optionPrices[cheapestForSelection] 6689 ? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount 6690 : this.optionConfig.prices.finalPrice.amount; // default price if no option selection 6691 }, 6692 clearOptionIfActive(optionId, value) { 6693 if (this.selectedValues[optionId] === value) { 6694 this.blurLabel() 6695 this.changeOption(optionId, '') 6696 } 6697 }, 6698 removeAttrFromSelection(selectedValues, attributeId) { 6699 attributeId = parseInt(attributeId); 6700 return selectedValues.reduce((newSelection, val, attr) => { 6701 if (attr !== attributeId) { 6702 newSelection[attr] = val; 6703 } 6704 return newSelection; 6705 }, []); 6706 }, 6707 changeOption(attributeId, value) { 6708 if (value === '') { 6709 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 6710 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 6711 this.selectedValues[attributeId] = value; 6712 } 6713 this.findSimpleIndex(); 6714 this.findAllowedAttributeOptions(); 6715 this.updatePrices(); 6716 this.updateGallery(); 6717 window.dispatchEvent( 6718 new CustomEvent( 6719 'configurable-selection-changed', 6720 { 6721 detail: { 6722 productId: this.productId, 6723 optionId: attributeId, 6724 value: value, 6725 productIndex: this.productIndex, 6726 selectedValues: this.selectedValues, 6727 candidates: this.findProductIdsForPartialSelection(this.selectedValues), 6728 } 6729 } 6730 ) 6731 ); 6732 }, 6733 calculateIsMinimalPrice() { 6734 return ( 6735 this.selectedValues.filter(value => !!value).length < 6736 Object.keys(this.optionConfig.attributes).length 6737 ); 6738 }, 6739 updatePrices() { 6740 const value = this.productIndex ? 6741 this.optionConfig.optionPrices[this.productIndex] : 6742 this.optionConfig.prices; 6743 window.dispatchEvent( 6744 new CustomEvent( 6745 "update-prices-" + this.productId, 6746 { 6747 detail: Object.assign( 6748 value, 6749 { isMinimalPrice: this.calculateIsMinimalPrice() } 6750 ) 6751 } 6752 ) 6753 ); 6754 }, 6755 updateGallery () { 6756 if (this.productIndex) { 6757 const images = this.optionConfig.images[this.productIndex]; 6758 images && window.dispatchEvent(new CustomEvent( 6759 "update-gallery", 6760 { detail: this.sortImagesByPosition(images) } 6761 )); 6762 } else { 6763 window.dispatchEvent(new Event("reset-gallery")); 6764 } 6765 }, 6766 sortImagesByPosition(images) { 6767 return images.sort((x, y) => { 6768 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 6769 }); 6770 }, 6771 onGetCartData(data) { 6772 }, 6773 preselectCartItems(data) { 6774 // pre-select options based on cart data for current (quote) itemId 6775 const cart = data && data.cart; 6776 if (cart && cart.items) { 6777 const cartItem = cart.items.find((item) => { 6778 return ( 6779 item.item_id === this.itemId 6780 && item.product_id === this.productId 6781 ) 6782 }); 6783 if (cartItem && cartItem.options && cartItem.options.length) { 6784 cartItem.options.map(option => { 6785 this.changeOption(option.option_id, option.option_value); 6786 }) 6787 } 6788 } 6789 }, 6790 preselectQuerystringItems() { 6791 // pre-select option like ?size=167 6792 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 6793 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 6794 }, 6795 preselectLocationHashItems() { 6796 // pre-select option like #144=167 6797 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 6798 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 6799 }, 6800 preselectItemsBasedOnLocation(getLocationValue) { 6801 Object.values(this.optionConfig.attributes).map(attribute => { 6802 this.changeOption(attribute.id, getLocationValue(attribute)) 6803 }); 6804 } 6805 } 6806 } 6807 6808</script>
vendor: 1 bytes, line 6808
6808
6809<script> 6810 function initSwatchOptions(swatchConfig) { 6811 return { 6812 swatchConfig, 6813 getAttributeSwatchData(attributeId) { 6814 const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); 6815 swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); 6816 6817 return swatchConfig; 6818 }, 6819 getAllAttributeOptions(attributeId) { 6820 return ( 6821 this.optionConfig.attributes[attributeId] && 6822 this.optionConfig.attributes[attributeId].options 6823 ) || [] 6824 }, 6825 optionIsActive(attributeId, optionId) { 6826 // return true if a product with this option is in stock 6827 return !!this.getAllowedAttributeOptions(attributeId).find( 6828 option => option.id === optionId 6829 ) 6830 }, 6831 optionIsEnabled(attributeId, optionId) { 6832 // return true if a product with this option is enabled 6833 for (const productId in this.optionConfig.index) { 6834 if (this.optionConfig.index[productId][attributeId] === optionId) { 6835 return true; 6836 } 6837 } 6838 return false; 6839 }, 6840 mapSwatchTypeNumberToTypeCode(typeNumber) { 6841 switch ("" + typeNumber) { 6842 case "1": 6843 return "color" 6844 case "2": 6845 return "image" 6846 case "3": 6847 return "empty" 6848 case "0": 6849 default: 6850 return "text" 6851 } 6852 }, 6853 getTypeOfFirstOption(attributeId) { 6854 for (const optionId in this.swatchConfig[attributeId]) { 6855 const option = this.swatchConfig[attributeId][optionId]; 6856 if (typeof option.type !== 'undefined') { 6857 return this.mapSwatchTypeNumberToTypeCode(option.type); 6858 } 6859 } 6860 }, 6861 getVisualSwatchType(attributeId, targetOptionId) { 6862 // If a type configuration is present for the given option id, use it 6863 const config = this.swatchConfig[attributeId]; 6864 if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { 6865 return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); 6866 } 6867 6868 // Otherwise - if no config is present for the target option - use the type of the first option 6869 // with a type property from the attribute, thus assuming its the same type as the target option. 6870 // (This edge case condition can occur on single swatch products if some options are not salable) 6871 return this.getTypeOfFirstOption(attributeId); 6872 }, 6873 getSwatchType(attributeId, optionId) { 6874 // Deserialize the attribute details the first time they are used 6875 if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { 6876 this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); 6877 } 6878 const type = this.swatchConfig[attributeId] && 6879 this.swatchConfig[attributeId].details && 6880 this.swatchConfig[attributeId].details.swatch_input_type || 6881 "empty"; 6882 return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; 6883 }, 6884 isTextSwatch(attributeId, optionId) { 6885 return this.getSwatchType(attributeId, optionId) === 'text'; 6886 }, 6887 isVisualSwatch(attributeId, optionId) { 6888 const type = this.getSwatchType(attributeId, optionId); 6889 6890 return ['image', 'color'].includes(type); 6891 }, 6892 getSwatchBackgroundStyle(attributeId, optionId) {
6893 const config = this.getSwatchConfig(attributeId, optionId); 6894 const type = this.getSwatchType(attributeId, optionId); 6895 6896 if (type === "color") { 6897 return 'background-color:' + config.value; 6898 } else if (type === "image") { 6899 return "background: #ffffff url('" + config.value + "') no-repeat center"; 6900 } else { 6901 return ''; 6902 } 6903 }, 6904 getSwatchText(attributeId, optionId) { 6905 const config = this.getSwatchConfig(attributeId, optionId); 6906 return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); 6907 }, 6908 getOptionLabelFromOptionConfig(attributeId, optionId) { 6909 // Fallback if no value is present in swatchConfig data 6910 // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 6911 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); 6912 return option && option[0] && option[0].label ||''; 6913 }, 6914 getSwatchConfig(attributeId, optionId) { 6915 return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] 6916 ? this.swatchConfig[attributeId][optionId] 6917 : false; 6918 }, 6919 activeTooltipItem: false, 6920 tooltipPositionElement: false, 6921 isTooltipVisible() { 6922 return this.activeTooltipItem &&
6923 this.getSwatchConfig( 6924 this.activeTooltipItem.attribute, 6925 this.activeTooltipItem.item 6926 ); 6927 }, 6928 isFirstItemCol() { 6929 return this.activeTooltipItem.index === 0; 6930 }, 6931 getTooltipImageStyle(attributeId, optionId) { 6932 const config = this.getSwatchConfig(attributeId, optionId); 6933 const type = this.getSwatchType(attributeId, optionId); 6934 6935 if (type === "color") { 6936 return 'background-color:' + config.value + '; width: 110px; height: 90px;'; 6937 } else if (type === "image") { 6938 return "background: #ffffff url('" + config.thumb + 6939 "') center center no-repeat; width: 110px; height: 90px;"; 6940 } else { 6941 return 'display:none'; 6942 } 6943 }, 6944 getTooltipPosition() { 6945 return this.tooltipPositionElement ? 6946 `top: ${this.tooltipPositionElement.offsetTop}px;` + 6947 `left: ${ 6948 this.tooltipPositionElement.offsetLeft - ( 6949 this.tooltipPositionElement.closest('.snap') && 6950 this.tooltipPositionElement.closest('.snap').scrollLeft || 6951 0 6952 ) 6953 }px;` : '' 6954 }, 6955 getTooltipLabel() { 6956 return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label 6957 }, 6958 focusedLabel: false, 6959 focusLabel(optionId) { 6960 this.focusedLabel = optionId; 6961 }, 6962 blurLabel() { 6963 this.focusedLabel = false; 6964 }, 6965 showSwatches: false, 6966 initShowSwatchesIntersect() { 6967 if ('IntersectionObserver' in window && !window.scrollY) { 6968 let io = new IntersectionObserver( 6969 entries => { 6970 entries.map(entry => { 6971 if (entry.isIntersecting) { 6972 this.showSwatches = true; 6973 io.unobserve(this.$root); 6974 } 6975 }) 6976 } 6977 ); 6978 io.observe(this.$root); 6979 } else { 6980 this.showSwatches = true 6981 } 6982 } 6983 } 6984 } 6985</script>
vendor: 1 bytes, line 6985
6985
6986<script> 6987 'use strict'; 6988 6989 (() => { 6990 const equalizeButtonWidths = (buttons) => { 6991 const buttonList = buttons.querySelectorAll('[data-element="link"], [data-element="empty_link"]'); 6992 let buttonMinWidth = 0; 6993 6994 buttonList.forEach(button => { 6995 const buttonWidth = button.offsetWidth; 6996 6997 if (buttonWidth > buttonMinWidth) { 6998 buttonMinWidth = buttonWidth; 6999 } 7000 }); 7001 7002 buttonList.forEach(button => { 7003 button.style.minWidth = `${buttonMinWidth}px`; 7004 }); 7005 }; 7006 7007 window.addEventListener('DOMContentLoaded', () => { 7008 document.querySelectorAll('[data-content-type="buttons"][data-same-width="true"]').forEach(buttons => { 7009 equalizeButtonWidths(buttons); 7010 }); 7011 }); 7012 })(); 7013</script>
vendor: 1 bytes, line 7013
7013
7014<script> 7015 'use strict'; 7016 7017 (() => { 7018 const initCarousels = (elements) => { 7019 if (!Glider) { 7020 return; 7021 } 7022 7023 const initProductCarousel = (carousel) => { 7024 const gliderElement = carousel.querySelector('[data-role="glider-content"]'); 7025 7026 if (!gliderElement) { 7027 return; 7028 } 7029 7030 const gliderDots = carousel.querySelector('.glider-dots'); 7031 const gliderPrev = carousel.querySelector('.glider-prev'); 7032 const gliderNext = carousel.querySelector('.glider-next'); 7033 7034 const glider = new Glider(gliderElement, { 7035 slidesToShow: 2, 7036 slidesToScroll: 2, 7037 scrollLock: true, 7038 draggable: true, 7039 dragVelocity: 2.5, 7040 dots: gliderDots, 7041 arrows: { 7042 prev: gliderPrev, 7043 next: gliderNext, 7044 }, 7045 responsive: [ 7046 { 7047 breakpoint: 768, 7048 settings: { 7049 slidesToShow: 3, 7050 slidesToScroll: 3, 7051 } 7052 }, 7053 { 7054 breakpoint: 1024, 7055 settings: { 7056 slidesToShow: 4, 7057 slidesToScroll: 4, 7058 } 7059 }, 7060 ], 7061 }); 7062 7063 carousel.classList.remove('overflow-x-scroll'); 7064 gliderPrev.classList.remove('hidden'); 7065 gliderNext.classList.remove('hidden'); 7066 7067 if (carousel.dataset.autoplay !== 'false') { 7068 gliderAutoplay( 7069 glider, 7070 carousel.dataset.autoplaySpeed, 7071 carousel.dataset.infiniteLoop 7072 ); 7073 } 7074 }; 7075 7076 const initSliderCarousel = (slider) => { 7077 slider.innerHTML = `<div data-role="glider-content">${slider.innerHTML}</div>`; 7078 slider.classList.add('glider-contain'); 7079 7080 slider.insertAdjacentHTML( 7081 'beforeend', 7082 '\u000A\u003Cdiv\u0020class\u003D\u0022carousel\u002Dnav\u0020flex\u0020items\u002Dcenter\u0020justify\u002Dcenter\u0020flex\u002D1\u0020p\u002D4\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Precedente\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dprev\u0020w\u002D8\u0020h\u002D8\u0020mr\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u003Csvg\u0020xmlns\u003D\u0022http\u003A\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\u0022\u0020fill\u003D\u0022none\u0022\u0020viewBox\u003D\u00220\u00200\u002024\u002024\u0022\u0020stroke\u002Dwidth\u003D\u00222\u0022\u0020stroke\u003D\u0022currentColor\u0022\u0020width\u003D\u002224\u0022\u0020height\u003D\u002224\u0022\u0020role\u
7082003D\u0022img\u0022\u003E\u000A\u0020\u0020\u003Cpath\u0020stroke\u002Dlinecap\u003D\u0022round\u0022\u0020stroke\u002Dlinejoin\u003D\u0022round\u0022\u0020d\u003D\u0022M15\u002019l\u002D7\u002D7\u00207\u002D7\u0022\u002F\u003E\u000A\u003Ctitle\u003Echevron\u002Dleft\u003C\u002Ftitle\u003E\u003C\u002Fsvg\u003E\u000A\u0020\u0020\u0020\u0020\u003C\u002Fbutton\u003E\u000A\u0020\u0020\u0020\u0020\u003Cdiv\u0020role\u003D\u0022tablist\u0022\u0020class\u003D\u0022glider\u002Ddots\u0020select\u002Dnone\u0020flex\u0020flex\u002Dwrap\u0020mx\u002D1\u0020justify\u002Dcenter\u0020p\u002D0\u0020focus\u003Aoutline\u002Dnone\u0022\u003E\u003C\u002Fdiv\u003E\u000A\u0020\u0020\u0020\u0020\u003Cbutton\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020aria\u002Dlabel\u003D\u0022Successivo\u0022\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020class\u003D\u0022glider\u002Dnext\u0020w\u002D8\u0020h\u002D8\u0020ml\u002D1\u0020text\u002Dblack\u0020rounded\u002Dfull\u0020outline\u002Dnone\u0020focus\u003Aoutline\u002Dnone\u0020hidden\u0022\u003E\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u003Csvg\u0020xmlns\u003D\u0022http\u003A\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\u0022\u0020fill\u003D\u0022none\u0022\u0020viewBox\u003D\u00220\u00200\u002024\u002024\u0022\u0020stroke\u002Dwidth\u003D\u00222\u0022\u0020stroke\u003D\u0022currentColor\u0022\u0020width\u003D\u002224\u0022\u0020height\u003D\u002224\u0022\u0020role\u
7082003D\u0022img\u0022\u003E\u000A\u0020\u0020\u003Cpath\u0020stroke\u002Dlinecap\u003D\u0022round\u0022\u0020stroke\u002Dlinejoin\u003D\u0022round\u0022\u0020d\u003D\u0022M9\u00205l7\u00207\u002D7\u00207\u0022\u002F\u003E\u000A\u003Ctitle\u003Echevron\u002Dright\u003C\u002Ftitle\u003E\u003C\u002Fsvg\u003E\u000A\u0020\u0020\u0020\u0020\u003C\u002Fbutton\u003E\u000A\u003C\u002Fdiv\u003E\u000A' 7083 ); 7084 7085 const gliderElement = slider.querySelector('[data-role="glider-content"]'); 7086 const gliderDots = slider.querySelector('.glider-dots'); 7087 const gliderPrev = slider.querySelector('.glider-prev'); 7088 const gliderNext = slider.querySelector('.glider-next'); 7089 7090 const glider = new Glider(gliderElement, { 7091 slidesToShow: 1, 7092 slidesToScroll: 1, 7093 scrollLock: true, 7094 scrollLockDelay: 250, 7095 draggable: true, 7096 dragVelocity: 2.5, 7097 dots: gliderDots, 7098 arrows: { 7099 prev: gliderPrev, 7100 next: gliderNext, 7101 }, 7102 }); 7103 7104 slider.classList.add('glider-initialized'); 7105 if (slider.dataset.showArrows === 'true') { 7106 gliderPrev.classList.remove('hidden'); 7107 gliderNext.classList.remove('hidden'); 7108 } 7109 7110 if (slider.dataset.autoplay !== 'false') { 7111 gliderAutoplay( 7112 glider, 7113 slider.dataset.autoplaySpeed, 7114 slider.dataset.infiniteLoop 7115 ); 7116 } 7117 }; 7118 7119 const gliderAutoplay = (glider, milliseconds, loop) => { 7120 const pagesCount = glider.track.childElementCount; 7121 let slideTimeout = null; 7122 let nextIndex = 1; 7123 let paused = false; 7124 7125 const slide = () => { 7126 slideTimeout = setTimeout( 7127 () => { 7128 if (loop && nextIndex >= pagesCount) { 7129 nextIndex = 0; 7130 } 7131 glider.scrollItem(nextIndex); 7132 }, 7133 parseInt(milliseconds) 7134 ); 7135 }; 7136 7137 glider.ele.addEventListener('glider-animated', () => { 7138 nextIndex = glider.slide + glider.opt.slidesToScroll; 7139 window.clearInterval(slideTimeout); 7140 if (!paused && (loop || nextIndex < pagesCount)) { 7141 slide(); 7142 } 7143 }); 7144 7145 const pause = () => { 7146 if (!paused) { 7147 clearInterval(slideTimeout); 7148 paused = true; 7149 } 7150 }; 7151 7152 const unpause = () => { 7153 if (paused) { 7154 slide(); 7155 paused = false; 7156 } 7157 }; 7158 7159 glider.ele.parentElement.addEventListener('mouseover', pause, {passive: true}); 7160 glider.ele.parentElement.addEventListener('touchstart', pause, {passive: true}); 7161 glider.ele.parentElement.addEventListener('mouseout', unpause, {passive: true}); 7162 glider.ele.parentElement.addEventListener('touchend', unpause, {passive: true}); 7163 7164 slide(); 7165 }; 7166 7167 elements.forEach(element => { 7168 if (element.dataset.contentType === 'products') { 7169 initProductCarousel(element); 7170 } 7171 if (element.dataset.contentType === 'slider') { 7172 initSliderCarousel(element); 7173 } 7174 }); 7175 }; 7176 7177 window.addEventListener('DOMContentLoaded', () => { 7178 const carouselElements = document.querySelectorAll( 7179 `[data-content-type="products"][data-appearance="carousel"], 7180 [data-content-type="slider"]` 7181 ); 7182 7183 if (carouselElements.length > 0) { 7184 const script = document.createElement('script'); 7185 script.type = 'text/javascript'; 7186 7187 script.addEventListener('load', () => { 7188 initCarousels(carouselElements); 7189 }); 7190 7191 script.src = 'https\u003A\u002F\u002Fwww.naturelab.it\u002Fstatic\u002Fversion1786556693\u002Ffrontend\u002FNature\u002Fnaturelab\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Fglider.min.js'; 7192 document.head.appendChild(script); 7193 } 7194 }); 7195 })(); 7196</script>
vendor: 1 bytes, line 7196
7196
7197<script> 7198 'use strict'; 7199 7200 (() => { 7201 const initMaps = (elements) => { 7202 const renderMap = (element) => { 7203 const dataLocations = element.dataset.locations; 7204 7205 // Hide map if no locations set 7206 if (!dataLocations || dataLocations === '[]') { 7207 element.classList.add('hidden'); 7208 return; 7209 } 7210 7211 const map = new google.maps.Map( 7212 element, 7213 getMapOptions( 7214 element.dataset.showControls !== 'true', 7215 element.dataset.showControls === 'true' 7216 ) 7217 ); 7218 const locations = JSON.parse(dataLocations); 7219 const latitudeLongitudeBounds = new google.maps.LatLngBounds(); 7220 const bounds = []; 7221 7222 locations.forEach(location => { 7223 const position = { 7224 lat: parseFloat(location.position.latitude), 7225 lng: parseFloat(location.position.longitude), 7226 }; 7227 bounds.push(position); 7228 7229 const infowindow = new google.maps.InfoWindow({ 7230 content: getInfoWindowContent(location), 7231 }); 7232 const marker = new google.maps.Marker({ 7233 position: position, 7234 map, 7235 title: location.location_name, 7236 }); 7237 7238 marker.addListener('click', () => { 7239 infowindow.open(map, marker); 7240 }); 7241 }); 7242 7243 // Set bounds if multiple locations 7244 if (bounds.length > 1) { 7245 bounds.forEach(function (bound) { 7246 latitudeLongitudeBounds.extend(bound); 7247 }); 7248 map.fitBounds(latitudeLongitudeBounds); 7249 } 7250 7251 // Center if single location 7252 if (bounds.length === 1) { 7253 map.setCenter(bounds[0]); 7254 } 7255 }; 7256 7257 const getMapOptions = (disableDefaultUI, mapTypeControl) => { 7258 const style = ''; 7259 return { 7260 zoom: 8, 7261 scrollwheel: false, 7262 disableDoubleClickZoom: false, 7263 mapTypeControlOptions: { 7264 style: google.maps.MapTypeControlStyle.DEFAULT, 7265 }, 7266 styles: style ? JSON.parse(style) : [], 7267 disableDefaultUI: disableDefaultUI, 7268 mapTypeControl: mapTypeControl, 7269 }; 7270 }; 7271 7272 const getInfoWindowContent = (location) => { 7273 const title = location.location_name ? 7274 `<h3 class="text-2xl font-medium text-gray-900 title-font">${location.location_name}</h3>` : ''; 7275 const comment = location.comment ? `<p class="px-1 pt-3 text-primary">${location.comment}</p>` : ''; 7276 const phone = location.phone ? `<p class="px-1 pt-3 text-primary">Phone: ${location.phone}</p>` : ''; 7277 const street = location.address ? `${location.address}<br/>` : ''; 7278 const city = location.city ? `${location.city}<br/>` : ''; 7279 const state = location.state ? `${location.state}<br/>` : ''; 7280 const zipCode = location.zipcode ? `${location.zipcode}<br/>` : ''; 7281 const country = location.country ? location.country : ''; 7282 7283 return `<div> 7284 ${title} 7285 ${comment} 7286 ${phone} 7287 <p class="px-1 pt-3 text-primary"> 7288 ${street} 7289 ${city} 7290 ${state} 7291 ${zipCode} 7292 ${country} 7293 </p> 7294 </div>`; 7295 }; 7296 7297 const hideAllMaps = () => { 7298 document.querySelectorAll('[data-content-type="map"]').forEach(element => { 7299 element.classList.add('hidden'); 7300 }); 7301 }; 7302 7303 window.gm_authFailure = () => { 7304 hideAllMaps(); 7305 }; 7306 7307 if (typeof google.maps === 'undefined') { 7308 hideAllMaps(); 7309 return; 7310 } 7311
7312 elements.forEach(element => { 7313 if (element.dataset.contentType === 'map') { 7314 renderMap(element); 7315 } 7316 }); 7317 }; 7318 7319 window.addEventListener('DOMContentLoaded', () => { 7320 const mapElements = document.querySelectorAll('[data-content-type="map"]'); 7321 7322 if (mapElements.length > 0) { 7323 const script = document.createElement('script'); 7324 script.type = 'text/javascript'; 7325 7326 script.addEventListener('load', () => { 7327 initMaps(mapElements); 7328 }); 7329 7330 script.src = 'https\u003A\u002F\u002Fmaps.googleapis.com\u002Fmaps\u002Fapi\u002Fjs\u003Fv\u003D3.53\u0026key\u003D'; 7331 document.head.appendChild(script); 7332 } 7333 }); 7334 })(); 7335</script>
vendor: 1 bytes, line 7335
7335
7336<script> 7337 'use strict'; 7338 7339 (() => { 7340 const initParallaxImage = (element) => { 7341 if (!window.jarallax) { 7342 return; 7343 } 7344 7345 element.classList.add('jarallax'); 7346 element.dataset.jarallax = ''; 7347 const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5; 7348 const elementStyle = window.getComputedStyle(element); 7349 7350 window.jarallax(element, { 7351 imgPosition: elementStyle.backgroundPosition || '50% 50%', 7352 imgRepeat: elementStyle.backgroundRepeat || 'no-repeat', 7353 imgSize: elementStyle.backgroundSize || 'cover', 7354 speed: parallaxSpeed, 7355 }); 7356 }; 7357 7358 const initVideoBackground = (element) => { 7359 if (!window.jarallax) { 7360 return; 7361 } 7362 7363 let slider = null; 7364 7365 if (element.classList.contains('pagebuilder-slide-wrapper')) { 7366 const viewportElement = document.createElement('div'); 7367 slider = element.closest('[data-content-type=slider]'); 7368 viewportElement.classList.add('jarallax-viewport-element'); 7369 element.dataset.elementInViewport = '.jarallax-viewport-element'; 7370 element.appendChild(viewportElement); 7371 } 7372 7373 element.classList.add('jarallax'); 7374 element.dataset.jarallax = ''; 7375 const parallaxSpeed = parseFloat(element.dataset.parallaxSpeed) || 0.5; 7376 7377 window.jarallax(element, { 7378 imgSrc: element.dataset.videoFallbackSrc, 7379 speed: parallaxSpeed, 7380 videoLoop: element.dataset.videoLoop, 7381 videoPlayOnlyVisible: element.dataset.videoPlayOnlyVisible, 7382 videoLazyLoading: element.dataset.videoLazyLoad, 7383 disableVideo: false, 7384 elementInViewport: element.dataset.elementInViewport && 7385 element.querySelector(element.dataset.elementInViewport), 7386 }); 7387 7388 if (slider) { 7389 if (slider.dataset.afterChangeIsSet) { 7390 return; 7391 } 7392 7393 slider.addEventListener('glider-loaded', () => { 7394 slider.querySelectorAll('.jarallax').forEach(videoSlide => { 7395 videoSlide.jarallax && videoSlide.jarallax.onScroll(); 7396 }); 7397 }); 7398 7399 slider.addEventListener('glider-animated', () => { 7400 slider.querySelectorAll('.jarallax').forEach(videoSlide => { 7401 videoSlide.jarallax && videoSlide.jarallax.onScroll(); 7402 }); 7403 }); 7404 7405 slider.dataset.afterChangeIsSet = true; 7406 } 7407 }; 7408 7409 window.addEventListener('DOMContentLoaded', () => { 7410 const parallaxImageElements = document.querySelectorAll( 7411 `[data-content-type="row"][data-background-type="image"][data-enable-parallax="1"], 7412 [data-content-type="row"] > [data-background-type="image"][data-enable-parallax="1"]` 7413 ); 7414 7415 const videoBackgroundsElements = document.querySelectorAll( 7416 `[data-content-type="row"][data-background-type="video"][data-enable-parallax="1"], 7417 [data-content-type="row"] > [data-background-type="video"][data-enable-parallax="1"], 7418 [data-content-type="banner"] [data-background-type="video"], 7419 [data-content-type="slide"] [data-background-type="video"]` 7420 ); 7421 7422 if (parallaxImageElements.length > 0 || videoBackgroundsElements.length > 0) { 7423 const jarallaxScript = document.createElement('script'); 7424 jarallaxScript.type = 'text/javascript'; 7425 7426 jarallaxScript.addEventListener('load', () => { 7427 parallaxImageElements.forEach(row => { 7428 initParallaxImage(row); 7429 }); 7430 7431 const jarallaxVideoScript = document.createElement('script'); 7432 jarallaxVideoScript.type = 'text/javascript'; 7433 7434 jarallaxVideoScript.addEventListener('load', () => {
7435 videoBackgroundsElements.forEach(element => { 7436 initVideoBackground(element); 7437 }); 7438 }); 7439 7440 jarallaxVideoScript.src = 'https\u003A\u002F\u002Fwww.naturelab.it\u002Fstatic\u002Fversion1786556693\u002Ffrontend\u002FNature\u002Fnaturelab\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Fjarallax\u002Dvideo.min.js'; 7441 document.head.appendChild(jarallaxVideoScript); 7442 }); 7443 7444 jarallaxScript.src = 'https\u003A\u002F\u002Fwww.naturelab.it\u002Fstatic\u002Fversion1786556693\u002Ffrontend\u002FNature\u002Fnaturelab\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Fjarallax.min.js'; 7445 document.head.appendChild(jarallaxScript); 7446 } 7447 }); 7448 })(); 7449</script>
vendor: 1 bytes, line 7449
7449
7450<script> 7451 'use strict'; 7452 7453 (() => { 7454 const applyShowOnHover = (element) => { 7455 const showOverlayOnHover = (element) => { 7456 const overlay = element.querySelector('.pagebuilder-overlay'); 7457 const color = overlay.dataset.overlayColor; 7458 7459 element.addEventListener('mouseover', () => { 7460 overlay.style.backgroundColor = color; 7461 }); 7462 element.addEventListener('mouseout', () => { 7463 overlay.style.backgroundColor = 'transparent'; 7464 }); 7465 }; 7466 7467 const showButtonOnHover = (element) => { 7468 const button = element.querySelector('.pagebuilder-banner-button'); 7469 7470 element.addEventListener('mouseover', () => { 7471 button.style.opacity = '1'; 7472 button.style.visibility = 'visible'; 7473 }); 7474 element.addEventListener('mouseout', () => { 7475 button.style.opacity = '0'; 7476 button.style.visibility = 'hidden'; 7477 }); 7478 }; 7479 7480 if (element.dataset.showOverlay === 'hover') { 7481 showOverlayOnHover(element); 7482 } 7483 if (element.dataset.showButton === 'hover') { 7484 showButtonOnHover(element); 7485 } 7486 }; 7487 7488 window.addEventListener('DOMContentLoaded', () => { 7489 document.querySelectorAll('[data-content-type="banner"],[data-content-type="slider"]').forEach(element => { 7490 applyShowOnHover(element); 7491 }); 7492 }); 7493 })(); 7494</script>
vendor: 1 bytes, line 7494
7494
7495<script> 7496 'use strict'; 7497 7498 (() => { 7499 document.querySelectorAll('[data-content-type="tab-item"]').forEach(tabItem => { 7500 tabItem.setAttribute('x-show', `tab === '${tabItem.id}'`); 7501 }); 7502 7503 document.querySelectorAll('[data-content-type="tabs"]').forEach(tab => { 7504 const defaultActiveTab = parseInt(tab.dataset.activeTab) || 0; 7505 7506 tab.querySelectorAll('.tab-header').forEach((tabHeader, index) => { 7507 const tabLink = tabHeader.querySelector('a'); 7508 const tabId = tabLink.getAttribute('href').replace('#', ''); 7509 7510 tabHeader.setAttribute(':class', `{ 'active': tab === '${tabId}' }`); 7511 tabLink.setAttribute('x-on:click.prevent', `tab = '${tabId}'`); 7512 7513 if (index === defaultActiveTab) { 7514 tab.setAttribute('x-data', `{ tab: '${tabId}' }`); 7515 } 7516 }); 7517 }); 7518 })(); 7519</script>
vendor: 1 bytes, line 7519
7519
7520<script> 7521 'use strict'; 7522 7523 const grecaptchaV2LoadCallbacks = []; 7524 7525 function executeRecaptchaLoadCallbacks () { 7526 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 7527 const callback = grecaptchaV2LoadCallbacks.pop(); 7528 typeof callback === 'string' ? window[callback]() : callback(); 7529 } 7530 } 7531 7532 (function() { 7533 const loadRecaptchaScript = (event) => { 7534 7535 if (window.grecaptcha || !event.target.form) { 7536 return; 7537 } 7538 7539 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 7540 const siteKey = '6LfEvTcqAAAAAP4jwfTRh8tMSlXxl\u002D8VBqmwaGnN'; 7541 const script = document.createElement('script'); 7542 script.type = 'text/javascript'; 7543 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 7544 script.async = true; 7545 document.head.appendChild(script); 7546 7547 script.addEventListener('load', () => { 7548 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 7549 }); 7550 } 7551 7552 window.forceLoadRecaptchaScript = (form) => { 7553 loadRecaptchaScript({target: {form: form || 'dummy'}}); 7554 executeRecaptchaLoadCallbacks(); 7555 }; 7556 7557 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 7558 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 7559 7560 }()); 7561 7562</script>
vendor: 1 bytes, line 7562
7562
7563<script> 7564 'use strict'; 7565 7566 (function () { 7567 const modals = []; 7568 const excludedFromFocusTrapping = new Set(); 7569 7570 function trapFocusInNextModalWithOverlay() { 7571 for (let idx = modals.length -1; idx >= 0; idx--) { 7572 const nextOnStack = modals[idx]; 7573 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 7574 if (! isOverlayDisabled(nextDialogElement)) { 7575 hyva.trapFocus(nextDialogElement); 7576 break; 7577 } 7578 } 7579 } 7580 7581 function focusables(dialogElement) { 7582 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 7583 return Array.from(dialogElement.querySelectorAll(selector)) 7584 .filter(el => !el.hasAttribute('disabled')); 7585 } 7586 7587 function firstVisible(elements) { 7588 const a = Array.from(elements); 7589 for (let i = 0; i < a.length; i++) { 7590 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 7591 } 7592 return null; 7593 } 7594 7595 function isInViewport(element) { 7596 const rect = element && element.getBoundingClientRect(); 7597 return rect && 7598 rect.top >= 0 && 7599 rect.left >= 0 && 7600 rect.right <= window.innerWidth && 7601 rect.bottom <= window.innerHeight; 7602 } 7603 7604 function setFocusAfterTransition(dialogElement, duration) { 7605 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 7606 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 7607 next: for (let candidate of candidates) { 7608 for (let child of nested) { 7609 if (child.contains(candidate)) continue next; 7610 } 7611 setTimeout(() => candidate.focus(), 50); 7612 break; 7613 } 7614 window.setTimeout(() => { 7615 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 7616 focusables(dialogElement)[0] || 7617 null; 7618 focusElement && isInViewport(focusElement) && focusElement.focus(); 7619 }, Math.max(1, duration)); 7620 } 7621 7622 function determineTrigger($refs, dialog, trigger) { 7623 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 7624 return dialog.target; 7625 } 7626 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 7627 return trigger.target; 7628 } 7629 if (typeof trigger === 'string') { 7630 try { 7631 return $refs[trigger] || document.querySelector(trigger) 7632 } catch (e) {} 7633 } 7634 if (trigger instanceof Element) { 7635 return trigger; 7636 } 7637 7638 return null; 7639 } 7640 7641 function isOverlayDisabled(dialog) { 7642 return dialog && dialog.hasAttribute('x-no-overlay') 7643 } 7644 7645 function areRemainingModalsWithoutOverlay(modals) 7646 { 7647 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 7648 7649 return overflowDisabled.length === modals.length; 7650 } 7651 7652 window.hyva.modal = function(options) { 7653 7654 const config = Object.assign({ 7655 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 7656 transitionEnterStart: 'opacity-0', 7657 transitionEnterEnd: 'opacity-100', 7658 transitionLeave: 'transition ease-in duration-300', 7659 transitionLeaveStart: 'opacity-100', 7660 transitionLeaveEnd: 'opacity-0', 7661 }, options); 7662 let lastHide = 0; 7663 7664 return { 7665 opened: {}, 7666 show(dialog, trigger) { 7667 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 7668 const name = typeof dialog === 'string' ? dialog : config.dialog; 7669 const dialogElement = this.$refs[name]; 7670 if (! dialogElement) { 7671 return; 7672 } 7673 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 7674 7675 dialogElement.scrollTop = 0; 7676 7677 if (this.opened[name]) { 7678 return; 7679 } 7680 7681 if (focusTargetAfterHide) { 7682 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 7683 } 7684 7685 this.opened[name] = true; 7686 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 7687 setFocusAfterTransition(dialogElement, config.duration); 7688 7689 const frame = {name, instance: this, focusTarget: focu
7689sTargetAfterHide, time: Date.now()}; 7690 7691 modals.push(frame); 7692 if (useOverlay) { 7693 document.body.classList.add('overflow-hidden'); 7694 } 7695 return new Promise(resolve => frame.resolve = resolve); 7696 }, 7697 cancel() { 7698 this.hide(false); 7699 }, 7700 ok() { 7701 this.hide(true); 7702 }, 7703 hide(value) { 7704 if (Date.now() - lastHide < config.duration) { 7705 return; 7706 } 7707 lastHide = Date.now(); 7708 7709 const modal = modals.pop() || {}; 7710 const name = modal.name; 7711 this.opened[name] = false; 7712 hyva.releaseFocus(modal.instance.$refs[modal.name]) 7713 trapFocusInNextModalWithOverlay(); 7714 7715 const nextFocusAfterHide = modal.focusTarget; 7716 nextFocusAfterHide && setTimeout(() => { 7717 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 7718 nextFocusAfterHide.focus() 7719 }, config.duration); 7720 7721 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 7722 document.body.classList.remove('overflow-hidden'); 7723 } 7724 7725 modal.resolve(value); 7726 }, 7727 overlay(dialog) { 7728 const name = typeof dialog === 'string' ? dialog : config.dialog; 7729 return { 7730 ['x-show']() { 7731 return this.opened[name] 7732 }, 7733 ['x-transition:enter']: config.transitionEnter, 7734 ['x-transition:enter-start']: config.transitionEnterStart, 7735 ['x-transition:enter-end']: config.transitionEnterEnd, 7736 ['x-transition:leave']: config.transitionLeave, 7737 ['x-transition:leave-start']: config.transitionLeaveStart, 7738 ['x-transition:leave-end']: config.transitionLeaveEnd, 7739 ['@hyva-modal-show.window'](event) { 7740 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 7741 } 7742 }; 7743 } 7744 }; 7745 } 7746 7747 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 7748 7749 window.hyva.modal.pop = function () { 7750 if (modals.length > 0) { 7751 const modal = modals[modals.length -1]; 7752 modal.instance.hide(); 7753 } 7754 } 7755 7756 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 7757 typeof selectors === 'string' || selectors instanceof String 7758 ? excludedFromFocusTrapping.add(selectors) 7759 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 7760 } 7761 7762 window.hyva.modal.eventListeners = { 7763 keydown: event => { 7764 if (event.key === 'Escape') { 7765 window.hyva.modal.pop(); 7766 } 7767 }, 7768 click: event => { 7769 if (modals.length > 0) { 7770 const modal = modals[modals.length -1]; 7771 const dialog = modal.instance.$refs[modal.name]; 7772 if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago 7773 ! isOverlayDisabled(dialog) && // if dialog has overlay 7774 ! dialog.contains(event.target)) { // if click is outside of dialog 7775 modal.instance.hide(); 7776 } 7777 } 7778 } 7779 }; 7780 7781 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 7782 7783 document.addEventListener('click', window.hyva.modal.eventListeners.click); 7784 })(); 7785</script>
7785 7786
7787<script> 7788 (function () { 7789 'use strict'; 7790 7791 const storageName = 'AmastyCookieGroups'; 7792 7793 !!hyva.amStorage && hyva.amStorage.create(storageName, { 7794 /** 7795 * @type {{ 7796 * checked: boolean, 7797 * cookies: {description: string, lifetime: number|null, name: string, provider: string, type: string}[], 7798 * description: string, 7799 * groupId: string|number, 7800 * isEssential: boolean, 7801 * name: string 7802 * }[]} name 7803 */ 7804 groupData: [], 7805 cookiePolicy: undefined, 7806 lastUpdate: undefined, 7807 7808 /** 7809 * @returns {string|number[]} 7810 */ 7811 getEssentialGroupIds: function () { 7812 return this.groupData.reduce(function (essentialGroupIds, group) { 7813 if (group.isEssential) { 7814 essentialGroupIds.push(group.groupId) 7815 } 7816 7817 return essentialGroupIds; 7818 }, []); 7819 }, 7820 7821 /** 7822 * @returns {string|number[]} 7823 */ 7824 getCheckedGroupIds: function () { 7825 return this.groupData.reduce(function (checkedGroupIds, group) { 7826 if (group.checked) { 7827 checkedGroupIds.push(group.groupId); 7828 } 7829 7830 return checkedGroupIds; 7831 }, []); 7832 }, 7833 7834 /** 7835 * @param {string} cookieName 7836 * @returns {boolean} 7837 */ 7838 isCookieEssential: function (cookieName) { 7839 const allEssentialCookies = this.getEssentialCookies(); 7840 7841 return !!allEssentialCookies.find(cookie => cookie.name === cookieName); 7842 }, 7843 7844 /** 7845 * @returns {array} 7846 */ 7847 getEssentialCookies: function () { 7848 return this.groupData 7849 .filter(group => group.isEssential) 7850 .map(group => group.cookies) 7851 .flat(); 7852 }, 7853 7854 /** 7855 * @returns {boolean} 7856 */ 7857 hasGroupData: function () { 7858 return !!this.groupData.length; 7859 }, 7860 7861 /** 7862 * @param {string} cookieName 7863 * @param {string} pattern 7864 * @returns {boolean} 7865 */ 7866 isEssentialByPattern: function (cookieName, pattern) { 7867 const essentialCookiePatterns = this.getEssentialCookiesPattern(pattern); 7868 7869 return essentialCookiePatterns.some((pattern) => !!cookieName.match(this.getCookiePattern(pattern))); 7870 }, 7871 7872 /** 7873 * @param {string} pattern 7874 * @return {Array} 7875 */ 7876 getEssentialCookiesPattern: function (pattern) { 7877 return this.getCookiesByPattern(pattern, this.getEssentialCookies()); 7878 }, 7879 7880 /** 7881 * @param {string} pattern 7882 * @param {Array|undefined} cookies 7883 * @return {Array} 7884 */ 7885 getCookiesByPattern: function (pattern, cookies) { 7886 if (typeof cookie === 'undefined') { 7887 cookies = this.getAllCookies(); 7888 } 7889 7890 return cookies
7891 .map((cookie) => typeof cookie === 'object' ? cookie.name : cookie.split('=')[0].trim()) 7892 .filter((cookie) => cookie.match(pattern) !== null); 7893 }, 7894 7895 /** 7896 * @returns {array} 7897 */ 7898 getDisallowedCookies: function () { 7899 const disallowedCookie = decodeURIComponent(hyva.getCookie('amcookie_disallowed') ?? ''); 7900 if (!disallowedCookie) { 7901 return []; 7902 } 7903 7904 return disallowedCookie.split(','); 7905 }, 7906 7907 /** 7908 * @returns {string} 7909 */ 7910 getCookiePattern: function (pattern) { 7911 return `^${pattern.replaceAll('*', '.*')}$`; 7912 }, 7913 7914 /** 7915 * @returns {array} 7916 */ 7917 getAllCookies: function () { 7918 return document.cookie.split(';'); 7919 }, 7920 7921 /** 7922 * @param {boolean} setAcceptance 7923 * @returns {Promise} 7924 */ 7925 updateGroupData: function (setAcceptance = false) { 7926 const cookieFetchUrl = `${BASE_URL}amcookie/cookie/cookies`; 7927 return fetch(cookieFetchUrl, { 7928 method: "POST", 7929 headers: { 7930 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 7931 'X-Requested-With': 'XMLHttpRequest' 7932 }, 7933 body: new URLSearchParams({ 7934 allowed: hyva.getCookie('amcookie_allowed'), 7935 restriction: hyva.getCookie('amcookie_policy_restriction') 7936 }) 7937 }).then(response => { 7938 if (response.ok) { 7939 return response.json(); 7940 } 7941 7942 return Promise.reject(`${response.status} ${response.statusText}`); 7943 }).then(data => { 7944 this.cookiePolicy = data.cookiePolicy ?? 'allowed'; 7945 this.lastUpdate = data.lastUpdate ?? 0; 7946 this.groupData = [...data.groupData]; 7947 7948 hyva.setCookie('amcookie_policy_restriction', this.cookiePolicy, 10); 7949 if (setAcceptance) { 7950 amastyCookieManager.setLastCookieAcceptance(this.lastUpdate); 7951 } 7952 7953 return data; 7954 }).catch(error => { 7955 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 7956 { 7957 type: "error", 7958 text: error 7959 } 7960 ]); 7961 }).finally(() => window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated'))); 7962 } 7963 }); 7964 })(); 7965</script>
vendor: 1 bytes, line 7965
7965
7966<script> 7967 (function (amastyCookieManager) { 7968 'use strict'; 7969 7970 amastyCookieManager.pattern = '{(?<cookiePattern>.*)}'; 7971 7972 amastyCookieManager.getAmastyCookieGroupStorage = function () { 7973 return hyva?.amStorage?.getStorage('AmastyCookieGroups') ?? {}; 7974 }; 7975 7976 amastyCookieManager.deleteDisallowedCookie = function () { 7977 const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); 7978 const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; 7979 7980 disallowedCookies.forEach((name) => { 7981 const pattern = name.match(this.pattern); 7982 if (!!pattern && !!amastyCookieGroupStorage) { 7983 const cookiePattern = amastyCookieGroupStorage.getCookiePattern(pattern.groups.cookiePattern) ?? ''; 7984 7985 amastyCookieGroupStorage.getCookiesByPattern(cookiePattern).forEach((cookieName) => { 7986 this.deleteNotEssentialCookie(cookieName); 7987 }); 7988 } else { 7989 this.deleteNotEssentialCookie(name); 7990 } 7991 }); 7992 }; 7993 7994 amastyCookieManager.isCookieAllowed = function (cookieName) { 7995 const allowedGroups = hyva.getCookie('amcookie_allowed'); 7996 const disallowedCookie = this.getAmastyCookieGroupStorage()?.getDisallowedCookies() ?? []; 7997 const isCookiePolicyAllowed = hyva.getCookie('amcookie_policy_restriction') === 'allowed'; 7998 const isCookieEssential = this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName); 7999 const isCookieEssentialByPattern = this.getAmastyCookieGroupStorage()?.isEssentialByPattern(cookieName, this.pattern); 8000 8001 if (!isCookiePolicyAllowed || isCookieEssential || isCookieEssentialByPattern) { 8002 return true; 8003 } 8004 8005 return !((!allowedGroups && !disallowedCookie) || this.isCookieDisallowed(cookieName)); 8006 }; 8007 8008 amastyCookieManager.isCookieDisallowed = function (cookieName) { 8009 const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); 8010 const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; 8011 8012 return disallowedCookies.some((cookie) => { 8013 const pattern = cookie.match(this.pattern); 8014 8015 return !!pattern && !!cookieName.match(amastyCookieGroupStorage?.getCookiePattern(pattern.groups.cookiePattern)); 8016 }) || disallowedCookies.indexOf(cookieName) !== -1; 8017 }; 8018 8019 amastyCookieManager.processManageableCookies = function () { 8020 let cookieScripts = document.querySelectorAll('script[data-amcookie-groupid][type="text/plain"]'); 8021 8022 cookieScripts.forEach((elem) => { 8023 if (this.isChecked(elem.dataset['amcookie-groupid'])) { 8024 let elClone = elem.cloneNode(true).setAttribute('type', 'text/javascript'); 8025 8026 elem.remove(); 8027 document.body.appendChild(elClone); 8028 } 8029 }); 8030 }; 8031 8032 amastyCookieManager.deleteNotEssentialCookie = function (cookieName) { 8033 if (!this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName)) { 8034 hyva.setCookie(cookieName, '', -1, true); 8035 } 8036 }; 8037 8038 amastyCookieManager.setLastCookieAcceptance = function (lastUpdate) { 8039 localStorage.setItem('am-last-cookie-acceptance', lastUpdate); 8040 }; 8041 8042 window.addEventListener('amasty-cookie-group-updated', () => { 8043 amastyCookieManager.deleteDisallowedCookie(); 8044 }); 8045 8046 window.addEventListener('private-content-loaded', () => { 8047 amastyCookieManager.getAmastyCookieGroupStorage()?.hasGroupData() && amastyCookieManager.deleteDisallowedCookie(); 8048 }); 8049 }(window.amastyCookieManager = window.amastyCookieManager || {})); 8050</script>
vendor: 1 bytes, line 8050
8050
8051<script> 8052 (function () { 8053 'use strict'; 8054 8055 window.addEventListener('cookiebar-action-accept', (event) => { 8056 const groups = event.detail; 8057 const url = `${BASE_URL}amcookie/cookie/savegroups`; 8058 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 8059 const body = new URLSearchParams({ 8060 form_key: hyva.getFormKey() 8061 }); 8062 groups.length && groups.map(groupId => body.append('groups[]', groupId)); 8063 8064 fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) 8065 .then(response => { 8066 if (response.ok) { 8067 return response.json(); 8068 } 8069 8070 return Promise.reject(`${response.status} ${response.statusText}`); 8071 }) 8072 .then(data => { 8073 if (data.success) { 8074 !!hyva.amStorage && hyva.amStorage.getStorage('AmastyCookieGroups').updateGroupData(true); 8075 } 8076 }) 8077 .catch(error => { 8078 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8079 { 8080 type: "error", 8081 text: error 8082 } 8083 ]); 8084 }) 8085 .finally(() => { 8086 amastyCookieManager.processManageableCookies(); 8087 window.dispatchEvent(new CustomEvent('cookiebar-action-accept-finish')); 8088 window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated')); 8089 // Wait cookiebar close animation 8090 setTimeout(() => { 8091 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8092 }, 100); 8093 }); 8094 }); 8095 })(); 8096</script>
vendor: 1 bytes, line 8096
8096
8097<script> 8098 (function () { 8099 'use strict'; 8100 8101 window.addEventListener('cookiebar-action-allow', () => { 8102 const url = `${BASE_URL}amcookie/cookie/allow`; 8103 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 8104 const body = new URLSearchParams({ 8105 form_key: hyva.getFormKey() 8106 }); 8107 fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) 8108 .then(response => { 8109 if (response.ok) { 8110 return response; 8111 } 8112 8113 return Promise.reject(`${response.status} ${response.statusText}`); 8114 }) 8115 .then(() => { 8116 !!hyva.amStorage && hyva.amStorage.getStorage('AmastyCookieGroups').updateGroupData(true); 8117 }) 8118 .catch(error => { 8119 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8120 { 8121 type: "error", 8122 text: error 8123 } 8124 ]); 8125 }) 8126 .finally(() => { 8127 amastyCookieManager.processManageableCookies(); 8128 window.dispatchEvent(new CustomEvent('cookiebar-action-allow-finish')); 8129 // Wait cookiebar close animation 8130 setTimeout(() => { 8131 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8132 }, 100); 8133 }); 8134 }); 8135 })(); 8136</script>
8136 8137
8138<script> 8139 (function () { 8140 'use strict'; 8141 8142 window.addEventListener('cookiebar-action-settings', () => { 8143 window.dispatchEvent(new Event('open-am-cookie-bar-settings')); 8144 }); 8145 })(); 8146</script>
8146 8147 8148<style> 8149 :root { 8150 /* Bar Color Settings */ 8151 --ambar-background: #fff; 8152 --ambar-links-color: #326ed1; 8153 --ambar-policy-text: #374151; 8154 8155 /* Buttons Color Settings */ 8156 --ambar-button-accept-color: #337ab7; 8157 --ambar-button-accept-hover-color: #337ab7; 8158 --ambar-button-accept-text: #fff; 8159 --ambar-button-accept-hover-text: #fff; 8160 8161 --ambar-button-allow-color: #337ab7; 8162 --ambar-button-allow-hover-color: #337ab7; 8163 --ambar-button-allow-text: #fff; 8164 --ambar-button-allow-hover-text: #fff; 8165 8166 --ambar-button-decline-color: #337ab7; 8167 --ambar-button-decline-hover-color: #337ab7; 8168 --ambar-button-decline-text: #fff; 8169 --ambar-button-decline-hover-text: #fff; 8170 8171 --ambar-button-settings-color: #337ab7; 8172 --ambar-button-settings-hover-color: #337ab7; 8173 --ambar-button-settings-text: #fff; 8174 --ambar-button-settings-hover-text: #fff; 8175 8176 /* Buttons Order Settings */ 8177 --ambar-button-accept-order: 0; 8178 --ambar-button-allow-order: 0; 8179 --ambar-button-settings-order: 0; 8180 --ambar-button-decline-order: 0; 8181 } 8182</style> 8183 8184<div x-data="{...hyva.modal(), ...initCookieBarSettings()}" x-spread="eventListeners" x-bind="eventListeners"> 8185 <div x-cloak x-spread="overlay('am-cookie-bar-settings')" 8186 x-bind="overlay('am-cookie-bar-settings')" 8187 class="fixed inset-0 flex flex-col items-center justify-center text-left bg-gray-500/50 z-50"> 8188 <div x-ref="am-cookie-bar-settings" role="dialog" aria-labelledby="cookiebar-groups" 8189 class="relative inline-block max-h-screen overflow-auto 8190 max-w-[90vw] bg-white shadow-xl rounded-lg p-10 text-gray-700"> 8191 <div tabindex="0" @focusin="focusDoneButton()"></div> 8192 <button @click="$dispatch(hide('close-am-cookie-bar-settings'))" 8193 aria-label="Chiudi" 8194 x-ref="ambar-settings-close" 8195 class="absolute right-2 top-2 text-gray-300 transition 8196 hover:text-black focus:drop-shadow-md hover:drop-shadow-md"> 8197 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" 8198 stroke="currentColor" 8199 stroke-width="2"> 8200 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 8201 </svg> 8202 </button> 8203 <div id="cookiebar-groups"> 8204 8205<div class="w-full flex flex-col"> 8206 <template x-for="group in $store.AmastyCookieGroups.groupData" :key="group.groupId"> 8207 <div class="mb-2"> 8208 <div class="header flex justify-between items-start"> 8209 <p class="text-lg font-semibold pr-6 ambar-group-title" x-text="group.name"></p> 8210 <div> 8211 <label :for="`amcookie-classic-group-${group.groupId}`"> 8212 <input type="checkbox" 8213 name="groups[]" 8214 x-model="group.checked" 8215 :id="`amcookie-classic-group-${group.groupId}`" 8216 :disabled="group.isEssential" 8217 :value="group.groupId" 8218 :aria-label="group.name"> 8219 </label> 8220 </div> 8221 </div> 8222 <p class="pb-2 pt-0 -mt-2 text-sm ambar-group-description" x-html="group.description"></p> 8223 <button class="btn btn-secondary px-4 text-xs mb-4 rounded-sm before:content-none after:content-none" 8224 type="button" 8225 title="Maggiori Informazioni" 8226 aria-label="Maggiori Informazioni" 8227 @click="$dispatch('classic\u002Dopen\u002Dam\u002Dcookie\u002Dgroup\u002Dinfo', group)"> 8228 Maggiori Informazioni </button> 8229 </div> 8230 </template> 8231</div> 8232 8233 8234<div x-data="{...hyva.modal(), ...initCookieGroupInfo_6ac2bbed3ec01()}" 8235 x-spread="eventListeners" x-bind="eventListeners"> 8236 <div x-cloak x-spread="overlay('classic-am-cookie-group-info')" 8237 x-bind="overlay('classic-am-cookie-group-info')" 8238 class="fixed inset-0 flex items-center justify-center text-left bg-gray-500/50 z-50"> 8239 <div x-ref="classic-am-cookie-group-info" role="dialog" aria-labelledby="the-label" 8240 class="inline-block max-h-[92vh] max-w-[90vw] overflow-auto 8241 bg-white shadow-xl rounded-lg p-8 text-gray-700 relative"> 8242 <template x-if="group"> 8243 <div> 8244 <button @click="$dispatch('classic-close-am-cookie-group-info')" 8245 aria-label="Chiudi" 8246 class="absolute right-2 top-2 text-gray-300 transition 8247 hover:text-black focus:drop-shadow-md hover:drop-shadow-md"> 8248 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" 8249 stroke="currentColor" 8250 stroke-width="2"> 8251 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 8252 </svg> 8253 </button> 8254 <div class="md:flex md:justify-start pb-4"> 8255 <p class="text-lg font-semibold" x-text="group.name"></p> 8256 </div> 8257 <div class="overflow-x-scroll md:overflow-x-auto"> 8258 <table class="table-auto w-full mb-4 text-left"> 8259 <thead> 8260 <tr> 8261 <th class="pr-4 text-xs font-medium">NOME</th> 8262 <th class="pr-4 text-xs font-medium">PROVIDER</th> 8263 <th class="min-w-[30%] pr-4 text-xs font-medium">DESCRIZIONE</th> 8264 <th class="pr-4 text-xs font-medium">TIPO</th> 8265 </tr> 8266 </thead> 8267 <tbody> 8268 <template x-for="(item, index) in group.cookies" :key="index"> 8269 <tr> 8270 <td x-text="item.name" class="font-semibold pr-4 text-xs"></td> 8271 <td x-text="item.provider" class="pr-4 text-xs"></td> 8272 <td x-html="item.description" class="min-w-[30%] pr-4 text-xs"></td> 8273 <td x-text="item.type" class="pr-4 text-xs"></td> 8274 </tr> 8275 </template> 8276 </tbody> 8277 </table> 8278 </div> 8279 </div> 8280 </template> 8281 <button 8282 @click="$dispatch('classic-close-am-cookie-group-info')" aria-label="Fatto" 8283 class="mx-auto ambar-action-btn font-semibold text-white uppercase bg-primary tracking-wider px-6"> 8284 LETTO 8285 </button> 8286 </div> 8287 </div> 8288 8289</div>
8290<script> 8291 'use strict'; 8292 8293 function initCookieGroupInfo_6ac2bbed3ec01() { 8294 return { 8295 group: null, 8296 eventListeners: { 8297 ['@classic-close-am-cookie-group-info.window']() { 8298 this.hide('classic-am-cookie-group-info'); 8299 }, 8300 ['@classic-open-am-cookie-group-info.window'](event) { 8301 this.group = event.detail; 8302 8303 if (!!this.group) { 8304 /* 8305 If modal have big cookies list this can lead to 8306 trigger hide event in hyva.modal.eventListeners.click, 8307 so we should wait till this.group is reassigned 8308 */ 8309 this.$nextTick(() => this.show('classic-am-cookie-group-info')); 8310 } 8311 } 8312 } 8313 } 8314 } 8315</script>
8315 8316 </div> 8317 <div class="w-full flex"> 8318 <button class="mx-auto ambar-action-btn font-semibold text-white uppercase bg-primary tracking-wider px-6 hover:bg-natlabLigthBlue" 8319 x-ref="ambar-settings-done" 8320 x-focus-first 8321 @click="$dispatch('cookiebar-action-accept', $store.AmastyCookieGroups.getCheckedGroupIds())"> 8322 Fatto </button> 8323 </div> 8324 <div tabindex="0" @focusin="focusCloseButton()"></div> 8325 </div> 8326 </div> 8327</div> 8328
8329<script> 8330 'use strict'; 8331 8332 function initCookieBarSettings() { 8333 return { 8334 eventListeners: { 8335 ['@close-am-cookie-bar-settings.window']() { 8336 !!this.opened['am-cookie-bar-settings'] && 8337 this.hide('am-cookie-bar-settings'); 8338 }, 8339 ['@open-am-cookie-bar-settings.window']() { 8340 !this.opened['am-cookie-bar-settings'] && 8341 this.show('am-cookie-bar-settings'); 8342 }, 8343 ['@cookiebar-action-accept-finish.window']() { 8344 !!this.opened['am-cookie-bar-settings'] && 8345 this.hide('am-cookie-bar-settings'); 8346 } 8347 }, 8348 focusDoneButton: function () { 8349 this.$refs['ambar-settings-done']?.focus(); 8350 }, 8351 focusCloseButton: function () { 8352 this.$refs['ambar-settings-close']?.focus(); 8353 } 8354 } 8355 } 8356</script>
vendor: 1 bytes, line 8356
8356
8357<script type="application/json" id="default-section-data"> 8358 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AT":{"name":"Austria","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":"Belgio"},"CH":{"name":"Svizzera","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":"Freiburg"},"111":{"code":"GE","name":"Genf"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Luzern"},"116":{"code":"NE","name":"Neuenburg"},"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"},"124":{"code":"TI","name":"Tessin"},"123":{"code":"TG","name":"Thurgau"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Waadt"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"DE":{"name":"Germania","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":"Danimarca"},"ES":{"name":"Spagna","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"}
8358,"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"FR":{"name":"Francia","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"},"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"}}},"GB":{"name":"Regno Unito"},"GR":{"name":"Grecia"},"IE":{"name":"Irlanda"},"IT":{"name":"Italia"},"LU":{"name":"Lussemburgo"},"NL":{"name":"Paesi Bassi"},"PT":{"name":"Portogallo"},"SI":{"name":"Slovenia"},"SM":{"name":"San Marino"},"VA":{"name":"Citt\u00e0 del Vaticano"},"data_id":1791146989},"captcha":[],"instant-purchase":[],"loggedAsCustomer":[],"persistent":[],"review":[],"payments":[],"wishlist":{"items":[]},"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[]}</script>
8358 8359</div></body> 8360</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.