1<!doctype html> 2<html lang="it"> 3<head > 4 <meta charset="utf-8"/> 5<meta name="title" content="Hai dimenticato la password?"/> 6<meta name="robots" content="INDEX,FOLLOW"/> 7<meta name="viewport" content="width=device-width, initial-scale=1"/> 8<title>Hai dimenticato la password?</title> 9 <link rel="stylesheet" type="text/css" media="all" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/css/styles.css" /> 10<link rel="icon" type="image/x-icon" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/favicon.ico" /> 11<link rel="shortcut icon" type="image/x-icon" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/favicon.ico" /> 12<link rel="preload" as="font" crossorigin="anonymous" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/fonts/SourceSans3/SourceSans3-Light.woff2" /> 13<link rel="preload" as="font" crossorigin="anonymous" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/fonts/SourceSans3/SourceSans3-Medium.woff2" /> 14<link rel="preload" as="font" crossorigin="anonymous" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/fonts/SourceSans3/SourceSans3-Bold.woff2" /> 15<link rel="preload" as="font" crossorigin="anonymous" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/fonts/BalooBhaina2/BalooBhaina2-Bold.woff2" /> 16<link rel="icon" sizes="16x16" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/favicon-16x16.png" /> 17<link rel="icon" sizes="32x32" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/favicon-32x32.png" /> 18<link rel="apple-touch-icon-precomposed" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/apple-touch-icon.png" /> 19<meta name="facebook-domain-verification" content="19ikyzhaaju7aes0tjiyen338y422x" /> 20<style> 21.checkout-payment-method .payment-method-title input[value="sella_fabrickpass"]+label>span { 22 width: 100% 23} 24 25.checkout-payment-method .payment-method-title input[value="sella_fabrickpass"]+label:after { 26 content: ''; 27 display: block; 28 height: 30px; 29 width: 100%; 30 background-size: contain!important; 31 background: url("https://www.farma.it/media/paybybank-logo.png") no-repeat right 32} 33 34.bg-cerave-week { 35 background: #0072ba; 36} 37 38.bg-cerave-week:hover { 39 background: #0069ac; 40 text-decoration: none; 41} 42 43[data-content-type="text"] ol { 44 list-style-type: decimal; 45 padding-left: 20px; 46} 47 48[data-content-type="text"] ul { 49 list-style-type: disc; 50 padding-left: 20px; 51} 52 53[data-content-type="text"] ol li, [data-content-type="text"] ol li { 54 margin-top: 4px; 55} 56 57.catalog-product-view .product-info-main #gallery img.derma-badge { 58 width: 120px!important; 59} 60 61#amfaq-ask-form-inline .button-container { 62display: none !important; 63} 64 65.children-category-container { 66overflow: hidden; 67} 68div.sella-payment-method-container div.img-sella-container { 69 display: none; 70} 71 72div.sella-payment-method-container > div { 73 display: flex;
74 align-items: center; 75} 76div.sella-card-form input { 77 width: 100%; 78 border-radius: 26px; 79 border-width: 1px; 80 --tw-border-opacity: 1; 81 border-color: rgb(214 214 214 / var(--tw-border-opacity)); 82 padding: .875rem; 83 line-height: 1; 84 color: rgb(8 1 26 / var(--tw-text-opacity)); 85 --tw-text-opacity: 1; 86 color: rgb(107 114 128 / var(--tw-text-opacity)); 87 font-size: 16px; 88} 89 90[data-bind="i18n: 'Sustainable delivery estimated in 48-72 hours'"] { 91 display: none; 92} 93 94/* stile doppi punti */ 95/* 96.col-method#label_method_inpost_inpost:after { 97 content: 'Punti Fedeltà x2!'; 98 background: #fec802e6; 99 padding: 0px 5px; 100 border-radius: 5px; 101 color: #f15b2c; 102 font-weight: bold; 103 font-size: 12px; 104 vertical-align: middle; 105 display: inline-block; 106 white-space: nowrap; 107 animation: smooth-bounce-h 2.5s cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite; 108 padding: 4px 8px; 109} 110 111@keyframes smooth-bounce-h { 112 0% { transform: translateX(0); } 113 25% { transform: translateX(6px); } 114 50% { transform: translateX(0); } 115 75% { transform: translateX(-6px); } 116 100% { transform: translateX(0); } 117} 118 119.col-method#label_method_inpost_inpost { 120 display: flex; 121 gap: 8px; 122 align-items: center; 123} 124*/ 125</style> 126 127 128<meta name="google-site-verification" content="9QFzfN_ciMqKFU_cA05_S82R8WLpqnsp4E4Ihexm7EE" /> 129
130<script> 131// Aggiungi un event listener al documento 132document.addEventListener('click', function(event) { 133 // Ottieni l'elemento target cliccato 134 var targetElement = event.target; 135 136 // Verifica se l'elemento cliccato ha le classi specificate 137 var hasTargetClasses = targetElement.classList.contains('block') && 138 targetElement.classList.contains('px-6') && 139 targetElement.classList.contains('w-full') && 140 targetElement.classList.contains('py-3') && 141 targetElement.classList.contains('text-base') && 142 targetElement.classList.contains('hover:text-secondary') && 143 targetElement.classList.contains('hover:bg-tertiary-darker/10') && 144 targetElement.classList.contains('hover:fill-primary') && 145 targetElement.classList.contains('font-bold') && 146 targetElement.classList.contains('cursor-pointer') && 147 targetElement.classList.contains('level0') && 148 targetElement.classList.contains('nav-11') && 149 targetElement.classList.contains('page-item'); 150 151 // Verifica se l'elemento cliccato è un figlio di un elemento con le classi specificate 152 var parentElement = targetElement.closest('.block.px-6.w-full.py-3.text-base.hover\\:text-secondary.hover\\:bg-tertiary-darker\\/10.hover\\:fill-primary.font-bold.cursor-pointer.level0.nav-11.page-item'); 153 154 // Esegui l'azione solo se l'elemento cliccato ha le classi o è un figlio di un elemento con le classi 155 if (hasTargetClasses || parentElement) { 156 // Esegui il reindirizzamento o caricamento del link 157 window.location.href = "https://www.farma.it/dermocosmetica"; 158 } 159 160 // Ottieni l'elemento target cliccato 161 targetElement = event.target; 162 163 // Verifica se l'elemento cliccato ha le classi specificate 164 hasTargetClasses = targetElement.classList.contains('block') && 165 targetElement.classList.contains('px-6') && 166 targetElement.classList.contains('w-full') && 167 targetElement.classList.contains('py-3') && 168 targetElement.classList.contains('text-base') && 169 targetElement.classList.contains('hover:text-secondary') && 170 targetElement.classList.contains('hover:bg-tertiary-darker/10') && 171 targetElement.classList.contains('hover:fill-primary') && 172 targetElement.classList.contains('font-bold') && 173 targetElement.classList.contains('cursor-pointer') && 174 targetElement.classList.contains('level0') && 175 targetElement.classList.contains('nav-12') && 176 targetElement.classList.contains('page-item'); 177 178 // Verifica se l'elemento cliccato è un figlio di un elemento con le classi specificate 179 parentElement = targetElement.closest('.block.px-6.w-full.py-3.text-base.hover\\:text-secondary.hover\\:bg-tertiary-darker\\/10.hover\\:fill-primary.font-bold.cursor-pointer.level0.nav-12.page-item'); 180 181 // Esegui l'azione solo se l'elemento cliccato ha le classi o è un figlio di un elemento con le classi 182 if (hasTargetClasses || parentElement) { 183 // Esegui il reindirizzamento o caricamento del link 184 window.location.href = "https://www.farma.it/gastro-intestinale"; 185 } 186 187}); 188 189</script>
189 190
191<script defer> 192 window.addEventListener('load', () => { 193 Alpine.effect(() => { 194 // Funzione per capire se un elemento è naturalmente focusabile 195 const isNaturallyFocusable = (el) => { 196 const tag = el.tagName.toLowerCase(); 197 if (tag === "a") return el.hasAttribute("href"); 198 return ["button", "input", "select", "textarea"].includes(tag); 199 }; 200 201 // 1. Link con href="#" => role="button" + tabindex 202 document.querySelectorAll("[href='#']:not([role])").forEach(el => { 203 el.setAttribute("role", "button"); 204 if (!el.hasAttribute("tabindex") && !isNaturallyFocusable(el)) { 205 el.setAttribute("tabindex", "0"); 206 } 207 }); 208 209 // 2. Link target="_blank" => aria-label se manca 210 document.querySelectorAll("a[target='_blank']:not([aria-label])").forEach(el => { 211 const text = el.textContent.trim(); 212 if (text.length > 0) { 213 el.setAttribute("aria-label", `${text} - opens in new tab`); 214 } 215 }); 216 217 // 2.1 Link con href valorizzato e senza aria-label => estrai path finale 218 document.querySelectorAll("a[href]:not([aria-label])").forEach(el => { 219 const href = el.getAttribute("href"); 220 if (href && href !== "#" && !el.hasAttribute("aria-label")) { 221 try { 222 const cleanHref = href.split('?')[0].split('#')[0]; 223 const parts = cleanHref.split('/'); 224 const last = parts.filter(p => p).pop(); 225 if (last) { 226 const label = decodeURIComponent(last) 227 .replace(/[-_]/g, ' ') 228 .replace(/[^\w\sà èéìòùÃÃÃÃÃÃ]/gi, '') 229 .trim(); 230 if (label) { 231 el.setAttribute("aria-label", label); 232 } 233 } 234 } catch (e) {} 235 } 236 }); 237 238 // 3. Form di ricerca => role="search" 239 document.getElementById("search_mini_form")?.setAttribute("role", "search"); 240 241 // 4. Icone visive => role="presentation" se mancante 242 document.querySelectorAll("i[class*='-icon'], em[class*='-icon'], span[class*='-icon']").forEach(el => { 243 if (!el.hasAttribute("role")) { 244 el.setAttribute("role", "presentation"); 245 } 246 }); 247 248 // 5. SVG: rimuovi role="img", imposta alt e role="presentation" se serve 249 document.querySelectorAll("svg").forEach(el => { 250 if (el.getAttribute("role") === "img") { 251 el.removeAttribute("role"); 252 } 253 if (!el.hasAttribute("alt")) { 254 el.setAttribute("alt", "Icona"); 255 } 256 if (!el.hasAttribute("role")) { 257 el.setAttribute("role", "presentation"); 258 } 259 }); 260 261 // 6. Elementi cliccabili via classi => role="button" + tabindex="0" 262 const clickableSelector = [ 263 ".cursor-pointer", 264 ".group\\/button", 265 "[style*='cursor: pointer']", 266 '.swiper-button-prev', 267 '.swiper-button-next', 268 '.swiper-pagination-bullet', 269 '.product-item-link' 270 ].join(','); 271 272 document.querySelectorAll(clickableSelector).forEach(el => { 273 if (el.hasAttribute("role")) return; 274 275 const tag = el.tagName.toLowerCase(); 276 const isNativeButton = 277 tag === "button" || 278 (tag === "input" && ["button", "submit", "reset"].includes(el.type)); 279 280 if (!isNativeButton) { 281 el.setAttribute("role", "button"); 282 283 if (!el.hasAttribute("tabindex") && !isNaturallyFocusable(el)) { 284 el.setAttribute("tabindex", "0"); 285 } 286 287 if (!el.hasAttribute("aria-label")) { 288 el.setAttribute("aria-label", "Action"); 289 } 290 } 291 }); 292 293 // 7. Elementi con @click => role="button" + tabindex="0" 294 document.querySelectorAll("*").forEach(el => { 295 if ( 296 el.hasAttribute("@click") && 297 el.hasAttribute("@click.prevent") && 298 !el.hasAttribute("role") && 299 el.tagName.toLowerCase() !== "button" 300 ) { 301 el.setAttribute("role", "button"); 302 303 if (!el.hasAttribute("tabindex") && !isNaturallyFocusable(el)) { 304 el.setAttribute("tabindex", "0"); 305 } 306 307 if (!el.hasAttribute("aria-label")) { 308 el.setAttribute("aria-label", "Action"); 309 } 310 } 311 }); 312 313 // 8. Cookiebot title: attesa dinamica e pulizia 314 const observeCookiebotTitle = () => { 315 const targetId = "CybotCookiebotDialogBodyContentTitle"; 316 317 const handleTitle = (el) => { 318 if (el.getAttribute("role") === "heading") el.removeAttribute("role"); 319 if (el.hasAttribute("aria-level")) el.removeAttribute("aria-level"); 320 }; 321 322 const existing = document.getElementById(targetId); 323 if (existing) { 324 handleTitle(existing); 325 return; 326 } 327 328 const observer = new MutationObserver((mutations, obs) => { 329 const found = document.getElementById(targetId); 330 if (found) { 331 handleTitle(found); 332 obs.disconnect(); 333 } 334 }); 335 336 observer.observe(document.body, { 337 childList: true, 338 subtree: true, 339 }); 340 }; 341 342 observeCookiebotTitle(); 343 344 // 9. Correzione elementi pseudo-button generici (span/div/a) con comportamento da bottone 345 document.querySelectorAll("a, span, div").forEach(el => { 346 const isButtonLike = 347 el.hasAttribute("@click") || 348 el.hasAttribute("@click.prevent") || 349 el.hasAttribute("x-on:click") || 350 el.hasAttribute("onclick") || 351 el.hasAttribute("@keyup.enter") || 352 el.hasAttribute("x-on:keyup.enter") || 353 el.classList.contains("cursor-pointer") || 354 el.classList.contains("badge-container") || 355 el.classList.contains("rating-summary"); 356 357 if (isButtonLike) { 358 const isFocusable = isNaturallyFocusable(el) || el.hasAttribute("tabindex"); 359 360 // Assegna solo se mancano 361 if (!el.hasAttribute("role")) { 362 el.setAttribute("role", "button"); 363 } 364 if (!isFocusable) { 365 el.setAttribute("tabindex", "0"); 366 } 367 if (!el.hasAttribute("aria-label")) { 368 el.setAttribute("aria-label", "Action"); 369 } 370 } 371 }); 372 }); 373 });
374 375 376window.addEventListener('init-external-scripts', () => { 377 378if (!window.dataLayer) { 379 window.dataLayer = []; 380} 381 382 window.dataLayer.push({ 383 event: 'init_external_scripts' 384 }) 385}); 386 387 388document.addEventListener('click', function (event) { 389 const link = event.target.closest('a[href^="#"]'); 390 391 if (!link) { 392 return; 393 } 394 395 const targetId = link.getAttribute('href').substring(1); 396 397 if (!targetId) { 398 return; 399 } 400 401 const target = document.getElementById(targetId); 402 403 // Ci interessa solo se il target è un form 404 if (!(target instanceof HTMLFormElement)) { 405 return; 406 } 407 408 event.preventDefault(); 409 410 target.requestSubmit(); 411}); 412</script>
412 413 414 <!-- Meta Business Extension for Magento 2 --> 415<!-- Meta Pixel Code -->
416<script>
vendor: 398 bytes, lines 416-424
416 417!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? 418n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; 419n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; 420t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, 421document,'script','//connect.facebook.net/en_US/fbevents.js'); 422 fbq( 423 'init', 424 '
424512468414859242
vendor: 59 bytes, lines 424-427
424', 425 {}, 426 {agent: 'magento_opensource-0.0.0-1.6.4' } 427);
428fbq('track', 'PageView', { 429 source: "magento_opensource", 430 pluginVersion: "1.6.4" 431}); 432</script>
432 433
434<script> 435 function metaPixelTracker(config) { 436 let eventId = crypto.randomUUID(); 437 var browserEventData = config.browserEventData; 438 let browserPayload = config.browserEventData.payload; 439 440 browserPayload.source = browserEventData.source; 441 browserPayload.pluginVersion = browserEventData.pluginVersion; 442 443 fbq('set', 'agent', browserEventData.fbAgentVersion, browserEventData.fbPixelId); 444 fbq(browserEventData.track, browserEventData.event, browserPayload, { 445 eventID: eventId 446 } 447 ); 448 449 var formData = new FormData(); 450 formData.append('form_key', hyva.getFormKey()); 451 formData.append('eventId', eventId); 452 453 Object.entries(config.payload).forEach(function (item) { 454 formData.append(item[0], item[1]); 455 }) 456 457 fetch(config.url, { 458 method: 'POST', 459 body: formData 460 }).catch(error => { 461 console.error(error); 462 }); 463 } 464 465 function metaParseJson(json) { 466 json = decodeURIComponent(json.replace(/\+/g, ' ')); 467 return JSON.parse(json); 468 } 469 470 function metaDelCookie(name) { 471 var date = new Date(0); 472 var cookie = name + '=' + '; path=/; expires=' + date.toUTCString(); 473 474 document.cookie = cookie; 475 } 476 477 function metaGetCookie(name) { 478 var cookie = ' ' + document.cookie; 479 var search = ' ' + name + '='; 480 var setStr = null; 481 var offset = 0; 482 var end = 0; 483 484 if (cookie.length > 0) { 485 offset = cookie.indexOf(search); 486 if (offset !== -1) { 487 offset += search.length; 488 end = cookie.indexOf(';', offset); 489 if (end === -1) { 490 end = cookie.length; 491 } 492 setStr = decodeURI(cookie.substring(offset, end)); 493 } 494 } 495 return setStr; 496 } 497</script>
497 498<!-- End Meta Pixel Code --> 499 500<!-- Google Tag Manager by MagePal -->
501<script type="text/javascript"> 502 window.dataLayer = window.dataLayer || []; 503 504 505 function initMagepalGtmDatalayer_4f71f1c5e6503faecb6d9e35a59f2399() { 506 'use strict'; 507 508 let lastPushedCart = {}; 509 let lastPushedCustomer = {}; 510 511 function objectKeyExist(object) 512 { 513 const items = Array.isArray(object) ? object : Object.values(object); 514 return items.reduce((acc, v) => (acc || v.customer || v.cart), false); 515 // return _.some(object, function (o) { 516 // return !_.isEmpty(_.pick(o, ['customer', 'cart'])); 517 // }) 518 } 519 520 const isObject = x => x === Object(x); 521 const has = (x, p) => isObject(x) && x.hasOwnProperty(p); 522 const isEqual = (x, y) => JSON.stringify(x) === JSON.stringify(y); 523 524 //Update datalayer 525 function updateDataLayer(_gtmDataLayer, _dataObject, _forceUpdate) 526 { 527 let customer = {isLoggedIn : false}, 528 cart = {hasItems: false}; 529 530 if (_gtmDataLayer !== undefined && (!objectKeyExist(_gtmDataLayer) || _forceUpdate)) { 531 if (isObject(_dataObject) && has(_dataObject, 'customer')) { 532 customer = _dataObject.customer; 533 } 534 535 if (isObject(_dataObject) && has(_dataObject, 'cart')) { 536 cart = _dataObject.cart; 537 } 538 539 if (!isEqual(lastPushedCart, cart) || !isEqual(lastPushedCustomer, customer)) { 540 window.dispatchEvent(new CustomEvent('mpCustomerSession', {detail: [customer, cart, _gtmDataLayer]})); 541 //$('body').trigger('mpCustomerSession', [customer, cart, _gtmDataLayer]); 542 _gtmDataLayer.push({'event': 'mpCustomerSession', 'customer': customer, 'cart': cart}); 543 544 lastPushedCustomer = customer; 545 lastPushedCart = cart; 546 } 547 } 548 } 549 550 function isTrackingAllowed(config) 551 { 552 let allowServices = false, 553 allowedCookies, 554 allowedWebsites; 555 556 if (!config.isGdprEnabled || (!config.isGdprEnabled && !config.addJsInHeader)) { 557 allowServices = true; 558 } else if (config.isCookieRestrictionModeEnabled && config.gdprOption === 1) { 559 allowedCookies = hyva.getCookie(config.cookieName); 560 561 if (allowedCookies !== null) { 562 allowedWebsites = JSON.parse(allowedCookies); 563 564 if (allowedWebsites[config.currentWebsite] === 1) { 565 allowServices = true; 566 } 567 } 568 } else if (config.gdprOption === 2) { 569 allowServices = hyva.getCookie(config.cookieName) !== null; 570 } else if (config.gdprOption === 3) { 571 allowServices = hyva.getCookie(config.cookieName) === null; 572 } 573 574 return allowServices; 575 } 576 577 //load gtm 578 function initTracking(dataLayerName, accountId, containerCode) 579 { 580 window.dispatchEvent(new CustomEvent('gtm:beforeInitialize')); 581 582 (function (w, d, s, l, i) { 583 w[l] = w[l] || []; 584 w[l].push({ 585 'gtm.start': 586 new Date().getTime(), event: 'gtm.js' 587 }); 588 var f = d.getElementsByTagName(s)[0], 589 j = d.createElement(s), dl = l != dataLayerName ? '&l=' + l : ''; 590 j.async = true; 591 j.src = '//www.googletagmanager.com/gtm.js?id=' + i + dl + containerCode; 592 f.parentNode.insertBefore(j, f); 593 })(window, document, 'script', dataLayerName, accountId); 594 window.dispatchEvent(new CustomEvent('gtm:afterInitialize')); 595 } 596 597 function pushData(dataLayerName, dataLayer) 598 { 599 //if (_.isArray(dataLayer)) { 600 if (Array.isArray(dataLayer)) { 601 //_.each(dataLayer, function (data) { 602 dataLayer.forEach(function (data) { 603 window[dataLayerName].push(data); 604 }); 605 } 606 } 607 608 const config = { 609 dataLayer: "dataLayer", 610 gdprOption: 0, 611 isGdprEnabled: 0, 612 isCookieRestrictionModeEnabled: 0, 613 }; 614 615 config.currentWebsite = 1; 616 config.cookieName = "user_allowed_save_cookie"; 617 config.accountId = "GTM-TQTH9KNM"; 618 config.data = [{"ecommerce":{"currencyCode":"EUR"},"pageType":"customer_account_forgotpassword","list":"other"}]; 619 config.addJsInHeader = 0; 620 config.containerCode = ""; 621 622 window[config.dataLayer] = window[config.dataLayer] || []; 623 624 if (has(config, 'accountId') && isTrackingAllowed(config)) { 625 pushData(config.dataLayer, config.data); 626 initTracking(config.dataLayer, config.accountId, config.containerCode); 627 } 628 629 const gtmDataLayer = window[config.dataLayer]; 630 631 window.addEventListener("private-content-loaded", event => { 632 const dataObject = event.detail.data['magepal-gtm-jsdatalayer'] || {}; 633 updateDataLayer(gtmDataLayer, dataObject, true) 634 }); 635
636 // dataObject.subscribe(function (_dataObject) { 637 // updateDataLayer(gtmDataLayer, _dataObject, true); 638 // }, this); 639 640 // if (!_.contains(customerData.getExpiredKeys(), 'magepal-gtm-jsdatalayer')) { 641 // updateDataLayer(gtmDataLayer, dataObject(), false); 642 // } 643 644 } 645 window.addEventListener('DOMContentLoaded', initMagepalGtmDatalayer_4f71f1c5e6503faecb6d9e35a59f2399); 646 647</script>
647 648<!-- End Google Tag Manager by MagePal --> 649 650<link rel="canonical" href="https://www.farma.it/customer/account/forgotpassword/">
651<script> 652 var BASE_URL = 'https://www.farma.it/'; 653 var THEME_PATH = 'https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT'; 654 var COOKIE_CONFIG = { 655 "expires": null, 656 "path": "\u002F", 657 "domain": ".farma.it", 658 "secure": true, 659 "lifetime": "7200", 660 "cookie_restriction_enabled": false }; 661 var CURRENT_STORE_CODE = 'default'; 662 var CURRENT_WEBSITE_ID = '1'; 663 var CURRENT_MIN_ORDER_VALUE = '24.90'; 664 var CURRENT_MIN_ORDER_VALUE_FORMATTED = '24,90 â¬'; 665 var CURRENT_MIN_ORDER_INCLUDE_DISCOUNT = '0'; 666 var CURRENT_STORE_CURRENCY = 'EUR'; 667 668 window.hyva = window.hyva || {} 669 670 window.cookie_consent_groups = window.cookie_consent_groups || {} 671 window.cookie_consent_groups['necessary'] = true; 672 673 window.cookie_consent_config = window.cookie_consent_config || {}; 674 window.cookie_consent_config['necessary'] = [].concat( 675 window.cookie_consent_config['necessary'] || [], 676 [ 677 'user_allowed_save_cookie', 678 'form_key', 679 'mage-messages', 680 'private_content_version', 681 'mage-cache-sessid', 682 'last_visited_store', 683 'section_data_ids' 684 ] 685 ); 686 document.addEventListener("alpine:init", () => { 687 Alpine.store('externalScriptsInit', false); 688 window.addEventListener('init-external-scripts', () => Alpine.store('externalScriptsInit',true), { 689 once: true, 690 passive: true 691 }); 692 }); 693</script>
vendor: 1 bytes, line 693
693
694<script> 695 (function( hyva, undefined ) { 696 697 function lifetimeToExpires(options, defaults) { 698 699 const lifetime = options.lifetime || defaults.lifetime; 700 701 if (lifetime) { 702 const date = new Date; 703 date.setTime(date.getTime() + lifetime * 1000); 704 return date; 705 } 706 707 return null; 708 } 709 710 function generateRandomString() { 711 712 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 713 length = 16; 714 715 let formKey = '', 716 charactersLength = allowedCharacters.length; 717 718 for (let i = 0; i < length; i++) { 719 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 720 } 721 722 return formKey; 723 } 724 725 const sessionCookieMarker = {noLifetime: true} 726 727 const cookieTempStorage = {}; 728 729 const internalCookie = { 730 get(name) { 731 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 732 return v ? v[2] : null; 733 }, 734 set(name, value, days, skipSetDomain) { 735 let expires, 736 path, 737 domain, 738 secure, 739 samesite; 740 741 const defaultCookieConfig = { 742 expires: null, 743 path: '/', 744 domain: null, 745 secure: false, 746 lifetime: null, 747 samesite: 'lax' 748 }; 749 750 const cookieConfig = window.COOKIE_CONFIG || {}; 751 752 expires = days && days !== sessionCookieMarker 753 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 754 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 755 756 path = cookieConfig.path || defaultCookieConfig.path; 757 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 758 secure = cookieConfig.secure || defaultCookieConfig.secure; 759 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 760 761 document.cookie = name + "=" + encodeURIComponent(value) + 762 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 763 (path ? '; path=' + path : '') + 764 (domain ? '; domain=' + domain : '') + 765 (secure ? '; secure' : '') + 766 (samesite ? '; samesite=' + samesite : 'lax'); 767 }, 768 isWebsiteAllowedToSaveCookie() { 769 const allowedCookies = this.get('user_allowed_save_cookie'); 770 if (allowedCookies) { 771 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 772 773 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 774 } 775 return false; 776 }, 777 getGroupByCookieName(name) { 778 const cookieConsentConfig = window.cookie_consent_config || {}; 779 let group = null; 780 for (let prop in cookieConsentConfig) { 781 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 782 if (cookieConsentConfig[prop].includes(name)) { 783 group = prop; 784 break; 785 } 786 } 787 return group; 788 }, 789 isCookieAllowed(name) { 790 const cookieGroup = this.getGroupByCookieName(name); 791 return cookieGroup 792 ? window.cookie_consent_groups[cookieGroup] 793 : this.isWebsiteAllowedToSaveCookie(); 794 }, 795 saveTempStorageCookies() { 796 for (const [name, data] of Object.entries(cookieTempStorage)) { 797 if (this.isCookieAllowed(name)) { 798 this.set(name, data['value'], data['days'], data['skipSetDomain']); 799 delete cookieTempStorage[name]; 800 } 801 } 802 } 803 }; 804 805 hyva.getCookie = (name) => { 806 const cookieConfig = window.COOKIE_CONFIG || {}; 807 808 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 809 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 810 } 811 812 return internalCookie.get(name); 813 } 814 815 hyva.setCookie = (name, value, days, skipSetDomain) => { 816 const cookieConfig = window.COOKIE_CONFIG || {}; 817 818 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 819 cookieTempStorage[name] = {value, days, skipSetDomain}; 820 return; 821 } 822 return internalCookie.set(name, value, days, skipSetDomain); 823 } 824 825 826 hyva.setSessionCookie = (name, value, skipSetDomain) => { 827 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 828 } 829 830 hyva.getBrowserStorage = () => { 831 const browserStorage = window.localStorage || window.sessionStorage; 832 if (!browserStorage) { 833 console.warn('Browser Storage is unavailable'); 834 return false;
835 } 836 try { 837 browserStorage.setItem('storage_test', '1'); 838 browserStorage.removeItem('storage_test'); 839 } catch (error) { 840 console.warn('Browser Storage is not accessible', error); 841 return false; 842 } 843 return browserStorage; 844 } 845 846 hyva.postForm = (postParams) => { 847 const form = document.createElement("form"); 848 849 let data = postParams.data; 850 851 if (! postParams.skipUenc && ! data.uenc) { 852 data.uenc = btoa(window.location.href); 853 } 854 form.method = "POST"; 855 form.action = postParams.action; 856 857 Object.keys(postParams.data).map(key => { 858 const field = document.createElement("input"); 859 field.type = 'hidden' 860 field.value = postParams.data[key]; 861 field.name = key; 862 form.appendChild(field); 863 }); 864 865 const form_key = document.createElement("input"); 866 form_key.type = 'hidden'; 867 form_key.value = hyva.getFormKey(); 868 form_key.name="form_key"; 869 form.appendChild(form_key); 870 871 document.body.appendChild(form); 872 873 form.submit(); 874 } 875 876 hyva.getFormKey = function () { 877 let formKey = hyva.getCookie('form_key'); 878 879 if (!formKey) { 880 formKey = generateRandomString(); 881 hyva.setCookie('form_key', formKey); 882 } 883 884 return formKey; 885 } 886 887 hyva.formatPrice = (value, showSign, options = {}) => { 888 const groupSeparator = options.groupSeparator; 889 const decimalSeparator = options.decimalSeparator 890 delete options.groupSeparator; 891 delete options.decimalSeparator; 892 const formatter = new Intl.NumberFormat( 893 'it\u002DIT', 894 Object.assign({ 895 style: 'currency', 896 currency: 'EUR', 897 signDisplay: showSign ? 'always' : 'auto' 898 }, options) 899 ); 900 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 901 formatter.formatToParts(value).map(({type, value}) => { 902 switch (type) { 903 case 'currency': 904 return '\u20AC' || value; 905 case 'minusSign': 906 return '- '; 907 case 'plusSign': 908 return '+ '; 909 case 'group': 910 return groupSeparator !== undefined ? groupSeparator : value; 911 case 'decimal': 912 return decimalSeparator !== undefined ? decimalSeparator : value; 913 default : 914 return value; 915 } 916 }).reduce((string, part) => string + part) : 917 formatter.format(value); 918 } 919 920 const formatStr = function (str, nStart) { 921 const args = Array.from(arguments).slice(2); 922 923 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 924 const idx = parseInt(n) - nStart; 925 926 if (args[idx] === null || args[idx] === void 0) { 927 return m; 928 } 929 return p.length % 2 930 ? p.slice(0, -1).replace('%%', '%') + args[idx] 931 : p.replace('%%', '%') + n; 932 }) 933 } 934 935 hyva.str = function (string) { 936 const args = Array.from(arguments); 937 args.splice(1, 0, 1); 938 939 return formatStr.apply(undefined, args); 940 } 941 942 hyva.strf = function () { 943 const args = Array.from(arguments); 944 args.splice(1, 0, 0); 945 946 return formatStr.apply(undefined, args); 947 } 948 949 /** 950 * Take a html string as `content` parameter and 951 * extract an element from the DOM to replace in 952 * the current page under the same selector, 953 * defined by `targetSelector` 954 */ 955 hyva.replaceDomElement = (targetSelector, content) => { 956 // Parse the content and extract the DOM node using the `targetSelector` 957 const parser = new DOMParser(); 958 const doc = parser.parseFromString(content, 'text/html');
959 const contentNode = doc.querySelector(targetSelector); 960 961 // Bail if content or target can't be found 962 if (!contentNode || !document.querySelector(targetSelector)) { 963 return; 964 } 965 966 hyva.activateScripts(contentNode); 967 968 // Replace the old DOM node with the new content 969 document.querySelector(targetSelector).replaceWith(contentNode); 970 971 // Reload customerSectionData and display cookie-messages if present 972 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 973 hyva.initMessages(); 974 } 975 976 hyva.removeScripts = (contentNode) => { 977 const scripts = contentNode.getElementsByTagName('script'); 978 for (let i = 0; i < scripts.length; i++) { 979 scripts[i].parentNode.removeChild(scripts[i]); 980 } 981 const templates = contentNode.getElementsByTagName('template'); 982 for (let i = 0; i < templates.length; i++) { 983 const container = document.createElement('div'); 984 container.innerHTML = templates[i].innerHTML; 985 hyva.removeScripts(container); 986 templates[i].innerHTML = container.innerHTML; 987 } 988 } 989 990 hyva.activateScripts = (contentNode) => { 991 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 992 const scripts = Array.from(contentNode.getElementsByTagName('script')); 993 994 // Iterate over all script tags to duplicate+inject each into the head 995 for (const original of scripts) { 996 const script = document.createElement('script'); 997 original.type && (script.type = original.type); 998 script.innerHTML = original.innerHTML; 999 1000 // Remove the original (non-executing) script from the contentNode 1001 original.parentNode.removeChild(original) 1002 1003 // Add script to head 1004 document.head.appendChild(script); 1005 } 1006 1007 return contentNode; 1008 } 1009 1010 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 1011 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 1012 1013 let currentTrap; 1014 1015 const focusableElements = (rootElement) => { 1016 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 1017 return Array.from(rootElement.querySelectorAll(selector)) 1018 .filter(el => { 1019 return el.style.display !== 'none' 1020 && !el.disabled 1021 && el.tabIndex !== -1 1022 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 1023 }) 1024 } 1025 1026 const focusTrap = (e) => { 1027 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 1028 if (!isTabPressed) return; 1029 1030 const focusable = focusableElements(currentTrap) 1031 const firstFocusableElement = focusable[0] 1032 const lastFocusableElement = focusable[focusable.length - 1] 1033 1034 e.shiftKey 1035 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 1036 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 1037 }; 1038 1039 hyva.releaseFocus = (rootElement) => { 1040 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 1041 currentTrap.removeEventListener('keydown', focusTrap) 1042 currentTrap = null 1043 } 1044 } 1045 hyva.trapFocus = (rootElement) => { 1046 if (!rootElement) return; 1047 hyva.releaseFocus() 1048 currentTrap = rootElement 1049 rootElement.addEventListener('keydown', focusTrap) 1050 const firstElement = focusableElements(rootElement)[0] 1051 firstElement && firstElement.focus() 1052 } 1053 1054 hyva.safeParseNumber = (rawValue) => { 1055 const number = rawValue ? parseFloat(rawValue) : null; 1056 1057 return Array.isArray(number) || isNaN(number) ? rawValue : number; 1058 } 1059 1060 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 1061 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 1062 1063 const camelCase = toCamelCase(name);
1064 const key = '__hyva_bool_' + name 1065 1066 return new Proxy(Object.assign( 1067 additionalMethods, 1068 { 1069 [key]: !!value, 1070 [name]() {return !!this[key]}, 1071 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 1072 ['not' + camelCase]() {return !this[key]}, 1073 ['toggle' + camelCase]() {this[key] = !this[key]}, 1074 [`set${camelCase}True`]() {this[key] = true}, 1075 [`set${camelCase}False`]() {this[key] = false}, 1076 } 1077 ), { 1078 set(target, prop, value) { 1079 return prop === name 1080 ? (target[key] = !!value) 1081 : Reflect.set(...arguments); 1082 } 1083 }) 1084 } 1085 1086 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 1087 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 1088 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 1089 1090 }( window.hyva = window.hyva || {} )); 1091 //# sourceURL=hyva.js 1092</script>
vendor: 1 bytes, line 1092
1092
1093<script type="speculationrules"> 1094{ 1095 "tag": "Hyva Theme", 1096 "prefetch": [{ 1097 "source": "document", 1098 "where": { 1099 "and": [ 1100 { "href_matches": "/*" }, 1101 { "not": { 1102 "href_matches": ["/customer/*","/search/*","/sales/*","/wishlist/*","/checkout/*","/paypal/*","/newsletter/*","/stores/store/redirect/*"] }}, 1103 { "not": { 1104 "selector_matches": [".no-preload", ".do-not-prerender", "[download]", "[rel~=nofollow]", "[target]"] 1105 }} 1106 ] 1107 }, 1108 "eagerness": "moderate" 1109 }] 1110} 1111</script>
vendor: 1 bytes, line 1111
1111
1112<script class="feedaty_sdk" src="https://widget.feedaty.com/v3.0.0/js/2021/10214034/feedaty.min.js" async></script>
vendor: 1 bytes, line 1112
1112
1113<script> 1114 function deepMerge(target, ...sources) { 1115 if (!sources.length) { 1116 return target; 1117 } 1118 1119 const source = sources.shift(); 1120 1121 if (typeof target !== 'object' || typeof source !== 'object') { 1122 return target; 1123 } 1124 1125 for (let key in source) { 1126 if (source.hasOwnProperty(key)) { 1127 if (source[key] instanceof Array) { 1128 target[key] = target[key] || []; 1129 target[key] = target[key].concat(source[key]); 1130 } else if (typeof source[key] === 'object') { 1131 target[key] = deepMerge(target[key] || {}, source[key]); 1132 } else { 1133 target[key] = source[key]; 1134 } 1135 } 1136 } 1137 1138 return deepMerge(target, ...sources); 1139 } 1140 1141 function amastyRewardsProduct() { 1142 return { 1143 captionStartText: 'Puoi\u0020guadagnare', 1144 captionAfterText: '', 1145 captionRegistrationText: 'registrandoti\u0021', 1146 captionEndText: '', 1147 productId: this.$el.dataset.productId, 1148 formSelector: 'product_addtocart_form', 1149 form: null, 1150 refreshUrl: this.$el.dataset.refreshUrl, 1151 loader: false, 1152 isFetching: false, 1153 abortFetchController: false, 1154 highlight: { 1155 registration_link: '', 1156 caption_color: '', 1157 caption_text: '0', 1158 visible: false 1159 }, 1160 1161 init() { 1162 this.formObserver(); 1163 document.addEventListener(`update-qty-${this.productId}`, () => { 1164 this.updateData(); 1165 }); 1166 window.addEventListener('update-bundle-option-selection', () => { 1167 this.updateData(); 1168 }); 1169 this.$nextTick(() => this.updateData()); 1170 }, 1171 1172 hideBlock() { 1173 this.highlight.visible = false; 1174 this.loader = true; 1175 }, 1176 1177 dispatchStatus(type, message) { 1178 window.dispatchMessages([{ 1179 type: type, 1180 text: message 1181 }], 5000); 1182 }, 1183 1184 formObserver() { 1185 const product = document.querySelector(`input[name='product'][value='${this.productId}']`); 1186 1187 if (product) { 1188 const productForm = product.form; 1189 if (productForm) { 1190 productForm.addEventListener('change', () => { 1191 this.updateData(); 1192 }); 1193 } 1194 } 1195 }, 1196 1197 updateData() { 1198 if (this.isFetching) { 1199 return false; 1200 } 1201 if (!this.refreshUrl) { 1202 this.loader = false;
1203 return false; 1204 } 1205 this.hideBlock(); 1206 1207 if (this.abortFetchController) { 1208 this.abortFetchController.abort(); 1209 } 1210 1211 this.abortFetchController = new AbortController(); 1212 1213 const product = document.querySelector(`input[name='product'][value='${this.productId}']`); 1214 let formParams = ''; 1215 1216 if (!product) { 1217 formParams = 'form_key=' + hyva.getFormKey() + '&product=' + this.productId; 1218 } else { 1219 const form = product.form; 1220 const formData = new FormData(form); 1221 formParams = new URLSearchParams(formData).toString(); 1222 } 1223 const formJson = JSON.stringify({ 1224 page: 0, 1225 productId: this.productId, 1226 attributes: formParams 1227 }); 1228 1229 const requestOptions = { 1230 method: 'POST', 1231 body: formJson, 1232 headers: { 1233 'Content-Type': 'application/json', 1234 'x-requested-with': 'XMLHttpRequest', 1235 }, 1236 signal: this.abortFetchController.signal 1237 }; 1238 this.isFetching = true; 1239 fetch(this.refreshUrl, requestOptions).then(response => { 1240 if (!response.ok) { 1241 return Promise.reject(`${response.status} ${response.statusText}`); 1242 } 1243 return response.json(); 1244 }).then((data) => { 1245 this.highlight.visible = data.visible; 1246 this.highlight.caption_text = data.caption_text; 1247 this.highlight.caption_color = data.caption_color; 1248 1249 if (data?.registration_link) { 1250 this.highlight.registration_link = data.registration_link; 1251 } 1252 1253 if (data?.need_to_change_message && data?.need_to_change_message === 1) { 1254 this.captionAfterText = 'completando\u0020un\u0020acquisto\u0021\u0020Solo\u0020per'; 1255 this.captionRegistrationText = 'registrati.'; 1256 this.captionEndText = 'utenti'; 1257 } 1258 }).catch(error => { 1259 if (error.name !== 'AbortError' && typeof error === 'string' && error.match(/'401'/g) !== null) { 1260 this.dispatchStatus('error', error); 1261 } 1262 }).finally(() => { 1263 this.loader = false;
1264 this.isFetching = false; 1265 }); 1266 }, 1267 1268 highlightCaptionText() { 1269 return this.highlight.caption_text !== '0' && !this.loader; 1270 }, 1271 1272 highlightStyle() { 1273 return `color: ${this.highlight.caption_color}`; 1274 }, 1275 1276 isHighlightRegistrationLink() { 1277 return this.highlight.registration_link && this.highlight.registration_link !== ''; 1278 }, 1279 1280 isNotRegistrationLink() { 1281 return !this.highlight.registration_link; 1282 }, 1283 1284 highlightVisible() { 1285 return this.highlight.visible && !this.loader; 1286 } 1287 } 1288 } 1289 1290 window.addEventListener( 1291 'alpine:init', 1292 () => Alpine.data('amastyRewardsProduct', amastyRewardsProduct), 1293 { once: true } 1294 ); 1295</script>
vendor: 1 bytes, line 1295
1295
1296<script> 1297 (function () { 1298 let amSwiperProcessed = false; 1299 1300 window.addEventListener('load-amswiper', () => { 1301 if (amSwiperProcessed) { 1302 window?.Swiper && window.dispatchEvent(new CustomEvent('amswiper-loaded', {})); 1303 return; 1304 } 1305 1306 const script = document.createElement('script'); 1307 script.src = 'https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Amasty_LibSwiperJs/js/vendor/swiper/swiper.min.js'; 1308 script.async = true; 1309 document.body.appendChild(script); 1310 1311 amSwiperProcessed = true; 1312 1313 script.onload = () => { 1314 window.dispatchEvent(new CustomEvent('amswiper-loaded', {})); 1315 } 1316 1317 const stylesHref = 'https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Amasty_LibSwiperJs/vendor/swiper/swiper.min.css'; 1318 1319 if (document.querySelector(`link[href="${stylesHref}"]`)) { 1320 return; 1321 } 1322 1323 const styles = document.createElement('link'); 1324 styles.rel = 'stylesheet'; 1325 styles.type = 'text/css'; 1326 styles.href = stylesHref; 1327 1328 document.head.appendChild(styles); 1329 }); 1330 }()); 1331</script>
1331 1332</head> 1333<body id="html-body" class="customer-account-forgotpassword page-layout-1column"> 1334 <noscript> 1335 <img height="1" width="1" style="display:none" 1336 src="https://www.facebook.com/tr?id=512468414859242&ev=PageView&noscript=1&a=magento_opensource-0.0.0-1.6.4"> 1337 </noscript> 1338 1339<!-- Google Tag Manager by MagePal -->
vendor: 62 bytes, lines 1339-1340
1339 1340<noscript><iframe src="//www.googletagmanager.com/ns.html?id=
1340GTM-TQTH9KNM
vendor: 83 bytes, lines 1340-1341
1340" 1341height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
1342<!-- End Google Tag Manager by MagePal --> 1343 1344 1345 1346
1346<script type="module">const { KlarnaSDK } = await import("https\u003A\u002F\u002Fjs.klarna.com\u002Fweb\u002Dsdk\u002Fv2\u002Fklarna.mjs"); 1347const MyKlarna = await KlarnaSDK({ 1348 clientId: "klarna_live_client_Rnpiams_MTNpWWc3LzJ3UUppciNHKUgqJSlSTG9lS0gsN2Q1MmUxN2UtZmE4MC00OGIxLWFhNjgtNTc4NDMyN2M2MGQ0LDEsWlJNMmtVejlkd0Q1bVBoOHZnc3JKN1YyL3FOY2ZrYzRRSWRjNUNhY3ZZYz0", 1349 products: ["PAYMENT", "MESSAGING", "IDENTITY", "CUSTOMER"], 1350 locale: "it\u002DIT" 1351}); 1352const token = await MyKlarna.Interoperability.token(); 1353const klarnaReadyEvent = new CustomEvent("klarna-sdk-ready", { 1354 detail: { token, sdk: MyKlarna } 1355}); 1356window.dispatchEvent(klarnaReadyEvent);</script>
1356 1357<div 1358 class="ambanners ambanner-10" 1359 data-position="10" 1360 data-bannerid="" 1361 data-role="amasty-banner-container" 1362></div> 1363
1364<script nonce='Z21reG1veG44ajg0aHZqYmg4NG5sY2Rqd2l1bWZla2g=' > 1365 'use strict'; 1366 (function (blackbird) { 1367 1368 const addEventListenerOnElementToLoad = (elementToLoad, source) => new Promise((resolve, reject) => { 1369 elementToLoad.addEventListener('load', () => { 1370 elementToLoad.dataset.loaded = true; 1371 resolve(elementToLoad); 1372 }) 1373 1374 elementToLoad.addEventListener('error', () => { 1375 reject(new Error(`[External resource loader] : The resource "${source}", failed to load.`)); 1376 }); 1377 }); 1378 1379 blackbird.loadExternalScript = async (source) => { 1380 const scriptWithSameSrc = document.querySelector(`script[src="${source}"][data-loaded]`); 1381 1382 if (scriptWithSameSrc && scriptWithSameSrc.dataset.loaded === 'true') { 1383 return scriptWithSameSrc; 1384 } 1385 1386 const script = scriptWithSameSrc ?? document.createElement('script'); 1387 script.type = 'text/javascript'; 1388 script.async = true; 1389 script.src = source; 1390 script.dataset.loaded = false; 1391 1392 document.head.appendChild(script); 1393 await addEventListenerOnElementToLoad(script, source); 1394 return script; 1395 } 1396 1397 blackbird.loadExternalStyle = async (source) => { 1398 const linkWithSameHref = document.querySelector(`link[href="${source}"][data-loaded]`); 1399 1400 if (linkWithSameHref && linkWithSameHref.dataset.loaded === 'true') { 1401 return linkWithSameHref; 1402 } 1403 1404 const link = linkWithSameHref ?? document.createElement('link'); 1405 link.type = 'text/css' 1406 link.rel = 'stylesheet'; 1407 link.href = source; 1408 link.dataset.loaded = false; 1409 1410 document.head.prepend(link); 1411 await addEventListenerOnElementToLoad(link, source); 1412 return link; 1413 } 1414 1415 blackbird.loadExternalResource = (source) => { 1416 const scriptUrlRegex = /\.(js)$/i; 1417 const styleUrlRegex = /\.(css)$/i; 1418 1419 if (scriptUrlRegex.test(source)) { 1420 return blackbird.loadExternalScript(source); 1421 } 1422 1423 if (styleUrlRegex.test(source)) { 1424 return blackbird.loadExternalStyle(source); 1425 } 1426 } 1427 1428 }(window.blackbird = window.blackbird || {})); 1429</script>
1429 1430<!-- BEGIN Trovaprezzi Trusted Program CODE -->
1431<script type="text/javascript" src="https://tps.trovaprezzi.it/javascripts/tracking-vanilla.min.js"></script>
1431 1432 1433<!-- END Trovaprezzi Trusted Program CODE --> 1434<input name="form_key" type="hidden" value="NuWLCNhC6L8sVz4U" /> 1435 <noscript> 1436 <section 1437 class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal" 1438 aria-labelledby="messageGlobalNoScriptMessage" 1439 > 1440 <div class="container text-center"> 1441 <p id="messageGlobalNoScriptMessage"> 1442 <strong>I JavaScript sembrano essere disabilitati nel tuo browser.</strong> 1443 <span> 1444 Per una migliore esperienza sul nostro sito, assicurati di attivare i javascript nel tuo browser. </span> 1445 </p> 1446 </div> 1447 </section> 1448 </noscript> 1449 1450 1451<div class="widget block block-static-block"> 1452 <style>#html-body [data-pb-style=HBYLWMQ]{justify-content:flex-start;display:flex;flex-direction:column;background-color:#ff6801;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</style><div class="preheader" data-content-type="row" data-appearance="full-bleed" data-enable-parallax="0" data-parallax-speed="0.5" data-background-images="{}" data-background-type="image" data-video-loop="true" data-video-play-only-visible="true" data-video-lazy-load="true" data-video-fallback-src="" data-background-lazy-load="false" data-intersect="false" data-element="main" data-pb-style="HBYLWMQ"><div data-content-type="html" data-appearance="default" data-intersect="false" data-element="main" data-decoded="true"><p class="py-1 text-xxs lg:text-xs text-center w-full text-white font-medium px-2"> 1453Spedizione <strong id="prova-agent">Gratuita</strong><span class="hidden lg:inline"> su tutti i prodotti</span> | Ordine minimo 24,90 ⬠1454</p> 1455<a href="http://reskyt.com/app/anticafarmaciaorlandi" class="href-download-app reskyt" id="href-download-app" style="display:none"> 1456 <div id="install-app"> 1457 <span class="close-install-app" onclick="return reskytCloseBar();"><span>x</span></span> 1458 <div class="content-app">
1459 <img class="img-app" src="https://cdn.reskyt.com/7724/antica-farmacia-orlandi-icono-app-436884-250116101022.png" alt="Farma.it"> 1460 <div class="name-app">Farma.it</div> 1461 <div class="fab-app">Farma.it - by Antica Farmacia Orlandi</div> 1462 <div class="title-app">Disponibile su <span id="platform-app"></span></div> 1463 </div> 1464 </div> 1465</a> 1466 1467<style> 1468 .fixed-header .reskyt #install-app { 1469 display: none; 1470 } 1471 1472 .reskyt #install-app { 1473 width:100%; 1474 right: 0; 1475 position: fixed; 1476 top:0; 1477 z-index: 900; 1478 color:#000000; 1479 background-color:rgb(255, 102, 0);; 1480 font-family: Verdana, Arial, sans-serif; 1481 font-size:12px; 1482 min-height:90px; 1483 z-index: 99999; 1484 } 1485 .reskyt .close-install-app { 1486 padding:8px 5px; 1487 display:block; 1488 width:20px; 1489 height:40px; 1490 font-family: Helvetica, Arial, Verdana, sans-serif; 1491 font-weight: normal; 1492 font-size:14px; 1493 text-align:center; 1494 cursor:pointer !important; 1495 font-weight:bold; 1496 color:#666; 1497 position:absolute; 1498 margin-top:20px; 1499 } 1500 .reskyt .img-app { 1501 max-height: 60px; 1502 width:57px; 1503 border: 1px solid #e8ecf1; 1504 -webkit-border-radius: 8px; 1505 -moz-border-radius: 8px; 1506 border-radius: 8px; 1507 } 1508 .reskyt .img-app, .reskyt .content-app { 1509 float:left; 1510 } 1511 .reskyt .fab-app { 1512 color:#000000; 1513 font-size:11px; 1514 } 1515 .reskyt .name-app, .reskyt .title-app, .reskyt .fab-app { 1516 margin-left:70px; 1517 padding:1px 0; 1518 } 1519 .reskyt .title-app { color: #444444; } 1520 .reskyt .name-app { 1521 font-weight:bold; 1522 margin-top:2px; 1523 overflow:hidden; 1524 height: 16px; 1525 } 1526 .reskyt .content-app { 1527 margin-top:8px; 1528 margin-right: 34px; 1529 margin-left: 30px; 1530 position:absolute; 1531 } 1532 .reskyt .view-install-app { 1533 color:blue; 1534 line-height:25px; 1535 margin-top:23px; 1536 text-transform:uppercase; 1537 position:absolute; 1538 right:5px; 1539 } 1540 @media screen and (max-width: 350px){ .reskyt .title-app { overflow: auto; max-height: 28px;} } 1541</style> 1542
1543<script> 1544 1545 function reskytCloseBar () { 1546 dias_expire = 7; /*Dias que queremos que pasen hasta que se vuelva a mostrar la barra*/ 1547 reskytSetCookie("reskyt-install-app", 1, dias_expire); 1548 document.getElementById("href-download-app").style.display = "none"; 1549 return false; 1550 } 1551 function reskytSetCookie(cname, cvalue, exdays) { 1552 var d = new Date(); 1553 d.setTime(d.getTime() + (exdays*24*60*60*1000)); 1554 var expires = "expires="+ d.toUTCString(); 1555 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; /*Añadir ;SameSite=None;Secure en caso de que la cookie tenga que ser accesible entre iFrame*/ 1556 } 1557 function reskytGetCookie(cname) { 1558 var name = cname + "="; 1559 var decodedCookie = decodeURIComponent(document.cookie); 1560 var ca = decodedCookie.split(';'); 1561 for(var i = 0; i <ca.length; i++) { 1562 var c = ca[i]; 1563 while (c.charAt(0) == ' ') { 1564 c = c.substring(1); 1565 } 1566 if (c.indexOf(name) == 0) { 1567 return c.substring(name.length, c.length); 1568 } 1569 } 1570 return ""; 1571 } 1572 url = window.location.href; 1573 if ( url.indexOf("customapp=") != -1 ) { 1574 reskytSetCookie("is_app_install_bar", 1, 365); 1575 } 1576 window.addEventListener('load', function () { 1577 let isMobile = true; 1578 1579 const platformApp = document.getElementById("platform-app"); 1580 const downloadApp = document.getElementById("href-download-app"); 1581 1582 if (/Android/i.test(navigator.userAgent)) { 1583 if (platformApp) { 1584 platformApp.innerHTML = "Google Play"; 1585 } 1586 } else if (/iPhone|iPad|iPod/i.test(navigator.userAgent)) { 1587 if (platformApp) { 1588 platformApp.innerHTML = "App Store"; 1589 } 1590 } else if (/IEMobile/i.test(navigator.userAgent)) { 1591 if (platformApp) { 1592 platformApp.innerHTML = "Windows Phone"; 1593 } 1594 } else { 1595 isMobile = false; 1596 } 1597 1598 if ( 1599 downloadApp && 1600 isMobile && 1601 !reskytGetCookie("is_app_install_bar") && 1602 !reskytGetCookie("reskyt-install-app") 1603 ) { 1604 downloadApp.style.display = "block"; 1605 } else if (downloadApp) { 1606 downloadApp.style.display = "none"; 1607 } 1608 }); 1609</script>
1609</div></div></div> 1610 1611
1612<script data-cfasync="false"> 1613 window.amastyCookieManager = window.amastyCookieManager || {}; 1614</script>
vendor: 1 bytes, line 1614
1614
1615<script type="text/plain" data-cookieconsent="marketing"> 1616 (function() { 1617 "use strict"; 1618 1619 window.CONNECTIF_CART_SUMMARY = null; 1620 1621 function addClientScript(result) { 1622 if ( 1623 !document.querySelector("#__cn_generic_script__" + result.clientId) && 1624 !document.querySelector("#__cn_client_script_" + result.clientId) 1625 ) { 1626 const url = 1627 result.cdnProtocol + 1628 "://" + 1629 result.cdnDomain + 1630 "/" + 1631 result.cdnPath + 1632 "/" + 1633 result.clientScriptPath + 1634 result.clientId; 1635 const element = document.createElement("script"); 1636 element.setAttribute("src", url); 1637 element.setAttribute("id", "__cn_generic_script__" + result.clientId); 1638 document.body.appendChild(element); 1639 } else { 1640 var cartModel = window.connectif.getCartModel(); 1641 window.connectif.managed.sendEvents([], {cart: cartModel}) 1642 } 1643 } 1644 1645 function addTags(innerHTML, elementToRemove = null) { 1646 if (!!innerHTML) { 1647 if (elementToRemove) { 1648 let elementToRemoveNode = document.querySelector(elementToRemove); 1649 if (elementToRemoveNode) { 1650 elementToRemoveNode.remove(); 1651 } 1652 } 1653 1654 let element = document.createElement("div"); 1655 element.style.display = "none"; 1656 element.innerHTML = innerHTML; 1657 document.body.appendChild(element); 1658 } 1659 } 1660 1661 function fetchConnectif() { 1662 const url = 'https://www.farma.it/connectif/tags/ajaxconnectiftags' + '?' + Date.now().toString(36) + Math.random().toString(36).substr(2); 1663 1664 fetch(url, { 1665 method: "GET", 1666 headers: { 1667 "Content-Type": "application/json", 1668 'Cache-Control': 'no-cache, no-store, must-revalidate', 1669 'Pragma': 'no-cache', 1670 'Expires': '0', 1671 'X-Requested-With': 'XMLHttpRequest' 1672 } 1673 }) 1674 .then(response => response.json()) 1675 .then(result => { 1676 addTags(result.renderedClientInfo, '.cn_client_info'); 1677 addTags(result.renderedCart, '.cn_cart'); 1678 addTags(result.renderedNewsletter, '.cn_newsletter_subscribe'); 1679 1680 if ( 1681 document.readyState === "complete" || 1682 document.readyState === "interactive" 1683 ) { 1684 addClientScript(result); 1685 } else { 1686 document.addEventListener( 1687 "DOMContentLoaded", 1688 addClientScript.bind(null, result) 1689 ); 1690 } 1691 }) 1692 .catch(error => console.error('Error:', error)); 1693 } 1694 1695 window.addEventListener('private-content-loaded', (e) => { 1696 //fetch Connecitf only at first visit or whenever cart is updated (add to cart, remove from cart, qty update) 1697 var cartSummary = 0; 1698 if (e.detail && e.detail.data && e.detail.data.cart && e.detail.data.cart.summary_count) { 1699 cartSummary = e.detail.data.cart.summary_count; 1700 } 1701 if (window.CONNECTIF_CART_SUMMARY === null || cartSummary !== window.CONNECTIF_CART_SUMMARY) { 1702 fetchConnectif(); 1703 window.CONNECTIF_CART_SUMMARY = cartSummary; 1704 } 1705 }); 1706 })(); 1707</script>
1707 1708<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 1709 contentarea" 1710 href="#contentarea"> 1711 <span> 1712 Salta al contenuto </span> 1713</a>
1714<script> 1715 function initHeader () { 1716 return { 1717 cart: {}, 1718 fixedPosition: 50, 1719 fixedClass: 'fixed-header', 1720 getData(data) { 1721 if (data.cart) { this.cart = data.cart } 1722 }, 1723 getCartItemsCountLabel() { 1724 if(this.cart && this.cart.summary_count){ 1725 return (this.cart.summary_count > 99)? '99+' : `${this.cart.summary_count}` 1726 } 1727 return '0'; 1728 }, 1729 fixedHeader() { 1730 if (window.scrollY > this.fixedPosition) { 1731 document.body.classList.add(this.fixedClass); 1732 } else { 1733 document.body.classList.remove(this.fixedClass); 1734 } 1735 }, 1736 bodyScroll(removeScroll) { 1737 const body = document.querySelector('body'); 1738 if (!document.querySelector("#maincontent > .dfd-root")) { 1739 if (removeScroll) { 1740 body.classList.add('overflow-hidden'); 1741 } else { 1742 body.classList.remove('overflow-hidden'); 1743 } 1744 } 1745 } 1746 } 1747 } 1748</script>
1748 1749<div id="header" 1750 class="relative w-full" 1751 :class="searchOpened ? '' : 'z-30'" 1752 x-data="{...initHeader(), ...{searchOpened: false}}" 1753 @live-search-state-changed.window="searchOpened = $event.detail; bodyScroll(searchOpened)" 1754 @private-content-loaded.window="getData(event.detail.data)" 1755 @scroll.window="fixedHeader()" 1756> 1757 <div class="content w-full bg-white shadow-lg border-b border-primary-darker" :class="searchOpened ? 'z-40' : ''"> 1758 <div class="container flex flex-wrap items-center justify-between w-full pt-4 mx-auto mt-0"> 1759 <!-- Logo --> 1760 <div class="order-2 flex-1 lg:flex-none w-auto"> 1761 <a class="flex items-center justify-center lg:justify-start text-xl font-medium tracking-wide text-gray-800 1762 no-underline hover:no-underline font-title " 1763 href="https://www.farma.it/" 1764 title="" 1765 aria-label="store logo"> 1766 <img src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/logo.svg" 1767 style="height: 60px;" 1768 title="" 1769 alt="" 1770 width="253" height="70" /> 1771 </a> 1772</div> 1773 1774 <!-- Main Navigation --> 1775 1776 1777<div x-data="initMenuMobile_6ac924bac94ac()" 1778 x-defer="intersect" 1779 x-intersect.once="isActive = true; $watch('open', value => { fetchData() })" 1780 class="z-20 order-1 navigation lg:hidden" 1781> 1782 <template x-if="isActive"> 1783 <div class="flex items-baseline justify-between menu-icon mr-3"> 1784 <div class="flex justify-end w-full"> 1785 <a @click="$dispatch('toggle-mobile-menu6ac924bac94ac')" 1786 class="flex items-center justify-center cursor-pointer"> 1787 <span class="bg-[#6328E035] rounded-full text-secondary p-2"> 1788 <svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 24 17.44" width="14" height="14" role="img"> 1789 <path fill="currentColor" d="M1.54 10.26a1.541 1.541 0 0 1 0-3.08h20.92a1.541 1.541 0 0 1 .08 3.08h-21ZM1.54 3.08a1.541 1.541 0 0 1 0-3.08h20.92a1.541 1.541 0 0 1 .08 3.08h-21ZM1.54 17.44a1.541 1.541 0 0 1 0-3.08h20.92a1.541 1.541 0 0 1 .08 3.08h-21Z"/> 1790<title>menu</title></svg> 1791 </span> 1792 </a> 1793 </div> 1794 </div> 1795 </template> 1796 <!-- mobile --> 1797 <template x-if="isActive"> 1798 <div @load.window="setActiveMenu($root)" 1799 class="bg-container-lighter h-screen overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full" 1800 :class="{'' : open}" 1801 @toggle-mobile-menu6ac924bac94ac.window="open = !open" 1802 @keydown.window.escape="open=false" 1803 x-cloak 1804 x-show="open" 1805 x-transition:enter="transform transition ease-in-out duration-300" 1806 x-transition:enter-start="-translate-x-full" 1807 x-transition:enter-end="translate-x-0" 1808 x-transition:leave="transform transition ease-in-out duration-300" 1809 x-transition:leave-start="translate-x-0" 1810 x-transition:leave-end="-translate-x-full"> 1811 1812 <div class="flex items-baseline justify-between menu-icon shadow-md"> 1813 <span class="font-bold font-baloo-bhaina text-primary px-4 pt-4 pb-3 w-full text-center text-xl" :class="{ 1814 'hidden' : panelLevel > 0 1815 }">Menu</span> 1816 <a @click="$dispatch('toggle-mobile-menu6ac924bac94ac')" 1817 class="absolute z-10 top-0 right-0 cursor-pointer mt-0.5 p-5 pr-4" 1818 > 1819 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12" role="img"> 1820 <path d="M21.82 24c-.58 0-1.13-.23-1.54-.64l-8.27-8.27-8.29 8.27a2.179 2.179 0 0 1-3.08-3.08L8.92 12 .64 3.73a2.19 2.19 0 0 1 0-3.09 2.172 2.172 0 0 1 3.08 0L12 8.92 20.27.64a2.19 2.19 0 0 1 3.09 0c.85.85.85 2.23 0 3.09L15.08 12l8.27 8.27c.85.85.85 2.24 0 3.09-.41.41-.96.64-1.54.64Z" style="fill:currentColor"/> 1821<title>x</title></svg> 1822 </a> 1823 </div> 1824 1825 <nav class="hidden w-full duration-150 text-base ease-in-out transform border-t transition-display border-container" 1826 :class="{ 'hidden' : !open }"> 1827 1828 1829 <div class="submenu-top mt-4"> 1830 1831<div class="level-0">
1832 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1833 :class="{ 1834 '-translate-x-full' : panelLevel > '0', 1835 'translate-x-0' : panelLevel <= '0' 1836 }"> 1837 <a href="https://www.farma.it/farma-lovers" class="level-top new-badge flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 1838 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/point.svg" alt="Raccolta Punti Farma Lovers" /> 1839 </span> 1840 <span>Raccolta Punti Farma Lovers</span> 1841 </a> </span> 1842 1843 </div> 1844 1845<div class="level-0"> 1846 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1847 :class="{ 1848 '-translate-x-full' : panelLevel > '0', 1849 'translate-x-0' : panelLevel <= '0' 1850 }"> 1851 <a href="https://www.farma.it/coupon-e-promo" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 1852 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/coupon-duotone.svg" alt="Fino al -10% sui prodotti cosmetici" /> 1853 </span> 1854 <span>Fino al -10% sui prodotti cosmetici</span> 1855 </a> </span> 1856 1857 </div> 1858 1859<div class="level-0"> 1860 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1861 :class="{ 1862 '-translate-x-full' : panelLevel > '0', 1863 'translate-x-0' : panelLevel <= '0' 1864 }"> 1865 <a href="/richiamami" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 1866 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/phone-duotone.svg" alt="Richiamami" /> 1867 </span> 1868 <span>Richiamami</span> 1869 </a> </span> 1870 1871 </div> 1872 </div> 1873 1874 <!-- LEVEL 0 --> 1875 <div class="level-0 mt-4"> 1876 <div @click="togglePanelActiveId('root')" class="flex items-center transition-transform duration-150 ease-in-out transform" 1877 :class="{ 1878 '-translate-x-full' : panelLevel > 0, 1879 'translate-x-0' : panelLevel <= 0 1880 }"> 1881 <div class="w-full cursor-pointer level-0 px-3 "> 1882 <div class="px-4 pt-3 pb-2 flex justify-between items-center text-secondary bg-tertiary-darker/10 rounded-xl"> 1883 <span class="font-bold text-lg font-baloo-bhaina"> 1884 Categorie </span> 1885 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="relative bottom-0.5" width="20" height="20" role="img"> 1886 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1887<title>chevron-right</title></svg> 1888 </div> 1889 </div> 1890 </div> 1891 <div class="absolute top-0 right-0 z-10 h-screen overflow-hidden w-full transition-transform duration-200 ease-in-out translate-x-full transform bg-container-lighter level0" 1892 :class="{ 1893 'translate-x-full h-0' : !isPanelActive('root'), 1894 'translate-x-0 h-screen overflow-y-auto' : isPanelActive('root') 1895 }" 1896 > 1897 <template x-if="isLoading && $store.externalScriptsInit"> 1898 <div class="absolute bg-white/60 z-10 h-full w-full flex items-center justify-center"> 1899 <div class="flex items-center"> 1900 <!-- loading icon --> 1901 <svg class="animate-spin h-5 w-5 text-gray-600" xmlns="http://www.w3.org/2000/svg" fill="none"
1902 viewBox="0 0 24 24"> 1903 <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> 1904 <path class="opacity-75" fill="currentColor" 1905 d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"> 1906 </path> 1907 </svg> 1908 <!-- end loading icon --> 1909 </div> 1910 </div> 1911</template> 1912 <a class="block mb-4 relative shadow-md font-bold font-baloo-bhaina text-primary px-4 pt-4 pb-3 w-full text-center text-xl bg-white" 1913 @click="removePanelActiveId('root')" 1914 :class="{ 'sticky top-0 left-0 right-0 z-20': isPanelActive('root') && panelLevel <= 1 }" 1915 > 1916 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20.57" class="absolute top-4.5 left-4" width="16" height="16" role="img"> 1917 <path d="M22.29 8.58H5.14l5.64-5.64c.65-.69.62-1.78-.07-2.43-.66-.62-1.68-.62-2.35 0L1.01 7.88C.37 8.52 0 9.39 0 10.29c0 .9.37 1.76 1.01 2.4l7.35 7.38c.68.66 1.77.64 2.43-.05.64-.67.64-1.73 0-2.39L5.15 12h17.14c.95-.02 1.7-.81 1.67-1.76-.02-.92-.76-1.65-1.67-1.67Z" style="fill:currentColor"/> 1918<title>arrow-back</title></svg> 1919 <span class="ml-4"> 1920 Categorie </span> 1921 </a> 1922 <template x-for="(item, index) in menuData" :key="item.id"> 1923 <!-- LEVEL 1 --> 1924 <div class="level-1"> 1925 <span class="flex items-center transition-transform duration-150 ease-in-out transform px-4 py-2 font-bold font-baloo-bhaina" 1926 :class="{ 1927 '-translate-x-full h-0 overflow-hidden' : panelLevel > 1, 1928 'translate-x-0' : panelLevel <= 1 1929 }" 1930 > 1931 <a x-bind:href="item.link" @click="(item.submenu && item.submenu.children) && togglePanelActiveId(item.id, $event)" class="flex items-center w-full cursor-pointer level-1"> 1932 <template x-if="item.icon"> 1933 <template x-if="item.icon_content"> 1934 <span x-html="item.icon_content" class='menu-icon mr-4 inline-block'></span> 1935 </template> 1936 <template x-if="!item.icon_content"> 1937 <span x-show="item.icon" class='menu-icon mr-4 inline-block'><img x-bind:src="item.icon" x-bind:alt="item.label" /></span> 1938 </template> 1939 </template> 1940 <span x-text="item.label"></span> 1941 </a> 1942 <template x-if="item.submenu && item.submenu.children"> 1943 <span class="block" 1944 @click="togglePanelActiveId(item.id)" 1945 > 1946 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" role="img"> 1947 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1948<title>chevron-right</title></svg> 1949 </span> 1950 </template> 1951 </span> 1952 <template x-if="item.submenu && item.submenu.children"> 1953 <div class="level1 absolute flex flex-col top-0 right-0 z-10 overflow-hidden w-full transition-transform duration-200 ease-in-out translate-x-full transform bg-container-lighter" 1954 :class="{ 1955 'translate-x-full h-0' : !isPanelActive(item.id), 1956 'translate-x-0 h-screen' : isPanelActive(item.id), 1957 'overflow-y-auto': isPanelActive(item.id) && panelLevel <= 2 1958 }" 1959 > 1960 <a class="block mb-4 relative shadow-md font-bold font-baloo-bhaina text-primary px-4 pt-4 pb-3 w-full text-center text-xl bg-white" 1961 @click="removePanelActiveId(item.id)" 1962 :class="{ 'sticky top-0 left-0 right-0 z-20': isPanelActive(item.id) && panelLevel <= 2 }" 1963 > 1964 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20.57" class="absolute top-4.5 left-4" width="16" height="16" role="img"> 1965 <path d="M22.29 8.58H5.14l5.64-5.64c.65-.69.62-1.78-.07-2.43-.66-.62-1.68-.62-2.35 0L1.01 7.88C.37 8.52 0 9.39 0 10.29c0 .9.37 1.76 1.01 2.4l7.35 7.38c.68.66 1.77.64 2.43-.05.64-.67.64-1.73 0-2.39L5.15 12h17.14c.95-.02 1.7-.81 1.67-1.76-.02-.92-.76-1.65-1.67-1.67Z" style="fill:currentColor"/> 1966<title>arrow-back</title></svg>
1967 <span class="ml-4" x-text="item.label"></span> 1968 </a> 1969 <a x-bind:href="item.link" 1970 x-bind:title="item.label" 1971 class="order-1 flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter underline text-secondary gap-1" 1972 > 1973 <span>Vedi tutti</span> 1974 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 1975 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1976<title>chevron-right</title></svg> 1977 </a> 1978 <template x-for="child in item.submenu.children"> 1979 <template x-for="(item, index) in child"> 1980 <template x-if="item.type && item.type == 'category-item'"> 1981 <!-- LEVEL 2 --> 1982 <div class="level-2" :class="{'order-0': item.type == 'custom_list', 'order-1': item.type != 'custom_list'}"> 1983 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1984 :class="{ 1985 'font-bold': item.type == 'custom_list', 1986 '-translate-x-full' : panelLevel > 2, 1987 'translate-x-0' : panelLevel <= 2 1988 }" 1989 > 1990 <a x-bind:href="item.link" @click="(item.children) && togglePanelActiveId(item.id, $event)" class="flex items-center w-full px-7 py-1 text-[15px] cursor-pointer level-2"> 1991 <span x-text="item.label"></span> 1992 </a> 1993 <template x-if="item.children"> 1994 <span class="block" 1995 @click="togglePanelActiveId(item.id)" 1996 > 1997 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="20" height="20" role="img"> 1998 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1999<title>chevron-right</title></svg> 2000 </span> 2001 </template> 2002 </span> 2003 2004 <template x-if="item.children"> 2005 <div class="level2 absolute flex flex-col top-0 right-0 z-10 overflow-hidden w-full h-full transition-transform duration-200 ease-in-out translate-x-full transform bg-container-lighter" 2006 :class="{ 2007 'translate-x-full h-0' : !isPanelActive(item.id), 2008 'translate-x-0 h-screen overflow-y-auto' : isPanelActive(item.id) 2009 }" 2010 > 2011 <a class="block mb-4 relative shadow-md font-bold font-baloo-bhaina text-primary px-4 pt-4 pb-3 w-full text-center text-xl bg-white" 2012 @click="removePanelActiveId(item.id)" 2013 :class="{ 'sticky top-0 left-0 right-0 z-20': isPanelActive(item.id) }" 2014 > 2015 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20.57" width="16" height="16" role="img"> 2016 <path d="M22.29 8.58H5.14l5.64-5.64c.65-.69.62-1.78-.07-2.43-.66-.62-1.68-.62-2.35 0L1.01 7.88C.37 8.52 0 9.39 0 10.29c0 .9.37 1.76 1.01 2.4l7.35 7.38c.68.66 1.77.64 2.43-.05.64-.67.64-1.73 0-2.39L5.15 12h17.14c.95-.02 1.7-.81 1.67-1.76-.02-.92-.76-1.65-1.67-1.67Z" style="fill:currentColor"/> 2017<title>arrow-back</title></svg> 2018 <sp
2018an class="ml-4" x-text="item.label"></span> 2019 </a> 2020 <template x-for="(item, index) in item.children" :key="index"> 2021 <template x-if="item.type && item.type != 'block'"> 2022 2023 <div class="level-3"> 2024 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2025 :class="{ 2026 '-translate-x-full' : panelLevel > 3, 2027 'translate-x-0' : panelLevel <= 3 2028 }" 2029 > 2030 <a x-bind:href="item.link" class="flex items-center w-full px-7 py-4 cursor-pointer bg-container-lighter border-container level-3"> 2031 <span x-text="item.label"></span> 2032 </a> 2033 </span> 2034 </div> 2035 2036 </template> 2037 </template> 2038 </div> 2039 </template> 2040 </div> 2041 2042 </template> 2043 </template> 2044 </template> 2045 </div> 2046 </template> 2047 </div> 2048 </template> 2049 </div> 2050 </div> 2051 2052 <div class="transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : panelLevel > 0, 'translate-x-0' : panelLevel <= 0 }"> 2053 <div class="font-bold px-7 mt-5 mb-2"> 2054 Collegamenti utili </div> 2055 2056<div class="level-0"> 2057 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2058 :class="{ 2059 '-translate-x-full' : panelLevel > '0', 2060 'translate-x-0' : panelLevel <= '0' 2061 }"> 2062 <a href="https://www.farma.it/brands" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span>Marchi</span> 2063 </a> </span> 2064 2065 </div> 2066 2067<div class="level-0"> 2068 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2069 :class="{ 2070 '-translate-x-full' : panelLevel > '0', 2071 'translate-x-0' : panelLevel <= '0' 2072 }"> 2073 <a href="/blog.html" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span>I nostri consigli</span> 2074 </a> </span> 2075 2076 </div> 2077 2078<div class="level-0"> 2079 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2080 :class="{ 2081 '-translate-x-full' : panelLevel > '0', 2082 'translate-x-0' : panelLevel <= '0' 2083 }"> 2084 <a href="https://www.farma.it/coupon-e-promo" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0">
2084 <span>Coupon</span> 2085 </a> </span> 2086 2087 </div> 2088 2089<div class="level-0"> 2090 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2091 :class="{ 2092 '-translate-x-full' : panelLevel > '0', 2093 'translate-x-0' : panelLevel <= '0' 2094 }"> 2095 <a href="/prodotti-in-offerta" class="level-top text-red flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span>In offerta</span> 2096 </a> </span> 2097 2098 </div> 2099 2100<div class="level-0"> 2101 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2102 :class="{ 2103 '-translate-x-full' : panelLevel > '0', 2104 'translate-x-0' : panelLevel <= '0' 2105 }"> 2106 <a href="/faq" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span>Serve Aiuto?</span> 2107 </a> </span> 2108 2109 </div> 2110 2111<div class="level-0"> 2112 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2113 :class="{ 2114 '-translate-x-full' : panelLevel > '0', 2115 'translate-x-0' : panelLevel <= '0' 2116 }"> 2117 <a href="/sales/guest/form" class="level-top hidden lg:inline flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span>Informazioni sul tuo ordine</span> 2118 </a> </span> 2119 2120 </div> 2121 2122<div class="level-0"> 2123 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2124 :class="{ 2125 '-translate-x-full' : panelLevel > '0', 2126 'translate-x-0' : panelLevel <= '0' 2127 }"> 2128 <a href="/farma-it-podcast" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 2129 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/tv-warning.svg" alt="Podcast" /> 2130 </span> 2131 <span>Podcast</span> 2132 </a> </span> 2133 2134 </div> 2135 2136<div class="level-0"> 2137 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2138 :class="{ 2139 '-translate-x-full' : panelLevel > '0', 2140 'translate-x-0' : panelLevel <= '0' 2141 }"> 2142 <a href="/app" class="level-top text-secondary font-medium flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span>Scarica l'App!</span> 2143 </a> </span> 2144 2145 </div> 2146 2147 <!-- BLOCK customer-menu-mobile --> 2148<div class="w-full px-3 my-3" x-data="initCustomerMenuMobile()" @private-content-loaded.window="getData(event.detail.data)"> 2149 <template x-if="isLoggedIn()"> 2150 <a 2151 href="https://www.farma.it/customer/account/" 2152 id="customer-menu-mobile" 2153 class="px-4 pt-3 pb-2 flex justify-start gap-3 items-center bg-category-lighter rounded-xl" 2154 aria-label="Il mio Account" 2155 > 2156 <span class="relative block"> 2157 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true"> 2158 <path d="M4.07 21c-.07-.05-.13-.1-.19-.17C-1 16.35-1.32 8.76 3.16 3.87c4.48-4.88 12.07-5.2 16.95-.72 4.88 4.48 5.21 12.07.73 16.96-.23.25-.47.49-.73.73-.05.06-.12.12-.19.17-4.53 4-11.32 4-15.85 0ZM12 22.15c2.25 0 4.44-.75 6.22-2.13a7.354 7.354 0 0 0-6.14-3.4h-.16c-2.49.02-4.8 1.3-6.14 3.4 1.78 1.39 3.97 2.14 6.22 2.13Zm4.83-6.02c1.09.67 2.03 1.56 2.76 2.61 3.73-4.19 3.35-10.61-.84-14.33C14.56.68 8.14 1.06 4.42 5.25 1 9.1 1 14.9 4.42 18.74a9.2 9.2 0 0 1 4.16-3.31 5.546 5.546 0 0 1-.93-7.78 5.546 5.546 0 0 1 7.78-.93 5.546 5.546 0 0 1 0 8.71c.49.19.96.43 1.4.7Zm-8.52-5.06c0 2.01 1.61 3.65 3.62 3.69h.15A3.694 3.694 0 0 0 15.7 11a3.694 3.694 0 0 0-3.76-3.62 3.692 3.692 0 0 0-3.62 3.69Z" style="fill:currentColor"/> 2159</svg> 2160 </span>
2161 <span class="font-bold text-lg font-baloo-bhaina truncate"> 2162 <span>Ciao, </span> 2163 <span x-text="customer.firstname"></span> 2164 </span> 2165 <span class="relative bottom-0.5 whitespace-nowrap block ml-auto text-[15px] font-medium">Il mio Account</span> 2166 </a> 2167 </template> 2168 <template x-if="!isLoggedIn()"> 2169 <span> 2170 <a 2171 href="https://www.farma.it/customer/account/" 2172 id="customer-menu-mobile" 2173 class="px-4 py-3 flex justify-between gap-3 items-center bg-category-lighter rounded-xl" 2174 aria-label="Il mio Account" 2175 > 2176 <span class="relative block"> 2177 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true"> 2178 <path d="M4.07 21c-.07-.05-.13-.1-.19-.17C-1 16.35-1.32 8.76 3.16 3.87c4.48-4.88 12.07-5.2 16.95-.72 4.88 4.48 5.21 12.07.73 16.96-.23.25-.47.49-.73.73-.05.06-.12.12-.19.17-4.53 4-11.32 4-15.85 0ZM12 22.15c2.25 0 4.44-.75 6.22-2.13a7.354 7.354 0 0 0-6.14-3.4h-.16c-2.49.02-4.8 1.3-6.14 3.4 1.78 1.39 3.97 2.14 6.22 2.13Zm4.83-6.02c1.09.67 2.03 1.56 2.76 2.61 3.73-4.19 3.35-10.61-.84-14.33C14.56.68 8.14 1.06 4.42 5.25 1 9.1 1 14.9 4.42 18.74a9.2 9.2 0 0 1 4.16-3.31 5.546 5.546 0 0 1-.93-7.78 5.546 5.546 0 0 1 7.78-.93 5.546 5.546 0 0 1 0 8.71c.49.19.96.43 1.4.7Zm-8.52-5.06c0 2.01 1.61 3.65 3.62 3.69h.15A3.694 3.694 0 0 0 15.7 11a3.694 3.694 0 0 0-3.76-3.62 3.692 3.692 0 0 0-3.62 3.69Z" style="fill:currentColor"/> 2179</svg> 2180 </span> 2181 <span class="label font-medium text-[15px]"> 2182 <span>Accedi / Registrati</span> 2183 </span> 2184 </a> 2185 </span> 2186 </template> 2187</div> 2188<!-- /BLOCK customer-menu-mobile --> 2189 <div class="font-bold px-7 mt-5 mb-2"> 2190 Servizi clienti </div> 2191 <div class="submenu-bottom mb-4"> 2192 2193<div class="level-0"> 2194 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2195 :class="{ 2196 '-translate-x-full' : panelLevel > '0', 2197 'translate-x-0' : panelLevel <= '0' 2198 }"> 2199 <a href="faq" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 2200 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/information-circle.svg" alt="Serve aiuto?" /> 2201 </span> 2202 <span>Serve aiuto?</span> 2203 </a> </span> 2204 2205 </div> 2206 2207<div class="level-0"> 2208 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2209 :class="{ 2210 '-translate-x-full' : panelLevel > '0', 2211 'translate-x-0' : panelLevel <= '0' 2212 }"> 2213 <a href="https://www.farma.it/contattaci" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 2214 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/chat.svg" alt="Contattaci" /> 2215 </span> 2216 <span>Contattaci</span> 2217 </a> </span> 2218 2219 </div> 2220 2221<div class="level-0"> 2222 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2223 :class="{ 2224 '-translate-x-full' : panelLevel > '0', 2225 'translate-x-0' : panelLevel <= '0' 2226 }"> 2227 <a href="sales/guest/form" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 2228 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/tracking.svg" alt="Traccia il tuo pacco" /> 2229 </span>
2230 <span>Traccia il tuo pacco</span> 2231 </a> </span> 2232 2233 </div> 2234 2235<div class="level-0"> 2236 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2237 :class="{ 2238 '-translate-x-full' : panelLevel > '0', 2239 'translate-x-0' : panelLevel <= '0' 2240 }"> 2241 <a href="https://www.farma.it/pagamenti-e-condizioni" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 2242 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/credit-card.svg" alt="Pagamenti" /> 2243 </span> 2244 <span>Pagamenti</span> 2245 </a> </span> 2246 2247 </div> 2248 2249<div class="level-0"> 2250 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2251 :class="{ 2252 '-translate-x-full' : panelLevel > '0', 2253 'translate-x-0' : panelLevel <= '0' 2254 }"> 2255 <a href="https://www.farma.it/spedizioni" class="level-top flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter border-container level-0"> <span class='menu-icon mr-2'> 2256 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/truck.svg" alt="Spedizioni" /> 2257 </span> 2258 <span>Spedizioni</span> 2259 </a> </span> 2260 2261 </div> 2262 </div> 2263 </div> 2264 2265 2266 </nav> 2267 </div> 2268 </template> 2269</div> 2270
2271<script> 2272 'use strict'; 2273 2274 const initMenuMobile_6ac924bac94ac = () => { 2275 return { 2276 open: false, 2277 isActive: false, 2278 isLoaded: false, 2279 mobilePanelActiveId: [], 2280 panelLevel: 0, 2281 menuData: null, 2282 isLoading: false, 2283 currentUrl: window.location.href.split('?')[0], 2284 isPanelActive(id){ 2285 return this.mobilePanelActiveId.includes(id); 2286 }, 2287 setPanelActiveId(id, replace = false){ 2288 if(replace){ 2289 this.clearPanelActiveId(); 2290 } 2291 if(!this.isPanelActive(id)) 2292 this.mobilePanelActiveId.push(id); 2293 id && (this.panelLevel += 1); 2294 }, 2295 removePanelActiveId(id){ 2296 let i = this.mobilePanelActiveId.indexOf(id); 2297 if(i >= 0) 2298 this.mobilePanelActiveId.splice(i, 1); 2299 this.panelLevel -= 1; 2300 }, 2301 togglePanelActiveId(id, event){ 2302 if(event) 2303 event.preventDefault(); 2304 if(this.isPanelActive(id)) 2305 this.removePanelActiveId(id); 2306 else 2307 this.setPanelActiveId(id); 2308 }, 2309 clearPanelActiveId(){ 2310 this.mobilePanelActiveId =[]; 2311 }, 2312 hasSubmenu(item){ 2313 return item.submenu; 2314 },
2315 setActiveMenu(menuNode) { 2316 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2317 return link.href === window.location.href.split('?')[0]; 2318 }).map(item => { 2319 this.addClassToParent(item); 2320 }); 2321 }, 2322 addClassToParent(item){ 2323 if(item) { 2324 item.classList.add('underline') 2325 parent = item.closest(`div.class-${this.panelLevel - 1}`) 2326 parent && (parent !== item) && this.addClassToParent(parent.querySelector('span > a')); 2327 } 2328 }, 2329 dispatchMessage(type, message, timeout) { 2330 typeof window.dispatchMessages && window.dispatchMessages( 2331 [{ 2332 type: type, 2333 text: message, 2334 }], 2335 timeout 2336 ); 2337 }, 2338 fetchData(){ 2339 this.$dispatch('screen-lock',this.open); 2340 this.isLoaded = true; 2341 if (!this.menuData && this.open) { 2342 this.isLoading = true; 2343 fetch( 2344 'https://www.farma.it/megamenu/get/json/id/1/limit/0/level/2/', 2345 { 2346 headers: {contentType: 'application/json'}, 2347 } 2348 ).then(response => { 2349 if (response.ok) { 2350 return response.json(); 2351 } else { 2352 this.dispatchMessage('error', response); 2353 console.warn("GET request failed", response); 2354 } 2355 }) 2356 .then(data => { 2357 this.menuData = data; 2358 this.isLoading = false; 2359 this.$nextTick(() => { 2360 this.setActiveMenu(this.$root); 2361 }); 2362 }); 2363 } 2364 } 2365 } 2366 } 2367</script>
2367 2368 2369 2370<nav class="hidden hierarchy"> 2371 <li><a href='https://www.farma.it/rimedi-e-salute.html'>Rimedi e Salute</a><ul><li><a href='https://www.farma.it/rimedi-e-salute/immunologici.html'>Immunologici</a></li><li><a href='https://www.farma.it/rimedi-e-salute/antiparassitari-insetticidi-e-repellenti.html'>Antiparassitari, Insetticidi e Repellenti</a></li><li><a href='https://www.farma.it/rimedi-e-salute/mal-di-testa-0.html'>Dolore, Febbre e Infiammazioni</a></li><li><a href='https://www.farma.it/rimedi-e-salute/antimicrobici.html'>Antimicrobici</a></li><li><a href='https://www.farma.it/rimedi-e-salute/preparati-ormonali.html'>Preparati Ormonali</a></li><li><a href='https://www.farma.it/rimedi-e-salute/antiacne.html'>Antiacne</a></li><li><a href='https://www.farma.it/rimedi-e-salute/decongestionanti-nasali.html'>Influenza e Raffreddore</a></li><li><a href='https://www.farma.it/rimedi-e-salute/decongestionanti-ed-antinfiammatori.html'>Occhi</a></li><li><a href='https://www.farma.it/rimedi-e-salute/emorroidi-e-ragadi.html'>Stomaco e Intestino</a></li><li><a href='https://www.farma.it/rimedi-e-salute/igiene-orale.html'>Igiene Orale</a></li><li><a href='https://www.farma.it/rimedi-e-salute/sali-minerali.html'>Sali minerali</a></li><li><a href='https://www.farma.it/rimedi-e-salute/cicatrizzanti.html'>Cicatrizzanti</a></li><li><a href='https://www.farma.it/rimedi-e-salute/sistema-cardiovascolare.html'>Sistema Cardiovascolare</a></li><li><a href='https://www.farma.it/rimedi-e-salute/stitichezza-e-lassativi.html'>Stitichezza e Lassativi</a></li><li><a href='https://www.farma.it/rimedi-e-salute/dermatologici.html'>Dermatologici</a></li><li><a href='https://www.farma.it/rimedi-e-salute/antisettici-cavo-orale.html'>Antisettici cavo orale</a></li><li><a href='https://www.farma.it/rimedi-e-salute/anti-diarrea.html'>Anti Diarrea</a></li><li><a href='https://www.farma.it/rimedi-e-salute/disinfettanti.html'>Disinfettanti</a></li><li><a href='https://www.farma.it/rimedi-e-salute/altri-disturbi.html'>Altri Disturbi</a></li><li><a href='https://www.farma.it/rimedi-e-salute/antimicotici.html'>Antimicotici</a></li><li><a href='https://www.farma.it/rimedi-e-salute/allergie.html'>Allergie</a></li><li><a href='https://www.farma.it/rimedi-e-salute/antiacidi-e-digestivi.html'>Antiacidi e Digestivi</a></li><li><a href='https://www.farma.it/rimedi-e-salute/disturbi-addominali.html'>Disturbi Addominali</a></li><li><a href='https://www.farma.it/rimedi-e-salute/controllo-del-peso.html'>Controllo del Peso</a></li><li><a href='https://www.farma.it/rimedi-e-salute/genito-urinario.html'>Genito-Urinario</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/veterinaria-e-animali.html'>Veterinaria e animali</a><ul><li><a href='https://www.farma.it/veterinaria-e-animali/antiparassitari.html'>Antiparassitari</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/toelettatura-e-igiene.html'>Toelettatura e Igiene</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/alimentazione.html'>Alimentazione cani, gatti ed altri animali domestici</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/medicazioni.html'>Medicazioni Veterinarie</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/accessori-0.html'>Accessori</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/integratori-e-parafarmaci.html'>Integratori e Parafarmaci Veterinari</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/alimentazione-0.html'>Alimentazione</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/medicazioni-0.html'>Medicazioni</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/integratori-e-parafarmaci-0.html'>Integratori e Parafarmaci</a></li><li><a href='https://www.farma.it/veterinaria-e-animali/abbigliamento.html'>Abbigliamento</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/omeopatia-0.html'>Omeopatia</a><ul><li><a href='https://www.farma.it/omeopatia-0/gocce.html'>Gocce</a></li><li><a href='https://www.farma.it/omeopatia-0/granuli.html'>Granuli</a></li><li><a href='https://www.farma.it/omeopatia-0/globuli.html'>Globuli</a></li><li><a href='https://www.farma.it/omeopatia-0/creme-e-unguenti.html'>Creme e Unguenti</a></li><li><a href='https://www.farma.it/omeopatia-0/sciroppi.html'>Sciroppi</a></li><li><a href='https://www.farma.it/omeopatia-0/fiale.html'>Fiale</a></li><li><a href='https://www.farma.it/omeopatia-0/colliri-0.html'>Colliri</a></li><li><a href='https://www.farma.it/omeopatia-0/spray.html'>Spray</a></li><li><a href='https://www.farma.it/omeopatia-0/altri-preparati.html'>Preparati omeopatici</a></li><li><a href='https://www.farma.it/omeopatia-0/confetti-e-capsule.html'>Confetti e Capsule</a></li><li><a href='https://www.farma.it/omeopatia-0/polveri.html'>Polveri</a></li><li><a href='https://www.farma.it/omeopatia-0/supposte.html'>Supposte</a></li><li><a href='https://www.farma.it/omeopatia-0/olii.html'>Olii</a></li><li><a href='https://www.farma.it/omeopatia-0/ovuli.html'>Ovuli</a></li><li><a href='https://www.farma.it/omeopatia-0/bioterapici.html'>Bioterapici</a></li><li><a href='https://www.farma.it/omeopatia-0/altro.html'>Altro</a></li><li><a href='https://www.farma.it/omeopatia-0/altri-preparati-1.html'>Altri preparati</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/erboristeria-e-fitoterapia.html'>Erboristeria e Fitoterapia</a><ul><li><a href='https://www.farma.it/erboristeria-e-fitoterapia/floriterapia.html'>Floriterapia</a></li><li><a href='https://www.farma.it/erboristeria-e-fitoterapia/cosmetici-naturali.html'>Cosmetici Naturali</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/alimentazione-e-integratori.html'>Alimentazione e Integratori</a><ul><li><a href='https://www.farma.it/alimentazione-e-integratori/integratori-alimentari.html'>Integratori Alimentari</a></li><li><a href='https://www.farma.it/alimentazione-e-integratori/alimentazione-speciale.html'>Alimentazione Speciale</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/igiene-e-benessere.html'>Igiene e Benessere</a><ul><li><a href='https://www.farma.it/igiene-e-benessere/igiene-intima.html'>Igiene intima</a></li><li><a href='https://www.farma.it/igiene-e-benessere/bocca-e-denti.html'>Bocca e Denti</a></li><li><a href='https://www.farma.it/igiene-e-benessere/capelli.html'>Capelli</a></li><li><a href='https://www.farma.it/igiene-e-benessere/naso.html'>Naso</a></li><li><a href='https://www.farma.it/igiene-e-benessere/corpo-0.html'>Corpo</a></li><li><a href='https://www.farma.it/igiene-e-benessere/anti-zanzare-e-insetti.html'>Anti zanzare e insetti</a></li><li><a href='https://www.farma.it/catalog/category/view/s/strumenti-sanitari/id/162/'>Strumenti Sanitari</a></li><li><a href='https://www.farma.it/igiene-e-benessere/prodotti-per-la-casa.html'>Prodotti per la casa</a></li><li><a href='https://www.farma.it/igiene-e-benessere/orecchie.html'>Orecchie</a></li><li><a href='https://www.farma.it/igiene-e-benessere/igiene-orale-0.html'>Igiene Orale</a></li><li><a href='https://www.farma.it/igiene-e-benessere/amplificatori-acustici.html'>Amplificatori acustici</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/bellezza-e-cosmetica.html'>Bellezza e Cosmetica</a><ul><li><a href='https://www.farma.it/bellezza-e-cosmetica/corpo.html'>Corpo</a></li><li><a href='https://www.farma.it/bellezza-e-cosmetica/viso.html'>Viso</a></li><li><a href='https://www.farma.it/bellezza-e-cosmetica/piedi.html'>Piedi</a></li><li><a href='https://www.farma.it/bellezza-e-cosmetica/mani.html'>Mani</a></li><li><a href='https://www.farma.it/bellezza-e-cosmetica/capelli-0.html'>Capelli</a></li><li><a href='https://www.farma.it/bellezza-e-cosmetica/solari.html'>Solari</a></li><li><a href='https://www.farma.it/bellezza-e-cosmetica/trucco-e-make-up.html'>Trucco e Make-Up</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/salute-e-cura-della-persona.html'>Salute e Cura della Persona</a><ul><li><a href='https://www.farma.it/salute-e-cura-della-persona/prodotti-per-gli-occhi.html'>Prodotti per gli occhi</a></li><li><a href='https://www.farma.it/salute-e-cura-della-persona/ortopedia-e-comfort.html'>Ortopedia e Comfort</a></li><li><a href='https://www.farma.it/salute-e-cura-della-persona/medicazioni-e-disinfettanti.html'>Medicazioni e Disinfettanti</a></li><li><a href='https://www.farma.it/salute-e-cura-della-persona/diagnostici.html'>Diagnostici</a></li><li><a href='https://www.farma.it/salute-e-cura-della-persona/profilattici.html'>Profilattici</a></li><li><a href='https://www.farma.it/salute-e-cura-della-persona/decongestionanti-nasali-0.html'>Decongestionanti Nasali</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/mamme-e-bambini.html'>Mamme e Bambini</a><ul><li><a href='https://www.farma.it/mamme-e-bambini/igiene-del-bambino.html'>Igiene del Bambino</a></li><li><a href='https://www.farma.it/mamme-e-bambini/alimentazione-ed-integrazione.html'>Alimentazione ed Integrazione</a></li><li><a href='https://www.farma.it/mamme-e-bambini/accessori.html'>Accessori</a></li><li><a href='https://www.farma.it/mamme-e-bambini/alimentazione-del-bambino.html'>Alimentazione del bambino</a></li><li><a href='https://www.farma.it/mamme-e-bambini/giochi.html'>Giochi</a></li></ul><ul></ul></li><li><a href='https://www.farma.it/apparecchi-elettromedicali.html'>Apparecchi Elettromedicali</a><ul><li><a href='https://www.farma.it/apparecchi-elettromedicali/aerosol-0.html'>Aerosol e accessori</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/termometri.html'>Termometri</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/sfigmomanometri.html'>Sfigmomanometri</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/terapia-termica.html'>Terapia termica</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/fisioterapia-e-massaggi.html'>Fisioterapia e Massaggi</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/altri.html'>Altri</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/bilance.html'>Bilance</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/dispositivi-medicali.html'>Dispositivi Medicali</a></li><li><a href='https://www.farma.it/apparecchi-elettromedicali/aerosol-1.html'>Aerosol</a></li></ul></li><li><a href='https://www.farma.it/dermocosmetica'>Dermocosmetica</a></li><li><a href='https://www.farma.it/gastro-intestinale'>Benessere intestinale</a></li></nav> 2372 2373<div x-data="initMenuDesktop_6ac924bad7544()" 2374 x-defer="intersect" 2375 x-intersect.once="isActive = true; $watch('open', value => { fetchData() })" 2376 class="order-5 navigation first hidden lg:flex w-full main lg:mt-3" 2377 :class="{ 'z-20': open }" 2378> 2379 <!-- desktop --> 2380 <div x-ref="nav-desktop" 2381 @load.window="setActiveMenu($root)" 2382 class="hidden lg:block lg:relative lg:min-h-0 lg:w-auto"> 2383 <nav class="w-full duration-150 ease-in-out transform flex justify-start w-auto min-h-0 transition-display my-2"> 2384 <div class="mr-6 level-top nav-side">
2385 <span class="level-top py-3 md:py-0 w-full font-bold level-0 cursor-pointer flex items-center gap-2" @click="$dispatch('toggle-main-menu')"> 2386 <span class="bg-[#6328E035] rounded-full text-secondary p-1.5"> 2387 <svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 24 17.44" width="12" height="12" role="img"> 2388 <path fill="currentColor" d="M1.54 10.26a1.541 1.541 0 0 1 0-3.08h20.92a1.541 1.541 0 0 1 .08 3.08h-21ZM1.54 3.08a1.541 1.541 0 0 1 0-3.08h20.92a1.541 1.541 0 0 1 .08 3.08h-21ZM1.54 17.44a1.541 1.541 0 0 1 0-3.08h20.92a1.541 1.541 0 0 1 .08 3.08h-21Z"/> 2389<title>menu</title></svg> 2390 </span> 2391 <span class="my-auto">Categorie</span> 2392 </span> 2393 </div> 2394 <div class="nav-menu flex"> 2395 2396<div class="relative mx-2 level-0 level0 nav-1 first page-item level-top"> 2397 <a href="https://www.farma.it/brands" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 "> <span class="leading-none">Marchi</span> 2398 </a> 2399 </div> 2400 2401<div class="relative mx-2 level-0 level0 nav-2 custom-item level-top"> 2402 <a href="/blog.html" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 "> <span class="leading-none">I nostri consigli</span> 2403 </a> 2404 </div> 2405 2406<div class="relative mx-2 level-0 level0 nav-3 page-item level-top"> 2407 <a href="https://www.farma.it/coupon-e-promo" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 "> <span class="leading-none">Coupon</span> 2408 </a> 2409 </div> 2410 2411<div class="relative mx-2 level-0 level0 nav-4 custom-item level-top"> 2412 <a href="/prodotti-in-offerta" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 text-red"> <span class="leading-none">In offerta</span> 2413 </a> 2414 </div> 2415 2416<div class="relative mx-2 level-0 level0 nav-5 custom-item level-top"> 2417 <a href="/faq" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 "> <span class="leading-none">Serve Aiuto?</span> 2418 </a> 2419 </div> 2420 2421<div class="relative mx-2 level-0 level0 nav-6 custom-item level-top"> 2422 <a href="/sales/guest/form" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 hidden lg:inline"> <span class="leading-none">Informazioni sul tuo ordine</span> 2423 </a> 2424 </div> 2425 2426<div class="relative mx-2 level-0 level0 nav-7 custom-item level-top"> 2427 <a href="/farma-it-podcast" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 "> 2428<span class="menu-icon flex gap-2 items-center relative"> 2429 <?xml version="1.0" encoding="UTF-8"?> 2430<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" stroke-width="1.5" viewBox="0 0 24 24" fill="none" color="#000000" class="fill-primary"><path d="M12 11V14" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M12 18.01L12.01 17.9989" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M2 20V9C2 7.89543 2.89543 7 4 7H20C21.1046 7 22 7.89543 22 9V20C22 21.1046 21.1046 22 20 22H4C2.89543 22 2 21.1046 2 20Z" stroke="#000000" stroke-width="1.5"/><path d="M8.5 2.5L12 6L15.5 2.5" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg> 2431 <span class="leading-none">Podcast</span> 2432 </a> 2433 </div> 2434 2435<div class="relative mx-2 level-0 level0 nav-8 last custom-item level-top"> 2436 <a href="/app" class="py-3 md:py-0 flex w-full text-base md:text-sm md:inline hover:underline level-0 text-secondary font-medium"> <span class="leading-none">Scarica l'App!</span> 2437 </a> 2438 </div> 2439 </div> 2440 </nav> 2441 </div> 2442 <template x-if="isActive"> 2443 <section x-cloak id="main-menu_6ac924bad7544" 2444 @toggle-main-menu.window="open = !open" 2445 @keydown.window.escape="open=false" 2446 > 2447 <div role="dialog" 2448 x-ref="dialog" 2449 aria-label="Menu" 2450 aria-labelledby="menu-drawer-title" 2451 aria-modal="true" 2452 class="fixed inset-y-0 left-0 z-30 flex"> 2453 <div class="relative z-20 w-screen" 2454 x-ref="dialogContainer" 2455 x-show="open" 2456 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 2457 x-transition:enter-start="-translate-x-full" 2458 x-transition:enter-end="translate-x-0" 2459 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 2460 x-transition:leave-start="translate-x-0" 2461 x-transition:leave-end="-translate-x-full" 2462 > 2463 <div class="flex flex-col h-full pb-6 bg-container-gray shadow-inner"> 2464 <template x-if="isLoading && $store.externalScriptsInit"> 2465 <div class="absolute bg-white/60 z-10 h-full w-full flex items-center justify-center"> 2466 <div class="flex items-center"> 2467 <!-- loading icon --> 2468 <svg class="animate-spin h-5 w-5 text-gray-600" xmlns="http://www.w3.org/2000/svg" fill="none"
2469 viewBox="0 0 24 24"> 2470 <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> 2471 <path class="opacity-75" fill="currentColor" 2472 d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"> 2473 </path> 2474 </svg> 2475 <!-- end loading icon --> 2476 </div> 2477 </div> 2478</template> 2479 <div x-ref="dialogContent" class="h-full overflow-y-auto scrollbar scrollbar-thin scrollbar-track-transparent scrollbar-thumb-gray-3 w-full"> 2480 <template x-cloak x-for="(item, index) in menuData" :key="index"> 2481 <div class="level-1" :class="item.classes" @click="onMouseEnter(item, null, true)"> 2482 <div class="block px-6 w-full py-3 text-base hover:text-secondary hover:bg-tertiary-darker/10 hover:fill-primary font-bold cursor-pointer" 2483 :class="[ item.classes? item.classes.join(' '): '', isPanelActive(item.id)? 'fill-primary bg-tertiary-darker/10' : '']" 2484 :style="{ color: item.color }" 2485 > 2486 <div class="ml-auto w-full max-w-[246px] flex items-center"> 2487 <template x-if="item.icon"> 2488 <template x-if="item.icon_content"> 2489 <span x-html="item.icon_content" class='menu-icon mr-2.5 inline-block'></span> 2490 </template> 2491 <template x-if="!item.icon_content"> 2492 <span x-show="item.icon" class='menu-icon mr-2.5 inline-block'><img x-bind:src="item.icon" x-bind:alt="item.label" /></span> 2493 </template> 2494 </template> 2495 <span x-text="item.label"></span> 2496 <template x-if="hasSubmenu(item)"> 2497 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.24 24" class="ml-auto" width="12" height="12" role="img"> 2498 <path d="M1.08 23.87C.43 23.61.01 22.99 0 22.29c0-.46.18-.89.51-1.21l7.62-7.52c.86-.85.87-2.23.03-3.09l-.03-.03L.52 2.93C-.15 2.27-.16 1.2.5.53L.52.51C1.2-.17 2.29-.17 2.97.5l7.6 7.51c2.2 2.17 2.23 5.7.06 7.91l-.06.06-7.61 7.52a1.766 1.766 0 0 1-1.89.37Z" style="fill:currentColor"/> 2499<title>arrow-right</title></svg> 2500 </template> 2501 </div> 2502 </div> 2503 <template x-if="hasSubmenu(item)"> 2504 <template x-teleport="#main-menu-second-level_6ac924bad7544" x-data="{ submenu: item.submenu, item: item}"> 2505 <div class="absolute top-0 left-0 h-[calc(100vh-100px)] z-10 px-6 py-2 pb-16 bg-white shadow-lg level1" 2506 x-init="$watch('open',(value, oldValue) => { !value && clearPanelActiveId() })" 2507 :class="[ open? 'grid' : 'hidden', (submenu.l || submenu.r)? 'w-11/12 xl:w-4/5 2xl:w-8/12 grid-cols-5' : ((submenu.children && submenu.children.length > 1)? 'grid-cols-2 max-w-full' : 'min-w-[320px]') ]" 2508 x-show="isPanelActive(item.id)" 2509 x-transition:enter="transform transition ease-in-out duration-300" 2510 x-transition:enter-start="-translate-x-full" 2511 x-transition:enter-end="translate-x-0" 2512 x-transition:leave="transform transition ease-in-out duration-300" 2513 x-transition:leave-start="translate-x-0" 2514 x-transition:leave-end="-translate-x-full" 2515 > 2516 <template x-if="submenu.t"> 2517 <div class="top_block column"> 2518 <div class="column-content" x-html="submenu.t"></div> 2519 </div> 2520 </template> 2521 <template x-if="submenu.l"> 2522 <div class="left_block column"> 2523 <div class="column-content" x-html="submenu.l"></div> 2524 </div> 2525 </template> 2526 2527 <template x-if="submenu.children" x-data="{ children: submenu.children }"> 2528 <div class="column main-column pb-16 pt-0.5 h-full overflow-y-auto scrollbar scrollbar-thin scrollbar-track-transparent scrollbar-thumb-gray-3" 2529 :class="{ 'col
2529-span-3 flex gap-2': ((!submenu.r && submenu.l) || (!submenu.l && submenu.r)) || (submenu.children && submenu.children.length > 1) }" 2530 > 2531 <template x-for="(column,y) in children" :key="y"> 2532 <div :class="{ 'w-[210px] xl:w-[240px]' : y != children.length - 1, 'w-[210px] xl:w-[317px]': y == children.length - 1 }"> 2533 <template x-if="item.label && y == 0"> 2534 <div class="flex justify-between gap-3"> 2535 <span class="font-bold text-primary mb-3 block" x-text="item.label"></span> 2536 <a x-bind:href="item.link" class="hover:underline text-sm text-secondary flex items-center gap-1 -top-1.5 relative"> 2537 <span class="leading-none">Vedi tutti</span> 2538 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" role="img"> 2539 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 2540<title>chevron-right</title></svg> 2541 </a> 2542 </div> 2543 </template> 2544 <template x-if="column.label && y != 0"> 2545 <span class="font-bold text-primary mb-3 block" x-text="column.label"></span> 2546 </template> 2547 <template x-if="column.html"> 2548 <div x-html="column.html"></div> 2549 </template> 2550 <template x-if="!column.html"> 2551 <template x-for="(child, i) in column" :key="i"> 2552 <div class="relative block w-full"> 2553 <template x-if="child.type == 'header'"> 2554 <div class="font-bold text-primary mb-3 block" x-text="child.label"></div> 2555 </template> 2556 <template x-if="child.type != 'header'"> 2557 <template x-if="child.type != 'custom_list'"> 2558 <div class="relative block w-full py-0.5 my-0.5" :class="child.classes"> 2559 <template x-if="child.html"> 2560 <div x-html="child.html"></div> 2561 </template> 2562 <template x-if="!child.html && child.type != 'custom_list'"> 2563 <a x-bind:href="child.link" class="hover:underline text-sm"> 2564 <span x-text="child.label"></span> 2565 </a> 2566 </template> 2567 </div> 2568 </template> 2569 <template x-if="child.type == 'custom_list'"> 2570 <div class="brand-list"> 2571 <sp
2571an class="font-bold text-primary mb-4 block" x-text="child.label"></span> 2572 <template x-for="(brand, i) in child.children" :key="i"> 2573 <div class="relative block w-full py-0.5 mt-0.5 brand-item"> 2574 <a x-bind:href="brand.link" class="hover:underline"> 2575 <span x-text="brand.label"></span> 2576 </a> 2577 </div> 2578 </template> 2579 </div> 2580 </template> 2581 </template> 2582 </div> 2583 </template> 2584 </template> 2585 </div> 2586 </template> 2587 </div> 2588 </template> 2589 2590 <template x-if="submenu.r"> 2591 <div class="right_block column -my-2 -mr-5 overflow-auto h-[calc(100vh-100px)] scrollbar scrollbar-thin scrollbar-track-transparent scrollbar-thumb-gray-3" 2592 x-show="isPanelActive(item.id)" 2593 :class="(submenu.children && submenu.children.length < 1)? 'col-span-3' : 'col-span-2'" 2594 x-transition:enter="ease-in-out duration-700" 2595 x-transition:enter-start="opacity-0" 2596 x-transition:enter-end="opacity-100" 2597 x-transition:leave="ease-in-out duration-100" 2598 x-transition:leave-start="opacity-100" 2599 x-transition:leave-end="opacity-0" 2600 > 2601 <div class="column-content" x-html="submenu.r"></div> 2602 </div> 2603 2604 2605 </template> 2606 <template x-if="submenu.b"> 2607 <div class="bottom_block column"> 2608 <div class="column-content" x-html="submenu.b"></div> 2609 </div> 2610 </template> 2611 </div> 2612 </template> 2613 </template> 2614 </div> 2615 </template> 2616 </div> 2617 </div> 2618 </div> 2619 <div id="main-menu-second-level_6ac924bad7544" class="relative z-10 w-screen h-[calc(100vh-100px)]" 2620 x-show="open"> 2621 <div class="backdrop" 2622 x-ref="backdrop" 2623 x-show="open" 2624 x-transition:enter="ease-in-out duration-500" 2625 x-transition:enter-start="opacity-0" 2626 x-transition:enter-end="opacity-100" 2627 x-transition:leave="ease-in-out duration-500" 2628 x-transition:leave-start="opacity-100" 2629 x-transition:leave-end="opacity-0" 2630 @click="open=false" 2631 aria-label="Close panel"></div> 2632 </div> 2633 </div> 2634 </section> 2635 </template> 2636</div> 2637
2638<script> 2639 'use strict'; 2640 2641 const initMenuDesktop_6ac924bad7544 = () => { 2642 return { 2643 isActive: false, 2644 open: false, 2645 hoverPanelActiveId: [], 2646 menuData: null, 2647 isLoading: false, 2648 currentUrl: window.location.href.split('?')[0], 2649 panelLevel: 0, 2650 isPanelActive(id){ 2651 return this.hoverPanelActiveId.includes(id); 2652 }, 2653 setPanelActiveId(id, replace = false){ 2654 if(replace){ 2655 this.clearPanelActiveId(); 2656 } 2657 if(!this.isPanelActive(id)) 2658 this.hoverPanelActiveId.push(id); 2659 }, 2660 removePanelActiveId(id){ 2661 let i = this.hoverPanelActiveId.indexOf(id); 2662 if(i >= 0) 2663 this.hoverPanelActiveId.splice(i, 1); 2664 }, 2665 clearPanelActiveId(){ 2666 this.hoverPanelActiveId =[]; 2667 }, 2668 onMouseEnter(item, id = null, clear = false){ 2669 if(this.hasSubmenu(item)){ 2670 this.setPanelActiveId(id? id : item.id, clear); 2671 }else{ 2672 this.clearPanelActiveId(); 2673 } 2674 }, 2675 hasSubmenu(item){ 2676 return item.submenu; 2677 },
2678 setActiveMenu(menuNode) { 2679 return; // ignoriamo questa funzionalità per questo progetto 2680 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2681 return (link.href) && link.href === this.currentUrl; 2682 }).map(item => { 2683 item.classList.add('underline'); 2684 item.closest('div.level1') && 2685 item.closest('div.level1').querySelector('a').classList.add('underline'); 2686 }); 2687 }, 2688 dispatchMessage(type, message, timeout) { 2689 typeof window.dispatchMessages && window.dispatchMessages( 2690 [{ 2691 type: type, 2692 text: message, 2693 }], 2694 timeout 2695 ); 2696 }, 2697 setMenuStyles () { 2698 let header = document.querySelector('#header .content'); 2699 let headerContent = header.querySelector('.container'); 2700 let headerContentStyle = window.getComputedStyle(headerContent); 2701 2702 const topDialog = (header.offsetHeight + header.getBoundingClientRect().top) + 'px'; 2703 this.$refs.dialog.style.top = topDialog; 2704 this.$refs.backdrop.style.top = topDialog; 2705 this.$refs.dialogContainer.style.width = 2706 (parseInt(headerContentStyle.marginLeft) + parseInt(headerContentStyle.paddingLeft) + 282) + 'px'; 2707 }, 2708 fetchData(){ 2709 // Calculate offset top 2710 this.setMenuStyles(); 2711 // Fetch data 2712 this.$dispatch('screen-lock',this.open); 2713 if(!this.menuData && this.open){ 2714 this.isLoading = true; 2715 fetch( 2716 'https://www.farma.it/megamenu/get/json/id/1/limit/0/level/1/?1791567035', 2717 { 2718 headers: {contentType: 'application/json'}, 2719 } 2720 ).then(response => { 2721 if (response.ok) { 2722 return response.json(); 2723 } else { 2724 this.dispatchMessage('error', response.statusText); 2725 console.warn("GET request failed", response); 2726 } 2727 }) 2728 .then(data => { 2729 this.menuData = data; 2730 this.isLoading = false; 2731 this.$nextTick(() => { 2732 this.setActiveMenu(document.getElementById('main-menu-second-level_6ac924bad7544')); 2733 }); 2734 }); 2735 } 2736 } 2737 } 2738 } 2739</script>
2739 2740 2741 <!-- Search --> 2742 <div class="order-4 lg:order-3 w-full lg:w-auto lg:flex-1" 2743 :class="searchOpened ? 'z-40': ''" 2744 id="search-content" 2745 > 2746 <div class="mx-auto my-3 lg:my-0 search-container"> 2747 <div class="supercontainer"> 2748 <div id="algoliaAutocomplete" class="block block-search algolia-search-block algolia-search-input container py-2 mx-auto text-black hidden" ></div> 2749 <div id="panelContainer" class="relative" x-data="initAutocompleteInsight"></div> 2750 <div id="menu-open-search" class="control relative lg:mx-10" > 2751 <label for="search" class="block relative cursor-text"> 2752 <div class="input-search form-input pl-[38px] py-2 h-[36px] flex items-center" aria-hidden="true"> 2753 <span>Cerca allâinterno della farmacia</span> 2754 </div> 2755 <div class="absolute top-0 left-0 py-2.5 lg:py-3 px-4 h-[42px] lg:h-[46px] pointer-events-none"> 2756 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14" role="img"> 2757 <path d="M22.79 24c-.32 0-.63-.12-.86-.35l-6.05-6.04v-1.14l-.68-.7-.22.19a9.1 9.1 0 0 1-7.46 2.06 9.128 9.128 0 0 1-7.45-7.8 8.98 8.98 0 0 1 2.2-7.15A9.095 9.095 0 0 1 9.08 0c.38 0 .77.02 1.15.07 4.96.62 8.48 5.15 7.86 10.12a9.046 9.046 0 0 1-2.12 4.78l-.19.22.7.68h1.14l6.03 6.06a1.213 1.213 0 0 1-.86 2.07ZM9.08 2.27c-3.76 0-6.8 3.04-6.8 6.8s3.04 6.8 6.8 6.8 6.8-3.04 6.8-6.8c0-3.75-3.05-6.79-6.8-6.8Z" style="fill:currentColor"/> 2758<title>search</title></svg> 2759 </div> 2760 </label> 2761 </div> 2762 2763 <!-- Close button (left arrow on mobile, X on desktop) --> 2764 <button id="close-instant-search" 2765 type="button" 2766 class="instant-search-close" 2767 aria-label="Close search" 2768 title="Close search"> 2769 <span class="icon-x"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" role="img"> 2770 <path d="M21.82 24c-.58 0-1.13-.23-1.54-.64l-8.27-8.27-8.29 8.27a2.179 2.179 0 0 1-3.08-3.08L8.92 12 .64 3.73a2.19 2.19 0 0 1 0-3.09 2.172 2.172 0 0 1 3.08 0L12 8.92 20.27.64a2.19 2.19 0 0 1 3.09 0c.85.85.85 2.23 0 3.09L15.08 12l8.27 8.27c.85.85.85 2.24 0 3.09-.41.41-.96.64-1.54.64Z" style="fill:currentColor"/> 2771<title>x</title></svg> 2772</span> 2773 <span class="icon-arrow"> 2774 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20.57" width="12" height="12"> 2775 <path d="M22.29 8.58H5.14l5.64-5.64c.65-.69.62-1.78-.07-2.43-.66-.62-1.68-.62-2.35 0L1.01 7.88C.37 8.52 0 9.39 0 10.29c0 .9.37 1.76 1.01 2.4l7.35 7.38c.68.66 1.77.64 2.43-.05.64-.67.64-1.73 0-2.39L5.15 12h17.14c.95-.02 1.7-.81 1.67-1.76-.02-.92-.76-1.65-1.67-1.67Z" style="fill:currentColor"/> 2776 </svg> 2777 </span> 2778 </button> 2779 2780 <!-- Reset button (clears input) shown on mobile --> 2781 <button id="reset-instant-search" 2782 class="reset-instant-search" 2783 aria-label="Clear search" 2784 title="Clear search"> 2785 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12" role="img"> 2786 <path d="M21.82 24c-.58 0-1.13-.23-1.54-.64l-8.27-8.27-8.29 8.27a2.179 2.179 0 0 1-3.08-3.08L8.92 12 .64 3.73a2.19 2.19 0 0 1 0-3.09 2.172 2.172 0 0 1 3.08 0L12 8.92 20.27.64a2.19 2.19 0 0 1 3.09 0c.85.85.85 2.23 0 3.09L15.08 12l8.27 8.27c.85.85.85 2.24 0 3.09-.41.41-.96.64-1.54.64Z" style="fill:currentColor"/> 2787<title>x</title></svg> 2788 </button> 2789 2790 <div id="menu-search-icon" class="control relative"> 2791 <input id="search" 2792 x-ref="searchInput" 2793 type="search" 2794 enterkeyhint="search" 2795 inputmode="search" 2796 autocomplete="off" 2797 name="q" 2798 placeholder="Cerca all’interno della farmacia" 2799 maxlength="128" 2800 class="input-search form-input pl-[45px] lg:pl-[38px] py-2 h-[53px]" 2801 /> 2802 <div class="hidden lg:block absolute top-[9px] left-0 py-2.5 px-4 h-[42px] lg:h-[46px]"> 2803 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14" role="img">
2804 <path d="M22.79 24c-.32 0-.63-.12-.86-.35l-6.05-6.04v-1.14l-.68-.7-.22.19a9.1 9.1 0 0 1-7.46 2.06 9.128 9.128 0 0 1-7.45-7.8 8.98 8.98 0 0 1 2.2-7.15A9.095 9.095 0 0 1 9.08 0c.38 0 .77.02 1.15.07 4.96.62 8.48 5.15 7.86 10.12a9.046 9.046 0 0 1-2.12 4.78l-.19.22.7.68h1.14l6.03 6.06a1.213 1.213 0 0 1-.86 2.07ZM9.08 2.27c-3.76 0-6.8 3.04-6.8 6.8s3.04 6.8 6.8 6.8 6.8-3.04 6.8-6.8c0-3.75-3.05-6.79-6.8-6.8Z" style="fill:currentColor"/> 2805<title>search</title></svg> 2806 </div> 2807 </div> 2808 <div id="view-all-products" class="lg:hidden border-t"> 2809 <button class="btn btn-primary view-all-button-algolia" onclick="try{document.querySelector('#autocomplete-products-footer a')?.click();}catch(e){};var p=document.getElementById('view-all-products');if(p){p.classList.add('hidden');}"> 2810 Vedi tutti i <span id="aa-count-mobile" class="mx-1"></span> prodotti 2811 </button> 2812 </div> 2813 </div> 2814 </div> 2815 2816
2816<script> 2817 'use strict'; 2818 2819 function initAutocompleteInsight() { 2820 return { 2821 bindClickEvent(element, eventName, objectID, indexName, position, queryId) { 2822 try { 2823 element.querySelector('.algoliasearch-autocomplete-hit')?.addEventListener("click", function () { 2824 buildInsightsEventData(eventName, objectID, indexName, position, queryId); 2825 }); 2826 } catch (e) {} 2827 } 2828 } 2829 } 2830 2831 document.addEventListener('DOMContentLoaded', function() { 2832 const searchEl = document.getElementById('search'); 2833 if (!searchEl) return; 2834 2835 // delegate Enter/mobile submit logic to autocomplete.js bindings 2836 searchEl.addEventListener('click', function () { 2837 setTimeout(function () { 2838 // After aa-Input is available, keep it in sync with #search value 2839 function syncAaInput() { 2840 const currentAaInput = document.querySelector('.aa-Input'); 2841 if (!currentAaInput || !('value' in currentAaInput)) return; 2842 const newVal = searchEl.value ?? ''; 2843 if (currentAaInput.value !== newVal) { 2844 currentAaInput.value = newVal; 2845 // Notify Algolia/autocomplete about the programmatic change 2846 currentAaInput.dispatchEvent(new Event('input', { bubbles: true })); 2847 currentAaInput.dispatchEvent(new Event('change', { bubbles: true })); 2848 } 2849 } 2850 2851 // Initial sync once available 2852 syncAaInput(); 2853 // Keep syncing as the user types or changes the field 2854 searchEl.addEventListener('input', syncAaInput); 2855 searchEl.addEventListener('change', syncAaInput); 2856 }, 100); 2857 }); 2858 }); 2859 </script>
2859 2860
2860<script> 2861 // Immediately apply open classes and show backdrop on click of #menu-open-search 2862 document.addEventListener('DOMContentLoaded', function() { 2863 var openTrigger = document.getElementById('menu-open-search'); 2864 if (openTrigger) { 2865 openTrigger.addEventListener('click', function () { 2866 try { 2867 var panelContainer = document.getElementById('panelContainer'); 2868 var searchWrapper = document.getElementById('menu-search-icon'); 2869 var searchContainer = document.querySelector('.search-container'); 2870 var aaPanel = document.querySelector('.aa-Panel'); 2871 var bodyEl = document.body; 2872 2873 if (panelContainer) panelContainer.classList.add('is-open'); 2874 if (searchWrapper) searchWrapper.classList.add('is-open'); 2875 if (searchContainer) searchContainer.classList.add('is-open'); 2876 if (aaPanel) aaPanel.classList.add('is-open'); 2877 if (bodyEl) bodyEl.classList.add('max-h-screen', 'lock-screen', 'overflow-hidden', 'instant-lock'); 2878 2879 // Pz8 per evitare flickering della ricerca 2880 (function triggerSearchClicksOnce(el) { 2881 if (!el) return; 2882 2883 if (window.__algoliaSearchClicksTriggered) return; 2884 window.__algoliaSearchClicksTriggered = true; 2885 for (let i = 0; i < 100; i++) { 2886 setTimeout(function () { 2887 let panel = document.querySelector('.aa-PanelLayout'); 2888 if (panel) { 2889 i = 100; 2890 return; 2891 } 2892 if (window.__algoliaSearchClicksTriggered) { 2893 el.click(); 2894 } 2895 2896 }, i * 5); 2897 } 2898 })(document.getElementById('search')); 2899 } catch (e) { 2900 // swallow errors 2901 } 2902 }); 2903 } 2904 2905 }); 2906 </script>
2906 2907
2907<script> 2908 // Toggle 'is-empty' on .search-container only on 'change' when input remains empty and there are results 2909 document.addEventListener('DOMContentLoaded', function() { 2910 var searchContainer = document.querySelector('.search-container'); 2911 if (!searchContainer) return; 2912 2913 function handleChange(e) { 2914 try { 2915 var val = (e && e.target && typeof e.target.value === 'string') ? e.target.value.trim() : ''; 2916 if (val === '' && searchContainer.classList.contains('has-results')) { 2917 searchContainer.classList.add('is-empty'); 2918 } else { 2919 searchContainer.classList.remove('is-empty'); 2920 } 2921 } catch (err) { 2922 // no-op 2923 } 2924 } 2925 2926 // Native search input 2927 var nativeInput = document.getElementById('search'); 2928 if (nativeInput) { 2929 nativeInput.addEventListener('change', handleChange, { passive: true }); 2930 } 2931 2932 // Algolia injected input may appear later; observe and bind once when present 2933 var aaBound = false; 2934 var tryBindAa = function() { 2935 if (aaBound) return; 2936 var aaInput = document.querySelector('.aa-Input'); 2937 if (aaInput) { 2938 aaInput.addEventListener('change', handleChange, { passive: true }); 2939 aaBound = true; 2940 } 2941 }; 2942 // Try now and a little later in case of async initialization 2943 tryBindAa(); 2944 var aaInterval = setInterval(function(){ 2945 if (aaBound) { clearInterval(aaInterval); return; } 2946 tryBindAa(); 2947 }, 200); 2948 setTimeout(function(){ clearInterval(aaInterval); }, 6000); 2949 }); 2950 </script>
2950 2951 </div> 2952 2953 <!-- Buttons --> 2954 <div class="flex items-center gap-4 lg:gap-8 order-3 ml-3 lg:ml-0 lg:order-4"> 2955 <!-- Static Block --> 2956 <div class="hidden lg:block"> 2957 <div data-content-type="html" data-appearance="default" data-intersect="false" data-element="main" data-decoded="true"><a class="flex items-center gap-2 hover:underline" href="/richiamami"> 2958 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="20" height="20" role="img"> 2959 <path d="M12.98 1c0-.55.45-1 1-1C19.51 0 23.99 4.49 24 10.02c0 .55-.45 1-1 1s-1-.45-1-1c0-4.43-3.59-8.01-8.02-8.02-.55 0-1-.45-1-1Zm1 5.01a4.01 4.01 0 0 1 4.01 4.01c0 .55.45 1 1 1s1-.45 1-1c0-3.32-2.69-6.01-6.01-6.01-.55 0-1 .45-1 1s.45 1 1 1Zm9.11 10.76a3.108 3.108 0 0 1 0 4.39l-.91 1.05C13.98 30.06-5.99 10.1 1.75 1.87l1.15-1a3.081 3.081 0 0 1 4.33.04c.03.03 1.89 2.44 1.89 2.44a3.118 3.118 0 0 1 0 4.29L7.96 9.1a12.83 12.83 0 0 0 6.94 6.96l1.47-1.17a3.099 3.099 0 0 1 4.29 0s2.41 1.86 2.44 1.89Zm-1.38 1.46s-2.4-1.84-2.43-1.88c-.43-.43-1.12-.43-1.55 0-.03.03-2.05 1.64-2.05 1.64-.28.22-.65.28-.98.15a15.02 15.02 0 0 1-8.83-8.82 1 1 0 0 1 .14-1S7.62 6.3 7.65 6.27c.43-.43.43-1.12 0-1.55-.03-.03-1.88-2.43-1.88-2.43-.43-.39-1.1-.38-1.52.04l-1.15 1c-5.65 6.8 11.65 23.14 17.6 17.51l.91-1.05c.44-.41.48-1.1.08-1.56Z" style="fill:currentColor"></path> 2960<title>heroicons/outline/phone</title></svg> 2961 2962 <div class="text-xs font-medium">Richiamami</div> 2963 </a></div> </div> 2964 2965 <!-- Customer Icon & Dropdown --> 2966 <!-- BLOCK header.customer --> 2967<div x-data="initHeaderCustomerMenu()" @private-content-loaded.window="getData(event.detail.data)"> 2968 2969 <template x-if="isLoggedIn()"> 2970 <a 2971 href="https://www.farma.it/customer/account/" 2972 id="customer-menu" 2973 class="flex items-center gap-2 hover:underline" 2974 aria-label="Il mio Account" 2975 > 2976 <span class="relative block"> 2977 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"> 2978 <path d="M4.07 21c-.07-.05-.13-.1-.19-.17C-1 16.35-1.32 8.76 3.16 3.87c4.48-4.88 12.07-5.2 16.95-.72 4.88 4.48 5.21 12.07.73 16.96-.23.25-.47.49-.73.73-.05.06-.12.12-.19.17-4.53 4-11.32 4-15.85 0ZM12 22.15c2.25 0 4.44-.75 6.22-2.13a7.354 7.354 0 0 0-6.14-3.4h-.16c-2.49.02-4.8 1.3-6.14 3.4 1.78 1.39 3.97 2.14 6.22 2.13Zm4.83-6.02c1.09.67 2.03 1.56 2.76 2.61 3.73-4.19 3.35-10.61-.84-14.33C14.56.68 8.14 1.06 4.42 5.25 1 9.1 1 14.9 4.42 18.74a9.2 9.2 0 0 1 4.16-3.31 5.546 5.546 0 0 1-.93-7.78 5.546 5.546 0 0 1 7.78-.93 5.546 5.546 0 0 1 0 8.71c.49.19.96.43 1.4.7Zm-8.52-5.06c0 2.01 1.61 3.65 3.62 3.69h.15A3.694 3.694 0 0 0 15.7 11a3.694 3.694 0 0 0-3.76-3.62 3.692 3.692 0 0 0-3.62 3.69Z" style="fill:currentColor"/> 2979</svg> 2980 <span x-text="customer.firstname.charAt(0)" 2981 class="lg:hidden absolute h-3 w-3 bg-white leading-none top-[-3px] left-3 text-xxs font-bold text-center text-sale rounded-full" 2982 >0</span> 2983 </span> 2984 <span class="label hidden lg:block text-xs truncate text-center w-full leading-none font-medium"> 2985 <span>Ciao, </span> 2986 <span x-text="customer.firstname"></span> 2987 </span> 2988 </a> 2989 </template> 2990 2991 <template x-if="!isLoggedIn()"> 2992 <span> 2993 <a 2994 href="https://www.farma.it/customer/account/" 2995 id="customer-menu" 2996 class="flex items-center gap-2 hover:underline" 2997 aria-label="Il mio Account" 2998 > 2999 <span class="relative block"> 3000 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"> 3001 <path d="M4.07 21c-.07-.05-.13-.1-.19-.17C-1 16.35-1.32 8.76 3.16 3.87c4.48-4.88 12.07-5.2 16.95-.72 4.88 4.48 5.21 12.07.73 16.96-.23.25-.47.49-.73.73-.05.06-.12.12-.19.17-4.53 4-11.32 4-15.85 0ZM12 22.15c2.25 0 4.44-.75 6.22-2.13a7.354 7.354 0 0 0-6.14-3.4h-.16c-2.49.02-4.8 1.3-6.14 3.4 1.78 1.39 3.97 2.14 6.22 2.13Zm4.83-6.02c1.09.67 2.03 1.56 2.76 2.61 3.73-4.19 3.35-10.61-.84-14.33C14.56.68 8.14 1.06 4.42 5.25 1 9.1 1 14.9 4.42 18.74a9.2 9.2 0 0 1 4.16-3.31 5.546 5.546 0 0 1-.93-7.78 5.546 5.546 0 0 1 7.78-.93 5.546 5.546 0 0 1 0 8.71c.49.19.96.43 1.4.7Zm-8.52-5.06c0 2.01 1.61 3.65 3.62 3.69h.15A3.694 3.694 0 0 0 15.7 11a3.694 3.694 0 0 0-3.76-3.62 3.692 3.692 0 0 0-3.62 3.69Z" style="fill:currentColor"/> 3002</svg> 3003 </span>
3004 <span class="label hidden lg:block text-xs truncate text-center w-full leading-none font-medium"> 3005 <span>Accedi / Registrati</span> 3006 </span> 3007 </a> 3008 </span> 3009 </template> 3010</div>
3011<script> 3012 function initHeaderCustomerMenu() { 3013 return { 3014 open: false, 3015 customer: {}, 3016 getData(data) { 3017 if (data.customer) { this.customer = data.customer } 3018 }, 3019 isLoggedIn(){ 3020 return !!(this.customer.firstname); 3021 } 3022 } 3023 } 3024</script>
3024 3025<!-- /BLOCK header.customer --> 3026 <!-- Wishlist Icon --> 3027 3028<a 3029 href="https://www.farma.it/wishlist/" 3030 class="relative hidden md:inline-flex btn bg-transparent border-transparent p-1" 3031 x-data="initWishlistHeader" 3032 @private-content-loaded.window="receiveWishlistData" 3033 aria-label="La mia lista desideri" 3034 :aria-label="linkAriaLabel" 3035> 3036 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" aria-hidden="true"><path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"/></svg> 3037 <template x-if="itemCount"> 3038 <span 3039 x-text="itemCount" 3040 class="absolute -top-1.5 -right-1.5 px-2 py-1 rounded-full bg-primary text-on-primary text-xs 3041 font-semibold leading-none text-center uppercase tabular-nums" 3042 aria-hidden="true" 3043 ></span> 3044 </template> 3045</a> 3046
3047<script> 3048 function initWishlistHeader() { 3049 return { 3050 wishlistProducts: null, 3051 itemCount: 0, 3052 linkAriaLabel() { 3053 const countLabel = this.itemCount > 1 3054 ? hyva.str('\u00251\u0020elementi', this.itemCount) 3055 : hyva.str('\u00251\u0020elemento', this.itemCount); 3056 return `Wishlist\u0020Products (${countLabel})`; 3057 }, 3058 receiveWishlistData() { 3059 const data = this.$event.detail.data; 3060 this.itemCount = data.wishlist ? parseInt(data.wishlist.counter) : 0; 3061 } 3062 } 3063 } 3064 3065 window.addEventListener('alpine:init', () => { 3066 Alpine.data('initWishlistHeader', initWishlistHeader); 3067 }, { once: true }) 3068</script>
3068 3069 3070 <!-- Cart Icon --> 3071 <a id="menu-cart-icon" 3072 @click.prevent.stop="$dispatch('toggle-cart',{});" class="flex items-center gap-2 hover:underline" 3073 href="https://www.farma.it/checkout/cart/index/" 3074 > 3075 <span class="relative block"> 3076 <svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 22.79 24" width="20" height="20" role="img"> 3077 <path fill="currentColor" d="M6.98 24c-1.05 0-1.9-.86-1.89-1.91 0-1.05.86-1.9 1.91-1.89 1.05 0 1.89.85 1.89 1.9 0 1.05-.86 1.9-1.91 1.9ZM17.11 24c-1.05 0-1.9-.86-1.89-1.91 0-1.05.86-1.9 1.91-1.89 1.05 0 1.89.85 1.89 1.9 0 1.05-.86 1.9-1.91 1.9ZM19.14 18.95H8.56c-2.5 0-4.62-1.87-4.91-4.35L2.24 2.78c-.07-.57-.55-1-1.12-1H.89A.893.893 0 0 1-.05.94C-.08.45.3.03.79 0h.33c1.48 0 2.72 1.1 2.9 2.57l.05.46h6.95c.49-.02.9.37.92.86.02.49-.37.9-.86.92H4.27l.98 8.32h12.51c1.53 0 2.84-1.09 3.11-2.59l.13-.72a.9.9 0 0 1 .88-.73c.05 0 .11 0 .16.01.48.09.81.55.72 1.03l-.13.72a4.953 4.953 0 0 1-4.87 4.06H5.51l.06.16c.45 1.26 1.64 2.1 2.98 2.1h10.58c.49-.02.9.37.92.86.02.49-.37.9-.86.92h-.06Z"/> 3078<title>shopping-cart</title></svg> 3079 <span x-text="getCartItemsCountLabel" 3080 class="absolute top-[-6px] right-[1px] text-xxs font-bold text-center text-sale rounded-full" 3081 >0</span> 3082 </span> 3083 <span class="header-subtotal label hidden lg:inline text-sm leading-none font-bold">0,00 â¬</span> 3084 </a> 3085 </div> 3086 </div> 3087 </div> 3088 3089 <!-- Cart Drawer --> 3090
3090<script> 3091 function initCartDrawer() { 3092 return { 3093 open: false, 3094 isLoading: false, 3095 cart: {}, 3096 maxItemsToDisplay: 10, 3097 itemsCount: 0, 3098 totalCartAmount: 0, 3099 headerSubtotal: null, 3100 headerSubtotalSelector: '.header-subtotal', 3101 groupedData: {}, 3102 3103 itemsCountLabel(){ 3104 return (this.itemsCount > 99)? '99+' : `${this.itemsCount}`; 3105 }, 3106 isVisible(){ 3107 return (this.open && this.itemsCount > 0) 3108 }, 3109 getData(data) { 3110 if (data.cart) { 3111 this.cart = data.cart; 3112 this.itemsCount = data.cart.items && data.cart.items.length || 0; 3113 this.totalCartAmount = this.cart.summary_count; 3114 this.setCartItems(); 3115 this.initGroupedData() 3116 } 3117 this.isLoading = false; 3118 }, 3119 cartItems: [], 3120 getItemCountTitle() { 3121 return hyva.strf('(%0 di %1)', this.maxItemsToDisplay, this.itemsCount) 3122 }, 3123 getHeaderSubtotal() { 3124 if (!this.headerSubtotal) { 3125 this.headerSubtotal = document.querySelector(this.headerSubtotalSelector); 3126 } 3127 3128 return this.headerSubtotal; 3129 }, 3130 setCartItems() { 3131 this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; 3132 3133 if (this.maxItemsToDisplay > 0) { 3134 this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); 3135 } 3136 3137 try { 3138 var subtotal = (this.cart?.subtotal_incl_tax_discounted) ? this.cart.subtotal_incl_tax_discounted : this.cart.subtotal; 3139 if (subtotal) { 3140 this.getHeaderSubtotal().innerHTML = subtotal; 3141 } 3142 } catch (e) {} 3143 }, 3144 initGroupedData() { 3145 let self = this; 3146 try { 3147 Object.values(this.cart['fake_grouped_parents']).forEac
3147h(function (parent) { 3148 let price = 0.0000, 3149 productIds = parent.product_ids.split(','), 3150 groupedId = parent['grouped_id']; 3151 self.groupedData[groupedId] = { 3152 'price': price, 3153 'items': [] 3154 }; 3155 productIds.forEach(function (productId) { 3156 let product = self.cart.items.find((item) => item.product_id == productId); 3157 if (product) { 3158 self.groupedData[groupedId]['items'].push({ 3159 'name': product['product_name'], 3160 'qty': product['qty'] 3161 }); 3162 price += product['product_price_value'] * product['qty']; 3163 } 3164 }) 3165 self.groupedData[groupedId]['price'] = hyva.formatPrice(price, false); 3166 }) 3167 } catch (e) {} 3168 console.log(this.groupedData); 3169 }, 3170 deleteItemFromCart(itemId) { 3171 this.isLoading = true; 3172 3173 const formKey = hyva.getFormKey(); 3174 const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; 3175 3176 fetch(postUrl, { 3177 "headers": { 3178 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 3179 }, 3180 "body": "form_key=" + formKey + "&item_id=" + itemId, 3181 "method": "POST", 3182 "mode": "cors", 3183 "credentials": "include" 3184 }).then(response => { 3185 if (response.redirected) { 3186 window.location.href = response.url; 3187 } else if (response.ok) { 3188 return response.json(); 3189 } else { 3190 window.dispatchMessages && window.dispatchMessages([{ 3191 type: 'warning', 3192 text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' 3193 }]); 3194 this.isLoading = false; 3195 } 3196 }).then(result => { 3197 window.dispatchMessages && window.dispatchMessages([{ 3198 type: result.success ? 'success' : 'error', 3199 text: result.success 3200 ? 'Hai\u0020rimosso\u0020il\u0020prodotto.' 3201 : result.error_message 3202 }], result.success ? 5000 : 0) 3203 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 3204 }); 3205 }, 3206 deleteGroupedFromCart(groupedId) { 3207 let deleteButton = document.querySelector('#cart-drawer [data-grouped-id="' + groupedId + '"] .delete'); 3208 if (deleteButton) { 3209 deleteButton.click(); 3210 } 3211 }, 3212 getGroupedPrice(groupedId) { 3213 return this.groupedData[groupedId]['price']; 3214 } 3215 } 3216 } 3217</script>
3217 3218<section id="cart-drawer" 3219 x-data="initCartDrawer()" 3220 x-init="$watch('isVisible', value => $dispatch('screen-lock', value))" 3221 @private-content-loaded.window="getData($event.detail.data)" 3222 @toggle-cart.window="if(itemsCount > 0){open=true}" 3223 @keydown.window.escape="open=false" 3224 @cart-loading-start.window="isLoading=true" 3225 @cart-loading-stop.window="isLoading=false" 3226> 3227 <template x-if="cart && cart.summary_count"> 3228 <div role="dialog" 3229 aria-labelledby="cart-drawer-title" 3230 aria-modal="true" 3231 @click.outside="open=false" 3232 class="fixed inset-y-0 right-0 z-30 flex max-w-full"> 3233 <div class="backdrop" 3234 x-show="open" 3235 x-transition:enter="ease-in-out duration-500" 3236 x-transition:enter-start="opacity-0" 3237 x-transition:enter-end="opacity-100" 3238 x-transition:leave="ease-in-out duration-500" 3239 x-transition:leave-start="opacity-100" 3240 x-transition:leave-end="opacity-0" 3241 @click="open=false" 3242 aria-label="Close panel"></div> 3243 <div class="relative w-screen max-w-[470px] shadow-2xl" 3244 x-show="open" 3245 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 3246 x-transition:enter-start="translate-x-full" 3247 x-transition:enter-end="translate-x-0" 3248 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 3249 x-transition:leave-start="translate-x-0" 3250 x-transition:leave-end="translate-x-full" 3251 > 3252 <div 3253 x-show="open" 3254 x-transition:enter="ease-in-out duration-500" 3255 x-transition:enter-start="opacity-0" 3256 x-transition:enter-end="opacity-100" 3257 x-transition:leave="ease-in-out duration-500" 3258 x-transition:leave-start="opacity-100" 3259 x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2 mt-2"> 3260 <button @click="open=false" aria-label="Close panel" 3261 class="p-2 text-primary transition duration-150 ease-in-out hover:text-secondary"> 3262 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" role="img"> 3263 <path d="M21.82 24c-.58 0-1.13-.23-1.54-.64l-8.27-8.27-8.29 8.27a2.179 2.179 0 0 1-3.08-3.08L8.92 12 .64 3.73a2.19 2.19 0 0 1 0-3.09 2.172 2.172 0 0 1 3.08 0L12 8.92 20.27.64a2.19 2.19 0 0 1 3.09 0c.85.85.85 2.23 0 3.09L15.08 12l8.27 8.27c.85.85.85 2.24 0 3.09-.41.41-.96.64-1.54.64Z" style="fill:currentColor"/> 3264<title>x</title></svg> 3265 </button> 3266 </div> 3267 <div class="flex flex-col h-screen h-[100dvh] py-6 space-y-6 bg-white shadow-xl"> 3268 3269 <header class="px-4 sm:px-6"> 3270 <h2 id="cart-drawer-title" class="text-xl font-bold leading-6 text-primary"> 3271 Carrello <span class="items-total font-normal" 3272 x-text="'(' + totalCartAmount + ')'"> 3273 </span> 3274 </h2> 3275 </header> 3276 3277 3278 <div class="relative grid gap-6 px-4 py-6 overflow-y-auto bg-white border-t sm:gap-8 sm:px-6 border-container"> 3279 <template x-for="parent in cart.fake_grouped_parents"> 3280 <div class="flex items-start p-3 -m-3 space-x-4"> 3281 <a :href="parent.url" class="w-1/4"> 3282 <img 3283 :src="parent.image" 3284 width="78" 3285 height="78" 3286 loading="lazy" 3287 /> 3288 </a> 3289 <div class="w-3/4"> 3290 <div> 3291 <p class="text-sm">
3292 <span x-html="parent.name"></span> 3293 </p> 3294 </div> 3295 <div class="mt-2"> 3296 <template x-for="child_item in groupedData[parent.grouped_id].items"> 3297 <div class="font-body-sm font-sm text-gray-1"> 3298 <span x-html="child_item.qty + 'x ' + child_item.name"></span> 3299 </div> 3300 </template> 3301 </div> 3302 <p class="flex mt-2"> 3303 <span> 3304 <span class="price-including-tax"> 3305 <span class="minicart-price"> 3306 <span class="price" x-html="getGroupedPrice(parent.grouped_id)"></span> 3307 </span> 3308 </span> 3309 </span> 3310 </p> 3311 <div class="pt-2 mt-2"> 3312 <button class="inline-flex p-2 btn shadow-none bg-container-darker text-primary hover:shadow-lg hover:bg-secondary/10" 3313 @click="deleteGroupedFromCart(parent.grouped_id)" 3314 > 3315 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21.96 24" class="p-0.5" width="20" height="20" role="img"> 3316 <path d="M13.9 24H8.06a4.85 4.85 0 0 1-4.84-4.4L1.87 5.64H.78a.781.781 0 0 1 0-1.56h4.38l.04-.19A4.86 4.86 0 0 1 9.96 0H12c2.31 0 4.3 1.63 4.76 3.89l.04.19h4.38c.42 0 .76.33.78.74v.04c0 .43-.35.78-.78.78h-1.12l-1.32 13.95a4.842 4.842 0 0 1-4.84 4.4ZM3.45 5.64l1.32 13.81a3.284 3.284 0 0 0 3.28 2.98h5.84c1.7 0 3.13-1.29 3.28-2.98l1.31-13.81H3.45Zm6.51-4.08c-1.4 0-2.65.88-3.11 2.2l-.11.32h8.48l-.11-.32A3.299 3.299 0 0 0 12 1.56H9.97Z" style="fill:currentColor"/> 3317<title>trash</title></svg> 3318 </button> 3319 </div> 3320 </div> 3321 </div> 3322 </template> 3323 <template x-for="item in cartItems"> 3324 <div class="flex items-start p-3 -m-3 space-x-4" :class="{'hidden': item.grouped_id }" x-bind:data-grouped-id="item.grouped_id"> 3325 <a :href="item.product_url" class="w-1/4"> 3326 <img 3327 :src="item.product_image.src" 3328 :width="item.product_image.width" 3329 :height="item.product_image.height" 3330 loading="lazy" 3331 /> 3332 </a> 3333 <div class="w-3/4 space-y-2"> 3334 <div> 3335 <p class="text-sm"> 3336 <span x-html="item.product_name"></span> 3337 </p> 3338 <p class="text-xs sr-only"><span x-html="item.product_sku"></span></p> 3339 </div> 3340 <template x-for="(option, i) in item.options"> 3341 <span class="text-xxs text-primary-lighter inline-block before:inline-block before:mx-1 before:content-['-']" 3342 x-html="option.value" 3343 :class="{ 'before:content-none before:hidden': i == 0 }" 3344 ></span> 3345 </template> 3346 <div class="font-body-sm font-sm inline text-gray-1"> 3347 Quantità : <sp
3347an x-html="item.qty"></span> 3348 </div> 3349 <p class="flex"> 3350 <span x-html="item.product_price"></span> 3351 <span x-show="item.regular_price_value > item.product_price_value" x-html="hyva.formatPrice(item.regular_price_value)" class="line-through ml-1.5"></span> 3352 </p> 3353 <div class="pt-2"> 3354 <a :href="item.configure_url" 3355 x-show="item.product_type !== 'grouped'" 3356 class="inline-flex p-2 mr-2 btn shadow-none bg-container-darker text-primary hover:shadow-lg hover:bg-secondary/10"> 3357 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="p-0.5" width="20" height="20" role="img"> 3358 <path d="M2.88 24H.76a.76.76 0 0 1-.76-.76v-2.11c0-1.29.51-2.53 1.43-3.44L18.11 1.01a3.455 3.455 0 0 1 4.88-.02 3.455 3.455 0 0 1 .02 4.88l-.02.02L6.3 22.58C5.39 23.49 4.16 24 2.88 24ZM15.35 5.91 2.5 18.77c-.63.63-.98 1.48-.98 2.37v1.35h1.35c.89 0 1.74-.35 2.36-.98L18.09 8.66l-2.74-2.74Zm5.2-4.4c-.51 0-1 .2-1.37.57l-2.76 2.76 2.74 2.73 2.76-2.76c.76-.75.76-1.98 0-2.74-.36-.36-.86-.57-1.37-.57Z" style="fill:currentColor"/> 3359<title>Modifica</title></svg> 3360 </a> 3361 <button class="delete inline-flex p-2 btn shadow-none bg-container-darker text-primary hover:shadow-lg hover:bg-secondary/10" 3362 @click="deleteItemFromCart(item.item_id)" 3363 > 3364 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21.96 24" class="p-0.5" width="20" height="20" role="img"> 3365 <path d="M13.9 24H8.06a4.85 4.85 0 0 1-4.84-4.4L1.87 5.64H.78a.781.781 0 0 1 0-1.56h4.38l.04-.19A4.86 4.86 0 0 1 9.96 0H12c2.31 0 4.3 1.63 4.76 3.89l.04.19h4.38c.42 0 .76.33.78.74v.04c0 .43-.35.78-.78.78h-1.12l-1.32 13.95a4.842 4.842 0 0 1-4.84 4.4ZM3.45 5.64l1.32 13.81a3.284 3.284 0 0 0 3.28 2.98h5.84c1.7 0 3.13-1.29 3.28-2.98l1.31-13.81H3.45Zm6.51-4.08c-1.4 0-2.65.88-3.11 2.2l-.11.32h8.48l-.11-.32A3.299 3.299 0 0 0 12 1.56H9.97Z" style="fill:currentColor"/> 3366<title>Elimina</title></svg> 3367 </button> 3368 </div> 3369 3370 </div> 3371 </div> 3372 </template> 3373 </div> 3374 3375 3376 <div class="relative grid gap-6 px-4 pt-6 bg-white sm:gap-8 sm:px-6 !mt-auto"> 3377 <div class="w-full p-3 -m-3 space-x-4 text-right"> 3378 <p>Subtotale: <span class="font-bold text-xl" x-html="cart.subtotal_incl_tax_discounted"></span></p> 3379 </div> 3380 <div class="w-full p-3 -m-3 space-y-3"> 3381 <a href="https://www.farma.it/checkout/cart/" 3382 class="block btn btn-primary"> 3383 Vai al Carrello </a> 3384 </div> 3385 </div> 3386 3387 </div> 3388 </div> 3389 3390<div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" 3391 style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgb(255 255 255/0.60);" 3392 x-show="isLoading" 3393 x-transition:enter="ease-out duration-200" 3394 x-transition:enter-start="opacity-0" 3395 x-transition:enter-end="opacity-100" 3396 x-transition:leave="ease-in duration-200" 3397 x-transition:leave-start="opacity-100" 3398 x-transition:leave-end="opacity-0"> 3399 <svg xmlns="http://www.w3.org/2000/svg" width="57" height="57" viewBox="0 0 38 38" stroke="#ffb590" class="text-primary" role="img"> 3400 <g fill="none" fill-rule="evenodd"> 3401 <g transform="translate(1 1)" stroke-width="2"> 3402 <circle stroke="#ff6801" cx="18" cy="18" r="18"/> 3403 <path d="M36 18c0-9.94-8.06-18-18-18"> 3404 <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indef
3404inite"/> 3405 </path> 3406 </g> 3407 </g> 3408<title>loader</title></svg> 3409</div> 3410 </div> 3411 </template> 3412</section> 3413 3414 <!-- Authentication Pop-Up --> 3415 <!-- BLOCK authentication-popup -->
3415<script> 3416 function initAuthentication() { 3417 return { 3418 open: false, 3419 forceAuthentication: false, 3420 checkoutUrl: 'https://www.farma.it/checkout/index/', 3421 errors: 0, 3422 hasCaptchaToken: 0, 3423 displayErrorMessage: false, 3424 errorMessages: [], 3425 setErrorMessages: function setErrorMessages(messages) { 3426 this.errorMessages = [messages]; 3427 this.displayErrorMessage = this.errorMessages.length; 3428 }, 3429 submitForm: function () { 3430 // Do not rename $form, the variable is expected to be declared in the recaptcha output 3431 const $form = document.querySelector('#login-form'); 3432 3433 if (this.errors === 0) { 3434 this.dispatchLoginRequest($form); 3435 } 3436 }, 3437 onPrivateContentLoaded: function (data) { 3438 const isLoggedIn = data.customer && data.customer.firstname; 3439 if (data.cart && !isLoggedIn) { 3440 this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; 3441 } 3442 }, 3443 redirectIfAuthenticated: function (event) { 3444 if (event.detail && event.detail.url) { 3445 this.checkoutUrl = event.detail.url; 3446 } 3447 if (!this.forceAuthentication) { 3448 window.location.href = this.checkoutUrl; 3449 } 3450 }, 3451 dispatchLoginRequest: function(form) { 3452 this.isLoading = true; 3453 const username = this.$refs['customer-email'].value; 3454 const password = this.$refs['customer-password'].value; 3455 const formKey = hyva.getFormKey(); 3456 const bodyFields = { 3457 'username': username, 3458 'password': password, 3459 'formKey': formKey 3460 }; 3461 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 3462 const recaptchaField = fieldName && form[fieldName]; 3463 if (recaptchaField) { 3464 bodyFields[fieldName] = recaptchaField.value; 3465 } 3466 fetch('https://www.farma.it/customer/ajax/login/', { 3467 method: 'POST', 3468 headers: { 3469 'Content-Type': 'application/json', 3470 'X-Requested-With': 'XMLHttpRequest' 3471 }, 3472 body: JSON.stringify(bodyFields) 3473 } 3474 ).then(response => { 3475 return response.json() 3476 } 3477 ).then(data=> { 3478 this.isLoading = false; 3479 if (data.errors) { 3480 dispatchMessages([{ 3481 type: 'error', 3482 text: data.message 3483 }], 5000); 3484 this.errors = 1; 3485 this.hasCaptchaToken = 0; 3486 } else { 3487 window.location.href = this.checkoutUrl; 3488 } 3489 }); 3490 } 3491 } 3492 } 3493</script>
3493 3494<section id="authentication-popup" 3495 x-data="initAuthentication()" 3496 @private-content-loaded.window="onPrivateContentLoaded($event.detail.data)" 3497 @toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)" 3498 @keydown.window.escape="open = false" 3499 class="hidden" 3500 :class="{ 'hidden': !open }" 3501> 3502 <div role="dialog" 3503 aria-labelledby="authentication-popup-title" 3504 aria-modal="true" 3505 @click.outside="open=false" 3506 class="fixed inset-y-0 right-0 z-50 flex max-w-full"> 3507 <div class="backdrop" 3508 x-show="open" 3509 x-transition:enter="ease-in-out duration-500" 3510 x-transition:enter-start="opacity-0" 3511 x-transition:enter-end="opacity-100" 3512 x-transition:leave="ease-in-out duration-500" 3513 x-transition:leave-start="opacity-100" 3514 x-transition:leave-end="opacity-0" 3515 @click="open=false" 3516 aria-label="Close panel"></div> 3517 <div class="relative w-screen max-w-[485px] shadow-2xl" 3518 x-show="open" 3519 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 3520 x-transition:enter-start="translate-x-full" 3521 x-transition:enter-end="translate-x-0" 3522 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 3523 x-transition:leave-start="translate-x-0" 3524 x-transition:leave-end="translate-x-full" 3525 > 3526 <div 3527 x-show="open" 3528 x-transition:enter="ease-in-out duration-500" 3529 x-transition:enter-start="opacity-0" 3530 x-transition:enter-end="opacity-100" 3531 x-transition:leave="ease-in-out duration-500" 3532 x-transition:leave-start="opacity-100" 3533 x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2 mt-3 sm:mt-7 sm:mr-6"> 3534 <button @click="open=false" aria-label="Close panel" 3535 class="p-2 text-primary transition duration-150 ease-in-out hover:text-secondary"> 3536 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" role="img"> 3537 <path d="M21.82 24c-.58 0-1.13-.23-1.54-.64l-8.27-8.27-8.29 8.27a2.179 2.179 0 0 1-3.08-3.08L8.92 12 .64 3.73a2.19 2.19 0 0 1 0-3.09 2.172 2.172 0 0 1 3.08 0L12 8.92 20.27.64a2.19 2.19 0 0 1 3.09 0c.85.85.85 2.23 0 3.09L15.08 12l8.27 8.27c.85.85.85 2.24 0 3.09-.41.41-.96.64-1.54.64Z" style="fill:currentColor"/> 3538<title>x</title></svg> 3539 </button> 3540 </div> 3541 <div class="flex flex-col h-screen h-[100dvh] pt-6 pb-6 sm:pt-10 space-y-6 sm:space-y-10 bg-white shadow-xl overflow-y-auto"> 3542 <header class="px-4"> 3543 <div id="authentication-popup-title" class="text-3xl font-bold leading-6 text-primary-darker"> 3544 Accedi o registrati </div> 3545 </header> 3546 <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> 3547 <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> 3548 <strong class="font-medium">Esegui il checkout utilizzando il tuo account</strong> 3549 </p> 3550 3551 <form class="form form-login" 3552 method="post" 3553 @submit.prevent="submitForm();" 3554 id="login-form" 3555 > 3556 <div class="fieldset login"> 3557 <div class="field email required"> 3558 <label class="label" for="form-login-username" form="login-form" > 3559 <span>Indirizzo email</span> 3560 </label> 3561 <div class="control"> 3562 <input name="username" 3563 id="form-login-username" 3564 x-ref="customer-email" 3565 @change="errors = 0" 3566 type="email" 3567 required 3568 class="form-input input-text" 3569 > 3570 </div> 3571 </div> 3572 <div class="field password required"> 3573 <label for="form-login-password" class="label" form="login-form">
3574 <span>Password</span> 3575 </label> 3576 <div class="control"> 3577 <input name="password" 3578 id="form-login-password" 3579 type="password" 3580 class="form-input input-text" 3581 required 3582 x-ref="customer-password" 3583 @change="errors = 0" 3584 > 3585 </div> 3586 </div> 3587 3588 <input name="context" type="hidden" value="checkout" /> 3589 <div class="actions-toolbar flex justify-between pt-6 pb-2 items-center"> 3590 <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" 3591 > 3592 Accedi </button> 3593 <a href="https://www.farma.it/customer/account/forgotpassword/" 3594 > 3595 Hai dimenticato la password? </a> 3596 </div> 3597 3598 </div> 3599 </form> 3600 </div> 3601 <div class="mx-4"> 3602 </div> 3603 <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm"> 3604 <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> 3605 <strong class="font-medium">Esegui il checkout come nuovo cliente</strong> 3606 </p> 3607 3608 <div class="block-content"> 3609 <p class="mb-1"> 3610 La creazione di un account ha molti vantaggi: </p> 3611 <ul class="list-disc pl-5"> 3612 <li> Vedere lo stato dell'ordine e della spedizione</li> 3613 <li> Cronologia ordini</li> 3614 <li> Checkout più veloce</li> 3615 </ul> 3616 <div class="actions-toolbar flex justify-between mt-6 mb-2 items-center"> 3617 <a href="https://www.farma.it/customer/account/create/" 3618 class="inline-flex btn btn-primary"> 3619 Crea il tuo Account </a> 3620 </div> 3621 </div> 3622 </div> 3623 </div> 3624 </div> 3625 </div> 3626</section> 3627<!-- /BLOCK authentication-popup --></div> 3628 3629</header><div class="widget block block-static-block"> 3630 </div> 3631<div class="top-container flex flex-col"><div class="widget block block-static-block"> 3632 </div> 3633</div><main id="maincontent" class="page-main"><div id="algolia-autocomplete-container"></div><div id="contentarea" tabindex="-1"></div> 3634<div class="page messages">
3634<script> 3635 function initMessages() { 3636 "use strict"; 3637 return { 3638 messages: window.mageMessages || [], 3639 3640 hideAfter: 4000, 3641 icons: { 3642 error: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="text-white" role="img"> <path d="M0 12a12 12 0 1 1 12 12A12.015 12.015 0 0 1 0 12Z" fill="#ea302d"/> <path d="m12.033 13.582-.036.036-.035-.036-3.629 3.563-1.6-1.58L10.355 12 6.733 8.437l1.6-1.58 3.632 3.562.035-.033.036.033 3.626-3.562 1.606 1.58L13.646 12l3.622 3.565-1.606 1.58Z" fill="#fdeae9"/><title>message-type-error</title></svg>', 3643 success: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="text-white" role="img"> <path d="M0 12a12 12 0 1 1 12 12A12.015 12.015 0 0 1 0 12Z" fill="#10b981"/> <path d="M9.841 16.98a1.2 1.2 0 0 1-.849-.352l-4.089-4.092 1.7-1.7 3.24 3.24 7.561-7.561 1.7 1.7-8.41 8.41a1.2 1.2 0 0 1-.853.355Z" fill="#e6f8f2"/><title>message-type-success</title></svg>', 3644 info: '<svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 24 24" class="text-white" width="20" height="20" role="img"> <path d="M12 24C5.37 24 0 18.63 0 12S5.37 0 12 0s12 5.37 12 12-5.37 12-12 12Z" style="fill:#08011a"/> <path fill="#fff" d="M12 10c1.1 0 2 .9 2 2v5.33c0 1.1-.9 2-2 2s-2-.9-2-2V12c0-1.1.9-2 2-2ZM11.99 4.42H12c1.24 0 2.25 1.01 2.25 2.25S13.24 8.92 12 8.92h-.01c-1.24 0-2.25-1.01-2.25-2.25s1.01-2.25 2.25-2.25Z"/><title>message-type-info</title></svg>', 3645 warning: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="text-white" role="img"> <path d="M3.31 22.862a3.3 3.3 0 0 1-2.866-4.948L9.135 2.793a3.307 3.307 0 0 1 5.731 0l8.689 15.121a3.3 3.3 0 0 1-2.865 4.947Z" fill="#f9b602"/> <path d="M13.145 14.219h-2.287V7.61h2.287ZM10.856 18.546v-2.287h2.302v2.288Z" fill="#2e2f2f"/><title>message-type-warning</title></svg>', 3646 notice: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="text-white" role="img"> <path d="M10.437 23.584a3.184 3.184 0 0 1-1.151-1.146l1.6-.93a1.214 1.214 0 0 0 .472.471 1.282 1.282 0 0 0 1.289 0 1.205 1.205 0 0 0 .471-.471l1.6.93a3.2 3.2 0 0 1-1.146 1.146A3.156 3.156 0 0 1 12 24a3.125 3.125 0 0 1-1.563-.416Zm-8.405-4.01a.929.929 0 0 1-.9-.65.9.9 0 0 1 .357-1.024 6.091 6.091 0 0 0 1.455-2.037 17.711 17.711 0 0 0 1.485-7.845 8.242 8.242 0 0 1 2.2-5.648A7.428 7.428 0 0 1 12 0a7.426 7.426 0 0 1 5.375 2.369 8.241 8.241 0 0 1 2.2 5.648 17.725 17.725 0 0 0 1.485 7.846 6.116 6.116 0 0 0 1.452 2.037.9.9 0 0 1 .352 1.02.928.928 0 0 1-.9.65Z" fill="#2e2f2f"/><title>message-type-notice</title></svg>', 3647 }, 3648 3649 isEmpty() { 3650 return this.messages.reduce( 3651 function (isEmpty, message) { 3652 return isEmpty && message === undefined 3653 }, true 3654 ) 3655 }, 3656 removeMessage(messageIndex) { 3657 this.messages[messageIndex] = undefined; 3658 }, 3659 addMessages(messages, hideAfter) { 3660 messages.map((message) => { 3661 message.icon = this.icons[message.type]; 3662 this.messages = this.messages.concat(message); 3663 if (hideAfter) { 3664 this.setHideTimeOut(this.messages.length - 1, hideAfter); 3665 } 3666 }); 3667 }, 3668 setHideTimeOut(messageIndex, hideAfter) { 3669 setTimeout((messageIndex) => { 3670 this.removeMessage(messageIndex); 3671 }, hideAfter, messageIndex); 3672 }, 3673 animateMessage(elem) { 3674 if (elem) { 3675 if (window.matchMedia('(min-width: 1024px)').matches) { 3676 elem.classList.add('transition-all', 'duration-300'); 3677 elem.style.position = 'absolute'; 3678 const headerEl = document.querySelector('.header-elements'); 3679 elem.style.left = (headerEl ? headerEl.getBoundingClientRect().left : 0) + 'px'; 3680 elem.style.opacity = 1; 3681 3682 setTimeout(() => { 3683 elem.style.left = '0'; 3684 elem.style.opacity = 0; 3685 }, this.hideAfter - 300); 3686 } else { 3687 elem.style.left = '-400px'; 3688 elem.classList.add('transition-all', 'duration-300'); 3689 elem.style.opacity = 0; 3690 3691 setTimeout(() => { 3692 elem.style.left = '0'; 3693 elem.style.opacity = 1; 3694 }, 10); 3695 3696 setTimeout(() => { 3697 elem.style.left = '-400px'; 3698 elem.style.opacity = 0; 3699 }, this.hideAfter - 300); 3700 } 3701 } 3702 }, 3703 eventListeners: { 3704 ['@messages-loaded.window']() { 3705 this.addMessages(event.detail.messages, this.hideAfter) 3706 }, 3707 ['@private-content-loaded.window'](event) { 3708 const data = event.detail.data; 3709 if ( 3710 data.messages && 3711 data.messages.messages && 3712 data.messages.messages.length 3713 ) { 3714 this.addMessages(data.messages.messages, this.hideAfter); 3715 } 3716 }, 3717 ['@clear-messages.window']() { 3718 this.messages = []; 3719 } 3720 } 3721 } 3722 } 3723</script>
3723 3724<section id="messages" 3725 x-data="initMessages()" 3726 x-bind="eventListeners" 3727 class="absolute" 3728> 3729 <template x-if="!isEmpty()"> 3730 <div class="w-full"> 3731 <div role="alert" class="messages mx-auto py-3 pl-0 pr-[.938rem] lg:px-layoutGutter lg:px-0"> 3732 <template x-for="(message, index) in messages" :key="index"> 3733 <div> 3734 <template x-if="message"> 3735 <div class="message w-fit lg:min-w-[25rem] rounded-md relative" :class="message.type" 3736 :ui-id="'message-' + message.type" 3737 style="left: 0; max-width: 400px" 3738 x-init="animateMessage($el)" 3739 > 3740 <span x-html="message.icon" class="mr-3"></span> 3741 <span x-html="message.text" class="pr-2"></span> 3742 <a href="#" class="close cursor-pointer ml-auto my-auto" title="close" 3743 @click.prevent="removeMessage(index)"> 3744 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="text-primary" width="12" height="12" role="img"> 3745 <path d="M21.82 24c-.58 0-1.13-.23-1.54-.64l-8.27-8.27-8.29 8.27a2.179 2.179 0 0 1-3.08-3.08L8.92 12 .64 3.73a2.19 2.19 0 0 1 0-3.09 2.172 2.172 0 0 1 3.08 0L12 8.92 20.27.64a2.19 2.19 0 0 1 3.09 0c.85.85.85 2.23 0 3.09L15.08 12l8.27 8.27c.85.85.85 2.24 0 3.09-.41.41-.96.64-1.54.64Z" style="fill:currentColor"/> 3746<title>x</title></svg> 3747 </a> 3748 </div> 3749 </template> 3750 </div> 3751 </template> 3752 </div> 3753 </div> 3754 </template> 3755</section> 3756</div><div class="columns max-w-lg"><div class="column main">
3756<script> 3757 document.addEventListener("alpine:init", () => { 3758 Alpine.store('ajaxPrices', { 3759 nodesToUpdate: [], 3760 prices: [], 3761 options: { 3762 additional_data: {} 3763 }, 3764 3765 hasPrice(productId){ 3766 return this.getPriceFloat(productId) != null; 3767 }, 3768 3769 getPriceHtml(productId) { 3770 if (!(productId in this.prices)) { 3771 return null; 3772 } 3773 return this.prices[productId]['html']; 3774 }, 3775 3776 getPriceFloat(productId) { 3777 if (!(productId in this.prices)) { 3778 return null; 3779 } 3780 return this.prices[productId]['float']; 3781 }, 3782 3783 addNode(productId) { 3784 if (!productId) { 3785 return 3786 } 3787 3788 this.nodesToUpdate.push({ 3789 "productId": productId, 3790 }); 3791 3792 Alpine.debounce(this.updateNodes.bind(this), 150)(); 3793 }, 3794 3795 updateNodes() { 3796 var nodes = this.nodesToUpdate; 3797 this.nodesToUpdate = []; 3798 3799 this.processNodes(nodes); 3800 }, 3801 3802 processNodes(nodes) { 3803 var self = this, 3804 idsToLoad = [], 3805 containerToReload = []; 3806 3807 nodes.forEach(function (node) { 3808 var productId = node.productId; 3809 3810 if (productId in self.prices) { 3811 //self.apply(node); 3812 return; //continue 3813 } 3814 3815 idsToLoad.push(productId); 3816 3817 containerToReload.push(node); 3818 }); 3819 3820 if (idsToLoad.length) { 3821 self.get(idsToLoad, function () { 3822 self.processNodes(containerToReload); 3823 }); 3824 } 3825 }, 3826 3827 store: function (prices) { 3828 this.prices = Object.assign(this.prices, prices); 3829 }, 3830 3831 get(ids, callback) { 3832 3833 var self = this, 3834 params = '/ids/' + ids.join(); 3835 3836 let additionalParams = this.options.additional_data; 3837 params += "?" + new URLSearchParams(additionalParams).toString(); 3838 3839 fetch(BASE_URL + 'ajaxprices/price/render' + params) 3840 .then((response) => response.json()) 3841 .then((data) => { 3842 if (data.error) { 3843 console.error("ajax_price_error: " + data.errorMessage) 3844 return; 3845 } 3846 3847 var prices = data.data; 3848 self.store(prices); 3849 callback(); 3850 }); 3851 } 3852 }); 3853 }); 3854</script>
3854 3855
3856<script> 3857 document.addEventListener("alpine:init", () => { 3858 Alpine.store('badges', { 3859 nodesToUpdate: [], 3860 badges: [], 3861 productBadges: [], 3862 options: { 3863 additional_data: {} 3864 }, 3865 3866 getBadgesHtml(productId, position) { 3867 if (!(productId in this.productBadges) || !(position in this.productBadges[productId])) { 3868 return []; 3869 } 3870 let index = this.productBadges[productId][position], 3871 self = this, 3872 badges = []; 3873 3874 index.forEach(function (element) { 3875 badges.push(self.badges[element]); 3876 }); 3877 return badges; 3878 }, 3879 3880 addNode(productId, position) { 3881 this.nodesToUpdate.push({ 3882 "productId": productId, 3883 "position": position 3884 }); 3885 3886 Alpine.debounce(this.updateNodes.bind(this), 150)(); 3887 }, 3888 3889 updateNodes() { 3890 var nodes = this.nodesToUpdate; 3891 this.nodesToUpdate = []; 3892 3893 this.processNodes(nodes); 3894 }, 3895 3896 processNodes(nodes) { 3897 var self = this, 3898 idsToLoad = [], 3899 containerToReload = []; 3900 3901 nodes.forEach(function (node) { 3902 var productId = node.productId; 3903 3904 if (self.productBadges[productId]) { 3905 //self.apply(node); 3906 return; //continue 3907 } 3908 3909 idsToLoad.push(productId); 3910 containerToReload.push(node); 3911 }); 3912 3913 if (idsToLoad.length) { 3914 self.get(idsToLoad, function () { 3915 self.processNodes(containerToReload); 3916 }); 3917 } 3918 }, 3919 3920 store: function (badges, productBadges) { 3921 this.badges = Object.assign(this.badges, badges); 3922 this.productBadges = Object.assign(this.productBadges, productBadges); 3923 }, 3924 3925 get(ids, callback) { 3926 var self = this, 3927 params = '/ids/' + ids.join(); 3928 3929 let additionalParams = this.options.additional_data; 3930 params += "?" + new URLSearchParams(additionalParams).toString(); 3931 3932 fetch(BASE_URL + 'badge/api/get' + params) 3933 .then((response) => response.json()) 3934 .then((data) => { 3935 if (data.error) { 3936 console.error("badges_error: " + data.errorMessage) 3937 return; 3938 } 3939 3940 var badges = data.data.badges, 3941 productBadges = data.data.productBadges; 3942 3943 self.store(badges, productBadges); 3944 callback(); 3945 }); 3946 } 3947 }); 3948 }); 3949</script>
3949 3950 3951
3952<script> 3953 document.addEventListener("alpine:init", () => { 3954 Alpine.store('omnibusPrices', { 3955 nodesToUpdate: [], 3956 prices: [], 3957 options: { 3958 additional_data: {} 3959 }, 3960 3961 hasPrice(productId){ 3962 return this.getPriceHtml(productId) != null; 3963 }, 3964 3965 getPriceHtml(productId) { 3966 if (!(productId in this.prices)) { 3967 return null; 3968 } 3969 return this.prices[productId]; 3970 }, 3971 3972 addNode(productId, position) { 3973 this.nodesToUpdate.push({ 3974 "productId": productId, 3975 }); 3976 3977 Alpine.debounce(this.updateNodes.bind(this), 150)(); 3978 }, 3979 3980 updateNodes() { 3981 var nodes = this.nodesToUpdate; 3982 this.nodesToUpdate = []; 3983 3984 this.processNodes(nodes); 3985 }, 3986 3987 processNodes(nodes) { 3988 var self = this, 3989 idsToLoad = [], 3990 containerToReload = []; 3991 3992 nodes.forEach(function (node) { 3993 var productId = node.productId; 3994 3995 if (productId in self.prices) { 3996 //self.apply(node); 3997 return; //continue 3998 } 3999 4000 idsToLoad.push(productId); 4001 containerToReload.push(node); 4002 }); 4003 4004 if (idsToLoad.length) { 4005 self.get(idsToLoad, function () { 4006 self.processNodes(containerToReload); 4007 }); 4008 } 4009 }, 4010 4011 store: function (prices) { 4012 this.prices = Object.assign(this.prices, prices); 4013 }, 4014 4015 get(ids, callback) { 4016 var self = this, 4017 params = '/ids/' + ids.join(); 4018 4019 let additionalParams = this.options.additional_data; 4020 params += "?" + new URLSearchParams(additionalParams).toString(); 4021 4022 fetch(BASE_URL + 'omnibus/ajax/render' + params) 4023 .then((response) => response.json()) 4024 .then((data) => { 4025 if (data.error) { 4026 console.error("omnibus_prices_error: " + data.errorMessage) 4027 return; 4028 } 4029 4030 var prices = data.data; 4031 self.store(prices); 4032 callback(); 4033 }); 4034 } 4035 }); 4036 }); 4037</script>
vendor: 1 bytes, line 4037
4037
4038<script nonce="Z21reG1veG44ajg0aHZqYmg4NG5sY2Rqd2l1bWZla2g="> 4039 var feedId = getUrlParam('ff'), 4040 product = getUrlParam('fp'), 4041 currentDate = new Date(), 4042 session = getCookie('feed_session'); 4043 4044 if (!session) { 4045 session = '' + Math.floor(currentDate.getTime() / 1000) + Math.floor(Math.random() * 10000001); 4046 } 4047 4048 if (session && feedId > 0 && product > 0) { 4049 setCookie('feed_session', session, {expires: 365, path: '/'}); 4050 setCookie('feed_id', feedId, 365); 4051 4052 var xhr = new XMLHttpRequest(), 4053 baseUrl = 'https://www.farma.it/', 4054 url = BASE_URL + '?rnd=' + Math.floor(Math.random() * 10000001) + "&feed=" + feedId + "&session=" + session + "&product=" + product; 4055 4056 xhr.open('GET', url, true); 4057 xhr.setRequestHeader('Content-Type', 'application/json'); 4058 xhr.send(); 4059 } 4060 4061 function getUrlParam(name) { 4062 let results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); 4063 4064 if (results === null) { 4065 return ''; 4066 } else { 4067 return results[1] || 0; 4068 } 4069 } 4070 4071 function getCookie(cookieName) { 4072 var name = cookieName + "=", 4073 decodedCookie = decodeURIComponent(document.cookie), 4074 cookieArray = decodedCookie.split(';'); 4075 4076 for (var i = 0; i < cookieArray.length; i++) { 4077 var cookie = cookieArray[i].trim(); 4078 if (cookie.indexOf(name) === 0) { 4079 return cookie.substring(name.length, cookie.length); 4080 } 4081 } 4082 4083 return null; 4084 } 4085 4086 function setCookie(cookieName, cookieValue, expirationDays) { 4087 var d = new Date(); 4088 d.setTime(d.getTime() + (expirationDays * 24 * 60 * 60 * 1000)); 4089 var expires = "expires=" + d.toUTCString(); 4090 document.cookie = cookieName + "=" + cookieValue + ";" + expires + ";path=/"; 4091 } 4092</script>
4092 4093<div class="w-full mx-auto mb-12"> 4094 <h1 class="font-baloo-bhaina font-bold h2 pb-2 mt-5 md:mt-16">Hai dimenticato la password?</h1> 4095 <div class="mb-8"> 4096 <form action="https://www.farma.it/customer/account/forgotpasswordpost/" 4097 method="post" 4098 id="user_forgotpassword" 4099 x-data="initPasswordForm()" 4100 @submit.prevent="submitForm();"> 4101 <input name="form_key" type="hidden" value="NuWLCNhC6L8sVz4U" /> <input type="hidden" name="formId" value="user_forgotpassword"/> 4102 <div class="control"> 4103 <input type="hidden" 4104 value="" 4105 name="g-recaptcha-response" 4106 > 4107</div> 4108 <fieldset class="fieldset"> 4109 <div class="mb-4 md:mb-6">Nessun problema!<br>Inserisci il tuo indirizzo mail per reimpostare una nuova password.</div> 4110 <div class="field email required"> 4111 <div class="control"> 4112 <input type="email" name="email" alt="email" id="email_address" class="form-input" placeholder="Indirizzo email *" required 4113 value=""> 4114 </div> 4115 </div> 4116 <p class="legal-notice my-2 text-xxs"> 4117 Questo form è protetto da reCAPTCHA - vi si applicano la <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Privacy Policy</a> e i <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">Termini di Servizio</a> di Google.</p> 4118 </fieldset> 4119 <div class="pt-5"> 4120 <div class="primary"> 4121 <button type="submit" class="w-full action submit primary btn btn-primary disabled:opacity-75" 4122 > 4123 <span>Resetta la mia password</span> 4124 </button> 4125 </div> 4126 <div class="secondary flex justify-center pt-5 md:pt-8"> 4127 <a class="action back text-primary underline" 4128 href="https://www.farma.it/customer/account/login/referer/aHR0cHM6Ly93d3cuZmFybWEuaXQvY3VzdG9tZXIvYWNjb3VudC9mb3Jnb3RwYXNzd29yZC8~/"><span>Torna indietro</span></a> 4129 </div> 4130 </div> 4131 </form> 4132
4132<script> 4133 function initPasswordForm() { 4134 return { 4135 errors: 0, 4136 hasCaptchaToken: 0, 4137 submitForm() { 4138 // Do not rename $form, the variable is expected to be declared in the recaptcha output 4139 const $form = document.querySelector('#user_forgotpassword'); 4140 if (!this.hasCaptchaToken) { 4141 this.errors = 1; 4142 4143 const lockSubmitButton = () => { 4144 $form.querySelector('[type="submit"]')?.setAttribute('disabled', true); 4145 }; 4146 4147 const failCaptcha = (errorMessage, exception = null) => { 4148 this.errors = 1; 4149 lockSubmitButton(); 4150 4151 if (this.setErrorMessages) { 4152 this.setErrorMessages([errorMessage]); 4153 this.displayErrorMessage = true; 4154 } else { 4155 window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000); 4156 } 4157 4158 if (exception) { 4159 console.error( 4160 exception || 4161 'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?' 4162 ); 4163 } 4164 }; 4165 4166 const executeGreCaptcha = () => { 4167 grecaptcha.ready(() => { 4168 grecaptcha.execute( 4169 '6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ', 4170 {action: 'submit'} 4171 ).then((token) => { 4172 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 4173 4174 if (tokenElement && token && token.length > 0) { 4175 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 4176 this.errors = 0; 4177 this.hasCaptchaToken = 1; 4178 (this.submitForm || $form.submit).call(this); 4179 } else { 4180 failCaptcha( 4181 tokenElement 4182 ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 4183 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 4184 ); 4185 } 4186 }).catch((exception) => { 4187 failCaptcha( 4188 'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.', 4189 exception 4190 ); 4191 }); 4192 }); 4193 }; 4194 4195 if (window.grecaptcha) { 4196 executeGreCaptcha(); 4197 } else { 4198 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ"; 4199 const script = document.createElement('script'); 4200 script.setAttribute('type', 'text/javascript'); 4201 script.setAttribute('src', recaptchaUrl); 4202 document.head.appendChild(script); 4203 4204 script.addEventListener("load", executeGreCaptcha, false); 4205 } 4206 } 4207 4208 if (this.errors === 0) { 4209 $form.submit(); 4210 } 4211 } 4212 } 4213 } 4214 </script>
4214 4215 </div> 4216</div>
4217<script> 4218 function hasWebP() { 4219 var elem = document.createElement('canvas'); 4220 4221 if (!!(elem.getContext && elem.getContext('2d'))) { 4222 return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0; 4223 } 4224 return false; 4225 } 4226 4227 if (hasWebP()) { 4228 document.body.classList.add("webp"); 4229 } else { 4230 document.body.classList.add("no-webp"); 4231 } 4232</script>
4232 4233</div></div></main><footer class="page-footer mt-auto"> 4234 <div style="background-image: url('https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/bg_newsletter.webp'); 4235 font-size: justify-content: flex-start; 4236 display: flex; 4237 flex-direction: column; 4238 background-position: left top; 4239 background-size: cover; 4240 background-repeat: no-repeat; 4241 background-attachment: scroll;" 4242 > 4243 <div class="container"> 4244 <div class="py-8 md:py-10 scroll-mt-36" id="newsletter_footer"> 4245 <form class="form subscribe rounded-full" action="https://www.farma.it/newsletter/subscriber/new/" method="post" x-data="initNewsletterForm()" @submit.prevent="submitForm()" id="newsletter-validate-detail"> 4246 <div class="flex flex-wrap justify-start gap-2"> 4247 <label for="newsletter-subscribe" class="sr-only" role="img" aria-label="Indirizzo email"> 4248 Indirizzo email </label> 4249 4250 <input name="form_key" type="hidden" x-bind:value="window.hyva.getFormKey()"> 4251 <div class="control"> 4252 <input type="hidden" 4253 value="" 4254 name="g-recaptcha-response" 4255 > 4256</div> 4257 4258 <div class="w-full md:grid grid-cols-12 items-center xl:items-end"> 4259 <div class="col-span-5 text-white mb-6"> 4260 <h4 class="h2 font-bold font-baloo-bhaina text-white mb-2 md:mb-4">Non perderti nulla!<br/>Iscriviti alla nostra Newsletter</h4> 4261 <p>Ti basta un ultimo click per completare lâiscrizione e iniziare a ricevere subito tutti i <strong>nostri aggiornamenti</strong> e le <strong>nostre promozioni.</strong></p> 4262 </div> 4263 <div></div> 4264 <div class="col-span-6 order-3 md:mb-6"> 4265 <div class="control input-group flex gap-x-2.5 md:gap-x-4 relative"> 4266 <input class="input-text form-control py-2 form-input pl-12" name="email" type="email" required id="newsletter-subscribe" 4267 x-bind:placeholder="window.matchMedia('(max-width: 700px)').matches ? 4268 'Inserisci e-mail *' : 4269 'Inserisci indirizzo e-mail *'"> 4270 <div class="absolute top-0 left-3 py-3.5 pl-1"> 4271 <?xml version="1.0" encoding="UTF-8"?> 4272<svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 24 21.95" class="w-5 h-5" width="24" height="24" role="img"> 4273 <path fill="#5E24C2" d="m19.19,21.95H4.81c-2.65,0-4.8-2.16-4.81-4.81V4.81C0,2.16,2.16,0,4.81,0h14.38c2.65,0,4.8,2.16,4.81,4.81v12.32c0,2.65-2.16,4.8-4.81,4.81ZM1.4,5.57v11.57c0,1.88,1.53,3.4,3.41,3.41h14.38c1.88,0,3.4-1.53,3.4-3.41V5.57l-7.19,7.19c-1.88,1.88-4.93,1.88-6.81,0L1.4,5.57ZM4.81,1.4c-1.39,0-2.64.85-3.15,2.14l-.08.2,8.02,8.02c1.33,1.33,3.48,1.33,4.82,0L22.43,3.75l-.08-.2c-.51-1.3-1.76-2.15-3.16-2.14H4.81Z"/> 4274<title>footer/icon_email</title></svg> 4275 </div> 4276 <div class="input-group-append"> 4277 <button class="btn btn-secondary h-full"> 4278 Iscriviti </button> 4279 </div> 4280 </div> 4281 <div class="flex gap-2 mt-3 pl-5 max-w-lg"> 4282 4283 <div x-data="{ 4284 checked: false, 4285 consentId: 5 }" 4286 id="checkbox-0" 4287 class="flex w-full last:mb-3"> 4288 <div 4289 class="flex flex-wrap field choice "> 4290 <input type="hidden" name="amgdpr_agreement[newsletter_privacy_policy]" 4291 value="0"/> 4292 <div class="flex flex-row"> 4293 <input type="checkbox" 4294 name="amgdpr_agreement[newsletter_privacy_policy]" 4295 title="Newsletter - Privacy Policy" 4296 value="1" 4297 id="amprivacy-checkbox-6ac931cd7d8a9" 4298 class="amgdpr-consent-checkbox mt-0.5" 4299 x-model="checked" 4300 @amgdpr-consent-accepted.window="event.detail === consentId && (checked = true)" 4301 required 4302 /> 4303 <label for="amprivacy-checkbox-6ac931cd7d8a9" 4304 class="label">
4305 <span class="amgdpr-consent-span"> 4306 Letta lâ<a href="/privacy-policy" target="_blank" class="underline">informativa privacy</a>, presto il mio consenso per ricevere newsletter e/o DEM </span> 4307 </label> 4308 </div> 4309 <div class="h-0 w-full"></div> 4310 </div> 4311 4312 <input type="hidden" 4313 name="am-gdpr-checkboxes-from" 4314 value="subscription"/> 4315 </div> 4316<policy-placeholder></policy-placeholder> 4317 </div> 4318 </div> 4319 </div> 4320 </div> 4321 <div> 4322 <template x-if="displayErrorMessage"> 4323 <p class="flex items-center mage-error"> 4324 <span class="inline-block w-8 h-8 mr-3"> 4325 <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"> 4326 <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> 4327<title>exclamation-circle</title></svg> 4328 </span> 4329 <template x-for="errorMessage in errorMessages"> 4330 <span x-html="errorMessage"></span> 4331 </template> 4332 </p> 4333 </template> 4334 </div> 4335 </form> 4336 <div class="w-full text-white"> 4337 <p class="legal-notice my-2 text-xxs"> 4338 Questo form è protetto da reCAPTCHA - vi si applicano la <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">Privacy Policy</a> e i <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">Termini di Servizio</a> di Google.</p> 4339 </div> 4340
4340<script type="text/javascript"> 4341 function initNewsletterForm() { 4342 return { 4343 errors: 0, 4344 hasCaptchaToken: 0, 4345 displayErrorMessage: false, 4346 errorMessages: [], 4347 setErrorMessages(messages) { 4348 this.errorMessages = [messages] 4349 this.displayErrorMessage = this.errorMessages.length 4350 }, 4351 submitForm() { 4352 // Do not rename $form, the variable is expected to be declared in the recaptcha output 4353 const $form = document.querySelector('#newsletter-validate-detail'); 4354 if (!this.hasCaptchaToken) { 4355 this.errors = 1; 4356 4357 const lockSubmitButton = () => { 4358 $form.querySelector('[type="submit"]')?.setAttribute('disabled', true); 4359 }; 4360 4361 const failCaptcha = (errorMessage, exception = null) => { 4362 this.errors = 1; 4363 lockSubmitButton(); 4364 4365 if (this.setErrorMessages) { 4366 this.setErrorMessages([errorMessage]); 4367 this.displayErrorMessage = true; 4368 } else { 4369 window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000); 4370 } 4371 4372 if (exception) { 4373 console.error( 4374 exception || 4375 'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?' 4376 ); 4377 } 4378 }; 4379 4380 const executeGreCaptcha = () => { 4381 grecaptcha.ready(() => { 4382 grecaptcha.execute( 4383 '6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ', 4384 {action: 'submit'} 4385 ).then((token) => { 4386 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 4387 4388 if (tokenElement && token && token.length > 0) { 4389 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 4390 this.errors = 0; 4391 this.hasCaptchaToken = 1; 4392 (this.submitForm || $form.submit).call(this); 4393 } else { 4394 failCaptcha( 4395 tokenElement 4396 ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 4397 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 4398 ); 4399 } 4400 }).catch((exception) => { 4401 failCaptcha( 4402 'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.', 4403 exception 4404 ); 4405 }); 4406 }); 4407 }; 4408 4409 if (window.grecaptcha) { 4410 executeGreCaptcha(); 4411 } else { 4412 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ"; 4413 const script = document.createElement('script'); 4414 script.setAttribute('type', 'text/javascript'); 4415 script.setAttribute('src', recaptchaUrl); 4416 document.head.appendChild(script); 4417 4418 script.addEventListener("load", executeGreCaptcha, false); 4419 } 4420 } 4421 4422 if (this.errors === 0) { 4423 $form.submit(); 4424 } 4425 } 4426 } 4427 } 4428 </script>
4428 4429</div> 4430 </div> 4431 </div> 4432 <div x-data="{ show: false }" x-intersect.once.margin.200px="show = true" x-init="$watch('show', (value) => { if (value) { $nextTick(() => { $dispatch('footer:added') }); } } )" class="dna-footer-item " id="dna-footer-item_footer"> 4433 <template x-if="show"> 4434 <div class="dna-footer-item-content"> 4435 <div data-content-type="html" data-appearance="default" data-intersect="false" data-element="main" data-decoded="true"><div class="bg-container-gray"> 4436 <div class="lg:grid grid-cols-10 justify-between w-full py-5 md:pt-10 md:pb-8 xl:gap-8 container bg-container-gray pt-2"> 4437 <div class="md:grid grid-cols-3 col-span-7 md:mr-8 gap-2"> 4438 <div class="overflow-hidden md:mb-8 lg:mb-0 mb-3" x-data="{open: false}"> 4439 <h5 class="font-bold md:pb-4 pt-3 md:pt-0 md:pb-3 flex justify-between font-baloo-bhaina" @click="open = !open">farma.it 4440 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4441 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_down.svg" alt="down"/> 4442 </span> 4443 <span class="text-xl md:hidden items-center flex" x-show="open"> 4444 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_up.svg" alt="up"/> 4445 </span> 4446 </h5> 4447 4448 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto" :class="open ? '' : 'h-0'" 4449 x-bind:style="open ? 'height:' + $el.childElementCount * 27 /* 25px element child width */ + 'px' : ''"> 4450 <li class="py-0.5"><a href="/chi-siamo" class="text-xs md:text-base hover:text-secondary">La nostra Azienda</a></li> 4451 <li class="py-0.5"><a href="/coupon-e-promo" class="text-xs md:text-base hover:text-secondary">Coupon</a></li> 4452 <li class="py-0.5"><a href="/farma-lovers" class="text-xs md:text-base hover:text-secondary">Programma Fedeltà Farma Lovers</a></li> 4453 <li class="py-0.5"><a href="/lavora-con-noi" class="text-xs md:text-base hover:text-secondary">Lavora con noi</a></li> 4454 <li class="py-0.5"><a href="/blog" class="text-xs md:text-base hover:text-secondary">I nostri consigli</a></li> 4455 <li class="py-0.5"><a href="/parita-di-genere" class="text-xs md:text-base hover:text-secondary">Politiche per la parità di genere</a></li> 4456 </ul> 4457 </div> 4458 4459 <div class="overflow-hidden mb-3" x-data="{open: false}"> 4460 <h5 class="font-bold md:pb-4 pt-3 md:pt-0 md:pb-3 flex justify-between font-baloo-bhaina" @click="open = !open">Servizi clienti 4461 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4462 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_down.svg" alt="down"/> 4463 </span> 4464 <span class="text-xl md:hidden items-center flex" x-show="open"> 4465 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_up.svg" alt="up"/> 4466 </span> 4467 </h5> 4468 4469 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto" :class="open ? '' : 'h-0'" 4470 x-bind:style="open ? 'height:' + $el.childElementCount * 27 + 'px' : ''"> 4471 <li class="py-0.5"><a href="/contattaci" class="text-xs md:text-base hover:text-secondary">Contattaci</a></li> 4472 <li class="py-0.5"><a href="/richiamami" class="text-xs md:text-base hover:text-secondary">Richiamami</a></li> 4473 <!-- <li class="py-0.5"><a href="/sales/guest/form" class="text-xs md:text-base hover:text-secondary">Stato dell'ordine</a></li> --> 4474 <li class="py-0.5"><a href="/faq" class="text-xs md:text-base hover:text-secondary">FAQ</a></li> 4475 <li class="py-0.5"><a href="/rma/guest/login" class="text-xs md:text-base hover:text-secondary">Resi</a></li> 4476 </ul> 4477 </div> 4478 4479 <div class="overflow-hidden mb-3" x-data="{open: false}"> 4480 <h5 class="font-bold md:pb-4 pt-3 md:pt-0 md:pb-3 flex justify-between font-baloo-bhaina" @click="open = !open">Condizioni di vendita
4481 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4482 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_down.svg" alt="down"/> 4483 </span> 4484 <span class="text-xl md:hidden items-center flex" x-show="open"> 4485 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_up.svg" alt="up"/> 4486 </span> 4487 </h5> 4488 4489 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto text-xs md:text-base " :class="open ? '' : 'h-0'" 4490 x-bind:style="open ? 'height:' + $el.childElementCount * 27 + 'px' : ''"> 4491 <li class="py-0.5"><a href="/pagamenti-e-condizioni" class="hover:text-secondary">Pagamenti & Condizioni</a></li> 4492 <li class="py-0.5"><a href="/spedizioni" class="hover:text-secondary">Spedizioni</a></li> 4493 <li class="py-0.5"><a href="/privacy-policy" class="hover:text-secondary">Privacy Policy</a></li> 4494 <li class="py-0.5"><a href="/cookie-policy" class="hover:text-secondary">Cookie Policy</a></li> 4495 <li class="py-0.5"><a href="/comunicazioni" class="hover:text-secondary">Comunicazioni</a></li> 4496 <li class="py-0.5"><span class="hover:text-secondary cursor-pointer" onclick="Cookiebot.show();preventDefault()">Gestisci Cookie</span> 4497 <li class="py-0.5"><a href="/garanzia-legale" class="hover:text-secondary">Garanzia legale UE â almeno 2 anni</a></li> 4498 </li> 4499 </ul> 4500 </div> 4501 4502 <div class="overflow-hidden" x-data="{open: false}"> 4503 <h5 class="font-bold md:pb-4 pt-3 md:pt-0 md:pb-3 flex justify-between font-baloo-bhaina pb-3" @click="open = !open">Servizi Offerti 4504 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4505 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_down.svg" alt="down"/> 4506 </span> 4507 <span class="text-xl md:hidden items-center flex" x-show="open"> 4508 <img class='w-3 h-3' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_arrow_up.svg" alt="up"/> 4509 </span> 4510 </h5> 4511 4512 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto" :class="open ? 'mb-3' : 'h-0'" 4513 x-bind:style="open ? 'height:' + $el.childElementCount * 32 + 'px' : ''"> 4514 <li class="mb-3"><p class="text-xs md:text-base flex gap-2 items-center"> 4515 <img class='w-5 h-5' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_discount.svg" alt="discount"/>Tantissimi Sconti</p></li> 4516 <li class="mb-3"><p class="text-xs md:text-base flex gap-2 items-center"> 4517 <img class='w-5 h-5' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_lock.svg" alt="lock"/>Transazione Sicura</p></li> 4518 <li class="mb-3"><p class="text-xs md:text-base flex gap-2 items-center"> 4519 <img class='w-5 h-5' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_return.svg" alt="return"/>Reso Facile e Veloce</p></li> 4520 <li><p class="text-xs md:text-base flex gap-2 items-center"> 4521 <img class='w-5 h-5' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/icon_shield.svg" alt="shield"/>Garanzia</p></li> 4522 </ul> 4523 </div> 4524 4525 <div class="overflow-hidden md:w-40"> 4526 <h5 class="font-bold md:pb-4 pb-3 pt-3 md:pt-0 md:pb-3 font-baloo-bhaina"> 4527 Pagamenti Veloci & Sicuri 4528 </h5> 4529 4530 <div class="mb-4 flex gap-1.5 md:gap-2 flex-wrap"> 4531 <img title="Visa" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/visa.svg" alt="visa"/> 4532 <img title="PayPal" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/paypal.svg" alt="PayPal"/> 4533 <img title="Mastercard" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/mastercard.svg" alt="Mastercard"/> 4534 <img title="Maestro" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/maestro.svg" alt="Maestro"/> 4535 <img title="Discover" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/discover.svg" alt="Discover"/> 4536 <img title="Amex" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/amex.svg" alt="Amex"/> 4537 <img title="Satispay" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/klarna.svg" alt="Klarna"/> 4538 <img title="Satispay" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/satispay.svg" alt="Satispay"/> 4539 <img title="Contrassegno" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/contrassegno.svg" alt="Contrassegno"/> 4540 <img title="Bonifico" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/payment/bonifico.svg" alt="Bonifico"/> 4541 <img title="Google Pay" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/media/wysiwyg/Google_Pay_Logo_Orlandi.svg" alt="Google Pay"/>
4542 <img title="Apple Pay" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/media/wysiwyg/Apple_Pay_logo_Orlandi.svg" alt="Apple Pay"/> 4543 </div> 4544 </div> 4545 4546 <div class="overflow-hidden md:w-40"> 4547 <h5 class="font-bold md:pb-4 pb-3 pt-3 md:pt-0 font-baloo-bhaina">Consegna Gratuita in 24/72h</h5> 4548 4549 <div class="mb-4 flex gap-1.5 md:gap-2 flex-wrap"> 4550 <img title="GLS" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/carrier/gls.svg" alt="GLS"/> 4551 <img title="UPS" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/carrier/ups.svg" alt="UPS"/> 4552<!-- <img title="Liccardi" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/media/wysiwyg/liccardi_orlandi.svg" alt="Liccardi"/> --> 4553<img title="InPost" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/media/wysiwyg/inpost_orlandi.svg" alt="InPost"/> 4554<!-- <img title="Amazon Shipping" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/media/wysiwyg/amazon-shipping_orlandi.svg" alt="Amazon Shipping"/> --> 4555 </div> 4556 </div> 4557 </div> 4558 4559 <div class="col-span-3"> 4560 <div> 4561 <div> 4562 <h5 class="font-bold md:pb-4 pb-3 pt-3 md:pt-0 md:pb-3 font-baloo-bhaina">Sito sicuro</h5> 4563 </div> 4564 4565 <div class="gap-4 mb-4 md:mb-9 md:flex"> 4566<div style="display:flex;flex-direction:column;gap:8px;margin-bottom:8px"> 4567<div class="feedaty_widget" data-ver="2021" data-id="66ab4361b28b3" data-type="merchant" data-variant="200x150-4" data-lang="all" data-gui="all"></div> 4568<a target="_blank" rel="noopener" href="https://www.farma.it/garanzia-legale"> 4569 <picture class="rounded-lg md:mb-4 !block"><source type="image/webp" srcset="https://www.farma.it/media/wysiwyg/footer/badge/GARAN_Label_colour-968cd542.webp"><img loading="lazy" class="rounded-lg md:mb-4 !block" src="https://www.farma.it/media/wysiwyg/footer/badge/GARAN_Label_colour.jpg" alt="Garanzia Legale" style="width:140px;height:auto" loading="lazy"></picture> 4570 </a> 4571</div> 4572 <div> 4573 <a target="_blank" href="https://www.trovaprezzi.it/negozi/farmait"> 4574 <picture class="rounded-lg mb-2 md:mb-4 !block !visible"><source type="image/webp" srcset="https://www.farma.it/media/wysiwyg/footer/badge/trovaprezzi-418bf217.webp"><img loading="lazy" class="rounded-lg mb-2 md:mb-4 !block !visible" src="https://www.farma.it/media/wysiwyg/footer/badge/trovaprezzi.jpg" alt="Trovaprezzi" loading="lazy"></picture> 4575 </a> 4576 <a target="_blank" href="https://www.prezzifarmaco.it/scheda-negozio/farmait-by-antica-farmacia-orlandi-501"> 4577 <picture class="rounded-lg md:mb-4 !block !visible"><source type="image/webp" srcset="https://www.farma.it/media/wysiwyg/footer/badge/prezzifarmaco-5edf662d.webp"><img loading="lazy" class="rounded-lg md:mb-4 !block !visible" src="https://www.farma.it/media/wysiwyg/footer/badge/prezzifarmaco.jpg" alt="Prezzi Farmaco" loading="lazy"></picture> 4578 </a> 4579<a href="https://www.farma.it/farmacia-antifumo"> 4580 <picture><source type="image/webp" srcset="https://www.farma.it/media/wysiwyg/footer/bollino_rettangolare_OK_1-ce63bed2.webp"><img src="https://www.farma.it/media/wysiwyg/footer/bollino_rettangolare_OK_1.png" alt="SITAB" loading="lazy" /></picture> 4581</a> 4582 </div> 4583 </div> 4584 </div> 4585 4586 <div class="mb-8"> 4587 <p class="text-xs mb-2 md:mb-4">Cliccando il badge, puoi verificare che Farma.it è un'entità regolarmente autorizzata dal Ministero della Salute a effettuare la vendita online di medicinali.</p> 4588 4589 <div class="flex gap-2 mb-6 md:mb-8"> 4590 <a target="_blank" href="https://www.salute.gov.it/LogoCommercioElettronico/CercaSitoEComm?useMode=getDettaglio&VOLID=C016715"> 4591 <picture class="rounded-lg !block !visible"><source type="image/webp" srcset="https://www.farma.it/media/wysiwyg/footer/badge/farmacia-d29fbe1b.webp"><img loading="lazy" class="rounded-lg !block !visible" src="https://www.farma.it/media/wysiwyg/footer/badge/farmacia.jpg" alt="farmacia" loading="lazy"></picture> 4592 </a> 4593 <a target="_blank" href="https://www.salute.gov.it/LogoCommercioElettronicoVET/CercaSitoEComm?useMode=getDettaglio&VOLID=C016715&area=veterinari&id=5907&lingua=italiano&menu=vendite"> 4594 <picture class="rounded-lg !block !visible"><source type="image/webp" srcset="https://www.farma.it/media/wysiwyg/footer/badge/VET-fdaf9e0c.webp"><img loading="lazy" class="rounded-lg !block !visible" src="https://www.farma.it/media/wysiwyg/footer/badge/VET.jpg" alt="VET" loading="lazy"></picture> 4595 </a> 4596 </div> 4597<div class="mb-2 md:mb-4 flex gap-2"> 4598<a href="https://apps.apple.com/it/app/farma-it/id6740766576" target="_blank"> 4599<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="135" viewB
4599ox="0 0 119.66407 40"> 4600 <title>Download_on_the_App_Store_Badge_IT_RGB_blk_100317</title> 4601 <g> 4602 <g> 4603 <g> 4604 <path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"></path> 4605 <path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"></path> 4606 </g> 4607 <g id="_Group_" data-name="<Group>"> 4608 <g id="_Group_2" data-name="<Group>"> 4609 <g id="_Group_3" data-name="<Group>"> 4610 <path id="_Path_" data-name="<Path>" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"></path> 4611 <path id="_Path_2" data-name="<Path>" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"></path> 4612 </g> 4613 </g> 4614 <g> 4615 <path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"></path> 4616 <path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"></path> 4617 <path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"></path> 4618 <path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.9
46181895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"></path> 4619 <path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"></path> 4620 <path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"></path> 4621 <path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"></path> 4622 <path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"></path> 4623 </g> 4624 </g> 4625 </g> 4626 <g id="_Group_4" data-name="<Group>"> 4627 <g> 4628 <path d="M36.30861,13.09326c.07813.56641.63184.92627,1.43066.92627.74414,0,1.29-.38428,1.29-.91357,0-.45508-.34766-.728-1.1377-.91406l-.76855-.186c-1.0791-.25244-1.57129-.77344-1.57129-1.6499,0-1.063.86816-1.77,2.1709-1.77a1.94737,1.94737,0,0,1,2.15039,1.71191h-.90234A1.13875,1.13875,0,0,0,37.71,9.40479c-.73242,0-1.21973.35156-1.21973.88916,0,.42578.31445.66992,1.0918.85156l.65723.16162c1.22363.28516,1.72852.78125,1.72852,1.67871,0,1.14111-.88477,1.85645-2.29883,1.85645-1.32324,0-2.21289-.68213-2.2793-1.749Z" style="fill: #fff"></path> 4629 <path d="M44.15432,11.6665a1.00546,1.00546,0,0,0-1.06348-.76465c-.74414,0-1.19922.57031-1.19922,1.52979,0,.97607.459,1.55908,1.19922,1.55908a.97873.97873,0,0,0,1.06348-.74023h.86426a1.762,1.762,0,0,1-1.92285,1.53418,2.06791,2.06791,0,0,1-2.11328-2.353,2.05305,2.05305,0,0,1,2.1084-2.32373,1.77731,1.77731,0,0,1,1.92773,1.55859Z" style="fill: #fff"></path> 4630 <path d="M45.90041,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,45.90041,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,48.79494,13.03955Z" style="fill: #fff"></path> 4631 <path d="M51.07131,10.19482h.85547v.69043h.06641a1.22092,1.22092,0,0,1,1.21582-.76514,1.86836,1.86836,0,0,1,.39648.03711v.877a2.43442,2.43442,0,0,0-.49609-.05371A1.05507,1.05507,0,0,0,51.96,12.03906v2.65869h-.88867Z" style="fill: #fff"></path> 4632 <path d="M54.53811,8.86328a.57572.57572,0,1,1,.5752.5415A.54735.54735,0,0,1,54.53811,8.86328Zm.13184,1.33154h.88574v4.50293h-.88574Z" style="fill: #fff"></path> 4633 <path d="M59.93752,11.6665a1.00546,1.00546,0,0,0-1.06348-.76465c-.74414,0-1.19922.57031-1.19922,1.52979,0,.97607.459,1.55908,1.19922,1.55908a.97873.97873,0,0,0,1.06348-.74023h.86426a1.762,1.762,0,0,1-1.92285,1.53418,2.06791,2.06791,0,0,1-2.11328-2.353,2.05305,2.05305,0,0,1,2.1084-2.32373,1.77731,1.77731,0,0,1,1.92773,1.55859Z" style="fill: #fff"></path> 4634 <path d="M61.68361,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76611.562,1.76611,1.51318v3.07666h-.856v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,61.68361,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,64.57815,13.03955Z" style="fill: #fff"></path> 4635 <path d="M70.94289,10.10791c1.0127,0,1.6748.47119,1.76172,1.26514h-.85254c-.082-.33057-.40527-.5415-.90918-.5415-.49609,0-.873.23535-.873.58691,0,.269.22754.43848.71582.55029l.748.17334c.85645.19873,1.25781.56689,1.25781,1.22852,0,.84766-.79,1.41406-1.86523,1.41406-1.07129,0-1.76953-.48389-1.84863-1.28174h.88965a.91365.91365,0,0,0,.97949.562c.55371,0,.94727-.248.94727-.60791,0-.26855-.21094-.44238-.66211-.5498l-.78516-.18213c-.85645-.20264-1.25293-.58691-1.25293-1.25684C69.19387,10.66992,69.92531,10.10791,70.94289,10.10791Z" style="fill: #fff"></path> 4636 <path d="M77.78469,14.69775h-.85645v-.71533h-.07031a1.35022,1.35022,0,0,1-1.36035.80225,1.4622,1.4622,0,0,1-1.55078-1.6665V10.19482h.88965v2.69189c0,.72754.293,1.0752.94629,1.0752a1.02228,1.02228,0,0,0,1.1123-1.1333V10.19482h.88965Z" style="fill: #fff"></path> 4637 </g> 4638 </g> 4639 </g> 4640</svg> 4641 4642 4643</a> 4644<a href="https://play.google.com/store/apps/details?id=com.developer.farmait" target="_blank">
4645<svg version="1.1" id="svg1372" width="150" viewBox="0 0 861.33331 255.2092" sodipodi:docname="google-play-badge-it.eps" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> 4646 <defs id="defs1376"> 4647 <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1390"> 4648 <path d="M 0,2207.03 H 6460 V 292.961 H 0 Z" id="path1388"></path> 4649 </clipPath> 4650 <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1412"> 4651 <path d="M 0,2207.04 H 6460 V 292.961 H 0 Z" id="path1410"></path> 4652 </clipPath> 4653 </defs> 4654 <sodipodi:namedview id="namedview1374" pagecolor="#ffffff" bordercolor="#000000" borderopacity="0.25" inkscape:showpageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" showgrid="false"></sodipodi:namedview> 4655 <g id="g1380" inkscape:groupmode="layer" inkscape:label="Page 1" transform="matrix(1.3333333,0,0,-1.3333333,-5.5867668e-7,294.27066)"> 4656 <g id="g1382" transform="scale(0.1)"> 4657 <g id="g1384"> 4658 <g id="g1386" clip-path="url(#clipPath1390)"> 4659 <path d="M 6220.74,292.969 H 239.262 C 107.668,292.969 0,400.629 0,532.23 v 1435.55 c 0,131.6 107.668,239.26 239.262,239.26 H 6220.74 c 131.59,0 239.26,-107.66 239.26,-239.26 V 532.23 c 0,-131.601 -107.67,-239.261 -239.26,-239.261" style="fill:#100f0d;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1392"></path> 4660 <path d="M 6220.74,2207.03 H 239.262 C 107.668,2207.03 0,2099.36 0,1967.77 V 532.219 C 0,400.621 107.668,292.961 239.262,292.961 H 6220.74 c 131.59,0 239.26,107.66 239.26,239.258 V 1967.77 c 0,131.59 -107.67,239.26 -239.26,239.26 m 0,-38.28 c 110.83,0 200.98,-90.15 200.98,-200.98 V 532.219 c 0,-110.828 -90.15,-200.981 -200.98,-200.981 H 239.262 c -110.828,0 -200.9807,90.153 -200.9807,200.981 V 1967.77 c 0,110.83 90.1527,200.98 200.9807,200.98 H 6220.74" style="fill:#a2a2a1;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1394"></path> 4661 <path d="m 5117.09,771.48 h 89.29 v 598.19 h -89.29 z m 804.24,382.72 -102.35,-259.36 h -3.06 L 5709.68,1154.2 H 5613.5 L 5772.8,791.719 5681.98,590.07 h 93.12 l 245.53,564.13 z M 5414.96,839.43 c -29.28,0 -70.05,14.64 -70.05,50.808 0,46.184 50.77,63.844 94.65,63.844 39.24,0 57.71,-8.473 81.59,-20 -6.94,-55.422 -54.65,-94.652 -106.19,-94.652 m 10.77,327.83 c -64.65,0 -131.64,-28.47 -159.35,-91.54 l 79.29,-33.12 c 16.95,33.12 48.48,43.89 81.59,43.89 46.18,0 93.12,-27.71 93.89,-76.95 v -6.17 c -16.18,9.23 -50.82,23.06 -93.12,23.06 -85.42,0 -172.41,-46.942 -172.41,-134.649 0,-80.062 70.05,-131.601 148.53,-131.601 60.05,0 93.12,26.898 113.94,58.48 h 3.06 v -46.18 h 86.18 v 229.36 c 0,106.18 -79.24,165.42 -181.6,165.42 m -551.83,-85.89 h -127 v 205.09 h 127 c 66.76,0 104.65,-55.32 104.65,-102.55 0,-46.37 -37.89,-102.54 -104.65,-102.54 m -2.29,288.3 H 4657.66 V 771.48 h 89.24 v 226.622 h 124.71 c 98.95,0 196.24,71.688 196.24,185.808 0,114.13 -97.29,185.76 -196.24,185.76 M 3704.93,839.328 c -61.68,0 -113.31,51.633 -113.31,122.551 0,71.681 51.63,124.131 113.31,124.131 60.91,0 108.67,-52.45 108.67,-124.131 0,-70.918 -47.76,-122.551 -108.67,-122.551 m 102.5,281.372 h -3.06 c -20.05,23.88 -58.57,45.51 -107.14,45.51 -101.79,0 -195.05,-89.44 -195.05,-204.331 0,-114.078 93.26,-202.75 195.05,-202.75 48.57,0 87.09,21.582 107.14,46.269 h 3.06 v -29.277 c 0,-77.902 -41.59,-119.492 -108.67,-119.492 -54.75,0 -88.67,39.293 -102.55,72.453 l -77.85,-32.402 c 22.34,-53.969 81.73,-120.25 180.4,-120.25 104.84,0 193.51,61.679 193.51,211.992 v 365.438 h -84.84 z M 3953.9,771.48 h 89.44 v 598.24 h -89.44 z m 221.27,197.34 c -2.3,78.67 60.92,118.72 106.38,118.72 35.5,0 65.55,-17.71 75.55,-43.16 z m 277.54,67.85 c -16.99,45.51 -68.62,129.54 -174.23,129.54 -104.84,0 -191.93,-82.5 -191.93,-203.569 0,-114.071 86.32,-203.512 201.93,-203.512 93.31,0 147.24,57.043 169.64,90.199 l -69.39,46.274 c -23.16,-33.922 -54.74,-56.274 -100.25,-56.274 -45.45,0 -77.85,20.82 -98.67,61.633 l 272.14,112.599 z m -2168.07,67.04 v -86.32 h 206.58 c -6.18,-48.57
4661-22.35,-84.031 -46.99,-108.671 -30.1,-30.098 -77.14,-63.219 -159.59,-63.219 -127.24,0 -226.67,102.5 -226.67,229.74 0,127.19 99.43,229.69 226.67,229.69 68.62,0 118.72,-26.94 155.71,-61.63 l 60.91,60.86 c -51.67,49.34 -120.25,87.14 -216.62,87.14 -174.23,0 -320.7,-141.88 -320.7,-316.06 0,-174.279 146.47,-316.111 320.7,-316.111 94.03,0 164.95,30.871 220.45,88.672 57.04,57.039 74.8,137.187 74.8,201.979 0,20.05 -1.54,38.52 -4.65,53.93 z m 530.1,-264.382 c -61.63,0 -114.84,50.871 -114.84,123.313 0,73.269 53.21,123.369 114.84,123.369 61.68,0 114.89,-50.1 114.89,-123.369 0,-72.442 -53.21,-123.313 -114.89,-123.313 m 0,326.882 c -112.55,0 -204.28,-85.61 -204.28,-203.569 0,-117.141 91.73,-203.512 204.28,-203.512 112.55,0 204.33,86.371 204.33,203.512 0,117.959 -91.78,203.569 -204.33,203.569 m 445.69,-326.882 c -61.68,0 -114.89,50.871 -114.89,123.313 0,73.269 53.21,123.369 114.89,123.369 61.69,0 114.85,-50.1 114.85,-123.369 0,-72.442 -53.16,-123.313 -114.85,-123.313 m 0,326.882 c -112.54,0 -204.28,-85.61 -204.28,-203.569 0,-117.141 91.74,-203.512 204.28,-203.512 112.55,0 204.28,86.371 204.28,203.512 0,117.959 -91.73,203.569 -204.28,203.569" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1396"></path> 4662 <path d="M 991.355,1277.56 481.879,736.828 c 0.047,-0.09 0.047,-0.238 0.098,-0.328 15.644,-58.719 69.238,-101.93 132.882,-101.93 25.457,0 49.336,6.891 69.817,18.95 l 1.625,0.96 573.459,330.891 -268.405,292.189" style="fill:#eb3131;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1398"></path> 4663 <path d="m 1506.77,1369.63 -0.48,0.34 -247.59,143.51 -278.927,-248.21 279.927,-279.84 246.25,142.07 c 43.16,23.36 72.5,68.86 72.5,121.31 0,52.16 -28.91,97.42 -71.68,120.82" style="fill:#f6b60b;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1400"></path> 4664 <path d="m 481.867,1763.11 c -3.062,-11.29 -4.687,-23.16 -4.687,-35.41 V 772.191 c 0,-12.25 1.625,-24.113 4.738,-35.363 l 526.942,526.902 -526.993,499.38" style="fill:#5778c5;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1402"></path> 4665 <path d="m 995.117,1249.95 263.663,263.62 -572.784,332.09 c -20.816,12.49 -45.125,19.67 -71.109,19.67 -63.641,0 -117.332,-43.31 -132.981,-102.07 0,-0.05 -0.047,-0.1 -0.047,-0.15 l 513.258,-513.16" style="fill:#3bad49;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1404"></path> 4666 </g> 4667 </g> 4668 <g id="g1406"> 4669 <g id="g1408" clip-path="url(#clipPath1412)"> 4670 <path d="m 2093.53,1621.88 c 33.87,0 60.16,9.36 78.89,28.09 18.73,18.74 28.1,44.61 28.1,77.64 0,33.03 -9.37,58.92 -28.1,77.65 -18.73,18.73 -45.02,28.1 -78.89,28.1 h -48.29 v -211.48 z m -94.08,254.78 h 95.33 c 30.81,0 57.66,-6.25 80.55,-18.74 22.9,-12.49 40.52,-30.04 52.88,-52.66 12.35,-22.63 18.52,-48.5 18.52,-77.65 0,-29.14 -6.17,-55.02 -18.52,-77.64 -12.36,-22.62 -29.98,-40.17 -52.88,-52.66 -22.89,-12.49 -49.74,-18.73 -80.55,-18.73 h -95.33 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1414"></path> 4671 <path d="m 2306.26,1876.66 h 45.79 v -298.08 h -45.79 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1416"></path> 4672 <path d="m 2447.81,1593.56 c -19.71,14.43 -33.45,34.69 -41.22,60.78 l 43.3,17.49 c 4.44,-16.65 12.35,-30.26 23.73,-40.8 11.37,-10.55 25.11,-15.82 41.22,-15.82 14.98,0 27.68,3.88 38.08,11.66 10.41,7.77 15.62,18.45 15.62,32.05 0,12.49 -4.58,22.83 -13.74,31.02 -9.16,8.19 -24.98,16.17 -47.46,23.94 l -18.73,6.66 c -20.27,7.21 -37.12,17.28 -50.59,30.18 -13.46,12.91 -20.19,30.04 -20.19,51.42 0,14.7 3.96,28.31 11.87,40.79 7.91,12.49 19,22.34 33.3,29.56 14.3,7.22 30.46,10.83 48.51,10.83 25.81,0 46.48,-6.32 62.03,-18.94 15.53,-12.64 26.08,-26.86 31.64,-42.68 l -41.22,-17.49 c -2.78,10 -8.61,18.6 -17.48,25.82 -8.89,7.21 -20.4,10.82 -34.56,10.82 -13.6,0 -25.12,-3.61 -34.55,-10.82 -9.44,-7.22 -14.15,-16.38 -14.15,-27.48 0,-10.27 4.22,-18.8 12.69,-25.6 8.46,-6.81 21.57,-13.25 39.34,-19.36 l 19.15,-6.66 c 25.53,-8.89 45.23,-20.4 59.12,-34.55 13.88,-14.16 20.81,-33.04 20.81,-56.62 0,-19.43 -4.92,-35.74 -14.78,-48.92 -9.85,-13.19 -22.48,-22.96
4672-37.88,-29.35 -15.41,-6.38 -31.16,-9.57 -47.25,-9.57 -24.71,0 -46.91,7.21 -66.61,21.64" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1418"></path> 4673 <path d="m 2777.94,1737.61 c 15.27,0 27.54,4.78 36.85,14.36 9.29,9.58 13.94,20.74 13.94,33.51 0,12.77 -4.65,23.94 -13.94,33.52 -9.31,9.57 -21.58,14.36 -36.85,14.36 h -57.87 v -95.75 z m -103.66,139.05 h 102.41 c 17.77,0 34.06,-3.89 48.92,-11.66 14.84,-7.78 26.64,-18.6 35.39,-32.47 8.74,-13.89 13.11,-29.57 13.11,-47.05 0,-17.48 -4.37,-33.16 -13.11,-47.04 -8.75,-13.88 -20.55,-24.71 -35.39,-32.47 -14.86,-7.77 -31.15,-11.66 -48.92,-11.66 h -56.62 v -115.73 h -45.79 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1420"></path> 4674 <path d="m 3122.01,1629.57 c 16.52,9.58 29.56,22.9 39.14,39.97 9.58,17.07 14.36,36.43 14.36,58.07 0,21.66 -4.78,41.01 -14.36,58.08 -9.58,17.07 -22.62,30.39 -39.14,39.97 -16.51,9.57 -34.76,14.36 -54.74,14.36 -19.98,0 -38.23,-4.79 -54.75,-14.36 -16.51,-9.58 -29.55,-22.9 -39.13,-39.97 -9.57,-17.07 -14.36,-36.42 -14.36,-58.08 0,-21.64 4.79,-41 14.36,-58.07 9.58,-17.07 22.62,-30.39 39.13,-39.97 16.52,-9.57 34.77,-14.36 54.75,-14.36 19.98,0 38.23,4.79 54.74,14.36 z m -133.42,-36.84 c -23.6,13.88 -42.12,32.68 -55.58,56.41 -13.47,23.74 -20.19,49.89 -20.19,78.47 0,28.59 6.72,54.75 20.19,78.48 13.46,23.73 31.98,42.53 55.58,56.41 23.58,13.88 49.81,20.82 78.68,20.82 28.87,0 55.02,-6.94 78.47,-20.82 23.45,-13.88 41.91,-32.68 55.38,-56.41 13.45,-23.73 20.18,-49.89 20.18,-78.48 0,-28.58 -6.73,-54.73 -20.18,-78.47 -13.47,-23.73 -31.93,-42.53 -55.38,-56.41 -23.45,-13.88 -49.6,-20.81 -78.47,-20.81 -28.87,0 -55.1,6.93 -78.68,20.81" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1422"></path> 4675 <path d="m 3280.41,1876.66 h 54.12 l 134.89,-218.99 h 2.5 l -2.5,57.46 v 161.53 h 45.38 v -298.08 h -47.46 l -141.55,230.22 h -2.5 l 2.5,-57.46 v -172.76 h -45.38 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1424"></path> 4676 <path d="m 3590.15,1876.66 h 45.79 v -298.08 h -45.79 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1426"></path> 4677 <path d="m 3827.45,1621.04 c 14.43,0 26.02,4.37 34.76,13.11 8.74,8.75 13.11,19.22 13.11,31.43 0,12.22 -4.51,22.76 -13.52,31.64 -9.02,8.89 -21.03,13.33 -36.02,13.33 h -69.11 v -89.51 z m -7.08,130.3 c 13.88,0 24.98,4.23 33.3,12.71 8.33,8.46 12.49,18.24 12.49,29.34 0,11.1 -4.1,20.75 -12.27,28.94 -8.19,8.18 -18.81,12.28 -31.86,12.28 h -65.36 v -83.27 z m -109.49,125.32 h 111.57 c 15.82,0 30.53,-3.48 44.13,-10.41 13.6,-6.94 24.36,-16.45 32.27,-28.52 7.91,-12.07 11.87,-25.47 11.87,-40.18 0,-14.71 -3.69,-27.54 -11.04,-38.5 -7.35,-10.97 -17.14,-19.36 -29.36,-25.19 v -2.08 c 15.55,-5.28 27.91,-14.02 37.07,-26.23 9.15,-12.21 13.73,-26.64 13.73,-43.3 0,-16.37 -4.23,-30.87 -12.7,-43.5 -8.47,-12.63 -19.84,-22.48 -34.14,-29.56 -14.3,-7.07 -29.9,-10.61 -46.83,-10.61 h -116.57 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1428"></path> 4678 <path d="m 3981.48,1876.66 h 45.79 v -298.08 h -45.79 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1430"></path> 4679 <path d="m 4102.63,1876.66 h 45.79 v -254.78 h 128.22 v -43.3 h -174.01 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1432"></path> 4680 <path d="m 4324.93,1876.66 h 180.69 v -43.3 h -134.89 v -84.09 h 121.56 v -43.3 h -121.56 v -84.09 h 134.89 v -43.3 h -180.69 v 298.08" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1434"></path> 4681 <path d="m 4680.03,1593.56 c -19.71,14.43 -33.45,34.69 -41.21,60.78 l 43.29,17.49 c 4.45,-16.65 12.36,-30.26 23.73,-40.8 11.38,-10.55 25.12,-15.82 41.22,-15.82 14.98,0 27.69,3.88 38.09,11.66 10.41,7.77 15.61,18.45 15.61,32.05 0,12.49 -4.58,22.83 -13.74,31.02 -9.16,8.19 -24.98,16.17 -47.46,23.94 l -18.73,6.66 c -20.26,7.21 -37.12,17.28 -50.58,30.18 -13.46,12.91 -20.19,30.04 -20.19,51.42 0,14.7 3.96,28.31 11.87,40.79 7.91,12.49 19,22.34 33.3,29.56 14.29,7.22 30.46,10.83 48.5,10.83 25.81,0 46.49,-6.32 62.03,-18.94 15.54,-12.64 26.09,-26.86 31.64,-42.68 l -41.22,-17.49 c -2.77,10 -8.6,18.6 -17.48,25.82 -8.88,7.21 -20.4,10.82 -34.56,10.82 -13.59,0 -25.11,-3.61 -34.55,-10.82 -9.43,-7.22 -14.15,-16.38 -14.15,-27.48 0,-10.27 4.23,-18.8 12.7,-25.6 8.45,-6.81 21.57,-13.25 39.33,-19.36 l 19.15,-6.66 c 25.54,-8.89 45.24,-20.4 59.12,-34.55 13.88,-14.16 20.82,-33.04 20.82,-56.62 0,-19.43 -4.93,-35.74 -14.78,-48.92 -9.85,-13.19 -22.48,-22.96
4681-37.88,-29.35 -15.41,-6.38 -31.16,-9.57 -47.26,-9.57 -24.7,0 -46.9,7.21 -66.61,21.64" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1436"></path> 4682 <path d="m 4952.93,1586.9 c -17.07,9.99 -30.25,24.15 -39.55,42.47 -9.31,18.31 -13.94,39.55 -13.94,63.69 v 183.6 h 45.37 v -186.1 c 0,-22.48 5.83,-40.65 17.49,-54.53 11.65,-13.89 28.16,-20.82 49.54,-20.82 21.65,0 38.3,6.93 49.95,20.82 11.66,13.88 17.49,32.05 17.49,54.53 v 186.1 h 45.38 v -183.6 c 0,-23.87 -4.58,-44.96 -13.74,-63.28 -9.16,-18.31 -22.21,-32.54 -39.13,-42.67 -16.93,-10.13 -36.92,-15.19 -59.95,-15.19 -22.21,0 -41.85,4.99 -58.91,14.98" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path1438"></path> 4683 </g> 4684 </g> 4685 </g> 4686 </g> 4687</svg> 4688 4689</a></div> 4690 </div> 4691 </div> 4692 </div> 4693</div> 4694
4695<script> 4696if(typeof FeedatyWidget !== 'undefined') { 4697FeedatyWidget.init(); 4698} 4699</script>
4699</div> </div> 4700 </template> 4701 </div> 4702 <div class="footer content">
4702<script> 4703 'use strict'; 4704 4705 function amBrandsPopup() { 4706 let cached = false; 4707 4708 const displayError = (error) => { 4709 console.error(error); 4710 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 4711 [{ 4712 type: "error", 4713 text: "Qualcosa\u0020\u00E8\u0020andato\u0020storto.\u0020Riprova\u0020di\u0020nuovo." 4714 }], 10000 4715 ); 4716 }; 4717 4718 let letters = [ 4719 "A","B","C","D", 4720 "E","F","G","H","I","J","K","L","M", 4721 "N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#" 4722 ]; 4723 4724 return { 4725 hoverPanelActiveId: null, 4726 selectedLetter: null, 4727 items: [], 4728 letters: [], 4729 showCount: null, 4730 showFilter: null, 4731 showImages: true, 4732 showSearch: null, 4733 loading: false, 4734 label: 'Brands', 4735 isPopupEnabled: false, 4736 isTopMenuItemEnabled: false, 4737 cache: false, 4738 isMobile: false, 4739 4740 initErrorMessages(errors) { 4741 const messages = []; 4742 for (let error in Object.keys(errors)) { 4743 messages.push({type: 'error', text: errors[error].message}); 4744 } 4745 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(messages, 10000); 4746 }, 4747 4748 chooseLetter(letter) { 4749 this.selectedLetter = this.selectedLetter === letter ? null : letter; 4750 }, 4751 4752 getQuery() { 4753 return "query BrandsPopupQuery { ambrandlist(\n showCount: true\n displayZero: true\n ) {\n all_letters,\n items {\n alt\n brandId\n cnt\n image\n img\n label\n letter\n url\n }\n }\n storeConfig {\n amshopby_brand_general_brands_brands_popup,\n amshopby_brand_general_menu_item_label,\n amshopby_brand_general_brands_page,\n amshopby_brand_general_topmenu_enabled,\n amshopby_brand_general_brands_popup_config {\n show_images,\n display_zero,\n filter_display_all,\n image_width,\n image_height,\n show_filter,\n show_count\n }\n } }" }, 4754 4755 /** 4756 * Retrieve media url for given path 4757 * 4758 * @param path 4759 * @returns {string} 4760 */ 4761 getMediaUrl(path) { 4762 const baseUrl = BASE_URL.replace('index.php/', ''); 4763 if (path.includes('://')) { 4764 return path; 4765 } 4766 4767 let productImageUrl = `${baseUrl}${path}`; 4768 const regexDuplicateDomain = new RegExp(`^(https?:\/\/[^/]+).*\\1`); 4769 productImageUrl = productImageUrl.replace(regexDuplicateDomain, '$1'); 4770 4771 return productImageUrl.includes('/product/placeholder/') 4772 ? productImageUrl.replace(/\/media(?=\/static)/, '') 4773 : productImageUrl; 4774 }, 4775 4776 checkIsMobileResolution() { 4777 this.isMobile = window.matchMedia('(max-width: 1023px)').matches; 4778 }, 4779 4780 getBrandUrl(url){ 4781 return BASE_URL + url; 4782 }, 4783 4784 init() { 4785 this.checkIsMobileResolution(); 4786 4787 this.$watch('hoverPanelActiveId', (value) => { 4788 if (value === 'am-brand') { 4789 this.sendRequest(); 4790 } 4791 }); 4792 }, 4793 4794 /** 4795 * Get brands by letter 4796 * 4797 * @param result 4798 * @returns {{imageWidth: *, isTopMenuItemEnabled: *, showCount: *, displayAll: *, showFilter: *, showImages: *, isPopupEnabled: *, label: *, imageHeight: *, filterDisplayAll: *, brandsPage: *}} 4799 */ 4800 settingsMapper(result) { 4801 const config = result.data.storeConfig?.amshopby_brand_general_brands_popup_config; 4802 return { 4803 showImages: config.show_images, 4804 showCount: config.show_count, 4805 showFilter: config.show_filter, 4806 imageWidth: config.image_width, 4807 imageHeight: config.image_height, 4808 filterDisplayAll: config.filter_display_all, 4809 displayAll: config.display_zero, 4810 isPopupEnabled: result.data.storeConfig?.amshopby_brand_general_brands_brands_popup, 4811 label: result.data.storeConfig?.amshopby_brand_general_menu_item_label, 4812 isTopMenuItemEnabled: result.data.storeConfig?.amshopby_brand_general_topmenu_enabled, 4813 brandsPage: result.data.storeConfig?.amshopby_brand_general_brands_page, 4814 } 4815 }, 4816 4817 /** 4818 * Send request to graphql 4819 * 4820 * @returns {Promise<any>} 4821 */ 4822 async sendRequest() { 4823 if (this.isMobile) { 4824 return false;
4825 } 4826 4827 this.loading = true; 4828 4829 try { 4830 if (cached) { 4831 this.loading = false; 4832 return false; 4833 } 4834 4835 const response = await fetch('https://www.farma.it/graphql', { 4836 method: 'POST', 4837 headers: { 4838 'Content-Type': 'application/json', 4839 'Store': 'default' 4840 }, 4841 credentials: 'include', 4842 body: JSON.stringify({query: this.getQuery(), variables: {}}) 4843 }); 4844 4845 const result = await response.json(); 4846 4847 if (result?.errors) { 4848 this.initErrorMessages(result.errors); 4849 return; 4850 } 4851 4852 const data = result.data?.ambrandlist; 4853 const mapper = this.settingsMapper(result); 4854 4855 // Update component settings 4856 Object.keys(mapper).forEach(config => { 4857 this[config] = mapper[config]; 4858 }); 4859 4860 if (!this.filterDisplayAll) { 4861 letters = data.all_letters.split(','); 4862 } 4863 4864 const items = data.items.map(brand => { 4865 brand.image = brand.img 4866 ? this.getMediaUrl(brand.img) : (brand.image ? this.getMediaUrl(brand.image) : null); 4867 return brand; 4868 }); 4869 4870 this.letters = letters.map(letter => ({ 4871 letter, 4872 brands: this.getLetterItems(items, letter), 4873 })); 4874 4875 this.items = this.letters.filter(row => row.brands?.length > 0); 4876 4877 cached = true; 4878 } catch (error) { 4879 displayError(error); 4880 } finally { 4881 this.loading = false; 4882 } 4883 }, 4884 4885 /** 4886 * Get brands by letter 4887 * 4888 * @param items 4889 * @param letter 4890 * @returns {*} 4891 */ 4892 getLetterItems(items, letter) { 4893 return items.filter(row => row.letter === letter); 4894 }, 4895 4896 convertHtml(text) { 4897 let textField = document.createElement("textarea"); 4898 textField.innerHTML = text; 4899 return textField.value; 4900 } 4901 } 4902 } 4903 4904 function amBrandsPopupData() { 4905 return Object.assign( 4906 amBrandsPopup(), 4907 { 4908 brandPopupClass() { 4909 return { 4910 'hover:border-primary data-[active]:border-primary': !this.isPopupEnabled 4911 } 4912 }, 4913 labelPopupClass() { 4914 return {'w-14 opacity-0': this.label === ''} 4915 }, 4916 popupcontentClass() { 4917 return { 4918 'hidden' : this.hoverPanelActiveId !== 'am-brand', 4919 'left-0' : `${this.$el.dataset.first}`, 4920 'right-0' : `${this.$el.dataset.last}` 4921 } 4922 }, 4923 panelActiveMouseenterEvent() { 4924 return this.hoverPanelActiveId = 'am-brand' 4925 }, 4926 panelActiveMouseleaveEvent() { 4927 return this.hoverPanelActiveId = null 4928 }, 4929 isPopupShow() { 4930 return this.hoverPanelActiveId === 'am-brand' 4931 }, 4932 labelText(){ 4933 return this.label 4934 }, 4935 isEnabledPopup(){ 4936 return this.isPopupEnabled 4937 }, 4938 showExtMessage(){ 4939 return false 4940 }, 4941 notLoading() { 4942 return !this.loading 4943 }, 4944 brandLabel() { 4945 return this.brand.label 4946 }, 4947 letterClass() { 4948 return { 4949 'border-blue-400 text-blue-400 bg-blue-100': this.selectedLetter === this.letter.letter, 4950 'bg-gray-200 text-gray-700 cursor-default pointer-events-none': !this.letter.brands || this.letter.brands.length === 0 4951 } 4952 }, 4953 letterClickEvent(event) { 4954 return this.chooseLetter(this.letter.letter) 4955 }, 4956 letterBrands() { 4957 return this.letter.brands 4958 }, 4959 brandUrl() { 4960 return this.getBrandUrl(this.brand.url) 4961 }, 4962 brandImage() { 4963 return this.brand.image 4964 },
4965 notBrandImage() { 4966 return !this.brand.image 4967 }, 4968 letterLetter() { 4969 return this.letter.letter 4970 }, 4971 brandBrandId() { 4972 return this.brand.brandId 4973 }, 4974 isLetterShow() { 4975 return !this.selectedLetter || this.selectedLetter === this.letter.letter 4976 }, 4977 brandImageMediaUrl() { 4978 return this.getMediaUrl(this.brand.image) 4979 }, 4980 brandImageStyle() { 4981 return `max-width: ${this.imageWidth ? this.imageWidth + 'px' : '100px' };max-height: ${this.imageHeight ? this.imageHeight + 'px' : 'inherit'}` 4982 }, 4983 brandsLabelStyle() { 4984 return `min-width: ${this.imageWidth}px` 4985 }, 4986 brandLabelFilter() { 4987 return this.brand.label.charAt(0) 4988 }, 4989 brandCnt() { 4990 return '(' + this.brand.cnt + ')' 4991 } 4992 } 4993 ) 4994 } 4995 window.addEventListener('alpine:init', () => Alpine.data('amBrandsPopupData', amBrandsPopupData), {once: true}); 4996</script>
4996 4997</div><div class="after-footer footer content"> 4998 <div x-data="{ show: false }" x-intersect.once.margin.200px="show = true" x-init="$watch('show', (value) => { if (value) { $nextTick(() => { $dispatch('footer:added') }); } } )" class="dna-footer-item " id="dna-footer-item_after_footer"> 4999 <template x-if="show"> 5000 <div class="dna-footer-item-content"> 5001 <div data-content-type="html" data-appearance="default" data-intersect="false" data-element="main" data-decoded="true"><div class="bg-quaternary pb-6 pt-5"> 5002 <div class="md:flex justify-between text-white container lg:grid grid-cols-8"> 5003 <div class="flex items-center order-2 col-span-2 mb-4 md:mb-0 w-60 socials"> 5004 <h5 class="font-bold font-baloo-bhaina text-white">Seguici su</h5> 5005 <a target="_blank" href="https://www.instagram.com/farma.it/" class="ml-4"> 5006 <img title="instagram" class='w-5 h-5' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/social/instagram.svg" alt="instagram" /> 5007 </a> 5008 <a target="_blank" href="https://www.facebook.com/farmapuntoit" class="ml-4"> 5009 <img title="Facebook" class='w-5 h-5' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/icon/social/facebook.svg" alt="Facebook" /> 5010 </a> 5011 </div> 5012 <div class="col-span-6"> 5013 <p class="text-xxs mt-2 mb-2 md:flex font-normal leading-5 md:text-xs">Farma.it S.a.s. P. IVA 07417261216 REA: NA-884088 <br class="sm:hidden"> 5014 <span class="flex gap-1.5"><span class="hidden md:block"> -</span>CREDITS 5015 <a href="https://www.dnafactory.it/" target="_blank" title="DNA Factory"> 5016 <img title="DNAFactory" class='w-28 h-5' loading="lazy" src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/dnafactory_logo_negativo.svg" alt="DNAFactory" /> 5017 </a> 5018 </span> 5019 </p> 5020 5021 <p class="text-xxs md:text-xs">Sede legale Via delle Repubbliche Marinare 128, 80147 Napoli </br> 5022Vendita online di medicinali senza obbligo di prescrizione effettuata tramite esercizio autorizzato dal Ministero della Salute â Codice identificativo n. 016715</p> 5023 </div> 5024 </div> 5025</div></div> </div> 5026 </template> 5027 </div> 5028 </div></footer>
5029<script> 5030 function amBannerInjectorResolver () { 5031 const injectors = Object.values({"products.among.injector":{"position":14,"name":"amBannerAmongCategoryInjector"},"products.belowcart.injector":{"position":15,"name":"amBannerBelowCartInjector"}}); 5032 5033 return { 5034 amBannerAmongCategoryInjector: function (sectionId, injectorParams) { 5035 const container = document.querySelector('[data-role="amasty-banner-container"][data-position="' + sectionId + '"]'); 5036 5037 Object.keys(injectorParams.banners).map((id) => { 5038 const params = injectorParams.banners[id]; 5039 const element = container.querySelector('[data-banner-id="' + id + '"]'); 5040 insertBannerAmongCategoryByConfig({ 5041 containerSelector: injectorParams.containerSelector, 5042 itemSelector: injectorParams.itemSelector, 5043 afterProductRow: params.afterProductRow, 5044 afterProductNum: params.afterProductNum, 5045 span: params.width 5046 }, element); 5047 }); 5048 5049 function insertBannerAmongCategoryByConfig (injectorConfig, element) { 5050 const options = { 5051 injectorConfig: {}, 5052 container: null, 5053 after: null, 5054 wrapper: null, 5055 initialized: false, 5056 gridSizes: ['sm', 'xl'], 5057 bannerWidthClass: 'col-span', 5058 ...injectorConfig 5059 } 5060 5061 insertBanner(element); 5062 5063 function insertBanner(element) { 5064 const initialized = setOptions(); 5065 5066 if (!initialized) { 5067 return; 5068 } 5069 5070 element.classList.add('ambanners-injected-banner'); 5071 const wrapper = options.wrapper.cloneNode(true); 5072 5073 wrapper.classList.remove('card', 'card-interactive'); 5074 addStylesForDifferentSizes(wrapper); 5075 5076 insertWrapper(wrapper); 5077 wrapper.append(element); 5078 } 5079 5080 function setOptions () { 5081 const initialized = document.querySelector(options.containerSelector) !== null; 5082 5083 if (!initialized) { 5084 console.warn( 5085 'Failed to initialize banner: Can\'t find an element with selector "' + options.containerSelector + '"' 5086 ); 5087 5088 return; 5089 } 5090 5091 options.container = document.querySelector(options.containerSelector); 5092 5093 setLineToInject(); 5094 5095 if (!options.after) { 5096 return; 5097 } 5098 5099 setWrapper(); 5100 5101 return true; 5102 } 5103 5104 function setLineToInject() { 5105 if (options.afterProductNum === -1) { 5106 setFirstLineToInject(); 5107 } else { 5108 setLineByPositionToInject(); 5109 } 5110 } 5111 5112 function setWrapper() { 5113 if (options.after) { 5114 options.wrapper = options.after.cloneNode(); 5115 } 5116 } 5117 5118 function setFirstLineToInject() { 5119 options.after = document.querySelector(options.itemSelector); 5120 } 5121 5122 function setLineByPositionToInject() { 5123 // calc banner insert offset 5124 const offset = calculateOffsetBasedOnPreviousBanners(); 5125 5126 options.after = document.querySelectorAll(options.itemSelector)[options.afterProductNum - offset]; 5127 } 5128 5129 function calculateOffsetBasedOnPreviousBanners () { 5130 return [...document.querySelectorAll(`${options.itemSelector}`)] 5131 ?.reduce((accumulator, amInjectedBannerWrapper) => { 5132 const widthAttributeValue = Number(amInjectedBannerWrapper?.getAttribute('am-banner-span')) 5133 5134 if (widthAttributeValue > 1) { 5135 accumulator += (widthAttributeValue - 1); 5136 } 5137 5138 return accumulator; 5139 }, 0); 5140 } 5141 5142 function insertWrapper(insert) { 5143 if (options.after) { 5144 insertWrapperAfterFoundProduct(insert); 5145 } else if (options.container) { 5146 insertWrapperInProductListContainer(insert); 5147 } 5148 } 5149 5150 function insertWrapperAfterFoundProduct(insert) { 5151 if (options.afterProductNum === -1) { 5152 options.after.parentNode.insertBefore(insert, options.after); 5153 } else { 5154 options.after.parentNode.insertBefore(insert, options.after.nextSibling); 5155 } 5156 } 5157 5158 function insertWrapperInProductListContainer(insert) { 5159 if (parseInt(options.afterProductRow) > 1) {
5160 options.container.innerHTML += insert.innerHTML; 5161 } else { 5162 options.container.innerHTML = insert.innerHTML + options.container.innerHTML; 5163 } 5164 } 5165 5166 function addStylesForDifferentSizes (wrapper) { 5167 options.gridSizes?.forEach((size, index) => { 5168 const widthValue = options.span > index + 1 ? index + 2 : options.span; 5169 wrapper?.classList.add(`${size}:${options.bannerWidthClass}-${widthValue}`); 5170 wrapper?.setAttribute('am-banner-span', widthValue); 5171 }); 5172 } 5173 } 5174 }, 5175 5176 amBannerBelowCartInjector: function (sectionId) { 5177 const belowProductAddToCartBanner = document.querySelector('.ambanners.ambanner-' + sectionId); 5178 belowProductAddToCartBanner.style.display = 'block'; 5179 document.querySelectorAll('.product-item')?.forEach(product => { 5180 product?.append(belowProductAddToCartBanner.cloneNode(true)); 5181 }); 5182 belowProductAddToCartBanner.style.display = 'none'; 5183 }, 5184 5185 resolve: function (position, injectorParams) { 5186 const injector = injectors.find((injector) => { 5187 return injector.position === Number(position); 5188 }); 5189 5190 return this[injector?.name]?.(position, injectorParams); 5191 } 5192 } 5193 } 5194</script>
5194 5195 <span class="data-fbq-success" data-fbq-success="true"></span> 5196 5197<div x-data="{...hyva.modal(), ...initAmGdprPolicyPopup()}" x-init="initGdprPopup()" 5198 x-spread="eventListeners" x-bind="eventListeners"> 5199 <div x-cloak x-spread="overlay('amgdpr-policy-popup')" x-bind="overlay('amgdpr-policy-popup')" 5200 class="fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-40"> 5201 <div x-ref="amgdpr-policy-popup" role="dialog" aria-labelledby="amgdpr-policy-content" 5202 class="flex flex-col bg-white shadow-xl rounded-lg p-10 max-h-[95vh] max-w-6xl relative"> 5203 <button @click="$dispatch('amgdpr-close-policy')" aria-label="Chiudi" 5204 class="absolute right-4 top-4 text-gray-300 transition 5205 hover:text-black focus:drop-shadow-md hover:drop-shadow-md"> 5206 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-6 w-6" width="24" height="24" role="img"> 5207 <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"/> 5208<title>x</title></svg> 5209 </button> 5210 <div class="flex w-full"> 5211 <p class="w-full text-3xl mb-5" x-text="title"></p> 5212 </div> 5213 <div x-show="notificationText && policyData.versionChanged" class="flex w-full"> 5214 <p class="mb-4 p-4 bg-yellow-100 w-full" x-text="notificationText"></p> 5215 </div> 5216 <div id="amgdpr-policy-content" class="max-h-[500px] overflow-auto first:mx-0 child:mx-0" 5217 x-html="policyText"></div> 5218 <div class="mt-8 flex w-full justify-center"> 5219 <button x-focus-first @click="$dispatch('amgdpr-accept-policy')" type="button" 5220 class="btn btn-primary font-bold" 5221 aria-label="Ho letto e Acconsento"> 5222 Ho letto e Acconsento </button> 5223 </div> 5224 </div> 5225 5226 </div> 5227</div> 5228
5229<script> 5230 'use strict'; 5231 5232 function initAmGdprPolicyPopup() { 5233 return { 5234 /** 5235 * @typedef PolicyData 5236 * @property {string} policyVersion 5237 * @property {boolean} show 5238 * @property {string} title 5239 * @property{boolean} versionChanged 5240 * @property {boolean} hideClose 5241 * @property {boolean} action 5242 */ 5243 5244 eventListeners: { 5245 ['@amgdpr-accept-policy']() { 5246 if (this.consentId) { 5247 window.dispatchEvent(new CustomEvent('amgdpr-consent-accepted', {detail: this.consentId})); 5248 this.consentId = undefined; 5249 this.hide('amgdpr-policy-popup'); 5250 } else { 5251 this.acceptPolicy(); 5252 } 5253 }, 5254 ['@amgdpr-show-policy.window'](event) { 5255 this.consentId = event.detail; 5256 this.fetchPolicyContent().then(() => { 5257 this.$nextTick(() => { 5258 this.show('amgdpr-policy-popup'); 5259 }); 5260 }); 5261 }, 5262 ['@amgdpr-close-policy']() { 5263 this.hide('amgdpr-policy-popup'); 5264 } 5265 }, 5266 textUrl: `${BASE_URL}gdpr/policy/policytext`, 5267 acceptUrl: `${BASE_URL}gdpr/policy/accept`, 5268 popupDataUrl: `${BASE_URL}gdpr/policy/popupData`, 5269 notificationText: 'We would like to inform you that our Privacy Policy has been amended.Please, read and accept the new terms.', 5270 showOnPageLoad: '', 5271 /** 5272 * @type PolicyData 5273 */ 5274 policyData: { 5275 policyVersion: '', 5276 show: false, 5277 title: '', 5278 versionChanged: false, 5279 hideClose: false, 5280 action: true 5281 }, 5282 title: '', 5283 policyText: '', 5284 consentId: undefined, 5285 initGdprPopup: function () { 5286 this.fetchPolicyData().then(() => { 5287 if ((this.showOnPageLoad && this.policyData.show) || this.policyData.versionChanged) { 5288 this.fetchPolicyContent().then(() => { 5289 this.$nextTick(() => { 5290 this.show('amgdpr-policy-popup'); 5291 }); 5292 }); 5293 } 5294 }); 5295 }, 5296 5297 /** 5298 * @returns {Promise} 5299 */ 5300 fetchPolicyData: function () { 5301 return fetch(this.popupDataUrl) 5302 .then(response => response.json()) 5303 .then((data) => { 5304 this.policyData = {...data} 5305 }) 5306 .catch(error => this.dispatchErrorMessage(error)); 5307 }, 5308 5309 /** 5310 * @returns {Promise} 5311 */ 5312 fetchPolicyContent: function () { 5313 this.title = ''; 5314 this.policyText = ''; 5315 5316 const params = !!this.consentId 5317 ? '?' + new URLSearchParams({consent_id: this.consentId}) 5318 : '' 5319 5320 return fetch(this.textUrl + params) 5321 .then(response => response.json()) 5322 .then(policyContent => { 5323 this.title = policyContent.title; 5324 this.policyText = policyContent.content; 5325 }).catch(error => this.dispatchErrorMessage(error)); 5326 }, 5327 5328 /** 5329 * @returns {void} 5330 */ 5331 acceptPolicy: function () { 5332 window.dispatchEvent(new Event('amgdpr-loading-start')); 5333 5334 const body = new URLSearchParams({form_key: hyva.getFormKey(), ...this.policyData}); 5335 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 5336 5337 fetch(this.acceptUrl, {method: 'POST', body, headers: {'Content-Type': contentType}}) 5338 .then(response => response.json()) 5339 .then(data => { 5340 if (data.error) { 5341 this.dispatchErrorMessage(data.message) 5342 } else { 5343 this.notificationText = ''; 5344 this.hide('amgdpr-policy-popup'); 5345 } 5346 }) 5347 .catch(error => this.dispatchErrorMessage(error)) 5348 .finally(() => window.dispatchEvent(new Event('amgdpr-loading-stop'))); 5349 }, 5350 5351 /** 5352 * @param {string} message 5353 * @returns {void} 5354 */ 5355 dispatchErrorMessage: function (message) { 5356 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 5357 { 5358 type: "error", 5359 text: message 5360 } 5361 ]); 5362 } 5363 } 5364 } 5365</script>
5365 5366 5367 5368 5369
5370<script> 5371 function initFakeBrothers() { 5372 return { 5373 selected: 0, 5374 productId: 0, 5375 data: [], 5376 skeletonCount: 0, 5377 fetched: false, 5378 ajaxUrl: 'https://www.farma.it/fakeconfigurable/product/getBrothers/', 5379 showAttribute: false, 5380 attributeLabel: 'Color', 5381 optionDisplay: null, 5382 responsive: false, 5383 responsiveData: { 5384 children: [], 5385 childrenLenght: 0, 5386 itemSize: 0, 5387 itemOffset: 0, 5388 childrenSize: 0, 5389 boxSize: 0, 5390 hiddenCount: 0 5391 }, 5392 init() { 5393 // Skeleton init 5394 if (this.skeletonCount) { 5395 this.data = Array.from({length: this.skeletonCount}, () => ({})); 5396 } 5397 // Responsive init 5398 this.$nextTick(() => { 5399 if (this.responsive && this.data.length) { 5400 this.initResponsive(); 5401 } 5402 }); 5403 // Brothers init 5404 if (this.productId) { 5405 fetch(this.ajaxUrl + '?productId=' + this.productId) 5406 .then(response => { 5407 if (! response.ok) console.warn('GET request failed'); 5408 return response.json() 5409 }) 5410 .then(result => { 5411 if (this.showAttribute) { 5412 result.data.forEach(function (item, index) { 5413 if (item.attribute == false) { 5414 result.data[index].attribute = ''; 5415 } 5416 }); 5417 } 5418 this.data = result.data; 5419 this.fetched = true; 5420 // Attribute init 5421 this.$nextTick(() => { 5422 if (this.showAttribute) { 5423 // Siccome "x-ref" non funziona dentro gli elementi "template" devo usare "querySelector" 5424 this.optionDisplay = document.querySelector('[x-ref="optionDisplay"]'); 5425 this.optionDisplay.innerText = this.data[0].attribute; 5426 } 5427 }) 5428 }) 5429 .catch(result => { 5430 console.error(result.error); 5431 }) 5432 } 5433 }, 5434 initResponsive() { 5435 this.responsiveData.children = this.$el.querySelectorAll('.brother'); 5436 this.responsiveData.itemSize = this.responsiveData.children[0].offsetWidth + this.responsiveData.itemOffset; 5437 this.responsiveData.childrenLenght = this.responsiveData.children.length; 5438 this.responsiveData.childrenSize = this.responsiveData.childrenLenght * this.responsiveData.itemSize; 5439 this.calculateHiddenCount(); 5440 }, 5441 calculateHiddenCount() { 5442 if (this.responsive) { 5443 this.responsiveData.boxSize = this.$el.offsetWidth; 5444 5445 if (this.responsiveData.childrenSize > this.responsiveData.boxSize) { 5446 this.responsiveData.hiddenCount = 5447 Math.ceil((this.responsiveData.childrenSize - this.responsiveData.boxSize) / this.responsiveData.itemSize) + 1; 5448 } else { 5449 this.responsiveData.hiddenCount = 0; 5450 } 5451 } 5452 }, 5453 eventListeners: { 5454 ['@resize.window.debounce.50ms']() { 5455 this.calculateHiddenCount(); 5456 } 5457 } 5458 } 5459 5460 } 5461</script>
5461 5462<!-- Start Google Analytics 4 for Google Tag Manager by MagePal --> 5463
5463<script type="text/javascript"> 5464 (function() { 5465 window.addEventListener("private-content-loaded", event => { 5466 const dataObject = event.detail.data['magepal-eegtm-jsdatalayer'] || {}; 5467 pushAddRemoveItemDataLayer(dataObject) 5468 }); 5469 5470 const isObject = x => x === Object(x); 5471 const has = (x, p) => isObject(x) && x.hasOwnProperty(p); 5472 var itemListName = null; 5473 var itemListId = null; 5474 5475 function isEmpty(obj){ 5476 return JSON.stringify(obj) === '{}'; 5477 } 5478 5479 function addDynamicElements(storedData, item) { 5480 5481 if (has(storedData, 'index')) { 5482 item.index = storedData.index; 5483 } 5484 5485 if (has(storedData, 'item_list_id')) { 5486 item.item_list_id = itemListId = storedData.item_list_id; 5487 } 5488 5489 if (has(storedData, 'item_list_name')) { 5490 item.item_list_name = itemListName = storedData.item_list_name; 5491 } 5492 } 5493 /** 5494 * Add click position/index to data 5495 * @param ecommerceData 5496 * @return {*} 5497 */ 5498 function processData(ecommerceData) { 5499 var storedData = JSON.parse(window.localStorage.getItem("product-click-ga4")); 5500 5501 ecommerceData.forEach((data) => { 5502 if (has(data, 'parent_sku') 5503 && isObject(storedData) 5504 && has(storedData, 'item_id') 5505 && data.parent_sku === storedData.item_id 5506 ) { 5507 addDynamicElements(storedData, data); 5508 } else if (has(data, 'parent_sku')) { 5509 var product = getProductBySku(data.parent_sku); 5510 5511 if (product) { 5512 addDynamicElements(product, data); 5513 } 5514 } 5515 }); 5516 5517 return ecommerceData; 5518 } 5519 5520 function getProductBySku(sku) { 5521 var dlItems = window.dataLayer.find((item) => item?.ecommerce?.items) 5522 5523 if (dlItems !== 'undefined') { 5524 var dlItem = dlItems?.ecommerce?.items.find((item) => item.item_id === sku) 5525 if (dlItem !== undefined) { 5526 return dlItem; 5527 } 5528 } 5529 5530 return false; 5531 } 5532 5533 function pushAddRemoveItemDataLayer(data) { 5534 if (isObject(data) && has(data, 'cart_items')) { 5535 var ts = window.localStorage.getItem("magepal-eegtm-jsdatalayer-ts"); 5536 5537 if (ts !== 'undefined' && parseInt(ts) === parseInt(data.data_id)) { 5538 return false; 5539 } else { 5540 window.localStorage.setItem("magepal-eegtm-jsdatalayer-ts", parseInt(data.data_id)); 5541 } 5542 5543 var cartGenericLayer = {}; 5544 var dataLayer = window.dataLayer; 5545 var self = this; 5546 5547 data.cart_items.forEach((cartItem) => { 5548 if (has(cartItem, 'event')) { 5549 if (has(cartItem,'ecommerce')) { 5550 cartItem.ecommerce.currency = 'EUR'; 5551 } 5552 5553 if (cartItem.event === 'add_to_cart') { 5554 var itemsAdded = processData(cartItem.ecommerce.items); 5555 5556 //$("body").trigger("mpGa4ItemAddToCart", [itemsAdded, dataLayer]); 5557 cartGenericLayer.add = { 5558 'products': itemsAdded 5559 }; 5560 } 5561 5562 if (cartItem.event === 'remove_from_cart') { 5563 var itemsRemoved = processData(cartItem.ecommerce.items); 5564 5565 //$("body").trigger("mpGa4ItemRemoveFromCart", [itemsRemoved, dataLayer]); 5566 cartGenericLayer.remove = { 5567 'products': itemsRemoved 5568 }; 5569 } 5570 } 5571 5572 if (!isEmpty(cartGenericLayer)) { 5573 cartItem.cart = cartGenericLayer; 5574 } 5575 cartItem._clear = true; 5576 dataLayer.push(cartItem); 5577 }); 5578 } 5579 } 5580 })(); 5581 </script>
5581 5582 <!-- End Google Analytics 4 for Google Tag Manager by MagePal --> 5583
5584<script> 5585 document.addEventListener("alpine:initialized", () => { 5586 Alpine.store('dnafactoryGA4Promotions', { 5587 promotions: [{"creative_name":"Cemon 21092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Cemon 21092026 BannerCategory","promotion_name":"Cemon 21092026 BannerCategory","css_selector":"[title=\"Cemon 21092026 BannerCategory\"]"},{"creative_name":"Bioderma 21092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Bioderma 21092026 Sliderhomepage","promotion_name":"Bioderma 21092026 Sliderhomepage","css_selector":"[title=\"Bioderma 21092026 Sliderhomepage\"]"},{"creative_name":"Perrigo 21092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Perrigo 21092026 Sliderhomepage","promotion_name":"Perrigo 21092026 Sliderhomepage","css_selector":"[title=\"Perrigo 21092026 Sliderhomepage\"]"},{"creative_name":"Wala 21092026 BannerCarrello","creative_slot":"BannerCarrello","promotion_id":"Wala 21092026 BannerCarrello","promotion_name":"Wala 21092026 BannerCarrello","css_selector":"[title=\"Wala 21092026 BannerCarrello\"]"},{"creative_name":"Erbavita 22092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Erbavita 22092026 BannerCategory","promotion_name":"Erbavita 22092026 BannerCategory","css_selector":"[title=\"Erbavita 22092026 BannerCategory\"]"},{"creative_name":"Galderma 22092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Galderma 22092026 BannerCategory","promotion_name":"Galderma 22092026 BannerCategory","css_selector":"[title=\"Galderma 22092026 BannerCategory\"]"},{"creative_name":"Alfasigma 22092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Alfasigma 22092026 Sliderhomepage","promotion_name":"Alfasigma 22092026 Sliderhomepage","css_selector":"[title=\"Alfasigma 22092026 Sliderhomepage\"]"},{"creative_name":"Wala 23092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Wala 23092026 Sliderhomepage","promotion_name":"Wala 23092026 Sliderhomepage","css_selector":"[title=\"Wala 23092026 Sliderhomepage\"]"},{"creative_name":"Wala 23092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Wala 23092026 BannerCategory","promotion_name":"Wala 23092026 BannerCategory","css_selector":"[title=\"Wala 23092026 BannerCategory\"]"},{"creative_name":"Ganassini 23092026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Ganassini 23092026 BannerProductPage","promotion_name":"Ganassini 23092026 BannerProductPage","css_selector":"[title=\"Ganassini 23092026 BannerProductPage\"]"},{"creative_name":"Uriage 23092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Uriage 23092026 Sliderhomepage","promotion_name":"Uriage 23092026 Sliderhomepage","css_selector":"[title=\"Uriage 23092026 Sliderhomepage\"]"},{"creative_name":"Ibsa 23092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Ibsa 23092026 BannerCategory","promotion_name":"Ibsa 23092026 BannerCategory","css_selector":"[title=\"Ibsa 23092026 BannerCategory\"]"},{"creative_name":"Swisse 24092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Swisse 24092026 Sliderhomepage","promotion_name":"Swisse 24092026 Sliderhomepage","css_selector":"[title=\"Swisse 24092026 Sliderhomepage\"]"},{"creative_name":"Swisse 24092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Swisse 24092026 BannerCategory","promotion_name":"Swisse 24092026 BannerCategory","css_selector":"[title=\"Swisse 24092026 BannerCategory\"]"},{"creative_name":"Manetti 24092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Manetti 24092026 Sliderhomepage","promotion_name":"Manetti 24092026 Sliderhomepage","css_selector":"[title=\"Manetti 24092026 Sliderhomepage\"]"},{"creative_name":"Schwabe 24092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Schwabe 24092026 BannerCategory","promotion_name":"Schwabe 24092026 BannerCategory","css_selector":"[title=\"Schwabe 24092026 BannerCategory\"]"},{"creative_name":"Pharmalife 24092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Pharmalife 24092026 BannerCategory","promotion_name":"Pharmalife 24092026 BannerCategory","css_selector":"[title=\"Pharmalife 24092026 BannerCategory\"]"},{"creative_name":"Zeta 25092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Zeta 25092026 BannerCategory","promotion_name":"Zeta 25092026 BannerCategory","css_selector":"[title=\"Zeta 25092026 BannerCategory\"]"},{"creative_name":"Montefarmaco 25092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Montefarmaco 25092026 Sliderhomepage","promotion_name":"Montefarmaco 25092026 Sliderhomepage","css_selector":"[title=\"Montefarmaco 25092026 Sliderhomepage\"]"},{"creative_name":"Aboca 25092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Aboca 25092026 Sliderhomepage","promotion_name":"Aboca 25092026 Sliderhomepage","css_selector":"[title=\"Aboca 25092026 Sliderhomepage\"]"},{"creative_name":"Named 28092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Named 28092026 BannerCategory","promotion_name":"Named 28092026 BannerCategory","css_selector":"[title=\"Named 28092026 BannerCategory\"]"},{"creative_name":"Loreal 28092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Loreal 28092026 Sliderhomepage","promotion_name":"Loreal 28092026 Sliderhomepage","css_selector":"[title=\"Loreal 28092026 Sliderhomepage\"]"},{"creative_name":"Menarini 29092026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Menarini 29092026 BannerProductPage","promotion_name":"Menarini 29092026 BannerProductPage","css_selector":"[title=\"Menarini 29092026 BannerProductPage\"]"},{"creative_name":"Uniderm 29092026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Uniderm 29092026 BannerCategory","promotion_name":"Uniderm 29092026 BannerCategory","css_selector":"[title=\"Uniderm 29092026 BannerCategory\"]"},{"creative_name":"Prodeco 30092026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Prodeco 30092026 BannerProductPage","promotion_name":"Prodeco 30092026 BannerProductPage","css_selector":"[title=\"Prodeco 30092026 BannerProductPage\"]"},{"creative_name":"Alfasigma 30092026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Alfasigma 30092026 Sliderhomepage","promotion_name":"Alfasigma 30092026 Sliderhomepage","css_selector":"[title=\"Alfasigma 30092026 Sliderhomepage\"]"},{"creative_name":"Farmait 30092026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Farmait 30092026 BannerProductPage","promotion_name":"Farmait 30092026 BannerProductPage","css_selector":"[title=\"Farmait 30092026 BannerProductPage\"]"},{"creative_name":"farmait 01102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"farmait 01102026 Sliderhomepage","promotion_name":"farmait 01102026 Sliderhomepage","css_selector":"[title=\"farmait 01102026 Sliderhomepage\"]"},{"creative_name":"Farmait 01102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Farmait 01102026 BannerProductPage","promotion_name":"Farmait 01102026 BannerProductPage","css_selector":"[title=\"Farmait 01102026 BannerProductPage\"]"},{"creative_name":"Boiron 01102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Boiron 01102026 BannerProductPage","promotion_name":"Boiron 01102026 BannerProductPage","css_selector":"[title=\"Boiron 01102026 BannerProductPage\"]"},{"creative_name":"Boehringer 02102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Boehringer 02102026 BannerCategory","promotion_name":"Boehringer 02102026 BannerCategory","css_selector":"[title=\"Boehringer 02102026 BannerCategory\"]"},{"creative_name":"Boehringer 02102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Boehringer 02102026 Sliderhomepage","promotion_name":"Boehringer 02102026 Sliderhomepage","css_selector":"[title=\"Boehringer 02102026 Sliderhomepage\"]"},{"creative_name":"Haleon 02102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Haleon 02102026 BannerProductPage","promotion_name":"Haleon 02102026 BannerProductPage","css_selector":"[title=\"Haleon 02102026 BannerProductPage\"]"},{"creative_name":"Apivita 02102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Apivita 02102026 BannerCategory","promotion_name":"Apivita 02102026 BannerCategory","css_selector":"[title=\"Apivita 02102026 BannerCategory\"]"},{"creative_name":"Danone 02102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Danone 02102026 BannerCategory","promotion_name":"Danone 02102026 BannerCategory","css_selector":"[title=\"Danone 02102026 BannerCategory\"]"},{"creative_name":"Guna 02102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Guna 02102026 BannerCategory","promotion_name":"Guna 02102026 BannerCategory","css_selector":"[title=\"Guna 02102026 BannerCategory\"]"},{"creative_name":"Rilastil 02102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Rilastil 02102026 Sliderhomepage","promotion_name":"Rilastil 02102026 Sliderhomepage","css_selector":"[title=\"Rilastil 02102026 Sliderhomepage\"]"},{"creative_name":"Boiron 02102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Boiron 02102026 Sliderhomepage","promotion_name":"Boiron 02102026 Sliderhomepage","css_selector":"[title=\"Boiron 02102026 Sliderhomepage\"]"},{"creative_name":"Prodeco 05102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Prodeco 05102026 BannerCategory","promotion_name":"Prodeco 05102026 BannerCategory","css_selector":"[title=\"Prodeco 05102026 BannerCategory\"]"},{"creative_name":"Oti 05102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Ot
5587i 05102026 Sliderhomepage","promotion_name":"Oti 05102026 Sliderhomepage","css_selector":"[title=\"Oti 05102026 Sliderhomepage\"]"},{"creative_name":"Eucerin 05102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Eucerin 05102026 BannerCategory","promotion_name":"Eucerin 05102026 BannerCategory","css_selector":"[title=\"Eucerin 05102026 BannerCategory\"]"},{"creative_name":"Rilastil 05102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Rilastil 05102026 BannerProductPage","promotion_name":"Rilastil 05102026 BannerProductPage","css_selector":"[title=\"Rilastil 05102026 BannerProductPage\"]"},{"creative_name":"Rilastil 05102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Rilastil 05102026 BannerCategory","promotion_name":"Rilastil 05102026 BannerCategory","css_selector":"[title=\"Rilastil 05102026 BannerCategory\"]"},{"creative_name":"IMO 05102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"IMO 05102026 Sliderhomepage","promotion_name":"IMO 05102026 Sliderhomepage","css_selector":"[title=\"IMO 05102026 Sliderhomepage\"]"},{"creative_name":"IMO 05102026 BannerCarrello","creative_slot":"BannerCarrello","promotion_id":"IMO 05102026 BannerCarrello","promotion_name":"IMO 05102026 BannerCarrello","css_selector":"[title=\"IMO 05102026 BannerCarrello\"]"},{"creative_name":"Kenvue 05102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Kenvue 05102026 Sliderhomepage","promotion_name":"Kenvue 05102026 Sliderhomepage","css_selector":"[title=\"Kenvue 05102026 Sliderhomepage\"]"},{"creative_name":"Kenvue 05102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Kenvue 05102026 BannerProductPage","promotion_name":"Kenvue 05102026 BannerProductPage","css_selector":"[title=\"Kenvue 05102026 BannerProductPage\"]"},{"creative_name":"Sanofi 05102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Sanofi 05102026 Sliderhomepage","promotion_name":"Sanofi 05102026 Sliderhomepage","css_selector":"[title=\"Sanofi 05102026 Sliderhomepage\"]"},{"creative_name":"Esi 05102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Esi 05102026 Sliderhomepage","promotion_name":"Esi 05102026 Sliderhomepage","css_selector":"[title=\"Esi 05102026 Sliderhomepage\"]"},{"creative_name":"Esi 05102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Esi 05102026 BannerProductPage","promotion_name":"Esi 05102026 BannerProductPage","css_selector":"[title=\"Esi 05102026 BannerProductPage\"]"},{"creative_name":"Salugea 06102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Salugea 06102026 BannerCategory","promotion_name":"Salugea 06102026 BannerCategory","css_selector":"[title=\"Salugea 06102026 BannerCategory\"]"},{"creative_name":"Prodeco 07102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Prodeco 07102026 BannerProductPage","promotion_name":"Prodeco 07102026 BannerProductPage","css_selector":"[title=\"Prodeco 07102026 BannerProductPage\"]"},{"creative_name":"Erbavita 07102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Erbavita 07102026 Sliderhomepage","promotion_name":"Erbavita 07102026 Sliderhomepage","css_selector":"[title=\"Erbavita 07102026 Sliderhomepage\"]"},{"creative_name":"Farmaderbe 07102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Farmaderbe 07102026 BannerCategory","promotion_name":"Farmaderbe 07102026 BannerCategory","css_selector":"[title=\"Farmaderbe 07102026 BannerCategory\"]"},{"creative_name":"Angelini 07102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Angelini 07102026 BannerProductPage","promotion_name":"Angelini 07102026 BannerProductPage","css_selector":"[title=\"Angelini 07102026 BannerProductPage\"]"},{"creative_name":"MarcoViti 08102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"MarcoViti 08102026 Sliderhomepage","promotion_name":"MarcoViti 08102026 Sliderhomepage","css_selector":"[title=\"MarcoViti 08102026 Sliderhomepage\"]"},{"creative_name":"Elanco 08102026 BannerProductPage","creative_slot":"BannerProductPage","promotion_id":"Elanco 08102026 BannerProductPage","promotion_name":"Elanco 08102026 BannerProductPage","css_selector":"[title=\"Elanco 08102026 BannerProductPage\"]"},{"creative_name":"Elanco 08102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Elanco 08102026 Sliderhomepage","promotion_name":"Elanco 08102026 Sliderhomepage","css_selector":"[title=\"Elanco 08102026 Sliderhomepage\"]"},{"creative_name":"Procter 08102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Procter 08102026 BannerCategory","promotion_name":"Procter 08102026 BannerCategory","css_selector":"[title=\"Procter 08102026 BannerCategory\"]"},{"creative_name":"Goovi 08102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Goovi 08102026 Sliderhomepage","promotion_name":"Goovi 08102026 Sliderhomepage","css_selector":"[title=\"Goovi 08102026 Sliderhomepage\"]"},{"creative_name":"Biosline 08102026 Sliderhomepage","creative_slot":"Sliderhomepage","promotion_id":"Biosline 08102026 Sliderhomepage","promotion_name":"Biosline 08102026 Sliderhomepage","css_selector":"[title=\"Biosline 08102026 Sliderhomepage\"]"},{"creative_name":"Galderma 08102026 BannerCategory","creative_slot":"BannerCategory","promotion_id":"Galderma 08102026 BannerCategory","promotion_name":"Galderma 08102026 BannerCategory","css_selector":"[title=\"Galderma 08102026 BannerCategory\"]"}], 5588 sentViewPromotions: [], 5589 sentClickPromotions: [], 5590 5591 init() { 5592 let self = this; 5593 self.promotions.forEach(function (promotion) { 5594 var promotionElement = document.querySelector(promotion['css_selector']); 5595 if (promotionElement) { 5596 let aElement = promotionElement; 5597 if (promotionElement.tagName !== 'A') { 5598 aElement = promotionElement.closest('[data-content-type] a[href]'); 5599 } 5600 5601 if (aElement) { 5602 if (!self.sentViewPromotions.includes(promotion['promotion_id'])) { 5603 self.sendView(promotion, aElement); 5604 } 5605 5606 aElement.addEventListener('click', function(e) { 5607 if (!self.sentClickPromotions.includes(promotion['promotion_id'])) { 5608 self.sendClick(promotion, aElement); 5609 } 5610 }); 5611 } 5612 } 5613 }); 5614 5615 var additionalObserver = new MutationObserver(function(mutations) { 5616 mutations.forEach(function(mutation) {
5617 mutation.addedNodes.forEach(function(addedNode) { 5618 if (addedNode.matches && addedNode.matches('.swiper-wrapper')) { 5619 self.promotions.forEach(function (promotion) { 5620 var promotionElement = document.querySelector(promotion['css_selector']); 5621 if (promotionElement) { 5622 let aElement = promotionElement; 5623 if (promotionElement.tagName !== 'A') { 5624 aElement = promotionElement.closest('[data-content-type] a[href]'); 5625 } 5626 5627 if (!self.sentViewPromotions.includes(promotion['promotion_id'])) { 5628 self.sendView(promotion, aElement); 5629 } 5630 5631 aElement.addEventListener('click', function(e) { 5632 if (!self.sentClickPromotions.includes(promotion['promotion_id'])) { 5633 self.sendClick(promotion, aElement); 5634 } 5635 }); 5636 } 5637 }); 5638 } 5639 }); 5640 }); 5641 }); 5642 5643 document.querySelectorAll('[data-content-type="slider"], [data-role="amasty-banner-container"]').forEach(function (element) { 5644 additionalObserver.observe(element, {childList: true, subtree: true}); 5645 }); 5646 }, 5647 5648 sendView(promotionData, promotionElement = null) { 5649 this.sentViewPromotions.push(promotionData['promotion_id']); 5650 promotionData = this.normalizeData(promotionData, promotionElement); 5651 window.dataLayer.push({ 5652 event: 'view_promotion', 5653 ecommerce: { 5654 creative_name: promotionData['creative_name'], 5655 creative_slot: promotionData['creative_slot'], 5656 promotion_id: promotionData['promotion_id'], 5657 promotion_name: promotionData['promotion_name'], 5658 } 5659 }) 5660 }, 5661 5662 sendClick(promotionData, promotionElement = null) { 5663 this.sentClickPromotions.push(promotionData['promotion_id']); 5664 promotionData = this.normalizeData(promotionData, promotionElement); 5665 window.dataLayer.push({ 5666 event: 'select_promotion', 5667 ecommerce: { 5668 creative_name: promotionData['creative_name'], 5669 creative_slot: promotionData['creative_slot'], 5670 promotion_id: promotionData['promotion_id'], 5671 promotion_name: promotionData['promotion_name'], 5672 } 5673 }) 5674 }, 5675 5676 normalizeData(promotionData, promotionElement = null) { 5677 if (!promotionElement) { 5678 return promotionData; 5679 } 5680 5681 var imgElement = promotionElement.querySelector('img'); 5682 if (!imgElement) { 5683 return promotionData; 5684 } 5685 5686 promotionData['creative_name'] = promotionData['creative_name'] ? promotionData['creative_name'] : imgElement.src.replace(BASE_URL, ''); 5687 promotionData['creative_slot'] = promotionData['creative_slot'] ? promotionData['creative_slot'] : imgElement.alt; 5688 promotionData['promotion_name'] = promotionData['promotion_name'] ? promotionData['promotion_name'] : imgElement.title; 5689 return promotionData; 5690 } 5691 }); 5692 }); 5693</script>
5693 5694
5695<script> 5696 document.addEventListener("alpine:initialized", () => { 5697 Alpine.store('dnafactoryGA4Items', { 5698 itemsPushed: [], 5699 itemsSelected: [], 5700 itemsToPush: [], 5701 5702 sendItemListDebounced(...itemData) { 5703 let self = this; 5704 var itemDataToPush = itemData.filter(function (el) { 5705 var itemList = el.item_list_id ?? 'default_list'; 5706 if (!(self.itemsPushed.hasOwnProperty(itemList) && self.itemsPushed[itemList].includes(el.item_id))) { 5707 if (!self.itemsPushed.hasOwnProperty(itemList)) { 5708 self.itemsPushed[itemList] = []; 5709 } 5710 self.itemsPushed[itemList].push(el.item_id); 5711 return true; 5712 } 5713 5714 return false; 5715 }); 5716 5717 this.itemsToPush.push(...itemDataToPush); 5718 Alpine.debounce(this.updateItemList.bind(this), 200)(); 5719 }, 5720 5721 sendItemList(itemsData, currency = "EUR", itemlistName = "Default List", itemlistId = "default_list") { 5722 window.dataLayer.push({ 5723 event: 'view_item_list', 5724 ecommerce: { 5725 items: this.normalizeData(itemsData) 5726 }, 5727 currency: currency, 5728 item_list_name: itemlistName, 5729 item_list_id: itemlistId, 5730 _clear: true 5731 }) 5732 }, 5733 5734 sendSelectItem(itemData, currency = "EUR", itemlistName = "Default List", itemlistId = "default_list") { 5735 if (this.itemsSelected.includes(itemData.item_id)) { 5736 return; 5737 } 5738 this.itemsSelected.push(itemData.item_id); 5739 5740 window.dataLayer.push({ 5741 event: 'select_item', 5742 ecommerce: { 5743 items: this.normalizeData([itemData]) 5744 }, 5745 currency: currency, 5746 item_list_name: itemlistName, 5747 item_list_id: itemlistId, 5748 _clear: true 5749 }) 5750 }, 5751 5752 updateItemList() { 5753 var items = this.itemsToPush; 5754 this.itemsToPush = []; 5755 5756 if (items.length > 0) { 5757 var firstItem = items[0]; 5758 var [currency, itemListName, itemListId] = [firstItem.currency, firstItem.item_list_name, firstItem.item_list_id]; 5759 this.sendItemList(items, currency, itemListName, itemListId); 5760 } 5761 }, 5762 5763 normalizeData(itemData) { 5764 itemData.forEach(function (el) { 5765 var vatDivider = 1; 5766 if (el.hasOwnProperty('vat_divider')) { 5767 vatDivider = (parseFloat(el['vat_divider']) + 100)/100; 5768 if (vatDivider <= 0) { 5769 vatDivider = 1; 5770 } 5771 } 5772 5773 if (el.hasOwnProperty('price')) { 5774 el['price'] = parseFloat((el['price']/vatDivider).toFixed(2)); 5775 } 5776 5777 if (el.hasOwnProperty('discount')) { 5778 el['discount'] = parseFloat((el['discount']/vatDivider).toFixed(2)); 5779 } 5780 5781 if (el.hasOwnProperty('item_category')) { 5782 var categories = el['item_category'].split(/[>\/]+/); 5783 if (categories.length > 0) { 5784 var indexCategory = 1; 5785 categories.forEach(function (category) { 5786 var categoryKey = (indexCategory > 1) ? 'item_category' + indexCategory : 'item_category'; 5787 el[categoryKey] = category.trim(); 5788 indexCategory++; 5789 }); 5790 } 5791 } 5792 }); 5793 5794 return itemData; 5795 } 5796 }); 5797 }); 5798</script>
5798 5799
5800<script> 5801 window.DNAFACTORY_GA4_SHOW_PRICE_TAX = 0; 5802 if (!window.dataLayer) { 5803 window.dataLayer = []; 5804 } 5805</script>
5805 5806
5807<script> 5808 let SnapSlider = class { 5809 constructor(el, { 5810 labelSepparator = 'di', 5811 autoPager, 5812 groupPager, 5813 loop 5814 } = {}) { 5815 this.el = el; 5816 this.track = this.el.querySelector("[data-track]"); 5817 if (!this.track) { 5818 console.warn( 5819 "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track", 5820 this.el 5821 ); 5822 return; 5823 } 5824 this.initialLoad = true; 5825 this.slides = []; 5826 this.inViewObserver; 5827 this.mutationObserver; 5828 this.resizeObserver; 5829 this.pager = this.el.querySelector("[data-pager]"); 5830 this.navBtns = Array.from( 5831 this.el.querySelectorAll("[data-next], [data-prev]") 5832 ); 5833 this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator; 5834 this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false; 5835 this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false; 5836 this.useLoop = loop || this.el.hasAttribute("data-loop") || false; 5837 this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, ""); 5838 this.sliderId = this.el.id || this.sliderLabel || "slider"; 5839 this.markerIdName = "data-target-id"; 5840 this.pagerClasses = this.el.dataset.pagerClass || "snap-pager"; 5841 this.markerClasses = this.el.dataset.markerClass || "snap-marker"; 5842 this.init(); 5843 } 5844 init() { 5845 this.setupSlides(); 5846 this.setupNav(); 5847 if (this.useAutoPager) { 5848 this.createPager(); 5849 } else { 5850 this.setupPager(); 5851 } 5852 this.setupObservers(); 5853 this.setupMutationObserver(); 5854 this.setupResizeObserver(); 5855 this.el.addEventListener("click", this.eventHandler.bind(this)); 5856 this.el.addEventListener("keydown", this.eventHandler.bind(this)); 5857 if ("onscrollend" in window) { 5858 this.track.addEventListener("scrollend", () => { 5859 this.isNavigating = false; 5860 }); 5861 } else { 5862 this.track.addEventListener("scroll", () => { 5863 clearTimeout(this.scrollEndTimer); 5864 this.scrollEndTimer = setTimeout(() => { 5865 this.isNavigating = false; 5866 }, 100); 5867 }); 5868 } 5869 } 5870 destroy() { 5871 this.inViewObserver?.disconnect(); 5872 this.mutationObserver?.disconnect(); 5873 this.resizeObserver?.disconnect(); 5874 this.el.removeEventListener("click", this.eventHandler.bind(this)); 5875 this.el.removeEventListener("keydown", this.eventHandler.bind(this)); 5876 } 5877 roundUpIfGreaterThan(number, min = 8) { 5878 const decimalPart = number - Math.floor(number); 5879 return decimalPart >= min ? Math.ceil(number) : Math.floor(number); 5880 } 5881 getInViewItems() { 5882 const inViewSlides = Array.from(this.track.querySelectorAll("[data-in-view]")).filter((el) => this.slides.includes(el)); 5883 const firstInViewSlide = inViewSlides[0] || null; 5884 const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null; 5885 const isAtStart = firstInViewSlide === this.slides[0]; 5886 const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1]; 5887 return { 5888 inViewSlides, 5889 totalInViewSlides: inViewSlides.length, 5890 firstInViewSlide, 5891 lastInViewSlide, 5892 isAtStart, 5893 isAtEnd, 5894 hasNoOverflow: isAtStart && isAtEnd 5895 }; 5896 } 5897 groupPagerMarkers() { 5898 if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return; 5899 const totalVisibleSlides = this.roundUpIfGreaterThan( 5900 this.track.offsetWidth / this.slides[0].offsetWidth 5901 ); 5902 const markers = Array.from(this.pager.querySelectorAll("a, button"));
5903 markers.forEach((marker, index) => { 5904 marker.style.display = index % totalVisibleSlides === 0 ? null : "none"; 5905 }); 5906 } 5907 handleInView(entries) { 5908 entries.forEach((entry) => { 5909 const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector( 5910 `[${this.markerIdName}="${entry.target.id}"]` 5911 )); 5912 entry.target.toggleAttribute("data-in-view", entry.isIntersecting); 5913 entry.target.toggleAttribute("inert", !entry.isIntersecting); 5914 marker?.setAttribute("aria-current", entry.isIntersecting); 5915 marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1"); 5916 }); 5917 const { isAtStart, isAtEnd, hasNoOverflow } = this.getInViewItems(); 5918 this.navBtns.forEach((btn) => { 5919 if (btn.hasAttribute("data-next")) { 5920 btn.style.visibility = hasNoOverflow ? "hidden" : null; 5921 isAtEnd && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 5922 } 5923 if (btn.hasAttribute("data-prev")) { 5924 btn.style.visibility = hasNoOverflow ? "hidden" : null; 5925 isAtStart && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 5926 } 5927 }); 5928 if (this.pager) { 5929 this.pager.style.visibility = hasNoOverflow ? "hidden" : null; 5930 this.pager.toggleAttribute("inert", hasNoOverflow); 5931 } 5932 if (!this.initialLoad) { 5933 this.el.dispatchEvent( 5934 new CustomEvent("slideChange", { 5935 detail: this.getInViewItems() 5936 }) 5937 ); 5938 } else { 5939 this.initialLoad = false; 5940 } 5941 if (document.activeElement.parentElement.hasAttribute("data-pager")) { 5942 const activeItems = this.pager.querySelectorAll('[tabindex="0"]'); 5943 if (activeItems.length) { 5944 activeItems[0].focus({ preventScroll: true }); 5945 } 5946 } 5947 } 5948 getSlides() { 5949 if (!this.track) return []; 5950 return Array.from(this.track.children).filter( 5951 (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" && child.style.display !== "none" 5952 ); 5953 } 5954 refreshSlides() { 5955 this.initialLoad = true; 5956 this.slides = this.getSlides(); 5957 this.setupSlides(); 5958 if (this.useAutoPager) { 5959 this.createPager(); 5960 } else { 5961 this.setupPager(); 5962 } 5963 this.groupPagerMarkers(); 5964 this.setupObservers(); 5965 } 5966 setupSlides() { 5967 this.slides = this.getSlides(); 5968 this.slides.forEach((slide, index) => { 5969 const totalSlides = this.slides.length; 5970 const currentSlide = index + 1; 5971 const existingLabel = slide.getAttribute("aria-label") || ""; 5972 const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture"; 5973 const slideLabelTag = isImage ? "alt" : "aria-label"; 5974 const hasAutoLabel = existingLabel.startsWith( 5975 `${currentSlide} ${this.slideLabelSepparator} ` 5976 ); 5977 if (!slide.hasAttribute("id")) { 5978 slide.setAttribute( 5979 "id", 5980 `${this.sliderId}-item-${currentSlide}` 5981 ); 5982 } 5983 if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) { 5984 slide.setAttribute( 5985 slideLabelTag, 5986 `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}` 5987 ); 5988 } 5989 if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) { 5990 slide.setAttribute("role", "group"); 5991 } 5992 if (this.pager && !isImage) { 5993 slide.setAttribute("role", "tabpanel"); 5994 } 5995 if (slide.getAttribute("role") === "group") { 5996 slide.setAttribute("aria-roledescription", "item"); 5997 } 5998 }); 5999 if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") { 6000 this.el.setAttribute("role", "region"); 6001 } 6002 if (!this.el.hasAttribute("aria-roledescription")) { 6003 this.el.setAttribute("aria-roledescription", "carousel"); 6004 } 6005 if (!this.track.hasAttribute("tabindex")) { 6006 this.track.setAttribute("tabindex", 0); 6007 } 6008 this.track.setAttribute("aria-live", "polite"); 6009 } 6010 setupNav() { 6011 this.navBtns.forEach((btn) => { 6012 btn.setAttribute("disabled", ""); 6013 btn.removeAttribute("hidden"); 6014 btn.classList.remove("invisible"); 6015 btn.style.visibility = null; 6016 }); 6017 } 6018 createPager() { 6019 const newPager = document.createElement("nav"); 6020 newPager.setAttribute("data-pager", ""); 6021 newPager.setAttribute("role", "tablist"); 6022 newPager.classList.add(...this.pagerClasses.split(" "));
6023 this.slides.forEach((slide, index) => { 6024 const marker = document.createElement("button"); 6025 const slideId = slide.id || `${this.sliderId}-item-${index + 1}`; 6026 marker.setAttribute(this.markerIdName, slideId); 6027 marker.classList.add(...this.markerClasses.split(" ")); 6028 this.setupPagerMarker(marker, index); 6029 newPager.appendChild(marker); 6030 if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") { 6031 slide.removeAttribute("aria-roledescription"); 6032 slide.setAttribute("role", "tabpanel"); 6033 } 6034 }); 6035 if (this.pager) { 6036 this.pager.setAttribute("role", "tablist"); 6037 this.pager.replaceChildren(...newPager.children); 6038 } else { 6039 this.track.after(newPager); 6040 this.pager = this.el.querySelector("[data-pager]"); 6041 } 6042 } 6043 setupPager() { 6044 if (!this.pager) return; 6045 this.pager.setAttribute("role", "tablist"); 6046 const items = Array.from(this.pager.querySelectorAll("a, button")); 6047 items.forEach((marker, index) => this.setupPagerMarker(marker, index)); 6048 } 6049 setupPagerMarker(marker, index) { 6050 const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 6051 const slideId = markerId || `${this.sliderId}-item-${index + 1}`; 6052 if (!markerId) { 6053 marker.setAttribute(this.markerIdName, slideId); 6054 } 6055 marker.setAttribute("role", "tab"); 6056 marker.setAttribute("aria-controls", slideId); 6057 marker.setAttribute("aria-posinset", index + 1); 6058 marker.setAttribute("aria-setsize", this.slides.length); 6059 marker.setAttribute("tabindex", "-1"); 6060 if (!marker.hasAttribute("aria-label")) { 6061 marker.setAttribute("aria-label", `Slide ${index + 1}`); 6062 } 6063 } 6064 setupObservers() { 6065 if (this.inViewObserver) { 6066 this.inViewObserver.disconnect(); 6067 } 6068 this.inViewObserver = new IntersectionObserver( 6069 this.handleInView.bind(this), { 6070 root: this.track, 6071 threshold: 0.8 6072 } 6073 ); 6074 this.slides.forEach((slide) => this.inViewObserver.observe(slide)); 6075 } 6076 setupMutationObserver() { 6077 this.mutationObserver = new MutationObserver((mutations) => { 6078 if (mutations.some((m) => m.type === "childList" || m.target.parentElement === this.track)) { 6079 this.refreshSlides(); 6080 } 6081 }); 6082 this.mutationObserver.observe(this.track, { 6083 childList: true, 6084 subtree: true, 6085 attributeFilter: ["style"] 6086 }); 6087 } 6088 setupResizeObserver() { 6089 this.resizeObserver = new ResizeObserver( 6090 this.groupPagerMarkers.bind(this) 6091 ); 6092 this.resizeObserver.observe(this.el); 6093 } 6094 goToSlideDir(dir = "next") { 6095 if (this.isNavigating) return; 6096 const { firstInViewSlide, lastInViewSlide } = this.getInViewItems(); 6097 const isPrev = dir === "prev"; 6098 const referenceSlide = isPrev ? firstInViewSlide : lastInViewSlide; 6099 const currentIndex = this.slides.indexOf(referenceSlide); 6100 let targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1; 6101 if (targetIndex < 0 || targetIndex >= this.slides.length) { 6102 if (!this.useLoop) return; 6103 targetIndex = isPrev ? this.slides.length - 1 : 0; 6104 } 6105 const targetSlide = this.slides[targetIndex]; 6106 if (!targetSlide) return; 6107 this.isNavigating = true; 6108 targetSlide.scrollIntoView({ 6109 block: "nearest", 6110 inline: isPrev ? "end" : "start" 6111 }); 6112 } 6113 pagerToSlide(event) { 6114 if (!event.target.closest("[data-pager]")) return; 6115 const marker = event.target.closest("a, button"); 6116 if (!marker) return; 6117 event.preventDefault(); 6118 const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 6119 const targetSlide = this.track.querySelector(`#${slideId}`);
6120 targetSlide?.scrollIntoView({ block: "nearest", inline: "start" }); 6121 } 6122 eventHandler(event) { 6123 const target = event.target.closest( 6124 "[data-next], [data-prev], [data-pager]" 6125 ); 6126 if (!target) return; 6127 if (event.type === "click") { 6128 if (target.hasAttribute("data-next")) { 6129 this.goToSlideDir("next"); 6130 } else if (target.hasAttribute("data-prev")) { 6131 this.goToSlideDir("prev"); 6132 } else if (target.closest("[data-pager]")) { 6133 this.pagerToSlide(event); 6134 } 6135 } 6136 if (event.type === "keydown" && target.closest("[data-pager]")) { 6137 if (event.key === "ArrowRight" || event.key === "ArrowDown") { 6138 event.preventDefault(); 6139 this.goToSlideDir("next"); 6140 } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") { 6141 event.preventDefault(); 6142 this.goToSlideDir("prev"); 6143 } 6144 } 6145 } 6146 }; 6147 6148 (() => { 6149 function alpineSnapSlider(Alpine) { 6150 Alpine.directive("snap-slider", (el, { 6151 modifiers 6152 }, { 6153 cleanup 6154 }) => { 6155 const slider = new SnapSlider(el, { 6156 autoPager: modifiers.includes("auto-pager"), 6157 groupPager: modifiers.includes("group-pager"), 6158 loop: modifiers.includes("loop") 6159 }); 6160 cleanup(() => { 6161 slider.destroy(); 6162 }); 6163 }); 6164 } 6165 6166 document.addEventListener("alpine:init", () => { 6167 window.Alpine.plugin(alpineSnapSlider); 6168 }); 6169 })(); 6170 //# sourceURL=alpine-snap-slider.js 6171</script>
vendor: 1 bytes, line 6171
6171
6172<script> 6173 (() => { 6174 // src/dialog.js 6175 function dialog_default(Alpine) { 6176 Alpine.directive("htmldialog", fylgjaAlpineDialog); 6177 function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) { 6178 const evaluate = expression.length ? evaluateLater(expression) : () => {}; 6179 const lockPageScroll = modifiers.includes("noscroll"); 6180 const isModeless = modifiers.includes("modeless"); 6181 const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest"); 6182 el.style.display = null; 6183 el.style.length === 0 && el.removeAttribute("style"); 6184 if (el._x_isShown) { 6185 open(); 6186 } 6187 const closeBySupported = (() => { 6188 return "closedBy" in HTMLDialogElement.prototype; 6189 })(); 6190 function scrollLock(use = true) { 6191 document.body.style.overflow = use ? "hidden" : ""; 6192 } 6193 function dialogSubmit(event) { 6194 if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") { 6195 event.preventDefault(); 6196 evaluate(); 6197 } 6198 } 6199 function escapeDialog(event) { 6200 if (event.key !== "Escape") return; 6201 event.preventDefault(); 6202 if (closeBy === "none") return; 6203 evaluate(); 6204 } 6205 function handleCloseByEvent(event) { 6206 if (event.target !== el) return; 6207 const rect = el.getBoundingClientRect(); 6208 const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; 6209 if (!isInDialog) { 6210 if (closeBy === "any") { 6211 if (closeBySupported) { 6212 event.preventDefault(); 6213 } 6214 evaluate(); 6215 } 6216 } 6217 } 6218 function handleCloseEvent() { 6219 evaluate(); 6220 } 6221 function open() { 6222 if (el.hasAttribute("open")) return; 6223 isModeless ? el.show() : el.showModal(); 6224 scrollLock(lockPageScroll); 6225 } 6226 function close() { 6227 if (!el.hasAttribute("open")) return; 6228 el.close(); 6229 scrollLock(false); 6230 } 6231 el._x_doShow = () => open(); 6232 el._x_doHide = () => close(); 6233 el.addEventListener("keydown", escapeDialog); 6234 el.addEventListener("submit", dialogSubmit); 6235 el.addEventListener("click", handleCloseByEvent); 6236 el.addEventListener("cancel", handleCloseEvent); 6237 cleanup(() => { 6238 el.removeEventListener("keydown", escapeDialog); 6239 el.removeEventListener("submit", dialogSubmit); 6240 el.removeEventListener("click", handleCloseByEvent); 6241 el.removeEventListener("cancel", handleCloseEvent); 6242 scrollLock(false); 6243 }); 6244 } 6245 } 6246 function modifierValue(modifiers, key, fallback) { 6247 if (modifiers.indexOf(key) === -1) return fallback; 6248 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 6249 if (!rawValue) return fallback; 6250 if (key === "closeby") { 6251 const allowedValues = ["auto", "none", "closerequest", "any"]; 6252 const options = allowedValues.join(", "); 6253 if (!allowedValues.includes(rawValue)) { 6254 console.warn( 6255 `"${rawValue}" is not one of the allowed values for closeby: ${options}` 6256 ); 6257 return fallback; 6258 } 6259 } 6260 return rawValue; 6261 } 6262 6263 // src/cdn.js 6264 document.addEventListener("alpine:init", () => { 6265 window.Alpine.plugin(dialog_default); 6266 }); 6267 })(); 6268 //# sourceURL=alpine-htmldialog.js 6269</script>
vendor: 1 bytes, line 6269
6269
6270<script> 6271 (() => { 6272 function src_default(Alpine) { 6273 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 6274 let evaluate = evaluateLater(expression); 6275 let options = { 6276 rootMargin: getRootMargin(modifiers), 6277 threshold: getThreshold(modifiers) 6278 }; 6279 let observer = new IntersectionObserver((entries) => { 6280 entries.forEach((entry) => { 6281 if (entry.isIntersecting === (value === "leave")) 6282 return; 6283 evaluate(); 6284 modifiers.includes("once") && observer.disconnect(); 6285 }); 6286 }, options); 6287 observer.observe(el); 6288 cleanup(() => { 6289 observer.disconnect(); 6290 }); 6291 })); 6292 } 6293 function getThreshold(modifiers) { 6294 if (modifiers.includes("full")) 6295 return 0.99; 6296 if (modifiers.includes("half")) 6297 return 0.5; 6298 if (!modifiers.includes("threshold")) 6299 return 0; 6300 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 6301 if (threshold === "100") 6302 return 1; 6303 if (threshold === "0") 6304 return 0; 6305 return Number(`.${threshold}`); 6306 } 6307 function getLengthValue(rawValue) { 6308 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 6309 return match ? match[1] + (match[2] || "px") : void 0; 6310 } 6311 function getRootMargin(modifiers) { 6312 const key = "margin"; 6313 const fallback = "0px 0px 0px 0px"; 6314 const index = modifiers.indexOf(key); 6315 if (index === -1) 6316 return fallback; 6317 let values = []; 6318 for (let i = 1; i < 5; i++) { 6319 values.push(getLengthValue(modifiers[index + i] || "")); 6320 } 6321 values = values.filter((v) => v !== void 0); 6322 return values.length ? values.join(" ").trim() : fallback; 6323 } 6324 6325 document.addEventListener("alpine:init", () => { 6326 window.Alpine.plugin(src_default); 6327 }); 6328 })(); 6329 //# sourceURL=alpine-intersect.js 6330</script>
6330 6331
6332<script> 6333 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","#notice-cookie-block":"intersect","#product_addtocart_form [x-data]:not(.dont-defer)":"intersect"})) { 6334 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 6335 } 6336 //# sourceURL=alpine-defer-rules.js 6337</script>
vendor: 1 bytes, line 6337
6337
6338<script> 6339 (() => { 6340 const hasAlpine = new Promise(resolve => { 6341 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 6342 }); 6343 6344 const hasInteract = new Promise(resolve => { 6345 (events => { 6346 const onInteract = () => { 6347 resolve(); 6348 events.forEach(type => window.removeEventListener(type, onInteract)); 6349 } 6350 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 6351 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 6352 }); 6353 6354 const onIntersect = (el) => { 6355 return new Promise(resolve => { 6356 const observer = new IntersectionObserver(entries => { 6357 for (const entry of entries) { 6358 if (entry.isIntersecting) { 6359 observer.disconnect() 6360 resolve(); 6361 } 6362 } 6363 }, {}); 6364 observer.observe(el); 6365 }); 6366 } 6367 6368 function runComponent(el) { 6369 hasAlpine.then(() => { 6370 el.removeAttribute('x-ignore'); 6371 queueMicrotask(() => Alpine.initTree(el)); 6372 }); 6373 } 6374 6375 function initDeferredComponents() { 6376 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 6377 el.setAttribute('x-ignore', ''); 6378 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 6379 switch (deferUntil) { 6380 case 'interact': 6381 hasInteract.then(() => runComponent(el)); 6382 break; 6383 case 'intersect': 6384 onIntersect(el).then(() => runComponent(el)) 6385 break; 6386 case 'idle': 6387 window.requestIdleCallback 6388 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 6389 : setTimeout(() => runComponent(el), 4000); 6390 break; 6391 case 'eager': 6392 runComponent(el); 6393 break; 6394 default: 6395 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 6396 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 6397 } 6398 } 6399 }); 6400 } 6401 6402 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 6403 })(); 6404 //# sourceURL=alpine-defer.js 6405</script>
6405 6406
6407<script> 6408// x-teleport implementation 6409(_ => { 6410 document.addEventListener('DOMContentLoaded', event => { 6411 // x-teleport available only for template 6412 if (!Alpine.version.startsWith('2')) { 6413 return; 6414 } 6415 6416 const teleportDirective = (el, expression) => { 6417 let target = document.querySelector(expression) 6418 let clone = el.content.cloneNode(true).firstElementChild; 6419 6420 target.appendChild(clone); 6421 setTimeout(() => { 6422 target.querySelectorAll('[x-data]') 6423 .forEach(el => Alpine.initializeComponent(el)); 6424 }, 0) 6425 }; 6426 6427 document.querySelectorAll('template').forEach(el => { 6428 if (!el.hasAttribute('x-teleport')) { 6429 return; 6430 } 6431 6432 teleportDirective(el, el.getAttribute('x-teleport')); 6433 }); 6434 6435 document.querySelectorAll('[x-data]').forEach(el => { 6436 if (el.hasAttribute('x-init')) { 6437 return; 6438 } 6439 6440 setTimeout(() => { 6441 Alpine.initializeComponent(el); 6442 }, 0); 6443 }); 6444 }); 6445})() 6446</script>
6446 6447
6448<script type="module" 6449 src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Hyva_Theme/js/alpine3.min.js" 6450 defer 6451 crossorigin 6452></script>
vendor: 1 bytes, line 6452
6452
6453<script> 6454 function dispatchMessages(messages, hideAfter) { 6455 const messagesEvent = new CustomEvent("messages-loaded", { 6456 detail: { 6457 messages: messages, 6458 hideAfter: hideAfter 6459 } 6460 }); 6461 window.dispatchEvent(messagesEvent); 6462 } 6463 6464 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 6465 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 6466 } 6467 6468 (function( hyva, undefined ) { 6469 6470 hyva.initFormKey = () => { 6471 if (typeof hyva.getFormKey !== 'function') return; 6472 6473 const formKey = hyva.getFormKey(); 6474 if (!formKey) return; 6475 6476 document.querySelectorAll('input[name="form_key"]').forEach((input) => { 6477 input.value = formKey; 6478 }); 6479 } 6480 6481 hyva.initMessages = () => { 6482 try { 6483 const messages = hyva.getCookie('mage-messages'); 6484 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 6485 6486 dispatchMessages(window.mageMessages); 6487 6488 // empty `mage-messages` cookie 6489 const skipSetDomain = true; 6490 hyva.setCookie('mage-messages','', -1, skipSetDomain); 6491 6492 } catch (error) { 6493 console.warn('Error parsing Cookie Messages:', error); 6494 } 6495 } 6496 6497 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 6498 6499 window.addEventListener('pageshow', (event) => { 6500 if (event.persisted) { 6501 hyva.initFormKey(); 6502 } 6503 }); 6504 6505 hyva.alpineInitialized(hyva.initMessages) 6506 }( window.hyva = window.hyva || {} )); 6507 //# sourceURL=hyva-cookies.js 6508</script>
vendor: 1 bytes, line 6508
6508
6509<script> 6510 (() => { 6511 const private_content_key = 'mage-cache-storage'; 6512 const private_content_expire_key = 'mage-cache-timeout'; 6513 const private_content_version_key = 'private_content_version'; 6514 const section_data_ids_key = 'section_data_ids'; 6515 const mage_cache_session_id_key = 'mage-cache-sessid'; 6516 const last_visited_store_key = 'last_visited_store'; 6517 6518 const ttl = 7200; 6519 6520 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 6521 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 6522 } 6523 6524 function loadSectionData () { 6525 const browserStorage = hyva.getBrowserStorage(); 6526 if (!browserStorage) { 6527 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 6528 [{ 6529 type: "warning", 6530 text: "Please enable LocalStorage in your browser." 6531 }] 6532 ); 6533 return; 6534 } 6535 try { 6536 let isInvalid = false; 6537 6538 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 6539 isInvalid = true; 6540 } 6541 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 6542 6543 if (!hyva.getCookie(mage_cache_session_id_key)) { 6544 isInvalid = true; 6545 browserStorage.removeItem(private_content_key); 6546 const skipSetDomain = true; 6547 const days = false; 6548 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 6549 } 6550 6551 const cookieVersion = hyva.getCookie(private_content_version_key); 6552 const storageVersion = browserStorage.getItem(private_content_version_key); 6553 6554 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 6555 isInvalid = true; 6556 } 6557 6558 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 6559 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 6560 browserStorage.removeItem(private_content_key); 6561 } 6562 6563 if (isInvalid && cookieVersion) { 6564 fetchPrivateContent([]); 6565 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 6566 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 6567 if ( 6568 privateContent && 6569 privateContentExpires && 6570 privateContent.cart && 6571 privateContent.customer 6572 ) { 6573 dispatchPrivateContent(privateContent); 6574 } else { 6575 fetchPrivateContent([]); 6576 } 6577 } else { 6578 if (document.getElementById('default-section-data')) { 6579 const privateContent = JSON.parse(document.getElementById('default-section-data').textContent.trim()); 6580 dispatchPrivateContent(privateContent); 6581 } else { 6582 dispatchPrivateContent({}); 6583 } 6584 } 6585 6586 } catch (error) { 6587 console.warn('Error retrieving Private Content:', error); 6588 } 6589 } 6590 6591 hyva.alpineInitialized(loadSectionData) 6592 window.addEventListener('reload-customer-section-data', loadSectionData); 6593 6594 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 6595 6596 function dispatchPrivateContent(data) { 6597 6598 const privateContentEvent = new CustomEvent("private-content-loaded", { 6599 detail: { 6600 data: window.processSectionDataBeforeDispatch(data) 6601 } 6602 }); 6603 window.dispatchEvent(privateContentEvent); 6604 } 6605 6606 function fetchPrivateContent(sections) { 6607 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 6608 method: 'GET', 6609 headers: { 6610 'Content-Type': 'application/json', 6611 'X-Requested-With': 'XMLHttpRequest' 6612 } 6613 }) 6614 .then(response => response.ok && response.json()) 6615 .then( 6616 data => { 6617 if (data) { 6618 try { 6619 const browserStorage = hyva.getBrowserStorage(); 6620 6621 // merge new data preserving non-invalidated sections 6622 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 6623 6624 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 6625 delete oldSectionData['checkout-data']; 6626 } 6627 const newSectionData = Object.assign(oldSectionData, data); 6628 6629 dispatchPrivateContent(newSectionData); 6630 6631 // don't persist messages, they've been dispatched already 6632 if (newSectionData.messages && newSectionData.messages.messages ) { 6633 newSectionData.messages.messages = []; 6634 } 6635 6636 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 6637 6638 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 6639 browserStorage.setItem(private_content_expire_key, expiresAt); 6640 6641 const newCookieVersion = hyva.getCookie(private_content_version_key); 6642 browserStorage.setItem(private_content_version_key, newCookieVersion); 6643 6644 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 6645 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 6646 hyva.setCookie( 6647 section_data_ids_key, 6648 JSON.stringify( 6649 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 6650 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 6651 return sectionDataIds; 6652 }, {}) 6653 ), 6654 false, 6655 true 6656 ); 6657 } catch (error) { 6658 console.warn("Couldn't store privateContent", error); 6659 } 6660 } 6661 } 6662 ) 6663 .catch(error => { 6664 console.warn("Couldn't fetch privateContent", error); 6665 }); 6666 } 6667 })(); 6668 //# sourceURL=hyva-private-content.js 6669</script>
vendor: 1 bytes, line 6669
6669
6670<script> 6671 (() => { 6672 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 6673 })() 6674</script>
vendor: 1 bytes, line 6674
6674
6675<script> 6676 (events => { 6677 const addListeners = () => { 6678 var init = false; 6679 const dispatchUserInteractionEvent = Alpine.throttle(() => { 6680 if(!init){ 6681 init=true; 6682 return false; 6683 } 6684 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 6685 window.dispatchEvent(new Event('init-external-scripts')) 6686 }, 30); 6687 document.removeEventListener('alpine:initialized', addListeners) 6688 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, { passive: true})) 6689 } 6690 document.addEventListener('alpine:initialized', addListeners, { once: true }); 6691 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 6692</script>
vendor: 1 bytes, line 6692
6692
6693<script> 6694 'use strict'; 6695 6696 (() => { 6697 const initCarousels = (elements) => { 6698 if (!Swiper) { 6699 return; 6700 } 6701 6702 const initProductCarousel = (carousel, additionalOptions) => { 6703 carousel.classList.add("swiper"); 6704 if (!carousel.querySelectorAll(".swiper-wrapper").length) { 6705 carousel.innerHTML = `<div class="swiper-wrapper">${carousel.innerHTML}</div>`; 6706 } 6707 carousel.querySelectorAll(".swiper-wrapper > *").forEach(function (el) { 6708 el.classList.add("swiper-slide"); 6709 }); 6710 6711 let swiperElement = carousel.querySelector('.swiper'); 6712 if (!swiperElement) { 6713 swiperElement = carousel; 6714 } 6715 6716 if ((carousel.dataset.showArrows === 'true' || carousel.dataset.showDots === 'true') && !carousel.querySelectorAll(".swiper-pagination").length) { 6717 swiperElement.insertAdjacentHTML( 6718 'beforeend', 6719 '\u000A\u003Cdiv\u0020class\u003D\u0022swiper\u002Dbutton\u002Dprev\u0020w\u002D12\u0020h\u002D12\u0020rounded\u002Dfull\u0020group\u002Fbutton\u0020bg\u002Dwhite\u0020hidden\u0020opacity\u002D0\u0020md\u003Agroup\u002Dhover\u003Aopacity\u002D100\u0020md\u003A\u0021flex\u0020shadow\u002Dlg\u0020shadow\u002Dblack\u002F30\u0020transition\u002Dall\u0022\u003E\u000A\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\u0020class\u003D\u0022m\u002Dauto\u0020group\u002Dhover\u002Fbutton\u003A\u0021stroke\u002Dprimary\u0022\u0020width\u003D\u002220\u0022\u0020height\u003D\u002220\u0022\u0020role\u
6719003D\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\u003C\u002Fdiv\u003E\u000A\u003Cdiv\u0020class\u003D\u0022swiper\u002Dbutton\u002Dnext\u0020w\u002D12\u0020h\u002D12\u0020rounded\u002Dfull\u0020group\u002Fbutton\u0020bg\u002Dwhite\u0020hidden\u0020hover\u003A\u0021stroke\u002Dprimary\u0020opacity\u002D0\u0020md\u003Agroup\u002Dhover\u003Aopacity\u002D100\u0020md\u003A\u0021flex\u0020shadow\u002Dlg\u0020shadow\u002Dblack\u002F30\u0020transition\u002Dall\u0022\u003E\u000A\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\u0020class\u003D\u0022m\u002Dauto\u0020group\u002Dhover\u002Fbutton\u003A\u0021stroke\u002Dprimary\u0022\u0020width\u003D\u002220\u0022\u0020height\u003D\u002220\u0022\u0020role\u
6719003D\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\u003C\u002Fdiv\u003E\u000A\u003Cdiv\u0020class\u003D\u0022swiper\u002Dpagination\u0020absolute\u0020right\u002D1\u002F2\u0020translate\u002Dx\u002D1\u002F2\u0020bottom\u002D5\u0020md\u003Abottom\u002D7\u0022\u003E\u003C\u002Fdiv\u003E\u000A' 6720 ); 6721 } 6722 6723 let autoplayOptions = {autoplay: false}; 6724 if (carousel.dataset.autoplay === 'true') { 6725 autoplayOptions = { 6726 autoplay: { 6727 delay: carousel.dataset.autoplaySpeed 6728 }, 6729 plugins: [ SwiperPluginPagination, SwiperPluginAutoPlay, SwiperPluginNavigation ] 6730 }; 6731 } 6732 6733 let dotsOptions = {pagination: false}; 6734 if (carousel.dataset.showDots === 'true') { 6735 dotsOptions = { 6736 pagination: { 6737 el: '.swiper-pagination', 6738 type: 'bullets', 6739 clickable: true 6740 } 6741 }; 6742 } 6743 6744 let arrowsOptions = {navigation: false}; 6745 if (carousel.dataset.showArrows === 'true') { 6746 arrowsOptions = { 6747 navigation: { 6748 nextEl: '.swiper-button-next', 6749 prevEl: '.swiper-button-prev', 6750 }, 6751 }; 6752 } 6753 6754 let options = Object.assign({ 6755 slidesPerView: 'auto', 6756 loop: carousel.dataset.infiniteLoop?.toLowerCase?.() === 'true' 6757 }, additionalOptions, dotsOptions, arrowsOptions, autoplayOptions); 6758
6759 initCarousel(swiperElement, options); 6760 }; 6761 6762 elements.forEach(element => { 6763 if (element.dataset.contentType === 'slider') { 6764 initProductCarousel(element, {slidesPerView: 1}); 6765 } else { 6766 initProductCarousel(element); 6767 } 6768 }); 6769 }; 6770 6771 window.addEventListener('init-external-scripts', () => { 6772 const carouselElements = document.querySelectorAll( 6773 `[data-content-type="products"][data-appearance="carousel"], 6774 [data-content-type="slider"], .clerk-product-async, .swiper.products-widget, .swiper, .async-carousel, .clerk` 6775 ); 6776 6777 window.carouselInitialized = false; 6778 6779 // Autoplay Plugin 6780 const scriptAutoplay = document.createElement('script'); 6781 scriptAutoplay.type = 'text/javascript'; 6782 scriptAutoplay.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002FautoPlay.min.js'; 6783 document.head.appendChild(scriptAutoplay); 6784 6785 // Pagination Plugin 6786 const scriptPagination = document.createElement('script'); 6787 scriptPagination.type = 'text/javascript'; 6788 scriptPagination.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Fpagination.min.js'; 6789 document.head.appendChild(scriptPagination); 6790 6791 // Navigation Plugin 6792 const scriptNavigation = document.createElement('script'); 6793 scriptNavigation.type = 'text/javascript'; 6794 scriptNavigation.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Fnavigation.min.js'; 6795 document.head.appendChild(scriptNavigation); 6796 6797 // Swiper 6798 const script = document.createElement('script'); 6799 script.type = 'text/javascript'; 6800 6801 script.addEventListener('load', () => { 6802 if (window.carouselInitialized) { 6803 return; 6804 } 6805 6806 const carouselElementsToInitialize = document.querySelectorAll( 6807 `[data-content-type="products"][data-appearance="carousel"], 6808 [data-content-type="slider"], .swiper.products-widget` 6809 ); 6810 initCarousels(carouselElementsToInitialize); 6811 6812 window.carouselInitialized = true; 6813 const carouselInitializedEvent = new Event("carousel-initialized"); 6814 document.dispatchEvent(carouselInitializedEvent); 6815 }); 6816 6817 script.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Ftinyswiper\u002Dfull.min.js'; 6818 document.head.appendChild(script); 6819 }, { once: true, passive: true }); 6820 })(); 6821 6822 function initCarousel(element = "", options = {}) { 6823 var defaultOptions = { 6824 slidesPerView: 'auto', 6825 navigation: { 6826 nextEl: '.swiper-button-next', 6827 prevEl: '.swiper-button-prev', 6828 }, 6829 pagination: { 6830 el: '.swiper-pagination', 6831 type: 'bullets', 6832 clickable: true 6833 }, 6834 fadingSlideSelector: '' 6835 }; 6836 options = Object.assign(defaultOptions, options); 6837 6838 if (typeof element === 'string' || element instanceof String) { 6839 element = document.querySelector(element); 6840 } 6841 6842 if (!element) { 6843 return false; 6844 } 6845 6846 let paginationElement = element.querySelector(defaultOptions.pagination.el) 6847 if (paginationElement && defaultOptions.pagination) { 6848 defaultOptions.pagination.el = paginationElement; 6849 } else { 6850 defaultOptions.pagination = false 6851 } 6852 6853 let nextElement = element.querySelector(defaultOptions.navigation.nextEl) 6854 if (nextElement && defaultOptions.navigation) { 6855 defaultOptions.navigation.nextEl = nextElement; 6856 } else { 6857 defaultOptions.navigation = false;
6858 } 6859 6860 let prevElement = element.querySelector(defaultOptions.navigation.prevEl) 6861 if (prevElement && defaultOptions.navigation) { 6862 defaultOptions.navigation.prevEl = prevElement; 6863 } else { 6864 defaultOptions.navigation = false; 6865 } 6866 6867 if (options.slidesPerView == 'auto') { 6868 let wrapperWidth = element.clientWidth, 6869 slideWidth = element.querySelector('.swiper-slide').clientWidth; 6870 6871 options.slidesPerView = Math.round(wrapperWidth / slideWidth); 6872 } 6873 6874 if (!options.navigation) { 6875 element.querySelectorAll('.swiper-button-prev, .swiper-button-next') 6876 .forEach((element) => element.remove()); 6877 } 6878 6879 if (options.slidesPerView > element.querySelectorAll('.swiper-slide').length) { 6880 element.querySelectorAll('.swiper-button-prev, .swiper-button-next, .swiper-pagination') 6881 .forEach((element) => element.remove()); 6882 return; 6883 } 6884 6885 if (typeof Swiper != "undefined") { 6886 let carousel = new Swiper(element, options); 6887 attachCustomBehaviours(carousel, element, options); 6888 return; 6889 } 6890 6891 document.addEventListener("carousel-initialized", function () { 6892 let carousel = new Swiper(element, options); 6893 carousel.slideTo(0); // Fix per disabilitare navigazione quando non c'è overflow degli elementi 6894 attachCustomBehaviours(carousel, element, options); 6895 }); 6896 6897 } 6898 6899 function attachCustomBehaviours(carousel, element, options) { 6900 // Fading selected slide behaviour 6901 let fadingSlide; 6902 try { 6903 if (options.fadingSlideSelector) { 6904 fadingSlide = document.querySelector(options.fadingSlideSelector) 6905 } else { 6906 fadingSlide = element.closest('.fading-slide-container').querySelector('.fading-slide'); 6907 } 6908 } catch (e) { 6909 fadingSlide = null; 6910 } 6911 6912 if (fadingSlide) { 6913 fadingSlide.classList.add('transition-all'); 6914 6915 carousel.on('before-slide', function(currentIndex, state, newIndex) { 6916 if (newIndex > 0) { 6917 fadingSlide.classList.add('md:opacity-0'); 6918 } else if (newIndex == 0) { 6919 fadingSlide.classList.remove('md:opacity-0'); 6920 } 6921 }); 6922 } 6923 } 6924</script>
vendor: 1 bytes, line 6924
6924
6925<script> 6926 'use strict'; 6927 6928 (() => { 6929 const applyShowOnHover = (element) => { 6930 const showOverlayOnHover = (element) => { 6931 const overlay = element.querySelector('.pagebuilder-overlay'); 6932 const color = overlay.dataset.overlayColor; 6933 6934 element.addEventListener('mouseover', () => { 6935 overlay.style.backgroundColor = color; 6936 }); 6937 element.addEventListener('mouseout', () => { 6938 overlay.style.backgroundColor = 'transparent'; 6939 }); 6940 }; 6941 6942 const showButtonOnHover = (element) => { 6943 const button = element.querySelector('.pagebuilder-banner-button'); 6944 6945 element.addEventListener('mouseover', () => { 6946 button.style.opacity = '1'; 6947 button.style.visibility = 'visible'; 6948 }); 6949 element.addEventListener('mouseout', () => { 6950 button.style.opacity = '0'; 6951 button.style.visibility = 'hidden'; 6952 }); 6953 }; 6954 6955 if (element.dataset.showOverlay === 'hover') { 6956 showOverlayOnHover(element); 6957 } 6958 if (element.dataset.showButton === 'hover') { 6959 showButtonOnHover(element); 6960 } 6961 }; 6962 6963 window.addEventListener('DOMContentLoaded', () => { 6964 document.querySelectorAll('[data-content-type="banner"],[data-content-type="slider"]').forEach(element => { 6965 applyShowOnHover(element); 6966 }); 6967 }); 6968 })(); 6969</script>
6969 6970
6970<script> 6971 function amastyRewardsCatalog() { 6972 return { 6973 productId: this.$el.dataset.productId, 6974 formSelector: 'product_addtocart_form', 6975 refreshUrl: this.$el.dataset.refreshUrl, 6976 loader: false, 6977 isFetching: false, 6978 abortFetchController: false, 6979 highlight: { 6980 caption_color: '', 6981 caption_text: '', 6982 visible: false 6983 }, 6984 6985 init() { 6986 this.formObserver(); 6987 document.addEventListener(`update-qty-${this.productId}`, () => { 6988 this.updateData(); 6989 }); 6990 this.$nextTick(() => this.updateData()); 6991 }, 6992 6993 hideBlock() { 6994 this.highlight.visible = false; 6995 this.loader = true; 6996 }, 6997 6998 dispatchStatus(type, message) { 6999 window.dispatchMessages([{ 7000 type: type, 7001 text: message 7002 }], 5000); 7003 }, 7004 7005 formObserver() { 7006 const product = document.querySelector(`input[name="product"][value="${this.productId}"]`); 7007 7008 if (product) { 7009 const productForm = product.form; 7010 if (productForm) { 7011 productForm.addEventListener('change', () => { 7012 this.updateData(); 7013 }); 7014 } 7015 } 7016 }, 7017 7018 updateData() { 7019 if (!this.refreshUrl || this.isFetching) return false; 7020 this.hideBlock(); 7021 7022 if (this.abortFetchController) { 7023 this.abortFetchController.abort(); 7024 } 7025 this.abortFetchController = new AbortController(); 7026 7027 const product = document.querySelector(`input[name='product'][value='${this.productId}']`); 7028 if (!product) return false; 7029 7030 const form = product.form; 7031 const formData = new FormData(form); 7032 const formParams = new URLSearchParams(formData).toString(); 7033 const formJson = JSON.stringify({ 7034 productId: this.productId, 7035 attributes: formParams 7036 }); 7037 7038 const requestOptions = { 7039 method: 'POST', 7040 body: formJson, 7041 headers: { 7042 'Content-Type': 'application/json', 7043 'x-requested-with': 'XMLHttpRequest', 7044 }, 7045 signal: this.abortFetchController.signal 7046 }; 7047 7048 this.isFetching = true; 7049 fetch(this.refreshUrl, requestOptions).then(response => { 7050 if (!response.ok) { 7051 return Promise.reject(`${response.status} ${response.statusText}`); 7052 } 7053 return response.json(); 7054 }).then(data => { 7055 this.highlight.visible = data.visible; 7056 this.highlight.caption_text = data.caption_text; 7057 this.highlight.caption_color = data.caption_color; 7058 }).catch(error => { 7059 if (error.name !== 'AbortError' 7060 && typeof error === 'string' 7061 && error.match(/'401'/g) !== null 7062 ) { 7063 this.dispatchStatus('error', error); 7064 } 7065 }).finally(() => { 7066 this.loader = false;
7067 this.abortFetchController = false; 7068 this.isFetching = false; 7069 }); 7070 }, 7071 7072 highlightVisible() { 7073 return this.highlight.visible && !this.loader; 7074 }, 7075 7076 highlightStyle() { 7077 return `color: ${this.highlight.caption_color}`; 7078 }, 7079 } 7080 } 7081 7082 window.addEventListener( 7083 'alpine:init', 7084 () => Alpine.data('amastyRewardsCatalog', amastyRewardsCatalog), 7085 { once: true } 7086 ); 7087 </script>
7087 7088
7088<script> 7089 'use strict'; 7090 7091 const grecaptchaV2LoadCallbacks = []; 7092 7093 function executeRecaptchaLoadCallbacks () { 7094 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 7095 const callback = grecaptchaV2LoadCallbacks.pop(); 7096 typeof callback === 'string' ? window[callback]() : callback(); 7097 } 7098 } 7099 7100 (function() { 7101 const loadRecaptchaScript = (event) => { 7102 7103 if (window.grecaptcha || !event.target.form) { 7104 return; 7105 } 7106 7107 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 7108 const siteKey = '6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ'; 7109 const script = document.createElement('script'); 7110 script.type = 'text/javascript'; 7111 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 7112 script.async = true; 7113 document.head.appendChild(script); 7114 7115 script.addEventListener('load', () => { 7116 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 7117 }); 7118 } 7119 7120 window.forceLoadRecaptchaScript = (form) => { 7121 loadRecaptchaScript({target: {form: form || 'dummy'}}); 7122 executeRecaptchaLoadCallbacks(); 7123 }; 7124 7125 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 7126 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 7127 7128 }()); 7129 7130</script>
vendor: 1 bytes, line 7130
7130
7131<script> 7132 function selectManager() { 7133 return { 7134 value: '', 7135 7136 input: { 7137 ['x-model']: "value", 7138 [':class']: "{ 'invalid-placeholder': !value || value == \"\" }", 7139 ['x-init']() { 7140 this.value = this.$el.options[this.$el.selectedIndex || 0].value 7141 } 7142 } 7143 } 7144 } 7145 7146 function qtyManager() { 7147 return { 7148 inputElement: null, 7149 value: 0, 7150 step: 1, 7151 min: null, 7152 max: null, 7153 7154 input: { 7155 ["x-model"]: "value", 7156 ['x-init']() { 7157 this.inputElement = this.$el; 7158 this.value = parseInt(this.$el.value); 7159 }, 7160 ['x-on:input'] ($event) { 7161 let inputValue = parseInt($event.target.value.replace(/\D/g, '')); 7162 if (!this.checkMin(inputValue)) { 7163 this.value = this.min; 7164 } else if (!this.checkMax(inputValue)) { 7165 this.value = this.max; 7166 } else { 7167 this.value = inputValue; 7168 } 7169 } 7170 }, 7171 plus: { 7172 ['@click']() { 7173 if (this.checkMax(this.value, this.step)) { 7174 this.value += this.step; 7175 } 7176 this.inputElement.dispatchEvent(new Event('changed')); 7177 } 7178 }, 7179 minus: { 7180 ['@click']() { 7181 if (this.checkMin(this.value, this.step)) { 7182 this.value -= this.step; 7183 } 7184 this.inputElement.dispatchEvent(new Event('changed')); 7185 } 7186 }, 7187 checkMin(value, step = null) { 7188 if (this.min) { 7189 if (step) { 7190 return value - step >= this.min; 7191 } 7192 return value >= this.min; 7193 } 7194 return true; 7195 }, 7196 checkMax(value, step = null) { 7197 if (this.max) { 7198 if (step) { 7199 return value + step <= this.max; 7200 } 7201 return value <= this.max; 7202 } 7203 return true; 7204 } 7205 } 7206 } 7207 7208 /** Questo potrebbe convenire aggiungerlo solamente dove usiamo quell'input **/ 7209 function dateInputManager() { 7210 return { 7211 value: '', 7212 7213 input: { 7214 ["x-model"]: "value", 7215 ['x-init']() { 7216 this.value = this.$el.value 7217 }, 7218 7219 ['x-on:input'](e) { 7220 let date = e.target.value.replace(/\D/g, ''); 7221 let formattedDate = ''; 7222 7223 if (date.length >= 2) { 7224 let value = date.substring(0, 2); 7225 if (value > 31) { 7226 value = 31; 7227 } 7228 formattedDate = value + '/'; 7229 } else { 7230 this.value = date; 7231 return; 7232 } 7233 7234 if (date.length >= 4) { 7235 let value = date.substring(2, 4); 7236 if (value > 12) { 7237 value = 12; 7238 } 7239 formattedDate += value + '/'; 7240 } else { 7241 this.value = formattedDate + date.substring(2, date.length); 7242 return; 7243 } 7244 7245 if (date.length > 4) { 7246 formattedDate += date.substring(4, 8); 7247 } else { 7248 this.value = formattedDate + date.substring(4, date.length); 7249 return; 7250 } 7251 7252 this.value = formattedDate; 7253 } 7254 } 7255 } 7256 } 7257</script>
vendor: 1 bytes, line 7257
7257
7258<script> 7259 (function (w,d){ 7260 function setScrollbarWidthCssVar() { 7261 let newSize = (w.innerWidth - d.body.clientWidth) + "px", 7262 oldSize = d.documentElement.style.getPropertyValue('--scrollbar-width'); 7263 if (newSize !== oldSize){ 7264 d.documentElement.style.setProperty('--scrollbar-width', newSize); 7265 } 7266 } 7267 d.addEventListener('alpine:init', () => { 7268 new ResizeObserver(Alpine.debounce(setScrollbarWidthCssVar, 300)).observe(d.documentElement); 7269 }, { once: true }); 7270 setScrollbarWidthCssVar(); 7271 }) (window, document); 7272 /** Effettua il lock della viewport quando necessario (es. all'apertura del menu o del minicart) */ 7273 window.addEventListener('screen-lock', (event) => { 7274 document.body.classList.toggle('max-h-screen', event.detail); 7275 document.body.classList.toggle('lock-screen', event.detail); 7276 document.body.classList.toggle('overflow-hidden', event.detail); 7277 }); 7278 7279 function initCustomerMenuMobile() { 7280 return { 7281 open: false, 7282 customer: {}, 7283 getData(data) { 7284 if (data.customer) { this.customer = data.customer } 7285 }, 7286 isLoggedIn(){ 7287 return !!(this.customer.firstname); 7288 } 7289 } 7290 } 7291</script>
7291 7292 7293<!-- Wrapping template -->
7294<script type="text/template" id="instant_wrapper_template"> 7295 {{#findAutocomplete}} 7296 <div id="algolia-autocomplete-container"></div> 7297 {{/findAutocomplete}} 7298 7299 <div id="algolia_instant_selector" 7300 class=" with-facets" 7301 > 7302 <div class="columns"> 7303 <aside class="sidebar sidebar-main relative" id="algolia-left-container"> 7304 <button class="filters lg:hidden btn btn-tertiary bg-tertiary-darker text-white rounded-lg flex pl-3 pr-4 py-1.5 items-center" onclick="toggleAaFilters()"> 7305 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" alt="Icona" role="presentation"> 7306 <path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"></path> 7307 <title>adjustments</title> 7308 </svg> 7309 <span class="ml-1.5 font-baloo-bhaina"> 7310 Filtri </span> 7311 </button> 7312 <div class="mb-4 hidden lg:block" id="facets"> 7313 <div class="aa-mobile-header flex px-layoutGutter py-3 border-b mb-2 justify-between items-center lg:hidden shadow-md"> 7314 <span class="text-primary text-lg font-bold mx-auto pl-6"> 7315 Filtri </span> 7316 <span id="aa-mobile-toggler" class="cursor-pointer" onclick="toggleAaFilters()"> 7317 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" role="img"> 7318 <path d="M21.82 24c-.58 0-1.13-.23-1.54-.64l-8.27-8.27-8.29 8.27a2.179 2.179 0 0 1-3.08-3.08L8.92 12 .64 3.73a2.19 2.19 0 0 1 0-3.09 2.172 2.172 0 0 1 3.08 0L12 8.92 20.27.64a2.19 2.19 0 0 1 3.09 0c.85.85.85 2.23 0 3.09L15.08 12l8.27 8.27c.85.85.85 2.24 0 3.09-.41.41-.96.64-1.54.64Z" style="fill:currentColor"></path> 7319 <title>x</title> 7320 </svg> 7321 </span> 7322 </div> 7323 <div class="pt-[50px] px-layoutGutter lg:px-0 lg:pt-0" id="instant-search-facets-container"> 7324 <div class="hidden lg:block text-primary text-md text-xl lg:text-2xl font-semibold h-10 mt-2.5"> 7325 Filtri </div> 7326 <div class="w-full flex flex-col bg-white shadow hidden lg:mt-4 py-3" id="instant-search-active-filters"> 7327 <span class="title text-base font-bold font-baloo-bhaina hidden" id="instant-search-active-filters-label"> 7328 Filtri attivi </span> 7329 <div class="order-2" id="clear-refinements"></div> 7330 <div id="current-refinements"></div> 7331 </div> 7332 </div> 7333 </div> 7334 </aside> 7335 <div class="column main" id="algolia-right-container"> 7336 <div class="hidden"> 7337 <div class="pb-3.5"> 7338 <div class="px-2.5"> 7339 {{#second_bar}} 7340 <div id="instant-search-bar"></div> 7341 {{/second_bar}} 7342 </div> 7343 </div> 7344 </div> 7345 <div class="relative"> 7346 <div itemscope itemtype="http://schema.org/ItemList" class="w-full"> 7347 <div id="algolia-toolbar" class="toolbar toolbar-products items-center flex justify-between"> 7348 <div class="left flex items-center"> 7349 <div id="algolia-stats"></div> 7350 </div> 7351 <div class="right flex items-center"> 7352 <span class="mr-2 inline-block">
7352Ordina per</span> 7353 <div id="algolia-sorts"></div> 7354 </div> 7355 </div> 7356 <div id="algolia-banner"></div> 7357 <div id="instant-empty-results-container"></div> 7358 <div class="py-6" id="instant-search-results-container"></div> 7359 </div> 7360 </div> 7361 <div> 7362 <div id="algolia-stats-range" class="mb-2"></div> 7363 <div id="instant-search-pagination-container"></div> 7364 </div> 7365 </div> 7366 </div> 7367 </div> 7368</script>
7368 7369
7370<script> 7371 function toggleAaFilters() { 7372 try { 7373 var facets = document.getElementById('facets'); 7374 if (!facets) return; 7375 7376 // Toggle visibility of facets (mobile overlay) 7377 facets.classList.toggle('hidden'); 7378 7379 var isOpen = !facets.classList.contains('hidden'); 7380 var body = document.body; 7381 var lockClasses = ['max-h-screen', 'lock-screen', 'overflow-hidden', 'instant-lock']; 7382 lockClasses.forEach(function (cls) { 7383 if (isOpen) { 7384 body.classList.add(cls); 7385 } else { 7386 body.classList.remove(cls); 7387 } 7388 }); 7389 7390 // Apply or remove mobile collapsible bindings only when toggler is used 7391 try { 7392 if (window.AISFacetsCollapsible) { 7393 if (isOpen) { 7394 window.AISFacetsCollapsible.enable(); 7395 } 7396 } 7397 } catch (e2) { /* noop */ } 7398 } catch (e) { 7399 // Fail-safe: do nothing on error 7400 console.error('toggleAaFilters error', e); 7401 } 7402 } 7403</script>
7403 7404
7405<script> 7406 // Mobile-only: make Algolia facets panels (.ais-Panel) collapsible after they are rendered 7407 (function() { 7408 'use strict'; 7409 var MOBILE_MQL = window.matchMedia('(max-width: 1023px)'); // Tailwind lg breakpoint 7410 7411 function applyCollapsible(root) { 7412 if (!root) return; 7413 var panels = root.querySelectorAll('.ais-Panel'); 7414 panels.forEach(function(panel) { 7415 if (!panel || panel.dataset.collapsibleApplied === '1') return; 7416 var header = panel.querySelector('.ais-Panel-header'); 7417 var body = panel.querySelector('.ais-Panel-body'); 7418 if (!header || !body) return; 7419 7420 // Mark as processed 7421 panel.dataset.collapsibleApplied = '1'; 7422 7423 // Ensure default open state 7424 panel.classList.remove('is-collapsed'); 7425 header.setAttribute('aria-expanded', 'true'); 7426 7427 // Make header interactive 7428 header.setAttribute('role', 'button'); 7429 header.setAttribute('tabindex', '0'); 7430 7431 // Inject chevron-down if not present 7432 if (!header.querySelector('.ais-Panel-chevron')) { 7433 var chev = document.createElement('span'); 7434 chev.className = 'ais-Panel-chevron chevron'; 7435 chev.setAttribute('aria-hidden', 'true'); 7436 chev.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18" role="img" aria-hidden="true"><path d="M6.23 8.34a1 1 0 0 1 1.41 0L12 12.7l4.36-4.36a1 1 0 1 1 1.41 1.41l-5.07 5.07a1 1 0 0 1-1.41 0L6.23 9.75a1 1 0 0 1 0-1.41Z" fill="currentColor"/></svg>'; 7437 header.appendChild(chev); 7438 } 7439 7440 var toggle = function() { 7441 var collapsed = panel.classList.toggle('is-collapsed'); 7442 header.setAttribute('aria-expanded', String(!collapsed)); 7443 }; 7444 7445 header.addEventListener('click', toggle); 7446 header.addEventListener('keydown', function(e) { 7447 if (e.key === 'Enter' || e.key === ' ') { 7448 e.preventDefault(); 7449 toggle(); 7450 } 7451 }); 7452 }); 7453 } 7454 7455 function enableMobileCollapsible() { 7456 if (!MOBILE_MQL.matches) return; 7457 var container = document.getElementById('instant-search-facets-container'); 7458 if (!container) return; 7459 applyCollapsible(container); 7460 7461 // Observe for dynamic facet (re)renders 7462 if (!container._aisCollapsibleObserver) { 7463 var obs = new MutationObserver(function() { 7464 applyCollapsible(container); 7465 }); 7466 obs.observe(container, { childList: true, subtree: true }); 7467 container._aisCollapsibleObserver = obs; 7468 } 7469 } 7470 7471 function disableMobileCollapsible() { 7472 var container = document.getElementById('instant-search-facets-container'); 7473 if (!container) return; 7474 // Ensure all panels are open on desktop 7475 container.querySelectorAll('.ais-Panel').forEach(function(panel) { 7476 panel.classList.remove('is-collapsed'); 7477 var header = panel.querySelector('.ais-Panel-header'); 7478 if (header) { 7479 header.setAttribute('aria-expanded', 'true'); 7480 } 7481 }); 7482 if (container._aisCollapsibleObserver) { 7483 try { container._aisCollapsibleObserver.disconnect(); } catch (e) {} 7484 container._aisCollapsibleObserver = null; 7485 } 7486 } 7487 7488 // Expose API to be triggered explicitly by the mobile toggler 7489 window.AISFacetsCollapsible = { 7490 enable: enableMobileCollapsible, 7491 disable: disableMobileCollapsible, 7492 _mql: MOBILE_MQL 7493 }; 7494 })(); 7495</script>
7495 7496 7497<style> 7498 .ais-ClearRefinements-button span { 7499 display: none; 7500 } 7501 7502 .ais-ClearRefinements-button::after { 7503 content: 'Cancella tutto'; 7504 } 7505</style>
7506<script type="text/template" id="instant-hit-template"> 7507 <div class="item product product-item card card-interactive flex flex-col w-full h-full border hover:border-tertiary rounded-lg p-2 lg:px-4 lg:py-3" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" 7508 x-data="initInsight()" 7509 x-init="bindClickEvent($el, 'Product Clicked', '{{objectID}}', '{{__indexName}}', '{{__position}}', '{{__queryID}}')" 7510 > 7511 <meta itemprop="position" content="{{__position}}"/> 7512 <div class="relative flex flex-col flex-grow" itemprop="item" itemscope itemtype="http://schema.org/Product"> 7513 <meta itemprop="url" 7514 {{^__queryID}} content="{{url}}" {{/__queryID}} 7515 {{#__queryID}} content="{{urlForInsights}}" {{/__queryID}} 7516 /> 7517 7518 <span class="badge-container flex flex-wrap gap-2 absolute z-10" x-defer="intersect" x-intersect.once="$store.badges.addNode({{objectID}}, 'card_top_left')"> 7519 <template x-for="badge in $store.badges.getBadgesHtml({{objectID}}, 'card_top_left')"> 7520 <span x-html="badge"></span> 7521 </template> 7522 </span> 7523 7524 <a class="product photo product-item-photo block mx-auto mb-4 result flex items-center justify-center max-w-[142px] max-h-[142px]" 7525 tabindex="-1" 7526 {{^__queryID}} href="{{url}}" {{/__queryID}} 7527 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}} 7528 > 7529 {{#image_url}}<img itemprop="image" src="{{{image_url}}}" alt="{{{name}}}" class="max-w-full max-h-full object-contain"/>{{/image_url}} 7530 {{^image_url}}<span class="no-image block max-w-[142px] max-h-[142px] bg-gray-3"></span>{{/image_url}} 7531 </a> 7532 7533 <div class="product-info flex flex-col grow justify-start"> 7534 <div class="items-center justify-center"> 7535 <a class="product-item-link result" 7536 {{^__queryID}} href="{{url}}" {{/__queryID}} 7537 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}}> 7538 <h2 class="text-primary text-xs line-clamp-3 font-normal"> 7539 {{{ _highlightResult.name.value }}} 7540 </h2> 7541 </a> 7542 </div> 7543 <div class="mt-1 mb-1"> 7544 {{#rating_count}} 7545 <div class="rating-summary" title="{{rating_summary}}%" role="group" aria-label="{{rating_summary}}%"> 7546 <div class="inline-flex align-middle" style="line-height: 0;"> 7547 <div class="relative"> 7548 <div class="flex"> 7549 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #cbd5e0" aria-hidden="true"><path 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 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 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 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"/></svg> 7550 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #cbd5e0" aria-hidden="true"><path 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 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 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 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"/></svg> 7551 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #cbd5e0" aria-hidden="true"><path 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 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 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 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"/>
7551</svg> 7552 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #cbd5e0" aria-hidden="true"><path 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 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 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 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"/></svg> 7553 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #cbd5e0" aria-hidden="true"><path 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 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 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 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"/></svg> 7554 </div> 7555 <div class="absolute top-0 left-0 overflow-hidden" style="width: {{rating_summary}}%"> 7556 <div class="flex w-fit"> 7557 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #f6e05e" aria-hidden="true"><path 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 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 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 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"/></svg> 7558 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #f6e05e" aria-hidden="true"><path 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 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 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 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"/></svg> 7559 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #f6e05e" aria-hidden="true"><path 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 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 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 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"/></svg> 7560 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #f6e05e" aria-hidden="true"><path 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 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 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 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"/></svg> 7561 <svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4" viewBox="3 0 20 20" fill="currentColor" style="color: #f6e05e" aria-hidden="true"><path 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 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 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 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"/></svg> 7562 </div> 7563 </div> 7564 </div>
7565 <span class="ml-1 text-xs relative top-[-1px]">({{rating_count}})</span> 7566 </div> 7567 </div> 7568 {{/rating_count}} 7569 </div> 7570 7571 <div class="flex flex-nowrap justify-between items-center mt-auto items-end leading-none"> 7572 <span class="ajax-price-container block flex-grow font-baloo-bhaina hide-price-labels"> 7573 <template x-if="active = true"> 7574 <div x-defer="intersect" x-intersect.once="$store.ajaxPrices.addNode({{objectID}})"> 7575 <template x-if="!$store.ajaxPrices.hasPrice({{objectID}})"> 7576 <div class="skeleton w-16 lg:w-full h-6"> 7577 Caricamento... </div> 7578 </template> 7579 <template x-if="$store.ajaxPrices.hasPrice({{objectID}})"> 7580 <span x-html="$store.ajaxPrices.getPriceHtml({{objectID}})"></span> 7581 </template> 7582 </div> 7583 </template> 7584 </span> 7585 7586 {{#isAddToCartEnabled}} 7587 {{#in_stock}} 7588 <form class="flex-grow-0 product_addtocart_form" data-role="tocart-form" action="{{ addToCart.action }}" method="post"> 7589 <input type="hidden" name="product" value="{{objectID}}"> 7590 <input type="hidden" name="uenc" value="{{ addToCart.uenc }}"> 7591 <input name="form_key" type="hidden" value="{{ addToCart.formKey }}"> 7592 <button type="submit" title="Aggiungi al Carrello" 7593 class="w-auto btn btn-primary mt-auto z-10 justify-center text-sm rounded-md px-3 lg:px-4 py-2 ml-2" 7594 > 7595 <svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 23.99 24" class="h-6 w-6 border-current inline" width="25" height="25" aria-hidden="true" alt="Icona" role="presentation"><path fill="#fff" d="m4.93,21.86c0-1.18.96-2.14,2.14-2.14,1.18,0,2.14.96,2.14,2.14,0,1.18-.96,2.14-2.14,2.14,0,0,0,0,0,0-1.18,0-2.13-.96-2.14-2.14Z"></path><path fill="#fff" d="m14.79,21.86c0-1.18.96-2.14,2.14-2.14,1.18,0,2.14.96,2.14,2.14,0,1.18-.96,2.14-2.14,2.14,0,0,0,0,0,0-1.18,0-2.13-.96-2.14-2.14Z"></path><path fill="#fff" d="m18.73,7.07v-1.81h-1.8c-.64,0-1.15-.51-1.15-1.15s.51-1.15,1.15-1.15h1.8v-1.8C18.73.52,19.25,0,19.89,0s1.15.52,1.15,1.15v1.8h1.8c.64,0,1.15.51,1.15,1.15s-.51,1.15-1.15,1.15h-1.8v1.81c0,.64-.52,1.15-1.15,1.15s-1.15-.52-1.15-1.15Z"></path><path fill="#fff" d="m8.6,19.07c-2.58,0-4.76-1.93-5.06-4.5L2.18,3.03c-.05-.41-.4-.72-.82-.72h-.22c-.64,0-1.15-.52-1.15-1.15C0,.52.51,0,1.15,0h.22c1.58,0,2.92,1.19,3.1,2.76l.03.2h8.49c.64,0,1.15.51,1.15,1.15s-.51,1.15-1.15,1.15H4.77l.88,7.56h11.92c1.35,0,2.51-.97,2.75-2.3.1-.54.57-.94,1.13-.95.07,0,.14,0,.21.02.3.05.57.23.74.48.18.25.25.56.19.86-.43,2.43-2.55,4.2-5.01,4.19H6.05c.45,1,1.45,1.64,2.55,1.65h10.3c.64,0,1.15.52,1.15,1.15s-.52,1.15-1.15,1.15h-10.3Z"></path></svg> 7596 </button> 7597 </form> 7598 {{/in_stock}} 7599 {{^in_stock}} 7600 <a class="w-auto mt-auto z-10 btn btn-primary bg-quaternary hover:bg-slate-900 active:bg-slate-900 justify-center text-sm rounded-md px-3 lg:px-4 py-2 ml-2" aria-label="Notify me" 7601 {{^__queryID}} href="{{url}}" {{/__queryID}} 7602 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}} 7603 > 7604 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="h-6 w-6 border-current inline" width="25" height="25" aria-hidden="true" alt="Icona" role="presentation"> 7605 <path d="M19.5 24c-.38 0-.69-.31-.68-.69 0-.22.11-.43.28-.55a9.215 9.215 0 0 0 3.55-5.77c.07-.31.35-.53.67-.53.05 0 .1 0 .15.02.37.08.6.44.52.81a10.61 10.61 0 0 1-4.08 6.58c-.12.09-.26.13-.41.13Zm-6.88 0c-1.04 0-2.05-.32-2.89-.92l-.2-.14-.2.15c-2 1.5-4.85 1.1-6.35-.9a4.547 4.547 0 0 1-.06-5.37l.17-.24-1.57-1.56a5.049 5.049 0 0 1 0-7.16c.28-.28.59-.53.93-.74L8.4 3.45A8.797 8.797 0 0 1 18.64 4l.24.19 1.92-1.92c.26-.27.7-.28.97-.01.27.26.28.7.01.97l-.01.01-1.92 1.92.19.24a8.864 8.864 0 0 1 .81 9.86l-3.88 6.33a5.058 5.
7605058 0 0 1-3.73 2.39c-.2.02-.4.04-.6.04Zm.52-20.57c-1.42 0-2.82.41-4.02 1.18L3.17 8.28a3.7 3.7 0 0 0-.68 5.76l7.51 7.5c.7.69 1.64 1.08 2.62 1.08.15 0 .29 0 .43-.03 1.13-.13 2.13-.77 2.73-1.74l3.87-6.3a7.478 7.478 0 0 0-1.24-8.93l-.59-.58v.05a7.325 7.325 0 0 0-4.7-1.67Zm-9.09 14.1-.22.4c-.69 1.24-.47 2.78.54 3.77 1.01.96 2.51 1.17 3.75.52l.41-.22-4.48-4.48ZM.68 5.22a.69.69 0 0 1-.55-1.09C1.76 1.95 4.16.48 6.83.02S6.92 0 6.97 0c.38 0 .69.3.69.68 0 .33-.23.61-.55.68a9.18 9.18 0 0 0-5.89 3.58c-.13.17-.33.28-.55.28Z" style="fill:currentColor"></path> 7606 </svg> 7607 </a> 7608 {{/in_stock}} 7609 7610 {{/isAddToCartEnabled}} 7611 </div> 7612 </div> 7613 </div> 7614 </div> 7615</script>
vendor: 1 bytes, line 7615
7615
7616<script> 7617 'use strict'; 7618 7619 function initInsight() { 7620 return { 7621 bindClickEvent(element, eventName, objectID, indexName, position, queryID) { 7622 element.querySelector(algoliaConfig.ccAnalytics.ISSelector).addEventListener("click", function () { 7623 buildInsightsEventData(eventName, objectID, indexName, position, queryID); 7624 }); 7625 } 7626 } 7627 } 7628</script>
vendor: 1 bytes, line 7628
7628
7629<script type="text/template" id="instant-stats-total-template"> 7630 <div class="font-body-sm text-gray-1 hidden lg:block"> 7631 <span itemprop="numberOfItems">{{nbHits}}</span> 7632 <span>prodotti</span> 7633 </div> 7634</script>
7634 7635
7636<script type="text/template" id="instant-stats-range-template"> 7637 <div class="toolbar-amount font-body-sm text-gray-1 pb-4 text-center"> 7638 <span itemprop="numberOfItems">{{first}}-{{last}}</span> 7639 <span>di</span> 7640 <span itemprop="numberOfItems">{{nbHits}}</span> 7641 </div> 7642</script>
vendor: 1 bytes, line 7642
7642
7643<script type="text/template" id="refinements-lists-item-template"> 7644 <label class="{{cssClasses.label}} {{#isRefined}}checked{{/isRefined}} flex items-center mb-1"> 7645 <input class="{{cssClasses.checkbox}}" {{#isRefined}}checked{{/isRefined}} type="checkbox" value="{{value}}" /> 7646 <span class="pl-2">{{value}}</span> 7647 <span class="{{cssClasses.count}} flex-grow text-right">{{count}}</span> 7648 </label> 7649</script>
vendor: 1 bytes, line 7649
7649
7650<script type="text/template" id="current-refinements-template"> 7651 <div class="cross-wrapper"> 7652 <span class="clear-cross clear-refinement"></span> 7653 </div> 7654 <div class="current-refinement-wrapper"> 7655 {{#label}} 7656 <span class="current-refinement-label">{{label}}{{^operator}}:{{/operator}}</span> 7657 {{/label}} 7658 {{#operator}} 7659 {{{displayOperator}}} 7660 {{/operator}} 7661 {{#exclude}}-{{/exclude}} 7662 <span class="current-refinement-name">{{name}}</span> 7663 </div> 7664</script>
vendor: 1 bytes, line 7664
7664
7665<script> 7666 (function () { 7667 const modals = []; 7668 let lastHide = 0; 7669 7670 function resolveElement($refs, value) { 7671 if (!value) return null; 7672 if (value instanceof Element) return value; 7673 if (typeof value === 'string') { 7674 try { 7675 return ($refs && $refs[value]) || document.querySelector(value) || null; 7676 } catch (e) {} 7677 } 7678 return null; 7679 } 7680 7681 function determineTrigger($refs, dialog, trigger) { 7682 if (!trigger && dialog?.target instanceof HTMLElement) { 7683 return dialog.target; 7684 } 7685 7686 if (typeof dialog === 'string' && trigger?.target instanceof HTMLElement) { 7687 return trigger.target; 7688 } 7689 7690 return resolveElement($refs, trigger); 7691 } 7692 7693 function setFocusFirstElement(dialogElement) { 7694 if (!dialogElement) return; 7695 7696 window.setTimeout(() => { 7697 const candidates = dialogElement.querySelectorAll('[x-focus-first]'); 7698 for (const candidate of candidates) { 7699 if (candidate.closest('dialog') === dialogElement) { 7700 candidate.focus(); 7701 return; 7702 } 7703 } 7704 }, 50); 7705 } 7706 7707 window.hyva.modal = function(options = {}) { 7708 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 7709 try { 7710 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 7711 } catch (e) { 7712 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 7713 } 7714 } 7715 7716 const config = Object.assign({ 7717 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 7718 transitionEnterStart: 'opacity-0', 7719 transitionEnterEnd: 'opacity-100', 7720 transitionLeave: 'transition ease-in duration-300', 7721 transitionLeaveStart: 'opacity-100', 7722 transitionLeaveEnd: 'opacity-0', 7723 }, options); 7724 7725 return { 7726 opened: {}, 7727 show(dialog, trigger) { 7728 const name = typeof dialog === 'string' ? dialog : config.dialog; 7729 if (!name || this.opened[name]) return; 7730 7731 this.opened[name] = true; 7732 const focusTarget = determineTrigger(this.$refs, dialog, trigger); 7733 const dialogEl = this.$refs && this.$refs[name]; 7734 const frame = { name, instance: this, focusTarget, time: Date.now() }; 7735 modals.push(frame); 7736 setFocusFirstElement(dialogEl); 7737 return new Promise(resolve => { frame.resolve = resolve; }); 7738 }, 7739 cancel() { 7740 this.hide(false); 7741 }, 7742 ok() { 7743 this.hide(true); 7744 }, 7745 hide(value) { 7746 if (Date.now() - lastHide < config.duration) return; 7747 lastHide = Date.now(); 7748 7749 const modal = modals.pop(); 7750 if (!modal) return; 7751 7752 modal.instance.opened[modal.name] = false; 7753 7754 const focusTarget = modal.focusTarget; 7755 focusTarget && window.setTimeout(() => focusTarget.focus(), config.duration + 50); 7756 modal.resolve && modal.resolve(value); 7757 }, 7758 /** 7759 * @deprecated Use dialogConfig() instead, which is used by the default modal-container.phtml template. 7760 * This method is kept for backwards compatibility with custom container templates. 7761 */ 7762 overlay(dialog) { 7763 dialog = this.$el.dataset.dialogRefName || dialog; 7764 const name = typeof dialog === 'string' ? dialog : config.dialog; 7765 if (this.$el.tagName !== 'DIALOG' && ! window.hyva.modal.legacyModalCompatibility) { 7766 console.warn( 7767 '[hyva] Deprecated modal markup detected (x-bind="overlay" on a non-dialog element' + 7768 (name ? ` for "${name}"` : '') + ').\n' + 7769 'Escape and click-outside closing are not available for such dialogs anymore.\n' + 7770 'Install hyva-themes/magento2-legacy-modal-compatibility or migrate to the native <dialog> markup.' 7771 ); 7772 } 7773 return Object.assign({}, this.dialogConfig(name), { 7774 ['@hyva-modal-show.window'](event) { 7775 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 7776 } 7777 }); 7778 }, 7779 dialogConfig(name) { 7780 name = name || this.$el.dataset.dialogRefName || config.dialog; 7781 return { 7782 ['x-show']: () => name ? this.opened[name] : false, 7783 ['x-transition:enter']: config.transitionEnter, 7784 ['x-transition:enter-start']: config.transitionEnterStart, 7785 ['x-transition:enter-end']: config.transitionEnterEnd, 7786 ['x-transition:leave']: config.transitionLeave, 7787 ['x-transition:leave-start']: config.transitionLeaveStart, 7788 ['x-transition:leave-end']: config.transitionLeaveEnd, 7789 ['@hyva-modal-show.window'](event) { 7790 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide); 7791 }, 7792 }; 7793 },
7794 showDialogOnInit() { 7795 const name = this.$el.dataset.dialogRefName; 7796 if (name) { 7797 this.show(name); 7798 } 7799 } 7800 }; 7801 } 7802 7803 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length - 1] 7804 7805 window.hyva.modal.pop = function () { 7806 if (modals.length > 0) { 7807 modals[modals.length - 1].instance.hide(); 7808 } 7809 } 7810 7811 /** 7812 * @deprecated Native <dialog> handles focus trapping automatically. 7813 * Calling this function has no effect. Kept for backwards compatibility. 7814 */ 7815 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) {} 7816 7817 /** 7818 * @deprecated Native <dialog> with x-htmldialog handles ESC key and click-outside events. 7819 * These functions have no effect. Kept for backwards compatibility. 7820 */ 7821 window.hyva.modal.eventListeners = { 7822 keydown: event => {}, 7823 click: event => {} 7824 }; 7825 })(); 7826 7827 window.addEventListener('alpine:init', () => { 7828 Alpine.data('hyvaModal', window.hyva.modal); 7829 }, {once: true}); 7830</script>
7830 7831 7832<section x-data="initAmGdprLoader" 7833 @amgdpr-loading-start.window="showLoader" 7834 @amgdpr-loading-stop.window="hideLoader" 7835> 7836 7837<div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" 7838 style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgb(255 255 255/0.60);" 7839 x-show="isLoading" 7840 x-transition:enter="ease-out duration-200" 7841 x-transition:enter-start="opacity-0" 7842 x-transition:enter-end="opacity-100" 7843 x-transition:leave="ease-in duration-200" 7844 x-transition:leave-start="opacity-100" 7845 x-transition:leave-end="opacity-0"> 7846 <svg xmlns="http://www.w3.org/2000/svg" width="57" height="57" viewBox="0 0 38 38" stroke="#ffb590" class="text-primary" role="img"> 7847 <g fill="none" fill-rule="evenodd"> 7848 <g transform="translate(1 1)" stroke-width="2"> 7849 <circle stroke="#ff6801" cx="18" cy="18" r="18"/> 7850 <path d="M36 18c0-9.94-8.06-18-18-18"> 7851 <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite"/> 7852 </path> 7853 </g> 7854 </g> 7855<title>loader</title></svg> 7856</div> 7857</section> 7858
7859<script data-cfasync="false"> 7860 'use strict'; 7861 7862 function initAmGdprLoader() { 7863 return { 7864 isLoading: false, 7865 7866 /** 7867 * @returns {void} 7868 */ 7869 showLoader: function () { 7870 this.isLoading = true; 7871 }, 7872 7873 /** 7874 * @returns {void} 7875 */ 7876 hideLoader: function () { 7877 this.isLoading = false; 7878 } 7879 } 7880 } 7881 7882 window.addEventListener( 7883 'alpine:init', 7884 () => Alpine.data('initAmGdprLoader', initAmGdprLoader), 7885 { once: true } 7886 ); 7887</script>
7887 7888 7889
7890<script data-cfasync="false"> 7891 'use strict'; 7892 7893 /** 7894 * @typedef {Object} CookieGroupData 7895 * @prop {Boolean} checked 7896 * @prop {[{description: string, lifetime: number|null, name: string, provider: string, type: string}]} cookies 7897 * @prop {String} description 7898 * @prop {string|null} groupId 7899 * @prop {Boolean} isEssential 7900 * @prop {String} name 7901 */ 7902 7903 function initAmastyCookieGroupsStorage() { 7904 return { 7905 /** 7906 * @type {[CookieGroupData]} 7907 */ 7908 groupData: [], 7909 cookiePolicy: undefined, 7910 lastUpdate: undefined, 7911 7912 /** 7913 * @returns {string|number[]} 7914 */ 7915 getEssentialGroupIds: function () { 7916 return this.groupData.reduce(function (essentialGroupIds, group) { 7917 if (group.isEssential) { 7918 essentialGroupIds.push(group.groupId) 7919 } 7920 7921 return essentialGroupIds; 7922 }, []); 7923 }, 7924 7925 /** 7926 * @returns {string|number[]} 7927 */ 7928 getCheckedGroupIds: function () { 7929 return this.groupData.reduce(function (checkedGroupIds, group) { 7930 if (group.checked) { 7931 checkedGroupIds.push(group.groupId); 7932 } 7933 7934 return checkedGroupIds; 7935 }, []); 7936 }, 7937 7938 /** 7939 * @param {string} cookieName 7940 * @returns {boolean} 7941 */ 7942 isCookieEssential: function (cookieName) { 7943 const allEssentialCookies = this.getEssentialCookies(); 7944 7945 return !!allEssentialCookies.find(cookie => cookie.name === cookieName); 7946 }, 7947 7948 /** 7949 * @returns {array} 7950 */ 7951 getEssentialCookies: function () { 7952 return this.groupData 7953 .filter(group => group.isEssential) 7954 .map(group => group.cookies) 7955 .flat(); 7956 }, 7957 7958 /** 7959 * @returns {boolean} 7960 */ 7961 hasGroupData: function () { 7962 return !!this.groupData.length; 7963 }, 7964 7965 /** 7966 * @param {string} cookieName 7967 * @param {string} pattern 7968 * @returns {boolean} 7969 */ 7970 isEssentialByPattern: function (cookieName, pattern) { 7971 const essentialCookiePatterns = this.getEssentialCookiesPattern(pattern); 7972 7973 return essentialCookiePatterns.some((pattern) => !!cookieName.match(this.getCookiePattern(pattern))); 7974 }, 7975 7976 /** 7977 * @param {string} pattern 7978 * @return {Array} 7979 */ 7980 getEssentialCookiesPattern: function (pattern) { 7981 return this.getCookiesByPattern(pattern, this.getEssentialCookies()); 7982 }, 7983 7984 /** 7985 * @param {string} pattern 7986 * @param {Array|undefined} cookies 7987 * @return {Array} 7988 */ 7989 getCookiesByPattern: function (pattern, cookies) { 7990 if (typeof cookie === 'undefined') { 7991 cookies = this.getAllCookies(); 7992 } 7993 7994 return cookies
7995 .map((cookie) => typeof cookie === 'object' ? cookie.name : cookie.split('=')[0].trim()) 7996 .filter((cookie) => cookie.match(pattern) !== null); 7997 }, 7998 7999 /** 8000 * @returns {array} 8001 */ 8002 getDisallowedCookies: function () { 8003 const disallowedCookie = decodeURIComponent(hyva.getCookie('amcookie_disallowed') ?? ''); 8004 if (!disallowedCookie) { 8005 return []; 8006 } 8007 8008 return disallowedCookie.split(','); 8009 }, 8010 8011 /** 8012 * @returns {string} 8013 */ 8014 getCookiePattern: function (pattern) { 8015 return `^${pattern.replaceAll('*', '.*')}$`; 8016 }, 8017 8018 /** 8019 * @returns {array} 8020 */ 8021 getAllCookies: function () { 8022 return document.cookie.split(';'); 8023 }, 8024 8025 /** 8026 * @param {boolean} setAcceptance 8027 * @returns {Promise} 8028 */ 8029 updateGroupData: function (setAcceptance = false) { 8030 const cookieFetchUrl = `${BASE_URL}amcookie/cookie/cookies`; 8031 return fetch(cookieFetchUrl, { 8032 method: "POST", 8033 headers: { 8034 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 8035 'X-Requested-With': 'XMLHttpRequest' 8036 }, 8037 body: new URLSearchParams({ 8038 allowed: hyva.getCookie('amcookie_allowed'), 8039 restriction: hyva.getCookie('amcookie_policy_restriction') 8040 }) 8041 }).then(response => { 8042 if (response.ok) { 8043 return response.json(); 8044 } 8045 8046 return Promise.reject(`${response.status} ${response.statusText}`); 8047 }).then(data => { 8048 this.cookiePolicy = data.cookiePolicy ?? 'allowed'; 8049 this.lastUpdate = data.lastUpdate ?? 0; 8050 this.groupData = [...data.groupData]; 8051 8052 hyva.setCookie('amcookie_policy_restriction', this.cookiePolicy, 10); 8053 if (setAcceptance) { 8054 amastyCookieManager.setLastCookieAcceptance(this.lastUpdate); 8055 } 8056 8057 return data; 8058 }).catch(error => { 8059 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8060 { 8061 type: "error", 8062 text: error 8063 } 8064 ]); 8065 }).finally(() => window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated'))); 8066 } 8067 } 8068 } 8069 8070 window.addEventListener( 8071 'alpine:init', 8072 () => Alpine.store('AmastyCookieGroups', initAmastyCookieGroupsStorage()), 8073 { once: true } 8074 ); 8075</script>
8075 8076
8077<script data-cfasync="false"> 8078 (function (amastyCookieManager) { 8079 'use strict'; 8080 8081 amastyCookieManager.pattern = '{(?<cookiePattern>.*)}'; 8082 8083 amastyCookieManager.getAmastyCookieGroupStorage = function () { 8084 return Alpine.store('AmastyCookieGroups') ?? {}; 8085 }; 8086 8087 amastyCookieManager.deleteDisallowedCookie = function () { 8088 const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); 8089 const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; 8090 8091 disallowedCookies.forEach((name) => { 8092 const pattern = name.match(this.pattern); 8093 if (!!pattern && !!amastyCookieGroupStorage) { 8094 const cookiePattern = amastyCookieGroupStorage.getCookiePattern(pattern.groups.cookiePattern) ?? ''; 8095 8096 amastyCookieGroupStorage.getCookiesByPattern(cookiePattern).forEach((cookieName) => { 8097 this.deleteNotEssentialCookie(cookieName); 8098 }); 8099 } else { 8100 this.deleteNotEssentialCookie(name); 8101 } 8102 }); 8103 }; 8104 8105 amastyCookieManager.isCookieAllowed = function (cookieName) { 8106 const allowedGroups = hyva.getCookie('amcookie_allowed'); 8107 const disallowedCookie = this.getAmastyCookieGroupStorage()?.getDisallowedCookies() ?? []; 8108 const isCookiePolicyAllowed = hyva.getCookie('amcookie_policy_restriction') === 'allowed'; 8109 const isCookieEssential = this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName); 8110 const isCookieEssentialByPattern = this.getAmastyCookieGroupStorage()?.isEssentialByPattern(cookieName, this.pattern); 8111 8112 if (!isCookiePolicyAllowed || isCookieEssential || isCookieEssentialByPattern) { 8113 return true; 8114 } 8115 8116 return !((!allowedGroups && !disallowedCookie) || this.isCookieDisallowed(cookieName)); 8117 }; 8118 8119 amastyCookieManager.isCookieDisallowed = function (cookieName) { 8120 const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); 8121 const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; 8122 8123 return disallowedCookies.some((cookie) => { 8124 const pattern = cookie.match(this.pattern); 8125 8126 return !!pattern && !!cookieName.match(amastyCookieGroupStorage?.getCookiePattern(pattern.groups.cookiePattern)); 8127 }) || disallowedCookies.indexOf(cookieName) !== -1; 8128 }; 8129 8130 amastyCookieManager.processManageableCookies = function () { 8131 let cookieScripts = document.querySelectorAll('script[data-amcookie-groupid][type="text/plain"]'); 8132 8133 cookieScripts.forEach((elem) => { 8134 if (this.isChecked(elem.dataset['amcookie-groupid'])) { 8135 let elClone = elem.cloneNode(true).setAttribute('type', 'text/javascript'); 8136 8137 elem.remove(); 8138 document.body.appendChild(elClone); 8139 } 8140 }); 8141 }; 8142 8143 amastyCookieManager.deleteNotEssentialCookie = function (cookieName) { 8144 if (!this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName)) { 8145 hyva.setCookie(cookieName, '', -1, true); 8146 } 8147 }; 8148 8149 amastyCookieManager.setLastCookieAcceptance = function (lastUpdate) { 8150 localStorage.setItem('am-last-cookie-acceptance', lastUpdate); 8151 }; 8152 8153 window.addEventListener('amasty-cookie-group-updated', () => { 8154 amastyCookieManager.deleteDisallowedCookie(); 8155 }); 8156 8157 window.addEventListener('private-content-loaded', () => { 8158 amastyCookieManager.getAmastyCookieGroupStorage()?.hasGroupData() && amastyCookieManager.deleteDisallowedCookie(); 8159 }); 8160 }(window.amastyCookieManager = window.amastyCookieManager || {})); 8161</script>
8161 8162
8163<script data-cfasync="false"> 8164 (function () { 8165 'use strict'; 8166 8167 window.addEventListener('cookiebar-action-accept', (event) => { 8168 const groups = event.detail?.include_checked_groups ? Alpine.store('AmastyCookieGroups').getCheckedGroupIds() : []; 8169 const url = `${BASE_URL}amcookie/cookie/savegroups`; 8170 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 8171 const body = new URLSearchParams({ 8172 form_key: hyva.getFormKey() 8173 }); 8174 groups.length && groups.map(groupId => body.append('groups[]', groupId)); 8175 8176 fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) 8177 .then(response => { 8178 if (response.ok) { 8179 return response.json(); 8180 } 8181 8182 return Promise.reject(`${response.status} ${response.statusText}`); 8183 }) 8184 .then(data => { 8185 !!data.success && Alpine.store('AmastyCookieGroups').updateGroupData(true); 8186 }) 8187 .catch(error => { 8188 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8189 { 8190 type: "error", 8191 text: error 8192 } 8193 ]); 8194 }) 8195 .finally(() => { 8196 amastyCookieManager.processManageableCookies(); 8197 window.dispatchEvent(new CustomEvent('cookiebar-action-accept-finish')); 8198 window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated')); 8199 // Wait cookiebar close animation 8200 setTimeout(() => { 8201 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8202 }, 100); 8203 }); 8204 }); 8205 })(); 8206</script>
8206 8207
8208<script data-cfasync="false"> 8209 (function () { 8210 'use strict'; 8211 8212 window.addEventListener('cookiebar-action-allow', () => { 8213 const url = `${BASE_URL}amcookie/cookie/allow`; 8214 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 8215 const body = new URLSearchParams({ 8216 form_key: hyva.getFormKey() 8217 }); 8218 fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) 8219 .then(response => { 8220 if (response.ok) { 8221 return response; 8222 } 8223 8224 return Promise.reject(`${response.status} ${response.statusText}`); 8225 }) 8226 .then(() => { 8227 Alpine.store('AmastyCookieGroups').updateGroupData(true); 8228 }) 8229 .catch(error => { 8230 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8231 { 8232 type: "error", 8233 text: error 8234 } 8235 ]); 8236 }) 8237 .finally(() => { 8238 amastyCookieManager.processManageableCookies(); 8239 window.dispatchEvent(new CustomEvent('cookiebar-action-allow-finish')); 8240 // Wait cookiebar close animation 8241 setTimeout(() => { 8242 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8243 }, 100); 8244 }); 8245 }); 8246 })(); 8247</script>
8247 8248 8249<style> 8250 :root { 8251 /* Bar Color Settings */ 8252 --ambar-background: #fff; 8253 --ambar-links-color: #326ed1; 8254 --ambar-policy-text: #374151; 8255 --ambar-toggle-active-color: #2563eb; 8256 --ambar-toggle-inactive-color: #fff; 8257 8258 /* Buttons Color Settings */ 8259 --ambar-button-accept-color: #337ab7; 8260 --ambar-button-accept-hover-color: #337ab7; 8261 --ambar-button-accept-text: #fff; 8262 --ambar-button-accept-hover-text: #fff; 8263 8264 --ambar-button-allow-color: #337ab7; 8265 --ambar-button-allow-hover-color: #337ab7; 8266 --ambar-button-allow-text: #fff; 8267 --ambar-button-allow-hover-text: #fff; 8268 8269 --ambar-button-decline-color: #337ab7; 8270 --ambar-button-decline-hover-color: #337ab7; 8271 --ambar-button-decline-text: #fff; 8272 --ambar-button-decline-hover-text: #fff; 8273 8274 --ambar-button-settings-color: #337ab7; 8275 --ambar-button-settings-hover-color: #337ab7; 8276 --ambar-button-settings-text: #fff; 8277 --ambar-button-settings-hover-text: #fff; 8278 8279 /* Buttons Order Settings */ 8280 --ambar-button-accept-order: 0; 8281 --ambar-button-allow-order: 0; 8282 --ambar-button-settings-order: 0; 8283 --ambar-button-decline-order: 0; 8284 8285 /* Cookie Information Bar Color Settings */ 8286 --ambar-information-background: #fff; 8287 --ambar-information-title: #374151; 8288 --ambar-information-description: #374151; 8289 --ambar-information-table-header: #374151; 8290 --ambar-information-table-content: #374151; 8291 8292 /* Cookie Information Bar Done Button Settings */ 8293 --ambar-information-button-color: #1d4ed8; 8294 --ambar-information-button-hover-color: #1d4ed8; 8295 --ambar-information-button-text: #fff; 8296 --ambar-information-button-hover-text: #fff; 8297 8298 /* Settings Bar Done Button Settings */ 8299 --ambar-setting-button-color: #1d4ed8; 8300 --ambar-setting-button-hover-color: #1d4ed8; 8301 --ambar-setting-button-text: #fff; 8302 --ambar-setting-button-hover-text: #fff; 8303 } 8304</style> 8305
8306<script data-cfasync="false"> 8307 'use strict'; 8308 8309 function initAmCookieActionDispatcherBtn() { 8310 return { 8311 actiondispatchHandler: function (event) { 8312 const { dispatchAction, dispatchPayload } = event.currentTarget.dataset; 8313 this.$dispatch(dispatchAction, this.parsePayload(dispatchPayload)); 8314 }, 8315 parsePayload: function (payload) { 8316 try { 8317 return JSON.parse(payload); 8318 } catch (e) { 8319 return null; 8320 } 8321 } 8322 }; 8323 } 8324 8325 window.addEventListener( 8326 'alpine:init', 8327 () => Alpine.data('initAmCookieActionDispatcherBtn', initAmCookieActionDispatcherBtn), 8328 { once: true } 8329 ); 8330</script>
8330 8331
8332<script data-cfasync="false"> 8333 'use strict'; 8334 8335 function initAmCookieGroups() { 8336 return { 8337 /** 8338 * @withContext x-for: $store.AmastyCookieGroups.groupData 8339 * @returns {string} 8340 */ 8341 getInputGroupId: function () { 8342 return `amcookie-${this.$el.dataset.groupPrefix}group-${this.group.groupId}` 8343 }, 8344 8345 /** 8346 * @withContext x-for: $store.AmastyCookieGroups.groupData 8347 * @returns {{"!bg-gray-400": boolean}} 8348 */ 8349 getInputStyles: function () { 8350 return { 8351 '!bg-gray-400': this.group.isEssential 8352 } 8353 }, 8354 8355 /** 8356 * @withContext x-for: $store.AmastyCookieGroups.groupData 8357 * @returns {void} 8358 */ 8359 toggleGroup: function () { 8360 this.group.checked = !this.group.checked; 8361 }, 8362 8363 /** 8364 * @withContext x-for: $store.AmastyCookieGroups.groupData 8365 * @returns {void} 8366 */ 8367 moreInfoClickHandler: function () { 8368 this.$dispatch(this.$el.dataset.dispatchAction, this.group); 8369 }, 8370 8371 moreInformationAboutCookieGroup: function () { 8372 return hyva.str('About\u0020\u0022\u00251\u0022\u0020Cookie\u0020Group', this.group.name); 8373 } 8374 } 8375 } 8376 8377 window.addEventListener( 8378 'alpine:init', 8379 () => Alpine.data('initAmCookieGroups', initAmCookieGroups), 8380 {once: true} 8381 ); 8382</script>
8382 8383<style> 8384 .is-loading > :not(.loader) { 8385 visibility: hidden; 8386 } 8387</style> 8388
8389<script> 8390 function connectifGetURLParameters(form) { 8391 let url = form.querySelector('.connectif-url').getAttribute('href'); 8392 const parsedUrl = new URL(url); 8393 8394 const params = new URLSearchParams(parsedUrl.search); 8395 8396 const paramsObject = {}; 8397 params.forEach((value, key) => { 8398 paramsObject[key] = decodeURIComponent(value); 8399 }); 8400 8401 return paramsObject; 8402 } 8403 8404 var addToCartAjaxEvent = function (e) { 8405 let form = this; 8406 let delay = parseInt('1000', 10); 8407 8408 e.preventDefault(); 8409 8410 const data = new URLSearchParams(new FormData(form)), 8411 button = form.querySelector('button') ? 8412 form.querySelector('button') : 8413 document.getElementById('product-addtocart-button'), 8414 loader = document.createElement('div'), 8415 initialText = button.innerHTML; 8416 8417 loader.className = 'absolute inset-0 flex justify-center items-center loader'; 8418 loader.innerHTML = ` 8419 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" xml:space="preserve" width="32" height="32"> 8420 <path fill="#333" d="M73 50c0-12.7-10.3-23-23-23S27 37.3 27 50m3.9 0c0-10.5 8.5-19.1 19.1-19.1S69.1 39.5 69.1 50"> 8421 <animateTransform attributeName="transform" attributeType="XML" type="rotate" dur="1s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/> 8422 </path> 8423 </svg> 8424 `; 8425 8426 button.prepend(loader); 8427 button.classList.add('relative', 'is-loading', 'text-[0]'); 8428 button.disabled = true; 8429 8430 var product_id = data.get('product'); 8431 8432 fetch(e.currentTarget.action, { 8433 method: 'POST', 8434 body: data, 8435 headers: { 8436 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 8437 'X-Requested-With': 'XMLHttpRequest' 8438 } 8439 }) 8440 .then(res => { 8441 if (!res.ok) { 8442 return form.submit(); 8443 } 8444 8445 if (res.redirected) { 8446 return []; 8447 } 8448 8449 return res.json(); 8450 }) 8451 .then(data => { 8452 if (form.classList.contains('connectif-product')) { 8453 let jsonDecodedVAR = JSON.parse(connectifGetURLParameters(form)['cnWebLinkClicked']); 8454 jsonDecodedVAR.type = "web-link-clicked"; 8455 8456 window.connectif.managed.sendEvents([jsonDecodedVAR], []).finally(() => submitCallback()); 8457 } else { 8458 submitCallback(); 8459 } 8460 8461 function submitCallback() { 8462 if (data.backUrl && data.backUrl !== window.location.href) { 8463 form.submit(); 8464 } else { 8465 button.classList.add('bg-success-darker', 'hover:bg-success-darker'); 8466 loader.remove(); 8467 8468 let defaultChild = button.querySelector('.check'); 8469 if (!defaultChild) { 8470 button.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 17.45" class="w-6 h-6" width="24" height="24" role="img"> 8471 <path d="M7.75 17.46c-.68 0-1.34-.27-1.82-.76L.44 11.17a1.54 1.54 0 0 1 0-2.16c.58-.59 1.54-.6 2.13-.01l.01.01 5.17 5.2L21.42.44c.58-.59 1.54-.6 2.13-.01l.01.01c.59.6.59 1.56 0 2.16L9.57 16.7c-.48.49-1.13.76-1.82.76Z" style="fill:currentColor"/> 8472 <title>check</title></svg> 8473 `; 8474 } else { 8475 defaultChild.classList.add('hidden'); 8476 let addingChild = button.querySelector('.added'); 8477 if (addingChild) { 8478 addingChild.classList.remove('hidden'); 8479 } 8480 } 8481 8482 button.classList.remove('is-loading', 'text-[0]'); 8483 } 8484 8485 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8486 } 8487 }) 8488 .catch(err => { 8489 window.dispatchEvent(new CustomEvent('product-addtocart-error')); 8490 8491 setMessage({ 8492 text:'There was a problem adding your item to the cart.', 8493 type: 'error' 8494 }); 8495 }) 8496 .finally(() => { 8497 try { 8498 var messages = hyva.getCookie('mage-messages'); 8499 messages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 8500 document.cookie = 'mage-messages=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'; 8501 8502 } catch (error) { 8503 console.warn('Error parsing Cookie Messages:', error); 8504 return; 8505 } 8506 8507 setTimeout(() => { 8508 button.disabled = false;
8509 button.classList.remove('bg-success-darker', 'hover:bg-success-darker'); 8510 button.classList.remove('text-[0]'); 8511 8512 let defaultChild = button.querySelector('.default'); 8513 if (!defaultChild) { 8514 button.innerHTML = button.getAttribute("aria-label"); 8515 } else { 8516 defaultChild.classList.remove('hidden'); 8517 let addingChild = button.querySelector('.added'); 8518 if (addingChild) { 8519 addingChild.classList.add('hidden'); 8520 } 8521 } 8522 8523 button.innerHTML = initialText; 8524 8525 window.dispatchEvent(new CustomEvent('product-addtocart-success', { 8526 detail: { 8527 product_id: product_id, 8528 form_data: Object.fromEntries(new FormData(form)) 8529 } 8530 })); 8531 8532 messages.forEach(message => { 8533 setMessage(message); 8534 }); 8535 }, delay); 8536 }); 8537 }; 8538 8539 window.setAjaxCart = (selectors = '.product_addtocart_form:not(.no-ajax), #product_addtocart_form:not(.no-ajax)') => { 8540 const addToCartForms = document.querySelectorAll(selectors); 8541 8542 addToCartForms.forEach(form => { 8543 form.removeEventListener('submit', addToCartAjaxEvent); 8544 form.addEventListener('submit', addToCartAjaxEvent); 8545 }); 8546 } 8547 8548 /** 8549 * Set Message 8550 */ 8551 function setMessage(message) { 8552 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 8553 [message], 5000 8554 ); 8555 } 8556 8557 /** Init on pageload */ 8558 window.setAjaxCart(); 8559</script>
8559 8560
8560<script> 8561 function initAlgoliaInsights(partial) { 8562 window.algoliaAnalytics = AlgoliaAnalytics.default; 8563 window.hasAddedParameters = false; 8564 window.useCookie = algoliaConfig.cookieConfiguration.cookieRestrictionModeEnabled ? !!hyva.getCookie(algoliaConfig.cookieConfiguration.consentCookieName) : true; 8565 8566 if (!canTrack()) { 8567 return; 8568 } 8569 8570 initializeAnalytics(partial); 8571 addSearchParameters(); 8572 bindEvents(); 8573 8574 // Although events can accept both auth and anon tokens, queries can only accept a single token 8575 function determineUserToken() { 8576 return window.algoliaAnalytics.getAuthenticatedUserToken() ?? algoliaAnalytics.getUserToken(); 8577 } 8578 8579 function initializeAnalytics(partial = false) { 8580 if (partial) { 8581 algoliaAnalytics.init({ 8582 appId: algoliaConfig.applicationId, 8583 apiKey: algoliaConfig.apiKey, 8584 partial: true, 8585 useCookie: true, 8586 cookieDuration: Number(algoliaConfig.cookieConfiguration.cookieDuration) 8587 }); 8588 } else { 8589 algoliaAnalytics.init({ 8590 appId: algoliaConfig.applicationId, 8591 apiKey: algoliaConfig.apiKey, 8592 useCookie: true, 8593 cookieDuration: Number(algoliaConfig.cookieConfiguration.cookieDuration) 8594 }); 8595 } 8596 let userAgent = 'insights-js-in-magento (' + algoliaConfig.extensionVersion + ')'; 8597 window.algoliaAnalytics.addAlgoliaAgent(userAgent); 8598 8599 let unsetAuthenticationToken = hyva.getCookie('unset_authentication_token'); 8600 if (hyva.getCookie('aa-search') && hyva.getCookie('aa-search') !== '') { 8601 window.algoliaAnalytics.setUserToken(hyva.getCookie('aa-search')); 8602 } else if (hyva.getCookie('_ALGOLIA') && hyva.getCookie('_ALGOLIA') !== '') { 8603 window.algoliaAnalytics.setUserToken(hyva.getCookie('_ALGOLIA')); 8604 } else if (unsetAuthenticationToken && unsetAuthenticationToken !== '') { 8605 window.algoliaAnalytics.setUserToken('undefined'); 8606 hyva.setCookie('unset_authentication_token', '', -1); 8607 } 8608 } 8609 8610 function applyInsightsToSearchParams(params = {}) { 8611 if (algoliaConfig.ccAnalytics.enabled) { 8612 params.clickAnalytics = true; 8613 } 8614 8615 if (algoliaConfig.personalization.enabled) { 8616 params.enablePersonalization = true; 8617 params.userToken = determineUserToken(); 8618 } 8619 8620 return params; 8621 } 8622 8623 function addSearchParameters() { 8624 if (window.hasAddedParameters) { 8625 return; 8626 } 8627 algolia.registerHook('beforeWidgetInitialization', function (allWidgetConfiguration) { 8628 allWidgetConfiguration.configure = applyInsightsToSearchParams( 8629 allWidgetConfiguration.configure 8630 ); 8631 return allWidgetConfiguration; 8632 }); 8633 8634 algolia.registerHook('afterAutocompleteProductSourceOptions', (options) => { 8635 return applyInsightsToSearchParams(options); 8636 }); 8637 8638 window.hasAddedParameters = true; 8639 } 8640 8641 8642 function bindEvents() { 8643 bindClickedEvents(); 8644 bindViewedEvents(); 8645 8646 algolia.triggerHooks('afterInsightsBindEvents', this); 8647 } 8648 8649 function bindClickedEvents() { 8650 // Filter Clicked 8651 if (algoliaConfig.personalization.filterClicked.enabled) { 8652 const facets = algoliaConfig.facets; 8653 let containers = []; 8654 for (let i = 0; i < facets.length; i++) { 8655 let elem = createISWidgetContainer(facets[i].attribute); 8656 containers.push('.' + elem.className); 8657 } 8658 8659 algolia.registerHook('afterInstantsearchStart', function (search) { 8660 const selectors = document.querySelectorAll(containers.join(', '));
8661 selectors.forEach(function (e) { 8662 e.addEventListener('click', function (event) { 8663 const attribute = this.dataset.attr; 8664 const elem = event.target; 8665 if (elem.type === "checkbox" && elem.checked) { 8666 var filter = attribute + ':' + elem.value; 8667 trackFilterClick([filter]); 8668 } 8669 }); 8670 }); 8671 8672 return search; 8673 }); 8674 } 8675 } 8676 8677 function bindViewedEvents() { 8678 // viewed event is exclusive to personalization 8679 if (!algoliaConfig.personalization.enabled) { 8680 return; 8681 } 8682 8683 const viewConfig = algoliaConfig.personalization.viewedEvents.viewProduct; 8684 if (viewConfig.enabled) { 8685 if (document.body.classList.contains('catalog-product-view')) { 8686 const objectId = document.querySelector('#product_addtocart_form')?.querySelector('input[name="product"]').value; 8687 if (objectId) { 8688 const viewData = buildEventData(viewConfig.eventName, objectId, algoliaConfig.indexName + '_products'); 8689 trackView(viewData); 8690 } 8691 } 8692 8693 } 8694 } 8695 8696 function buildEventData(eventName, objectId, indexName, position = null, queryId = null) { 8697 const eventData = { 8698 eventName: eventName, 8699 objectIDs: [objectId + ''], 8700 index: indexName 8701 }; 8702 8703 if (position) { 8704 eventData.positions = [parseInt(position)]; 8705 } 8706 8707 if (queryId) { 8708 eventData.queryID = queryId; 8709 } 8710 8711 return eventData; 8712 } 8713 8714 function trackClick(eventData) { 8715 if (eventData.queryID) { 8716 window.algoliaAnalytics.clickedObjectIDsAfterSearch(eventData); 8717 } else { 8718 window.algoliaAnalytics.clickedObjectIDs(eventData); 8719 } 8720 } 8721 8722 function trackFilterClick(filters) { 8723 const eventData = { 8724 index: algoliaConfig.indexName + '_products', 8725 eventName: algoliaConfig.personalization.filterClicked.eventName, 8726 filters: filters 8727 }; 8728 8729 window.algoliaAnalytics.clickedFilters(eventData); 8730 } 8731 8732 function trackView(eventData) { 8733 window.algoliaAnalytics.viewedObjectIDs(eventData); 8734 } 8735 } 8736 8737 function canTrack() { 8738 return ((algoliaConfig.ccAnalytics.enabled 8739 || algoliaConfig.personalization.enabled) && window.useCookie); 8740 } 8741 8742 function buildInsightsEventData(eventName, objectId, indexName, position = null, queryId = null) { 8743 if (!canTrack()) { 8744 return; 8745 } 8746 8747 const eventData = { 8748 eventName: eventName, 8749 objectIDs: [objectId + ''], 8750 index: indexName 8751 }; 8752 if (position) { 8753 eventData.positions = [parseInt(position)]; 8754 } 8755 if (queryId) { 8756 eventData.queryID = queryId; 8757 } 8758 trackClick(eventData); 8759 } 8760 8761 function trackClick(eventData) { 8762 if (eventData.queryID) { 8763 window.algoliaAnalytics.clickedObjectIDsAfterSearch(eventData); 8764 } else { 8765 window.algoliaAnalytics.clickedObjectIDs(eventData); 8766 } 8767 } 8768</script>
8768 8769
8769<script> 8770 window.algoliaConfig = {"instant":{"enabled":true,"selector":".columns","isAddToCartEnabled":true,"addToCartParams":{"action":"https:\/\/www.farma.it\/checkout\/cart\/add\/","formKey":"NuWLCNhC6L8sVz4U","redirectUrlParam":"uenc"},"infiniteScrollEnabled":false,"urlTrackedParameters":["query","attribute:*","index","page"],"isSearchBoxEnabled":true,"isVisualMerchEnabled":false,"categorySeparator":" \/\/\/ ","categoryPageIdAttribute":"categoryPageId","isCategoryNavigationEnabled":false,"hidePagination":false},"autocomplete":{"enabled":true,"selector":".algolia-search-input","sections":[{"name":"manufacturer","label":"Marchi","hitsPerPage":""}],"nbOfProductsSuggestions":5,"nbOfCategoriesSuggestions":4,"nbOfQueriesSuggestions":10,"isDebugEnabled":false,"isNavigatorEnabled":true,"debounceMilliseconds":300,"minimumCharacters":3},"landingPage":{"query":"","configuration":"[]"},"recommend":{"enabledFBT":false,"enabledRelated":false,"enabledFBTInCart":false,"enabledRelatedInCart":false,"enabledLookingSimilar":0,"limitFBTProducts":12,"limitRelatedProducts":12,"limitTrendingItems":12,"limitLookingSimilar":12,"enabledTrendItems":0,"trendItemFacetName":null,"trendItemFacetValue":null,"isTrendItemsEnabledInPDP":0,"isTrendItemsEnabledInCartPage":0,"isAddToCartEnabledInFBT":false,"isAddToCartEnabledInRelatedProduct":false,"isAddToCartEnabledInTrendsItem":false,"isAddToCartEnabledInLookingSimilar":false,"FBTTitle":"Frequently bought together","relatedProductsTitle":"Potrebbe interessarti anche","trendingItemsTitle":"Trending items","addToCartParams":{"action":"https:\/\/www.farma.it\/checkout\/cart\/add\/","formKey":"NuWLCNhC6L8sVz4U","redirectUrlParam":"uenc"},"isLookingSimilarEnabledInPDP":0,"isLookingSimilarEnabledInCartPage":0,"lookingSimilarTitle":"Prodotti simili"},"extensionVersion":"3.15.3","applicationId":"ZMUZFC3VV1","indexName":"magento2_default","apiKey":"MmUxZWIyN2ZjODA3ODk3ZTEwOWRmOWNhODBjYThlMDQ4NDBhZThiZGM0ZTBkYjJjMjNjNzRmYjcwMWQwMzA5MnRhZ0ZpbHRlcnM9JnZhbGlkVW50aWw9MTc5MTY1Njc4MQ==","attributeFilter":[],"facets":[{"attribute":"manufacturer","type":"disjunctive","label":"Marchi","searchable":"1","create_rule":"2"},{"attribute":"price","type":"slider","label":"Prezzo","searchable":"1","create_rule":"2"},{"attribute":"categories","type":"disjunctive","label":"Categorie","searchable":"1","create_rule":"2"}],"areCategoriesInFacets":true,"hitsPerPage":20,"sortingIndices":[{"attribute":"price","sort":"asc","sortLabel":"Prezzo crescente","virtualReplica":"0","name":"magento2_default_products_price_default_asc","ranking":["asc(price.EUR.default)","typo","geo","words","filters","proximity","attribute","exact","custom"],"label":"Prezzo crescente"},{"attribute":"price","sort":"desc","sortLabel":"Prezzo decrescente","virtualReplica":"0","name":"magento2_default_products_price_default_desc","ranking":["desc(price.EUR.default)","typo","geo","words","filters","proximity","attribute","exact","custom"],"label":"Prezzo decrescente"},{"attribute":"created_at","sort":"desc","sortLabel":"Novit\u00e0","virtualReplica":"0","name":"magento2_default_products_created_at_desc","ranking":["desc(created_at)","typo","geo","words","filters","proximity","attribute","exact","custom"],"label":"Novit\u00e0"}],"isSearchPage":false,"isCategoryPage":false,"isLandingPage":false,"removeBranding":false,"productId":null,"priceKey":".EUR.default","priceGroup":null,"origFormatedVar":"price.EUR.default_original_formated","tierFormatedVar":"price.EUR.default_tier_formated","currencyCode":"EUR","currencySymbol":"\u20ac","priceFormat":{"pattern":"%s\u00a0\u20ac","precision":2,"requiredPrecision":2,"decimalSymbol":",","groupSymbol":".","groupLength":3,"integerRequired":false},"maxValuesPerFacet":10,"autofocus":true,"resultPageUrl":"https:\/\/www.farma.it\/catalogsearch\/result\/","request":{"query":"","refinementKey":"","refinementValue":"","categoryId":"","landingPageId":"","path":"","level":"","parentCategory":"","childCategories":[],"url":"https:\/\/www.farma.it\/customer\/account\/forgotpassword\/"},"showCatsNotIncludedInNavigation":false,"showSuggestionsOnNoResultsPage":true,"baseUrl":"https:\/\/www.farma.it","popularQueries":["bionike","magnesio","Euphidra","Svr","NUXE","fermenti lattici","Solari","filorga","dentifricio","neavita"],"useAdaptiveImage":false,"urls":{"logo":"https:\/\/www.farma.it\/static\/version1789421831\/frontend\/DNAFactory\/orlandi_hyva\/it_IT\/Algolia_AlgoliaSearch\/js\/images\/algolia-logo-blue.svg"},"cookieConfiguration":{"customerTokenCookie":"_ALGOLIA_MAGENTO_AUTH","consentCookieName":"user_allowed_save_cookie","cookieAllowButtonSelector":"#btn-cookie-allow","cookieRestrictionModeEnabled":false,"cookieDuration":"15552000000"},"ccAnalytics":{"enabled":true,"ISSelector":".ais-Hits-item a.result, .ais-InfiniteHits-item a.result","conversionAnalyticsMode":"all","addToCartSelector":".action.primary.tocart","orderedProductIds":[]},"isPersonalizationEnabled":true,"personalization":{"enabled":true,"viewedEvents":{"viewProduct":{"eventName":"Viewed Product","enabled":true,"method":"viewedObjectIDs"}},"clickedEvents":{"productClicked":{"eventName":"Product Clicked","enabled":true,"selector":".ais-Hits-item a.result, .ais-InfiniteHits-item a.result","method":"clickedObjectIDs"},"productRecommended":{"eventName":"Recommended Product Clicked","enabled":true,"selector":".products-upsell .product-item","method":"clickedObjectIDs"}},"filterClicked":{"eventName":"Filter Clicked","enabled":true,"method":"clickedFilters"}},"analytics":{"enabled":false,"delay":"3000","triggerOnUiInteraction":"1","pushInitialSearch":"0"},"now":1791504000,"queue":{"isEnabled":true,"nbOfJobsToRun":30,"retryLimit":3,"nbOfElementsPerIndexingJob":300},"isPreventBackendRenderingEnabled":false,"translations":{"to":"a","or":"o","go":"Go","popularQueries":"Puoi provare le seguenti ricerche popolari","seeAll":"Vedi tutti i prodotti","allDepartments":"All departments","seeIn":"See products in","orIn":"or in","noProducts":"Non abbiamo trovato nessun prodotto per questa ricerca","noResults":"Nessun risultato","refine":"Refine","selectedFilters":"Selected Filters","clearAll":"Clear all","previousPage":"Pagina precedente","nextPage":"Pagina successiva","searchFor":"Search for products","relevance":"Rilevanza","categories":"Categorie","products":"Prodotti","suggestions":"Suggestions","searchBy":"Search by","searchForFacetValuesPlaceholder":"Cerca","showMore":"Show more products","searchTitle":"Search results for","placeholder":"Search for products, categories, ...","addToCart":"Aggiungi al Carrello"}}; 8771 8772 let autocompleteInitialized = false;
8773 let commonInitialized = false; 8774 let insightsInitialized = false; 8775 8776 async function initAutocomplete() { 8777 if (autocompleteInitialized) { 8778 return 8779 } 8780 8781 autocompleteInitialized = true; 8782 Promise.all([ 8783 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/common.js"), 8784 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/base64.js"), 8785 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-instantsearch.min.js"), 8786 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/search-insights.min.js"), 8787 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-search.min.js"), 8788 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-autocomplete.min.js"), 8789 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/query-suggestions-plugin.min.js"), 8790 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/autocomplete.js"), 8791 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/additional-section.js"), 8792 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/categories.js"), 8793 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/pages.js"), 8794 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/products.js"), 8795 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/suggestions.js"), 8796 ] 8797 ).then(data => { 8798 initCommon(); 8799 initAlgoliaInsights(); 8800 initAlgoliaAutocomplete(); 8801 }); 8802 } 8803 8804 function initInstantSearch() { 8805 Promise.all([ 8806 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/common.js"), 8807 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/base64.js"), 8808 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-instantsearch.min.js"), 8809 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/search-insights.min.js"), 8810 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/hogan.min.js"), 8811 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/mustache.min.js"), 8812 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/template-engine.js"), 8813 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/instantsearch.js"), 8814 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-search.min.js"), 8815 ] 8816 ).then(data => { 8817 initCommon(); 8818 initAlgoliaInsights(); 8819 initAlgoliaInstantSearch(); 8820 }); 8821 } 8822 8823 function initRecommended(objectIds) { 8824 Promise.all([ 8825 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/common.js"),
8826 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/base64.js"), 8827 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-instantsearch.min.js"), 8828 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/search-insights.min.js"), 8829 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/recommend.min.js"), 8830 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/recommend-js.min.js"), 8831 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/recommend.js"), 8832 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/recommend/products.js"), 8833 ] 8834 ).then(data => { 8835 initCommon(); 8836 initBase64(); 8837 initAlgoliaInsights(); 8838 initAlgoliaRecommended('customer_account_forgotpassword', objectIds); 8839 }); 8840 } 8841 8842 function initCommon() { 8843 if (commonInitialized) { 8844 return 8845 } 8846 8847 commonInitialized = true 8848 initAlgoliaCommon(); 8849 initBase64(); 8850 window.dispatchEvent(new CustomEvent('algolia-loaded')); 8851 } 8852 8853 if (algoliaConfig.instant.enabled && (algoliaConfig.isCategoryPage || algoliaConfig.isSearchPage)) { 8854 initInstantSearch(); 8855 } 8856 8857 8858 8859 8860 let objectIds = [""]; 8861 8862 if (algoliaConfig.autocomplete.enabled) { 8863 document.getElementById('menu-search-icon').addEventListener('click', async () => { 8864 await initAutocomplete(); 8865 },{once: true}); 8866 } 8867 8868 window.addEventListener('init-algolia-trends', function () { 8869 initCommon(); 8870 initAlgoliaInsights(); 8871 window.dispatchEvent(new CustomEvent('init-algolia-trends-done')); 8872 }); 8873 8874 window.addEventListener('init-algolia-LS', function () { 8875 initCommon(); 8876 initAlgoliaInsights(); 8877 window.dispatchEvent(new CustomEvent('init-algolia-LS-done')); 8878 }); 8879 8880 window.addEventListener('user-allowed-save-cookie', function () { 8881 initAlgoliaInsights(true); 8882 }); 8883 </script>
8883 8884 8885<style> 8886 .algolia-ac-product-row .badge-container .badge { 8887 max-height: fit-content; 8888 margin: auto 0; 8889 } 8890 8891 @media (max-width: 768px) { 8892 .catalogsearch-result-index { 8893 #algolia-left-container { 8894 width: calc(100vw - 15px); 8895 left: -15px; 8896 padding-left: 15px; 8897 } 8898 8899 #algolia-left-container .filters { 8900 width: calc(50% - 15px); 8901 margin-top: 30px; 8902 } 8903 8904 #algolia-toolbar { 8905 top: -76px; 8906 width: calc(50% - 15px); 8907 } 8908 8909 #algolia-toolbar .flex.right { 8910 flex-direction: column; 8911 align-items: flex-end; 8912 width: 100%; 8913 font-weight: bold; 8914 } 8915 8916 #algolia-toolbar .flex.left { 8917 position: absolute; 8918 width: calc(93vw - var(--scrollbar-width)); 8919 top: -5px; 8920 left: calc((0% - 100vw + var(--scrollbar-width)) / 2); 8921 right: auto; 8922 } 8923 8924 #algolia-toolbar #algolia-sorts { 8925 width: 100%; 8926 } 8927 8928 #algolia-toolbar .ais-SortBy-select { 8929 background-color: white; 8930 font-weight: bold; 8931 padding-top: 0.375rem; 8932 padding-bottom: 0.375rem; 8933 padding-left: 0.75rem; 8934 padding-right: 1rem; 8935 width: 100%; 8936 border: 2px solid #6328e0; 8937 } 8938 8939 .ais-Stats-text > div { 8940 font-size: 16px; 8941 display: block; 8942 } 8943 } 8944 } 8945 8946 input[type="search"]::-webkit-search-decoration, 8947 input[type="search"]::-webkit-search-cancel-button, 8948 input[type="search"]::-webkit-search-results-button, 8949 input[type="search"]::-webkit-search-results-decoration { 8950 -webkit-appearance:none!important; 8951 } 8952 8953 .ais-Hits-banner-image { 8954 margin: auto!important; 8955 margin-bottom: 20px!important; 8956 } 8957</style>
8958<script> 8959 function initWishlist() { 8960 return { 8961 addToWishlist(productId) { 8962 const formKey = hyva.getFormKey(); 8963 const postUrl = BASE_URL + 'wishlist/index/add/'; 8964 8965 const params = new URLSearchParams({ 8966 form_key: formKey, 8967 product: productId, 8968 uenc: hyva.getUenc() 8969 }); 8970 8971 const form = document.getElementById(`product_addtocart_form_${productId}`); 8972 if (form) { 8973 new FormData(form).forEach((value, key) => params.set(key, value)); 8974 } 8975 8976 fetch(postUrl, { 8977 "headers": { 8978 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 8979 }, 8980 "body": params.toString(), 8981 "method": "POST", 8982 "mode": "cors", 8983 "credentials": "include" 8984 }).then(function (response) { 8985 if (response.redirected) { 8986 window.location.href = response.url; 8987 } else if (response.ok) { 8988 return response.json(); 8989 } else { 8990 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 8991 [{ 8992 type: "warning", 8993 text: "Could\u0020not\u0020add\u0020item\u0020to\u0020wishlist." 8994 }], 5000 8995 ); 8996 } 8997 }).then(function (response) { 8998 if (!response) { return } 8999 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 9000 [{ 9001 type: (response.success) ? "success" : "error", 9002 text: (response.success) 9003 ? "Prodotto\u0020\u00E8\u0020stato\u0020aggiunto\u0020nella\u0020tua\u0020lista\u0020desideri." 9004 : response.error_message 9005 }], 5000 9006 ); 9007 const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data"); 9008 window.dispatchEvent(reloadCustomerDataEvent); 9009 }).catch(function (error) { 9010 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 9011 [{ 9012 type: "error", 9013 text: error 9014 }], 5000 9015 ); 9016 }); 9017 } 9018 } 9019 } 9020</script>
vendor: 1 bytes, line 9020
9020
9021<script> 9022 window.addEventListener('algolia-loaded', () => { 9023 algolia.registerHook('afterAutocompleteStart', () => { 9024 document.querySelector('#algoliaAutocomplete input')?.focus(); 9025 }); 9026 },{ once: true}) 9027</script>
9027 9028
9028<script> 9029 window.addEventListener('algolia-loaded', () => { 9030 algolia.registerHook('beforeWidgetInitialization', (allWidgetConfiguration) => { 9031 const {currentRefinements} = allWidgetConfiguration; 9032 const originalTransformItems = currentRefinements.transformItems.bind(currentRefinements); 9033 currentRefinements.transformItems = (items) => { 9034 if (items.length !== 0) { 9035 document.getElementById('instant-search-active-filters').classList.remove('hidden'); 9036 document.getElementById('instant-search-active-filters-label').classList.remove('hidden'); 9037 } else { 9038 document.getElementById('instant-search-active-filters').classList.add('hidden'); 9039 document.getElementById('instant-search-active-filters-label').classList.add('hidden'); 9040 } 9041 return originalTransformItems(items); 9042 } 9043 return allWidgetConfiguration; 9044 }); 9045 },{ once: true}) 9046 </script>
9046 9047<div x-cloak x-data="{...initAmBanners()}" x-init="initBanners()"> 9048 9049<div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" 9050 style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgb(255 255 255/0.60);" 9051 x-show="isLoading" 9052 x-transition:enter="ease-out duration-200" 9053 x-transition:enter-start="opacity-0" 9054 x-transition:enter-end="opacity-100" 9055 x-transition:leave="ease-in duration-200" 9056 x-transition:leave-start="opacity-100" 9057 x-transition:leave-end="opacity-0"> 9058 <svg xmlns="http://www.w3.org/2000/svg" width="57" height="57" viewBox="0 0 38 38" stroke="#ffb590" class="text-primary" role="img"> 9059 <g fill="none" fill-rule="evenodd"> 9060 <g transform="translate(1 1)" stroke-width="2"> 9061 <circle stroke="#ff6801" cx="18" cy="18" r="18"/> 9062 <path d="M36 18c0-9.94-8.06-18-18-18"> 9063 <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite"/> 9064 </path> 9065 </g> 9066 </g> 9067<title>loader</title></svg> 9068</div> 9069</div>
9070<script> 9071 'use strict'; 9072 9073 function initAmBanners() { 9074 return { 9075 options: { 9076 sections: [], 9077 content: [], 9078 banners: [], 9079 injectorSectionId: null, 9080 injectorParams: {} 9081 }, 9082 isLoading: true, 9083 injectorResolver: {}, 9084 9085 initBanners: function () { 9086 this.options = {"sections":{"50":[37,103,127,50,128,117,90,67,54,6,41,40,21,13,7],"7":[62,61],"0":[58],"4":[10,9,8]},"content":{"37":"\n<div data-banner-id=\"37\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"https:\/\/wa.me\/447418640409\" aria-label=\"Promozione\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Whatsapp_BPP.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","103":"\n<div data-banner-id=\"103\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/resi-e-rimborsi2\" aria-label=\"Promozione\" title=\"Farmait 30092026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/reso_BPP.jpg\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","127":"\n<div data-banner-id=\"127\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-farmait\" aria-label=\"Promozione\" title=\"Farmait 01102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Solari_BPP_10_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","50":"\n<div data-banner-id=\"50\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-rilastil\" aria-label=\"Promozione\" title=\"Rilastil 05102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Rilastil_MUp_BPP_10_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","128":"\n<div data-banner-id=\"128\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-thermacare\" aria-label=\"Promozione\" title=\"Angelini 07102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/ThermaCare_BPP_04_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","117":"\n<div data-banner-id=\"117\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-menarini\" aria-label=\"Promozione\" title=\"Menarini 29092026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Menarini_BTW_BPP_09_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","90":"\n<div data-banner-id=\"90\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-prodeco4\" aria-label=\"Promozione\" title=\"Prodeco 07102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/InMood_BPP_09_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","67":"\n<div data-banner-id=\"67\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-haleon2\" aria-label=\"Promozione\" title=\"Haleon 02102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/BeTotal_BPP_10_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","62":"\n<div data-banner-id=\"62\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"https:\/\/www.salute.gov.it\/LogoCommercioElettronicoVET\/CercaSitoEComm?useMode=getDettaglio&VOLID=C016715&area=veterinari&id=5907&lingua=italiano&menu=vendite\" style=\"\r\n background-color: #efeff0;\r\n display: inline-block;\r\n border-radius: 1.2rem;\r\n padding: 8px;\r\n margin-top: 10px;\r\n\" target=\"_blank\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/VET-c21198a7.jpg\" class=\"rounded-lg\" alt=\"Garanzia Veterinari\" width=\"110\" \/>\r\n<\/a><\/div> <\/div>\n","61":"\n<div data-banner-id=\"61\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"https:\/\/www.salute.gov.it\/LogoCommercioElettronico\/CercaSitoEComm?useMode=getDettaglio&VOLID=C016715\" style=\"\r\n background-color: #efeff0;\r\n display: inline-block;\r\n border-radius: 1.2rem;\r\n padding: 8px;\r\n margin-top: 10px;\r\n\" target=\"_blank\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/farmacia-ab57f402.jpg\" class=\"rounded-lg\" alt=\"Garanzia Farmaci\" width=\"110\"\/>\r\n<\/a><\/div> <\/div>\n","58":"\n<div data-banner-id=\"58\">\n <style>#html-body [data-pb-style=YEJYU1X]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}#html-body [data-pb-style=G07EOKR]{margin-top:20px;border-style:none}#html-body [data-pb-style=FBDF4WI],#html-body [data-pb-style=XTES42W]{border-radius:5px;max-width:100%;height:auto}@media only screen and (max-width: 767px) { #html-body [data-pb-style=G07EOKR]{border-style:none} }<\/style><div data-content-type=\"row\" data-appearance=\"contained\" data-element=\"main\"><div data-enable-parallax=\"0\" data-parallax-speed=\"0.5\" data-background-images=\"{}\" data-background-type=\"image\" data-video-loop=\"true\" data-video-play-only-visible=\"true\" data-video-lazy-load=\"true\" data-video-fallback-src=\"\" data-element=\"inner\" data-pb-style=\"YEJYU1X\"><figure data-content-type=\"image\" data-appearance=\"full-width\" data-intersect=\"false\" data-element=\"main\" data-pb-style=\"G07EOKR\"><a href=\"#product-add-promo-284906\" target=\"\" data-link-type=\"default\" title=\"IMO 05102026 BannerCarrello\" data-element=\"link\"><img width=\"761\" height=\"80\" class=\"pagebuilder-mobile-hidden\" src=\"https:\/\/www.farma.it\/media\/wysiwyg\/VC15_Active_CartBD_10_26_1.png\" alt=\"IMO 05102026 BannerCarrello\" title=\"IMO 05102026 BannerCarrello\" loading=\"lazy\" data-element=\"desktop_image\" data-pb-style=\"XTES42W\"><img width=\"288\" height=\"164\" class=\"pagebuilder-mobile-only\" src=\"https:\/\/www.farma.it\/media\/wysiwyg\/VC15_Active_CartBM_10_26.png\" alt=\"IMO 05102026 BannerCarrello\" title=\"IMO 05102026 BannerCarrello\" loading=\"lazy\" data-element=\"mobile_image\" data-pb-style=\"FBDF4WI\"><\/a><\/figure><div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><form id=\"product-add-promo-284906\" method=\"post\" action=\"\/checkout\/cart\/add\/\">\r\n <input name=\"form_key\" type=\"hidden\" x-bind:value=\"hyva.getFormKey()\">\r\n <input name=\"uenc\" type=\"hidden\" x-bind:value=\"hyva.getUenc()\">\r\n <input name=\"product\" type=\"hidden\" value=\"284906\">\r\n<\/form>\r\n\r\n
9086<script>\r\n window.addEventListener('init-external-scripts',function () {\r\n document.querySelector('a[href*=\"#product-add-promo-284906\"]').addEventListener(\"click\", function(e) {\r\n e.preventDefault();\r\n document.getElementById(\"product-add-promo-284906\").submit();\r\n });\r\n });\r\n<\/script>\r\n<\/div><\/div><\/div> <\/div>\n","54":"\n<div data-banner-id=\"54\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-prodeco2\" aria-label=\"Promozione\" title=\"Prodeco 30092026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Relief_BPP_09_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","6":"\n<div data-banner-id=\"6\">\n <\/div>\n","41":"\n<div data-banner-id=\"41\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-boiron\" aria-label=\"Promozione\" title=\"Boiron 01102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Euphralia_BPP_10_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","40":"\n<div data-banner-id=\"40\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-kenvue3\" aria-label=\"Promozione\" title=\"Kenvue 05102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Neutrogena_BPP_10_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","21":"\n<div data-banner-id=\"21\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/promo-esi\" aria-label=\"Promozione\" title=\"Esi 05102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/ESI_BPP_10_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","13":"\n<div data-banner-id=\"13\">\n <div data-content-type=\"html\" data-appearance=\"default\" data-intersect=\"false\" data-element=\"main\" data-decoded=\"true\"><a href=\"\/prodotti-elanco\" aria-label=\"Promozione\" title=\"Elanco 08102026 BannerProductPage\">\r\n<img src=\"https:\/\/www.farma.it\/media\/wysiwyg\/banner_product_page\/Elanco_BPP_10_26.png\" alt=\"\" width=\"333\" height=\"189\" class=\"rounded-md mb-5\" \/>\r\n<\/a><\/div> <\/div>\n","10":"\n<div data-banner-id=\"10\">\n <\/div>\n","9":"\n<div data-banner-id=\"9\">\n <\/div>\n","8":"\n<div data-banner-id=\"8\">\n <\/div>\n","7":"\n<div data-banner-id=\"7\">\n <\/div>\n"},"injectorParams":{"containerSelector":".products-grid > .relative > .grid:not(.amasty-banner-items)","itemSelector":".products-grid > .relative > .grid:not(.amasty-banner-items) .product-item","banners":[]},"banners":[],"injectorSectionId":14}; 9087 this.injectorResolver = amBannerInjectorResolver?.(); 9088 9089 this.insertBanners(); 9090 this.isLoading = false; 9091 }, 9092 9093 insertBanners: function () { 9094 document.querySelectorAll('[data-role="amasty-banner-container"]').forEach((container) => { 9095 const sectionId = container.getAttribute('data-position'); 9096 9097 if (sectionId) { 9098 this.loadBannerBySection(sectionId, container); 9099 } else { 9100 this.loadBannerByBannerId(container); 9101 } 9102 }); 9103 }, 9104 9105 getBanners: function (bannerId) { 9106 if (this.options.banners.indexOf(bannerId) === -1) { 9107 return []; 9108 } 9109 const insertedBanner = this.banners.find((element) => { 9110 return element === bannerId; 9111 }); 9112 9113 return content[insertedBanner]; 9114 }, 9115 9116 getSectionBanners: function (section) { 9117 if (!(section in this.options.sections)) { 9118 return []; 9119 } 9120 9121 return this.options.sections[section].map((id) => { 9122 return this.options.content[id]; 9123 }); 9124 }, 9125 9126 loadBannerBySection: function (sectionId, container) {
9127 container.innerHTML = this.getSectionBanners(sectionId).join(''); 9128 this.injectorResolver?.resolve(sectionId, this.options.injectorParams); 9129 this.updateSection(`[data-role="amasty-banner-container"][data-position="${sectionId}"]`, container); 9130 }, 9131 9132 loadBannerByBannerId: function (container) { 9133 const bannerId = container.getAttribute('data-bannerid'); 9134 container.innerHTML = (this.getBanners(bannerId)); 9135 this.updateSection(`[data-role="amasty-banner-container"][data-bannerid="${bannerId}"]`, container); 9136 }, 9137 9138 updateSection: function(containerSelector, container) { 9139 hyva.replaceDomElement( 9140 containerSelector, 9141 container.innerHTML 9142 ); 9143 } 9144 } 9145 } 9146</script>
vendor: 1 bytes, line 9146
9146
9147<script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"WebSite","url":"https:\/\/www.farma.it\/","name":"Antica Farmacia Orlandi","potentialAction":{"@type":"SearchAction","target":"https:\/\/www.farma.it\/catalogsearch\/result\/?q={search_term_string}","query-input":"required name=search_term_string"}}</script>
9147<script type="application/ld+json">{"sameAs":["https:\/\/www.facebook.com\/farmapuntoit","https:\/\/www.instagram.com\/farma.it\/"]}</script>
9147<script type="text/json" id="default-section-data"> 9148 {"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","regions":{"620":{"code":"VAN","name":"Antwerpen"},"621":{"code":"WBR","name":"Brabant wallon"},"622":{"code":"BRU","name":"Brussels-Capital Region"},"623":{"code":"WHT","name":"Hainaut"},"625":{"code":"WLG","name":"Li\u00e8ge"},"624":{"code":"VLI","name":"Limburg"},"626":{"code":"WLX","name":"Luxembourg"},"627":{"code":"WNA","name":"Namur"},"628":{"code":"VOV","name":"Oost-Vlaanderen"},"629":{"code":"VBR","name":"Vlaams-Brabant"},"630":{"code":"VWV","name":"West-Vlaanderen"}}},"BG":{"name":"Bulgaria","regions":{"640":{"code":"BG-01","name":"Blagoevgrad"},"641":{"code":"BG-02","name":"Burgas"},"647":{"code":"BG-08","name":"Dobrich"},"646":{"code":"BG-07","name":"Gabrovo"},"665":{"code":"BG-26","name":"Haskovo"},"648":{"code":"BG-09","name":"Kardzhali"},"649":{"code":"BG-10","name":"Kyustendil"},"650":{"code":"BG-11","name":"Lovech"},"651":{"code":"BG-12","name":"Montana"},"652":{"code":"BG-13","name":"Pazardzhik"},"653":{"code":"BG-14","name":"Pernik"},"654":{"code":"BG-15","name":"Pleven"},"655":{"code":"BG-16","name":"Plovdiv"},"656":{"code":"BG-17","name":"Razgrad"},"657":{"code":"BG-18","name":"Ruse"},"666":{"code":"BG-27","name":"Shumen"},"658":{"code":"BG-19","name":"Silistra"},"659":{"code":"BG-20","name":"Sliven"},"660":{"code":"BG-21","name":"Smolyan"},"661":{"code":"BG-22","name":"Sofia City"},"662":{"code":"BG-23","name":"Sofia Province"},"663":{"code":"BG-24","name":"Stara Zagora"},"664":{"code":"BG-25","name":"Targovishte"},"642":{"code":"BG-03","name":"Varna"},"643":{"code":"BG-04","name":"Veliko Tarnovo"},"644":{"code":"BG-05","name":"Vidin"},"645":{"code":"BG-06","name":"Vratsa"},"667":{"code":"BG-28","name":"Yambol"}}},"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":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CZ":{"name":"Repubblica Ceca","regions":{"752":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"760":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"754":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"759":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"757":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"756":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"763":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"761":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"758":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"753":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"750":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"751":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"755":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"762":{"code":"CZ-72","name":"Zl\u00ednsk\u00fd kraj"}}},"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","regions":{"764":{"code":"DK-84","name":"Hovedstaden"},"765":{"code":"DK-82","name":"Midtjylland"},"766":{"code":"DK-81","name":"Nordjylland"},"767":{"code":"DK-85","name":"Sj\u00e6lland"},"768":{"code":"DK-83","name":"Syddanmark"}}},"EE":{"name":"Estonia","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"}
9148,"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"ES":{"name":"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"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"FI":{"name":"Finlandia","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FR":{"name":"Francia","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"}
9148,"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"}}},"GR":{"name":"Grecia","regions":{"806":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"793":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"794":{"code":"GR-I","name":"Attik\u00ed"},"795":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"796":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"797":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"798":{"code":"GR-D","name":"\u00cdpeiros"},"799":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"800":{"code":"GR-M","name":"Kr\u00edti"},"801":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"802":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"803":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"}
9148,"804":{"code":"GR-E","name":"Thessal\u00eda"},"805":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"HR":{"name":"Croazia","regions":{"554":{"code":"HR-07","name":"Bjelovarsko-bilogorska \u017eupanija"},"559":{"code":"HR-12","name":"Brodsko-posavska \u017eupanija"},"566":{"code":"HR-19","name":"Dubrova\u010dko-neretvanska \u017eupanija"},"568":{"code":"HR-21","name":"Grad Zagreb"},"565":{"code":"HR-18","name":"Istarska \u017eupanija"},"551":{"code":"HR-04","name":"Karlova\u010dka \u017eupanija"},"553":{"code":"HR-06","name":"Koprivni\u010dko-kri\u017eeva\u010dka \u017eupanija"},"549":{"code":"HR-02","name":"Krapinsko-zagorska \u017eupanija"},"556":{"code":"HR-09","name":"Li\u010dko-senjska \u017eupanija"},"567":{"code":"HR-20","name":"Me\u0111imurska \u017eupanija"},"561":{"code":"HR-14","name":"Osje\u010dko-baranjska \u017eupanija"},"558":{"code":"HR-11","name":"Po\u017ee\u0161ko-slavonska \u017eupanija"},"555":{"code":"HR-08","name":"Primorsko-goranska \u017eupanija"},"562":{"code":"HR-15","name":"\u0160ibensko-kninska \u017eupanija"},"550":{"code":"HR-03","name":"Sisa\u010dko-moslava\u010dka \u017eupanija"},"564":{"code":"HR-17","name":"Splitsko-dalmatinska \u017eupanija"},"552":{"code":"HR-05","name":"Vara\u017edinska \u017eupanija"},"557":{"code":"HR-10","name":"Viroviti\u010dko-podravska \u017eupanija"},"563":{"code":"HR-16","name":"Vukovarsko-srijemska \u017eupanija"},"560":{"code":"HR-13","name":"Zadarska \u017eupanija"},"548":{"code":"HR-01","name":"Zagreba\u010dka \u017eupanija"}}},"HU":{"name":"Ungheria"},"IE":{"name":"Irlanda"},"IT":{"name":"Italia","regions":{"825":{"code":"AG","name":"Agrigento"},"826":{"code":"AL","name":"Alessandria"},"827":{"code":"AN","name":"Ancona"},"828":{"code":"AO","name":"Aosta"},"830":{"code":"AR","name":"Arezzo"},"831":{"code":"AP","name":"Ascoli-Piceno"},"832":{"code":"AT","name":"Asti"},"833":{"code":"AV","name":"Avellino"},"834":{"code":"BA","name":"Bari"},"835":{"code":"BT","name":"Barletta-Andria-Trani"},"836":{"code":"BL","name":"Belluno"},"837":{"code":"BN","name":"Benevento"},"838":{"code":"BG","name":"Bergamo"},"839":{"code":"BI","name":"Biella"},"840":{"code":"BO","name":"Bologna"},"841":{"code":"BZ","name":"Bolzano"},"842":{"code":"BS","name":"Brescia"},"843":{"code":"BR","name":"Brindisi"},"844":{"code":"CA","name":"Cagliari"},"845":{"code":"CL","name":"Caltanissetta"},"846":{"code":"CB","name":"Campobasso"},"847":{"code":"CI","name":"Carbonia Iglesias"},"848":{"code":"CE","name":"Caserta"},"849":{"code":"CT","name":"Catania"},"850":{"code":"CZ","name":"Catanzaro"},"851":{"code":"CH","name":"Chieti"},"852":{"code":"CO","name":"Como"},"853":{"code":"CS","name":"Cosenza"},"854":{"code":"CR","name":"Cremona"},"855":{"code":"KR","name":"Crotone"},"856":{"code":"CN","name":"Cuneo"},"857":{"code":"EN","name":"Enna"},"858":{"code":"FM","name":"Fermo"},"859":{"code":"FE","name":"Ferrara"},"860":{"code":"FI","name":"Firenze"},"861":{"code":"FG","name":"Foggia"},"862":{"code":"FC","name":"Forli-Cesena"},"863":{"code":"FR","name":"Frosinone"},"864":{"code":"GE","name":"Genova"},"865":{"code":"GO","name":"Gorizia"},"866":{"code":"GR","name":"Grosseto"},"867":{"code":"IM","name":"Imperia"},"868":{"code":"IS","name":"Isernia"},"829":{"code":"AQ","name":"L'Aquila"},"869":{"code":"SP","name":"La-Spezia"},"870":{"code":"LT","name":"Latina"},"871":{"code":"LE","name":"Lecce"},"872":{"code":"LC","name":"Lecco"},"873":{"code":"LI","name":"Livorno"},"874":{"code":"LO","name":"Lodi"},"875":{"code":"LU","name":"Lucca"},"876":{"code":"MC","name":"Macerata"},"877":{"code":"MN","name":"Mantova"},"878":{"code":"MS","name":"Massa-Carrara"},"879":{"code":"MT","name":"Matera"},"880":{"code":"VS","name":"Medio Campidano"},"881":{"code":"ME","name":"Messina"},"882":{"code":"MI","name":"Milano"},"883":{"code":"MO","name":"Modena"},"884":{"code":"MB","name":"Monza-Brianza"},"885":{"code":"NA","name":"Napoli"},"886":{"code":"NO","name":"Novara"},"887":{"code":"NU","name":"Nuoro"},"888":{"code":"OG","name":"Ogliastra"},"889":{"code":"OT","name":"Olbia Tempio"},"890":{"code":"OR","name":"Oristano"},"891":{"code":"PD","name":"Padova"},"892":{"code":"PA","name":"Palermo"},"893":{"code":"PR","name":"Parma"},"894":{"code":"PV","name":"Pavia"},"895":{"code":"PG","name":"Perugia"},"896":{"code":"PU","name":"Pesaro-Urbino"},"897":{"code":"PE","name":"Pescara"},"898":{"code":"PC","name":"Piacenza"},"899":{"code":"PI","name":"Pisa"},"900":{"code":"PT","name":"Pistoia"},"901":{"code":"PN","name":"Pordenone"},"902":{"code":"PZ","name":"Potenza"},"903":{"code":"PO","name":"Prato"},"904":{"code":"RG","name":"Ragusa"},"905":{"code":"RA","name":"Ravenna"},"906":{"code":"RC","name":"Reggio-Calabria"},"907":{"code":"RE","name":"Reggio-Emilia"},"908":{"code":"RI","name":"Rieti"},"909":{"code":"RN","name":"Rimini"},"910":{"code":"RM","name":"Roma"},"911":{"code":"RO","name":"Rovigo"},"912":{"code":"SA","name":"Salerno"},"913":{"code":"SS","name":"Sassari"},"914":{"code":"SV","name":"Savona"},"915":{"code":"SI","name":"Siena"},"916":{"code":"SR","name":"Siracusa"},"917":{"code":"SO","name":"Sondrio"},"918":{"code":"TA","name":"Taranto"},"919":{"code":"TE","name":"Teramo"},"920":{"code":"TR","name":"Terni"},"921":{"code":"TO","name":"Torino"},"922":{"code":"TP","name":"Trapani"},"923":{"code":"TN","name":"Trento"},"924":{"code":"TV","name":"Treviso"},"925":{"code":"TS","name":"Trieste"},"926":{"code":"UD","name":"Udine"},"927":{"code":"VA","name":"Varese"},"928":{"code":"VE","name":"Venezia"},"929":{"code":"VB","name":"Verbania"},"930":{"code":"VC","name":"Vercelli"},"931":{"code":"VR","name":"Verona"}
9148,"932":{"code":"VV","name":"Vibo-Valentia"},"933":{"code":"VI","name":"Vicenza"},"934":{"code":"VT","name":"Viterbo"}}},"LT":{"name":"Lituania","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Lussemburgo"},"LV":{"name":"Lettonia","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"}
9148,"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"MC":{"name":"Monaco"},"NL":{"name":"Paesi Bassi"},"PL":{"name":"Polonia","regions":{"1011":{"code":"PL-02","name":"dolno\u015bl\u0105skie"},"1012":{"code":"PL-04","name":"kujawsko-pomorskie"},"1013":{"code":"PL-06","name":"lubelskie"},"1014":{"code":"PL-08","name":"lubuskie"},"1017":{"code":"PL-14","name":"mazowieckie"},"1016":{"code":"PL-12","name":"ma\u0142opolskie"},"1018":{"code":"PL-16","name":"opolskie"},"1019":{"code":"PL-18","name":"podkarpackie"},"1020":{"code":"PL-20","name":"podlaskie"},"1021":{"code":"PL-22","name":"pomorskie"},"1022":{"code":"PL-24","name":"\u015bl\u0105skie"},"1023":{"code":"PL-26","name":"\u015bwi\u0119tokrzyskie"},"1024":{"code":"PL-28","name":"warmi\u0144sko-mazurskie"},"1025":{"code":"PL-30","name":"wielkopolskie"},"1026":{"code":"PL-32","name":"zachodniopomorskie"},"1015":{"code":"PL-10","name":"\u0142\u00f3dzkie"}}},"PT":{"name":"Portogallo","regions":{"1027":{"code":"PT-01","name":"Aveiro"},"1028":{"code":"PT-02","name":"Beja"},"1029":{"code":"PT-03","name":"Braga"},"1030":{"code":"PT-04","name":"Bragan\u00e7a"},"1031":{"code":"PT-05","name":"Castelo Branco"},"1032":{"code":"PT-06","name":"Coimbra"},"1033":{"code":"PT-07","name":"\u00c9vora"},"1034":{"code":"PT-08","name":"Faro"},"1035":{"code":"PT-09","name":"Guarda"},"1036":{"code":"PT-10","name":"Leiria"},"1037":{"code":"PT-11","name":"Lisboa"},"1038":{"code":"PT-12","name":"Portalegre"},"1039":{"code":"PT-13","name":"Porto"},"1046":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"1045":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"1040":{"code":"PT-14","name":"Santar\u00e9m"},"1041":{"code":"PT-15","name":"Set\u00fabal"},"1042":{"code":"PT-16","name":"Viana do Castelo"},"1043":{"code":"PT-17","name":"Vila Real"},"1044":{"code":"PT-18","name":"Viseu"}}},"RO":{"name":"Romania","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"SE":{"name":"Svezia","regions":{"1057":{"code":"SE-K","name":"Blekinge l\u00e4n"}
9148,"1058":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"1060":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"1059":{"code":"SE-I","name":"Gotlands l\u00e4n"},"1061":{"code":"SE-N","name":"Hallands l\u00e4n"},"1062":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"1063":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"1064":{"code":"SE-H","name":"Kalmar l\u00e4n"},"1065":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"1066":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"1076":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"1077":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"1067":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"1069":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"1068":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"1070":{"code":"SE-C","name":"Uppsala l\u00e4n"},"1071":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"1072":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"1073":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"1074":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"1075":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SI":{"name":"Slovenia"},"SK":{"name":"Slovacchia"},"XI":{"name":"Irlanda del Nord"},"data_id":1791570381},"captcha":[],"instant-purchase":[],"loggedAsCustomer":[],"persistent":[],"review":[],"payments":[],"wishlist":{"items":[]},"faq":[],"ammessages":[],"rewards":[],"capi-event-ids":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[],"magepal-gtm-jsdatalayer":[],"magepal-eegtm-jsdatalayer":[]}</script>
9148 9149 9150</div></body> 9151</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.