1<!doctype html> 2<html lang="it"> 3<head > 4 <meta charset="utf-8"/> 5<meta name="title" content="Blog"/> 6<meta name="keywords" content="blog farmacia orlandi"/> 7<meta name="robots" content="INDEX,FOLLOW"/> 8<meta name="viewport" content="width=device-width, initial-scale=1"/> 9<title>Blog</title> 10 <link rel="stylesheet" type="text/css" media="all" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/css/styles.css" /> 11<link rel="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="shortcut icon" type="image/x-icon" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/favicon.ico" /> 13<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" /> 14<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" /> 15<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" /> 16<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" /> 17<link rel="icon" sizes="16x16" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/favicon-16x16.png" /> 18<link rel="icon" sizes="32x32" href="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Magento_Theme/favicon-32x32.png" /> 19<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" /> 20<meta name="facebook-domain-verification" content="19ikyzhaaju7aes0tjiyen338y422x" /> 21<style> 22.checkout-payment-method .payment-method-title input[value="sella_fabrickpass"]+label>span { 23 width: 100% 24} 25 26.checkout-payment-method .payment-method-title input[value="sella_fabrickpass"]+label:after { 27 content: ''; 28 display: block; 29 height: 30px; 30 width: 100%; 31 background-size: contain!important; 32 background: url("https://www.farma.it/media/paybybank-logo.png") no-repeat right 33} 34 35.bg-cerave-week { 36 background: #0072ba; 37} 38 39.bg-cerave-week:hover { 40 background: #0069ac; 41 text-decoration: none; 42} 43 44[data-content-type="text"] ol { 45 list-style-type: decimal; 46 padding-left: 20px; 47} 48 49[data-content-type="text"] ul { 50 list-style-type: disc; 51 padding-left: 20px; 52} 53 54[data-content-type="text"] ol li, [data-content-type="text"] ol li { 55 margin-top: 4px; 56} 57 58.catalog-product-view .product-info-main #gallery img.derma-badge { 59 width: 120px!important; 60} 61 62#amfaq-ask-form-inline .button-container { 63display: none !important; 64} 65 66.children-category-container { 67overflow: hidden; 68} 69div.sella-payment-method-container div.img-sella-container { 70 display: none; 71} 72 73div.sella-payment-method-container > div { 74 display: flex;
75 align-items: center; 76} 77div.sella-card-form input { 78 width: 100%; 79 border-radius: 26px; 80 border-width: 1px; 81 --tw-border-opacity: 1; 82 border-color: rgb(214 214 214 / var(--tw-border-opacity)); 83 padding: .875rem; 84 line-height: 1; 85 color: rgb(8 1 26 / var(--tw-text-opacity)); 86 --tw-text-opacity: 1; 87 color: rgb(107 114 128 / var(--tw-text-opacity)); 88 font-size: 16px; 89} 90 91[data-bind="i18n: 'Sustainable delivery estimated in 48-72 hours'"] { 92 display: none; 93} 94 95/* stile doppi punti */ 96/* 97.col-method#label_method_inpost_inpost:after { 98 content: 'Punti Fedeltà x2!'; 99 background: #fec802e6; 100 padding: 0px 5px; 101 border-radius: 5px; 102 color: #f15b2c; 103 font-weight: bold; 104 font-size: 12px; 105 vertical-align: middle; 106 display: inline-block; 107 white-space: nowrap; 108 animation: smooth-bounce-h 2.5s cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite; 109 padding: 4px 8px; 110} 111 112@keyframes smooth-bounce-h { 113 0% { transform: translateX(0); } 114 25% { transform: translateX(6px); } 115 50% { transform: translateX(0); } 116 75% { transform: translateX(-6px); } 117 100% { transform: translateX(0); } 118} 119 120.col-method#label_method_inpost_inpost { 121 display: flex; 122 gap: 8px; 123 align-items: center; 124} 125*/ 126</style> 127 128 129<meta name="google-site-verification" content="9QFzfN_ciMqKFU_cA05_S82R8WLpqnsp4E4Ihexm7EE" /> 130
131<script> 132// Aggiungi un event listener al documento 133document.addEventListener('click', function(event) { 134 // Ottieni l'elemento target cliccato 135 var targetElement = event.target; 136 137 // Verifica se l'elemento cliccato ha le classi specificate 138 var hasTargetClasses = targetElement.classList.contains('block') && 139 targetElement.classList.contains('px-6') && 140 targetElement.classList.contains('w-full') && 141 targetElement.classList.contains('py-3') && 142 targetElement.classList.contains('text-base') && 143 targetElement.classList.contains('hover:text-secondary') && 144 targetElement.classList.contains('hover:bg-tertiary-darker/10') && 145 targetElement.classList.contains('hover:fill-primary') && 146 targetElement.classList.contains('font-bold') && 147 targetElement.classList.contains('cursor-pointer') && 148 targetElement.classList.contains('level0') && 149 targetElement.classList.contains('nav-11') && 150 targetElement.classList.contains('page-item'); 151 152 // Verifica se l'elemento cliccato è un figlio di un elemento con le classi specificate 153 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'); 154 155 // Esegui l'azione solo se l'elemento cliccato ha le classi o è un figlio di un elemento con le classi 156 if (hasTargetClasses || parentElement) { 157 // Esegui il reindirizzamento o caricamento del link 158 window.location.href = "https://www.farma.it/dermocosmetica"; 159 } 160 161 // Ottieni l'elemento target cliccato 162 targetElement = event.target; 163 164 // Verifica se l'elemento cliccato ha le classi specificate 165 hasTargetClasses = targetElement.classList.contains('block') && 166 targetElement.classList.contains('px-6') && 167 targetElement.classList.contains('w-full') && 168 targetElement.classList.contains('py-3') && 169 targetElement.classList.contains('text-base') && 170 targetElement.classList.contains('hover:text-secondary') && 171 targetElement.classList.contains('hover:bg-tertiary-darker/10') && 172 targetElement.classList.contains('hover:fill-primary') && 173 targetElement.classList.contains('font-bold') && 174 targetElement.classList.contains('cursor-pointer') && 175 targetElement.classList.contains('level0') && 176 targetElement.classList.contains('nav-12') && 177 targetElement.classList.contains('page-item'); 178 179 // Verifica se l'elemento cliccato è un figlio di un elemento con le classi specificate 180 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'); 181 182 // Esegui l'azione solo se l'elemento cliccato ha le classi o è un figlio di un elemento con le classi 183 if (hasTargetClasses || parentElement) { 184 // Esegui il reindirizzamento o caricamento del link 185 window.location.href = "https://www.farma.it/gastro-intestinale"; 186 } 187 188}); 189 190</script>
190 191
192<script defer> 193 window.addEventListener('load', () => { 194 Alpine.effect(() => { 195 // Funzione per capire se un elemento è naturalmente focusabile 196 const isNaturallyFocusable = (el) => { 197 const tag = el.tagName.toLowerCase(); 198 if (tag === "a") return el.hasAttribute("href"); 199 return ["button", "input", "select", "textarea"].includes(tag); 200 }; 201 202 // 1. Link con href="#" => role="button" + tabindex 203 document.querySelectorAll("[href='#']:not([role])").forEach(el => { 204 el.setAttribute("role", "button"); 205 if (!el.hasAttribute("tabindex") && !isNaturallyFocusable(el)) { 206 el.setAttribute("tabindex", "0"); 207 } 208 }); 209 210 // 2. Link target="_blank" => aria-label se manca 211 document.querySelectorAll("a[target='_blank']:not([aria-label])").forEach(el => { 212 const text = el.textContent.trim(); 213 if (text.length > 0) { 214 el.setAttribute("aria-label", `${text} - opens in new tab`); 215 } 216 }); 217 218 // 2.1 Link con href valorizzato e senza aria-label => estrai path finale 219 document.querySelectorAll("a[href]:not([aria-label])").forEach(el => { 220 const href = el.getAttribute("href"); 221 if (href && href !== "#" && !el.hasAttribute("aria-label")) { 222 try { 223 const cleanHref = href.split('?')[0].split('#')[0]; 224 const parts = cleanHref.split('/'); 225 const last = parts.filter(p => p).pop(); 226 if (last) { 227 const label = decodeURIComponent(last) 228 .replace(/[-_]/g, ' ') 229 .replace(/[^\w\sà èéìòùÃÃÃÃÃÃ]/gi, '') 230 .trim(); 231 if (label) { 232 el.setAttribute("aria-label", label); 233 } 234 } 235 } catch (e) {} 236 } 237 }); 238 239 // 3. Form di ricerca => role="search" 240 document.getElementById("search_mini_form")?.setAttribute("role", "search"); 241 242 // 4. Icone visive => role="presentation" se mancante 243 document.querySelectorAll("i[class*='-icon'], em[class*='-icon'], span[class*='-icon']").forEach(el => { 244 if (!el.hasAttribute("role")) { 245 el.setAttribute("role", "presentation"); 246 } 247 }); 248 249 // 5. SVG: rimuovi role="img", imposta alt e role="presentation" se serve 250 document.querySelectorAll("svg").forEach(el => { 251 if (el.getAttribute("role") === "img") { 252 el.removeAttribute("role"); 253 } 254 if (!el.hasAttribute("alt")) { 255 el.setAttribute("alt", "Icona"); 256 } 257 if (!el.hasAttribute("role")) { 258 el.setAttribute("role", "presentation"); 259 } 260 }); 261 262 // 6. Elementi cliccabili via classi => role="button" + tabindex="0" 263 const clickableSelector = [ 264 ".cursor-pointer", 265 ".group\\/button", 266 "[style*='cursor: pointer']", 267 '.swiper-button-prev', 268 '.swiper-button-next', 269 '.swiper-pagination-bullet', 270 '.product-item-link' 271 ].join(','); 272 273 document.querySelectorAll(clickableSelector).forEach(el => { 274 if (el.hasAttribute("role")) return; 275 276 const tag = el.tagName.toLowerCase(); 277 const isNativeButton = 278 tag === "button" || 279 (tag === "input" && ["button", "submit", "reset"].includes(el.type)); 280 281 if (!isNativeButton) { 282 el.setAttribute("role", "button"); 283 284 if (!el.hasAttribute("tabindex") && !isNaturallyFocusable(el)) { 285 el.setAttribute("tabindex", "0"); 286 } 287 288 if (!el.hasAttribute("aria-label")) { 289 el.setAttribute("aria-label", "Action"); 290 } 291 } 292 }); 293 294 // 7. Elementi con @click => role="button" + tabindex="0" 295 document.querySelectorAll("*").forEach(el => { 296 if ( 297 el.hasAttribute("@click") && 298 el.hasAttribute("@click.prevent") && 299 !el.hasAttribute("role") && 300 el.tagName.toLowerCase() !== "button" 301 ) { 302 el.setAttribute("role", "button"); 303 304 if (!el.hasAttribute("tabindex") && !isNaturallyFocusable(el)) { 305 el.setAttribute("tabindex", "0"); 306 } 307 308 if (!el.hasAttribute("aria-label")) { 309 el.setAttribute("aria-label", "Action"); 310 } 311 } 312 }); 313 314 // 8. Cookiebot title: attesa dinamica e pulizia 315 const observeCookiebotTitle = () => { 316 const targetId = "CybotCookiebotDialogBodyContentTitle"; 317 318 const handleTitle = (el) => { 319 if (el.getAttribute("role") === "heading") el.removeAttribute("role"); 320 if (el.hasAttribute("aria-level")) el.removeAttribute("aria-level"); 321 }; 322 323 const existing = document.getElementById(targetId); 324 if (existing) { 325 handleTitle(existing); 326 return; 327 } 328 329 const observer = new MutationObserver((mutations, obs) => { 330 const found = document.getElementById(targetId); 331 if (found) { 332 handleTitle(found); 333 obs.disconnect(); 334 } 335 }); 336 337 observer.observe(document.body, { 338 childList: true, 339 subtree: true, 340 }); 341 }; 342 343 observeCookiebotTitle(); 344 345 // 9. Correzione elementi pseudo-button generici (span/div/a) con comportamento da bottone 346 document.querySelectorAll("a, span, div").forEach(el => { 347 const isButtonLike = 348 el.hasAttribute("@click") || 349 el.hasAttribute("@click.prevent") || 350 el.hasAttribute("x-on:click") || 351 el.hasAttribute("onclick") || 352 el.hasAttribute("@keyup.enter") || 353 el.hasAttribute("x-on:keyup.enter") || 354 el.classList.contains("cursor-pointer") || 355 el.classList.contains("badge-container") || 356 el.classList.contains("rating-summary"); 357 358 if (isButtonLike) { 359 const isFocusable = isNaturallyFocusable(el) || el.hasAttribute("tabindex"); 360 361 // Assegna solo se mancano 362 if (!el.hasAttribute("role")) { 363 el.setAttribute("role", "button"); 364 } 365 if (!isFocusable) { 366 el.setAttribute("tabindex", "0"); 367 } 368 if (!el.hasAttribute("aria-label")) { 369 el.setAttribute("aria-label", "Action"); 370 } 371 } 372 }); 373 }); 374 });
375 376 377window.addEventListener('init-external-scripts', () => { 378 379if (!window.dataLayer) { 380 window.dataLayer = []; 381} 382 383 window.dataLayer.push({ 384 event: 'init_external_scripts' 385 }) 386}); 387 388 389document.addEventListener('click', function (event) { 390 const link = event.target.closest('a[href^="#"]'); 391 392 if (!link) { 393 return; 394 } 395 396 const targetId = link.getAttribute('href').substring(1); 397 398 if (!targetId) { 399 return; 400 } 401 402 const target = document.getElementById(targetId); 403 404 // Ci interessa solo se il target è un form 405 if (!(target instanceof HTMLFormElement)) { 406 return; 407 } 408 409 event.preventDefault(); 410 411 target.requestSubmit(); 412}); 413</script>
413 414 415 <!-- Meta Business Extension for Magento 2 --> 416<!-- Meta Pixel Code -->
417<script>
vendor: 398 bytes, lines 417-425
417 418!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? 419n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; 420n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; 421t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, 422document,'script','//connect.facebook.net/en_US/fbevents.js'); 423 fbq( 424 'init', 425 '
425512468414859242
vendor: 59 bytes, lines 425-428
425', 426 {}, 427 {agent: 'magento_opensource-0.0.0-1.6.4' } 428);
429fbq('track', 'PageView', { 430 source: "magento_opensource", 431 pluginVersion: "1.6.4" 432}); 433</script>
433 434
435<script> 436 function metaPixelTracker(config) { 437 let eventId = crypto.randomUUID(); 438 var browserEventData = config.browserEventData; 439 let browserPayload = config.browserEventData.payload; 440 441 browserPayload.source = browserEventData.source; 442 browserPayload.pluginVersion = browserEventData.pluginVersion; 443 444 fbq('set', 'agent', browserEventData.fbAgentVersion, browserEventData.fbPixelId); 445 fbq(browserEventData.track, browserEventData.event, browserPayload, { 446 eventID: eventId 447 } 448 ); 449 450 var formData = new FormData(); 451 formData.append('form_key', hyva.getFormKey()); 452 formData.append('eventId', eventId); 453 454 Object.entries(config.payload).forEach(function (item) { 455 formData.append(item[0], item[1]); 456 }) 457 458 fetch(config.url, { 459 method: 'POST', 460 body: formData 461 }).catch(error => { 462 console.error(error); 463 }); 464 } 465 466 function metaParseJson(json) { 467 json = decodeURIComponent(json.replace(/\+/g, ' ')); 468 return JSON.parse(json); 469 } 470 471 function metaDelCookie(name) { 472 var date = new Date(0); 473 var cookie = name + '=' + '; path=/; expires=' + date.toUTCString(); 474 475 document.cookie = cookie; 476 } 477 478 function metaGetCookie(name) { 479 var cookie = ' ' + document.cookie; 480 var search = ' ' + name + '='; 481 var setStr = null; 482 var offset = 0; 483 var end = 0; 484 485 if (cookie.length > 0) { 486 offset = cookie.indexOf(search); 487 if (offset !== -1) { 488 offset += search.length; 489 end = cookie.indexOf(';', offset); 490 if (end === -1) { 491 end = cookie.length; 492 } 493 setStr = decodeURI(cookie.substring(offset, end)); 494 } 495 } 496 return setStr; 497 } 498</script>
498 499<!-- End Meta Pixel Code --> 500 501<!-- Google Tag Manager by MagePal -->
502<script type="text/javascript"> 503 window.dataLayer = window.dataLayer || []; 504 505 506 function initMagepalGtmDatalayer_4f71f1c5e6503faecb6d9e35a59f2399() { 507 'use strict'; 508 509 let lastPushedCart = {}; 510 let lastPushedCustomer = {}; 511 512 function objectKeyExist(object) 513 { 514 const items = Array.isArray(object) ? object : Object.values(object); 515 return items.reduce((acc, v) => (acc || v.customer || v.cart), false); 516 // return _.some(object, function (o) { 517 // return !_.isEmpty(_.pick(o, ['customer', 'cart'])); 518 // }) 519 } 520 521 const isObject = x => x === Object(x); 522 const has = (x, p) => isObject(x) && x.hasOwnProperty(p); 523 const isEqual = (x, y) => JSON.stringify(x) === JSON.stringify(y); 524 525 //Update datalayer 526 function updateDataLayer(_gtmDataLayer, _dataObject, _forceUpdate) 527 { 528 let customer = {isLoggedIn : false}, 529 cart = {hasItems: false}; 530 531 if (_gtmDataLayer !== undefined && (!objectKeyExist(_gtmDataLayer) || _forceUpdate)) { 532 if (isObject(_dataObject) && has(_dataObject, 'customer')) { 533 customer = _dataObject.customer; 534 } 535 536 if (isObject(_dataObject) && has(_dataObject, 'cart')) { 537 cart = _dataObject.cart; 538 } 539 540 if (!isEqual(lastPushedCart, cart) || !isEqual(lastPushedCustomer, customer)) { 541 window.dispatchEvent(new CustomEvent('mpCustomerSession', {detail: [customer, cart, _gtmDataLayer]})); 542 //$('body').trigger('mpCustomerSession', [customer, cart, _gtmDataLayer]); 543 _gtmDataLayer.push({'event': 'mpCustomerSession', 'customer': customer, 'cart': cart}); 544 545 lastPushedCustomer = customer; 546 lastPushedCart = cart; 547 } 548 } 549 } 550 551 function isTrackingAllowed(config) 552 { 553 let allowServices = false, 554 allowedCookies, 555 allowedWebsites; 556 557 if (!config.isGdprEnabled || (!config.isGdprEnabled && !config.addJsInHeader)) { 558 allowServices = true; 559 } else if (config.isCookieRestrictionModeEnabled && config.gdprOption === 1) { 560 allowedCookies = hyva.getCookie(config.cookieName); 561 562 if (allowedCookies !== null) { 563 allowedWebsites = JSON.parse(allowedCookies); 564 565 if (allowedWebsites[config.currentWebsite] === 1) { 566 allowServices = true; 567 } 568 } 569 } else if (config.gdprOption === 2) { 570 allowServices = hyva.getCookie(config.cookieName) !== null; 571 } else if (config.gdprOption === 3) { 572 allowServices = hyva.getCookie(config.cookieName) === null; 573 } 574 575 return allowServices; 576 } 577 578 //load gtm 579 function initTracking(dataLayerName, accountId, containerCode) 580 { 581 window.dispatchEvent(new CustomEvent('gtm:beforeInitialize')); 582 583 (function (w, d, s, l, i) { 584 w[l] = w[l] || []; 585 w[l].push({ 586 'gtm.start': 587 new Date().getTime(), event: 'gtm.js' 588 }); 589 var f = d.getElementsByTagName(s)[0], 590 j = d.createElement(s), dl = l != dataLayerName ? '&l=' + l : ''; 591 j.async = true; 592 j.src = '//www.googletagmanager.com/gtm.js?id=' + i + dl + containerCode; 593 f.parentNode.insertBefore(j, f); 594 })(window, document, 'script', dataLayerName, accountId); 595 window.dispatchEvent(new CustomEvent('gtm:afterInitialize')); 596 } 597 598 function pushData(dataLayerName, dataLayer) 599 { 600 //if (_.isArray(dataLayer)) { 601 if (Array.isArray(dataLayer)) { 602 //_.each(dataLayer, function (data) { 603 dataLayer.forEach(function (data) { 604 window[dataLayerName].push(data); 605 }); 606 } 607 } 608 609 const config = { 610 dataLayer: "dataLayer", 611 gdprOption: 0, 612 isGdprEnabled: 0, 613 isCookieRestrictionModeEnabled: 0, 614 }; 615 616 config.currentWebsite = 1; 617 config.cookieName = "user_allowed_save_cookie"; 618 config.accountId = "GTM-TQTH9KNM"; 619 config.data = [{"ecommerce":{"currencyCode":"EUR"},"pageType":"blog_home_index","list":"other"}]; 620 config.addJsInHeader = 0; 621 config.containerCode = ""; 622 623 window[config.dataLayer] = window[config.dataLayer] || []; 624 625 if (has(config, 'accountId') && isTrackingAllowed(config)) { 626 pushData(config.dataLayer, config.data); 627 initTracking(config.dataLayer, config.accountId, config.containerCode); 628 } 629 630 const gtmDataLayer = window[config.dataLayer]; 631 632 window.addEventListener("private-content-loaded", event => { 633 const dataObject = event.detail.data['magepal-gtm-jsdatalayer'] || {}; 634 updateDataLayer(gtmDataLayer, dataObject, true) 635 }); 636
637 // dataObject.subscribe(function (_dataObject) { 638 // updateDataLayer(gtmDataLayer, _dataObject, true); 639 // }, this); 640 641 // if (!_.contains(customerData.getExpiredKeys(), 'magepal-gtm-jsdatalayer')) { 642 // updateDataLayer(gtmDataLayer, dataObject(), false); 643 // } 644 645 } 646 window.addEventListener('DOMContentLoaded', initMagepalGtmDatalayer_4f71f1c5e6503faecb6d9e35a59f2399); 647 648</script>
648 649<!-- End Google Tag Manager by MagePal --> 650 651<link rel="canonical" href="https://www.farma.it/blog.html">
652<script> 653 var BASE_URL = 'https://www.farma.it/'; 654 var THEME_PATH = 'https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT'; 655 var COOKIE_CONFIG = { 656 "expires": null, 657 "path": "\u002F", 658 "domain": ".farma.it", 659 "secure": true, 660 "lifetime": "7200", 661 "cookie_restriction_enabled": false }; 662 var CURRENT_STORE_CODE = 'default'; 663 var CURRENT_WEBSITE_ID = '1'; 664 var CURRENT_MIN_ORDER_VALUE = '24.90'; 665 var CURRENT_MIN_ORDER_VALUE_FORMATTED = '24,90 â¬'; 666 var CURRENT_MIN_ORDER_INCLUDE_DISCOUNT = '0'; 667 var CURRENT_STORE_CURRENCY = 'EUR'; 668 669 window.hyva = window.hyva || {} 670 671 window.cookie_consent_groups = window.cookie_consent_groups || {} 672 window.cookie_consent_groups['necessary'] = true; 673 674 window.cookie_consent_config = window.cookie_consent_config || {}; 675 window.cookie_consent_config['necessary'] = [].concat( 676 window.cookie_consent_config['necessary'] || [], 677 [ 678 'user_allowed_save_cookie', 679 'form_key', 680 'mage-messages', 681 'private_content_version', 682 'mage-cache-sessid', 683 'last_visited_store', 684 'section_data_ids' 685 ] 686 ); 687 document.addEventListener("alpine:init", () => { 688 Alpine.store('externalScriptsInit', false); 689 window.addEventListener('init-external-scripts', () => Alpine.store('externalScriptsInit',true), { 690 once: true, 691 passive: true 692 }); 693 }); 694</script>
vendor: 1 bytes, line 694
694
695<script> 696 (function( hyva, undefined ) { 697 698 function lifetimeToExpires(options, defaults) { 699 700 const lifetime = options.lifetime || defaults.lifetime; 701 702 if (lifetime) { 703 const date = new Date; 704 date.setTime(date.getTime() + lifetime * 1000); 705 return date; 706 } 707 708 return null; 709 } 710 711 function generateRandomString() { 712 713 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 714 length = 16; 715 716 let formKey = '', 717 charactersLength = allowedCharacters.length; 718 719 for (let i = 0; i < length; i++) { 720 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 721 } 722 723 return formKey; 724 } 725 726 const sessionCookieMarker = {noLifetime: true} 727 728 const cookieTempStorage = {}; 729 730 const internalCookie = { 731 get(name) { 732 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 733 return v ? v[2] : null; 734 }, 735 set(name, value, days, skipSetDomain) { 736 let expires, 737 path, 738 domain, 739 secure, 740 samesite; 741 742 const defaultCookieConfig = { 743 expires: null, 744 path: '/', 745 domain: null, 746 secure: false, 747 lifetime: null, 748 samesite: 'lax' 749 }; 750 751 const cookieConfig = window.COOKIE_CONFIG || {}; 752 753 expires = days && days !== sessionCookieMarker 754 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 755 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 756 757 path = cookieConfig.path || defaultCookieConfig.path; 758 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 759 secure = cookieConfig.secure || defaultCookieConfig.secure; 760 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 761 762 document.cookie = name + "=" + encodeURIComponent(value) + 763 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 764 (path ? '; path=' + path : '') + 765 (domain ? '; domain=' + domain : '') + 766 (secure ? '; secure' : '') + 767 (samesite ? '; samesite=' + samesite : 'lax'); 768 }, 769 isWebsiteAllowedToSaveCookie() { 770 const allowedCookies = this.get('user_allowed_save_cookie'); 771 if (allowedCookies) { 772 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 773 774 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 775 } 776 return false; 777 }, 778 getGroupByCookieName(name) { 779 const cookieConsentConfig = window.cookie_consent_config || {}; 780 let group = null; 781 for (let prop in cookieConsentConfig) { 782 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 783 if (cookieConsentConfig[prop].includes(name)) { 784 group = prop; 785 break; 786 } 787 } 788 return group; 789 }, 790 isCookieAllowed(name) { 791 const cookieGroup = this.getGroupByCookieName(name); 792 return cookieGroup 793 ? window.cookie_consent_groups[cookieGroup] 794 : this.isWebsiteAllowedToSaveCookie(); 795 }, 796 saveTempStorageCookies() { 797 for (const [name, data] of Object.entries(cookieTempStorage)) { 798 if (this.isCookieAllowed(name)) { 799 this.set(name, data['value'], data['days'], data['skipSetDomain']); 800 delete cookieTempStorage[name]; 801 } 802 } 803 } 804 }; 805 806 hyva.getCookie = (name) => { 807 const cookieConfig = window.COOKIE_CONFIG || {}; 808 809 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 810 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 811 } 812 813 return internalCookie.get(name); 814 } 815 816 hyva.setCookie = (name, value, days, skipSetDomain) => { 817 const cookieConfig = window.COOKIE_CONFIG || {}; 818 819 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 820 cookieTempStorage[name] = {value, days, skipSetDomain}; 821 return; 822 } 823 return internalCookie.set(name, value, days, skipSetDomain); 824 } 825 826 827 hyva.setSessionCookie = (name, value, skipSetDomain) => { 828 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 829 } 830 831 hyva.getBrowserStorage = () => { 832 const browserStorage = window.localStorage || window.sessionStorage; 833 if (!browserStorage) { 834 console.warn('Browser Storage is unavailable'); 835 return false;
836 } 837 try { 838 browserStorage.setItem('storage_test', '1'); 839 browserStorage.removeItem('storage_test'); 840 } catch (error) { 841 console.warn('Browser Storage is not accessible', error); 842 return false; 843 } 844 return browserStorage; 845 } 846 847 hyva.postForm = (postParams) => { 848 const form = document.createElement("form"); 849 850 let data = postParams.data; 851 852 if (! postParams.skipUenc && ! data.uenc) { 853 data.uenc = btoa(window.location.href); 854 } 855 form.method = "POST"; 856 form.action = postParams.action; 857 858 Object.keys(postParams.data).map(key => { 859 const field = document.createElement("input"); 860 field.type = 'hidden' 861 field.value = postParams.data[key]; 862 field.name = key; 863 form.appendChild(field); 864 }); 865 866 const form_key = document.createElement("input"); 867 form_key.type = 'hidden'; 868 form_key.value = hyva.getFormKey(); 869 form_key.name="form_key"; 870 form.appendChild(form_key); 871 872 document.body.appendChild(form); 873 874 form.submit(); 875 } 876 877 hyva.getFormKey = function () { 878 let formKey = hyva.getCookie('form_key'); 879 880 if (!formKey) { 881 formKey = generateRandomString(); 882 hyva.setCookie('form_key', formKey); 883 } 884 885 return formKey; 886 } 887 888 hyva.formatPrice = (value, showSign, options = {}) => { 889 const groupSeparator = options.groupSeparator; 890 const decimalSeparator = options.decimalSeparator 891 delete options.groupSeparator; 892 delete options.decimalSeparator; 893 const formatter = new Intl.NumberFormat( 894 'it\u002DIT', 895 Object.assign({ 896 style: 'currency', 897 currency: 'EUR', 898 signDisplay: showSign ? 'always' : 'auto' 899 }, options) 900 ); 901 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 902 formatter.formatToParts(value).map(({type, value}) => { 903 switch (type) { 904 case 'currency': 905 return '\u20AC' || value; 906 case 'minusSign': 907 return '- '; 908 case 'plusSign': 909 return '+ '; 910 case 'group': 911 return groupSeparator !== undefined ? groupSeparator : value; 912 case 'decimal': 913 return decimalSeparator !== undefined ? decimalSeparator : value; 914 default : 915 return value; 916 } 917 }).reduce((string, part) => string + part) : 918 formatter.format(value); 919 } 920 921 const formatStr = function (str, nStart) { 922 const args = Array.from(arguments).slice(2); 923 924 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 925 const idx = parseInt(n) - nStart; 926 927 if (args[idx] === null || args[idx] === void 0) { 928 return m; 929 } 930 return p.length % 2 931 ? p.slice(0, -1).replace('%%', '%') + args[idx] 932 : p.replace('%%', '%') + n; 933 }) 934 } 935 936 hyva.str = function (string) { 937 const args = Array.from(arguments); 938 args.splice(1, 0, 1); 939 940 return formatStr.apply(undefined, args); 941 } 942 943 hyva.strf = function () { 944 const args = Array.from(arguments); 945 args.splice(1, 0, 0); 946 947 return formatStr.apply(undefined, args); 948 } 949 950 /** 951 * Take a html string as `content` parameter and 952 * extract an element from the DOM to replace in 953 * the current page under the same selector, 954 * defined by `targetSelector` 955 */ 956 hyva.replaceDomElement = (targetSelector, content) => { 957 // Parse the content and extract the DOM node using the `targetSelector` 958 const parser = new DOMParser(); 959 const doc = parser.parseFromString(content, 'text/html');
960 const contentNode = doc.querySelector(targetSelector); 961 962 // Bail if content or target can't be found 963 if (!contentNode || !document.querySelector(targetSelector)) { 964 return; 965 } 966 967 hyva.activateScripts(contentNode); 968 969 // Replace the old DOM node with the new content 970 document.querySelector(targetSelector).replaceWith(contentNode); 971 972 // Reload customerSectionData and display cookie-messages if present 973 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 974 hyva.initMessages(); 975 } 976 977 hyva.removeScripts = (contentNode) => { 978 const scripts = contentNode.getElementsByTagName('script'); 979 for (let i = 0; i < scripts.length; i++) { 980 scripts[i].parentNode.removeChild(scripts[i]); 981 } 982 const templates = contentNode.getElementsByTagName('template'); 983 for (let i = 0; i < templates.length; i++) { 984 const container = document.createElement('div'); 985 container.innerHTML = templates[i].innerHTML; 986 hyva.removeScripts(container); 987 templates[i].innerHTML = container.innerHTML; 988 } 989 } 990 991 hyva.activateScripts = (contentNode) => { 992 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 993 const scripts = Array.from(contentNode.getElementsByTagName('script')); 994 995 // Iterate over all script tags to duplicate+inject each into the head 996 for (const original of scripts) { 997 const script = document.createElement('script'); 998 original.type && (script.type = original.type); 999 script.innerHTML = original.innerHTML; 1000 1001 // Remove the original (non-executing) script from the contentNode 1002 original.parentNode.removeChild(original) 1003 1004 // Add script to head 1005 document.head.appendChild(script); 1006 } 1007 1008 return contentNode; 1009 } 1010 1011 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 1012 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 1013 1014 let currentTrap; 1015 1016 const focusableElements = (rootElement) => { 1017 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 1018 return Array.from(rootElement.querySelectorAll(selector)) 1019 .filter(el => { 1020 return el.style.display !== 'none' 1021 && !el.disabled 1022 && el.tabIndex !== -1 1023 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 1024 }) 1025 } 1026 1027 const focusTrap = (e) => { 1028 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 1029 if (!isTabPressed) return; 1030 1031 const focusable = focusableElements(currentTrap) 1032 const firstFocusableElement = focusable[0] 1033 const lastFocusableElement = focusable[focusable.length - 1] 1034 1035 e.shiftKey 1036 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 1037 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 1038 }; 1039 1040 hyva.releaseFocus = (rootElement) => { 1041 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 1042 currentTrap.removeEventListener('keydown', focusTrap) 1043 currentTrap = null 1044 } 1045 } 1046 hyva.trapFocus = (rootElement) => { 1047 if (!rootElement) return; 1048 hyva.releaseFocus() 1049 currentTrap = rootElement 1050 rootElement.addEventListener('keydown', focusTrap) 1051 const firstElement = focusableElements(rootElement)[0] 1052 firstElement && firstElement.focus() 1053 } 1054 1055 hyva.safeParseNumber = (rawValue) => { 1056 const number = rawValue ? parseFloat(rawValue) : null; 1057 1058 return Array.isArray(number) || isNaN(number) ? rawValue : number; 1059 } 1060 1061 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 1062 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 1063 1064 const camelCase = toCamelCase(name);
1065 const key = '__hyva_bool_' + name 1066 1067 return new Proxy(Object.assign( 1068 additionalMethods, 1069 { 1070 [key]: !!value, 1071 [name]() {return !!this[key]}, 1072 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 1073 ['not' + camelCase]() {return !this[key]}, 1074 ['toggle' + camelCase]() {this[key] = !this[key]}, 1075 [`set${camelCase}True`]() {this[key] = true}, 1076 [`set${camelCase}False`]() {this[key] = false}, 1077 } 1078 ), { 1079 set(target, prop, value) { 1080 return prop === name 1081 ? (target[key] = !!value) 1082 : Reflect.set(...arguments); 1083 } 1084 }) 1085 } 1086 1087 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 1088 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 1089 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 1090 1091 }( window.hyva = window.hyva || {} )); 1092 //# sourceURL=hyva.js 1093</script>
vendor: 1 bytes, line 1093
1093
1094<script type="speculationrules"> 1095{ 1096 "tag": "Hyva Theme", 1097 "prefetch": [{ 1098 "source": "document", 1099 "where": { 1100 "and": [ 1101 { "href_matches": "/*" }, 1102 { "not": { 1103 "href_matches": ["/customer/*","/search/*","/sales/*","/wishlist/*","/checkout/*","/paypal/*","/newsletter/*","/stores/store/redirect/*"] }}, 1104 { "not": { 1105 "selector_matches": [".no-preload", ".do-not-prerender", "[download]", "[rel~=nofollow]", "[target]"] 1106 }} 1107 ] 1108 }, 1109 "eagerness": "moderate" 1110 }] 1111} 1112</script>
vendor: 1 bytes, line 1112
1112
1113<script class="feedaty_sdk" src="https://widget.feedaty.com/v3.0.0/js/2021/10214034/feedaty.min.js" async></script>
1113 1114 1115<meta property="og:type" content="WebPage"/> 1116 1117 <meta property="og:name" content="I nostri consigli"/> 1118 1119 1120<link rel="canonical" href="https://www.farma.it/blog.html">
1121<script> 1122 function deepMerge(target, ...sources) { 1123 if (!sources.length) { 1124 return target; 1125 } 1126 1127 const source = sources.shift(); 1128 1129 if (typeof target !== 'object' || typeof source !== 'object') { 1130 return target; 1131 } 1132 1133 for (let key in source) { 1134 if (source.hasOwnProperty(key)) { 1135 if (source[key] instanceof Array) { 1136 target[key] = target[key] || []; 1137 target[key] = target[key].concat(source[key]); 1138 } else if (typeof source[key] === 'object') { 1139 target[key] = deepMerge(target[key] || {}, source[key]); 1140 } else { 1141 target[key] = source[key]; 1142 } 1143 } 1144 } 1145 1146 return deepMerge(target, ...sources); 1147 } 1148 1149 function amastyRewardsProduct() { 1150 return { 1151 captionStartText: 'Puoi\u0020guadagnare', 1152 captionAfterText: '', 1153 captionRegistrationText: 'registrandoti\u0021', 1154 captionEndText: '', 1155 productId: this.$el.dataset.productId, 1156 formSelector: 'product_addtocart_form', 1157 form: null, 1158 refreshUrl: this.$el.dataset.refreshUrl, 1159 loader: false, 1160 isFetching: false, 1161 abortFetchController: false, 1162 highlight: { 1163 registration_link: '', 1164 caption_color: '', 1165 caption_text: '0', 1166 visible: false 1167 }, 1168 1169 init() { 1170 this.formObserver(); 1171 document.addEventListener(`update-qty-${this.productId}`, () => { 1172 this.updateData(); 1173 }); 1174 window.addEventListener('update-bundle-option-selection', () => { 1175 this.updateData(); 1176 }); 1177 this.$nextTick(() => this.updateData()); 1178 }, 1179 1180 hideBlock() { 1181 this.highlight.visible = false; 1182 this.loader = true; 1183 }, 1184 1185 dispatchStatus(type, message) { 1186 window.dispatchMessages([{ 1187 type: type, 1188 text: message 1189 }], 5000); 1190 }, 1191 1192 formObserver() { 1193 const product = document.querySelector(`input[name='product'][value='${this.productId}']`); 1194 1195 if (product) { 1196 const productForm = product.form; 1197 if (productForm) { 1198 productForm.addEventListener('change', () => { 1199 this.updateData(); 1200 }); 1201 } 1202 } 1203 }, 1204 1205 updateData() { 1206 if (this.isFetching) { 1207 return false; 1208 } 1209 if (!this.refreshUrl) { 1210 this.loader = false;
1211 return false; 1212 } 1213 this.hideBlock(); 1214 1215 if (this.abortFetchController) { 1216 this.abortFetchController.abort(); 1217 } 1218 1219 this.abortFetchController = new AbortController(); 1220 1221 const product = document.querySelector(`input[name='product'][value='${this.productId}']`); 1222 let formParams = ''; 1223 1224 if (!product) { 1225 formParams = 'form_key=' + hyva.getFormKey() + '&product=' + this.productId; 1226 } else { 1227 const form = product.form; 1228 const formData = new FormData(form); 1229 formParams = new URLSearchParams(formData).toString(); 1230 } 1231 const formJson = JSON.stringify({ 1232 page: 0, 1233 productId: this.productId, 1234 attributes: formParams 1235 }); 1236 1237 const requestOptions = { 1238 method: 'POST', 1239 body: formJson, 1240 headers: { 1241 'Content-Type': 'application/json', 1242 'x-requested-with': 'XMLHttpRequest', 1243 }, 1244 signal: this.abortFetchController.signal 1245 }; 1246 this.isFetching = true; 1247 fetch(this.refreshUrl, requestOptions).then(response => { 1248 if (!response.ok) { 1249 return Promise.reject(`${response.status} ${response.statusText}`); 1250 } 1251 return response.json(); 1252 }).then((data) => { 1253 this.highlight.visible = data.visible; 1254 this.highlight.caption_text = data.caption_text; 1255 this.highlight.caption_color = data.caption_color; 1256 1257 if (data?.registration_link) { 1258 this.highlight.registration_link = data.registration_link; 1259 } 1260 1261 if (data?.need_to_change_message && data?.need_to_change_message === 1) { 1262 this.captionAfterText = 'completando\u0020un\u0020acquisto\u0021\u0020Solo\u0020per'; 1263 this.captionRegistrationText = 'registrati.'; 1264 this.captionEndText = 'utenti'; 1265 } 1266 }).catch(error => { 1267 if (error.name !== 'AbortError' && typeof error === 'string' && error.match(/'401'/g) !== null) { 1268 this.dispatchStatus('error', error); 1269 } 1270 }).finally(() => { 1271 this.loader = false;
1272 this.isFetching = false; 1273 }); 1274 }, 1275 1276 highlightCaptionText() { 1277 return this.highlight.caption_text !== '0' && !this.loader; 1278 }, 1279 1280 highlightStyle() { 1281 return `color: ${this.highlight.caption_color}`; 1282 }, 1283 1284 isHighlightRegistrationLink() { 1285 return this.highlight.registration_link && this.highlight.registration_link !== ''; 1286 }, 1287 1288 isNotRegistrationLink() { 1289 return !this.highlight.registration_link; 1290 }, 1291 1292 highlightVisible() { 1293 return this.highlight.visible && !this.loader; 1294 } 1295 } 1296 } 1297 1298 window.addEventListener( 1299 'alpine:init', 1300 () => Alpine.data('amastyRewardsProduct', amastyRewardsProduct), 1301 { once: true } 1302 ); 1303</script>
vendor: 1 bytes, line 1303
1303
1304<script> 1305 (function () { 1306 let amSwiperProcessed = false; 1307 1308 window.addEventListener('load-amswiper', () => { 1309 if (amSwiperProcessed) { 1310 window?.Swiper && window.dispatchEvent(new CustomEvent('amswiper-loaded', {})); 1311 return; 1312 } 1313 1314 const script = document.createElement('script'); 1315 script.src = 'https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Amasty_LibSwiperJs/js/vendor/swiper/swiper.min.js'; 1316 script.async = true; 1317 document.body.appendChild(script); 1318 1319 amSwiperProcessed = true; 1320 1321 script.onload = () => { 1322 window.dispatchEvent(new CustomEvent('amswiper-loaded', {})); 1323 } 1324 1325 const stylesHref = 'https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Amasty_LibSwiperJs/vendor/swiper/swiper.min.css'; 1326 1327 if (document.querySelector(`link[href="${stylesHref}"]`)) { 1328 return; 1329 } 1330 1331 const styles = document.createElement('link'); 1332 styles.rel = 'stylesheet'; 1333 styles.type = 'text/css'; 1334 styles.href = stylesHref; 1335 1336 document.head.appendChild(styles); 1337 }); 1338 }()); 1339</script>
1339 1340</head> 1341<body id="html-body" class="blog blog-home-index page-layout-2columns-left"> 1342 <noscript> 1343 <img height="1" width="1" style="display:none" 1344 src="https://www.facebook.com/tr?id=512468414859242&ev=PageView&noscript=1&a=magento_opensource-0.0.0-1.6.4"> 1345 </noscript> 1346 1347<!-- Google Tag Manager by MagePal -->
vendor: 62 bytes, lines 1347-1348
1347 1348<noscript><iframe src="//www.googletagmanager.com/ns.html?id=
1348GTM-TQTH9KNM
vendor: 83 bytes, lines 1348-1349
1348" 1349height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
1350<!-- End Google Tag Manager by MagePal --> 1351 1352 1353 1354
1354<script type="module">const { KlarnaSDK } = await import("https\u003A\u002F\u002Fjs.klarna.com\u002Fweb\u002Dsdk\u002Fv2\u002Fklarna.mjs"); 1355const MyKlarna = await KlarnaSDK({ 1356 clientId: "klarna_live_client_Rnpiams_MTNpWWc3LzJ3UUppciNHKUgqJSlSTG9lS0gsN2Q1MmUxN2UtZmE4MC00OGIxLWFhNjgtNTc4NDMyN2M2MGQ0LDEsWlJNMmtVejlkd0Q1bVBoOHZnc3JKN1YyL3FOY2ZrYzRRSWRjNUNhY3ZZYz0", 1357 products: ["PAYMENT", "MESSAGING", "IDENTITY", "CUSTOMER"], 1358 locale: "it\u002DIT" 1359}); 1360const token = await MyKlarna.Interoperability.token(); 1361const klarnaReadyEvent = new CustomEvent("klarna-sdk-ready", { 1362 detail: { token, sdk: MyKlarna } 1363}); 1364window.dispatchEvent(klarnaReadyEvent);</script>
1364 1365<div 1366 class="ambanners ambanner-10" 1367 data-position="10" 1368 data-bannerid="" 1369 data-role="amasty-banner-container" 1370></div> 1371
1372<script nonce='NjNtZzZkZG5hN3RlcXptYzE0eXZhMWpqNnQzY2N0djE=' > 1373 'use strict'; 1374 (function (blackbird) { 1375 1376 const addEventListenerOnElementToLoad = (elementToLoad, source) => new Promise((resolve, reject) => { 1377 elementToLoad.addEventListener('load', () => { 1378 elementToLoad.dataset.loaded = true; 1379 resolve(elementToLoad); 1380 }) 1381 1382 elementToLoad.addEventListener('error', () => { 1383 reject(new Error(`[External resource loader] : The resource "${source}", failed to load.`)); 1384 }); 1385 }); 1386 1387 blackbird.loadExternalScript = async (source) => { 1388 const scriptWithSameSrc = document.querySelector(`script[src="${source}"][data-loaded]`); 1389 1390 if (scriptWithSameSrc && scriptWithSameSrc.dataset.loaded === 'true') { 1391 return scriptWithSameSrc; 1392 } 1393 1394 const script = scriptWithSameSrc ?? document.createElement('script'); 1395 script.type = 'text/javascript'; 1396 script.async = true; 1397 script.src = source; 1398 script.dataset.loaded = false; 1399 1400 document.head.appendChild(script); 1401 await addEventListenerOnElementToLoad(script, source); 1402 return script; 1403 } 1404 1405 blackbird.loadExternalStyle = async (source) => { 1406 const linkWithSameHref = document.querySelector(`link[href="${source}"][data-loaded]`); 1407 1408 if (linkWithSameHref && linkWithSameHref.dataset.loaded === 'true') { 1409 return linkWithSameHref; 1410 } 1411 1412 const link = linkWithSameHref ?? document.createElement('link'); 1413 link.type = 'text/css' 1414 link.rel = 'stylesheet'; 1415 link.href = source; 1416 link.dataset.loaded = false; 1417 1418 document.head.prepend(link); 1419 await addEventListenerOnElementToLoad(link, source); 1420 return link; 1421 } 1422 1423 blackbird.loadExternalResource = (source) => { 1424 const scriptUrlRegex = /\.(js)$/i; 1425 const styleUrlRegex = /\.(css)$/i; 1426 1427 if (scriptUrlRegex.test(source)) { 1428 return blackbird.loadExternalScript(source); 1429 } 1430 1431 if (styleUrlRegex.test(source)) { 1432 return blackbird.loadExternalStyle(source); 1433 } 1434 } 1435 1436 }(window.blackbird = window.blackbird || {})); 1437</script>
1437 1438<!-- BEGIN Trovaprezzi Trusted Program CODE -->
1439<script type="text/javascript" src="https://tps.trovaprezzi.it/javascripts/tracking-vanilla.min.js"></script>
1439 1440 1441<!-- END Trovaprezzi Trusted Program CODE --> 1442<input name="form_key" type="hidden" value="uky45cJBt3wJBuSu" /> 1443 <noscript> 1444 <section 1445 class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal" 1446 aria-labelledby="messageGlobalNoScriptMessage" 1447 > 1448 <div class="container text-center"> 1449 <p id="messageGlobalNoScriptMessage"> 1450 <strong>I JavaScript sembrano essere disabilitati nel tuo browser.</strong> 1451 <span> 1452 Per una migliore esperienza sul nostro sito, assicurati di attivare i javascript nel tuo browser. </span> 1453 </p> 1454 </div> 1455 </section> 1456 </noscript> 1457 1458 1459<div class="widget block block-static-block"> 1460 <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"> 1461Spedizione <strong id="prova-agent">Gratuita</strong><span class="hidden lg:inline"> su tutti i prodotti</span> | Ordine minimo 24,90 ⬠1462</p> 1463<a href="http://reskyt.com/app/anticafarmaciaorlandi" class="href-download-app reskyt" id="href-download-app" style="display:none"> 1464 <div id="install-app"> 1465 <span class="close-install-app" onclick="return reskytCloseBar();"><span>x</span></span> 1466 <div class="content-app">
1467 <img class="img-app" src="https://cdn.reskyt.com/7724/antica-farmacia-orlandi-icono-app-436884-250116101022.png" alt="Farma.it"> 1468 <div class="name-app">Farma.it</div> 1469 <div class="fab-app">Farma.it - by Antica Farmacia Orlandi</div> 1470 <div class="title-app">Disponibile su <span id="platform-app"></span></div> 1471 </div> 1472 </div> 1473</a> 1474 1475<style> 1476 .fixed-header .reskyt #install-app { 1477 display: none; 1478 } 1479 1480 .reskyt #install-app { 1481 width:100%; 1482 right: 0; 1483 position: fixed; 1484 top:0; 1485 z-index: 900; 1486 color:#000000; 1487 background-color:rgb(255, 102, 0);; 1488 font-family: Verdana, Arial, sans-serif; 1489 font-size:12px; 1490 min-height:90px; 1491 z-index: 99999; 1492 } 1493 .reskyt .close-install-app { 1494 padding:8px 5px; 1495 display:block; 1496 width:20px; 1497 height:40px; 1498 font-family: Helvetica, Arial, Verdana, sans-serif; 1499 font-weight: normal; 1500 font-size:14px; 1501 text-align:center; 1502 cursor:pointer !important; 1503 font-weight:bold; 1504 color:#666; 1505 position:absolute; 1506 margin-top:20px; 1507 } 1508 .reskyt .img-app { 1509 max-height: 60px; 1510 width:57px; 1511 border: 1px solid #e8ecf1; 1512 -webkit-border-radius: 8px; 1513 -moz-border-radius: 8px; 1514 border-radius: 8px; 1515 } 1516 .reskyt .img-app, .reskyt .content-app { 1517 float:left; 1518 } 1519 .reskyt .fab-app { 1520 color:#000000; 1521 font-size:11px; 1522 } 1523 .reskyt .name-app, .reskyt .title-app, .reskyt .fab-app { 1524 margin-left:70px; 1525 padding:1px 0; 1526 } 1527 .reskyt .title-app { color: #444444; } 1528 .reskyt .name-app { 1529 font-weight:bold; 1530 margin-top:2px; 1531 overflow:hidden; 1532 height: 16px; 1533 } 1534 .reskyt .content-app { 1535 margin-top:8px; 1536 margin-right: 34px; 1537 margin-left: 30px; 1538 position:absolute; 1539 } 1540 .reskyt .view-install-app { 1541 color:blue; 1542 line-height:25px; 1543 margin-top:23px; 1544 text-transform:uppercase; 1545 position:absolute; 1546 right:5px; 1547 } 1548 @media screen and (max-width: 350px){ .reskyt .title-app { overflow: auto; max-height: 28px;} } 1549</style> 1550
1551<script> 1552 1553 function reskytCloseBar () { 1554 dias_expire = 7; /*Dias que queremos que pasen hasta que se vuelva a mostrar la barra*/ 1555 reskytSetCookie("reskyt-install-app", 1, dias_expire); 1556 document.getElementById("href-download-app").style.display = "none"; 1557 return false; 1558 } 1559 function reskytSetCookie(cname, cvalue, exdays) { 1560 var d = new Date(); 1561 d.setTime(d.getTime() + (exdays*24*60*60*1000)); 1562 var expires = "expires="+ d.toUTCString(); 1563 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; /*Añadir ;SameSite=None;Secure en caso de que la cookie tenga que ser accesible entre iFrame*/ 1564 } 1565 function reskytGetCookie(cname) { 1566 var name = cname + "="; 1567 var decodedCookie = decodeURIComponent(document.cookie); 1568 var ca = decodedCookie.split(';'); 1569 for(var i = 0; i <ca.length; i++) { 1570 var c = ca[i]; 1571 while (c.charAt(0) == ' ') { 1572 c = c.substring(1); 1573 } 1574 if (c.indexOf(name) == 0) { 1575 return c.substring(name.length, c.length); 1576 } 1577 } 1578 return ""; 1579 } 1580 url = window.location.href; 1581 if ( url.indexOf("customapp=") != -1 ) { 1582 reskytSetCookie("is_app_install_bar", 1, 365); 1583 } 1584 window.addEventListener('load', function () { 1585 let isMobile = true; 1586 1587 const platformApp = document.getElementById("platform-app"); 1588 const downloadApp = document.getElementById("href-download-app"); 1589 1590 if (/Android/i.test(navigator.userAgent)) { 1591 if (platformApp) { 1592 platformApp.innerHTML = "Google Play"; 1593 } 1594 } else if (/iPhone|iPad|iPod/i.test(navigator.userAgent)) { 1595 if (platformApp) { 1596 platformApp.innerHTML = "App Store"; 1597 } 1598 } else if (/IEMobile/i.test(navigator.userAgent)) { 1599 if (platformApp) { 1600 platformApp.innerHTML = "Windows Phone"; 1601 } 1602 } else { 1603 isMobile = false; 1604 } 1605 1606 if ( 1607 downloadApp && 1608 isMobile && 1609 !reskytGetCookie("is_app_install_bar") && 1610 !reskytGetCookie("reskyt-install-app") 1611 ) { 1612 downloadApp.style.display = "block"; 1613 } else if (downloadApp) { 1614 downloadApp.style.display = "none"; 1615 } 1616 }); 1617</script>
1617</div></div></div> 1618 1619
1620<script data-cfasync="false"> 1621 window.amastyCookieManager = window.amastyCookieManager || {}; 1622</script>
vendor: 1 bytes, line 1622
1622
1623<script type="text/plain" data-cookieconsent="marketing"> 1624 (function() { 1625 "use strict"; 1626 1627 window.CONNECTIF_CART_SUMMARY = null; 1628 1629 function addClientScript(result) { 1630 if ( 1631 !document.querySelector("#__cn_generic_script__" + result.clientId) && 1632 !document.querySelector("#__cn_client_script_" + result.clientId) 1633 ) { 1634 const url = 1635 result.cdnProtocol + 1636 "://" + 1637 result.cdnDomain + 1638 "/" + 1639 result.cdnPath + 1640 "/" + 1641 result.clientScriptPath + 1642 result.clientId; 1643 const element = document.createElement("script"); 1644 element.setAttribute("src", url); 1645 element.setAttribute("id", "__cn_generic_script__" + result.clientId); 1646 document.body.appendChild(element); 1647 } else { 1648 var cartModel = window.connectif.getCartModel(); 1649 window.connectif.managed.sendEvents([], {cart: cartModel}) 1650 } 1651 } 1652 1653 function addTags(innerHTML, elementToRemove = null) { 1654 if (!!innerHTML) { 1655 if (elementToRemove) { 1656 let elementToRemoveNode = document.querySelector(elementToRemove); 1657 if (elementToRemoveNode) { 1658 elementToRemoveNode.remove(); 1659 } 1660 } 1661 1662 let element = document.createElement("div"); 1663 element.style.display = "none"; 1664 element.innerHTML = innerHTML; 1665 document.body.appendChild(element); 1666 } 1667 } 1668 1669 function fetchConnectif() { 1670 const url = 'https://www.farma.it/connectif/tags/ajaxconnectiftags' + '?' + Date.now().toString(36) + Math.random().toString(36).substr(2); 1671 1672 fetch(url, { 1673 method: "GET", 1674 headers: { 1675 "Content-Type": "application/json", 1676 'Cache-Control': 'no-cache, no-store, must-revalidate', 1677 'Pragma': 'no-cache', 1678 'Expires': '0', 1679 'X-Requested-With': 'XMLHttpRequest' 1680 } 1681 }) 1682 .then(response => response.json()) 1683 .then(result => { 1684 addTags(result.renderedClientInfo, '.cn_client_info'); 1685 addTags(result.renderedCart, '.cn_cart'); 1686 addTags(result.renderedNewsletter, '.cn_newsletter_subscribe'); 1687 1688 if ( 1689 document.readyState === "complete" || 1690 document.readyState === "interactive" 1691 ) { 1692 addClientScript(result); 1693 } else { 1694 document.addEventListener( 1695 "DOMContentLoaded", 1696 addClientScript.bind(null, result) 1697 ); 1698 } 1699 }) 1700 .catch(error => console.error('Error:', error)); 1701 } 1702 1703 window.addEventListener('private-content-loaded', (e) => { 1704 //fetch Connecitf only at first visit or whenever cart is updated (add to cart, remove from cart, qty update) 1705 var cartSummary = 0; 1706 if (e.detail && e.detail.data && e.detail.data.cart && e.detail.data.cart.summary_count) { 1707 cartSummary = e.detail.data.cart.summary_count; 1708 } 1709 if (window.CONNECTIF_CART_SUMMARY === null || cartSummary !== window.CONNECTIF_CART_SUMMARY) { 1710 fetchConnectif(); 1711 window.CONNECTIF_CART_SUMMARY = cartSummary; 1712 } 1713 }); 1714 })(); 1715</script>
1715 1716<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 1717 contentarea" 1718 href="#contentarea"> 1719 <span> 1720 Salta al contenuto </span> 1721</a>
1722<script> 1723 function initHeader () { 1724 return { 1725 cart: {}, 1726 fixedPosition: 50, 1727 fixedClass: 'fixed-header', 1728 getData(data) { 1729 if (data.cart) { this.cart = data.cart } 1730 }, 1731 getCartItemsCountLabel() { 1732 if(this.cart && this.cart.summary_count){ 1733 return (this.cart.summary_count > 99)? '99+' : `${this.cart.summary_count}` 1734 } 1735 return '0'; 1736 }, 1737 fixedHeader() { 1738 if (window.scrollY > this.fixedPosition) { 1739 document.body.classList.add(this.fixedClass); 1740 } else { 1741 document.body.classList.remove(this.fixedClass); 1742 } 1743 }, 1744 bodyScroll(removeScroll) { 1745 const body = document.querySelector('body'); 1746 if (!document.querySelector("#maincontent > .dfd-root")) { 1747 if (removeScroll) { 1748 body.classList.add('overflow-hidden'); 1749 } else { 1750 body.classList.remove('overflow-hidden'); 1751 } 1752 } 1753 } 1754 } 1755 } 1756</script>
1756 1757<div id="header" 1758 class="relative w-full" 1759 :class="searchOpened ? '' : 'z-30'" 1760 x-data="{...initHeader(), ...{searchOpened: false}}" 1761 @live-search-state-changed.window="searchOpened = $event.detail; bodyScroll(searchOpened)" 1762 @private-content-loaded.window="getData(event.detail.data)" 1763 @scroll.window="fixedHeader()" 1764> 1765 <div class="content w-full bg-white shadow-lg border-b border-primary-darker" :class="searchOpened ? 'z-40' : ''"> 1766 <div class="container flex flex-wrap items-center justify-between w-full pt-4 mx-auto mt-0"> 1767 <!-- Logo --> 1768 <div class="order-2 flex-1 lg:flex-none w-auto"> 1769 <a class="flex items-center justify-center lg:justify-start text-xl font-medium tracking-wide text-gray-800 1770 no-underline hover:no-underline font-title " 1771 href="https://www.farma.it/" 1772 title="" 1773 aria-label="store logo"> 1774 <img src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/logo.svg" 1775 style="height: 60px;" 1776 title="" 1777 alt="" 1778 width="253" height="70" /> 1779 </a> 1780</div> 1781 1782 <!-- Main Navigation --> 1783 1784 1785<div x-data="initMenuMobile_6ac8c77d0ec48()" 1786 x-defer="intersect" 1787 x-intersect.once="isActive = true; $watch('open', value => { fetchData() })" 1788 class="z-20 order-1 navigation lg:hidden" 1789> 1790 <template x-if="isActive"> 1791 <div class="flex items-baseline justify-between menu-icon mr-3"> 1792 <div class="flex justify-end w-full"> 1793 <a @click="$dispatch('toggle-mobile-menu6ac8c77d0ec48')" 1794 class="flex items-center justify-center cursor-pointer"> 1795 <span class="bg-[#6328E035] rounded-full text-secondary p-2"> 1796 <svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 24 17.44" width="14" height="14" role="img"> 1797 <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"/> 1798<title>menu</title></svg> 1799 </span> 1800 </a> 1801 </div> 1802 </div> 1803 </template> 1804 <!-- mobile --> 1805 <template x-if="isActive"> 1806 <div @load.window="setActiveMenu($root)" 1807 class="bg-container-lighter h-screen overflow-x-hidden overflow-y-auto fixed top-0 left-0 w-full" 1808 :class="{'' : open}" 1809 @toggle-mobile-menu6ac8c77d0ec48.window="open = !open" 1810 @keydown.window.escape="open=false" 1811 x-cloak 1812 x-show="open" 1813 x-transition:enter="transform transition ease-in-out duration-300" 1814 x-transition:enter-start="-translate-x-full" 1815 x-transition:enter-end="translate-x-0" 1816 x-transition:leave="transform transition ease-in-out duration-300" 1817 x-transition:leave-start="translate-x-0" 1818 x-transition:leave-end="-translate-x-full"> 1819 1820 <div class="flex items-baseline justify-between menu-icon shadow-md"> 1821 <span class="font-bold font-baloo-bhaina text-primary px-4 pt-4 pb-3 w-full text-center text-xl" :class="{ 1822 'hidden' : panelLevel > 0 1823 }">Menu</span> 1824 <a @click="$dispatch('toggle-mobile-menu6ac8c77d0ec48')" 1825 class="absolute z-10 top-0 right-0 cursor-pointer mt-0.5 p-5 pr-4" 1826 > 1827 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12" role="img"> 1828 <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"/> 1829<title>x</title></svg> 1830 </a> 1831 </div> 1832 1833 <nav class="hidden w-full duration-150 text-base ease-in-out transform border-t transition-display border-container" 1834 :class="{ 'hidden' : !open }"> 1835 1836 1837 <div class="submenu-top mt-4"> 1838 1839<div class="level-0">
1840 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1841 :class="{ 1842 '-translate-x-full' : panelLevel > '0', 1843 'translate-x-0' : panelLevel <= '0' 1844 }"> 1845 <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'> 1846 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/point.svg" alt="Raccolta Punti Farma Lovers" /> 1847 </span> 1848 <span>Raccolta Punti Farma Lovers</span> 1849 </a> </span> 1850 1851 </div> 1852 1853<div class="level-0"> 1854 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1855 :class="{ 1856 '-translate-x-full' : panelLevel > '0', 1857 'translate-x-0' : panelLevel <= '0' 1858 }"> 1859 <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'> 1860 <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" /> 1861 </span> 1862 <span>Fino al -10% sui prodotti cosmetici</span> 1863 </a> </span> 1864 1865 </div> 1866 1867<div class="level-0"> 1868 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1869 :class="{ 1870 '-translate-x-full' : panelLevel > '0', 1871 'translate-x-0' : panelLevel <= '0' 1872 }"> 1873 <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'> 1874 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/phone-duotone.svg" alt="Richiamami" /> 1875 </span> 1876 <span>Richiamami</span> 1877 </a> </span> 1878 1879 </div> 1880 </div> 1881 1882 <!-- LEVEL 0 --> 1883 <div class="level-0 mt-4"> 1884 <div @click="togglePanelActiveId('root')" class="flex items-center transition-transform duration-150 ease-in-out transform" 1885 :class="{ 1886 '-translate-x-full' : panelLevel > 0, 1887 'translate-x-0' : panelLevel <= 0 1888 }"> 1889 <div class="w-full cursor-pointer level-0 px-3 "> 1890 <div class="px-4 pt-3 pb-2 flex justify-between items-center text-secondary bg-tertiary-darker/10 rounded-xl"> 1891 <span class="font-bold text-lg font-baloo-bhaina"> 1892 Categorie </span> 1893 <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"> 1894 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1895<title>chevron-right</title></svg> 1896 </div> 1897 </div> 1898 </div> 1899 <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" 1900 :class="{ 1901 'translate-x-full h-0' : !isPanelActive('root'), 1902 'translate-x-0 h-screen overflow-y-auto' : isPanelActive('root') 1903 }" 1904 > 1905 <template x-if="isLoading && $store.externalScriptsInit"> 1906 <div class="absolute bg-white/60 z-10 h-full w-full flex items-center justify-center"> 1907 <div class="flex items-center"> 1908 <!-- loading icon --> 1909 <svg class="animate-spin h-5 w-5 text-gray-600" xmlns="http://www.w3.org/2000/svg" fill="none"
1910 viewBox="0 0 24 24"> 1911 <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> 1912 <path class="opacity-75" fill="currentColor" 1913 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"> 1914 </path> 1915 </svg> 1916 <!-- end loading icon --> 1917 </div> 1918 </div> 1919</template> 1920 <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" 1921 @click="removePanelActiveId('root')" 1922 :class="{ 'sticky top-0 left-0 right-0 z-20': isPanelActive('root') && panelLevel <= 1 }" 1923 > 1924 <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"> 1925 <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"/> 1926<title>arrow-back</title></svg> 1927 <span class="ml-4"> 1928 Categorie </span> 1929 </a> 1930 <template x-for="(item, index) in menuData" :key="item.id"> 1931 <!-- LEVEL 1 --> 1932 <div class="level-1"> 1933 <span class="flex items-center transition-transform duration-150 ease-in-out transform px-4 py-2 font-bold font-baloo-bhaina" 1934 :class="{ 1935 '-translate-x-full h-0 overflow-hidden' : panelLevel > 1, 1936 'translate-x-0' : panelLevel <= 1 1937 }" 1938 > 1939 <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"> 1940 <template x-if="item.icon"> 1941 <template x-if="item.icon_content"> 1942 <span x-html="item.icon_content" class='menu-icon mr-4 inline-block'></span> 1943 </template> 1944 <template x-if="!item.icon_content"> 1945 <span x-show="item.icon" class='menu-icon mr-4 inline-block'><img x-bind:src="item.icon" x-bind:alt="item.label" /></span> 1946 </template> 1947 </template> 1948 <span x-text="item.label"></span> 1949 </a> 1950 <template x-if="item.submenu && item.submenu.children"> 1951 <span class="block" 1952 @click="togglePanelActiveId(item.id)" 1953 > 1954 <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"> 1955 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1956<title>chevron-right</title></svg> 1957 </span> 1958 </template> 1959 </span> 1960 <template x-if="item.submenu && item.submenu.children"> 1961 <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" 1962 :class="{ 1963 'translate-x-full h-0' : !isPanelActive(item.id), 1964 'translate-x-0 h-screen' : isPanelActive(item.id), 1965 'overflow-y-auto': isPanelActive(item.id) && panelLevel <= 2 1966 }" 1967 > 1968 <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" 1969 @click="removePanelActiveId(item.id)" 1970 :class="{ 'sticky top-0 left-0 right-0 z-20': isPanelActive(item.id) && panelLevel <= 2 }" 1971 > 1972 <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"> 1973 <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"/> 1974<title>arrow-back</title></svg>
1975 <span class="ml-4" x-text="item.label"></span> 1976 </a> 1977 <a x-bind:href="item.link" 1978 x-bind:title="item.label" 1979 class="order-1 flex items-center w-full px-7 py-1 text-[15px] cursor-pointer bg-container-lighter underline text-secondary gap-1" 1980 > 1981 <span>Vedi tutti</span> 1982 <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"> 1983 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 1984<title>chevron-right</title></svg> 1985 </a> 1986 <template x-for="child in item.submenu.children"> 1987 <template x-for="(item, index) in child"> 1988 <template x-if="item.type && item.type == 'category-item'"> 1989 <!-- LEVEL 2 --> 1990 <div class="level-2" :class="{'order-0': item.type == 'custom_list', 'order-1': item.type != 'custom_list'}"> 1991 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 1992 :class="{ 1993 'font-bold': item.type == 'custom_list', 1994 '-translate-x-full' : panelLevel > 2, 1995 'translate-x-0' : panelLevel <= 2 1996 }" 1997 > 1998 <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"> 1999 <span x-text="item.label"></span> 2000 </a> 2001 <template x-if="item.children"> 2002 <span class="block" 2003 @click="togglePanelActiveId(item.id)" 2004 > 2005 <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"> 2006 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 2007<title>chevron-right</title></svg> 2008 </span> 2009 </template> 2010 </span> 2011 2012 <template x-if="item.children"> 2013 <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" 2014 :class="{ 2015 'translate-x-full h-0' : !isPanelActive(item.id), 2016 'translate-x-0 h-screen overflow-y-auto' : isPanelActive(item.id) 2017 }" 2018 > 2019 <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" 2020 @click="removePanelActiveId(item.id)" 2021 :class="{ 'sticky top-0 left-0 right-0 z-20': isPanelActive(item.id) }" 2022 > 2023 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20.57" width="16" height="16" role="img"> 2024 <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"/> 2025<title>arrow-back</title></svg> 2026 <sp
2026an class="ml-4" x-text="item.label"></span> 2027 </a> 2028 <template x-for="(item, index) in item.children" :key="index"> 2029 <template x-if="item.type && item.type != 'block'"> 2030 2031 <div class="level-3"> 2032 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2033 :class="{ 2034 '-translate-x-full' : panelLevel > 3, 2035 'translate-x-0' : panelLevel <= 3 2036 }" 2037 > 2038 <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"> 2039 <span x-text="item.label"></span> 2040 </a> 2041 </span> 2042 </div> 2043 2044 </template> 2045 </template> 2046 </div> 2047 </template> 2048 </div> 2049 2050 </template> 2051 </template> 2052 </template> 2053 </div> 2054 </template> 2055 </div> 2056 </template> 2057 </div> 2058 </div> 2059 2060 <div class="transition-transform duration-150 ease-in-out transform" :class="{ '-translate-x-full' : panelLevel > 0, 'translate-x-0' : panelLevel <= 0 }"> 2061 <div class="font-bold px-7 mt-5 mb-2"> 2062 Collegamenti utili </div> 2063 2064<div class="level-0"> 2065 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2066 :class="{ 2067 '-translate-x-full' : panelLevel > '0', 2068 'translate-x-0' : panelLevel <= '0' 2069 }"> 2070 <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> 2071 </a> </span> 2072 2073 </div> 2074 2075<div class="level-0"> 2076 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2077 :class="{ 2078 '-translate-x-full' : panelLevel > '0', 2079 'translate-x-0' : panelLevel <= '0' 2080 }"> 2081 <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> 2082 </a> </span> 2083 2084 </div> 2085 2086<div class="level-0"> 2087 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2088 :class="{ 2089 '-translate-x-full' : panelLevel > '0', 2090 'translate-x-0' : panelLevel <= '0' 2091 }"> 2092 <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">
2092 <span>Coupon</span> 2093 </a> </span> 2094 2095 </div> 2096 2097<div class="level-0"> 2098 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2099 :class="{ 2100 '-translate-x-full' : panelLevel > '0', 2101 'translate-x-0' : panelLevel <= '0' 2102 }"> 2103 <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> 2104 </a> </span> 2105 2106 </div> 2107 2108<div class="level-0"> 2109 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2110 :class="{ 2111 '-translate-x-full' : panelLevel > '0', 2112 'translate-x-0' : panelLevel <= '0' 2113 }"> 2114 <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> 2115 </a> </span> 2116 2117 </div> 2118 2119<div class="level-0"> 2120 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2121 :class="{ 2122 '-translate-x-full' : panelLevel > '0', 2123 'translate-x-0' : panelLevel <= '0' 2124 }"> 2125 <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> 2126 </a> </span> 2127 2128 </div> 2129 2130<div class="level-0"> 2131 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2132 :class="{ 2133 '-translate-x-full' : panelLevel > '0', 2134 'translate-x-0' : panelLevel <= '0' 2135 }"> 2136 <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'> 2137 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/tv-warning.svg" alt="Podcast" /> 2138 </span> 2139 <span>Podcast</span> 2140 </a> </span> 2141 2142 </div> 2143 2144<div class="level-0"> 2145 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2146 :class="{ 2147 '-translate-x-full' : panelLevel > '0', 2148 'translate-x-0' : panelLevel <= '0' 2149 }"> 2150 <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> 2151 </a> </span> 2152 2153 </div> 2154 2155 <!-- BLOCK customer-menu-mobile --> 2156<div class="w-full px-3 my-3" x-data="initCustomerMenuMobile()" @private-content-loaded.window="getData(event.detail.data)"> 2157 <template x-if="isLoggedIn()"> 2158 <a 2159 href="https://www.farma.it/customer/account/" 2160 id="customer-menu-mobile" 2161 class="px-4 pt-3 pb-2 flex justify-start gap-3 items-center bg-category-lighter rounded-xl" 2162 aria-label="Il mio Account" 2163 > 2164 <span class="relative block"> 2165 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true"> 2166 <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"/> 2167</svg> 2168 </span>
2169 <span class="font-bold text-lg font-baloo-bhaina truncate"> 2170 <span>Ciao, </span> 2171 <span x-text="customer.firstname"></span> 2172 </span> 2173 <span class="relative bottom-0.5 whitespace-nowrap block ml-auto text-[15px] font-medium">Il mio Account</span> 2174 </a> 2175 </template> 2176 <template x-if="!isLoggedIn()"> 2177 <span> 2178 <a 2179 href="https://www.farma.it/customer/account/" 2180 id="customer-menu-mobile" 2181 class="px-4 py-3 flex justify-between gap-3 items-center bg-category-lighter rounded-xl" 2182 aria-label="Il mio Account" 2183 > 2184 <span class="relative block"> 2185 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" aria-hidden="true"> 2186 <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"/> 2187</svg> 2188 </span> 2189 <span class="label font-medium text-[15px]"> 2190 <span>Accedi / Registrati</span> 2191 </span> 2192 </a> 2193 </span> 2194 </template> 2195</div> 2196<!-- /BLOCK customer-menu-mobile --> 2197 <div class="font-bold px-7 mt-5 mb-2"> 2198 Servizi clienti </div> 2199 <div class="submenu-bottom mb-4"> 2200 2201<div class="level-0"> 2202 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2203 :class="{ 2204 '-translate-x-full' : panelLevel > '0', 2205 'translate-x-0' : panelLevel <= '0' 2206 }"> 2207 <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'> 2208 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/information-circle.svg" alt="Serve aiuto?" /> 2209 </span> 2210 <span>Serve aiuto?</span> 2211 </a> </span> 2212 2213 </div> 2214 2215<div class="level-0"> 2216 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2217 :class="{ 2218 '-translate-x-full' : panelLevel > '0', 2219 'translate-x-0' : panelLevel <= '0' 2220 }"> 2221 <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'> 2222 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/chat.svg" alt="Contattaci" /> 2223 </span> 2224 <span>Contattaci</span> 2225 </a> </span> 2226 2227 </div> 2228 2229<div class="level-0"> 2230 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2231 :class="{ 2232 '-translate-x-full' : panelLevel > '0', 2233 'translate-x-0' : panelLevel <= '0' 2234 }"> 2235 <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'> 2236 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/tracking.svg" alt="Traccia il tuo pacco" /> 2237 </span>
2238 <span>Traccia il tuo pacco</span> 2239 </a> </span> 2240 2241 </div> 2242 2243<div class="level-0"> 2244 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2245 :class="{ 2246 '-translate-x-full' : panelLevel > '0', 2247 'translate-x-0' : panelLevel <= '0' 2248 }"> 2249 <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'> 2250 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/credit-card.svg" alt="Pagamenti" /> 2251 </span> 2252 <span>Pagamenti</span> 2253 </a> </span> 2254 2255 </div> 2256 2257<div class="level-0"> 2258 <span class="flex items-center transition-transform duration-150 ease-in-out transform" 2259 :class="{ 2260 '-translate-x-full' : panelLevel > '0', 2261 'translate-x-0' : panelLevel <= '0' 2262 }"> 2263 <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'> 2264 <img class="w-4.5 h-4.5" src="https://www.farma.it/media/dnafactory/megamenu/truck.svg" alt="Spedizioni" /> 2265 </span> 2266 <span>Spedizioni</span> 2267 </a> </span> 2268 2269 </div> 2270 </div> 2271 </div> 2272 2273 2274 </nav> 2275 </div> 2276 </template> 2277</div> 2278
2279<script> 2280 'use strict'; 2281 2282 const initMenuMobile_6ac8c77d0ec48 = () => { 2283 return { 2284 open: false, 2285 isActive: false, 2286 isLoaded: false, 2287 mobilePanelActiveId: [], 2288 panelLevel: 0, 2289 menuData: null, 2290 isLoading: false, 2291 currentUrl: window.location.href.split('?')[0], 2292 isPanelActive(id){ 2293 return this.mobilePanelActiveId.includes(id); 2294 }, 2295 setPanelActiveId(id, replace = false){ 2296 if(replace){ 2297 this.clearPanelActiveId(); 2298 } 2299 if(!this.isPanelActive(id)) 2300 this.mobilePanelActiveId.push(id); 2301 id && (this.panelLevel += 1); 2302 }, 2303 removePanelActiveId(id){ 2304 let i = this.mobilePanelActiveId.indexOf(id); 2305 if(i >= 0) 2306 this.mobilePanelActiveId.splice(i, 1); 2307 this.panelLevel -= 1; 2308 }, 2309 togglePanelActiveId(id, event){ 2310 if(event) 2311 event.preventDefault(); 2312 if(this.isPanelActive(id)) 2313 this.removePanelActiveId(id); 2314 else 2315 this.setPanelActiveId(id); 2316 }, 2317 clearPanelActiveId(){ 2318 this.mobilePanelActiveId =[]; 2319 }, 2320 hasSubmenu(item){ 2321 return item.submenu; 2322 },
2323 setActiveMenu(menuNode) { 2324 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2325 return link.href === window.location.href.split('?')[0]; 2326 }).map(item => { 2327 this.addClassToParent(item); 2328 }); 2329 }, 2330 addClassToParent(item){ 2331 if(item) { 2332 item.classList.add('underline') 2333 parent = item.closest(`div.class-${this.panelLevel - 1}`) 2334 parent && (parent !== item) && this.addClassToParent(parent.querySelector('span > a')); 2335 } 2336 }, 2337 dispatchMessage(type, message, timeout) { 2338 typeof window.dispatchMessages && window.dispatchMessages( 2339 [{ 2340 type: type, 2341 text: message, 2342 }], 2343 timeout 2344 ); 2345 }, 2346 fetchData(){ 2347 this.$dispatch('screen-lock',this.open); 2348 this.isLoaded = true; 2349 if (!this.menuData && this.open) { 2350 this.isLoading = true; 2351 fetch( 2352 'https://www.farma.it/megamenu/get/json/id/1/limit/0/level/2/', 2353 { 2354 headers: {contentType: 'application/json'}, 2355 } 2356 ).then(response => { 2357 if (response.ok) { 2358 return response.json(); 2359 } else { 2360 this.dispatchMessage('error', response); 2361 console.warn("GET request failed", response); 2362 } 2363 }) 2364 .then(data => { 2365 this.menuData = data; 2366 this.isLoading = false; 2367 this.$nextTick(() => { 2368 this.setActiveMenu(this.$root); 2369 }); 2370 }); 2371 } 2372 } 2373 } 2374 } 2375</script>
2375 2376 2377 2378<nav class="hidden hierarchy"> 2379 <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> 2380 2381<div x-data="initMenuDesktop_6ac8c77d1c956()" 2382 x-defer="intersect" 2383 x-intersect.once="isActive = true; $watch('open', value => { fetchData() })" 2384 class="order-5 navigation first hidden lg:flex w-full main lg:mt-3" 2385 :class="{ 'z-20': open }" 2386> 2387 <!-- desktop --> 2388 <div x-ref="nav-desktop" 2389 @load.window="setActiveMenu($root)" 2390 class="hidden lg:block lg:relative lg:min-h-0 lg:w-auto"> 2391 <nav class="w-full duration-150 ease-in-out transform flex justify-start w-auto min-h-0 transition-display my-2"> 2392 <div class="mr-6 level-top nav-side">
2393 <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')"> 2394 <span class="bg-[#6328E035] rounded-full text-secondary p-1.5"> 2395 <svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 24 17.44" width="12" height="12" role="img"> 2396 <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"/> 2397<title>menu</title></svg> 2398 </span> 2399 <span class="my-auto">Categorie</span> 2400 </span> 2401 </div> 2402 <div class="nav-menu flex"> 2403 2404<div class="relative mx-2 level-0 level0 nav-1 first page-item level-top"> 2405 <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> 2406 </a> 2407 </div> 2408 2409<div class="relative mx-2 level-0 level0 nav-2 custom-item level-top"> 2410 <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> 2411 </a> 2412 </div> 2413 2414<div class="relative mx-2 level-0 level0 nav-3 page-item level-top"> 2415 <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> 2416 </a> 2417 </div> 2418 2419<div class="relative mx-2 level-0 level0 nav-4 custom-item level-top"> 2420 <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> 2421 </a> 2422 </div> 2423 2424<div class="relative mx-2 level-0 level0 nav-5 custom-item level-top"> 2425 <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> 2426 </a> 2427 </div> 2428 2429<div class="relative mx-2 level-0 level0 nav-6 custom-item level-top"> 2430 <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> 2431 </a> 2432 </div> 2433 2434<div class="relative mx-2 level-0 level0 nav-7 custom-item level-top"> 2435 <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 "> 2436<span class="menu-icon flex gap-2 items-center relative"> 2437 <?xml version="1.0" encoding="UTF-8"?> 2438<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> 2439 <span class="leading-none">Podcast</span> 2440 </a> 2441 </div> 2442 2443<div class="relative mx-2 level-0 level0 nav-8 last custom-item level-top"> 2444 <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> 2445 </a> 2446 </div> 2447 </div> 2448 </nav> 2449 </div> 2450 <template x-if="isActive"> 2451 <section x-cloak id="main-menu_6ac8c77d1c956" 2452 @toggle-main-menu.window="open = !open" 2453 @keydown.window.escape="open=false" 2454 > 2455 <div role="dialog" 2456 x-ref="dialog" 2457 aria-label="Menu" 2458 aria-labelledby="menu-drawer-title" 2459 aria-modal="true" 2460 class="fixed inset-y-0 left-0 z-30 flex"> 2461 <div class="relative z-20 w-screen" 2462 x-ref="dialogContainer" 2463 x-show="open" 2464 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 2465 x-transition:enter-start="-translate-x-full" 2466 x-transition:enter-end="translate-x-0" 2467 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 2468 x-transition:leave-start="translate-x-0" 2469 x-transition:leave-end="-translate-x-full" 2470 > 2471 <div class="flex flex-col h-full pb-6 bg-container-gray shadow-inner"> 2472 <template x-if="isLoading && $store.externalScriptsInit"> 2473 <div class="absolute bg-white/60 z-10 h-full w-full flex items-center justify-center"> 2474 <div class="flex items-center"> 2475 <!-- loading icon --> 2476 <svg class="animate-spin h-5 w-5 text-gray-600" xmlns="http://www.w3.org/2000/svg" fill="none"
2477 viewBox="0 0 24 24"> 2478 <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle> 2479 <path class="opacity-75" fill="currentColor" 2480 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"> 2481 </path> 2482 </svg> 2483 <!-- end loading icon --> 2484 </div> 2485 </div> 2486</template> 2487 <div x-ref="dialogContent" class="h-full overflow-y-auto scrollbar scrollbar-thin scrollbar-track-transparent scrollbar-thumb-gray-3 w-full"> 2488 <template x-cloak x-for="(item, index) in menuData" :key="index"> 2489 <div class="level-1" :class="item.classes" @click="onMouseEnter(item, null, true)"> 2490 <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" 2491 :class="[ item.classes? item.classes.join(' '): '', isPanelActive(item.id)? 'fill-primary bg-tertiary-darker/10' : '']" 2492 :style="{ color: item.color }" 2493 > 2494 <div class="ml-auto w-full max-w-[246px] flex items-center"> 2495 <template x-if="item.icon"> 2496 <template x-if="item.icon_content"> 2497 <span x-html="item.icon_content" class='menu-icon mr-2.5 inline-block'></span> 2498 </template> 2499 <template x-if="!item.icon_content"> 2500 <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> 2501 </template> 2502 </template> 2503 <span x-text="item.label"></span> 2504 <template x-if="hasSubmenu(item)"> 2505 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.24 24" class="ml-auto" width="12" height="12" role="img"> 2506 <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"/> 2507<title>arrow-right</title></svg> 2508 </template> 2509 </div> 2510 </div> 2511 <template x-if="hasSubmenu(item)"> 2512 <template x-teleport="#main-menu-second-level_6ac8c77d1c956" x-data="{ submenu: item.submenu, item: item}"> 2513 <div class="absolute top-0 left-0 h-[calc(100vh-100px)] z-10 px-6 py-2 pb-16 bg-white shadow-lg level1" 2514 x-init="$watch('open',(value, oldValue) => { !value && clearPanelActiveId() })" 2515 :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]') ]" 2516 x-show="isPanelActive(item.id)" 2517 x-transition:enter="transform transition ease-in-out duration-300" 2518 x-transition:enter-start="-translate-x-full" 2519 x-transition:enter-end="translate-x-0" 2520 x-transition:leave="transform transition ease-in-out duration-300" 2521 x-transition:leave-start="translate-x-0" 2522 x-transition:leave-end="-translate-x-full" 2523 > 2524 <template x-if="submenu.t"> 2525 <div class="top_block column"> 2526 <div class="column-content" x-html="submenu.t"></div> 2527 </div> 2528 </template> 2529 <template x-if="submenu.l"> 2530 <div class="left_block column"> 2531 <div class="column-content" x-html="submenu.l"></div> 2532 </div> 2533 </template> 2534 2535 <template x-if="submenu.children" x-data="{ children: submenu.children }"> 2536 <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" 2537 :class="{ 'col
2537-span-3 flex gap-2': ((!submenu.r && submenu.l) || (!submenu.l && submenu.r)) || (submenu.children && submenu.children.length > 1) }" 2538 > 2539 <template x-for="(column,y) in children" :key="y"> 2540 <div :class="{ 'w-[210px] xl:w-[240px]' : y != children.length - 1, 'w-[210px] xl:w-[317px]': y == children.length - 1 }"> 2541 <template x-if="item.label && y == 0"> 2542 <div class="flex justify-between gap-3"> 2543 <span class="font-bold text-primary mb-3 block" x-text="item.label"></span> 2544 <a x-bind:href="item.link" class="hover:underline text-sm text-secondary flex items-center gap-1 -top-1.5 relative"> 2545 <span class="leading-none">Vedi tutti</span> 2546 <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"> 2547 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 2548<title>chevron-right</title></svg> 2549 </a> 2550 </div> 2551 </template> 2552 <template x-if="column.label && y != 0"> 2553 <span class="font-bold text-primary mb-3 block" x-text="column.label"></span> 2554 </template> 2555 <template x-if="column.html"> 2556 <div x-html="column.html"></div> 2557 </template> 2558 <template x-if="!column.html"> 2559 <template x-for="(child, i) in column" :key="i"> 2560 <div class="relative block w-full"> 2561 <template x-if="child.type == 'header'"> 2562 <div class="font-bold text-primary mb-3 block" x-text="child.label"></div> 2563 </template> 2564 <template x-if="child.type != 'header'"> 2565 <template x-if="child.type != 'custom_list'"> 2566 <div class="relative block w-full py-0.5 my-0.5" :class="child.classes"> 2567 <template x-if="child.html"> 2568 <div x-html="child.html"></div> 2569 </template> 2570 <template x-if="!child.html && child.type != 'custom_list'"> 2571 <a x-bind:href="child.link" class="hover:underline text-sm"> 2572 <span x-text="child.label"></span> 2573 </a> 2574 </template> 2575 </div> 2576 </template> 2577 <template x-if="child.type == 'custom_list'"> 2578 <div class="brand-list"> 2579 <sp
2579an class="font-bold text-primary mb-4 block" x-text="child.label"></span> 2580 <template x-for="(brand, i) in child.children" :key="i"> 2581 <div class="relative block w-full py-0.5 mt-0.5 brand-item"> 2582 <a x-bind:href="brand.link" class="hover:underline"> 2583 <span x-text="brand.label"></span> 2584 </a> 2585 </div> 2586 </template> 2587 </div> 2588 </template> 2589 </template> 2590 </div> 2591 </template> 2592 </template> 2593 </div> 2594 </template> 2595 </div> 2596 </template> 2597 2598 <template x-if="submenu.r"> 2599 <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" 2600 x-show="isPanelActive(item.id)" 2601 :class="(submenu.children && submenu.children.length < 1)? 'col-span-3' : 'col-span-2'" 2602 x-transition:enter="ease-in-out duration-700" 2603 x-transition:enter-start="opacity-0" 2604 x-transition:enter-end="opacity-100" 2605 x-transition:leave="ease-in-out duration-100" 2606 x-transition:leave-start="opacity-100" 2607 x-transition:leave-end="opacity-0" 2608 > 2609 <div class="column-content" x-html="submenu.r"></div> 2610 </div> 2611 2612 2613 </template> 2614 <template x-if="submenu.b"> 2615 <div class="bottom_block column"> 2616 <div class="column-content" x-html="submenu.b"></div> 2617 </div> 2618 </template> 2619 </div> 2620 </template> 2621 </template> 2622 </div> 2623 </template> 2624 </div> 2625 </div> 2626 </div> 2627 <div id="main-menu-second-level_6ac8c77d1c956" class="relative z-10 w-screen h-[calc(100vh-100px)]" 2628 x-show="open"> 2629 <div class="backdrop" 2630 x-ref="backdrop" 2631 x-show="open" 2632 x-transition:enter="ease-in-out duration-500" 2633 x-transition:enter-start="opacity-0" 2634 x-transition:enter-end="opacity-100" 2635 x-transition:leave="ease-in-out duration-500" 2636 x-transition:leave-start="opacity-100" 2637 x-transition:leave-end="opacity-0" 2638 @click="open=false" 2639 aria-label="Close panel"></div> 2640 </div> 2641 </div> 2642 </section> 2643 </template> 2644</div> 2645
2646<script> 2647 'use strict'; 2648 2649 const initMenuDesktop_6ac8c77d1c956 = () => { 2650 return { 2651 isActive: false, 2652 open: false, 2653 hoverPanelActiveId: [], 2654 menuData: null, 2655 isLoading: false, 2656 currentUrl: window.location.href.split('?')[0], 2657 panelLevel: 0, 2658 isPanelActive(id){ 2659 return this.hoverPanelActiveId.includes(id); 2660 }, 2661 setPanelActiveId(id, replace = false){ 2662 if(replace){ 2663 this.clearPanelActiveId(); 2664 } 2665 if(!this.isPanelActive(id)) 2666 this.hoverPanelActiveId.push(id); 2667 }, 2668 removePanelActiveId(id){ 2669 let i = this.hoverPanelActiveId.indexOf(id); 2670 if(i >= 0) 2671 this.hoverPanelActiveId.splice(i, 1); 2672 }, 2673 clearPanelActiveId(){ 2674 this.hoverPanelActiveId =[]; 2675 }, 2676 onMouseEnter(item, id = null, clear = false){ 2677 if(this.hasSubmenu(item)){ 2678 this.setPanelActiveId(id? id : item.id, clear); 2679 }else{ 2680 this.clearPanelActiveId(); 2681 } 2682 }, 2683 hasSubmenu(item){ 2684 return item.submenu; 2685 },
2686 setActiveMenu(menuNode) { 2687 return; // ignoriamo questa funzionalità per questo progetto 2688 Array.from(menuNode.querySelectorAll('a')).filter(link => { 2689 return (link.href) && link.href === this.currentUrl; 2690 }).map(item => { 2691 item.classList.add('underline'); 2692 item.closest('div.level1') && 2693 item.closest('div.level1').querySelector('a').classList.add('underline'); 2694 }); 2695 }, 2696 dispatchMessage(type, message, timeout) { 2697 typeof window.dispatchMessages && window.dispatchMessages( 2698 [{ 2699 type: type, 2700 text: message, 2701 }], 2702 timeout 2703 ); 2704 }, 2705 setMenuStyles () { 2706 let header = document.querySelector('#header .content'); 2707 let headerContent = header.querySelector('.container'); 2708 let headerContentStyle = window.getComputedStyle(headerContent); 2709 2710 const topDialog = (header.offsetHeight + header.getBoundingClientRect().top) + 'px'; 2711 this.$refs.dialog.style.top = topDialog; 2712 this.$refs.backdrop.style.top = topDialog; 2713 this.$refs.dialogContainer.style.width = 2714 (parseInt(headerContentStyle.marginLeft) + parseInt(headerContentStyle.paddingLeft) + 282) + 'px'; 2715 }, 2716 fetchData(){ 2717 // Calculate offset top 2718 this.setMenuStyles(); 2719 // Fetch data 2720 this.$dispatch('screen-lock',this.open); 2721 if(!this.menuData && this.open){ 2722 this.isLoading = true; 2723 fetch( 2724 'https://www.farma.it/megamenu/get/json/id/1/limit/0/level/1/?1791543165', 2725 { 2726 headers: {contentType: 'application/json'}, 2727 } 2728 ).then(response => { 2729 if (response.ok) { 2730 return response.json(); 2731 } else { 2732 this.dispatchMessage('error', response.statusText); 2733 console.warn("GET request failed", response); 2734 } 2735 }) 2736 .then(data => { 2737 this.menuData = data; 2738 this.isLoading = false; 2739 this.$nextTick(() => { 2740 this.setActiveMenu(document.getElementById('main-menu-second-level_6ac8c77d1c956')); 2741 }); 2742 }); 2743 } 2744 } 2745 } 2746 } 2747</script>
2747 2748 2749 <!-- Search --> 2750 <div class="order-4 lg:order-3 w-full lg:w-auto lg:flex-1" 2751 :class="searchOpened ? 'z-40': ''" 2752 id="search-content" 2753 > 2754 <div class="mx-auto my-3 lg:my-0 search-container"> 2755 <div class="supercontainer"> 2756 <div id="algoliaAutocomplete" class="block block-search algolia-search-block algolia-search-input container py-2 mx-auto text-black hidden" ></div> 2757 <div id="panelContainer" class="relative" x-data="initAutocompleteInsight"></div> 2758 <div id="menu-open-search" class="control relative lg:mx-10" > 2759 <label for="search" class="block relative cursor-text"> 2760 <div class="input-search form-input pl-[38px] py-2 h-[36px] flex items-center" aria-hidden="true"> 2761 <span>Cerca allâinterno della farmacia</span> 2762 </div> 2763 <div class="absolute top-0 left-0 py-2.5 lg:py-3 px-4 h-[42px] lg:h-[46px] pointer-events-none"> 2764 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14" role="img"> 2765 <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"/> 2766<title>search</title></svg> 2767 </div> 2768 </label> 2769 </div> 2770 2771 <!-- Close button (left arrow on mobile, X on desktop) --> 2772 <button id="close-instant-search" 2773 type="button" 2774 class="instant-search-close" 2775 aria-label="Close search" 2776 title="Close search"> 2777 <span class="icon-x"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" role="img"> 2778 <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"/> 2779<title>x</title></svg> 2780</span> 2781 <span class="icon-arrow"> 2782 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20.57" width="12" height="12"> 2783 <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"/> 2784 </svg> 2785 </span> 2786 </button> 2787 2788 <!-- Reset button (clears input) shown on mobile --> 2789 <button id="reset-instant-search" 2790 class="reset-instant-search" 2791 aria-label="Clear search" 2792 title="Clear search"> 2793 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12" role="img"> 2794 <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"/> 2795<title>x</title></svg> 2796 </button> 2797 2798 <div id="menu-search-icon" class="control relative"> 2799 <input id="search" 2800 x-ref="searchInput" 2801 type="search" 2802 enterkeyhint="search" 2803 inputmode="search" 2804 autocomplete="off" 2805 name="q" 2806 placeholder="Cerca all’interno della farmacia" 2807 maxlength="128" 2808 class="input-search form-input pl-[45px] lg:pl-[38px] py-2 h-[53px]" 2809 /> 2810 <div class="hidden lg:block absolute top-[9px] left-0 py-2.5 px-4 h-[42px] lg:h-[46px]"> 2811 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14" role="img">
2812 <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"/> 2813<title>search</title></svg> 2814 </div> 2815 </div> 2816 <div id="view-all-products" class="lg:hidden border-t"> 2817 <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');}"> 2818 Vedi tutti i <span id="aa-count-mobile" class="mx-1"></span> prodotti 2819 </button> 2820 </div> 2821 </div> 2822 </div> 2823 2824
2824<script> 2825 'use strict'; 2826 2827 function initAutocompleteInsight() { 2828 return { 2829 bindClickEvent(element, eventName, objectID, indexName, position, queryId) { 2830 try { 2831 element.querySelector('.algoliasearch-autocomplete-hit')?.addEventListener("click", function () { 2832 buildInsightsEventData(eventName, objectID, indexName, position, queryId); 2833 }); 2834 } catch (e) {} 2835 } 2836 } 2837 } 2838 2839 document.addEventListener('DOMContentLoaded', function() { 2840 const searchEl = document.getElementById('search'); 2841 if (!searchEl) return; 2842 2843 // delegate Enter/mobile submit logic to autocomplete.js bindings 2844 searchEl.addEventListener('click', function () { 2845 setTimeout(function () { 2846 // After aa-Input is available, keep it in sync with #search value 2847 function syncAaInput() { 2848 const currentAaInput = document.querySelector('.aa-Input'); 2849 if (!currentAaInput || !('value' in currentAaInput)) return; 2850 const newVal = searchEl.value ?? ''; 2851 if (currentAaInput.value !== newVal) { 2852 currentAaInput.value = newVal; 2853 // Notify Algolia/autocomplete about the programmatic change 2854 currentAaInput.dispatchEvent(new Event('input', { bubbles: true })); 2855 currentAaInput.dispatchEvent(new Event('change', { bubbles: true })); 2856 } 2857 } 2858 2859 // Initial sync once available 2860 syncAaInput(); 2861 // Keep syncing as the user types or changes the field 2862 searchEl.addEventListener('input', syncAaInput); 2863 searchEl.addEventListener('change', syncAaInput); 2864 }, 100); 2865 }); 2866 }); 2867 </script>
2867 2868
2868<script> 2869 // Immediately apply open classes and show backdrop on click of #menu-open-search 2870 document.addEventListener('DOMContentLoaded', function() { 2871 var openTrigger = document.getElementById('menu-open-search'); 2872 if (openTrigger) { 2873 openTrigger.addEventListener('click', function () { 2874 try { 2875 var panelContainer = document.getElementById('panelContainer'); 2876 var searchWrapper = document.getElementById('menu-search-icon'); 2877 var searchContainer = document.querySelector('.search-container'); 2878 var aaPanel = document.querySelector('.aa-Panel'); 2879 var bodyEl = document.body; 2880 2881 if (panelContainer) panelContainer.classList.add('is-open'); 2882 if (searchWrapper) searchWrapper.classList.add('is-open'); 2883 if (searchContainer) searchContainer.classList.add('is-open'); 2884 if (aaPanel) aaPanel.classList.add('is-open'); 2885 if (bodyEl) bodyEl.classList.add('max-h-screen', 'lock-screen', 'overflow-hidden', 'instant-lock'); 2886 2887 // Pz8 per evitare flickering della ricerca 2888 (function triggerSearchClicksOnce(el) { 2889 if (!el) return; 2890 2891 if (window.__algoliaSearchClicksTriggered) return; 2892 window.__algoliaSearchClicksTriggered = true; 2893 for (let i = 0; i < 100; i++) { 2894 setTimeout(function () { 2895 let panel = document.querySelector('.aa-PanelLayout'); 2896 if (panel) { 2897 i = 100; 2898 return; 2899 } 2900 if (window.__algoliaSearchClicksTriggered) { 2901 el.click(); 2902 } 2903 2904 }, i * 5); 2905 } 2906 })(document.getElementById('search')); 2907 } catch (e) { 2908 // swallow errors 2909 } 2910 }); 2911 } 2912 2913 }); 2914 </script>
2914 2915
2915<script> 2916 // Toggle 'is-empty' on .search-container only on 'change' when input remains empty and there are results 2917 document.addEventListener('DOMContentLoaded', function() { 2918 var searchContainer = document.querySelector('.search-container'); 2919 if (!searchContainer) return; 2920 2921 function handleChange(e) { 2922 try { 2923 var val = (e && e.target && typeof e.target.value === 'string') ? e.target.value.trim() : ''; 2924 if (val === '' && searchContainer.classList.contains('has-results')) { 2925 searchContainer.classList.add('is-empty'); 2926 } else { 2927 searchContainer.classList.remove('is-empty'); 2928 } 2929 } catch (err) { 2930 // no-op 2931 } 2932 } 2933 2934 // Native search input 2935 var nativeInput = document.getElementById('search'); 2936 if (nativeInput) { 2937 nativeInput.addEventListener('change', handleChange, { passive: true }); 2938 } 2939 2940 // Algolia injected input may appear later; observe and bind once when present 2941 var aaBound = false; 2942 var tryBindAa = function() { 2943 if (aaBound) return; 2944 var aaInput = document.querySelector('.aa-Input'); 2945 if (aaInput) { 2946 aaInput.addEventListener('change', handleChange, { passive: true }); 2947 aaBound = true; 2948 } 2949 }; 2950 // Try now and a little later in case of async initialization 2951 tryBindAa(); 2952 var aaInterval = setInterval(function(){ 2953 if (aaBound) { clearInterval(aaInterval); return; } 2954 tryBindAa(); 2955 }, 200); 2956 setTimeout(function(){ clearInterval(aaInterval); }, 6000); 2957 }); 2958 </script>
2958 2959 </div> 2960 2961 <!-- Buttons --> 2962 <div class="flex items-center gap-4 lg:gap-8 order-3 ml-3 lg:ml-0 lg:order-4"> 2963 <!-- Static Block --> 2964 <div class="hidden lg:block"> 2965 <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"> 2966 <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24" width="20" height="20" role="img"> 2967 <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> 2968<title>heroicons/outline/phone</title></svg> 2969 2970 <div class="text-xs font-medium">Richiamami</div> 2971 </a></div> </div> 2972 2973 <!-- Customer Icon & Dropdown --> 2974 <!-- BLOCK header.customer --> 2975<div x-data="initHeaderCustomerMenu()" @private-content-loaded.window="getData(event.detail.data)"> 2976 2977 <template x-if="isLoggedIn()"> 2978 <a 2979 href="https://www.farma.it/customer/account/" 2980 id="customer-menu" 2981 class="flex items-center gap-2 hover:underline" 2982 aria-label="Il mio Account" 2983 > 2984 <span class="relative block"> 2985 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"> 2986 <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"/> 2987</svg> 2988 <span x-text="customer.firstname.charAt(0)" 2989 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" 2990 >0</span> 2991 </span> 2992 <span class="label hidden lg:block text-xs truncate text-center w-full leading-none font-medium"> 2993 <span>Ciao, </span> 2994 <span x-text="customer.firstname"></span> 2995 </span> 2996 </a> 2997 </template> 2998 2999 <template x-if="!isLoggedIn()"> 3000 <span> 3001 <a 3002 href="https://www.farma.it/customer/account/" 3003 id="customer-menu" 3004 class="flex items-center gap-2 hover:underline" 3005 aria-label="Il mio Account" 3006 > 3007 <span class="relative block"> 3008 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"> 3009 <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"/> 3010</svg> 3011 </span>
3012 <span class="label hidden lg:block text-xs truncate text-center w-full leading-none font-medium"> 3013 <span>Accedi / Registrati</span> 3014 </span> 3015 </a> 3016 </span> 3017 </template> 3018</div>
3019<script> 3020 function initHeaderCustomerMenu() { 3021 return { 3022 open: false, 3023 customer: {}, 3024 getData(data) { 3025 if (data.customer) { this.customer = data.customer } 3026 }, 3027 isLoggedIn(){ 3028 return !!(this.customer.firstname); 3029 } 3030 } 3031 } 3032</script>
3032 3033<!-- /BLOCK header.customer --> 3034 <!-- Wishlist Icon --> 3035 3036<a 3037 href="https://www.farma.it/wishlist/" 3038 class="relative hidden md:inline-flex btn bg-transparent border-transparent p-1" 3039 x-data="initWishlistHeader" 3040 @private-content-loaded.window="receiveWishlistData" 3041 aria-label="La mia lista desideri" 3042 :aria-label="linkAriaLabel" 3043> 3044 <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> 3045 <template x-if="itemCount"> 3046 <span 3047 x-text="itemCount" 3048 class="absolute -top-1.5 -right-1.5 px-2 py-1 rounded-full bg-primary text-on-primary text-xs 3049 font-semibold leading-none text-center uppercase tabular-nums" 3050 aria-hidden="true" 3051 ></span> 3052 </template> 3053</a> 3054
3055<script> 3056 function initWishlistHeader() { 3057 return { 3058 wishlistProducts: null, 3059 itemCount: 0, 3060 linkAriaLabel() { 3061 const countLabel = this.itemCount > 1 3062 ? hyva.str('\u00251\u0020elementi', this.itemCount) 3063 : hyva.str('\u00251\u0020elemento', this.itemCount); 3064 return `Wishlist\u0020Products (${countLabel})`; 3065 }, 3066 receiveWishlistData() { 3067 const data = this.$event.detail.data; 3068 this.itemCount = data.wishlist ? parseInt(data.wishlist.counter) : 0; 3069 } 3070 } 3071 } 3072 3073 window.addEventListener('alpine:init', () => { 3074 Alpine.data('initWishlistHeader', initWishlistHeader); 3075 }, { once: true }) 3076</script>
3076 3077 3078 <!-- Cart Icon --> 3079 <a id="menu-cart-icon" 3080 @click.prevent.stop="$dispatch('toggle-cart',{});" class="flex items-center gap-2 hover:underline" 3081 href="https://www.farma.it/checkout/cart/index/" 3082 > 3083 <span class="relative block"> 3084 <svg xmlns="http://www.w3.org/2000/svg" id="Livello_1" viewBox="0 0 22.79 24" width="20" height="20" role="img"> 3085 <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"/> 3086<title>shopping-cart</title></svg> 3087 <span x-text="getCartItemsCountLabel" 3088 class="absolute top-[-6px] right-[1px] text-xxs font-bold text-center text-sale rounded-full" 3089 >0</span> 3090 </span> 3091 <span class="header-subtotal label hidden lg:inline text-sm leading-none font-bold">0,00 â¬</span> 3092 </a> 3093 </div> 3094 </div> 3095 </div> 3096 3097 <!-- Cart Drawer --> 3098
3098<script> 3099 function initCartDrawer() { 3100 return { 3101 open: false, 3102 isLoading: false, 3103 cart: {}, 3104 maxItemsToDisplay: 10, 3105 itemsCount: 0, 3106 totalCartAmount: 0, 3107 headerSubtotal: null, 3108 headerSubtotalSelector: '.header-subtotal', 3109 groupedData: {}, 3110 3111 itemsCountLabel(){ 3112 return (this.itemsCount > 99)? '99+' : `${this.itemsCount}`; 3113 }, 3114 isVisible(){ 3115 return (this.open && this.itemsCount > 0) 3116 }, 3117 getData(data) { 3118 if (data.cart) { 3119 this.cart = data.cart; 3120 this.itemsCount = data.cart.items && data.cart.items.length || 0; 3121 this.totalCartAmount = this.cart.summary_count; 3122 this.setCartItems(); 3123 this.initGroupedData() 3124 } 3125 this.isLoading = false; 3126 }, 3127 cartItems: [], 3128 getItemCountTitle() { 3129 return hyva.strf('(%0 di %1)', this.maxItemsToDisplay, this.itemsCount) 3130 }, 3131 getHeaderSubtotal() { 3132 if (!this.headerSubtotal) { 3133 this.headerSubtotal = document.querySelector(this.headerSubtotalSelector); 3134 } 3135 3136 return this.headerSubtotal; 3137 }, 3138 setCartItems() { 3139 this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; 3140 3141 if (this.maxItemsToDisplay > 0) { 3142 this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); 3143 } 3144 3145 try { 3146 var subtotal = (this.cart?.subtotal_incl_tax_discounted) ? this.cart.subtotal_incl_tax_discounted : this.cart.subtotal; 3147 if (subtotal) { 3148 this.getHeaderSubtotal().innerHTML = subtotal; 3149 } 3150 } catch (e) {} 3151 }, 3152 initGroupedData() { 3153 let self = this; 3154 try { 3155 Object.values(this.cart['fake_grouped_parents']).forEac
3155h(function (parent) { 3156 let price = 0.0000, 3157 productIds = parent.product_ids.split(','), 3158 groupedId = parent['grouped_id']; 3159 self.groupedData[groupedId] = { 3160 'price': price, 3161 'items': [] 3162 }; 3163 productIds.forEach(function (productId) { 3164 let product = self.cart.items.find((item) => item.product_id == productId); 3165 if (product) { 3166 self.groupedData[groupedId]['items'].push({ 3167 'name': product['product_name'], 3168 'qty': product['qty'] 3169 }); 3170 price += product['product_price_value'] * product['qty']; 3171 } 3172 }) 3173 self.groupedData[groupedId]['price'] = hyva.formatPrice(price, false); 3174 }) 3175 } catch (e) {} 3176 console.log(this.groupedData); 3177 }, 3178 deleteItemFromCart(itemId) { 3179 this.isLoading = true; 3180 3181 const formKey = hyva.getFormKey(); 3182 const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; 3183 3184 fetch(postUrl, { 3185 "headers": { 3186 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 3187 }, 3188 "body": "form_key=" + formKey + "&item_id=" + itemId, 3189 "method": "POST", 3190 "mode": "cors", 3191 "credentials": "include" 3192 }).then(response => { 3193 if (response.redirected) { 3194 window.location.href = response.url; 3195 } else if (response.ok) { 3196 return response.json(); 3197 } else { 3198 window.dispatchMessages && window.dispatchMessages([{ 3199 type: 'warning', 3200 text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' 3201 }]); 3202 this.isLoading = false; 3203 } 3204 }).then(result => { 3205 window.dispatchMessages && window.dispatchMessages([{ 3206 type: result.success ? 'success' : 'error', 3207 text: result.success 3208 ? 'Hai\u0020rimosso\u0020il\u0020prodotto.' 3209 : result.error_message 3210 }], result.success ? 5000 : 0) 3211 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 3212 }); 3213 }, 3214 deleteGroupedFromCart(groupedId) { 3215 let deleteButton = document.querySelector('#cart-drawer [data-grouped-id="' + groupedId + '"] .delete'); 3216 if (deleteButton) { 3217 deleteButton.click(); 3218 } 3219 }, 3220 getGroupedPrice(groupedId) { 3221 return this.groupedData[groupedId]['price']; 3222 } 3223 } 3224 } 3225</script>
3225 3226<section id="cart-drawer" 3227 x-data="initCartDrawer()" 3228 x-init="$watch('isVisible', value => $dispatch('screen-lock', value))" 3229 @private-content-loaded.window="getData($event.detail.data)" 3230 @toggle-cart.window="if(itemsCount > 0){open=true}" 3231 @keydown.window.escape="open=false" 3232 @cart-loading-start.window="isLoading=true" 3233 @cart-loading-stop.window="isLoading=false" 3234> 3235 <template x-if="cart && cart.summary_count"> 3236 <div role="dialog" 3237 aria-labelledby="cart-drawer-title" 3238 aria-modal="true" 3239 @click.outside="open=false" 3240 class="fixed inset-y-0 right-0 z-30 flex max-w-full"> 3241 <div class="backdrop" 3242 x-show="open" 3243 x-transition:enter="ease-in-out duration-500" 3244 x-transition:enter-start="opacity-0" 3245 x-transition:enter-end="opacity-100" 3246 x-transition:leave="ease-in-out duration-500" 3247 x-transition:leave-start="opacity-100" 3248 x-transition:leave-end="opacity-0" 3249 @click="open=false" 3250 aria-label="Close panel"></div> 3251 <div class="relative w-screen max-w-[470px] shadow-2xl" 3252 x-show="open" 3253 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 3254 x-transition:enter-start="translate-x-full" 3255 x-transition:enter-end="translate-x-0" 3256 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 3257 x-transition:leave-start="translate-x-0" 3258 x-transition:leave-end="translate-x-full" 3259 > 3260 <div 3261 x-show="open" 3262 x-transition:enter="ease-in-out duration-500" 3263 x-transition:enter-start="opacity-0" 3264 x-transition:enter-end="opacity-100" 3265 x-transition:leave="ease-in-out duration-500" 3266 x-transition:leave-start="opacity-100" 3267 x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2 mt-2"> 3268 <button @click="open=false" aria-label="Close panel" 3269 class="p-2 text-primary transition duration-150 ease-in-out hover:text-secondary"> 3270 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" role="img"> 3271 <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"/> 3272<title>x</title></svg> 3273 </button> 3274 </div> 3275 <div class="flex flex-col h-screen h-[100dvh] py-6 space-y-6 bg-white shadow-xl"> 3276 3277 <header class="px-4 sm:px-6"> 3278 <h2 id="cart-drawer-title" class="text-xl font-bold leading-6 text-primary"> 3279 Carrello <span class="items-total font-normal" 3280 x-text="'(' + totalCartAmount + ')'"> 3281 </span> 3282 </h2> 3283 </header> 3284 3285 3286 <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"> 3287 <template x-for="parent in cart.fake_grouped_parents"> 3288 <div class="flex items-start p-3 -m-3 space-x-4"> 3289 <a :href="parent.url" class="w-1/4"> 3290 <img 3291 :src="parent.image" 3292 width="78" 3293 height="78" 3294 loading="lazy" 3295 /> 3296 </a> 3297 <div class="w-3/4"> 3298 <div> 3299 <p class="text-sm">
3300 <span x-html="parent.name"></span> 3301 </p> 3302 </div> 3303 <div class="mt-2"> 3304 <template x-for="child_item in groupedData[parent.grouped_id].items"> 3305 <div class="font-body-sm font-sm text-gray-1"> 3306 <span x-html="child_item.qty + 'x ' + child_item.name"></span> 3307 </div> 3308 </template> 3309 </div> 3310 <p class="flex mt-2"> 3311 <span> 3312 <span class="price-including-tax"> 3313 <span class="minicart-price"> 3314 <span class="price" x-html="getGroupedPrice(parent.grouped_id)"></span> 3315 </span> 3316 </span> 3317 </span> 3318 </p> 3319 <div class="pt-2 mt-2"> 3320 <button class="inline-flex p-2 btn shadow-none bg-container-darker text-primary hover:shadow-lg hover:bg-secondary/10" 3321 @click="deleteGroupedFromCart(parent.grouped_id)" 3322 > 3323 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21.96 24" class="p-0.5" width="20" height="20" role="img"> 3324 <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"/> 3325<title>trash</title></svg> 3326 </button> 3327 </div> 3328 </div> 3329 </div> 3330 </template> 3331 <template x-for="item in cartItems"> 3332 <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"> 3333 <a :href="item.product_url" class="w-1/4"> 3334 <img 3335 :src="item.product_image.src" 3336 :width="item.product_image.width" 3337 :height="item.product_image.height" 3338 loading="lazy" 3339 /> 3340 </a> 3341 <div class="w-3/4 space-y-2"> 3342 <div> 3343 <p class="text-sm"> 3344 <span x-html="item.product_name"></span> 3345 </p> 3346 <p class="text-xs sr-only"><span x-html="item.product_sku"></span></p> 3347 </div> 3348 <template x-for="(option, i) in item.options"> 3349 <span class="text-xxs text-primary-lighter inline-block before:inline-block before:mx-1 before:content-['-']" 3350 x-html="option.value" 3351 :class="{ 'before:content-none before:hidden': i == 0 }" 3352 ></span> 3353 </template> 3354 <div class="font-body-sm font-sm inline text-gray-1"> 3355 Quantità : <sp
3355an x-html="item.qty"></span> 3356 </div> 3357 <p class="flex"> 3358 <span x-html="item.product_price"></span> 3359 <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> 3360 </p> 3361 <div class="pt-2"> 3362 <a :href="item.configure_url" 3363 x-show="item.product_type !== 'grouped'" 3364 class="inline-flex p-2 mr-2 btn shadow-none bg-container-darker text-primary hover:shadow-lg hover:bg-secondary/10"> 3365 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="p-0.5" width="20" height="20" role="img"> 3366 <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"/> 3367<title>Modifica</title></svg> 3368 </a> 3369 <button class="delete inline-flex p-2 btn shadow-none bg-container-darker text-primary hover:shadow-lg hover:bg-secondary/10" 3370 @click="deleteItemFromCart(item.item_id)" 3371 > 3372 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 21.96 24" class="p-0.5" width="20" height="20" role="img"> 3373 <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"/> 3374<title>Elimina</title></svg> 3375 </button> 3376 </div> 3377 3378 </div> 3379 </div> 3380 </template> 3381 </div> 3382 3383 3384 <div class="relative grid gap-6 px-4 pt-6 bg-white sm:gap-8 sm:px-6 !mt-auto"> 3385 <div class="w-full p-3 -m-3 space-x-4 text-right"> 3386 <p>Subtotale: <span class="font-bold text-xl" x-html="cart.subtotal_incl_tax_discounted"></span></p> 3387 </div> 3388 <div class="w-full p-3 -m-3 space-y-3"> 3389 <a href="https://www.farma.it/checkout/cart/" 3390 class="block btn btn-primary"> 3391 Vai al Carrello </a> 3392 </div> 3393 </div> 3394 3395 </div> 3396 </div> 3397 3398<div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" 3399 style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgb(255 255 255/0.60);" 3400 x-show="isLoading" 3401 x-transition:enter="ease-out duration-200" 3402 x-transition:enter-start="opacity-0" 3403 x-transition:enter-end="opacity-100" 3404 x-transition:leave="ease-in duration-200" 3405 x-transition:leave-start="opacity-100" 3406 x-transition:leave-end="opacity-0"> 3407 <svg xmlns="http://www.w3.org/2000/svg" width="57" height="57" viewBox="0 0 38 38" stroke="#ffb590" class="text-primary" role="img"> 3408 <g fill="none" fill-rule="evenodd"> 3409 <g transform="translate(1 1)" stroke-width="2"> 3410 <circle stroke="#ff6801" cx="18" cy="18" r="18"/> 3411 <path d="M36 18c0-9.94-8.06-18-18-18"> 3412 <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indef
3412inite"/> 3413 </path> 3414 </g> 3415 </g> 3416<title>loader</title></svg> 3417</div> 3418 </div> 3419 </template> 3420</section> 3421 3422 <!-- Authentication Pop-Up --> 3423 <!-- BLOCK authentication-popup -->
3423<script> 3424 function initAuthentication() { 3425 return { 3426 open: false, 3427 forceAuthentication: false, 3428 checkoutUrl: 'https://www.farma.it/checkout/index/', 3429 errors: 0, 3430 hasCaptchaToken: 0, 3431 displayErrorMessage: false, 3432 errorMessages: [], 3433 setErrorMessages: function setErrorMessages(messages) { 3434 this.errorMessages = [messages]; 3435 this.displayErrorMessage = this.errorMessages.length; 3436 }, 3437 submitForm: function () { 3438 // Do not rename $form, the variable is expected to be declared in the recaptcha output 3439 const $form = document.querySelector('#login-form'); 3440 3441 if (this.errors === 0) { 3442 this.dispatchLoginRequest($form); 3443 } 3444 }, 3445 onPrivateContentLoaded: function (data) { 3446 const isLoggedIn = data.customer && data.customer.firstname; 3447 if (data.cart && !isLoggedIn) { 3448 this.forceAuthentication = !data.cart.isGuestCheckoutAllowed; 3449 } 3450 }, 3451 redirectIfAuthenticated: function (event) { 3452 if (event.detail && event.detail.url) { 3453 this.checkoutUrl = event.detail.url; 3454 } 3455 if (!this.forceAuthentication) { 3456 window.location.href = this.checkoutUrl; 3457 } 3458 }, 3459 dispatchLoginRequest: function(form) { 3460 this.isLoading = true; 3461 const username = this.$refs['customer-email'].value; 3462 const password = this.$refs['customer-password'].value; 3463 const formKey = hyva.getFormKey(); 3464 const bodyFields = { 3465 'username': username, 3466 'password': password, 3467 'formKey': formKey 3468 }; 3469 const fieldName = 'g\u002Drecaptcha\u002Dresponse'; 3470 const recaptchaField = fieldName && form[fieldName]; 3471 if (recaptchaField) { 3472 bodyFields[fieldName] = recaptchaField.value; 3473 } 3474 fetch('https://www.farma.it/customer/ajax/login/', { 3475 method: 'POST', 3476 headers: { 3477 'Content-Type': 'application/json', 3478 'X-Requested-With': 'XMLHttpRequest' 3479 }, 3480 body: JSON.stringify(bodyFields) 3481 } 3482 ).then(response => { 3483 return response.json() 3484 } 3485 ).then(data=> { 3486 this.isLoading = false; 3487 if (data.errors) { 3488 dispatchMessages([{ 3489 type: 'error', 3490 text: data.message 3491 }], 5000); 3492 this.errors = 1; 3493 this.hasCaptchaToken = 0; 3494 } else { 3495 window.location.href = this.checkoutUrl; 3496 } 3497 }); 3498 } 3499 } 3500 } 3501</script>
3501 3502<section id="authentication-popup" 3503 x-data="initAuthentication()" 3504 @private-content-loaded.window="onPrivateContentLoaded($event.detail.data)" 3505 @toggle-authentication.window="open = forceAuthentication; redirectIfAuthenticated(event)" 3506 @keydown.window.escape="open = false" 3507 class="hidden" 3508 :class="{ 'hidden': !open }" 3509> 3510 <div role="dialog" 3511 aria-labelledby="authentication-popup-title" 3512 aria-modal="true" 3513 @click.outside="open=false" 3514 class="fixed inset-y-0 right-0 z-50 flex max-w-full"> 3515 <div class="backdrop" 3516 x-show="open" 3517 x-transition:enter="ease-in-out duration-500" 3518 x-transition:enter-start="opacity-0" 3519 x-transition:enter-end="opacity-100" 3520 x-transition:leave="ease-in-out duration-500" 3521 x-transition:leave-start="opacity-100" 3522 x-transition:leave-end="opacity-0" 3523 @click="open=false" 3524 aria-label="Close panel"></div> 3525 <div class="relative w-screen max-w-[485px] shadow-2xl" 3526 x-show="open" 3527 x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700" 3528 x-transition:enter-start="translate-x-full" 3529 x-transition:enter-end="translate-x-0" 3530 x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700" 3531 x-transition:leave-start="translate-x-0" 3532 x-transition:leave-end="translate-x-full" 3533 > 3534 <div 3535 x-show="open" 3536 x-transition:enter="ease-in-out duration-500" 3537 x-transition:enter-start="opacity-0" 3538 x-transition:enter-end="opacity-100" 3539 x-transition:leave="ease-in-out duration-500" 3540 x-transition:leave-start="opacity-100" 3541 x-transition:leave-end="opacity-0" class="absolute top-0 right-0 flex p-2 mt-3 sm:mt-7 sm:mr-6"> 3542 <button @click="open=false" aria-label="Close panel" 3543 class="p-2 text-primary transition duration-150 ease-in-out hover:text-secondary"> 3544 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" role="img"> 3545 <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"/> 3546<title>x</title></svg> 3547 </button> 3548 </div> 3549 <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"> 3550 <header class="px-4"> 3551 <div id="authentication-popup-title" class="text-3xl font-bold leading-6 text-primary-darker"> 3552 Accedi o registrati </div> 3553 </header> 3554 <div class="block-customer-login bg-container border border-container mx-4 p-4 shadow-sm"> 3555 <p id="authenticate-customer-login" class="text-lg leading-7 text-gray-900"> 3556 <strong class="font-medium">Esegui il checkout utilizzando il tuo account</strong> 3557 </p> 3558 3559 <form class="form form-login" 3560 method="post" 3561 @submit.prevent="submitForm();" 3562 id="login-form" 3563 > 3564 <div class="fieldset login"> 3565 <div class="field email required"> 3566 <label class="label" for="form-login-username" form="login-form" > 3567 <span>Indirizzo email</span> 3568 </label> 3569 <div class="control"> 3570 <input name="username" 3571 id="form-login-username" 3572 x-ref="customer-email" 3573 @change="errors = 0" 3574 type="email" 3575 required 3576 class="form-input input-text" 3577 > 3578 </div> 3579 </div> 3580 <div class="field password required"> 3581 <label for="form-login-password" class="label" form="login-form">
3582 <span>Password</span> 3583 </label> 3584 <div class="control"> 3585 <input name="password" 3586 id="form-login-password" 3587 type="password" 3588 class="form-input input-text" 3589 required 3590 x-ref="customer-password" 3591 @change="errors = 0" 3592 > 3593 </div> 3594 </div> 3595 3596 <input name="context" type="hidden" value="checkout" /> 3597 <div class="actions-toolbar flex justify-between pt-6 pb-2 items-center"> 3598 <button type="submit" class="inline-flex btn btn-primary disabled:opacity-75" 3599 > 3600 Accedi </button> 3601 <a href="https://www.farma.it/customer/account/forgotpassword/" 3602 > 3603 Hai dimenticato la password? </a> 3604 </div> 3605 3606 </div> 3607 </form> 3608 </div> 3609 <div class="mx-4"> 3610 </div> 3611 <div class="block-new-customer bg-container border border-container mx-4 p-4 shadow-sm"> 3612 <p id="authenticate-new-customer" class="text-lg mb-2 leading-7 text-gray-900"> 3613 <strong class="font-medium">Esegui il checkout come nuovo cliente</strong> 3614 </p> 3615 3616 <div class="block-content"> 3617 <p class="mb-1"> 3618 La creazione di un account ha molti vantaggi: </p> 3619 <ul class="list-disc pl-5"> 3620 <li> Vedere lo stato dell'ordine e della spedizione</li> 3621 <li> Cronologia ordini</li> 3622 <li> Checkout più veloce</li> 3623 </ul> 3624 <div class="actions-toolbar flex justify-between mt-6 mb-2 items-center"> 3625 <a href="https://www.farma.it/customer/account/create/" 3626 class="inline-flex btn btn-primary"> 3627 Crea il tuo Account </a> 3628 </div> 3629 </div> 3630 </div> 3631 </div> 3632 </div> 3633 </div> 3634</section> 3635<!-- /BLOCK authentication-popup --></div> 3636 3637</header><div class="widget block block-static-block"> 3638 </div> 3639<div class="top-container flex flex-col"><nav class="breadcrumbs order-1 " aria-label="Breadcrumb"> 3640 <div class="container"> 3641 <ol class="items list-reset pt-4 flex flex-wrap text-grey-1 text-xxs "> 3642 <li class="item flex items-center home"> 3643 <a href="https://www.farma.it/" 3644 class="no-underline hover:underline " 3645 title="Vai alla Home Page" 3646 >Home</a> 3647 <span aria-hidden="true" class="separator text-primary"> 3648 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.24 24" class="p-2" width="24" height="24" role="img"> 3649 <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"/> 3650<title>arrow-right</title></svg> 3651 </span> 3652 </li> 3653 <li class="item flex items-center blog"> 3654 <a href="https://www.farma.it/blog.html" 3655 class="no-underline hover:underline " 3656 title="I nostri consigli" 3657 >I nostri consigli</a> 3658 </li> 3659 </ol> 3660 </div> 3661</nav> 3662<div class="widget block block-static-block"> 3663 </div> 3664</div>
3664<main id="maincontent" class="page-main"><div id="algolia-autocomplete-container"></div><div id="contentarea" tabindex="-1"></div> 3665<div class="page messages">
3665<script> 3666 function initMessages() { 3667 "use strict"; 3668 return { 3669 messages: window.mageMessages || [], 3670 3671 hideAfter: 4000, 3672 icons: { 3673 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>', 3674 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>', 3675 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>', 3676 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>', 3677 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>', 3678 }, 3679 3680 isEmpty() { 3681 return this.messages.reduce( 3682 function (isEmpty, message) { 3683 return isEmpty && message === undefined 3684 }, true 3685 ) 3686 }, 3687 removeMessage(messageIndex) { 3688 this.messages[messageIndex] = undefined; 3689 }, 3690 addMessages(messages, hideAfter) { 3691 messages.map((message) => { 3692 message.icon = this.icons[message.type]; 3693 this.messages = this.messages.concat(message); 3694 if (hideAfter) { 3695 this.setHideTimeOut(this.messages.length - 1, hideAfter); 3696 } 3697 }); 3698 }, 3699 setHideTimeOut(messageIndex, hideAfter) { 3700 setTimeout((messageIndex) => { 3701 this.removeMessage(messageIndex); 3702 }, hideAfter, messageIndex); 3703 }, 3704 animateMessage(elem) { 3705 if (elem) { 3706 if (window.matchMedia('(min-width: 1024px)').matches) { 3707 elem.classList.add('transition-all', 'duration-300'); 3708 elem.style.position = 'absolute'; 3709 const headerEl = document.querySelector('.header-elements'); 3710 elem.style.left = (headerEl ? headerEl.getBoundingClientRect().left : 0) + 'px'; 3711 elem.style.opacity = 1; 3712 3713 setTimeout(() => { 3714 elem.style.left = '0'; 3715 elem.style.opacity = 0; 3716 }, this.hideAfter - 300); 3717 } else { 3718 elem.style.left = '-400px'; 3719 elem.classList.add('transition-all', 'duration-300'); 3720 elem.style.opacity = 0; 3721 3722 setTimeout(() => { 3723 elem.style.left = '0'; 3724 elem.style.opacity = 1; 3725 }, 10); 3726 3727 setTimeout(() => { 3728 elem.style.left = '-400px'; 3729 elem.style.opacity = 0; 3730 }, this.hideAfter - 300); 3731 } 3732 } 3733 }, 3734 eventListeners: { 3735 ['@messages-loaded.window']() { 3736 this.addMessages(event.detail.messages, this.hideAfter) 3737 }, 3738 ['@private-content-loaded.window'](event) { 3739 const data = event.detail.data; 3740 if ( 3741 data.messages && 3742 data.messages.messages && 3743 data.messages.messages.length 3744 ) { 3745 this.addMessages(data.messages.messages, this.hideAfter); 3746 } 3747 }, 3748 ['@clear-messages.window']() { 3749 this.messages = []; 3750 } 3751 } 3752 } 3753 } 3754</script>
3754 3755<section id="messages" 3756 x-data="initMessages()" 3757 x-bind="eventListeners" 3758 class="absolute" 3759> 3760 <template x-if="!isEmpty()"> 3761 <div class="w-full"> 3762 <div role="alert" class="messages mx-auto py-3 pl-0 pr-[.938rem] lg:px-layoutGutter lg:px-0"> 3763 <template x-for="(message, index) in messages" :key="index"> 3764 <div> 3765 <template x-if="message"> 3766 <div class="message w-fit lg:min-w-[25rem] rounded-md relative" :class="message.type" 3767 :ui-id="'message-' + message.type" 3768 style="left: 0; max-width: 400px" 3769 x-init="animateMessage($el)" 3770 > 3771 <span x-html="message.icon" class="mr-3"></span> 3772 <span x-html="message.text" class="pr-2"></span> 3773 <a href="#" class="close cursor-pointer ml-auto my-auto" title="close" 3774 @click.prevent="removeMessage(index)"> 3775 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="text-primary" width="12" height="12" role="img"> 3776 <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"/> 3777<title>x</title></svg> 3778 </a> 3779 </div> 3780 </template> 3781 </div> 3782 </template> 3783 </div> 3784 </div> 3785 </template> 3786</section> 3787</div><div class="columns"><aside class="sidebar sidebar-main"> 3788<div class="blog__category__default lg:mb-6 first:border-t-0 border-container lg:border-0 pb-4 pt-2 lg:py-0" x-data="{ open: false }"> 3789 <div class="font-baloo-bhaina text-base lg:text-xl lg:h4 font-bold leading-8 lg:leading-10 flex justify-between items-center" @click="open = !open"> 3790 <span> 3791 Categorie </span> 3792 <span class="md:hidden pr-4"> 3793 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="16" height="16" :class="{ 'transform rotate-180': open }" role="img"> 3794 <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/> 3795<title>chevron-down</title></svg> 3796 </span> 3797 </div> 3798 <div class="relative mt-1 md:block" :class="open ? '' : 'hidden'"> 3799 <a class="block text-primary-darker hover:font-bold text-xs md:text-md mb-2" href="/blog.html"> 3800 Tutti gli articoli </a> 3801 <a class="block text-primary-darker hover:font-bold text-xs md:text-md mb-2 " href="https://www.farma.it/blog/novita.html"> 3802 Novità </a> 3803 <a class="block text-primary-darker hover:font-bold text-xs md:text-md mb-2 " href="https://www.farma.it/blog/bellezza.html"> 3804 Bellezza </a> 3805 <a class="block text-primary-darker hover:font-bold text-xs md:text-md mb-2 " href="https://www.farma.it/blog/natura.html"> 3806 Natura </a> 3807 <a class="block text-primary-darker hover:font-bold text-xs md:text-md mb-2 " href="https://www.farma.it/blog/rimedi.html"> 3808 Rimedi </a> 3809 </div> 3810</div> 3811 3812<div 3813 class="ambanners ambanner-2" 3814 data-position="2" 3815 data-bannerid="" 3816 data-role="amasty-banner-container" 3817></div> 3818</aside><div class="column main"><div class="max-w-none xl:max-w-screen-xl 2xl:max-w-screen-2xl container flex flex-col md:flex-row flex-wrap md:mb-0 mb-0 mb-5 md:mb-10 px-0"> 3819 <h1 class="text-primary-darker page-title title-font text-2xl xl:text-3xl font-bold xl:mb-4 mb-2 " 3820 >
3821 <span class="base" data-ui-id="page-title-wrapper" >I nostri consigli</span> </h1> 3822 </div>
3823<script> 3824 document.addEventListener("alpine:init", () => { 3825 Alpine.store('ajaxPrices', { 3826 nodesToUpdate: [], 3827 prices: [], 3828 options: { 3829 additional_data: {} 3830 }, 3831 3832 hasPrice(productId){ 3833 return this.getPriceFloat(productId) != null; 3834 }, 3835 3836 getPriceHtml(productId) { 3837 if (!(productId in this.prices)) { 3838 return null; 3839 } 3840 return this.prices[productId]['html']; 3841 }, 3842 3843 getPriceFloat(productId) { 3844 if (!(productId in this.prices)) { 3845 return null; 3846 } 3847 return this.prices[productId]['float']; 3848 }, 3849 3850 addNode(productId) { 3851 if (!productId) { 3852 return 3853 } 3854 3855 this.nodesToUpdate.push({ 3856 "productId": productId, 3857 }); 3858 3859 Alpine.debounce(this.updateNodes.bind(this), 150)(); 3860 }, 3861 3862 updateNodes() { 3863 var nodes = this.nodesToUpdate; 3864 this.nodesToUpdate = []; 3865 3866 this.processNodes(nodes); 3867 }, 3868 3869 processNodes(nodes) { 3870 var self = this, 3871 idsToLoad = [], 3872 containerToReload = []; 3873 3874 nodes.forEach(function (node) { 3875 var productId = node.productId; 3876 3877 if (productId in self.prices) { 3878 //self.apply(node); 3879 return; //continue 3880 } 3881 3882 idsToLoad.push(productId); 3883 3884 containerToReload.push(node); 3885 }); 3886 3887 if (idsToLoad.length) { 3888 self.get(idsToLoad, function () { 3889 self.processNodes(containerToReload); 3890 }); 3891 } 3892 }, 3893 3894 store: function (prices) { 3895 this.prices = Object.assign(this.prices, prices); 3896 }, 3897 3898 get(ids, callback) { 3899 3900 var self = this, 3901 params = '/ids/' + ids.join(); 3902 3903 let additionalParams = this.options.additional_data; 3904 params += "?" + new URLSearchParams(additionalParams).toString(); 3905 3906 fetch(BASE_URL + 'ajaxprices/price/render' + params) 3907 .then((response) => response.json()) 3908 .then((data) => { 3909 if (data.error) { 3910 console.error("ajax_price_error: " + data.errorMessage) 3911 return; 3912 } 3913 3914 var prices = data.data; 3915 self.store(prices); 3916 callback(); 3917 }); 3918 } 3919 }); 3920 }); 3921</script>
3921 3922
3923<script> 3924 document.addEventListener("alpine:init", () => { 3925 Alpine.store('badges', { 3926 nodesToUpdate: [], 3927 badges: [], 3928 productBadges: [], 3929 options: { 3930 additional_data: {} 3931 }, 3932 3933 getBadgesHtml(productId, position) { 3934 if (!(productId in this.productBadges) || !(position in this.productBadges[productId])) { 3935 return []; 3936 } 3937 let index = this.productBadges[productId][position], 3938 self = this, 3939 badges = []; 3940 3941 index.forEach(function (element) { 3942 badges.push(self.badges[element]); 3943 }); 3944 return badges; 3945 }, 3946 3947 addNode(productId, position) { 3948 this.nodesToUpdate.push({ 3949 "productId": productId, 3950 "position": position 3951 }); 3952 3953 Alpine.debounce(this.updateNodes.bind(this), 150)(); 3954 }, 3955 3956 updateNodes() { 3957 var nodes = this.nodesToUpdate; 3958 this.nodesToUpdate = []; 3959 3960 this.processNodes(nodes); 3961 }, 3962 3963 processNodes(nodes) { 3964 var self = this, 3965 idsToLoad = [], 3966 containerToReload = []; 3967 3968 nodes.forEach(function (node) { 3969 var productId = node.productId; 3970 3971 if (self.productBadges[productId]) { 3972 //self.apply(node); 3973 return; //continue 3974 } 3975 3976 idsToLoad.push(productId); 3977 containerToReload.push(node); 3978 }); 3979 3980 if (idsToLoad.length) { 3981 self.get(idsToLoad, function () { 3982 self.processNodes(containerToReload); 3983 }); 3984 } 3985 }, 3986 3987 store: function (badges, productBadges) { 3988 this.badges = Object.assign(this.badges, badges); 3989 this.productBadges = Object.assign(this.productBadges, productBadges); 3990 }, 3991 3992 get(ids, callback) { 3993 var self = this, 3994 params = '/ids/' + ids.join(); 3995 3996 let additionalParams = this.options.additional_data; 3997 params += "?" + new URLSearchParams(additionalParams).toString(); 3998 3999 fetch(BASE_URL + 'badge/api/get' + params) 4000 .then((response) => response.json()) 4001 .then((data) => { 4002 if (data.error) { 4003 console.error("badges_error: " + data.errorMessage) 4004 return; 4005 } 4006 4007 var badges = data.data.badges, 4008 productBadges = data.data.productBadges; 4009 4010 self.store(badges, productBadges); 4011 callback(); 4012 }); 4013 } 4014 }); 4015 }); 4016</script>
4016 4017 4018
4019<script> 4020 document.addEventListener("alpine:init", () => { 4021 Alpine.store('omnibusPrices', { 4022 nodesToUpdate: [], 4023 prices: [], 4024 options: { 4025 additional_data: {} 4026 }, 4027 4028 hasPrice(productId){ 4029 return this.getPriceHtml(productId) != null; 4030 }, 4031 4032 getPriceHtml(productId) { 4033 if (!(productId in this.prices)) { 4034 return null; 4035 } 4036 return this.prices[productId]; 4037 }, 4038 4039 addNode(productId, position) { 4040 this.nodesToUpdate.push({ 4041 "productId": productId, 4042 }); 4043 4044 Alpine.debounce(this.updateNodes.bind(this), 150)(); 4045 }, 4046 4047 updateNodes() { 4048 var nodes = this.nodesToUpdate; 4049 this.nodesToUpdate = []; 4050 4051 this.processNodes(nodes); 4052 }, 4053 4054 processNodes(nodes) { 4055 var self = this, 4056 idsToLoad = [], 4057 containerToReload = []; 4058 4059 nodes.forEach(function (node) { 4060 var productId = node.productId; 4061 4062 if (productId in self.prices) { 4063 //self.apply(node); 4064 return; //continue 4065 } 4066 4067 idsToLoad.push(productId); 4068 containerToReload.push(node); 4069 }); 4070 4071 if (idsToLoad.length) { 4072 self.get(idsToLoad, function () { 4073 self.processNodes(containerToReload); 4074 }); 4075 } 4076 }, 4077 4078 store: function (prices) { 4079 this.prices = Object.assign(this.prices, prices); 4080 }, 4081 4082 get(ids, callback) { 4083 var self = this, 4084 params = '/ids/' + ids.join(); 4085 4086 let additionalParams = this.options.additional_data; 4087 params += "?" + new URLSearchParams(additionalParams).toString(); 4088 4089 fetch(BASE_URL + 'omnibus/ajax/render' + params) 4090 .then((response) => response.json()) 4091 .then((data) => { 4092 if (data.error) { 4093 console.error("omnibus_prices_error: " + data.errorMessage) 4094 return; 4095 } 4096 4097 var prices = data.data; 4098 self.store(prices); 4099 callback(); 4100 }); 4101 } 4102 }); 4103 }); 4104</script>
vendor: 1 bytes, line 4104
4104
4105<script nonce="NjNtZzZkZG5hN3RlcXptYzE0eXZhMWpqNnQzY2N0djE="> 4106 var feedId = getUrlParam('ff'), 4107 product = getUrlParam('fp'), 4108 currentDate = new Date(), 4109 session = getCookie('feed_session'); 4110 4111 if (!session) { 4112 session = '' + Math.floor(currentDate.getTime() / 1000) + Math.floor(Math.random() * 10000001); 4113 } 4114 4115 if (session && feedId > 0 && product > 0) { 4116 setCookie('feed_session', session, {expires: 365, path: '/'}); 4117 setCookie('feed_id', feedId, 365); 4118 4119 var xhr = new XMLHttpRequest(), 4120 baseUrl = 'https://www.farma.it/', 4121 url = BASE_URL + '?rnd=' + Math.floor(Math.random() * 10000001) + "&feed=" + feedId + "&session=" + session + "&product=" + product; 4122 4123 xhr.open('GET', url, true); 4124 xhr.setRequestHeader('Content-Type', 'application/json'); 4125 xhr.send(); 4126 } 4127 4128 function getUrlParam(name) { 4129 let results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); 4130 4131 if (results === null) { 4132 return ''; 4133 } else { 4134 return results[1] || 0; 4135 } 4136 } 4137 4138 function getCookie(cookieName) { 4139 var name = cookieName + "=", 4140 decodedCookie = decodeURIComponent(document.cookie), 4141 cookieArray = decodedCookie.split(';'); 4142 4143 for (var i = 0; i < cookieArray.length; i++) { 4144 var cookie = cookieArray[i].trim(); 4145 if (cookie.indexOf(name) === 0) { 4146 return cookie.substring(name.length, cookie.length); 4147 } 4148 } 4149 4150 return null; 4151 } 4152 4153 function setCookie(cookieName, cookieValue, expirationDays) { 4154 var d = new Date(); 4155 d.setTime(d.getTime() + (expirationDays * 24 * 60 * 60 * 1000)); 4156 var expires = "expires=" + d.toUTCString(); 4157 document.cookie = cookieName + "=" + cookieValue + ";" + expires + ";path=/"; 4158 } 4159</script>
vendor: 1 bytes, line 4159
4159
4160<script> 4161 function hasWebP() { 4162 var elem = document.createElement('canvas'); 4163 4164 if (!!(elem.getContext && elem.getContext('2d'))) { 4165 return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0; 4166 } 4167 return false; 4168 } 4169 4170 if (hasWebP()) { 4171 document.body.classList.add("webp"); 4172 } else { 4173 document.body.classList.add("no-webp"); 4174 } 4175</script>
4175 4176 4177 <div class="blog__post-list__default grid grid-cols-1 xl:grid-cols-2 gap-2 xl:gap-4"> 4178 4179<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="421"> 4180 <a href="https://www.farma.it/blog/guida-all-uso-dei-dispositivi-medici-per-l-aerosol-nei-mesi-invernali.html" class="cursor-pointer"> 4181 <div class="overflow-hidden mb-2"> 4182 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/Blog_Aerosol-ad34d7b0.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/Blog_Aerosol.jpg" alt="Guida all'uso dei dispositivi medici per l’aerosol nei mesi invernali" loading="lazy" /></picture> 4183 </div> 4184 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">10 nov 2025</p> 4185 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4186 Guida all'uso dei dispositivi medici per lâaerosol nei mesi invernali </h2> 4187 </a> 4188 <a href="https://www.farma.it/blog/guida-all-uso-dei-dispositivi-medici-per-l-aerosol-nei-mesi-invernali.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4189 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4190 Scopri come scegliere e usare correttamente i dispositivi per aerosol nei mesi invernali. Consigli pratici, manutenzione e rimedi per le vie respiratorie. </p> 4191 <p class="text-secondary items-center text-md mr-auto ml-0 flex">Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4192 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4193<title>chevron-right</title></svg> 4194</span></p> 4195 </a> 4196</div> 4197 4198<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="406"> 4199 <a href="https://www.farma.it/blog/prevenzione-delle-infezioni-urinarie-nei-mesi-freddi-consigli-e-prodotti-efficaci.html" class="cursor-pointer"> 4200 <div class="overflow-hidden mb-2"> 4201 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/infezioni_urinarie-2f933b95.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/infezioni_urinarie.png" alt="Prevenzione delle infezioni urinarie nei mesi freddi: consigli e prodotti efficaci" loading="lazy" /></picture> 4202 </div> 4203 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">7 nov 2025</p> 4204 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4205 Prevenzione delle infezioni urinarie nei mesi freddi: consigli e prodotti efficaci </h2> 4206 </a> 4207 <a href="https://www.farma.it/blog/prevenzione-delle-infezioni-urinarie-nei-mesi-freddi-consigli-e-prodotti-efficaci.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4208 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4209 Prevenire le infezioni urinarie nei mesi freddi è possibile: scopri abitudini, igiene, alimentazione e integratori naturali per proteggere le vie urinarie. </p> 4210 <p class="text-secondary items-center text-md mr-auto ml-0 flex">Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4211 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4212<title>chevron-right</title></svg> 4213</span></p> 4214 </a> 4215</div> 4216 4217<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="400"> 4218 <a href="https://www.farma.it/blog/bronchite-stagionale-prevenzione-trattamenti-e-supporti-da-banco.html" class="cursor-pointer"> 4219 <div class="overflow-hidden mb-2"> 4220 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/BRONCHITE-3fd16ff0.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/BRONCHITE.png" alt="Bronchite stagionale: prevenzione, trattamenti e supporti da banco" loading="lazy" /></picture> 4221 </div> 4222 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">3 nov 2025</p> 4223 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4224 Bronchite stagionale: prevenzione, trattamenti e supporti da banco </h2> 4225 </a> 4226 <a href="https://www.farma.it/blog/bronchite-stagionale-prevenzione-trattamenti-e-supporti-da-banco.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4227 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4228 Scopri cosâè la bronchite stagionale, i sintomi principali e i rimedi efficaci: prevenzione, trattamenti da banco e consigli naturali per proteggere le vie respiratorie. </p> 4229 <p class="text-secondary items-center text-md mr-auto ml-0 flex">
4229Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4230 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4231<title>chevron-right</title></svg> 4232</span></p> 4233 </a> 4234</div> 4235 4236<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="405"> 4237 <a href="https://www.farma.it/blog/tisane-e-infusi-per-affrontare-i-primi-freddi-guida-e-consigli.html" class="cursor-pointer"> 4238 <div class="overflow-hidden mb-2"> 4239 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/infusi_e_tisane-f4befdbb.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/infusi_e_tisane.png" alt="erbe per tisane in barattoli di vetro" loading="lazy" /></picture> 4240 </div> 4241 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">31 ott 2025</p> 4242 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4243 Tisane e infusi per affrontare i primi freddi: guida e consigli </h2> 4244 </a> 4245 <a href="https://www.farma.it/blog/tisane-e-infusi-per-affrontare-i-primi-freddi-guida-e-consigli.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4246 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4247 Scopri le tisane migliori per affrontare i primi freddi: rimedi naturali per rafforzare difese, favorire digestione, respirazione e relax quotidiano. </p> 4248 <p class="text-secondary items-center text-md mr-auto ml-0 flex">Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4249 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4250<title>chevron-right</title></svg> 4251</span></p> 4252 </a> 4253</div> 4254 4255<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="414"> 4256 <a href="https://www.farma.it/blog/pelle-secca-in-autunno-ecco-come-mantenerla-idratata.html" class="cursor-pointer"> 4257 <div class="overflow-hidden mb-2"> 4258 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/pelle_secca-c9d7c4c0.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/pelle_secca.jpg" alt="Pelle secca in autunno? Ecco come mantenerla idratata" loading="lazy" /></picture> 4259 </div> 4260 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">13 ott 2025</p> 4261 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4262 Pelle secca in autunno? Ecco come mantenerla idratata </h2> 4263 </a> 4264 <a href="https://www.farma.it/blog/pelle-secca-in-autunno-ecco-come-mantenerla-idratata.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4265 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4266 Pelle secca in autunno? Scopri cause, rimedi e prodotti idratanti per mantenerla morbida, elastica e protetta dai cambiamenti climatici. </p> 4267 <p class="text-secondary items-center text-md mr-auto ml-0 flex">Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4268 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4269<title>chevron-right</title></svg> 4270</span></p> 4271 </a> 4272</div> 4273 4274<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="412"> 4275 <a href="https://www.farma.it/blog/infezioni-respiratorie-virus-o-batteri.html" class="cursor-pointer"> 4276 <div class="overflow-hidden mb-2"> 4277 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/virus_o_batteri-3bbe8a0a.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/virus_o_batteri.jpg" alt="Infezioni respiratorie: virus o batteri?" loading="lazy" /></picture> 4278 </div> 4279 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">10 ott 2025</p> 4280 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4281 Infezioni respiratorie: virus o batteri? </h2> 4282 </a> 4283 <a href="https://www.farma.it/blog/infezioni-respiratorie-virus-o-batteri.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4284 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4285 Scopri le differenze tra infezioni respiratorie virali e batteriche, i sintomi principali e i trattamenti corretti per prevenirle e curarle efficacemente. </p> 4286 <p class="text-secondary items-center text-md mr-auto ml-0 flex">
4286Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4287 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4288<title>chevron-right</title></svg> 4289</span></p> 4290 </a> 4291</div> 4292 4293<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="402"> 4294 <a href="https://www.farma.it/blog/allergie-da-muffe-autunnali-cause-sintomi-e-rimedi.html" class="cursor-pointer"> 4295 <div class="overflow-hidden mb-2"> 4296 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/Muffa-5703f5dc.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/Muffa.png" alt="Allergie da muffe autunnali: cause, sintomi e rimedi" loading="lazy" /></picture> 4297 </div> 4298 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">8 ott 2025</p> 4299 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4300 Allergie da muffe autunnali: cause, sintomi e rimedi </h2> 4301 </a> 4302 <a href="https://www.farma.it/blog/allergie-da-muffe-autunnali-cause-sintomi-e-rimedi.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4303 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4304 Allergie da muffe autunnali? Scopri cause, sintomi e rimedi naturali o da banco per prevenire i disturbi respiratori e proteggere la salute in ambienti umidi. </p> 4305 <p class="text-secondary items-center text-md mr-auto ml-0 flex">Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4306 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4307<title>chevron-right</title></svg> 4308</span></p> 4309 </a> 4310</div> 4311 4312<div class="flex justify-between flex-col border border-primary-darker hover:border-tertiary rounded-md md:rounded-lg p-2 h-full" data-post-id="401"> 4313 <a href="https://www.farma.it/blog/quali-vitamine-assumere-in-ottobre-per-la-stanchezza-da-cambio-stagione.html" class="cursor-pointer"> 4314 <div class="overflow-hidden mb-2"> 4315 <picture class="rounded-md block object-cover w-full"><source type="image/webp" srcset="https://www.farma.it/media/blog/vitamine-d2b6345c.webp"><img class="rounded-md block object-cover w-full" loading="lazy" width="303" height="168" src="https://www.farma.it/media/blog/vitamine.png" alt="Quali vitamine assumere in ottobre per la stanchezza da cambio stagione" loading="lazy" /></picture> 4316 </div> 4317 <p class="text-xxs md:text-xs text-primary-darker mx-2 md:mx-0">6 ott 2025</p> 4318 <h2 itemprop="headline" rel="bookmark" class="my-0.5 lg:my-1.5 h3 mx-2 md:mx-0 font-baloo-bhaina font-bold line-clamp"> 4319 Quali vitamine assumere in ottobre per la stanchezza da cambio stagione </h2> 4320 </a> 4321 <a href="https://www.farma.it/blog/quali-vitamine-assumere-in-ottobre-per-la-stanchezza-da-cambio-stagione.html" class="cursor-pointer flex flex-col mb-2 mx-2 md:mx-0 items-center"> 4322 <p class="line-clamp text-primary-darker text-sm md:text-md mx-0 mb-4"> 4323 Scopri quali vitamine assumere in ottobre per combattere la stanchezza da cambio stagione, rinforzare le difese immunitarie e ritrovare energia fisica e mentale. </p> 4324 <p class="text-secondary items-center text-md mr-auto ml-0 flex">Leggi di più <span class="mt-0.5 pl-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="stroke-secondary" width="15" height="15" role="img"> 4325 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4326<title>chevron-right</title></svg> 4327</span></p> 4328 </a> 4329</div> 4330 4331 4332 <div class="toolbar mx-list-toolbar col-span-1 mt-8 xl:mt-10 xl:col-span-2 flex flex-col items-center"> 4333 <div class="toolbar-amount text-xs text-center text-primary-lighter mb-2" id="toolbar-amount"> 4334 Articoli <span class="toolbar-number">1</span>-<span class="toolbar-number">8</span> di <span class="toolbar-number">346</span> </div> 4335 4336 4337 4338 4339 <div class="flex items-center"> 4340 <nav class="inline-flex items-center pages" aria-label="pagination"> 4341 <ol class="relative z-0 inline-flex gap-x-[0.4rem] md:gap-x-2 items pages-items font-baloo-bhaina text-primary-darker text-lg"> 4342 4343 4344 4345 4346 <li 4347 class="item -ml-px" 4348 aria-label="Pagina 1" 4349 > 4350 <div 4351 4352 class="page relative inline-flex items-center font-medium leading-5 w-9 h-9 md:w-10 md:h-10 flex items-center justify-center border border-primary-darker rounded-full bg-tertiary-lighter !border-tertiary cursor-pointer rounded-full !bg-tertiary-darker z-10 " 4353 aria-current="page" 4354 >
4355 <span class="sr-only label"> 4356 Attualmente stai leggendo la pagina </span> 4357 <span class="font-baloo-bhaina font-bold text-white align-text-bottom text-lg">1</span> 4358 </div> 4359 </li> 4360 <li class="item -ml-px"> 4361 <a 4362 href="https://www.farma.it/blog.html?p=2" 4363 class="page relative inline-flex items-center font-medium leading-5 w-9 h-9 md:w-10 md:h-10 flex items-center justify-center border border-primary-darker rounded-full bg-tertiary-lighter" 4364 > 4365 <span class="sr-only label">Pagina</span> 4366 <span>2</span> 4367 </a> 4368 </li> 4369 <li class="item -ml-px"> 4370 <a 4371 href="https://www.farma.it/blog.html?p=3" 4372 class="page relative inline-flex items-center font-medium leading-5 w-9 h-9 md:w-10 md:h-10 flex items-center justify-center border border-primary-darker rounded-full bg-tertiary-lighter" 4373 > 4374 <span class="sr-only label">Pagina</span> 4375 <span>3</span> 4376 </a> 4377 </li> 4378 <li class="item -ml-px"> 4379 <a 4380 href="https://www.farma.it/blog.html?p=4" 4381 class="page relative inline-flex items-center font-medium leading-5 w-9 h-9 md:w-10 md:h-10 flex items-center justify-center border border-primary-darker rounded-full bg-tertiary-lighter" 4382 > 4383 <span class="sr-only label">Pagina</span> 4384 <span>4</span> 4385 </a> 4386 </li> 4387 <li class="item -ml-px"> 4388 <a 4389 href="https://www.farma.it/blog.html?p=5" 4390 class="page relative inline-flex items-center font-medium leading-5 w-9 h-9 md:w-10 md:h-10 flex items-center justify-center border border-primary-darker rounded-full bg-tertiary-lighter" 4391 > 4392 <span class="sr-only label">Pagina</span> 4393 <span>5</span> 4394 </a> 4395 </li> 4396 4397 4398 4399 4400 <li class="item pages-item-next -ml-px"> 4401 <a 4402 href="https://www.farma.it/blog.html?p=2" 4403 class="action next 4404 relative inline-flex items-center font-medium leading-5 w-9 h-9 md:w-10 md:h-10 flex items-center justify-center border border-primary-darker rounded-full bg-tertiary-lighter !border-0" 4405 > 4406 <span 4407 aria-label="Successivo" 4408 ><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="15" height="15" role="img"> 4409 <path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/> 4410<title>chevron-right</title></svg> 4411</span> 4412 </a> 4413 </li> 4414 </ol> 4415 </nav> 4416 </div> 4417 4418 4419 </div> 4420 </div> 4421 <div data-mage-init='null'></div> 4422 </div><aside class="sidebar sidebar-additional"><style>#html-body [data-pb-style=LGN6N5T]{justify-content:flex-start;display:flex;flex-direction:column;background-position:left top;background-size:cover;background-repeat:no-repeat;background-attachment:scroll}</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="LGN6N5T"><div data-content-type="block" data-appearance="default" data-intersect="false" data-element="main"><div class="widget block block-static-block"> 4423 </div> 4424</div></div></div> 4425<div 4426 class="ambanners ambanner-1" 4427 data-position="1" 4428 data-bannerid="" 4429 data-role="amasty-banner-container" 4430></div> 4431</aside></div></main><footer class="page-footer mt-auto"> 4432 <div style="background-image: url('https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/images/footer/bg_newsletter.webp'); 4433 font-size: justify-content: flex-start; 4434 display: flex; 4435 flex-direction: column; 4436 background-position: left top; 4437 background-size: cover; 4438 background-repeat: no-repeat; 4439 background-attachment: scroll;" 4440 > 4441 <div class="container"> 4442 <div class="py-8 md:py-10 scroll-mt-36" id="newsletter_footer"> 4443 <form class="form subscribe rounded-full" action="https://www.farma.it/newsletter/subscriber/new/" method="post" x-data="initNewsletterForm()" @submit.prevent="submitForm(
4443)" id="newsletter-validate-detail"> 4444 <div class="flex flex-wrap justify-start gap-2"> 4445 <label for="newsletter-subscribe" class="sr-only" role="img" aria-label="Indirizzo email"> 4446 Indirizzo email </label> 4447 4448 <input name="form_key" type="hidden" x-bind:value="window.hyva.getFormKey()"> 4449 <div class="control"> 4450 <input type="hidden" 4451 value="" 4452 name="g-recaptcha-response" 4453 > 4454</div> 4455 4456 <div class="w-full md:grid grid-cols-12 items-center xl:items-end"> 4457 <div class="col-span-5 text-white mb-6"> 4458 <h4 class="h2 font-bold font-baloo-bhaina text-white mb-2 md:mb-4">Non perderti nulla!<br/>Iscriviti alla nostra Newsletter</h4> 4459 <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> 4460 </div> 4461 <div></div> 4462 <div class="col-span-6 order-3 md:mb-6"> 4463 <div class="control input-group flex gap-x-2.5 md:gap-x-4 relative"> 4464 <input class="input-text form-control py-2 form-input pl-12" name="email" type="email" required id="newsletter-subscribe" 4465 x-bind:placeholder="window.matchMedia('(max-width: 700px)').matches ? 4466 'Inserisci e-mail *' : 4467 'Inserisci indirizzo e-mail *'"> 4468 <div class="absolute top-0 left-3 py-3.5 pl-1"> 4469 <?xml version="1.0" encoding="UTF-8"?> 4470<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"> 4471 <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"/> 4472<title>footer/icon_email</title></svg> 4473 </div> 4474 <div class="input-group-append"> 4475 <button class="btn btn-secondary h-full"> 4476 Iscriviti </button> 4477 </div> 4478 </div> 4479 <div class="flex gap-2 mt-3 pl-5 max-w-lg"> 4480 4481 <div x-data="{ 4482 checked: false, 4483 consentId: 5 }" 4484 id="checkbox-0" 4485 class="flex w-full last:mb-3"> 4486 <div 4487 class="flex flex-wrap field choice "> 4488 <input type="hidden" name="amgdpr_agreement[newsletter_privacy_policy]" 4489 value="0"/> 4490 <div class="flex flex-row"> 4491 <input type="checkbox" 4492 name="amgdpr_agreement[newsletter_privacy_policy]" 4493 title="Newsletter - Privacy Policy" 4494 value="1" 4495 id="amprivacy-checkbox-6ac8d151335e8" 4496 class="amgdpr-consent-checkbox mt-0.5" 4497 x-model="checked" 4498 @amgdpr-consent-accepted.window="event.detail === consentId && (checked = true)" 4499 required 4500 /> 4501 <label for="amprivacy-checkbox-6ac8d151335e8" 4502 class="label"> 4503 <span class="amgdpr-consent-span"> 4504 Letta lâ<a href="/privacy-policy" target="_blank" class="underline">informativa privacy</a>, presto il mio consenso per ricevere newsletter e/o DEM </span> 4505 </label> 4506 </div> 4507 <div class="h-0 w-full"></div> 4508 </div> 4509 4510 <input type="hidden" 4511 name="am-gdpr-checkboxes-from" 4512 value="subscription"/> 4513 </div> 4514<policy-placeholder></policy-placeholder> 4515 </div> 4516 </div> 4517 </div> 4518 </div> 4519 <div> 4520 <template x-if="displayErrorMessage"> 4521 <p class="flex items-center mage-error">
4522 <span class="inline-block w-8 h-8 mr-3"> 4523 <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"> 4524 <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> 4525<title>exclamation-circle</title></svg> 4526 </span> 4527 <template x-for="errorMessage in errorMessages"> 4528 <span x-html="errorMessage"></span> 4529 </template> 4530 </p> 4531 </template> 4532 </div> 4533 </form> 4534 <div class="w-full text-white"> 4535 <p class="legal-notice my-2 text-xxs"> 4536 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> 4537 </div> 4538
4538<script type="text/javascript"> 4539 function initNewsletterForm() { 4540 return { 4541 errors: 0, 4542 hasCaptchaToken: 0, 4543 displayErrorMessage: false, 4544 errorMessages: [], 4545 setErrorMessages(messages) { 4546 this.errorMessages = [messages] 4547 this.displayErrorMessage = this.errorMessages.length 4548 }, 4549 submitForm() { 4550 // Do not rename $form, the variable is expected to be declared in the recaptcha output 4551 const $form = document.querySelector('#newsletter-validate-detail'); 4552 if (!this.hasCaptchaToken) { 4553 this.errors = 1; 4554 4555 const lockSubmitButton = () => { 4556 $form.querySelector('[type="submit"]')?.setAttribute('disabled', true); 4557 }; 4558 4559 const failCaptcha = (errorMessage, exception = null) => { 4560 this.errors = 1; 4561 lockSubmitButton(); 4562 4563 if (this.setErrorMessages) { 4564 this.setErrorMessages([errorMessage]); 4565 this.displayErrorMessage = true; 4566 } else { 4567 window.dispatchMessages && window.dispatchMessages([{ type: "error", text: errorMessage }], 5000); 4568 } 4569 4570 if (exception) { 4571 console.error( 4572 exception || 4573 'An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?' 4574 ); 4575 } 4576 }; 4577 4578 const executeGreCaptcha = () => { 4579 grecaptcha.ready(() => { 4580 grecaptcha.execute( 4581 '6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ', 4582 {action: 'submit'} 4583 ).then((token) => { 4584 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 4585 4586 if (tokenElement && token && token.length > 0) { 4587 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 4588 this.errors = 0; 4589 this.hasCaptchaToken = 1; 4590 (this.submitForm || $form.submit).call(this); 4591 } else { 4592 failCaptcha( 4593 tokenElement 4594 ? 'ReCaptcha\u0020validation\u0020failed.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 4595 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.' 4596 ); 4597 } 4598 }).catch((exception) => { 4599 failCaptcha( 4600 'ReCaptcha\u0020validation\u0020failed\u0020due\u0020to\u0020a\u0020technical\u0020error.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020try\u0020again.', 4601 exception 4602 ); 4603 }); 4604 }); 4605 }; 4606 4607 if (window.grecaptcha) { 4608 executeGreCaptcha(); 4609 } else { 4610 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ"; 4611 const script = document.createElement('script'); 4612 script.setAttribute('type', 'text/javascript'); 4613 script.setAttribute('src', recaptchaUrl); 4614 document.head.appendChild(script); 4615 4616 script.addEventListener("load", executeGreCaptcha, false); 4617 } 4618 } 4619 4620 if (this.errors === 0) { 4621 $form.submit(); 4622 } 4623 } 4624 } 4625 } 4626 </script>
4626 4627</div> 4628 </div> 4629 </div> 4630 <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"> 4631 <template x-if="show"> 4632 <div class="dna-footer-item-content"> 4633 <div data-content-type="html" data-appearance="default" data-intersect="false" data-element="main" data-decoded="true"><div class="bg-container-gray"> 4634 <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"> 4635 <div class="md:grid grid-cols-3 col-span-7 md:mr-8 gap-2"> 4636 <div class="overflow-hidden md:mb-8 lg:mb-0 mb-3" x-data="{open: false}"> 4637 <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 4638 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4639 <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"/> 4640 </span> 4641 <span class="text-xl md:hidden items-center flex" x-show="open"> 4642 <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"/> 4643 </span> 4644 </h5> 4645 4646 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto" :class="open ? '' : 'h-0'" 4647 x-bind:style="open ? 'height:' + $el.childElementCount * 27 /* 25px element child width */ + 'px' : ''"> 4648 <li class="py-0.5"><a href="/chi-siamo" class="text-xs md:text-base hover:text-secondary">La nostra Azienda</a></li> 4649 <li class="py-0.5"><a href="/coupon-e-promo" class="text-xs md:text-base hover:text-secondary">Coupon</a></li> 4650 <li class="py-0.5"><a href="/farma-lovers" class="text-xs md:text-base hover:text-secondary">Programma Fedeltà Farma Lovers</a></li> 4651 <li class="py-0.5"><a href="/lavora-con-noi" class="text-xs md:text-base hover:text-secondary">Lavora con noi</a></li> 4652 <li class="py-0.5"><a href="/blog" class="text-xs md:text-base hover:text-secondary">I nostri consigli</a></li> 4653 <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> 4654 </ul> 4655 </div> 4656 4657 <div class="overflow-hidden mb-3" x-data="{open: false}"> 4658 <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 4659 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4660 <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"/> 4661 </span> 4662 <span class="text-xl md:hidden items-center flex" x-show="open"> 4663 <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"/> 4664 </span> 4665 </h5> 4666 4667 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto" :class="open ? '' : 'h-0'" 4668 x-bind:style="open ? 'height:' + $el.childElementCount * 27 + 'px' : ''"> 4669 <li class="py-0.5"><a href="/contattaci" class="text-xs md:text-base hover:text-secondary">Contattaci</a></li> 4670 <li class="py-0.5"><a href="/richiamami" class="text-xs md:text-base hover:text-secondary">Richiamami</a></li> 4671 <!-- <li class="py-0.5"><a href="/sales/guest/form" class="text-xs md:text-base hover:text-secondary">Stato dell'ordine</a></li> --> 4672 <li class="py-0.5"><a href="/faq" class="text-xs md:text-base hover:text-secondary">FAQ</a></li> 4673 <li class="py-0.5"><a href="/rma/guest/login" class="text-xs md:text-base hover:text-secondary">Resi</a></li> 4674 </ul> 4675 </div> 4676 4677 <div class="overflow-hidden mb-3" x-data="{open: false}"> 4678 <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
4679 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4680 <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"/> 4681 </span> 4682 <span class="text-xl md:hidden items-center flex" x-show="open"> 4683 <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"/> 4684 </span> 4685 </h5> 4686 4687 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto text-xs md:text-base " :class="open ? '' : 'h-0'" 4688 x-bind:style="open ? 'height:' + $el.childElementCount * 27 + 'px' : ''"> 4689 <li class="py-0.5"><a href="/pagamenti-e-condizioni" class="hover:text-secondary">Pagamenti & Condizioni</a></li> 4690 <li class="py-0.5"><a href="/spedizioni" class="hover:text-secondary">Spedizioni</a></li> 4691 <li class="py-0.5"><a href="/privacy-policy" class="hover:text-secondary">Privacy Policy</a></li> 4692 <li class="py-0.5"><a href="/cookie-policy" class="hover:text-secondary">Cookie Policy</a></li> 4693 <li class="py-0.5"><a href="/comunicazioni" class="hover:text-secondary">Comunicazioni</a></li> 4694 <li class="py-0.5"><span class="hover:text-secondary cursor-pointer" onclick="Cookiebot.show();preventDefault()">Gestisci Cookie</span> 4695 <li class="py-0.5"><a href="/garanzia-legale" class="hover:text-secondary">Garanzia legale UE â almeno 2 anni</a></li> 4696 </li> 4697 </ul> 4698 </div> 4699 4700 <div class="overflow-hidden" x-data="{open: false}"> 4701 <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 4702 <span class="text-xl md:hidden items-center flex" x-show="!open"> 4703 <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"/> 4704 </span> 4705 <span class="text-xl md:hidden items-center flex" x-show="open"> 4706 <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"/> 4707 </span> 4708 </h5> 4709 4710 <ul class="md:block transition-all md:h-auto md:mb-0 md:!h-auto" :class="open ? 'mb-3' : 'h-0'" 4711 x-bind:style="open ? 'height:' + $el.childElementCount * 32 + 'px' : ''"> 4712 <li class="mb-3"><p class="text-xs md:text-base flex gap-2 items-center"> 4713 <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> 4714 <li class="mb-3"><p class="text-xs md:text-base flex gap-2 items-center"> 4715 <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> 4716 <li class="mb-3"><p class="text-xs md:text-base flex gap-2 items-center"> 4717 <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> 4718 <li><p class="text-xs md:text-base flex gap-2 items-center"> 4719 <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> 4720 </ul> 4721 </div> 4722 4723 <div class="overflow-hidden md:w-40"> 4724 <h5 class="font-bold md:pb-4 pb-3 pt-3 md:pt-0 md:pb-3 font-baloo-bhaina"> 4725 Pagamenti Veloci & Sicuri 4726 </h5> 4727 4728 <div class="mb-4 flex gap-1.5 md:gap-2 flex-wrap"> 4729 <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"/> 4730 <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"/> 4731 <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"/> 4732 <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"/> 4733 <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"/> 4734 <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"/> 4735 <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"/> 4736 <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"/> 4737 <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"/> 4738 <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"/> 4739 <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"/>
4740 <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"/> 4741 </div> 4742 </div> 4743 4744 <div class="overflow-hidden md:w-40"> 4745 <h5 class="font-bold md:pb-4 pb-3 pt-3 md:pt-0 font-baloo-bhaina">Consegna Gratuita in 24/72h</h5> 4746 4747 <div class="mb-4 flex gap-1.5 md:gap-2 flex-wrap"> 4748 <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"/> 4749 <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"/> 4750<!-- <img title="Liccardi" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/media/wysiwyg/liccardi_orlandi.svg" alt="Liccardi"/> --> 4751<img title="InPost" class='w-auto h-7 md:h8' loading="lazy" src="https://www.farma.it/media/wysiwyg/inpost_orlandi.svg" alt="InPost"/> 4752<!-- <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"/> --> 4753 </div> 4754 </div> 4755 </div> 4756 4757 <div class="col-span-3"> 4758 <div> 4759 <div> 4760 <h5 class="font-bold md:pb-4 pb-3 pt-3 md:pt-0 md:pb-3 font-baloo-bhaina">Sito sicuro</h5> 4761 </div> 4762 4763 <div class="gap-4 mb-4 md:mb-9 md:flex"> 4764<div style="display:flex;flex-direction:column;gap:8px;margin-bottom:8px"> 4765<div class="feedaty_widget" data-ver="2021" data-id="66ab4361b28b3" data-type="merchant" data-variant="200x150-4" data-lang="all" data-gui="all"></div> 4766<a target="_blank" rel="noopener" href="https://www.farma.it/garanzia-legale"> 4767 <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> 4768 </a> 4769</div> 4770 <div> 4771 <a target="_blank" href="https://www.trovaprezzi.it/negozi/farmait"> 4772 <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> 4773 </a> 4774 <a target="_blank" href="https://www.prezzifarmaco.it/scheda-negozio/farmait-by-antica-farmacia-orlandi-501"> 4775 <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> 4776 </a> 4777<a href="https://www.farma.it/farmacia-antifumo"> 4778 <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> 4779</a> 4780 </div> 4781 </div> 4782 </div> 4783 4784 <div class="mb-8"> 4785 <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> 4786 4787 <div class="flex gap-2 mb-6 md:mb-8"> 4788 <a target="_blank" href="https://www.salute.gov.it/LogoCommercioElettronico/CercaSitoEComm?useMode=getDettaglio&VOLID=C016715"> 4789 <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> 4790 </a> 4791 <a target="_blank" href="https://www.salute.gov.it/LogoCommercioElettronicoVET/CercaSitoEComm?useMode=getDettaglio&VOLID=C016715&area=veterinari&id=5907&lingua=italiano&menu=vendite"> 4792 <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> 4793 </a> 4794 </div> 4795<div class="mb-2 md:mb-4 flex gap-2"> 4796<a href="https://apps.apple.com/it/app/farma-it/id6740766576" target="_blank"> 4797<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="135" viewB
4797ox="0 0 119.66407 40"> 4798 <title>Download_on_the_App_Store_Badge_IT_RGB_blk_100317</title> 4799 <g> 4800 <g> 4801 <g> 4802 <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> 4803 <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> 4804 </g> 4805 <g id="_Group_" data-name="<Group>"> 4806 <g id="_Group_2" data-name="<Group>"> 4807 <g id="_Group_3" data-name="<Group>"> 4808 <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> 4809 <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> 4810 </g> 4811 </g> 4812 <g> 4813 <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> 4814 <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> 4815 <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> 4816 <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
48161895,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> 4817 <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> 4818 <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> 4819 <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> 4820 <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> 4821 </g> 4822 </g> 4823 </g> 4824 <g id="_Group_4" data-name="<Group>"> 4825 <g> 4826 <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> 4827 <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> 4828 <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> 4829 <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> 4830 <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> 4831 <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> 4832 <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> 4833 <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> 4834 <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> 4835 </g> 4836 </g> 4837 </g> 4838</svg> 4839 4840 4841</a> 4842<a href="https://play.google.com/store/apps/details?id=com.developer.farmait" target="_blank">
4843<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"> 4844 <defs id="defs1376"> 4845 <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1390"> 4846 <path d="M 0,2207.03 H 6460 V 292.961 H 0 Z" id="path1388"></path> 4847 </clipPath> 4848 <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1412"> 4849 <path d="M 0,2207.04 H 6460 V 292.961 H 0 Z" id="path1410"></path> 4850 </clipPath> 4851 </defs> 4852 <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> 4853 <g id="g1380" inkscape:groupmode="layer" inkscape:label="Page 1" transform="matrix(1.3333333,0,0,-1.3333333,-5.5867668e-7,294.27066)"> 4854 <g id="g1382" transform="scale(0.1)"> 4855 <g id="g1384"> 4856 <g id="g1386" clip-path="url(#clipPath1390)"> 4857 <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> 4858 <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> 4859 <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
4859-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> 4860 <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> 4861 <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> 4862 <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> 4863 <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> 4864 </g> 4865 </g> 4866 <g id="g1406"> 4867 <g id="g1408" clip-path="url(#clipPath1412)"> 4868 <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> 4869 <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> 4870 <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
4870-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> 4871 <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> 4872 <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> 4873 <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> 4874 <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> 4875 <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> 4876 <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> 4877 <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> 4878 <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> 4879 <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
4879-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> 4880 <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> 4881 </g> 4882 </g> 4883 </g> 4884 </g> 4885</svg> 4886 4887</a></div> 4888 </div> 4889 </div> 4890 </div> 4891</div> 4892
4893<script> 4894if(typeof FeedatyWidget !== 'undefined') { 4895FeedatyWidget.init(); 4896} 4897</script>
4897</div> </div> 4898 </template> 4899 </div> 4900 <div class="footer content">
4900<script> 4901 addEventListener('DOMContentLoaded', () => { 4902 for (const [selector, label] of Object.entries({"aside.sidebar-main":"Sidebar Main","aside.sidebar-additional":"Sidebar Additional"})) { 4903 const target = document.querySelector(selector); 4904 target && target.setAttribute('aria-label', label); 4905 } 4906 }, {once: true}) 4907</script>
vendor: 1 bytes, line 4907
4907
4908<script> 4909 'use strict'; 4910 4911 function amBrandsPopup() { 4912 let cached = false; 4913 4914 const displayError = (error) => { 4915 console.error(error); 4916 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 4917 [{ 4918 type: "error", 4919 text: "Qualcosa\u0020\u00E8\u0020andato\u0020storto.\u0020Riprova\u0020di\u0020nuovo." 4920 }], 10000 4921 ); 4922 }; 4923 4924 let letters = [ 4925 "A","B","C","D", 4926 "E","F","G","H","I","J","K","L","M", 4927 "N","O","P","Q","R","S","T","U","V","W","X","Y","Z","#" 4928 ]; 4929 4930 return { 4931 hoverPanelActiveId: null, 4932 selectedLetter: null, 4933 items: [], 4934 letters: [], 4935 showCount: null, 4936 showFilter: null, 4937 showImages: true, 4938 showSearch: null, 4939 loading: false, 4940 label: 'Brands', 4941 isPopupEnabled: false, 4942 isTopMenuItemEnabled: false, 4943 cache: false, 4944 isMobile: false, 4945 4946 initErrorMessages(errors) { 4947 const messages = []; 4948 for (let error in Object.keys(errors)) { 4949 messages.push({type: 'error', text: errors[error].message}); 4950 } 4951 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages(messages, 10000); 4952 }, 4953 4954 chooseLetter(letter) { 4955 this.selectedLetter = this.selectedLetter === letter ? null : letter; 4956 }, 4957 4958 getQuery() { 4959 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 } }" }, 4960 4961 /** 4962 * Retrieve media url for given path 4963 * 4964 * @param path 4965 * @returns {string} 4966 */ 4967 getMediaUrl(path) { 4968 const baseUrl = BASE_URL.replace('index.php/', ''); 4969 if (path.includes('://')) { 4970 return path; 4971 } 4972 4973 let productImageUrl = `${baseUrl}${path}`; 4974 const regexDuplicateDomain = new RegExp(`^(https?:\/\/[^/]+).*\\1`); 4975 productImageUrl = productImageUrl.replace(regexDuplicateDomain, '$1'); 4976 4977 return productImageUrl.includes('/product/placeholder/') 4978 ? productImageUrl.replace(/\/media(?=\/static)/, '') 4979 : productImageUrl; 4980 }, 4981 4982 checkIsMobileResolution() { 4983 this.isMobile = window.matchMedia('(max-width: 1023px)').matches; 4984 }, 4985 4986 getBrandUrl(url){ 4987 return BASE_URL + url; 4988 }, 4989 4990 init() { 4991 this.checkIsMobileResolution(); 4992 4993 this.$watch('hoverPanelActiveId', (value) => { 4994 if (value === 'am-brand') { 4995 this.sendRequest(); 4996 } 4997 }); 4998 }, 4999 5000 /** 5001 * Get brands by letter 5002 * 5003 * @param result 5004 * @returns {{imageWidth: *, isTopMenuItemEnabled: *, showCount: *, displayAll: *, showFilter: *, showImages: *, isPopupEnabled: *, label: *, imageHeight: *, filterDisplayAll: *, brandsPage: *}} 5005 */ 5006 settingsMapper(result) { 5007 const config = result.data.storeConfig?.amshopby_brand_general_brands_popup_config; 5008 return { 5009 showImages: config.show_images, 5010 showCount: config.show_count, 5011 showFilter: config.show_filter, 5012 imageWidth: config.image_width, 5013 imageHeight: config.image_height, 5014 filterDisplayAll: config.filter_display_all, 5015 displayAll: config.display_zero, 5016 isPopupEnabled: result.data.storeConfig?.amshopby_brand_general_brands_brands_popup, 5017 label: result.data.storeConfig?.amshopby_brand_general_menu_item_label, 5018 isTopMenuItemEnabled: result.data.storeConfig?.amshopby_brand_general_topmenu_enabled, 5019 brandsPage: result.data.storeConfig?.amshopby_brand_general_brands_page, 5020 } 5021 }, 5022 5023 /** 5024 * Send request to graphql 5025 * 5026 * @returns {Promise<any>} 5027 */ 5028 async sendRequest() { 5029 if (this.isMobile) { 5030 return false;
5031 } 5032 5033 this.loading = true; 5034 5035 try { 5036 if (cached) { 5037 this.loading = false; 5038 return false; 5039 } 5040 5041 const response = await fetch('https://www.farma.it/graphql', { 5042 method: 'POST', 5043 headers: { 5044 'Content-Type': 'application/json', 5045 'Store': 'default' 5046 }, 5047 credentials: 'include', 5048 body: JSON.stringify({query: this.getQuery(), variables: {}}) 5049 }); 5050 5051 const result = await response.json(); 5052 5053 if (result?.errors) { 5054 this.initErrorMessages(result.errors); 5055 return; 5056 } 5057 5058 const data = result.data?.ambrandlist; 5059 const mapper = this.settingsMapper(result); 5060 5061 // Update component settings 5062 Object.keys(mapper).forEach(config => { 5063 this[config] = mapper[config]; 5064 }); 5065 5066 if (!this.filterDisplayAll) { 5067 letters = data.all_letters.split(','); 5068 } 5069 5070 const items = data.items.map(brand => { 5071 brand.image = brand.img 5072 ? this.getMediaUrl(brand.img) : (brand.image ? this.getMediaUrl(brand.image) : null); 5073 return brand; 5074 }); 5075 5076 this.letters = letters.map(letter => ({ 5077 letter, 5078 brands: this.getLetterItems(items, letter), 5079 })); 5080 5081 this.items = this.letters.filter(row => row.brands?.length > 0); 5082 5083 cached = true; 5084 } catch (error) { 5085 displayError(error); 5086 } finally { 5087 this.loading = false; 5088 } 5089 }, 5090 5091 /** 5092 * Get brands by letter 5093 * 5094 * @param items 5095 * @param letter 5096 * @returns {*} 5097 */ 5098 getLetterItems(items, letter) { 5099 return items.filter(row => row.letter === letter); 5100 }, 5101 5102 convertHtml(text) { 5103 let textField = document.createElement("textarea"); 5104 textField.innerHTML = text; 5105 return textField.value; 5106 } 5107 } 5108 } 5109 5110 function amBrandsPopupData() { 5111 return Object.assign( 5112 amBrandsPopup(), 5113 { 5114 brandPopupClass() { 5115 return { 5116 'hover:border-primary data-[active]:border-primary': !this.isPopupEnabled 5117 } 5118 }, 5119 labelPopupClass() { 5120 return {'w-14 opacity-0': this.label === ''} 5121 }, 5122 popupcontentClass() { 5123 return { 5124 'hidden' : this.hoverPanelActiveId !== 'am-brand', 5125 'left-0' : `${this.$el.dataset.first}`, 5126 'right-0' : `${this.$el.dataset.last}` 5127 } 5128 }, 5129 panelActiveMouseenterEvent() { 5130 return this.hoverPanelActiveId = 'am-brand' 5131 }, 5132 panelActiveMouseleaveEvent() { 5133 return this.hoverPanelActiveId = null 5134 }, 5135 isPopupShow() { 5136 return this.hoverPanelActiveId === 'am-brand' 5137 }, 5138 labelText(){ 5139 return this.label 5140 }, 5141 isEnabledPopup(){ 5142 return this.isPopupEnabled 5143 }, 5144 showExtMessage(){ 5145 return false 5146 }, 5147 notLoading() { 5148 return !this.loading 5149 }, 5150 brandLabel() { 5151 return this.brand.label 5152 }, 5153 letterClass() { 5154 return { 5155 'border-blue-400 text-blue-400 bg-blue-100': this.selectedLetter === this.letter.letter, 5156 'bg-gray-200 text-gray-700 cursor-default pointer-events-none': !this.letter.brands || this.letter.brands.length === 0 5157 } 5158 }, 5159 letterClickEvent(event) { 5160 return this.chooseLetter(this.letter.letter) 5161 }, 5162 letterBrands() { 5163 return this.letter.brands 5164 }, 5165 brandUrl() { 5166 return this.getBrandUrl(this.brand.url) 5167 }, 5168 brandImage() { 5169 return this.brand.image 5170 },
5171 notBrandImage() { 5172 return !this.brand.image 5173 }, 5174 letterLetter() { 5175 return this.letter.letter 5176 }, 5177 brandBrandId() { 5178 return this.brand.brandId 5179 }, 5180 isLetterShow() { 5181 return !this.selectedLetter || this.selectedLetter === this.letter.letter 5182 }, 5183 brandImageMediaUrl() { 5184 return this.getMediaUrl(this.brand.image) 5185 }, 5186 brandImageStyle() { 5187 return `max-width: ${this.imageWidth ? this.imageWidth + 'px' : '100px' };max-height: ${this.imageHeight ? this.imageHeight + 'px' : 'inherit'}` 5188 }, 5189 brandsLabelStyle() { 5190 return `min-width: ${this.imageWidth}px` 5191 }, 5192 brandLabelFilter() { 5193 return this.brand.label.charAt(0) 5194 }, 5195 brandCnt() { 5196 return '(' + this.brand.cnt + ')' 5197 } 5198 } 5199 ) 5200 } 5201 window.addEventListener('alpine:init', () => Alpine.data('amBrandsPopupData', amBrandsPopupData), {once: true}); 5202</script>
5202 5203</div><div class="after-footer footer content"> 5204 <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"> 5205 <template x-if="show"> 5206 <div class="dna-footer-item-content"> 5207 <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"> 5208 <div class="md:flex justify-between text-white container lg:grid grid-cols-8"> 5209 <div class="flex items-center order-2 col-span-2 mb-4 md:mb-0 w-60 socials"> 5210 <h5 class="font-bold font-baloo-bhaina text-white">Seguici su</h5> 5211 <a target="_blank" href="https://www.instagram.com/farma.it/" class="ml-4"> 5212 <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" /> 5213 </a> 5214 <a target="_blank" href="https://www.facebook.com/farmapuntoit" class="ml-4"> 5215 <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" /> 5216 </a> 5217 </div> 5218 <div class="col-span-6"> 5219 <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"> 5220 <span class="flex gap-1.5"><span class="hidden md:block"> -</span>CREDITS 5221 <a href="https://www.dnafactory.it/" target="_blank" title="DNA Factory"> 5222 <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" /> 5223 </a> 5224 </span> 5225 </p> 5226 5227 <p class="text-xxs md:text-xs">Sede legale Via delle Repubbliche Marinare 128, 80147 Napoli </br> 5228Vendita online di medicinali senza obbligo di prescrizione effettuata tramite esercizio autorizzato dal Ministero della Salute â Codice identificativo n. 016715</p> 5229 </div> 5230 </div> 5231</div></div> </div> 5232 </template> 5233 </div> 5234 </div></footer>
5235<script> 5236 function amBannerInjectorResolver () { 5237 const injectors = Object.values({"products.among.injector":{"position":14,"name":"amBannerAmongCategoryInjector"},"products.belowcart.injector":{"position":15,"name":"amBannerBelowCartInjector"}}); 5238 5239 return { 5240 amBannerAmongCategoryInjector: function (sectionId, injectorParams) { 5241 const container = document.querySelector('[data-role="amasty-banner-container"][data-position="' + sectionId + '"]'); 5242 5243 Object.keys(injectorParams.banners).map((id) => { 5244 const params = injectorParams.banners[id]; 5245 const element = container.querySelector('[data-banner-id="' + id + '"]'); 5246 insertBannerAmongCategoryByConfig({ 5247 containerSelector: injectorParams.containerSelector, 5248 itemSelector: injectorParams.itemSelector, 5249 afterProductRow: params.afterProductRow, 5250 afterProductNum: params.afterProductNum, 5251 span: params.width 5252 }, element); 5253 }); 5254 5255 function insertBannerAmongCategoryByConfig (injectorConfig, element) { 5256 const options = { 5257 injectorConfig: {}, 5258 container: null, 5259 after: null, 5260 wrapper: null, 5261 initialized: false, 5262 gridSizes: ['sm', 'xl'], 5263 bannerWidthClass: 'col-span', 5264 ...injectorConfig 5265 } 5266 5267 insertBanner(element); 5268 5269 function insertBanner(element) { 5270 const initialized = setOptions(); 5271 5272 if (!initialized) { 5273 return; 5274 } 5275 5276 element.classList.add('ambanners-injected-banner'); 5277 const wrapper = options.wrapper.cloneNode(true); 5278 5279 wrapper.classList.remove('card', 'card-interactive'); 5280 addStylesForDifferentSizes(wrapper); 5281 5282 insertWrapper(wrapper); 5283 wrapper.append(element); 5284 } 5285 5286 function setOptions () { 5287 const initialized = document.querySelector(options.containerSelector) !== null; 5288 5289 if (!initialized) { 5290 console.warn( 5291 'Failed to initialize banner: Can\'t find an element with selector "' + options.containerSelector + '"' 5292 ); 5293 5294 return; 5295 } 5296 5297 options.container = document.querySelector(options.containerSelector); 5298 5299 setLineToInject(); 5300 5301 if (!options.after) { 5302 return; 5303 } 5304 5305 setWrapper(); 5306 5307 return true; 5308 } 5309 5310 function setLineToInject() { 5311 if (options.afterProductNum === -1) { 5312 setFirstLineToInject(); 5313 } else { 5314 setLineByPositionToInject(); 5315 } 5316 } 5317 5318 function setWrapper() { 5319 if (options.after) { 5320 options.wrapper = options.after.cloneNode(); 5321 } 5322 } 5323 5324 function setFirstLineToInject() { 5325 options.after = document.querySelector(options.itemSelector); 5326 } 5327 5328 function setLineByPositionToInject() { 5329 // calc banner insert offset 5330 const offset = calculateOffsetBasedOnPreviousBanners(); 5331 5332 options.after = document.querySelectorAll(options.itemSelector)[options.afterProductNum - offset]; 5333 } 5334 5335 function calculateOffsetBasedOnPreviousBanners () { 5336 return [...document.querySelectorAll(`${options.itemSelector}`)] 5337 ?.reduce((accumulator, amInjectedBannerWrapper) => { 5338 const widthAttributeValue = Number(amInjectedBannerWrapper?.getAttribute('am-banner-span')) 5339 5340 if (widthAttributeValue > 1) { 5341 accumulator += (widthAttributeValue - 1); 5342 } 5343 5344 return accumulator; 5345 }, 0); 5346 } 5347 5348 function insertWrapper(insert) { 5349 if (options.after) { 5350 insertWrapperAfterFoundProduct(insert); 5351 } else if (options.container) { 5352 insertWrapperInProductListContainer(insert); 5353 } 5354 } 5355 5356 function insertWrapperAfterFoundProduct(insert) { 5357 if (options.afterProductNum === -1) { 5358 options.after.parentNode.insertBefore(insert, options.after); 5359 } else { 5360 options.after.parentNode.insertBefore(insert, options.after.nextSibling); 5361 } 5362 } 5363 5364 function insertWrapperInProductListContainer(insert) { 5365 if (parseInt(options.afterProductRow) > 1) {
5366 options.container.innerHTML += insert.innerHTML; 5367 } else { 5368 options.container.innerHTML = insert.innerHTML + options.container.innerHTML; 5369 } 5370 } 5371 5372 function addStylesForDifferentSizes (wrapper) { 5373 options.gridSizes?.forEach((size, index) => { 5374 const widthValue = options.span > index + 1 ? index + 2 : options.span; 5375 wrapper?.classList.add(`${size}:${options.bannerWidthClass}-${widthValue}`); 5376 wrapper?.setAttribute('am-banner-span', widthValue); 5377 }); 5378 } 5379 } 5380 }, 5381 5382 amBannerBelowCartInjector: function (sectionId) { 5383 const belowProductAddToCartBanner = document.querySelector('.ambanners.ambanner-' + sectionId); 5384 belowProductAddToCartBanner.style.display = 'block'; 5385 document.querySelectorAll('.product-item')?.forEach(product => { 5386 product?.append(belowProductAddToCartBanner.cloneNode(true)); 5387 }); 5388 belowProductAddToCartBanner.style.display = 'none'; 5389 }, 5390 5391 resolve: function (position, injectorParams) { 5392 const injector = injectors.find((injector) => { 5393 return injector.position === Number(position); 5394 }); 5395 5396 return this[injector?.name]?.(position, injectorParams); 5397 } 5398 } 5399 } 5400</script>
5400 5401 <span class="data-fbq-success" data-fbq-success="true"></span> 5402 5403<div x-data="{...hyva.modal(), ...initAmGdprPolicyPopup()}" x-init="initGdprPopup()" 5404 x-spread="eventListeners" x-bind="eventListeners"> 5405 <div x-cloak x-spread="overlay('amgdpr-policy-popup')" x-bind="overlay('amgdpr-policy-popup')" 5406 class="fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-40"> 5407 <div x-ref="amgdpr-policy-popup" role="dialog" aria-labelledby="amgdpr-policy-content" 5408 class="flex flex-col bg-white shadow-xl rounded-lg p-10 max-h-[95vh] max-w-6xl relative"> 5409 <button @click="$dispatch('amgdpr-close-policy')" aria-label="Chiudi" 5410 class="absolute right-4 top-4 text-gray-300 transition 5411 hover:text-black focus:drop-shadow-md hover:drop-shadow-md"> 5412 <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"> 5413 <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"/> 5414<title>x</title></svg> 5415 </button> 5416 <div class="flex w-full"> 5417 <p class="w-full text-3xl mb-5" x-text="title"></p> 5418 </div> 5419 <div x-show="notificationText && policyData.versionChanged" class="flex w-full"> 5420 <p class="mb-4 p-4 bg-yellow-100 w-full" x-text="notificationText"></p> 5421 </div> 5422 <div id="amgdpr-policy-content" class="max-h-[500px] overflow-auto first:mx-0 child:mx-0" 5423 x-html="policyText"></div> 5424 <div class="mt-8 flex w-full justify-center"> 5425 <button x-focus-first @click="$dispatch('amgdpr-accept-policy')" type="button" 5426 class="btn btn-primary font-bold" 5427 aria-label="Ho letto e Acconsento"> 5428 Ho letto e Acconsento </button> 5429 </div> 5430 </div> 5431 5432 </div> 5433</div> 5434
5435<script> 5436 'use strict'; 5437 5438 function initAmGdprPolicyPopup() { 5439 return { 5440 /** 5441 * @typedef PolicyData 5442 * @property {string} policyVersion 5443 * @property {boolean} show 5444 * @property {string} title 5445 * @property{boolean} versionChanged 5446 * @property {boolean} hideClose 5447 * @property {boolean} action 5448 */ 5449 5450 eventListeners: { 5451 ['@amgdpr-accept-policy']() { 5452 if (this.consentId) { 5453 window.dispatchEvent(new CustomEvent('amgdpr-consent-accepted', {detail: this.consentId})); 5454 this.consentId = undefined; 5455 this.hide('amgdpr-policy-popup'); 5456 } else { 5457 this.acceptPolicy(); 5458 } 5459 }, 5460 ['@amgdpr-show-policy.window'](event) { 5461 this.consentId = event.detail; 5462 this.fetchPolicyContent().then(() => { 5463 this.$nextTick(() => { 5464 this.show('amgdpr-policy-popup'); 5465 }); 5466 }); 5467 }, 5468 ['@amgdpr-close-policy']() { 5469 this.hide('amgdpr-policy-popup'); 5470 } 5471 }, 5472 textUrl: `${BASE_URL}gdpr/policy/policytext`, 5473 acceptUrl: `${BASE_URL}gdpr/policy/accept`, 5474 popupDataUrl: `${BASE_URL}gdpr/policy/popupData`, 5475 notificationText: 'We would like to inform you that our Privacy Policy has been amended.Please, read and accept the new terms.', 5476 showOnPageLoad: '', 5477 /** 5478 * @type PolicyData 5479 */ 5480 policyData: { 5481 policyVersion: '', 5482 show: false, 5483 title: '', 5484 versionChanged: false, 5485 hideClose: false, 5486 action: true 5487 }, 5488 title: '', 5489 policyText: '', 5490 consentId: undefined, 5491 initGdprPopup: function () { 5492 this.fetchPolicyData().then(() => { 5493 if ((this.showOnPageLoad && this.policyData.show) || this.policyData.versionChanged) { 5494 this.fetchPolicyContent().then(() => { 5495 this.$nextTick(() => { 5496 this.show('amgdpr-policy-popup'); 5497 }); 5498 }); 5499 } 5500 }); 5501 }, 5502 5503 /** 5504 * @returns {Promise} 5505 */ 5506 fetchPolicyData: function () { 5507 return fetch(this.popupDataUrl) 5508 .then(response => response.json()) 5509 .then((data) => { 5510 this.policyData = {...data} 5511 }) 5512 .catch(error => this.dispatchErrorMessage(error)); 5513 }, 5514 5515 /** 5516 * @returns {Promise} 5517 */ 5518 fetchPolicyContent: function () { 5519 this.title = ''; 5520 this.policyText = ''; 5521 5522 const params = !!this.consentId 5523 ? '?' + new URLSearchParams({consent_id: this.consentId}) 5524 : '' 5525 5526 return fetch(this.textUrl + params) 5527 .then(response => response.json()) 5528 .then(policyContent => { 5529 this.title = policyContent.title; 5530 this.policyText = policyContent.content; 5531 }).catch(error => this.dispatchErrorMessage(error)); 5532 }, 5533 5534 /** 5535 * @returns {void} 5536 */ 5537 acceptPolicy: function () { 5538 window.dispatchEvent(new Event('amgdpr-loading-start')); 5539 5540 const body = new URLSearchParams({form_key: hyva.getFormKey(), ...this.policyData}); 5541 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 5542 5543 fetch(this.acceptUrl, {method: 'POST', body, headers: {'Content-Type': contentType}}) 5544 .then(response => response.json()) 5545 .then(data => { 5546 if (data.error) { 5547 this.dispatchErrorMessage(data.message) 5548 } else { 5549 this.notificationText = ''; 5550 this.hide('amgdpr-policy-popup'); 5551 } 5552 }) 5553 .catch(error => this.dispatchErrorMessage(error)) 5554 .finally(() => window.dispatchEvent(new Event('amgdpr-loading-stop'))); 5555 }, 5556 5557 /** 5558 * @param {string} message 5559 * @returns {void} 5560 */ 5561 dispatchErrorMessage: function (message) { 5562 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 5563 { 5564 type: "error", 5565 text: message 5566 } 5567 ]); 5568 } 5569 } 5570 } 5571</script>
5571 5572 5573 5574 5575
5576<script> 5577 function initFakeBrothers() { 5578 return { 5579 selected: 0, 5580 productId: 0, 5581 data: [], 5582 skeletonCount: 0, 5583 fetched: false, 5584 ajaxUrl: 'https://www.farma.it/fakeconfigurable/product/getBrothers/', 5585 showAttribute: false, 5586 attributeLabel: 'Color', 5587 optionDisplay: null, 5588 responsive: false, 5589 responsiveData: { 5590 children: [], 5591 childrenLenght: 0, 5592 itemSize: 0, 5593 itemOffset: 0, 5594 childrenSize: 0, 5595 boxSize: 0, 5596 hiddenCount: 0 5597 }, 5598 init() { 5599 // Skeleton init 5600 if (this.skeletonCount) { 5601 this.data = Array.from({length: this.skeletonCount}, () => ({})); 5602 } 5603 // Responsive init 5604 this.$nextTick(() => { 5605 if (this.responsive && this.data.length) { 5606 this.initResponsive(); 5607 } 5608 }); 5609 // Brothers init 5610 if (this.productId) { 5611 fetch(this.ajaxUrl + '?productId=' + this.productId) 5612 .then(response => { 5613 if (! response.ok) console.warn('GET request failed'); 5614 return response.json() 5615 }) 5616 .then(result => { 5617 if (this.showAttribute) { 5618 result.data.forEach(function (item, index) { 5619 if (item.attribute == false) { 5620 result.data[index].attribute = ''; 5621 } 5622 }); 5623 } 5624 this.data = result.data; 5625 this.fetched = true; 5626 // Attribute init 5627 this.$nextTick(() => { 5628 if (this.showAttribute) { 5629 // Siccome "x-ref" non funziona dentro gli elementi "template" devo usare "querySelector" 5630 this.optionDisplay = document.querySelector('[x-ref="optionDisplay"]'); 5631 this.optionDisplay.innerText = this.data[0].attribute; 5632 } 5633 }) 5634 }) 5635 .catch(result => { 5636 console.error(result.error); 5637 }) 5638 } 5639 }, 5640 initResponsive() { 5641 this.responsiveData.children = this.$el.querySelectorAll('.brother'); 5642 this.responsiveData.itemSize = this.responsiveData.children[0].offsetWidth + this.responsiveData.itemOffset; 5643 this.responsiveData.childrenLenght = this.responsiveData.children.length; 5644 this.responsiveData.childrenSize = this.responsiveData.childrenLenght * this.responsiveData.itemSize; 5645 this.calculateHiddenCount(); 5646 }, 5647 calculateHiddenCount() { 5648 if (this.responsive) { 5649 this.responsiveData.boxSize = this.$el.offsetWidth; 5650 5651 if (this.responsiveData.childrenSize > this.responsiveData.boxSize) { 5652 this.responsiveData.hiddenCount = 5653 Math.ceil((this.responsiveData.childrenSize - this.responsiveData.boxSize) / this.responsiveData.itemSize) + 1; 5654 } else { 5655 this.responsiveData.hiddenCount = 0; 5656 } 5657 } 5658 }, 5659 eventListeners: { 5660 ['@resize.window.debounce.50ms']() { 5661 this.calculateHiddenCount(); 5662 } 5663 } 5664 } 5665 5666 } 5667</script>
5667 5668<!-- Start Google Analytics 4 for Google Tag Manager by MagePal --> 5669
5669<script type="text/javascript"> 5670 (function() { 5671 window.addEventListener("private-content-loaded", event => { 5672 const dataObject = event.detail.data['magepal-eegtm-jsdatalayer'] || {}; 5673 pushAddRemoveItemDataLayer(dataObject) 5674 }); 5675 5676 const isObject = x => x === Object(x); 5677 const has = (x, p) => isObject(x) && x.hasOwnProperty(p); 5678 var itemListName = null; 5679 var itemListId = null; 5680 5681 function isEmpty(obj){ 5682 return JSON.stringify(obj) === '{}'; 5683 } 5684 5685 function addDynamicElements(storedData, item) { 5686 5687 if (has(storedData, 'index')) { 5688 item.index = storedData.index; 5689 } 5690 5691 if (has(storedData, 'item_list_id')) { 5692 item.item_list_id = itemListId = storedData.item_list_id; 5693 } 5694 5695 if (has(storedData, 'item_list_name')) { 5696 item.item_list_name = itemListName = storedData.item_list_name; 5697 } 5698 } 5699 /** 5700 * Add click position/index to data 5701 * @param ecommerceData 5702 * @return {*} 5703 */ 5704 function processData(ecommerceData) { 5705 var storedData = JSON.parse(window.localStorage.getItem("product-click-ga4")); 5706 5707 ecommerceData.forEach((data) => { 5708 if (has(data, 'parent_sku') 5709 && isObject(storedData) 5710 && has(storedData, 'item_id') 5711 && data.parent_sku === storedData.item_id 5712 ) { 5713 addDynamicElements(storedData, data); 5714 } else if (has(data, 'parent_sku')) { 5715 var product = getProductBySku(data.parent_sku); 5716 5717 if (product) { 5718 addDynamicElements(product, data); 5719 } 5720 } 5721 }); 5722 5723 return ecommerceData; 5724 } 5725 5726 function getProductBySku(sku) { 5727 var dlItems = window.dataLayer.find((item) => item?.ecommerce?.items) 5728 5729 if (dlItems !== 'undefined') { 5730 var dlItem = dlItems?.ecommerce?.items.find((item) => item.item_id === sku) 5731 if (dlItem !== undefined) { 5732 return dlItem; 5733 } 5734 } 5735 5736 return false; 5737 } 5738 5739 function pushAddRemoveItemDataLayer(data) { 5740 if (isObject(data) && has(data, 'cart_items')) { 5741 var ts = window.localStorage.getItem("magepal-eegtm-jsdatalayer-ts"); 5742 5743 if (ts !== 'undefined' && parseInt(ts) === parseInt(data.data_id)) { 5744 return false; 5745 } else { 5746 window.localStorage.setItem("magepal-eegtm-jsdatalayer-ts", parseInt(data.data_id)); 5747 } 5748 5749 var cartGenericLayer = {}; 5750 var dataLayer = window.dataLayer; 5751 var self = this; 5752 5753 data.cart_items.forEach((cartItem) => { 5754 if (has(cartItem, 'event')) { 5755 if (has(cartItem,'ecommerce')) { 5756 cartItem.ecommerce.currency = 'EUR'; 5757 } 5758 5759 if (cartItem.event === 'add_to_cart') { 5760 var itemsAdded = processData(cartItem.ecommerce.items); 5761 5762 //$("body").trigger("mpGa4ItemAddToCart", [itemsAdded, dataLayer]); 5763 cartGenericLayer.add = { 5764 'products': itemsAdded 5765 }; 5766 } 5767 5768 if (cartItem.event === 'remove_from_cart') { 5769 var itemsRemoved = processData(cartItem.ecommerce.items); 5770 5771 //$("body").trigger("mpGa4ItemRemoveFromCart", [itemsRemoved, dataLayer]); 5772 cartGenericLayer.remove = { 5773 'products': itemsRemoved 5774 }; 5775 } 5776 } 5777 5778 if (!isEmpty(cartGenericLayer)) { 5779 cartItem.cart = cartGenericLayer; 5780 } 5781 cartItem._clear = true; 5782 dataLayer.push(cartItem); 5783 }); 5784 } 5785 } 5786 })(); 5787 </script>
5787 5788 <!-- End Google Analytics 4 for Google Tag Manager by MagePal --> 5789
5790<script> 5791 document.addEventListener("alpine:initialized", () => { 5792 Alpine.store('dnafactoryGA4Promotions', { 5793 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
5793i 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\"]"}], 5794 sentViewPromotions: [], 5795 sentClickPromotions: [], 5796 5797 init() { 5798 let self = this; 5799 self.promotions.forEach(function (promotion) { 5800 var promotionElement = document.querySelector(promotion['css_selector']); 5801 if (promotionElement) { 5802 let aElement = promotionElement; 5803 if (promotionElement.tagName !== 'A') { 5804 aElement = promotionElement.closest('[data-content-type] a[href]'); 5805 } 5806 5807 if (aElement) { 5808 if (!self.sentViewPromotions.includes(promotion['promotion_id'])) { 5809 self.sendView(promotion, aElement); 5810 } 5811 5812 aElement.addEventListener('click', function(e) { 5813 if (!self.sentClickPromotions.includes(promotion['promotion_id'])) { 5814 self.sendClick(promotion, aElement); 5815 } 5816 }); 5817 } 5818 } 5819 }); 5820 5821 var additionalObserver = new MutationObserver(function(mutations) { 5822 mutations.forEach(function(mutation) {
5823 mutation.addedNodes.forEach(function(addedNode) { 5824 if (addedNode.matches && addedNode.matches('.swiper-wrapper')) { 5825 self.promotions.forEach(function (promotion) { 5826 var promotionElement = document.querySelector(promotion['css_selector']); 5827 if (promotionElement) { 5828 let aElement = promotionElement; 5829 if (promotionElement.tagName !== 'A') { 5830 aElement = promotionElement.closest('[data-content-type] a[href]'); 5831 } 5832 5833 if (!self.sentViewPromotions.includes(promotion['promotion_id'])) { 5834 self.sendView(promotion, aElement); 5835 } 5836 5837 aElement.addEventListener('click', function(e) { 5838 if (!self.sentClickPromotions.includes(promotion['promotion_id'])) { 5839 self.sendClick(promotion, aElement); 5840 } 5841 }); 5842 } 5843 }); 5844 } 5845 }); 5846 }); 5847 }); 5848 5849 document.querySelectorAll('[data-content-type="slider"], [data-role="amasty-banner-container"]').forEach(function (element) { 5850 additionalObserver.observe(element, {childList: true, subtree: true}); 5851 }); 5852 }, 5853 5854 sendView(promotionData, promotionElement = null) { 5855 this.sentViewPromotions.push(promotionData['promotion_id']); 5856 promotionData = this.normalizeData(promotionData, promotionElement); 5857 window.dataLayer.push({ 5858 event: 'view_promotion', 5859 ecommerce: { 5860 creative_name: promotionData['creative_name'], 5861 creative_slot: promotionData['creative_slot'], 5862 promotion_id: promotionData['promotion_id'], 5863 promotion_name: promotionData['promotion_name'], 5864 } 5865 }) 5866 }, 5867 5868 sendClick(promotionData, promotionElement = null) { 5869 this.sentClickPromotions.push(promotionData['promotion_id']); 5870 promotionData = this.normalizeData(promotionData, promotionElement); 5871 window.dataLayer.push({ 5872 event: 'select_promotion', 5873 ecommerce: { 5874 creative_name: promotionData['creative_name'], 5875 creative_slot: promotionData['creative_slot'], 5876 promotion_id: promotionData['promotion_id'], 5877 promotion_name: promotionData['promotion_name'], 5878 } 5879 }) 5880 }, 5881 5882 normalizeData(promotionData, promotionElement = null) { 5883 if (!promotionElement) { 5884 return promotionData; 5885 } 5886 5887 var imgElement = promotionElement.querySelector('img'); 5888 if (!imgElement) { 5889 return promotionData; 5890 } 5891 5892 promotionData['creative_name'] = promotionData['creative_name'] ? promotionData['creative_name'] : imgElement.src.replace(BASE_URL, ''); 5893 promotionData['creative_slot'] = promotionData['creative_slot'] ? promotionData['creative_slot'] : imgElement.alt; 5894 promotionData['promotion_name'] = promotionData['promotion_name'] ? promotionData['promotion_name'] : imgElement.title; 5895 return promotionData; 5896 } 5897 }); 5898 }); 5899</script>
5899 5900
5901<script> 5902 document.addEventListener("alpine:initialized", () => { 5903 Alpine.store('dnafactoryGA4Items', { 5904 itemsPushed: [], 5905 itemsSelected: [], 5906 itemsToPush: [], 5907 5908 sendItemListDebounced(...itemData) { 5909 let self = this; 5910 var itemDataToPush = itemData.filter(function (el) { 5911 var itemList = el.item_list_id ?? 'default_list'; 5912 if (!(self.itemsPushed.hasOwnProperty(itemList) && self.itemsPushed[itemList].includes(el.item_id))) { 5913 if (!self.itemsPushed.hasOwnProperty(itemList)) { 5914 self.itemsPushed[itemList] = []; 5915 } 5916 self.itemsPushed[itemList].push(el.item_id); 5917 return true; 5918 } 5919 5920 return false; 5921 }); 5922 5923 this.itemsToPush.push(...itemDataToPush); 5924 Alpine.debounce(this.updateItemList.bind(this), 200)(); 5925 }, 5926 5927 sendItemList(itemsData, currency = "EUR", itemlistName = "Default List", itemlistId = "default_list") { 5928 window.dataLayer.push({ 5929 event: 'view_item_list', 5930 ecommerce: { 5931 items: this.normalizeData(itemsData) 5932 }, 5933 currency: currency, 5934 item_list_name: itemlistName, 5935 item_list_id: itemlistId, 5936 _clear: true 5937 }) 5938 }, 5939 5940 sendSelectItem(itemData, currency = "EUR", itemlistName = "Default List", itemlistId = "default_list") { 5941 if (this.itemsSelected.includes(itemData.item_id)) { 5942 return; 5943 } 5944 this.itemsSelected.push(itemData.item_id); 5945 5946 window.dataLayer.push({ 5947 event: 'select_item', 5948 ecommerce: { 5949 items: this.normalizeData([itemData]) 5950 }, 5951 currency: currency, 5952 item_list_name: itemlistName, 5953 item_list_id: itemlistId, 5954 _clear: true 5955 }) 5956 }, 5957 5958 updateItemList() { 5959 var items = this.itemsToPush; 5960 this.itemsToPush = []; 5961 5962 if (items.length > 0) { 5963 var firstItem = items[0]; 5964 var [currency, itemListName, itemListId] = [firstItem.currency, firstItem.item_list_name, firstItem.item_list_id]; 5965 this.sendItemList(items, currency, itemListName, itemListId); 5966 } 5967 }, 5968 5969 normalizeData(itemData) { 5970 itemData.forEach(function (el) { 5971 var vatDivider = 1; 5972 if (el.hasOwnProperty('vat_divider')) { 5973 vatDivider = (parseFloat(el['vat_divider']) + 100)/100; 5974 if (vatDivider <= 0) { 5975 vatDivider = 1; 5976 } 5977 } 5978 5979 if (el.hasOwnProperty('price')) { 5980 el['price'] = parseFloat((el['price']/vatDivider).toFixed(2)); 5981 } 5982 5983 if (el.hasOwnProperty('discount')) { 5984 el['discount'] = parseFloat((el['discount']/vatDivider).toFixed(2)); 5985 } 5986 5987 if (el.hasOwnProperty('item_category')) { 5988 var categories = el['item_category'].split(/[>\/]+/); 5989 if (categories.length > 0) { 5990 var indexCategory = 1; 5991 categories.forEach(function (category) { 5992 var categoryKey = (indexCategory > 1) ? 'item_category' + indexCategory : 'item_category'; 5993 el[categoryKey] = category.trim(); 5994 indexCategory++; 5995 }); 5996 } 5997 } 5998 }); 5999 6000 return itemData; 6001 } 6002 }); 6003 }); 6004</script>
6004 6005
6006<script> 6007 window.DNAFACTORY_GA4_SHOW_PRICE_TAX = 0; 6008 if (!window.dataLayer) { 6009 window.dataLayer = []; 6010 } 6011</script>
6011 6012
6013<script> 6014 let SnapSlider = class { 6015 constructor(el, { 6016 labelSepparator = 'di', 6017 autoPager, 6018 groupPager, 6019 loop 6020 } = {}) { 6021 this.el = el; 6022 this.track = this.el.querySelector("[data-track]"); 6023 if (!this.track) { 6024 console.warn( 6025 "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track", 6026 this.el 6027 ); 6028 return; 6029 } 6030 this.initialLoad = true; 6031 this.slides = []; 6032 this.inViewObserver; 6033 this.mutationObserver; 6034 this.resizeObserver; 6035 this.pager = this.el.querySelector("[data-pager]"); 6036 this.navBtns = Array.from( 6037 this.el.querySelectorAll("[data-next], [data-prev]") 6038 ); 6039 this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator; 6040 this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false; 6041 this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false; 6042 this.useLoop = loop || this.el.hasAttribute("data-loop") || false; 6043 this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, ""); 6044 this.sliderId = this.el.id || this.sliderLabel || "slider"; 6045 this.markerIdName = "data-target-id"; 6046 this.pagerClasses = this.el.dataset.pagerClass || "snap-pager"; 6047 this.markerClasses = this.el.dataset.markerClass || "snap-marker"; 6048 this.init(); 6049 } 6050 init() { 6051 this.setupSlides(); 6052 this.setupNav(); 6053 if (this.useAutoPager) { 6054 this.createPager(); 6055 } else { 6056 this.setupPager(); 6057 } 6058 this.setupObservers(); 6059 this.setupMutationObserver(); 6060 this.setupResizeObserver(); 6061 this.el.addEventListener("click", this.eventHandler.bind(this)); 6062 this.el.addEventListener("keydown", this.eventHandler.bind(this)); 6063 if ("onscrollend" in window) { 6064 this.track.addEventListener("scrollend", () => { 6065 this.isNavigating = false; 6066 }); 6067 } else { 6068 this.track.addEventListener("scroll", () => { 6069 clearTimeout(this.scrollEndTimer); 6070 this.scrollEndTimer = setTimeout(() => { 6071 this.isNavigating = false; 6072 }, 100); 6073 }); 6074 } 6075 } 6076 destroy() { 6077 this.inViewObserver?.disconnect(); 6078 this.mutationObserver?.disconnect(); 6079 this.resizeObserver?.disconnect(); 6080 this.el.removeEventListener("click", this.eventHandler.bind(this)); 6081 this.el.removeEventListener("keydown", this.eventHandler.bind(this)); 6082 } 6083 roundUpIfGreaterThan(number, min = 8) { 6084 const decimalPart = number - Math.floor(number); 6085 return decimalPart >= min ? Math.ceil(number) : Math.floor(number); 6086 } 6087 getInViewItems() { 6088 const inViewSlides = Array.from(this.track.querySelectorAll("[data-in-view]")).filter((el) => this.slides.includes(el)); 6089 const firstInViewSlide = inViewSlides[0] || null; 6090 const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null; 6091 const isAtStart = firstInViewSlide === this.slides[0]; 6092 const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1]; 6093 return { 6094 inViewSlides, 6095 totalInViewSlides: inViewSlides.length, 6096 firstInViewSlide, 6097 lastInViewSlide, 6098 isAtStart, 6099 isAtEnd, 6100 hasNoOverflow: isAtStart && isAtEnd 6101 }; 6102 } 6103 groupPagerMarkers() { 6104 if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return; 6105 const totalVisibleSlides = this.roundUpIfGreaterThan( 6106 this.track.offsetWidth / this.slides[0].offsetWidth 6107 ); 6108 const markers = Array.from(this.pager.querySelectorAll("a, button"));
6109 markers.forEach((marker, index) => { 6110 marker.style.display = index % totalVisibleSlides === 0 ? null : "none"; 6111 }); 6112 } 6113 handleInView(entries) { 6114 entries.forEach((entry) => { 6115 const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector( 6116 `[${this.markerIdName}="${entry.target.id}"]` 6117 )); 6118 entry.target.toggleAttribute("data-in-view", entry.isIntersecting); 6119 entry.target.toggleAttribute("inert", !entry.isIntersecting); 6120 marker?.setAttribute("aria-current", entry.isIntersecting); 6121 marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1"); 6122 }); 6123 const { isAtStart, isAtEnd, hasNoOverflow } = this.getInViewItems(); 6124 this.navBtns.forEach((btn) => { 6125 if (btn.hasAttribute("data-next")) { 6126 btn.style.visibility = hasNoOverflow ? "hidden" : null; 6127 isAtEnd && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 6128 } 6129 if (btn.hasAttribute("data-prev")) { 6130 btn.style.visibility = hasNoOverflow ? "hidden" : null; 6131 isAtStart && !this.useLoop ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 6132 } 6133 }); 6134 if (this.pager) { 6135 this.pager.style.visibility = hasNoOverflow ? "hidden" : null; 6136 this.pager.toggleAttribute("inert", hasNoOverflow); 6137 } 6138 if (!this.initialLoad) { 6139 this.el.dispatchEvent( 6140 new CustomEvent("slideChange", { 6141 detail: this.getInViewItems() 6142 }) 6143 ); 6144 } else { 6145 this.initialLoad = false; 6146 } 6147 if (document.activeElement.parentElement.hasAttribute("data-pager")) { 6148 const activeItems = this.pager.querySelectorAll('[tabindex="0"]'); 6149 if (activeItems.length) { 6150 activeItems[0].focus({ preventScroll: true }); 6151 } 6152 } 6153 } 6154 getSlides() { 6155 if (!this.track) return []; 6156 return Array.from(this.track.children).filter( 6157 (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" && child.style.display !== "none" 6158 ); 6159 } 6160 refreshSlides() { 6161 this.initialLoad = true; 6162 this.slides = this.getSlides(); 6163 this.setupSlides(); 6164 if (this.useAutoPager) { 6165 this.createPager(); 6166 } else { 6167 this.setupPager(); 6168 } 6169 this.groupPagerMarkers(); 6170 this.setupObservers(); 6171 } 6172 setupSlides() { 6173 this.slides = this.getSlides(); 6174 this.slides.forEach((slide, index) => { 6175 const totalSlides = this.slides.length; 6176 const currentSlide = index + 1; 6177 const existingLabel = slide.getAttribute("aria-label") || ""; 6178 const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture"; 6179 const slideLabelTag = isImage ? "alt" : "aria-label"; 6180 const hasAutoLabel = existingLabel.startsWith( 6181 `${currentSlide} ${this.slideLabelSepparator} ` 6182 ); 6183 if (!slide.hasAttribute("id")) { 6184 slide.setAttribute( 6185 "id", 6186 `${this.sliderId}-item-${currentSlide}` 6187 ); 6188 } 6189 if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) { 6190 slide.setAttribute( 6191 slideLabelTag, 6192 `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}` 6193 ); 6194 } 6195 if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) { 6196 slide.setAttribute("role", "group"); 6197 } 6198 if (this.pager && !isImage) { 6199 slide.setAttribute("role", "tabpanel"); 6200 } 6201 if (slide.getAttribute("role") === "group") { 6202 slide.setAttribute("aria-roledescription", "item"); 6203 } 6204 }); 6205 if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") { 6206 this.el.setAttribute("role", "region"); 6207 } 6208 if (!this.el.hasAttribute("aria-roledescription")) { 6209 this.el.setAttribute("aria-roledescription", "carousel"); 6210 } 6211 if (!this.track.hasAttribute("tabindex")) { 6212 this.track.setAttribute("tabindex", 0); 6213 } 6214 this.track.setAttribute("aria-live", "polite"); 6215 } 6216 setupNav() { 6217 this.navBtns.forEach((btn) => { 6218 btn.setAttribute("disabled", ""); 6219 btn.removeAttribute("hidden"); 6220 btn.classList.remove("invisible"); 6221 btn.style.visibility = null; 6222 }); 6223 } 6224 createPager() { 6225 const newPager = document.createElement("nav"); 6226 newPager.setAttribute("data-pager", ""); 6227 newPager.setAttribute("role", "tablist"); 6228 newPager.classList.add(...this.pagerClasses.split(" "));
6229 this.slides.forEach((slide, index) => { 6230 const marker = document.createElement("button"); 6231 const slideId = slide.id || `${this.sliderId}-item-${index + 1}`; 6232 marker.setAttribute(this.markerIdName, slideId); 6233 marker.classList.add(...this.markerClasses.split(" ")); 6234 this.setupPagerMarker(marker, index); 6235 newPager.appendChild(marker); 6236 if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") { 6237 slide.removeAttribute("aria-roledescription"); 6238 slide.setAttribute("role", "tabpanel"); 6239 } 6240 }); 6241 if (this.pager) { 6242 this.pager.setAttribute("role", "tablist"); 6243 this.pager.replaceChildren(...newPager.children); 6244 } else { 6245 this.track.after(newPager); 6246 this.pager = this.el.querySelector("[data-pager]"); 6247 } 6248 } 6249 setupPager() { 6250 if (!this.pager) return; 6251 this.pager.setAttribute("role", "tablist"); 6252 const items = Array.from(this.pager.querySelectorAll("a, button")); 6253 items.forEach((marker, index) => this.setupPagerMarker(marker, index)); 6254 } 6255 setupPagerMarker(marker, index) { 6256 const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 6257 const slideId = markerId || `${this.sliderId}-item-${index + 1}`; 6258 if (!markerId) { 6259 marker.setAttribute(this.markerIdName, slideId); 6260 } 6261 marker.setAttribute("role", "tab"); 6262 marker.setAttribute("aria-controls", slideId); 6263 marker.setAttribute("aria-posinset", index + 1); 6264 marker.setAttribute("aria-setsize", this.slides.length); 6265 marker.setAttribute("tabindex", "-1"); 6266 if (!marker.hasAttribute("aria-label")) { 6267 marker.setAttribute("aria-label", `Slide ${index + 1}`); 6268 } 6269 } 6270 setupObservers() { 6271 if (this.inViewObserver) { 6272 this.inViewObserver.disconnect(); 6273 } 6274 this.inViewObserver = new IntersectionObserver( 6275 this.handleInView.bind(this), { 6276 root: this.track, 6277 threshold: 0.8 6278 } 6279 ); 6280 this.slides.forEach((slide) => this.inViewObserver.observe(slide)); 6281 } 6282 setupMutationObserver() { 6283 this.mutationObserver = new MutationObserver((mutations) => { 6284 if (mutations.some((m) => m.type === "childList" || m.target.parentElement === this.track)) { 6285 this.refreshSlides(); 6286 } 6287 }); 6288 this.mutationObserver.observe(this.track, { 6289 childList: true, 6290 subtree: true, 6291 attributeFilter: ["style"] 6292 }); 6293 } 6294 setupResizeObserver() { 6295 this.resizeObserver = new ResizeObserver( 6296 this.groupPagerMarkers.bind(this) 6297 ); 6298 this.resizeObserver.observe(this.el); 6299 } 6300 goToSlideDir(dir = "next") { 6301 if (this.isNavigating) return; 6302 const { firstInViewSlide, lastInViewSlide } = this.getInViewItems(); 6303 const isPrev = dir === "prev"; 6304 const referenceSlide = isPrev ? firstInViewSlide : lastInViewSlide; 6305 const currentIndex = this.slides.indexOf(referenceSlide); 6306 let targetIndex = isPrev ? currentIndex - 1 : currentIndex + 1; 6307 if (targetIndex < 0 || targetIndex >= this.slides.length) { 6308 if (!this.useLoop) return; 6309 targetIndex = isPrev ? this.slides.length - 1 : 0; 6310 } 6311 const targetSlide = this.slides[targetIndex]; 6312 if (!targetSlide) return; 6313 this.isNavigating = true; 6314 targetSlide.scrollIntoView({ 6315 block: "nearest", 6316 inline: isPrev ? "end" : "start" 6317 }); 6318 } 6319 pagerToSlide(event) { 6320 if (!event.target.closest("[data-pager]")) return; 6321 const marker = event.target.closest("a, button"); 6322 if (!marker) return; 6323 event.preventDefault(); 6324 const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 6325 const targetSlide = this.track.querySelector(`#${slideId}`);
6326 targetSlide?.scrollIntoView({ block: "nearest", inline: "start" }); 6327 } 6328 eventHandler(event) { 6329 const target = event.target.closest( 6330 "[data-next], [data-prev], [data-pager]" 6331 ); 6332 if (!target) return; 6333 if (event.type === "click") { 6334 if (target.hasAttribute("data-next")) { 6335 this.goToSlideDir("next"); 6336 } else if (target.hasAttribute("data-prev")) { 6337 this.goToSlideDir("prev"); 6338 } else if (target.closest("[data-pager]")) { 6339 this.pagerToSlide(event); 6340 } 6341 } 6342 if (event.type === "keydown" && target.closest("[data-pager]")) { 6343 if (event.key === "ArrowRight" || event.key === "ArrowDown") { 6344 event.preventDefault(); 6345 this.goToSlideDir("next"); 6346 } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") { 6347 event.preventDefault(); 6348 this.goToSlideDir("prev"); 6349 } 6350 } 6351 } 6352 }; 6353 6354 (() => { 6355 function alpineSnapSlider(Alpine) { 6356 Alpine.directive("snap-slider", (el, { 6357 modifiers 6358 }, { 6359 cleanup 6360 }) => { 6361 const slider = new SnapSlider(el, { 6362 autoPager: modifiers.includes("auto-pager"), 6363 groupPager: modifiers.includes("group-pager"), 6364 loop: modifiers.includes("loop") 6365 }); 6366 cleanup(() => { 6367 slider.destroy(); 6368 }); 6369 }); 6370 } 6371 6372 document.addEventListener("alpine:init", () => { 6373 window.Alpine.plugin(alpineSnapSlider); 6374 }); 6375 })(); 6376 //# sourceURL=alpine-snap-slider.js 6377</script>
vendor: 1 bytes, line 6377
6377
6378<script> 6379 (() => { 6380 // src/dialog.js 6381 function dialog_default(Alpine) { 6382 Alpine.directive("htmldialog", fylgjaAlpineDialog); 6383 function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) { 6384 const evaluate = expression.length ? evaluateLater(expression) : () => {}; 6385 const lockPageScroll = modifiers.includes("noscroll"); 6386 const isModeless = modifiers.includes("modeless"); 6387 const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest"); 6388 el.style.display = null; 6389 el.style.length === 0 && el.removeAttribute("style"); 6390 if (el._x_isShown) { 6391 open(); 6392 } 6393 const closeBySupported = (() => { 6394 return "closedBy" in HTMLDialogElement.prototype; 6395 })(); 6396 function scrollLock(use = true) { 6397 document.body.style.overflow = use ? "hidden" : ""; 6398 } 6399 function dialogSubmit(event) { 6400 if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") { 6401 event.preventDefault(); 6402 evaluate(); 6403 } 6404 } 6405 function escapeDialog(event) { 6406 if (event.key !== "Escape") return; 6407 event.preventDefault(); 6408 if (closeBy === "none") return; 6409 evaluate(); 6410 } 6411 function handleCloseByEvent(event) { 6412 if (event.target !== el) return; 6413 const rect = el.getBoundingClientRect(); 6414 const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; 6415 if (!isInDialog) { 6416 if (closeBy === "any") { 6417 if (closeBySupported) { 6418 event.preventDefault(); 6419 } 6420 evaluate(); 6421 } 6422 } 6423 } 6424 function handleCloseEvent() { 6425 evaluate(); 6426 } 6427 function open() { 6428 if (el.hasAttribute("open")) return; 6429 isModeless ? el.show() : el.showModal(); 6430 scrollLock(lockPageScroll); 6431 } 6432 function close() { 6433 if (!el.hasAttribute("open")) return; 6434 el.close(); 6435 scrollLock(false); 6436 } 6437 el._x_doShow = () => open(); 6438 el._x_doHide = () => close(); 6439 el.addEventListener("keydown", escapeDialog); 6440 el.addEventListener("submit", dialogSubmit); 6441 el.addEventListener("click", handleCloseByEvent); 6442 el.addEventListener("cancel", handleCloseEvent); 6443 cleanup(() => { 6444 el.removeEventListener("keydown", escapeDialog); 6445 el.removeEventListener("submit", dialogSubmit); 6446 el.removeEventListener("click", handleCloseByEvent); 6447 el.removeEventListener("cancel", handleCloseEvent); 6448 scrollLock(false); 6449 }); 6450 } 6451 } 6452 function modifierValue(modifiers, key, fallback) { 6453 if (modifiers.indexOf(key) === -1) return fallback; 6454 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 6455 if (!rawValue) return fallback; 6456 if (key === "closeby") { 6457 const allowedValues = ["auto", "none", "closerequest", "any"]; 6458 const options = allowedValues.join(", "); 6459 if (!allowedValues.includes(rawValue)) { 6460 console.warn( 6461 `"${rawValue}" is not one of the allowed values for closeby: ${options}` 6462 ); 6463 return fallback; 6464 } 6465 } 6466 return rawValue; 6467 } 6468 6469 // src/cdn.js 6470 document.addEventListener("alpine:init", () => { 6471 window.Alpine.plugin(dialog_default); 6472 }); 6473 })(); 6474 //# sourceURL=alpine-htmldialog.js 6475</script>
vendor: 1 bytes, line 6475
6475
6476<script> 6477 (() => { 6478 function src_default(Alpine) { 6479 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 6480 let evaluate = evaluateLater(expression); 6481 let options = { 6482 rootMargin: getRootMargin(modifiers), 6483 threshold: getThreshold(modifiers) 6484 }; 6485 let observer = new IntersectionObserver((entries) => { 6486 entries.forEach((entry) => { 6487 if (entry.isIntersecting === (value === "leave")) 6488 return; 6489 evaluate(); 6490 modifiers.includes("once") && observer.disconnect(); 6491 }); 6492 }, options); 6493 observer.observe(el); 6494 cleanup(() => { 6495 observer.disconnect(); 6496 }); 6497 })); 6498 } 6499 function getThreshold(modifiers) { 6500 if (modifiers.includes("full")) 6501 return 0.99; 6502 if (modifiers.includes("half")) 6503 return 0.5; 6504 if (!modifiers.includes("threshold")) 6505 return 0; 6506 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 6507 if (threshold === "100") 6508 return 1; 6509 if (threshold === "0") 6510 return 0; 6511 return Number(`.${threshold}`); 6512 } 6513 function getLengthValue(rawValue) { 6514 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 6515 return match ? match[1] + (match[2] || "px") : void 0; 6516 } 6517 function getRootMargin(modifiers) { 6518 const key = "margin"; 6519 const fallback = "0px 0px 0px 0px"; 6520 const index = modifiers.indexOf(key); 6521 if (index === -1) 6522 return fallback; 6523 let values = []; 6524 for (let i = 1; i < 5; i++) { 6525 values.push(getLengthValue(modifiers[index + i] || "")); 6526 } 6527 values = values.filter((v) => v !== void 0); 6528 return values.length ? values.join(" ").trim() : fallback; 6529 } 6530 6531 document.addEventListener("alpine:init", () => { 6532 window.Alpine.plugin(src_default); 6533 }); 6534 })(); 6535 //# sourceURL=alpine-intersect.js 6536</script>
6536 6537
6538<script> 6539 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"})) { 6540 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 6541 } 6542 //# sourceURL=alpine-defer-rules.js 6543</script>
vendor: 1 bytes, line 6543
6543
6544<script> 6545 (() => { 6546 const hasAlpine = new Promise(resolve => { 6547 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 6548 }); 6549 6550 const hasInteract = new Promise(resolve => { 6551 (events => { 6552 const onInteract = () => { 6553 resolve(); 6554 events.forEach(type => window.removeEventListener(type, onInteract)); 6555 } 6556 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 6557 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 6558 }); 6559 6560 const onIntersect = (el) => { 6561 return new Promise(resolve => { 6562 const observer = new IntersectionObserver(entries => { 6563 for (const entry of entries) { 6564 if (entry.isIntersecting) { 6565 observer.disconnect() 6566 resolve(); 6567 } 6568 } 6569 }, {}); 6570 observer.observe(el); 6571 }); 6572 } 6573 6574 function runComponent(el) { 6575 hasAlpine.then(() => { 6576 el.removeAttribute('x-ignore'); 6577 queueMicrotask(() => Alpine.initTree(el)); 6578 }); 6579 } 6580 6581 function initDeferredComponents() { 6582 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 6583 el.setAttribute('x-ignore', ''); 6584 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 6585 switch (deferUntil) { 6586 case 'interact': 6587 hasInteract.then(() => runComponent(el)); 6588 break; 6589 case 'intersect': 6590 onIntersect(el).then(() => runComponent(el)) 6591 break; 6592 case 'idle': 6593 window.requestIdleCallback 6594 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 6595 : setTimeout(() => runComponent(el), 4000); 6596 break; 6597 case 'eager': 6598 runComponent(el); 6599 break; 6600 default: 6601 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 6602 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 6603 } 6604 } 6605 }); 6606 } 6607 6608 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 6609 })(); 6610 //# sourceURL=alpine-defer.js 6611</script>
6611 6612
6613<script> 6614// x-teleport implementation 6615(_ => { 6616 document.addEventListener('DOMContentLoaded', event => { 6617 // x-teleport available only for template 6618 if (!Alpine.version.startsWith('2')) { 6619 return; 6620 } 6621 6622 const teleportDirective = (el, expression) => { 6623 let target = document.querySelector(expression) 6624 let clone = el.content.cloneNode(true).firstElementChild; 6625 6626 target.appendChild(clone); 6627 setTimeout(() => { 6628 target.querySelectorAll('[x-data]') 6629 .forEach(el => Alpine.initializeComponent(el)); 6630 }, 0) 6631 }; 6632 6633 document.querySelectorAll('template').forEach(el => { 6634 if (!el.hasAttribute('x-teleport')) { 6635 return; 6636 } 6637 6638 teleportDirective(el, el.getAttribute('x-teleport')); 6639 }); 6640 6641 document.querySelectorAll('[x-data]').forEach(el => { 6642 if (el.hasAttribute('x-init')) { 6643 return; 6644 } 6645 6646 setTimeout(() => { 6647 Alpine.initializeComponent(el); 6648 }, 0); 6649 }); 6650 }); 6651})() 6652</script>
6652 6653
6654<script type="module" 6655 src="https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Hyva_Theme/js/alpine3.min.js" 6656 defer 6657 crossorigin 6658></script>
vendor: 1 bytes, line 6658
6658
6659<script> 6660 function dispatchMessages(messages, hideAfter) { 6661 const messagesEvent = new CustomEvent("messages-loaded", { 6662 detail: { 6663 messages: messages, 6664 hideAfter: hideAfter 6665 } 6666 }); 6667 window.dispatchEvent(messagesEvent); 6668 } 6669 6670 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 6671 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 6672 } 6673 6674 (function( hyva, undefined ) { 6675 6676 hyva.initFormKey = () => { 6677 if (typeof hyva.getFormKey !== 'function') return; 6678 6679 const formKey = hyva.getFormKey(); 6680 if (!formKey) return; 6681 6682 document.querySelectorAll('input[name="form_key"]').forEach((input) => { 6683 input.value = formKey; 6684 }); 6685 } 6686 6687 hyva.initMessages = () => { 6688 try { 6689 const messages = hyva.getCookie('mage-messages'); 6690 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 6691 6692 dispatchMessages(window.mageMessages); 6693 6694 // empty `mage-messages` cookie 6695 const skipSetDomain = true; 6696 hyva.setCookie('mage-messages','', -1, skipSetDomain); 6697 6698 } catch (error) { 6699 console.warn('Error parsing Cookie Messages:', error); 6700 } 6701 } 6702 6703 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 6704 6705 window.addEventListener('pageshow', (event) => { 6706 if (event.persisted) { 6707 hyva.initFormKey(); 6708 } 6709 }); 6710 6711 hyva.alpineInitialized(hyva.initMessages) 6712 }( window.hyva = window.hyva || {} )); 6713 //# sourceURL=hyva-cookies.js 6714</script>
vendor: 1 bytes, line 6714
6714
6715<script> 6716 (() => { 6717 const private_content_key = 'mage-cache-storage'; 6718 const private_content_expire_key = 'mage-cache-timeout'; 6719 const private_content_version_key = 'private_content_version'; 6720 const section_data_ids_key = 'section_data_ids'; 6721 const mage_cache_session_id_key = 'mage-cache-sessid'; 6722 const last_visited_store_key = 'last_visited_store'; 6723 6724 const ttl = 7200; 6725 6726 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 6727 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 6728 } 6729 6730 function loadSectionData () { 6731 const browserStorage = hyva.getBrowserStorage(); 6732 if (!browserStorage) { 6733 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 6734 [{ 6735 type: "warning", 6736 text: "Please enable LocalStorage in your browser." 6737 }] 6738 ); 6739 return; 6740 } 6741 try { 6742 let isInvalid = false; 6743 6744 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 6745 isInvalid = true; 6746 } 6747 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 6748 6749 if (!hyva.getCookie(mage_cache_session_id_key)) { 6750 isInvalid = true; 6751 browserStorage.removeItem(private_content_key); 6752 const skipSetDomain = true; 6753 const days = false; 6754 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 6755 } 6756 6757 const cookieVersion = hyva.getCookie(private_content_version_key); 6758 const storageVersion = browserStorage.getItem(private_content_version_key); 6759 6760 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 6761 isInvalid = true; 6762 } 6763 6764 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 6765 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 6766 browserStorage.removeItem(private_content_key); 6767 } 6768 6769 if (isInvalid && cookieVersion) { 6770 fetchPrivateContent([]); 6771 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 6772 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 6773 if ( 6774 privateContent && 6775 privateContentExpires && 6776 privateContent.cart && 6777 privateContent.customer 6778 ) { 6779 dispatchPrivateContent(privateContent); 6780 } else { 6781 fetchPrivateContent([]); 6782 } 6783 } else { 6784 if (document.getElementById('default-section-data')) { 6785 const privateContent = JSON.parse(document.getElementById('default-section-data').textContent.trim()); 6786 dispatchPrivateContent(privateContent); 6787 } else { 6788 dispatchPrivateContent({}); 6789 } 6790 } 6791 6792 } catch (error) { 6793 console.warn('Error retrieving Private Content:', error); 6794 } 6795 } 6796 6797 hyva.alpineInitialized(loadSectionData) 6798 window.addEventListener('reload-customer-section-data', loadSectionData); 6799 6800 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 6801 6802 function dispatchPrivateContent(data) { 6803 6804 const privateContentEvent = new CustomEvent("private-content-loaded", { 6805 detail: { 6806 data: window.processSectionDataBeforeDispatch(data) 6807 } 6808 }); 6809 window.dispatchEvent(privateContentEvent); 6810 } 6811 6812 function fetchPrivateContent(sections) { 6813 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 6814 method: 'GET', 6815 headers: { 6816 'Content-Type': 'application/json', 6817 'X-Requested-With': 'XMLHttpRequest' 6818 } 6819 }) 6820 .then(response => response.ok && response.json()) 6821 .then( 6822 data => { 6823 if (data) { 6824 try { 6825 const browserStorage = hyva.getBrowserStorage(); 6826 6827 // merge new data preserving non-invalidated sections 6828 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 6829 6830 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 6831 delete oldSectionData['checkout-data']; 6832 } 6833 const newSectionData = Object.assign(oldSectionData, data); 6834 6835 dispatchPrivateContent(newSectionData); 6836 6837 // don't persist messages, they've been dispatched already 6838 if (newSectionData.messages && newSectionData.messages.messages ) { 6839 newSectionData.messages.messages = []; 6840 } 6841 6842 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 6843 6844 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 6845 browserStorage.setItem(private_content_expire_key, expiresAt); 6846 6847 const newCookieVersion = hyva.getCookie(private_content_version_key); 6848 browserStorage.setItem(private_content_version_key, newCookieVersion); 6849 6850 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 6851 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 6852 hyva.setCookie( 6853 section_data_ids_key, 6854 JSON.stringify( 6855 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 6856 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 6857 return sectionDataIds; 6858 }, {}) 6859 ), 6860 false, 6861 true 6862 ); 6863 } catch (error) { 6864 console.warn("Couldn't store privateContent", error); 6865 } 6866 } 6867 } 6868 ) 6869 .catch(error => { 6870 console.warn("Couldn't fetch privateContent", error); 6871 }); 6872 } 6873 })(); 6874 //# sourceURL=hyva-private-content.js 6875</script>
vendor: 1 bytes, line 6875
6875
6876<script> 6877 (() => { 6878 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 6879 })() 6880</script>
vendor: 1 bytes, line 6880
6880
6881<script> 6882 (events => { 6883 const addListeners = () => { 6884 var init = false; 6885 const dispatchUserInteractionEvent = Alpine.throttle(() => { 6886 if(!init){ 6887 init=true; 6888 return false; 6889 } 6890 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 6891 window.dispatchEvent(new Event('init-external-scripts')) 6892 }, 30); 6893 document.removeEventListener('alpine:initialized', addListeners) 6894 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, { passive: true})) 6895 } 6896 document.addEventListener('alpine:initialized', addListeners, { once: true }); 6897 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 6898</script>
vendor: 1 bytes, line 6898
6898
6899<script> 6900 'use strict'; 6901 6902 (() => { 6903 const initCarousels = (elements) => { 6904 if (!Swiper) { 6905 return; 6906 } 6907 6908 const initProductCarousel = (carousel, additionalOptions) => { 6909 carousel.classList.add("swiper"); 6910 if (!carousel.querySelectorAll(".swiper-wrapper").length) { 6911 carousel.innerHTML = `<div class="swiper-wrapper">${carousel.innerHTML}</div>`; 6912 } 6913 carousel.querySelectorAll(".swiper-wrapper > *").forEach(function (el) { 6914 el.classList.add("swiper-slide"); 6915 }); 6916 6917 let swiperElement = carousel.querySelector('.swiper'); 6918 if (!swiperElement) { 6919 swiperElement = carousel; 6920 } 6921 6922 if ((carousel.dataset.showArrows === 'true' || carousel.dataset.showDots === 'true') && !carousel.querySelectorAll(".swiper-pagination").length) { 6923 swiperElement.insertAdjacentHTML( 6924 'beforeend', 6925 '\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
6925003D\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
6925003D\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' 6926 ); 6927 } 6928 6929 let autoplayOptions = {autoplay: false}; 6930 if (carousel.dataset.autoplay === 'true') { 6931 autoplayOptions = { 6932 autoplay: { 6933 delay: carousel.dataset.autoplaySpeed 6934 }, 6935 plugins: [ SwiperPluginPagination, SwiperPluginAutoPlay, SwiperPluginNavigation ] 6936 }; 6937 } 6938 6939 let dotsOptions = {pagination: false}; 6940 if (carousel.dataset.showDots === 'true') { 6941 dotsOptions = { 6942 pagination: { 6943 el: '.swiper-pagination', 6944 type: 'bullets', 6945 clickable: true 6946 } 6947 }; 6948 } 6949 6950 let arrowsOptions = {navigation: false}; 6951 if (carousel.dataset.showArrows === 'true') { 6952 arrowsOptions = { 6953 navigation: { 6954 nextEl: '.swiper-button-next', 6955 prevEl: '.swiper-button-prev', 6956 }, 6957 }; 6958 } 6959 6960 let options = Object.assign({ 6961 slidesPerView: 'auto', 6962 loop: carousel.dataset.infiniteLoop?.toLowerCase?.() === 'true' 6963 }, additionalOptions, dotsOptions, arrowsOptions, autoplayOptions); 6964
6965 initCarousel(swiperElement, options); 6966 }; 6967 6968 elements.forEach(element => { 6969 if (element.dataset.contentType === 'slider') { 6970 initProductCarousel(element, {slidesPerView: 1}); 6971 } else { 6972 initProductCarousel(element); 6973 } 6974 }); 6975 }; 6976 6977 window.addEventListener('init-external-scripts', () => { 6978 const carouselElements = document.querySelectorAll( 6979 `[data-content-type="products"][data-appearance="carousel"], 6980 [data-content-type="slider"], .clerk-product-async, .swiper.products-widget, .swiper, .async-carousel, .clerk` 6981 ); 6982 6983 window.carouselInitialized = false; 6984 6985 // Autoplay Plugin 6986 const scriptAutoplay = document.createElement('script'); 6987 scriptAutoplay.type = 'text/javascript'; 6988 scriptAutoplay.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002FautoPlay.min.js'; 6989 document.head.appendChild(scriptAutoplay); 6990 6991 // Pagination Plugin 6992 const scriptPagination = document.createElement('script'); 6993 scriptPagination.type = 'text/javascript'; 6994 scriptPagination.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Fpagination.min.js'; 6995 document.head.appendChild(scriptPagination); 6996 6997 // Navigation Plugin 6998 const scriptNavigation = document.createElement('script'); 6999 scriptNavigation.type = 'text/javascript'; 7000 scriptNavigation.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Fnavigation.min.js'; 7001 document.head.appendChild(scriptNavigation); 7002 7003 // Swiper 7004 const script = document.createElement('script'); 7005 script.type = 'text/javascript'; 7006 7007 script.addEventListener('load', () => { 7008 if (window.carouselInitialized) { 7009 return; 7010 } 7011 7012 const carouselElementsToInitialize = document.querySelectorAll( 7013 `[data-content-type="products"][data-appearance="carousel"], 7014 [data-content-type="slider"], .swiper.products-widget` 7015 ); 7016 initCarousels(carouselElementsToInitialize); 7017 7018 window.carouselInitialized = true; 7019 const carouselInitializedEvent = new Event("carousel-initialized"); 7020 document.dispatchEvent(carouselInitializedEvent); 7021 }); 7022 7023 script.src = 'https\u003A\u002F\u002Fwww.farma.it\u002Fstatic\u002Fversion1789421831\u002Ffrontend\u002FDNAFactory\u002Forlandi_hyva\u002Fit_IT\u002FMagento_PageBuilder\u002Fjs\u002Ftinyswiper\u002Dfull.min.js'; 7024 document.head.appendChild(script); 7025 }, { once: true, passive: true }); 7026 })(); 7027 7028 function initCarousel(element = "", options = {}) { 7029 var defaultOptions = { 7030 slidesPerView: 'auto', 7031 navigation: { 7032 nextEl: '.swiper-button-next', 7033 prevEl: '.swiper-button-prev', 7034 }, 7035 pagination: { 7036 el: '.swiper-pagination', 7037 type: 'bullets', 7038 clickable: true 7039 }, 7040 fadingSlideSelector: '' 7041 }; 7042 options = Object.assign(defaultOptions, options); 7043 7044 if (typeof element === 'string' || element instanceof String) { 7045 element = document.querySelector(element); 7046 } 7047 7048 if (!element) { 7049 return false; 7050 } 7051 7052 let paginationElement = element.querySelector(defaultOptions.pagination.el) 7053 if (paginationElement && defaultOptions.pagination) { 7054 defaultOptions.pagination.el = paginationElement; 7055 } else { 7056 defaultOptions.pagination = false 7057 } 7058 7059 let nextElement = element.querySelector(defaultOptions.navigation.nextEl) 7060 if (nextElement && defaultOptions.navigation) { 7061 defaultOptions.navigation.nextEl = nextElement; 7062 } else { 7063 defaultOptions.navigation = false;
7064 } 7065 7066 let prevElement = element.querySelector(defaultOptions.navigation.prevEl) 7067 if (prevElement && defaultOptions.navigation) { 7068 defaultOptions.navigation.prevEl = prevElement; 7069 } else { 7070 defaultOptions.navigation = false; 7071 } 7072 7073 if (options.slidesPerView == 'auto') { 7074 let wrapperWidth = element.clientWidth, 7075 slideWidth = element.querySelector('.swiper-slide').clientWidth; 7076 7077 options.slidesPerView = Math.round(wrapperWidth / slideWidth); 7078 } 7079 7080 if (!options.navigation) { 7081 element.querySelectorAll('.swiper-button-prev, .swiper-button-next') 7082 .forEach((element) => element.remove()); 7083 } 7084 7085 if (options.slidesPerView > element.querySelectorAll('.swiper-slide').length) { 7086 element.querySelectorAll('.swiper-button-prev, .swiper-button-next, .swiper-pagination') 7087 .forEach((element) => element.remove()); 7088 return; 7089 } 7090 7091 if (typeof Swiper != "undefined") { 7092 let carousel = new Swiper(element, options); 7093 attachCustomBehaviours(carousel, element, options); 7094 return; 7095 } 7096 7097 document.addEventListener("carousel-initialized", function () { 7098 let carousel = new Swiper(element, options); 7099 carousel.slideTo(0); // Fix per disabilitare navigazione quando non c'è overflow degli elementi 7100 attachCustomBehaviours(carousel, element, options); 7101 }); 7102 7103 } 7104 7105 function attachCustomBehaviours(carousel, element, options) { 7106 // Fading selected slide behaviour 7107 let fadingSlide; 7108 try { 7109 if (options.fadingSlideSelector) { 7110 fadingSlide = document.querySelector(options.fadingSlideSelector) 7111 } else { 7112 fadingSlide = element.closest('.fading-slide-container').querySelector('.fading-slide'); 7113 } 7114 } catch (e) { 7115 fadingSlide = null; 7116 } 7117 7118 if (fadingSlide) { 7119 fadingSlide.classList.add('transition-all'); 7120 7121 carousel.on('before-slide', function(currentIndex, state, newIndex) { 7122 if (newIndex > 0) { 7123 fadingSlide.classList.add('md:opacity-0'); 7124 } else if (newIndex == 0) { 7125 fadingSlide.classList.remove('md:opacity-0'); 7126 } 7127 }); 7128 } 7129 } 7130</script>
vendor: 1 bytes, line 7130
7130
7131<script> 7132 'use strict'; 7133 7134 (() => { 7135 const applyShowOnHover = (element) => { 7136 const showOverlayOnHover = (element) => { 7137 const overlay = element.querySelector('.pagebuilder-overlay'); 7138 const color = overlay.dataset.overlayColor; 7139 7140 element.addEventListener('mouseover', () => { 7141 overlay.style.backgroundColor = color; 7142 }); 7143 element.addEventListener('mouseout', () => { 7144 overlay.style.backgroundColor = 'transparent'; 7145 }); 7146 }; 7147 7148 const showButtonOnHover = (element) => { 7149 const button = element.querySelector('.pagebuilder-banner-button'); 7150 7151 element.addEventListener('mouseover', () => { 7152 button.style.opacity = '1'; 7153 button.style.visibility = 'visible'; 7154 }); 7155 element.addEventListener('mouseout', () => { 7156 button.style.opacity = '0'; 7157 button.style.visibility = 'hidden'; 7158 }); 7159 }; 7160 7161 if (element.dataset.showOverlay === 'hover') { 7162 showOverlayOnHover(element); 7163 } 7164 if (element.dataset.showButton === 'hover') { 7165 showButtonOnHover(element); 7166 } 7167 }; 7168 7169 window.addEventListener('DOMContentLoaded', () => { 7170 document.querySelectorAll('[data-content-type="banner"],[data-content-type="slider"]').forEach(element => { 7171 applyShowOnHover(element); 7172 }); 7173 }); 7174 })(); 7175</script>
7175 7176
7176<script> 7177 function amastyRewardsCatalog() { 7178 return { 7179 productId: this.$el.dataset.productId, 7180 formSelector: 'product_addtocart_form', 7181 refreshUrl: this.$el.dataset.refreshUrl, 7182 loader: false, 7183 isFetching: false, 7184 abortFetchController: false, 7185 highlight: { 7186 caption_color: '', 7187 caption_text: '', 7188 visible: false 7189 }, 7190 7191 init() { 7192 this.formObserver(); 7193 document.addEventListener(`update-qty-${this.productId}`, () => { 7194 this.updateData(); 7195 }); 7196 this.$nextTick(() => this.updateData()); 7197 }, 7198 7199 hideBlock() { 7200 this.highlight.visible = false; 7201 this.loader = true; 7202 }, 7203 7204 dispatchStatus(type, message) { 7205 window.dispatchMessages([{ 7206 type: type, 7207 text: message 7208 }], 5000); 7209 }, 7210 7211 formObserver() { 7212 const product = document.querySelector(`input[name="product"][value="${this.productId}"]`); 7213 7214 if (product) { 7215 const productForm = product.form; 7216 if (productForm) { 7217 productForm.addEventListener('change', () => { 7218 this.updateData(); 7219 }); 7220 } 7221 } 7222 }, 7223 7224 updateData() { 7225 if (!this.refreshUrl || this.isFetching) return false; 7226 this.hideBlock(); 7227 7228 if (this.abortFetchController) { 7229 this.abortFetchController.abort(); 7230 } 7231 this.abortFetchController = new AbortController(); 7232 7233 const product = document.querySelector(`input[name='product'][value='${this.productId}']`); 7234 if (!product) return false; 7235 7236 const form = product.form; 7237 const formData = new FormData(form); 7238 const formParams = new URLSearchParams(formData).toString(); 7239 const formJson = JSON.stringify({ 7240 productId: this.productId, 7241 attributes: formParams 7242 }); 7243 7244 const requestOptions = { 7245 method: 'POST', 7246 body: formJson, 7247 headers: { 7248 'Content-Type': 'application/json', 7249 'x-requested-with': 'XMLHttpRequest', 7250 }, 7251 signal: this.abortFetchController.signal 7252 }; 7253 7254 this.isFetching = true; 7255 fetch(this.refreshUrl, requestOptions).then(response => { 7256 if (!response.ok) { 7257 return Promise.reject(`${response.status} ${response.statusText}`); 7258 } 7259 return response.json(); 7260 }).then(data => { 7261 this.highlight.visible = data.visible; 7262 this.highlight.caption_text = data.caption_text; 7263 this.highlight.caption_color = data.caption_color; 7264 }).catch(error => { 7265 if (error.name !== 'AbortError' 7266 && typeof error === 'string' 7267 && error.match(/'401'/g) !== null 7268 ) { 7269 this.dispatchStatus('error', error); 7270 } 7271 }).finally(() => { 7272 this.loader = false;
7273 this.abortFetchController = false; 7274 this.isFetching = false; 7275 }); 7276 }, 7277 7278 highlightVisible() { 7279 return this.highlight.visible && !this.loader; 7280 }, 7281 7282 highlightStyle() { 7283 return `color: ${this.highlight.caption_color}`; 7284 }, 7285 } 7286 } 7287 7288 window.addEventListener( 7289 'alpine:init', 7290 () => Alpine.data('amastyRewardsCatalog', amastyRewardsCatalog), 7291 { once: true } 7292 ); 7293 </script>
7293 7294
7294<script> 7295 'use strict'; 7296 7297 const grecaptchaV2LoadCallbacks = []; 7298 7299 function executeRecaptchaLoadCallbacks () { 7300 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 7301 const callback = grecaptchaV2LoadCallbacks.pop(); 7302 typeof callback === 'string' ? window[callback]() : callback(); 7303 } 7304 } 7305 7306 (function() { 7307 const loadRecaptchaScript = (event) => { 7308 7309 if (window.grecaptcha || !event.target.form) { 7310 return; 7311 } 7312 7313 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 7314 const siteKey = '6LdDii8sAAAAAF1j_v4WIzmCV2phMFuJKWeFtEhJ'; 7315 const script = document.createElement('script'); 7316 script.type = 'text/javascript'; 7317 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 7318 script.async = true; 7319 document.head.appendChild(script); 7320 7321 script.addEventListener('load', () => { 7322 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 7323 }); 7324 } 7325 7326 window.forceLoadRecaptchaScript = (form) => { 7327 loadRecaptchaScript({target: {form: form || 'dummy'}}); 7328 executeRecaptchaLoadCallbacks(); 7329 }; 7330 7331 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 7332 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 7333 7334 }()); 7335 7336</script>
vendor: 1 bytes, line 7336
7336
7337<script> 7338 function selectManager() { 7339 return { 7340 value: '', 7341 7342 input: { 7343 ['x-model']: "value", 7344 [':class']: "{ 'invalid-placeholder': !value || value == \"\" }", 7345 ['x-init']() { 7346 this.value = this.$el.options[this.$el.selectedIndex || 0].value 7347 } 7348 } 7349 } 7350 } 7351 7352 function qtyManager() { 7353 return { 7354 inputElement: null, 7355 value: 0, 7356 step: 1, 7357 min: null, 7358 max: null, 7359 7360 input: { 7361 ["x-model"]: "value", 7362 ['x-init']() { 7363 this.inputElement = this.$el; 7364 this.value = parseInt(this.$el.value); 7365 }, 7366 ['x-on:input'] ($event) { 7367 let inputValue = parseInt($event.target.value.replace(/\D/g, '')); 7368 if (!this.checkMin(inputValue)) { 7369 this.value = this.min; 7370 } else if (!this.checkMax(inputValue)) { 7371 this.value = this.max; 7372 } else { 7373 this.value = inputValue; 7374 } 7375 } 7376 }, 7377 plus: { 7378 ['@click']() { 7379 if (this.checkMax(this.value, this.step)) { 7380 this.value += this.step; 7381 } 7382 this.inputElement.dispatchEvent(new Event('changed')); 7383 } 7384 }, 7385 minus: { 7386 ['@click']() { 7387 if (this.checkMin(this.value, this.step)) { 7388 this.value -= this.step; 7389 } 7390 this.inputElement.dispatchEvent(new Event('changed')); 7391 } 7392 }, 7393 checkMin(value, step = null) { 7394 if (this.min) { 7395 if (step) { 7396 return value - step >= this.min; 7397 } 7398 return value >= this.min; 7399 } 7400 return true; 7401 }, 7402 checkMax(value, step = null) { 7403 if (this.max) { 7404 if (step) { 7405 return value + step <= this.max; 7406 } 7407 return value <= this.max; 7408 } 7409 return true; 7410 } 7411 } 7412 } 7413 7414 /** Questo potrebbe convenire aggiungerlo solamente dove usiamo quell'input **/ 7415 function dateInputManager() { 7416 return { 7417 value: '', 7418 7419 input: { 7420 ["x-model"]: "value", 7421 ['x-init']() { 7422 this.value = this.$el.value 7423 }, 7424 7425 ['x-on:input'](e) { 7426 let date = e.target.value.replace(/\D/g, ''); 7427 let formattedDate = ''; 7428 7429 if (date.length >= 2) { 7430 let value = date.substring(0, 2); 7431 if (value > 31) { 7432 value = 31; 7433 } 7434 formattedDate = value + '/'; 7435 } else { 7436 this.value = date; 7437 return; 7438 } 7439 7440 if (date.length >= 4) { 7441 let value = date.substring(2, 4); 7442 if (value > 12) { 7443 value = 12; 7444 } 7445 formattedDate += value + '/'; 7446 } else { 7447 this.value = formattedDate + date.substring(2, date.length); 7448 return; 7449 } 7450 7451 if (date.length > 4) { 7452 formattedDate += date.substring(4, 8); 7453 } else { 7454 this.value = formattedDate + date.substring(4, date.length); 7455 return; 7456 } 7457 7458 this.value = formattedDate; 7459 } 7460 } 7461 } 7462 } 7463</script>
vendor: 1 bytes, line 7463
7463
7464<script> 7465 (function (w,d){ 7466 function setScrollbarWidthCssVar() { 7467 let newSize = (w.innerWidth - d.body.clientWidth) + "px", 7468 oldSize = d.documentElement.style.getPropertyValue('--scrollbar-width'); 7469 if (newSize !== oldSize){ 7470 d.documentElement.style.setProperty('--scrollbar-width', newSize); 7471 } 7472 } 7473 d.addEventListener('alpine:init', () => { 7474 new ResizeObserver(Alpine.debounce(setScrollbarWidthCssVar, 300)).observe(d.documentElement); 7475 }, { once: true }); 7476 setScrollbarWidthCssVar(); 7477 }) (window, document); 7478 /** Effettua il lock della viewport quando necessario (es. all'apertura del menu o del minicart) */ 7479 window.addEventListener('screen-lock', (event) => { 7480 document.body.classList.toggle('max-h-screen', event.detail); 7481 document.body.classList.toggle('lock-screen', event.detail); 7482 document.body.classList.toggle('overflow-hidden', event.detail); 7483 }); 7484 7485 function initCustomerMenuMobile() { 7486 return { 7487 open: false, 7488 customer: {}, 7489 getData(data) { 7490 if (data.customer) { this.customer = data.customer } 7491 }, 7492 isLoggedIn(){ 7493 return !!(this.customer.firstname); 7494 } 7495 } 7496 } 7497</script>
7497 7498 7499<!-- Wrapping template -->
7500<script type="text/template" id="instant_wrapper_template"> 7501 {{#findAutocomplete}} 7502 <div id="algolia-autocomplete-container"></div> 7503 {{/findAutocomplete}} 7504 7505 <div id="algolia_instant_selector" 7506 class=" with-facets" 7507 > 7508 <div class="columns"> 7509 <aside class="sidebar sidebar-main relative" id="algolia-left-container"> 7510 <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()"> 7511 <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"> 7512 <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> 7513 <title>adjustments</title> 7514 </svg> 7515 <span class="ml-1.5 font-baloo-bhaina"> 7516 Filtri </span> 7517 </button> 7518 <div class="mb-4 hidden lg:block" id="facets"> 7519 <div class="aa-mobile-header flex px-layoutGutter py-3 border-b mb-2 justify-between items-center lg:hidden shadow-md"> 7520 <span class="text-primary text-lg font-bold mx-auto pl-6"> 7521 Filtri </span> 7522 <span id="aa-mobile-toggler" class="cursor-pointer" onclick="toggleAaFilters()"> 7523 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" role="img"> 7524 <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> 7525 <title>x</title> 7526 </svg> 7527 </span> 7528 </div> 7529 <div class="pt-[50px] px-layoutGutter lg:px-0 lg:pt-0" id="instant-search-facets-container"> 7530 <div class="hidden lg:block text-primary text-md text-xl lg:text-2xl font-semibold h-10 mt-2.5"> 7531 Filtri </div> 7532 <div class="w-full flex flex-col bg-white shadow hidden lg:mt-4 py-3" id="instant-search-active-filters"> 7533 <span class="title text-base font-bold font-baloo-bhaina hidden" id="instant-search-active-filters-label"> 7534 Filtri attivi </span> 7535 <div class="order-2" id="clear-refinements"></div> 7536 <div id="current-refinements"></div> 7537 </div> 7538 </div> 7539 </div> 7540 </aside> 7541 <div class="column main" id="algolia-right-container"> 7542 <div class="hidden"> 7543 <div class="pb-3.5"> 7544 <div class="px-2.5"> 7545 {{#second_bar}} 7546 <div id="instant-search-bar"></div> 7547 {{/second_bar}} 7548 </div> 7549 </div> 7550 </div> 7551 <div class="relative"> 7552 <div itemscope itemtype="http://schema.org/ItemList" class="w-full"> 7553 <div id="algolia-toolbar" class="toolbar toolbar-products items-center flex justify-between"> 7554 <div class="left flex items-center"> 7555 <div id="algolia-stats"></div> 7556 </div> 7557 <div class="right flex items-center"> 7558 <span class="mr-2 inline-block">
7558Ordina per</span> 7559 <div id="algolia-sorts"></div> 7560 </div> 7561 </div> 7562 <div id="algolia-banner"></div> 7563 <div id="instant-empty-results-container"></div> 7564 <div class="py-6" id="instant-search-results-container"></div> 7565 </div> 7566 </div> 7567 <div> 7568 <div id="algolia-stats-range" class="mb-2"></div> 7569 <div id="instant-search-pagination-container"></div> 7570 </div> 7571 </div> 7572 </div> 7573 </div> 7574</script>
7574 7575
7576<script> 7577 function toggleAaFilters() { 7578 try { 7579 var facets = document.getElementById('facets'); 7580 if (!facets) return; 7581 7582 // Toggle visibility of facets (mobile overlay) 7583 facets.classList.toggle('hidden'); 7584 7585 var isOpen = !facets.classList.contains('hidden'); 7586 var body = document.body; 7587 var lockClasses = ['max-h-screen', 'lock-screen', 'overflow-hidden', 'instant-lock']; 7588 lockClasses.forEach(function (cls) { 7589 if (isOpen) { 7590 body.classList.add(cls); 7591 } else { 7592 body.classList.remove(cls); 7593 } 7594 }); 7595 7596 // Apply or remove mobile collapsible bindings only when toggler is used 7597 try { 7598 if (window.AISFacetsCollapsible) { 7599 if (isOpen) { 7600 window.AISFacetsCollapsible.enable(); 7601 } 7602 } 7603 } catch (e2) { /* noop */ } 7604 } catch (e) { 7605 // Fail-safe: do nothing on error 7606 console.error('toggleAaFilters error', e); 7607 } 7608 } 7609</script>
7609 7610
7611<script> 7612 // Mobile-only: make Algolia facets panels (.ais-Panel) collapsible after they are rendered 7613 (function() { 7614 'use strict'; 7615 var MOBILE_MQL = window.matchMedia('(max-width: 1023px)'); // Tailwind lg breakpoint 7616 7617 function applyCollapsible(root) { 7618 if (!root) return; 7619 var panels = root.querySelectorAll('.ais-Panel'); 7620 panels.forEach(function(panel) { 7621 if (!panel || panel.dataset.collapsibleApplied === '1') return; 7622 var header = panel.querySelector('.ais-Panel-header'); 7623 var body = panel.querySelector('.ais-Panel-body'); 7624 if (!header || !body) return; 7625 7626 // Mark as processed 7627 panel.dataset.collapsibleApplied = '1'; 7628 7629 // Ensure default open state 7630 panel.classList.remove('is-collapsed'); 7631 header.setAttribute('aria-expanded', 'true'); 7632 7633 // Make header interactive 7634 header.setAttribute('role', 'button'); 7635 header.setAttribute('tabindex', '0'); 7636 7637 // Inject chevron-down if not present 7638 if (!header.querySelector('.ais-Panel-chevron')) { 7639 var chev = document.createElement('span'); 7640 chev.className = 'ais-Panel-chevron chevron'; 7641 chev.setAttribute('aria-hidden', 'true'); 7642 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>'; 7643 header.appendChild(chev); 7644 } 7645 7646 var toggle = function() { 7647 var collapsed = panel.classList.toggle('is-collapsed'); 7648 header.setAttribute('aria-expanded', String(!collapsed)); 7649 }; 7650 7651 header.addEventListener('click', toggle); 7652 header.addEventListener('keydown', function(e) { 7653 if (e.key === 'Enter' || e.key === ' ') { 7654 e.preventDefault(); 7655 toggle(); 7656 } 7657 }); 7658 }); 7659 } 7660 7661 function enableMobileCollapsible() { 7662 if (!MOBILE_MQL.matches) return; 7663 var container = document.getElementById('instant-search-facets-container'); 7664 if (!container) return; 7665 applyCollapsible(container); 7666 7667 // Observe for dynamic facet (re)renders 7668 if (!container._aisCollapsibleObserver) { 7669 var obs = new MutationObserver(function() { 7670 applyCollapsible(container); 7671 }); 7672 obs.observe(container, { childList: true, subtree: true }); 7673 container._aisCollapsibleObserver = obs; 7674 } 7675 } 7676 7677 function disableMobileCollapsible() { 7678 var container = document.getElementById('instant-search-facets-container'); 7679 if (!container) return; 7680 // Ensure all panels are open on desktop 7681 container.querySelectorAll('.ais-Panel').forEach(function(panel) { 7682 panel.classList.remove('is-collapsed'); 7683 var header = panel.querySelector('.ais-Panel-header'); 7684 if (header) { 7685 header.setAttribute('aria-expanded', 'true'); 7686 } 7687 }); 7688 if (container._aisCollapsibleObserver) { 7689 try { container._aisCollapsibleObserver.disconnect(); } catch (e) {} 7690 container._aisCollapsibleObserver = null; 7691 } 7692 } 7693 7694 // Expose API to be triggered explicitly by the mobile toggler 7695 window.AISFacetsCollapsible = { 7696 enable: enableMobileCollapsible, 7697 disable: disableMobileCollapsible, 7698 _mql: MOBILE_MQL 7699 }; 7700 })(); 7701</script>
7701 7702 7703<style> 7704 .ais-ClearRefinements-button span { 7705 display: none; 7706 } 7707 7708 .ais-ClearRefinements-button::after { 7709 content: 'Cancella tutto'; 7710 } 7711</style>
7712<script type="text/template" id="instant-hit-template"> 7713 <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" 7714 x-data="initInsight()" 7715 x-init="bindClickEvent($el, 'Product Clicked', '{{objectID}}', '{{__indexName}}', '{{__position}}', '{{__queryID}}')" 7716 > 7717 <meta itemprop="position" content="{{__position}}"/> 7718 <div class="relative flex flex-col flex-grow" itemprop="item" itemscope itemtype="http://schema.org/Product"> 7719 <meta itemprop="url" 7720 {{^__queryID}} content="{{url}}" {{/__queryID}} 7721 {{#__queryID}} content="{{urlForInsights}}" {{/__queryID}} 7722 /> 7723 7724 <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')"> 7725 <template x-for="badge in $store.badges.getBadgesHtml({{objectID}}, 'card_top_left')"> 7726 <span x-html="badge"></span> 7727 </template> 7728 </span> 7729 7730 <a class="product photo product-item-photo block mx-auto mb-4 result flex items-center justify-center max-w-[142px] max-h-[142px]" 7731 tabindex="-1" 7732 {{^__queryID}} href="{{url}}" {{/__queryID}} 7733 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}} 7734 > 7735 {{#image_url}}<img itemprop="image" src="{{{image_url}}}" alt="{{{name}}}" class="max-w-full max-h-full object-contain"/>{{/image_url}} 7736 {{^image_url}}<span class="no-image block max-w-[142px] max-h-[142px] bg-gray-3"></span>{{/image_url}} 7737 </a> 7738 7739 <div class="product-info flex flex-col grow justify-start"> 7740 <div class="items-center justify-center"> 7741 <a class="product-item-link result" 7742 {{^__queryID}} href="{{url}}" {{/__queryID}} 7743 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}}> 7744 <h2 class="text-primary text-xs line-clamp-3 font-normal"> 7745 {{{ _highlightResult.name.value }}} 7746 </h2> 7747 </a> 7748 </div> 7749 <div class="mt-1 mb-1"> 7750 {{#rating_count}} 7751 <div class="rating-summary" title="{{rating_summary}}%" role="group" aria-label="{{rating_summary}}%"> 7752 <div class="inline-flex align-middle" style="line-height: 0;"> 7753 <div class="relative"> 7754 <div class="flex"> 7755 <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> 7756 <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> 7757 <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"/>
7757</svg> 7758 <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> 7759 <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> 7760 </div> 7761 <div class="absolute top-0 left-0 overflow-hidden" style="width: {{rating_summary}}%"> 7762 <div class="flex w-fit"> 7763 <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> 7764 <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> 7765 <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> 7766 <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> 7767 <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> 7768 </div> 7769 </div> 7770 </div>
7771 <span class="ml-1 text-xs relative top-[-1px]">({{rating_count}})</span> 7772 </div> 7773 </div> 7774 {{/rating_count}} 7775 </div> 7776 7777 <div class="flex flex-nowrap justify-between items-center mt-auto items-end leading-none"> 7778 <span class="ajax-price-container block flex-grow font-baloo-bhaina hide-price-labels"> 7779 <template x-if="active = true"> 7780 <div x-defer="intersect" x-intersect.once="$store.ajaxPrices.addNode({{objectID}})"> 7781 <template x-if="!$store.ajaxPrices.hasPrice({{objectID}})"> 7782 <div class="skeleton w-16 lg:w-full h-6"> 7783 Caricamento... </div> 7784 </template> 7785 <template x-if="$store.ajaxPrices.hasPrice({{objectID}})"> 7786 <span x-html="$store.ajaxPrices.getPriceHtml({{objectID}})"></span> 7787 </template> 7788 </div> 7789 </template> 7790 </span> 7791 7792 {{#isAddToCartEnabled}} 7793 {{#in_stock}} 7794 <form class="flex-grow-0 product_addtocart_form" data-role="tocart-form" action="{{ addToCart.action }}" method="post"> 7795 <input type="hidden" name="product" value="{{objectID}}"> 7796 <input type="hidden" name="uenc" value="{{ addToCart.uenc }}"> 7797 <input name="form_key" type="hidden" value="{{ addToCart.formKey }}"> 7798 <button type="submit" title="Aggiungi al Carrello" 7799 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" 7800 > 7801 <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> 7802 </button> 7803 </form> 7804 {{/in_stock}} 7805 {{^in_stock}} 7806 <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" 7807 {{^__queryID}} href="{{url}}" {{/__queryID}} 7808 {{#__queryID}} href="{{urlForInsights}}" {{/__queryID}} 7809 > 7810 <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"> 7811 <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.
7811058 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> 7812 </svg> 7813 </a> 7814 {{/in_stock}} 7815 7816 {{/isAddToCartEnabled}} 7817 </div> 7818 </div> 7819 </div> 7820 </div> 7821</script>
vendor: 1 bytes, line 7821
7821
7822<script> 7823 'use strict'; 7824 7825 function initInsight() { 7826 return { 7827 bindClickEvent(element, eventName, objectID, indexName, position, queryID) { 7828 element.querySelector(algoliaConfig.ccAnalytics.ISSelector).addEventListener("click", function () { 7829 buildInsightsEventData(eventName, objectID, indexName, position, queryID); 7830 }); 7831 } 7832 } 7833 } 7834</script>
vendor: 1 bytes, line 7834
7834
7835<script type="text/template" id="instant-stats-total-template"> 7836 <div class="font-body-sm text-gray-1 hidden lg:block"> 7837 <span itemprop="numberOfItems">{{nbHits}}</span> 7838 <span>prodotti</span> 7839 </div> 7840</script>
7840 7841
7842<script type="text/template" id="instant-stats-range-template"> 7843 <div class="toolbar-amount font-body-sm text-gray-1 pb-4 text-center"> 7844 <span itemprop="numberOfItems">{{first}}-{{last}}</span> 7845 <span>di</span> 7846 <span itemprop="numberOfItems">{{nbHits}}</span> 7847 </div> 7848</script>
vendor: 1 bytes, line 7848
7848
7849<script type="text/template" id="refinements-lists-item-template"> 7850 <label class="{{cssClasses.label}} {{#isRefined}}checked{{/isRefined}} flex items-center mb-1"> 7851 <input class="{{cssClasses.checkbox}}" {{#isRefined}}checked{{/isRefined}} type="checkbox" value="{{value}}" /> 7852 <span class="pl-2">{{value}}</span> 7853 <span class="{{cssClasses.count}} flex-grow text-right">{{count}}</span> 7854 </label> 7855</script>
vendor: 1 bytes, line 7855
7855
7856<script type="text/template" id="current-refinements-template"> 7857 <div class="cross-wrapper"> 7858 <span class="clear-cross clear-refinement"></span> 7859 </div> 7860 <div class="current-refinement-wrapper"> 7861 {{#label}} 7862 <span class="current-refinement-label">{{label}}{{^operator}}:{{/operator}}</span> 7863 {{/label}} 7864 {{#operator}} 7865 {{{displayOperator}}} 7866 {{/operator}} 7867 {{#exclude}}-{{/exclude}} 7868 <span class="current-refinement-name">{{name}}</span> 7869 </div> 7870</script>
vendor: 1 bytes, line 7870
7870
7871<script> 7872 (function () { 7873 const modals = []; 7874 let lastHide = 0; 7875 7876 function resolveElement($refs, value) { 7877 if (!value) return null; 7878 if (value instanceof Element) return value; 7879 if (typeof value === 'string') { 7880 try { 7881 return ($refs && $refs[value]) || document.querySelector(value) || null; 7882 } catch (e) {} 7883 } 7884 return null; 7885 } 7886 7887 function determineTrigger($refs, dialog, trigger) { 7888 if (!trigger && dialog?.target instanceof HTMLElement) { 7889 return dialog.target; 7890 } 7891 7892 if (typeof dialog === 'string' && trigger?.target instanceof HTMLElement) { 7893 return trigger.target; 7894 } 7895 7896 return resolveElement($refs, trigger); 7897 } 7898 7899 function setFocusFirstElement(dialogElement) { 7900 if (!dialogElement) return; 7901 7902 window.setTimeout(() => { 7903 const candidates = dialogElement.querySelectorAll('[x-focus-first]'); 7904 for (const candidate of candidates) { 7905 if (candidate.closest('dialog') === dialogElement) { 7906 candidate.focus(); 7907 return; 7908 } 7909 } 7910 }, 50); 7911 } 7912 7913 window.hyva.modal = function(options = {}) { 7914 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 7915 try { 7916 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 7917 } catch (e) { 7918 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 7919 } 7920 } 7921 7922 const config = Object.assign({ 7923 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 7924 transitionEnterStart: 'opacity-0', 7925 transitionEnterEnd: 'opacity-100', 7926 transitionLeave: 'transition ease-in duration-300', 7927 transitionLeaveStart: 'opacity-100', 7928 transitionLeaveEnd: 'opacity-0', 7929 }, options); 7930 7931 return { 7932 opened: {}, 7933 show(dialog, trigger) { 7934 const name = typeof dialog === 'string' ? dialog : config.dialog; 7935 if (!name || this.opened[name]) return; 7936 7937 this.opened[name] = true; 7938 const focusTarget = determineTrigger(this.$refs, dialog, trigger); 7939 const dialogEl = this.$refs && this.$refs[name]; 7940 const frame = { name, instance: this, focusTarget, time: Date.now() }; 7941 modals.push(frame); 7942 setFocusFirstElement(dialogEl); 7943 return new Promise(resolve => { frame.resolve = resolve; }); 7944 }, 7945 cancel() { 7946 this.hide(false); 7947 }, 7948 ok() { 7949 this.hide(true); 7950 }, 7951 hide(value) { 7952 if (Date.now() - lastHide < config.duration) return; 7953 lastHide = Date.now(); 7954 7955 const modal = modals.pop(); 7956 if (!modal) return; 7957 7958 modal.instance.opened[modal.name] = false; 7959 7960 const focusTarget = modal.focusTarget; 7961 focusTarget && window.setTimeout(() => focusTarget.focus(), config.duration + 50); 7962 modal.resolve && modal.resolve(value); 7963 }, 7964 /** 7965 * @deprecated Use dialogConfig() instead, which is used by the default modal-container.phtml template. 7966 * This method is kept for backwards compatibility with custom container templates. 7967 */ 7968 overlay(dialog) { 7969 dialog = this.$el.dataset.dialogRefName || dialog; 7970 const name = typeof dialog === 'string' ? dialog : config.dialog; 7971 if (this.$el.tagName !== 'DIALOG' && ! window.hyva.modal.legacyModalCompatibility) { 7972 console.warn( 7973 '[hyva] Deprecated modal markup detected (x-bind="overlay" on a non-dialog element' + 7974 (name ? ` for "${name}"` : '') + ').\n' + 7975 'Escape and click-outside closing are not available for such dialogs anymore.\n' + 7976 'Install hyva-themes/magento2-legacy-modal-compatibility or migrate to the native <dialog> markup.' 7977 ); 7978 } 7979 return Object.assign({}, this.dialogConfig(name), { 7980 ['@hyva-modal-show.window'](event) { 7981 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 7982 } 7983 }); 7984 }, 7985 dialogConfig(name) { 7986 name = name || this.$el.dataset.dialogRefName || config.dialog; 7987 return { 7988 ['x-show']: () => name ? this.opened[name] : false, 7989 ['x-transition:enter']: config.transitionEnter, 7990 ['x-transition:enter-start']: config.transitionEnterStart, 7991 ['x-transition:enter-end']: config.transitionEnterEnd, 7992 ['x-transition:leave']: config.transitionLeave, 7993 ['x-transition:leave-start']: config.transitionLeaveStart, 7994 ['x-transition:leave-end']: config.transitionLeaveEnd, 7995 ['@hyva-modal-show.window'](event) { 7996 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide); 7997 }, 7998 }; 7999 },
8000 showDialogOnInit() { 8001 const name = this.$el.dataset.dialogRefName; 8002 if (name) { 8003 this.show(name); 8004 } 8005 } 8006 }; 8007 } 8008 8009 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length - 1] 8010 8011 window.hyva.modal.pop = function () { 8012 if (modals.length > 0) { 8013 modals[modals.length - 1].instance.hide(); 8014 } 8015 } 8016 8017 /** 8018 * @deprecated Native <dialog> handles focus trapping automatically. 8019 * Calling this function has no effect. Kept for backwards compatibility. 8020 */ 8021 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) {} 8022 8023 /** 8024 * @deprecated Native <dialog> with x-htmldialog handles ESC key and click-outside events. 8025 * These functions have no effect. Kept for backwards compatibility. 8026 */ 8027 window.hyva.modal.eventListeners = { 8028 keydown: event => {}, 8029 click: event => {} 8030 }; 8031 })(); 8032 8033 window.addEventListener('alpine:init', () => { 8034 Alpine.data('hyvaModal', window.hyva.modal); 8035 }, {once: true}); 8036</script>
8036 8037 8038<section x-data="initAmGdprLoader" 8039 @amgdpr-loading-start.window="showLoader" 8040 @amgdpr-loading-stop.window="hideLoader" 8041> 8042 8043<div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" 8044 style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgb(255 255 255/0.60);" 8045 x-show="isLoading" 8046 x-transition:enter="ease-out duration-200" 8047 x-transition:enter-start="opacity-0" 8048 x-transition:enter-end="opacity-100" 8049 x-transition:leave="ease-in duration-200" 8050 x-transition:leave-start="opacity-100" 8051 x-transition:leave-end="opacity-0"> 8052 <svg xmlns="http://www.w3.org/2000/svg" width="57" height="57" viewBox="0 0 38 38" stroke="#ffb590" class="text-primary" role="img"> 8053 <g fill="none" fill-rule="evenodd"> 8054 <g transform="translate(1 1)" stroke-width="2"> 8055 <circle stroke="#ff6801" cx="18" cy="18" r="18"/> 8056 <path d="M36 18c0-9.94-8.06-18-18-18"> 8057 <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite"/> 8058 </path> 8059 </g> 8060 </g> 8061<title>loader</title></svg> 8062</div> 8063</section> 8064
8065<script data-cfasync="false"> 8066 'use strict'; 8067 8068 function initAmGdprLoader() { 8069 return { 8070 isLoading: false, 8071 8072 /** 8073 * @returns {void} 8074 */ 8075 showLoader: function () { 8076 this.isLoading = true; 8077 }, 8078 8079 /** 8080 * @returns {void} 8081 */ 8082 hideLoader: function () { 8083 this.isLoading = false; 8084 } 8085 } 8086 } 8087 8088 window.addEventListener( 8089 'alpine:init', 8090 () => Alpine.data('initAmGdprLoader', initAmGdprLoader), 8091 { once: true } 8092 ); 8093</script>
8093 8094 8095
8096<script data-cfasync="false"> 8097 'use strict'; 8098 8099 /** 8100 * @typedef {Object} CookieGroupData 8101 * @prop {Boolean} checked 8102 * @prop {[{description: string, lifetime: number|null, name: string, provider: string, type: string}]} cookies 8103 * @prop {String} description 8104 * @prop {string|null} groupId 8105 * @prop {Boolean} isEssential 8106 * @prop {String} name 8107 */ 8108 8109 function initAmastyCookieGroupsStorage() { 8110 return { 8111 /** 8112 * @type {[CookieGroupData]} 8113 */ 8114 groupData: [], 8115 cookiePolicy: undefined, 8116 lastUpdate: undefined, 8117 8118 /** 8119 * @returns {string|number[]} 8120 */ 8121 getEssentialGroupIds: function () { 8122 return this.groupData.reduce(function (essentialGroupIds, group) { 8123 if (group.isEssential) { 8124 essentialGroupIds.push(group.groupId) 8125 } 8126 8127 return essentialGroupIds; 8128 }, []); 8129 }, 8130 8131 /** 8132 * @returns {string|number[]} 8133 */ 8134 getCheckedGroupIds: function () { 8135 return this.groupData.reduce(function (checkedGroupIds, group) { 8136 if (group.checked) { 8137 checkedGroupIds.push(group.groupId); 8138 } 8139 8140 return checkedGroupIds; 8141 }, []); 8142 }, 8143 8144 /** 8145 * @param {string} cookieName 8146 * @returns {boolean} 8147 */ 8148 isCookieEssential: function (cookieName) { 8149 const allEssentialCookies = this.getEssentialCookies(); 8150 8151 return !!allEssentialCookies.find(cookie => cookie.name === cookieName); 8152 }, 8153 8154 /** 8155 * @returns {array} 8156 */ 8157 getEssentialCookies: function () { 8158 return this.groupData 8159 .filter(group => group.isEssential) 8160 .map(group => group.cookies) 8161 .flat(); 8162 }, 8163 8164 /** 8165 * @returns {boolean} 8166 */ 8167 hasGroupData: function () { 8168 return !!this.groupData.length; 8169 }, 8170 8171 /** 8172 * @param {string} cookieName 8173 * @param {string} pattern 8174 * @returns {boolean} 8175 */ 8176 isEssentialByPattern: function (cookieName, pattern) { 8177 const essentialCookiePatterns = this.getEssentialCookiesPattern(pattern); 8178 8179 return essentialCookiePatterns.some((pattern) => !!cookieName.match(this.getCookiePattern(pattern))); 8180 }, 8181 8182 /** 8183 * @param {string} pattern 8184 * @return {Array} 8185 */ 8186 getEssentialCookiesPattern: function (pattern) { 8187 return this.getCookiesByPattern(pattern, this.getEssentialCookies()); 8188 }, 8189 8190 /** 8191 * @param {string} pattern 8192 * @param {Array|undefined} cookies 8193 * @return {Array} 8194 */ 8195 getCookiesByPattern: function (pattern, cookies) { 8196 if (typeof cookie === 'undefined') { 8197 cookies = this.getAllCookies(); 8198 } 8199 8200 return cookies
8201 .map((cookie) => typeof cookie === 'object' ? cookie.name : cookie.split('=')[0].trim()) 8202 .filter((cookie) => cookie.match(pattern) !== null); 8203 }, 8204 8205 /** 8206 * @returns {array} 8207 */ 8208 getDisallowedCookies: function () { 8209 const disallowedCookie = decodeURIComponent(hyva.getCookie('amcookie_disallowed') ?? ''); 8210 if (!disallowedCookie) { 8211 return []; 8212 } 8213 8214 return disallowedCookie.split(','); 8215 }, 8216 8217 /** 8218 * @returns {string} 8219 */ 8220 getCookiePattern: function (pattern) { 8221 return `^${pattern.replaceAll('*', '.*')}$`; 8222 }, 8223 8224 /** 8225 * @returns {array} 8226 */ 8227 getAllCookies: function () { 8228 return document.cookie.split(';'); 8229 }, 8230 8231 /** 8232 * @param {boolean} setAcceptance 8233 * @returns {Promise} 8234 */ 8235 updateGroupData: function (setAcceptance = false) { 8236 const cookieFetchUrl = `${BASE_URL}amcookie/cookie/cookies`; 8237 return fetch(cookieFetchUrl, { 8238 method: "POST", 8239 headers: { 8240 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 8241 'X-Requested-With': 'XMLHttpRequest' 8242 }, 8243 body: new URLSearchParams({ 8244 allowed: hyva.getCookie('amcookie_allowed'), 8245 restriction: hyva.getCookie('amcookie_policy_restriction') 8246 }) 8247 }).then(response => { 8248 if (response.ok) { 8249 return response.json(); 8250 } 8251 8252 return Promise.reject(`${response.status} ${response.statusText}`); 8253 }).then(data => { 8254 this.cookiePolicy = data.cookiePolicy ?? 'allowed'; 8255 this.lastUpdate = data.lastUpdate ?? 0; 8256 this.groupData = [...data.groupData]; 8257 8258 hyva.setCookie('amcookie_policy_restriction', this.cookiePolicy, 10); 8259 if (setAcceptance) { 8260 amastyCookieManager.setLastCookieAcceptance(this.lastUpdate); 8261 } 8262 8263 return data; 8264 }).catch(error => { 8265 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8266 { 8267 type: "error", 8268 text: error 8269 } 8270 ]); 8271 }).finally(() => window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated'))); 8272 } 8273 } 8274 } 8275 8276 window.addEventListener( 8277 'alpine:init', 8278 () => Alpine.store('AmastyCookieGroups', initAmastyCookieGroupsStorage()), 8279 { once: true } 8280 ); 8281</script>
8281 8282
8283<script data-cfasync="false"> 8284 (function (amastyCookieManager) { 8285 'use strict'; 8286 8287 amastyCookieManager.pattern = '{(?<cookiePattern>.*)}'; 8288 8289 amastyCookieManager.getAmastyCookieGroupStorage = function () { 8290 return Alpine.store('AmastyCookieGroups') ?? {}; 8291 }; 8292 8293 amastyCookieManager.deleteDisallowedCookie = function () { 8294 const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); 8295 const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; 8296 8297 disallowedCookies.forEach((name) => { 8298 const pattern = name.match(this.pattern); 8299 if (!!pattern && !!amastyCookieGroupStorage) { 8300 const cookiePattern = amastyCookieGroupStorage.getCookiePattern(pattern.groups.cookiePattern) ?? ''; 8301 8302 amastyCookieGroupStorage.getCookiesByPattern(cookiePattern).forEach((cookieName) => { 8303 this.deleteNotEssentialCookie(cookieName); 8304 }); 8305 } else { 8306 this.deleteNotEssentialCookie(name); 8307 } 8308 }); 8309 }; 8310 8311 amastyCookieManager.isCookieAllowed = function (cookieName) { 8312 const allowedGroups = hyva.getCookie('amcookie_allowed'); 8313 const disallowedCookie = this.getAmastyCookieGroupStorage()?.getDisallowedCookies() ?? []; 8314 const isCookiePolicyAllowed = hyva.getCookie('amcookie_policy_restriction') === 'allowed'; 8315 const isCookieEssential = this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName); 8316 const isCookieEssentialByPattern = this.getAmastyCookieGroupStorage()?.isEssentialByPattern(cookieName, this.pattern); 8317 8318 if (!isCookiePolicyAllowed || isCookieEssential || isCookieEssentialByPattern) { 8319 return true; 8320 } 8321 8322 return !((!allowedGroups && !disallowedCookie) || this.isCookieDisallowed(cookieName)); 8323 }; 8324 8325 amastyCookieManager.isCookieDisallowed = function (cookieName) { 8326 const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); 8327 const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; 8328 8329 return disallowedCookies.some((cookie) => { 8330 const pattern = cookie.match(this.pattern); 8331 8332 return !!pattern && !!cookieName.match(amastyCookieGroupStorage?.getCookiePattern(pattern.groups.cookiePattern)); 8333 }) || disallowedCookies.indexOf(cookieName) !== -1; 8334 }; 8335 8336 amastyCookieManager.processManageableCookies = function () { 8337 let cookieScripts = document.querySelectorAll('script[data-amcookie-groupid][type="text/plain"]'); 8338 8339 cookieScripts.forEach((elem) => { 8340 if (this.isChecked(elem.dataset['amcookie-groupid'])) { 8341 let elClone = elem.cloneNode(true).setAttribute('type', 'text/javascript'); 8342 8343 elem.remove(); 8344 document.body.appendChild(elClone); 8345 } 8346 }); 8347 }; 8348 8349 amastyCookieManager.deleteNotEssentialCookie = function (cookieName) { 8350 if (!this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName)) { 8351 hyva.setCookie(cookieName, '', -1, true); 8352 } 8353 }; 8354 8355 amastyCookieManager.setLastCookieAcceptance = function (lastUpdate) { 8356 localStorage.setItem('am-last-cookie-acceptance', lastUpdate); 8357 }; 8358 8359 window.addEventListener('amasty-cookie-group-updated', () => { 8360 amastyCookieManager.deleteDisallowedCookie(); 8361 }); 8362 8363 window.addEventListener('private-content-loaded', () => { 8364 amastyCookieManager.getAmastyCookieGroupStorage()?.hasGroupData() && amastyCookieManager.deleteDisallowedCookie(); 8365 }); 8366 }(window.amastyCookieManager = window.amastyCookieManager || {})); 8367</script>
8367 8368
8369<script data-cfasync="false"> 8370 (function () { 8371 'use strict'; 8372 8373 window.addEventListener('cookiebar-action-accept', (event) => { 8374 const groups = event.detail?.include_checked_groups ? Alpine.store('AmastyCookieGroups').getCheckedGroupIds() : []; 8375 const url = `${BASE_URL}amcookie/cookie/savegroups`; 8376 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 8377 const body = new URLSearchParams({ 8378 form_key: hyva.getFormKey() 8379 }); 8380 groups.length && groups.map(groupId => body.append('groups[]', groupId)); 8381 8382 fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) 8383 .then(response => { 8384 if (response.ok) { 8385 return response.json(); 8386 } 8387 8388 return Promise.reject(`${response.status} ${response.statusText}`); 8389 }) 8390 .then(data => { 8391 !!data.success && Alpine.store('AmastyCookieGroups').updateGroupData(true); 8392 }) 8393 .catch(error => { 8394 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8395 { 8396 type: "error", 8397 text: error 8398 } 8399 ]); 8400 }) 8401 .finally(() => { 8402 amastyCookieManager.processManageableCookies(); 8403 window.dispatchEvent(new CustomEvent('cookiebar-action-accept-finish')); 8404 window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated')); 8405 // Wait cookiebar close animation 8406 setTimeout(() => { 8407 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8408 }, 100); 8409 }); 8410 }); 8411 })(); 8412</script>
8412 8413
8414<script data-cfasync="false"> 8415 (function () { 8416 'use strict'; 8417 8418 window.addEventListener('cookiebar-action-allow', () => { 8419 const url = `${BASE_URL}amcookie/cookie/allow`; 8420 const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; 8421 const body = new URLSearchParams({ 8422 form_key: hyva.getFormKey() 8423 }); 8424 fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) 8425 .then(response => { 8426 if (response.ok) { 8427 return response; 8428 } 8429 8430 return Promise.reject(`${response.status} ${response.statusText}`); 8431 }) 8432 .then(() => { 8433 Alpine.store('AmastyCookieGroups').updateGroupData(true); 8434 }) 8435 .catch(error => { 8436 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ 8437 { 8438 type: "error", 8439 text: error 8440 } 8441 ]); 8442 }) 8443 .finally(() => { 8444 amastyCookieManager.processManageableCookies(); 8445 window.dispatchEvent(new CustomEvent('cookiebar-action-allow-finish')); 8446 // Wait cookiebar close animation 8447 setTimeout(() => { 8448 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8449 }, 100); 8450 }); 8451 }); 8452 })(); 8453</script>
8453 8454 8455<style> 8456 :root { 8457 /* Bar Color Settings */ 8458 --ambar-background: #fff; 8459 --ambar-links-color: #326ed1; 8460 --ambar-policy-text: #374151; 8461 --ambar-toggle-active-color: #2563eb; 8462 --ambar-toggle-inactive-color: #fff; 8463 8464 /* Buttons Color Settings */ 8465 --ambar-button-accept-color: #337ab7; 8466 --ambar-button-accept-hover-color: #337ab7; 8467 --ambar-button-accept-text: #fff; 8468 --ambar-button-accept-hover-text: #fff; 8469 8470 --ambar-button-allow-color: #337ab7; 8471 --ambar-button-allow-hover-color: #337ab7; 8472 --ambar-button-allow-text: #fff; 8473 --ambar-button-allow-hover-text: #fff; 8474 8475 --ambar-button-decline-color: #337ab7; 8476 --ambar-button-decline-hover-color: #337ab7; 8477 --ambar-button-decline-text: #fff; 8478 --ambar-button-decline-hover-text: #fff; 8479 8480 --ambar-button-settings-color: #337ab7; 8481 --ambar-button-settings-hover-color: #337ab7; 8482 --ambar-button-settings-text: #fff; 8483 --ambar-button-settings-hover-text: #fff; 8484 8485 /* Buttons Order Settings */ 8486 --ambar-button-accept-order: 0; 8487 --ambar-button-allow-order: 0; 8488 --ambar-button-settings-order: 0; 8489 --ambar-button-decline-order: 0; 8490 8491 /* Cookie Information Bar Color Settings */ 8492 --ambar-information-background: #fff; 8493 --ambar-information-title: #374151; 8494 --ambar-information-description: #374151; 8495 --ambar-information-table-header: #374151; 8496 --ambar-information-table-content: #374151; 8497 8498 /* Cookie Information Bar Done Button Settings */ 8499 --ambar-information-button-color: #1d4ed8; 8500 --ambar-information-button-hover-color: #1d4ed8; 8501 --ambar-information-button-text: #fff; 8502 --ambar-information-button-hover-text: #fff; 8503 8504 /* Settings Bar Done Button Settings */ 8505 --ambar-setting-button-color: #1d4ed8; 8506 --ambar-setting-button-hover-color: #1d4ed8; 8507 --ambar-setting-button-text: #fff; 8508 --ambar-setting-button-hover-text: #fff; 8509 } 8510</style> 8511
8512<script data-cfasync="false"> 8513 'use strict'; 8514 8515 function initAmCookieActionDispatcherBtn() { 8516 return { 8517 actiondispatchHandler: function (event) { 8518 const { dispatchAction, dispatchPayload } = event.currentTarget.dataset; 8519 this.$dispatch(dispatchAction, this.parsePayload(dispatchPayload)); 8520 }, 8521 parsePayload: function (payload) { 8522 try { 8523 return JSON.parse(payload); 8524 } catch (e) { 8525 return null; 8526 } 8527 } 8528 }; 8529 } 8530 8531 window.addEventListener( 8532 'alpine:init', 8533 () => Alpine.data('initAmCookieActionDispatcherBtn', initAmCookieActionDispatcherBtn), 8534 { once: true } 8535 ); 8536</script>
8536 8537
8538<script data-cfasync="false"> 8539 'use strict'; 8540 8541 function initAmCookieGroups() { 8542 return { 8543 /** 8544 * @withContext x-for: $store.AmastyCookieGroups.groupData 8545 * @returns {string} 8546 */ 8547 getInputGroupId: function () { 8548 return `amcookie-${this.$el.dataset.groupPrefix}group-${this.group.groupId}` 8549 }, 8550 8551 /** 8552 * @withContext x-for: $store.AmastyCookieGroups.groupData 8553 * @returns {{"!bg-gray-400": boolean}} 8554 */ 8555 getInputStyles: function () { 8556 return { 8557 '!bg-gray-400': this.group.isEssential 8558 } 8559 }, 8560 8561 /** 8562 * @withContext x-for: $store.AmastyCookieGroups.groupData 8563 * @returns {void} 8564 */ 8565 toggleGroup: function () { 8566 this.group.checked = !this.group.checked; 8567 }, 8568 8569 /** 8570 * @withContext x-for: $store.AmastyCookieGroups.groupData 8571 * @returns {void} 8572 */ 8573 moreInfoClickHandler: function () { 8574 this.$dispatch(this.$el.dataset.dispatchAction, this.group); 8575 }, 8576 8577 moreInformationAboutCookieGroup: function () { 8578 return hyva.str('About\u0020\u0022\u00251\u0022\u0020Cookie\u0020Group', this.group.name); 8579 } 8580 } 8581 } 8582 8583 window.addEventListener( 8584 'alpine:init', 8585 () => Alpine.data('initAmCookieGroups', initAmCookieGroups), 8586 {once: true} 8587 ); 8588</script>
8588 8589<style> 8590 .is-loading > :not(.loader) { 8591 visibility: hidden; 8592 } 8593</style> 8594
8595<script> 8596 function connectifGetURLParameters(form) { 8597 let url = form.querySelector('.connectif-url').getAttribute('href'); 8598 const parsedUrl = new URL(url); 8599 8600 const params = new URLSearchParams(parsedUrl.search); 8601 8602 const paramsObject = {}; 8603 params.forEach((value, key) => { 8604 paramsObject[key] = decodeURIComponent(value); 8605 }); 8606 8607 return paramsObject; 8608 } 8609 8610 var addToCartAjaxEvent = function (e) { 8611 let form = this; 8612 let delay = parseInt('1000', 10); 8613 8614 e.preventDefault(); 8615 8616 const data = new URLSearchParams(new FormData(form)), 8617 button = form.querySelector('button') ? 8618 form.querySelector('button') : 8619 document.getElementById('product-addtocart-button'), 8620 loader = document.createElement('div'), 8621 initialText = button.innerHTML; 8622 8623 loader.className = 'absolute inset-0 flex justify-center items-center loader'; 8624 loader.innerHTML = ` 8625 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" xml:space="preserve" width="32" height="32"> 8626 <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"> 8627 <animateTransform attributeName="transform" attributeType="XML" type="rotate" dur="1s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/> 8628 </path> 8629 </svg> 8630 `; 8631 8632 button.prepend(loader); 8633 button.classList.add('relative', 'is-loading', 'text-[0]'); 8634 button.disabled = true; 8635 8636 var product_id = data.get('product'); 8637 8638 fetch(e.currentTarget.action, { 8639 method: 'POST', 8640 body: data, 8641 headers: { 8642 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8', 8643 'X-Requested-With': 'XMLHttpRequest' 8644 } 8645 }) 8646 .then(res => { 8647 if (!res.ok) { 8648 return form.submit(); 8649 } 8650 8651 if (res.redirected) { 8652 return []; 8653 } 8654 8655 return res.json(); 8656 }) 8657 .then(data => { 8658 if (form.classList.contains('connectif-product')) { 8659 let jsonDecodedVAR = JSON.parse(connectifGetURLParameters(form)['cnWebLinkClicked']); 8660 jsonDecodedVAR.type = "web-link-clicked"; 8661 8662 window.connectif.managed.sendEvents([jsonDecodedVAR], []).finally(() => submitCallback()); 8663 } else { 8664 submitCallback(); 8665 } 8666 8667 function submitCallback() { 8668 if (data.backUrl && data.backUrl !== window.location.href) { 8669 form.submit(); 8670 } else { 8671 button.classList.add('bg-success-darker', 'hover:bg-success-darker'); 8672 loader.remove(); 8673 8674 let defaultChild = button.querySelector('.check'); 8675 if (!defaultChild) { 8676 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"> 8677 <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"/> 8678 <title>check</title></svg> 8679 `; 8680 } else { 8681 defaultChild.classList.add('hidden'); 8682 let addingChild = button.querySelector('.added'); 8683 if (addingChild) { 8684 addingChild.classList.remove('hidden'); 8685 } 8686 } 8687 8688 button.classList.remove('is-loading', 'text-[0]'); 8689 } 8690 8691 window.dispatchEvent(new CustomEvent('reload-customer-section-data')); 8692 } 8693 }) 8694 .catch(err => { 8695 window.dispatchEvent(new CustomEvent('product-addtocart-error')); 8696 8697 setMessage({ 8698 text:'There was a problem adding your item to the cart.', 8699 type: 'error' 8700 }); 8701 }) 8702 .finally(() => { 8703 try { 8704 var messages = hyva.getCookie('mage-messages'); 8705 messages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 8706 document.cookie = 'mage-messages=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'; 8707 8708 } catch (error) { 8709 console.warn('Error parsing Cookie Messages:', error); 8710 return; 8711 } 8712 8713 setTimeout(() => { 8714 button.disabled = false;
8715 button.classList.remove('bg-success-darker', 'hover:bg-success-darker'); 8716 button.classList.remove('text-[0]'); 8717 8718 let defaultChild = button.querySelector('.default'); 8719 if (!defaultChild) { 8720 button.innerHTML = button.getAttribute("aria-label"); 8721 } else { 8722 defaultChild.classList.remove('hidden'); 8723 let addingChild = button.querySelector('.added'); 8724 if (addingChild) { 8725 addingChild.classList.add('hidden'); 8726 } 8727 } 8728 8729 button.innerHTML = initialText; 8730 8731 window.dispatchEvent(new CustomEvent('product-addtocart-success', { 8732 detail: { 8733 product_id: product_id, 8734 form_data: Object.fromEntries(new FormData(form)) 8735 } 8736 })); 8737 8738 messages.forEach(message => { 8739 setMessage(message); 8740 }); 8741 }, delay); 8742 }); 8743 }; 8744 8745 window.setAjaxCart = (selectors = '.product_addtocart_form:not(.no-ajax), #product_addtocart_form:not(.no-ajax)') => { 8746 const addToCartForms = document.querySelectorAll(selectors); 8747 8748 addToCartForms.forEach(form => { 8749 form.removeEventListener('submit', addToCartAjaxEvent); 8750 form.addEventListener('submit', addToCartAjaxEvent); 8751 }); 8752 } 8753 8754 /** 8755 * Set Message 8756 */ 8757 function setMessage(message) { 8758 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 8759 [message], 5000 8760 ); 8761 } 8762 8763 /** Init on pageload */ 8764 window.setAjaxCart(); 8765</script>
8765 8766
8766<script> 8767 function initAlgoliaInsights(partial) { 8768 window.algoliaAnalytics = AlgoliaAnalytics.default; 8769 window.hasAddedParameters = false; 8770 window.useCookie = algoliaConfig.cookieConfiguration.cookieRestrictionModeEnabled ? !!hyva.getCookie(algoliaConfig.cookieConfiguration.consentCookieName) : true; 8771 8772 if (!canTrack()) { 8773 return; 8774 } 8775 8776 initializeAnalytics(partial); 8777 addSearchParameters(); 8778 bindEvents(); 8779 8780 // Although events can accept both auth and anon tokens, queries can only accept a single token 8781 function determineUserToken() { 8782 return window.algoliaAnalytics.getAuthenticatedUserToken() ?? algoliaAnalytics.getUserToken(); 8783 } 8784 8785 function initializeAnalytics(partial = false) { 8786 if (partial) { 8787 algoliaAnalytics.init({ 8788 appId: algoliaConfig.applicationId, 8789 apiKey: algoliaConfig.apiKey, 8790 partial: true, 8791 useCookie: true, 8792 cookieDuration: Number(algoliaConfig.cookieConfiguration.cookieDuration) 8793 }); 8794 } else { 8795 algoliaAnalytics.init({ 8796 appId: algoliaConfig.applicationId, 8797 apiKey: algoliaConfig.apiKey, 8798 useCookie: true, 8799 cookieDuration: Number(algoliaConfig.cookieConfiguration.cookieDuration) 8800 }); 8801 } 8802 let userAgent = 'insights-js-in-magento (' + algoliaConfig.extensionVersion + ')'; 8803 window.algoliaAnalytics.addAlgoliaAgent(userAgent); 8804 8805 let unsetAuthenticationToken = hyva.getCookie('unset_authentication_token'); 8806 if (hyva.getCookie('aa-search') && hyva.getCookie('aa-search') !== '') { 8807 window.algoliaAnalytics.setUserToken(hyva.getCookie('aa-search')); 8808 } else if (hyva.getCookie('_ALGOLIA') && hyva.getCookie('_ALGOLIA') !== '') { 8809 window.algoliaAnalytics.setUserToken(hyva.getCookie('_ALGOLIA')); 8810 } else if (unsetAuthenticationToken && unsetAuthenticationToken !== '') { 8811 window.algoliaAnalytics.setUserToken('undefined'); 8812 hyva.setCookie('unset_authentication_token', '', -1); 8813 } 8814 } 8815 8816 function applyInsightsToSearchParams(params = {}) { 8817 if (algoliaConfig.ccAnalytics.enabled) { 8818 params.clickAnalytics = true; 8819 } 8820 8821 if (algoliaConfig.personalization.enabled) { 8822 params.enablePersonalization = true; 8823 params.userToken = determineUserToken(); 8824 } 8825 8826 return params; 8827 } 8828 8829 function addSearchParameters() { 8830 if (window.hasAddedParameters) { 8831 return; 8832 } 8833 algolia.registerHook('beforeWidgetInitialization', function (allWidgetConfiguration) { 8834 allWidgetConfiguration.configure = applyInsightsToSearchParams( 8835 allWidgetConfiguration.configure 8836 ); 8837 return allWidgetConfiguration; 8838 }); 8839 8840 algolia.registerHook('afterAutocompleteProductSourceOptions', (options) => { 8841 return applyInsightsToSearchParams(options); 8842 }); 8843 8844 window.hasAddedParameters = true; 8845 } 8846 8847 8848 function bindEvents() { 8849 bindClickedEvents(); 8850 bindViewedEvents(); 8851 8852 algolia.triggerHooks('afterInsightsBindEvents', this); 8853 } 8854 8855 function bindClickedEvents() { 8856 // Filter Clicked 8857 if (algoliaConfig.personalization.filterClicked.enabled) { 8858 const facets = algoliaConfig.facets; 8859 let containers = []; 8860 for (let i = 0; i < facets.length; i++) { 8861 let elem = createISWidgetContainer(facets[i].attribute); 8862 containers.push('.' + elem.className); 8863 } 8864 8865 algolia.registerHook('afterInstantsearchStart', function (search) { 8866 const selectors = document.querySelectorAll(containers.join(', '));
8867 selectors.forEach(function (e) { 8868 e.addEventListener('click', function (event) { 8869 const attribute = this.dataset.attr; 8870 const elem = event.target; 8871 if (elem.type === "checkbox" && elem.checked) { 8872 var filter = attribute + ':' + elem.value; 8873 trackFilterClick([filter]); 8874 } 8875 }); 8876 }); 8877 8878 return search; 8879 }); 8880 } 8881 } 8882 8883 function bindViewedEvents() { 8884 // viewed event is exclusive to personalization 8885 if (!algoliaConfig.personalization.enabled) { 8886 return; 8887 } 8888 8889 const viewConfig = algoliaConfig.personalization.viewedEvents.viewProduct; 8890 if (viewConfig.enabled) { 8891 if (document.body.classList.contains('catalog-product-view')) { 8892 const objectId = document.querySelector('#product_addtocart_form')?.querySelector('input[name="product"]').value; 8893 if (objectId) { 8894 const viewData = buildEventData(viewConfig.eventName, objectId, algoliaConfig.indexName + '_products'); 8895 trackView(viewData); 8896 } 8897 } 8898 8899 } 8900 } 8901 8902 function buildEventData(eventName, objectId, indexName, position = null, queryId = null) { 8903 const eventData = { 8904 eventName: eventName, 8905 objectIDs: [objectId + ''], 8906 index: indexName 8907 }; 8908 8909 if (position) { 8910 eventData.positions = [parseInt(position)]; 8911 } 8912 8913 if (queryId) { 8914 eventData.queryID = queryId; 8915 } 8916 8917 return eventData; 8918 } 8919 8920 function trackClick(eventData) { 8921 if (eventData.queryID) { 8922 window.algoliaAnalytics.clickedObjectIDsAfterSearch(eventData); 8923 } else { 8924 window.algoliaAnalytics.clickedObjectIDs(eventData); 8925 } 8926 } 8927 8928 function trackFilterClick(filters) { 8929 const eventData = { 8930 index: algoliaConfig.indexName + '_products', 8931 eventName: algoliaConfig.personalization.filterClicked.eventName, 8932 filters: filters 8933 }; 8934 8935 window.algoliaAnalytics.clickedFilters(eventData); 8936 } 8937 8938 function trackView(eventData) { 8939 window.algoliaAnalytics.viewedObjectIDs(eventData); 8940 } 8941 } 8942 8943 function canTrack() { 8944 return ((algoliaConfig.ccAnalytics.enabled 8945 || algoliaConfig.personalization.enabled) && window.useCookie); 8946 } 8947 8948 function buildInsightsEventData(eventName, objectId, indexName, position = null, queryId = null) { 8949 if (!canTrack()) { 8950 return; 8951 } 8952 8953 const eventData = { 8954 eventName: eventName, 8955 objectIDs: [objectId + ''], 8956 index: indexName 8957 }; 8958 if (position) { 8959 eventData.positions = [parseInt(position)]; 8960 } 8961 if (queryId) { 8962 eventData.queryID = queryId; 8963 } 8964 trackClick(eventData); 8965 } 8966 8967 function trackClick(eventData) { 8968 if (eventData.queryID) { 8969 window.algoliaAnalytics.clickedObjectIDsAfterSearch(eventData); 8970 } else { 8971 window.algoliaAnalytics.clickedObjectIDs(eventData); 8972 } 8973 } 8974</script>
8974 8975
8975<script> 8976 window.algoliaConfig = {"instant":{"enabled":true,"selector":".columns","isAddToCartEnabled":true,"addToCartParams":{"action":"https:\/\/www.farma.it\/checkout\/cart\/add\/","formKey":"uky45cJBt3wJBuSu","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":200,"minimumCharacters":0},"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":"uky45cJBt3wJBuSu","redirectUrlParam":"uenc"},"isLookingSimilarEnabledInPDP":0,"isLookingSimilarEnabledInCartPage":0,"lookingSimilarTitle":"Prodotti simili"},"extensionVersion":"3.15.3","applicationId":"ZMUZFC3VV1","indexName":"magento2_default","apiKey":"MGRiMjI4ZTg0ODAzNjU4YzY5MTc3YTJhMjVjOGJjODc2NmNkYTFjOWE1NjlmOWIwODdlYjcwODcwNWM1Nzg1N3RhZ0ZpbHRlcnM9JnZhbGlkVW50aWw9MTc5MTYzMjA4MQ==","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\/blog\/home\/index\/"},"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"}}; 8977 8978 let autocompleteInitialized = false;
8979 let commonInitialized = false; 8980 let insightsInitialized = false; 8981 8982 async function initAutocomplete() { 8983 if (autocompleteInitialized) { 8984 return 8985 } 8986 8987 autocompleteInitialized = true; 8988 Promise.all([ 8989 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/common.js"), 8990 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/base64.js"), 8991 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-instantsearch.min.js"), 8992 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/search-insights.min.js"), 8993 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-search.min.js"), 8994 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-autocomplete.min.js"), 8995 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/query-suggestions-plugin.min.js"), 8996 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/autocomplete.js"), 8997 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/additional-section.js"), 8998 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/categories.js"), 8999 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/pages.js"), 9000 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/products.js"), 9001 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/autocomplete/suggestions.js"), 9002 ] 9003 ).then(data => { 9004 initCommon(); 9005 initAlgoliaInsights(); 9006 initAlgoliaAutocomplete(); 9007 }); 9008 } 9009 9010 function initInstantSearch() { 9011 Promise.all([ 9012 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/common.js"), 9013 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/base64.js"), 9014 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-instantsearch.min.js"), 9015 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/search-insights.min.js"), 9016 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/hogan.min.js"), 9017 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/mustache.min.js"), 9018 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/template-engine.js"), 9019 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/instantsearch.js"), 9020 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-search.min.js"), 9021 ] 9022 ).then(data => { 9023 initCommon(); 9024 initAlgoliaInsights(); 9025 initAlgoliaInstantSearch(); 9026 }); 9027 } 9028 9029 function initRecommended(objectIds) { 9030 Promise.all([ 9031 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/common.js"),
9032 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/internals/base64.js"), 9033 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/algolia-instantsearch.min.js"), 9034 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/search-insights.min.js"), 9035 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/recommend.min.js"), 9036 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Algolia_AlgoliaSearch/js/lib/recommend-js.min.js"), 9037 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/recommend.js"), 9038 blackbird.loadExternalResource("https://www.farma.it/static/version1789421831/frontend/DNAFactory/orlandi_hyva/it_IT/Blackbird_HyvaAlgoliaSearch/js/template/recommend/products.js"), 9039 ] 9040 ).then(data => { 9041 initCommon(); 9042 initBase64(); 9043 initAlgoliaInsights(); 9044 initAlgoliaRecommended('blog_home_index', objectIds); 9045 }); 9046 } 9047 9048 function initCommon() { 9049 if (commonInitialized) { 9050 return 9051 } 9052 9053 commonInitialized = true 9054 initAlgoliaCommon(); 9055 initBase64(); 9056 window.dispatchEvent(new CustomEvent('algolia-loaded')); 9057 } 9058 9059 if (algoliaConfig.instant.enabled && (algoliaConfig.isCategoryPage || algoliaConfig.isSearchPage)) { 9060 initInstantSearch(); 9061 } 9062 9063 9064 9065 9066 let objectIds = [""]; 9067 9068 if (algoliaConfig.autocomplete.enabled) { 9069 document.getElementById('menu-search-icon').addEventListener('click', async () => { 9070 await initAutocomplete(); 9071 },{once: true}); 9072 } 9073 9074 window.addEventListener('init-algolia-trends', function () { 9075 initCommon(); 9076 initAlgoliaInsights(); 9077 window.dispatchEvent(new CustomEvent('init-algolia-trends-done')); 9078 }); 9079 9080 window.addEventListener('init-algolia-LS', function () { 9081 initCommon(); 9082 initAlgoliaInsights(); 9083 window.dispatchEvent(new CustomEvent('init-algolia-LS-done')); 9084 }); 9085 9086 window.addEventListener('user-allowed-save-cookie', function () { 9087 initAlgoliaInsights(true); 9088 }); 9089 </script>
9089 9090 9091<style> 9092 .algolia-ac-product-row .badge-container .badge { 9093 max-height: fit-content; 9094 margin: auto 0; 9095 } 9096 9097 @media (max-width: 768px) { 9098 .catalogsearch-result-index { 9099 #algolia-left-container { 9100 width: calc(100vw - 15px); 9101 left: -15px; 9102 padding-left: 15px; 9103 } 9104 9105 #algolia-left-container .filters { 9106 width: calc(50% - 15px); 9107 margin-top: 30px; 9108 } 9109 9110 #algolia-toolbar { 9111 top: -76px; 9112 width: calc(50% - 15px); 9113 } 9114 9115 #algolia-toolbar .flex.right { 9116 flex-direction: column; 9117 align-items: flex-end; 9118 width: 100%; 9119 font-weight: bold; 9120 } 9121 9122 #algolia-toolbar .flex.left { 9123 position: absolute; 9124 width: calc(93vw - var(--scrollbar-width)); 9125 top: -5px; 9126 left: calc((0% - 100vw + var(--scrollbar-width)) / 2); 9127 right: auto; 9128 } 9129 9130 #algolia-toolbar #algolia-sorts { 9131 width: 100%; 9132 } 9133 9134 #algolia-toolbar .ais-SortBy-select { 9135 background-color: white; 9136 font-weight: bold; 9137 padding-top: 0.375rem; 9138 padding-bottom: 0.375rem; 9139 padding-left: 0.75rem; 9140 padding-right: 1rem; 9141 width: 100%; 9142 border: 2px solid #6328e0; 9143 } 9144 9145 .ais-Stats-text > div { 9146 font-size: 16px; 9147 display: block; 9148 } 9149 } 9150 } 9151 9152 input[type="search"]::-webkit-search-decoration, 9153 input[type="search"]::-webkit-search-cancel-button, 9154 input[type="search"]::-webkit-search-results-button, 9155 input[type="search"]::-webkit-search-results-decoration { 9156 -webkit-appearance:none!important; 9157 } 9158 9159 .ais-Hits-banner-image { 9160 margin: auto!important; 9161 margin-bottom: 20px!important; 9162 } 9163</style>
9164<script> 9165 function initWishlist() { 9166 return { 9167 addToWishlist(productId) { 9168 const formKey = hyva.getFormKey(); 9169 const postUrl = BASE_URL + 'wishlist/index/add/'; 9170 9171 const params = new URLSearchParams({ 9172 form_key: formKey, 9173 product: productId, 9174 uenc: hyva.getUenc() 9175 }); 9176 9177 const form = document.getElementById(`product_addtocart_form_${productId}`); 9178 if (form) { 9179 new FormData(form).forEach((value, key) => params.set(key, value)); 9180 } 9181 9182 fetch(postUrl, { 9183 "headers": { 9184 "content-type": "application/x-www-form-urlencoded; charset=UTF-8", 9185 }, 9186 "body": params.toString(), 9187 "method": "POST", 9188 "mode": "cors", 9189 "credentials": "include" 9190 }).then(function (response) { 9191 if (response.redirected) { 9192 window.location.href = response.url; 9193 } else if (response.ok) { 9194 return response.json(); 9195 } else { 9196 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 9197 [{ 9198 type: "warning", 9199 text: "Could\u0020not\u0020add\u0020item\u0020to\u0020wishlist." 9200 }], 5000 9201 ); 9202 } 9203 }).then(function (response) { 9204 if (!response) { return } 9205 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 9206 [{ 9207 type: (response.success) ? "success" : "error", 9208 text: (response.success) 9209 ? "Prodotto\u0020\u00E8\u0020stato\u0020aggiunto\u0020nella\u0020tua\u0020lista\u0020desideri." 9210 : response.error_message 9211 }], 5000 9212 ); 9213 const reloadCustomerDataEvent = new CustomEvent("reload-customer-section-data"); 9214 window.dispatchEvent(reloadCustomerDataEvent); 9215 }).catch(function (error) { 9216 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 9217 [{ 9218 type: "error", 9219 text: error 9220 }], 5000 9221 ); 9222 }); 9223 } 9224 } 9225 } 9226</script>
vendor: 1 bytes, line 9226
9226
9227<script> 9228 window.addEventListener('algolia-loaded', () => { 9229 algolia.registerHook('afterAutocompleteStart', () => { 9230 document.querySelector('#algoliaAutocomplete input')?.focus(); 9231 }); 9232 },{ once: true}) 9233</script>
9233 9234
9234<script> 9235 window.addEventListener('algolia-loaded', () => { 9236 algolia.registerHook('beforeWidgetInitialization', (allWidgetConfiguration) => { 9237 const {currentRefinements} = allWidgetConfiguration; 9238 const originalTransformItems = currentRefinements.transformItems.bind(currentRefinements); 9239 currentRefinements.transformItems = (items) => { 9240 if (items.length !== 0) { 9241 document.getElementById('instant-search-active-filters').classList.remove('hidden'); 9242 document.getElementById('instant-search-active-filters-label').classList.remove('hidden'); 9243 } else { 9244 document.getElementById('instant-search-active-filters').classList.add('hidden'); 9245 document.getElementById('instant-search-active-filters-label').classList.add('hidden'); 9246 } 9247 return originalTransformItems(items); 9248 } 9249 return allWidgetConfiguration; 9250 }); 9251 },{ once: true}) 9252 </script>
9252 9253<div x-cloak x-data="{...initAmBanners()}" x-init="initBanners()"> 9254 9255<div class="flex flex-row justify-center items-center w-full h-full fixed select-none z-50" 9256 style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgb(255 255 255/0.60);" 9257 x-show="isLoading" 9258 x-transition:enter="ease-out duration-200" 9259 x-transition:enter-start="opacity-0" 9260 x-transition:enter-end="opacity-100" 9261 x-transition:leave="ease-in duration-200" 9262 x-transition:leave-start="opacity-100" 9263 x-transition:leave-end="opacity-0"> 9264 <svg xmlns="http://www.w3.org/2000/svg" width="57" height="57" viewBox="0 0 38 38" stroke="#ffb590" class="text-primary" role="img"> 9265 <g fill="none" fill-rule="evenodd"> 9266 <g transform="translate(1 1)" stroke-width="2"> 9267 <circle stroke="#ff6801" cx="18" cy="18" r="18"/> 9268 <path d="M36 18c0-9.94-8.06-18-18-18"> 9269 <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite"/> 9270 </path> 9271 </g> 9272 </g> 9273<title>loader</title></svg> 9274</div> 9275</div>
9276<script> 9277 'use strict'; 9278 9279 function initAmBanners() { 9280 return { 9281 options: { 9282 sections: [], 9283 content: [], 9284 banners: [], 9285 injectorSectionId: null, 9286 injectorParams: {} 9287 }, 9288 isLoading: true, 9289 injectorResolver: {}, 9290 9291 initBanners: function () { 9292 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
9292<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}; 9293 this.injectorResolver = amBannerInjectorResolver?.(); 9294 9295 this.insertBanners(); 9296 this.isLoading = false; 9297 }, 9298 9299 insertBanners: function () { 9300 document.querySelectorAll('[data-role="amasty-banner-container"]').forEach((container) => { 9301 const sectionId = container.getAttribute('data-position'); 9302 9303 if (sectionId) { 9304 this.loadBannerBySection(sectionId, container); 9305 } else { 9306 this.loadBannerByBannerId(container); 9307 } 9308 }); 9309 }, 9310 9311 getBanners: function (bannerId) { 9312 if (this.options.banners.indexOf(bannerId) === -1) { 9313 return []; 9314 } 9315 const insertedBanner = this.banners.find((element) => { 9316 return element === bannerId; 9317 }); 9318 9319 return content[insertedBanner]; 9320 }, 9321 9322 getSectionBanners: function (section) { 9323 if (!(section in this.options.sections)) { 9324 return []; 9325 } 9326 9327 return this.options.sections[section].map((id) => { 9328 return this.options.content[id]; 9329 }); 9330 }, 9331 9332 loadBannerBySection: function (sectionId, container) {
9333 container.innerHTML = this.getSectionBanners(sectionId).join(''); 9334 this.injectorResolver?.resolve(sectionId, this.options.injectorParams); 9335 this.updateSection(`[data-role="amasty-banner-container"][data-position="${sectionId}"]`, container); 9336 }, 9337 9338 loadBannerByBannerId: function (container) { 9339 const bannerId = container.getAttribute('data-bannerid'); 9340 container.innerHTML = (this.getBanners(bannerId)); 9341 this.updateSection(`[data-role="amasty-banner-container"][data-bannerid="${bannerId}"]`, container); 9342 }, 9343 9344 updateSection: function(containerSelector, container) { 9345 hyva.replaceDomElement( 9346 containerSelector, 9347 container.innerHTML 9348 ); 9349 } 9350 } 9351 } 9352</script>
vendor: 1 bytes, line 9352
9352
9353<script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/www.farma.it\/","name":"Home"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/www.farma.it\/blog.html","name":"I nostri consigli"}}]}</script>
9353<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>
9353<script type="application/ld+json">{"sameAs":["https:\/\/www.facebook.com\/farmapuntoit","https:\/\/www.instagram.com\/farma.it\/"]}</script>
9353<script type="text/json" id="default-section-data"> 9354 {"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"}
9354,"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"}
9354,"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"}
9354,"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"}
9354,"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"}
9354,"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"}
9354,"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":1791545681},"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>
9354 9355 9356</div></body> 9357</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.