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