CINXE.COM

Special Occasions Coupons for Magento 2 - Birthday & Other Coupons

<!doctype html><html lang="en"><head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# product: http://ogp.me/ns/product#"> <meta charset="utf-8"/> <meta name="title" content="Special Occasions Coupons for Magento 2 - Birthday &amp; Other Coupons"/> <meta name="description" content="Motivate customers to buy more by sending coupons on special occasions like birthdays, registration, newsletter sign-up or other events."/> <meta name="robots" content="INDEX,FOLLOW"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="format-detection" content="telephone=no"/> <title>Special Occasions Coupons for Magento 2 - Birthday &amp; Other Coupons</title> <link rel="stylesheet" type="text/css" media="all" href="https://cdn.amasty.com/static/version1740558685/_cache/merged/ea0ed758deb0843f830f0e98146097db.min.css" /> <link rel="stylesheet" type="text/css" media="screen and (min-width: 320px)" href="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/css/styles.min.css" /> <link rel="stylesheet" type="text/css" media="screen and (min-width: 769px)" href="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/css/source/bundle-module/product-page/product-page-bundle-l.min.css" /> <link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/fonts/gilroy/bold/Gilroy-Bold.woff2" /> <link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/fonts/Blank-Theme-Icons/Blank-Theme-Icons.woff2" /> <link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/fonts/roboto/bold/Roboto-700.woff2" /> <link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/fonts/roboto/regular/Roboto-400.woff2" /> <link rel="icon" type="image/x-icon" href="https://cdn.amasty.com/media/favicon/stores/1/amasty_logo.png" /> <link rel="shortcut icon" type="image/x-icon" href="https://cdn.amasty.com/media/favicon/stores/1/amasty_logo.png" /> <!-- Start: SEO Health Checker --> <!--f7e98322c1f2996ae54a6b854c29c3a4--> <!-- End: SEO Health Checker --> <meta name="google-site-verification" content="mrsBMEhSCRX5SA9IdwUbGNSuWUUTTAHJ1r0K-cA0OZk" /> <!-- Some event from google tag manager call facebook pixel event. But facebook pixel init only on 'https://amasty.com/' If facebook pixel events called on stagings and local environment then errors fall into the console. Fix it. --> <script data-info="not-move-to-bottom"> (function initAmsiteAnalytics() { let initGTM = (w, d, s, l, i) => { w[l] = w[l] || []; w[l].push({'gtm.start': new Date().getTime(), event: 'gtm.js'}); let f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = `https://www.googletagmanager.com/gtm.js?id=${i}${dl}`; f.parentNode.insertBefore(j, f); }; let declareGlobalVariables = () => { window.dataLayer = window.dataLayer || []; window.gtag = function() { dataLayer.push(arguments) }; } let addGoogleAnalytics = () => { initAmsiteCookieConsent(); initGTM(window, document, 'script', 'dataLayer', 'GTM-N84742B'); } declareGlobalVariables(); window.addEventListener('init-external-scripts', () => { addGoogleAnalytics(); }); }())</script> <style> @media (min-width: 1260px) { .magezon-builder .mgz-container {width: 1260px;} } </style> <!-- Start VWO Async SmartCode --><!-- End VWO Async SmartCode --> <script data-info="not-move-to-bottom"> 'use strict'; const AmsiteUtils = function () { return { throttle(func, delay) { let lastCall = 0; return function() { let now = Date.now(); if (now - lastCall < delay) { return; } lastCall = now; return func.apply(this, arguments); } }, isCustomerLoggedIn(privateData) { return !!(privateData?.customer?.firstname); }, isMobile(breakpoint) { return window.matchMedia(breakpoint).matches; }, setAnimationToPopup(context) { const origHide = context.hide; context.hide = (...args) => { const overlay = context.$root.querySelector('.am-overlay-popup'); overlay.classList.add('-popup-closed'); origHide.call(context, args); setTimeout(() => { overlay.classList.remove('-popup-closed'); }, 400) } } } }</script> <meta property="og:type" content="product" /><meta property="og:title" content="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" /><meta property="og:image" content="https://cdn.amasty.com/media/catalog/product/cache/c69fad5054ac8a3eddb920f81914f823/s/p/special-occasion-coupons-for-magento-2_2x.png" /><meta property="og:description" content="Generate&#x20;and&#x20;send&#x20;discount&#x20;coupons&#x20;based&#x20;on&#x20;birthdays,&#x20;newsletter&#x20;subscriptions,&#x20;order&#x20;placement&#x20;and&#x20;other&#x20;events.&#x20;Use&#x20;custom&#x20;email&#x20;templates&#x20;to&#x20;draw&#x20;customers&#x2019;&#x20;attention&#x20;and&#x20;build&#x20;their&#x20;loyalty." /><meta property="og:url" content="https://amasty.com/special-occasion-coupons-for-magento-2.html" /> <meta property="product:price:amount" content="109"/> <meta property="product:price:currency" content="USD"/> <style>.ng0gx7w-s{padding:0!important}.bje13wx-s{background-color:#fff0fa !important}@media screen and (min-width:1024px){.amsite-top-promotion-main-banner br{display:none}} .amsite-top-promotion-main-banner{display:block;padding:22px 0}.pbuilder-top-promo-html-version > .mgz-element-inner > .inner-content{width:100%}.wmr46hs-s{padding-right:20px !important;padding-left:20px !important}.mgz-element.wmr46hs .image-content{width:100%;text-align:center}.mgz-element.wmr46hs .image-title{font-size:16px}.pw5ooqx-s{padding-right:20px !important;padding-left:20px !important}.mgz-element.pw5ooqx .image-content{width:100%;text-align:center}.mgz-element.pw5ooqx .image-title{font-size:16px}.nd5lplq-s{padding-right:20px !important;padding-left:20px !important}.mgz-element.nd5lplq .image-content{width:100%;text-align:center}.mgz-element.nd5lplq .image-title{font-size:16px}.tbo84a5-s{padding:25px 25px 0 24px!important;margin-top:0 !important;margin-bottom:0 !important}.jltch7m-s{padding-right:25px !important;padding-bottom:35px !important;padding-left:24px !important}@media (max-width:768px){.jltch7m-s{padding-bottom:15px !important}}.jdlrn1f-s{margin-right:0 !important;border-radius:10px!important;background-color:#f0f3ff !important}@media (max-width:768px){.jdlrn1f-s{margin-right:0 !important}}.rho8moi-s{margin-top:20px !important}.jdlrn1f{border:0 solid transparent}.jdlrn1f>.mgz-element-inner{padding:0;margin:0}.mgz-element.rho8moi >.mgz-element-inner>.inner-content{width:970px;max-width:100%;margin:0 auto}.rhtfvjx-s{padding-bottom:0 !important;margin-bottom:0 !important}.rrlty1f-s{padding-top:0 !important;margin-top:0 !important}.cnhyd41-s{padding-top:25px !important}.xv72136-s{padding-top:27px !important}@media (max-width:768px){.xv72136-s{padding-top:0 !important}}.cnhyd41>.mgz-element-inner{padding:0}.mgz-element.xv72136 >.mgz-element-inner>.inner-content{width:970px;max-width:100%;margin:0 auto}.ruo4vea-s{padding-bottom:5px !important;margin-bottom:0 !important}.sakv4t5-s{margin-bottom:0 !important}.n9ap7fb-s{padding-top:15px !important;margin-bottom:0 !important}.lu4et36-s{padding-top:0 !important}@media (max-width:768px){.lu4et36-s{padding-top:0 !important}}.u7xn0vc-s{padding-top:15px !important;margin-bottom:0 !important}.iga2j4y-s{padding-top:0 !important}@media (max-width:768px){.iga2j4y-s{padding-top:0 !important}}.xl5quqv-s{padding-top:15px !important;margin-bottom:0 !important}.nnte75k-s{padding-top:0 !important}@media (max-width:768px){.nnte75k-s{padding-top:0 !important}}.v5ucwgo-s{padding-top:0 !important;padding-right:25px !important;padding-left:0 !important;margin-top:0 !important}@media (max-width:768px){.v5ucwgo-s{padding-right:0 !important;padding-bottom:0 !important;margin-bottom:0 !important}}.fcadlra-s{margin-bottom:0 !important}@media (max-width:768px){.fcadlra-s{padding-top:0 !important}}.nkqyaup-s{padding-top:15px !important;margin-bottom:0 !important}.x26hf1t-s{padding-top:15px !important;margin-bottom:0 !important}.benumls-s{padding-top:0 !important;padding-left:25px !important;margin-top:0 !important}@media (max-width:768px){.benumls-s{padding:30px 0 0 0!important;margin-bottom:0 !important}}.tlkeeye-s{padding-top:0 !important;margin-top:0 !important}.jeq33w0-s{padding-top:0 !important;margin-top:0 !important}.c2au69w-s{padding-top:30px !important}@media (max-width:768px){.c2au69w-s{padding-top:0 !important}}@media (max-width:575px){.c2au69w-s{padding-top:0 !important}}.jeq33w0>.mgz-element-inner{padding:0}.mgz-element.c2au69w >.mgz-element-inner>.inner-content{width:970px;max-width:100%;margin:0 auto}.n4c4rea-s{padding-bottom:0 !important;margin-bottom:-10px !important}@media (max-width:768px){.n4c4rea-s{padding-bottom:0 !important;margin-bottom:-25px !important}}@media (max-width:575px){.n4c4rea-s{padding-bottom:0 !important;margin-bottom:-25px !important}}.wa8lvuq-s{padding-bottom:0 !important;margin-bottom:0 !important}@media (max-width:575px){.wa8lvuq-s{text-align:left}}.mieo182-s{padding-top:0 !important;padding-bottom:0 !important;margin-top:0 !important;margin-bottom:10px !important}.iiw1apj-s{padding-top:0 !important;padding-bottom:0 !important;margin-top:0 !important;margin-bottom:10px !important}.uk0s2a8-s{padding-bottom:0 !important;margin-bottom:0 !important}@media (max-width:575px){.uk0s2a8-s{text-align:left}}.ak0i2nq-s{padding-top:0 !important;padding-bottom:0 !important;margin-top:0 !important;margin-bottom:10px !important}.oivb6us-s{padding-bottom:0 !important;margin-bottom:0 !important}@media (max-width:575px){.oivb6us-s{text-align:left}}.rdwexkw-s{padding-top:0 !important;padding-bottom:0 !important;margin-top:0 !important;margin-bottom:10px !important}.ukhpike-s{margin-right:25px !important}@media (max-width:768px){.ukhpike-s{margin-top:15px !important}}.mgz-element.ss97u1k .image-content{width:100%;text-align:center}.mgz-element.ss97u1k .image-title{font-size:16px}.kdmqk48-s{margin-top:15px !important;margin-left:25px !important}@media (max-width:768px){.kdmqk48-s{margin-left:0 !important}}.mdg3fnd-s{padding-top:0 !important;margin-top:0 !important}.ukhpike>.mgz-element-inner,.kdmqk48>.mgz-element-inner{padding:0}.mgz-element.mdg3fnd >.mgz-element-inner>.inner-content{width:970px;max-width:100%;margin:0 auto}.c7ee6ic-s{margin-top:40px !important}@media (max-width:768px){.c7ee6ic-s{margin-top:50px !important}}@media (max-width:575px){.c7ee6ic-s{margin-top:50px !important}}.guvers8-s{padding-bottom:0 !important;margin-bottom:0 !important}.rxp5iux-s{padding-top:25px !important}.cilojua-s{padding-top:20px !important;padding-bottom:15px !important}@media (max-width:768px){.cilojua-s{padding-top:0 !important}}.rxp5iux>.mgz-element-inner{padding:0}.mgz-element.cilojua >.mgz-element-inner>.inner-content{width:970px;max-width:100%;margin:0 auto}.ssidp6s-s{text-align:center;padding-top:25px !important;padding-bottom:0 !important;margin-bottom:-5px !important}@media (max-width:768px){.ssidp6s-s{text-align:center}}@media (max-width:575px){.ssidp6s-s{text-align:center}}.mgz-element.ssidp6s .image-content{width:100%;text-align:center}.mgz-element.ssidp6s .image-title{font-size:16px}.kbr4tf0-s{padding:0 25px 0 24px!important;margin-top:0 !important;margin-bottom:0 !important}.q2h3cru-s{padding-right:25px !important;padding-bottom:35px !important;padding-left:24px !important}@media (max-width:768px){.q2h3cru-s{padding-bottom:15px !important}}.w7ej59g-s{margin-right:10px !important;border-radius:10px!important;background-color:#f0f3ff !important}@media (max-width:575px){.w7ej59g-s{padding-left:0 !important;margin-right:0 !important;margin-left:0 !important}}.vgek7ll-s{text-align:center;padding-top:25px !important;padding-bottom:0 !important;margin-bottom:-5px !important}@media (max-width:768px){.vgek7ll-s{text-align:center}}@media (max-width:575px){.vgek7ll-s{text-align:center}}.mgz-element.vgek7ll .image-content{width:100%;text-align:center}.mgz-element.vgek7ll .image-title{font-size:16px}.brkch2j-s{padding:0 25px 0 24px!important;margin-top:0 !important;margin-bottom:0 !important}.d9w664j-s{padding-right:25px !important;padding-bottom:35px !important;padding-left:24px !important}@media (max-width:768px){.d9w664j-s{padding-bottom:15px !important}}.f99qg6q-s{margin-right:10px !important;border-radius:10px!important;background-color:#f0f3ff !important}@media (max-width:768px){.f99qg6q-s{padding-right:0 !important;padding-left:0 !important;margin-top:20px !important;margin-right:0 !important;margin-left:0 !important}}@media (max-width:575px){.f99qg6q-s{padding-right:0 !important;padding-left:0 !important;margin-right:0 !important;margin-left:0 !important}}.y5km6vn-s{margin-bottom:60px !important}@media (max-width:768px){.y5km6vn-s{text-align:center;margin-top:40px !important}}.w7ej59g,.f99qg6q{border:0 solid transparent}.w7ej59g>.mgz-element-inner,.f99qg6q>.mgz-element-inner{padding:0;margin:0}.mgz-element.y5km6vn >.mgz-element-inner>.inner-content{width:970px;max-width:100%;margin:0 auto}</style></head><body data-container="body" data-mage-init='{"loaderAjax": {}, "loader": { "icon": "https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/images/loader-2.gif"}}' id="html-body" ontouchstart="() => {}" class="amasty-jet-theme page-product-configurable amasty-mega-menu catalog-product-view product-special-occasion-coupons-for-magento-2 am-tabs-view am-tabs-allow-default-edit page-layout-1column"> <div id="cookie-status" style="position: absolute; display: none;">The store will not work correctly in the case when cookies are disabled.</div> <noscript><div class="message global noscript"><div class="content"><p><strong>JavaScript seems to be disabled in your browser.</strong> <span> For the best experience on our site, be sure to turn on Javascript in your browser.</span></p></div></div></noscript> <!-- Google Tag Manager (noscript) --><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N84742B" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><!-- End Google Tag Manager (noscript) --> <!-- Matomo Tag Manager --><script data-info="not-move-to-bottom"> (function initMatomoAnalytics() { const _mtm = window._mtm = window._mtm || []; _mtm.push({'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'}); let initMatomo = () => { const d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src='https://cdn.matomo.cloud/amasty.matomo.cloud/container_oFfxxYMe.js'; s.parentNode.insertBefore(g,s); setTimeout(() => window.dispatchEvent(new CustomEvent("matomo-has-loaded")), 1000); }; window.addEventListener('init-external-scripts', () => { initMatomo(); }); }())</script><!-- End Matomo Tag Manager --> <div class="page-wrapper"> <style>.cmsb82-block { display: block }</style> <div class="magezon-builder magezon-builder-preload"><div class="bje13wx mgz-element mgz-element-row pbuilder-top-promo-html-version full_width_row"><div class="mgz-element-inner bje13wx-s"><div data-background-type="image" data-parallax-image-background-position="center top" class="mgz-parallax bje13wx-p"><div class="lazy-bg mgz-parallax-inner"></div></div><div class="inner-content mgz-container"><div class="ng0gx7w mgz-element mgz-element-column mgz-col-xs-12"><div class="mgz-element-inner ng0gx7w-s"><div class="bawcb2q mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner bawcb2q-s"><p style="text-align: center;"><a class="amsite-top-promotion-main-banner" title="Go to Special Offers page" href="/amasty-promo.html" data-promo-id="banner_product_pages" data-promo-name="Banner at product pages" data-promo-creative="so_feb25_product_pages"><span style="color: #012644;">Heart to cart ❤️ Enjoy exceptional <strong>Valentine’s Day gifts!</strong> →</span></a></p></div></div></div></div></div></div></div></div><header id="ammenu-header-container" class="ammenu-header-container page-header group"> <div id="header" class="relative max-lg:mb-6 z-30 w-full shadow-md bg-container-white lg:shadow-real-none" x-data="initHeader()" @private-content-loaded.window="getData(event.detail.data)" ><div class="flex flex-wrap lg:flex-nowrap lg:gap-12 2xl:gap-24 max-lg:max-h-[70px] max-w-[1920px] items-center justify-between w-full px-7 py-4 lg:pb-3 lg:pt-9 2xl:px-20 lg:px-7 md:px-5 max-xs:px-6 mx-auto"><!-- Mega menu toggle --> <!-- ko scope: 'index = ammenu_hamburger_toggle' --><!-- ko if: $data.source.isMobile() || false --><span data-ammenu-js="menu-toggle" class="ammenu-menu-toggle -hamburger" title="Toggling menu" aria-controls="ammenu-sidebar" aria-haspopup="menu" data-bind=" style: { color: color_settings.hamburger_icon_color }, event: { click: toggling }, attr: { 'aria-expanded': isOpen().toString(), 'aria-hidden': $data.source.isMobile() ? 'true' : 'false' }, css: { '-active': isOpen() }"><span class="ammenu-icon"></span> <span class="ammenu-icon"></span> <span class="ammenu-icon"></span></span> <!-- /ko --><!-- /ko --> <!--Logo--> <a class="logo flex max-w-[130px] max-xs:max-w-[119px] lg:max-w-fit lg:w-[inherit]" href="https://amasty.com/" title="" aria-label="store logo"><img src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/images/logo.svg" title="" alt="" class="lazy logo-image" width="158" height="40" /></a> <!--Logo--> <!-- Search wrapper --> <div class="main-form-wrapper lg:mt-0 hidden" :class="{ '-active': showOverlay, 'container': !config.isFullScreenMode, 'lg:!block relative w-full order-1 lg:order-[inherit] z-20 mt-4': true, 'max-w-none px-0': isHyvaUiHeader() && isFullWidthSearch, 'px-0': isHyvaUiHeader() && isHorizontalView }" x-data="Object.assign( {amXsearchCarouselComponent}, amXsearchProductsComponent(), amXsearchAutocompleteComponent(), amXsearchAutocompleteHyvaUIHeaderCompat(), )" x-cloak x-init="dynamicLayout($el)"><div x-show="showOverlay" class="max-lg:hidden am-overlay-popup z-20" @click.prevent="closeSearch()" @keydown.window.escape="closeSearch()"></div><div class="form mini-search z-20 relative -mx-[30px] lg:mx-0" :class="{ 'right-0': !isHyvaUiHeader(), 'md:flex md:justify-center': checkHyvaUiHeaderVariant('c') && !isDefaultSearchInput && !isFullWidthSearch }" ><form id="search_mini_form" @submit.prevent="redirect()" action="https://amasty.com/catalogsearch/result/?q=" :class="{ 'w-full absolute right-0': checkHyvaUiHeaderVariant('a') && !isDefaultSearchInput && !isFullWidthSearch, 'justify-end': !checkHyvaUiHeaderVariant('c') }" class="flex" method="GET"><label class="hidden" for="search" data-role="mini-search-label"><span>Search</span></label> <div class="w-full flex align-center justify-center" :style="`max-width: ${!isDefaultSearchInput && !isFullWidthSearch ? searchPopupWidth + 'px' : '100%'}`"><button class="btn-icon absolute z-[21] top-4 left-6 inline-block no-underline hover:text-black lg:right-5 lg:top-2" type="submit" :class="showOverlay || isLoading ? 'lg:right-auto lg:left-4' : 'lg:left-auto'" :disabled="!isProductsShown" aria-label="Open&#x20;search&#x20;page" x-ref="openSearchPageResult" ><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" class="p-1" aria-hidden="true"> <g id="heroicons-outline/magnifying-glass"> <path id="Vector" d="M21 21L15.8033 15.8033M15.8033 15.8033C17.1605 14.4461 18 12.5711 18 10.5C18 6.35786 14.6421 3 10.5 3C6.35786 3 3 6.35786 3 10.5C3 14.6421 6.35786 18 10.5 18C12.5711 18 14.4461 17.1605 15.8033 15.8033Z" stroke="#0F172A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </g> </svg> </button> <input id="search" x-ref="searchInput" maxlength="128" form="search_mini_form" type="search" name="q" autocomplete="off" placeholder="What&#x20;are&#x20;you&#x20;looking&#x20;for&#x3F;" class="!py-4 !px-16 transition appearance-none relative z-20 !h-auto focus:outline-none focus:!border-primary !placeholder-gray-600 focus:!placeholder-transparent lg:!h-10 lg:!px-5 lg:!py-[10px] lg:!rounded-3xl transition-[all]" :class="{ 'lg:!pl-12 lg:!pr-16 lg:!rounded-bl-none lg:!rounded-br-none lg:!bg-container': showOverlay, 'lg:!bg-container-lighter': !showOverlay, 'rounded-tl': isHyvaUiHeader(), 'rounded-tr': !'' && isHyvaUiHeader() }" :style="`width: ${checkHyvaUiHeaderVariant('c') && !isDefaultSearchInput && !isFullWidthSearch ? searchPopupWidth + 'px' : '100%'}`" @focus="doSearch()" @search="checkSearchInput()" @input.debounce.500="doSearch()" x-intersect:enter.once="applyHyvaUiHeaderConfig()" @keydown.arrow-down.prevent="focusElement($el.querySelector('[tabindex]'))"/><button type="button" x-show="showOverlay && !isLoading" class="am-close-popup z-[21] top-4 right-6 lg:top-2 text-secondary hover:text-primary" aria-label="Close&#x20;search" x-on:click="closeSearch(); $refs.searchInput.value = ''" ><svg xmlns="http://www.w3.org/2000/svg" stroke="currentColor" viewBox="0 0 24 24" class="stroke-[1.5]" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </button> <div x-show="isLoading" class="absolute z-[21] top-4 right-6 lg:top-2"><img alt="" src="data:image/gif;base64,R0lGODlhEAALAPQAAP///wAAANra2tDQ0Orq6gYGBgAAAC4uLoKCgmBgYLq6uiIiIkpKSoqKimRkZL6+viYmJgQEBE5OTubm5tjY2PT09Dg4ONzc3PLy8ra2tqCgoMrKyu7u7gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA" /></div></div></form><template x-if="searchInitialized"><div class="w-full top-15 bg-white max-h-[90vh] h-screen lg:h-auto lg:rounded-b-3xl overflow-auto text-sm amsearch-container lg:border lg:border-primary lg:border-t-0" :class="{ 'absolute': !config.isFullScreenMode || isHyvaUiHeader(), 'rounded-br rounded-bl': isHyvaUiHeader(), 'right-0': !checkHyvaUiHeaderVariant('c'), 'top-12': checkHyvaUiHeaderVariant('c') && !isHorizontalView, 'top-14': checkHyvaUiHeaderVariant('a') && isHorizontalView }" tabindex="-1" x-cloak :style="`${!isDefaultSearchInput && !isFullWidthSearch ? 'max-width:' + searchPopupWidth + 'px' : ''}; ${!isHorizontalView && checkHyvaUiHeaderVariant('a') ? 'top: 44px; margin-top: 1px;' : ''}`" x-show="!isLoading && showOverlay"><div class="flex w-full content-start flex-wrap box-border relative" :class="{ 'flex-col': isHorizontalView, 'flex-col md:flex-row': !isHorizontalView, }"><div class="md:flex w-full md:border-r px-6 py-5 md:px-7 md:py-6 am-search-sidebar" :class="{ 'border-gray-600 md:hidden': showSideBar(), 'hidden': latestQuery.length < minSearchLength && ( !showOnFirstClick('recentSearches') && !showOnFirstClick('popularSearches') && !showOnFirstClick('browsingHistory') ) || isSidebarSectionsDisabled(), 'am-search-horizontal-view': isHorizontalView, }" x-show="!noResultsFound" > <template x-if=" sections?.blog?.items?.length"><div class="md:w-full" x-show="showHandler('blog')" x-cloak> <div class="w-full mb-6 am-search-item-list"><h3 class="text-lg font-bold mb-2 px-4" x-text="sections.blog.title"></h3><div><template x-for="(item, index) in sections.blog.items" :key="index"><div><a class="w-full block hover:bg-gray-100 py-2 px-4" :href="window.BASE_URL + item.url"><span x-html="item.title" class="font-semibold"></span></a> <span class="text-black block mt-1 px-4 block" x-html="item.description"></span></div></template></div></div></div></template> <template x-if=" sections?.faq?.items?.length"><div class="md:w-full" x-show="showHandler('faq')" x-cloak> <div class="w-full mb-6 am-search-item-list"><h3 class="text-lg font-bold mb-2 px-4" x-text="sections.faq.title"></h3><template x-for="(item, index) in sections.faq.items" :key="index"><a class="w-full block hover:bg-gray-100 py-2 px-4" :href="window.BASE_URL + item.url" x-html="item.name"></a></template></div></div></template> <template x-if=" sections?.brand?.items?.length"><div class="md:w-full" x-show="showHandler('brand')" x-cloak> <div class="w-full mb-6 am-search-item-list"><h3 class="text-lg font-bold mb-2 px-4" x-text="sections.brand.title"></h3><template x-for="(item, index) in sections.brand.items" :key="index"><a class="w-full block hover:bg-gray-100 py-2 px-4" :href="`${BASE_URL + item.url}`" x-html="item.name"></a></template></div></div></template> <template x-if=" sections?.landingPage?.items?.length"><div class="md:w-full" x-show="showHandler('landingPage')" x-cloak> <div class="w-full mb-6 am-search-item-list"><h3 class="text-lg font-bold mb-2 px-4" x-text="sections.landingPage.title"></h3><template x-for="(item, index) in sections.landingPage.items" :key="index"><a class="w-full block hover:bg-gray-100 py-2 px-4" :href="window.BASE_URL + item.url" x-html="item.title"></a></template></div></div></template> <template x-if="isHorizontalView &amp;&amp; !noResultsFound &amp;&amp; sections?.products?.items?.length"><div class="md:w-full" x-show="showHandler('products')" x-cloak> <div class="w-full pb-20 md:pb-0 md:pt-5 md:px-7 lg:px-5"><div class="relative flex flex-wrap w-full group" :class="{'without-see-more': sections.products.items?.length === 1}" ><template x-for="(product, index) in (sections.products.items || [])" :key="index"> <div class="flex w-full mb-5 pb-5 border-b group-[.without-see-more]:border-0 group-[.without-see-more]:mb-0 group-[.without-see-more]:pb-0"><div class="hidden md:!block md:pr-5"><a :href="getProductUrl(product)" class="flex justify-center align-center w-[111px] h-[111px] p-3 bg-indigo-100 rounded leading-4" x-ref="amLabelParent" ><img class="lazy hover:shadow-sm object-contain min-w-52" :src="getProductImageUrl(product)" :alt="product.small_image.label" x-ref="amLabelImgParent" width="111" height="111" /> <template x-if="product.product_label?.length > 0"><div class="flex absolute flex-col" style="gap:7px" x-ref="amLabelWrapper"><template x-for="label in product.product_label"><div :class="`amlabel-position-wrapper relative max-w-full h-fit-content w-fit-content flex gap-amlabel-margin z-20${elementStyle}${amLabelStyle}`" :style="`order: ${label.priority}`" x-data="{...initAmlabel_67bf234ad57d5(), parentContainerProcessor: initParentContainerProcessor(), labelItemProcessor: initLabelItemProcessor()}" x-init="initLabel($el)" x-intersect.once="render()" x-ref="amLabelElement" :data-position="label.frontend_settings.position" :data-size="label.frontend_settings.image_size" :data-wrapper-class="`amlabel-position-${label.frontend_settings.position}-${product.id}-cat`" ><div x-ref="amLabel" x-cloak x-show="initialized" x-transition:enter="transition ease-out duration-250" x-transition:enter-start="opacity-0 transform scale-90" x-transition:enter-end="opacity-100 transform scale-100" @click.prevent="labelRedirect(label.frontend_settings.redirect_url)" :class="`group relative amasty-label-container amasty-label-for-${product.id} amasty-label-container-${label.label_id}-${product.id}-cat`" :style="label.frontend_settings.style" :data-amlabel-order="label.priority" :aria-describedby="'label-tooltip-' + label.label_id"><template x-if="label.tooltip.content?.length > 0"><div :id="'label-tooltip-' + label.label_id" x-ref="tooltip" class="absolute -top-full invisible opacity-0 transition-opacity -translate-x-1/2 text-center rounded z-[-1] w-max max-w-[200px] mb-3 group-hover:z-30 shadow-md px-5 py-2 group-hover:visible group-hover:opacity-100 after:absolute after:border-color-inherit after:top-[calc(100%-theme(space.1))] after:left-1/2 after:-translate-x-1/2 after:border-4 after:rotate-45" :style="`background-color: ${label.tooltip.background_color}; border-color: ${label.tooltip.background_color}`" role="tooltip"><span :style="`color: ${label.tooltip.color}`" x-html="label.tooltip.content"></span></div></template><template x-if="label.frontend_settings.label_text"><div class="amlabel-text text-center whitespace-nowrap" :class="{'absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2': label.frontend_settings.image}" x-text="label.frontend_settings.label_text" :style="label.frontend_settings.style"></div></template><template x-if="label.frontend_settings.image"><img :id="`amasty-label-image-${label.label_id}-${product.id}-cat`" class="lazy amasty-label-image opacity-100 align-top h-full" :src="getImgLabelPath(label.frontend_settings.image)" :title="label.frontend_settings.alt_tag" :width="getImageSize()" :alt="label.frontend_settings.alt_tag" /></template></div></div></template></div></template> </a> <template x-if="config.isProductReviewsBlockEnabled"> <template x-if="product.rating_summary !== 0"><div class="mt-1"><div class="flex flex-col"><div class="flex gap-x-2 items-center"><span class="am-text-small font-bold" x-text="product.ratingData.averageRating"></span> <div class="flex"><template x-for="starFilled in product.ratingData.starsFilled"><svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-4 h-4" viewBox="3 0 20 20" :style="`color: ${product.ratingData.yellowHex}`" fill="currentColor"><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></template><template x-if="product.ratingData.starFragment > 0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="3 0 20 20" fill="currentColor" class="w-4 h-4"><defs><linearGradient :id="'partialFill' + product.id"><stop offset="0%" :stop-color="product.ratingData.yellowHex"/><stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.yellowHex"/><stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.greyHex"/><stop offset="100%" :stop-color="product.ratingData.greyHex"/></linearGradient></defs><g :fill="'url(#partialFill' + product.id + ')'"><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"/></g></svg></template><template x-for="starEmpty in product.ratingData.starsEmpty"><svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-4 h-4" :style="`color: ${product.ratingData.greyHex}`" viewBox="3 0 20 20" fill="currentColor"><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></template></div></div><template x-if="product.rating_summary > 0"><a :href="`${getProductUrl(product)}#reviews`" class="am-text-small"><span class="text-sm" x-html="product.reviews_count"></span> reviews</a></template></div></div></template></template></div><div class="product-info flex flex-col grow"><div class="relative items-center justify-center text-primary text-lg pb-2"><a class="link-as-text font-bold amsearch-product-name block text-lg leading-6" x-html="product.name" :href="getProductUrl(product)" :class="{'pr-12': product.hyva_compatible}" ></a> <img x-show="product.hyva_compatible" class="lazy amsite-ignore-lazy-load absolute right-0 -top-5" src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva&#x20;compatibility"></div><div class="am-text-small" x-html="truncateWithDots(product.short_description.html, config.shortDescriptionLength)" ></div><div class="pt-2 flex items-center gap-3"><!-- ordinary m2 product --><template x-if="config.isProductAddToCartBlockEnabled && product.is_salable && !isService(product) && !isCalcurates(product)"><a :href="getProductUrl(product)" class="btn btn-primary !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" ><span x-show="isM1(product)" class="type">M1</span> <span x-show="!isM1(product)" class="type">M2</span> <span class="price-wrapper text-white"><span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value,false, {maximumFractionDigits: 0})"></span></span></a></template><!-- when m2 product has m1 product --><template x-if="product.opposite_product_data && product.opposite_product_data.is_salable && !isService(product)"><a :href="getProductUrl(product.opposite_product_data)" class="btn btn-primary !px-4 !py-2 !bg-transparent hover:!bg-orange-50 text-primary hover:!text-primary border border-orange-500 leading-4 tracking-basePx min-w-[92px]" ><span x-show="isM1(product.opposite_product_data)" class="type">M1</span> <span x-show="!isM1(product.opposite_product_data)" class="type">M2</span> <span class="price-wrapper text-primary"><span class="price" x-html="hyva.formatPrice(product.opposite_product_data.price_range.minimum_price.final_price.value, false, {maximumFractionDigits: 0})"></span></span></a></template><!-- service without price --><template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable_service && isService(product)"><a :href="getProductUrl(product)" class="btn btn-primary !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" >See details</a></template><!-- service with price --><template x-if="config.isProductAddToCartBlockEnabled && isService(product) && product.is_salable_service"><a :href="getProductUrl(product)" class="btn btn-primary !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" ><span class="price-wrapper text-white"><span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value,false, {maximumFractionDigits: 0})"></span></span></a></template><!-- calcurates and Saas --><template x-if="config.isProductAddToCartBlockEnabled && product.is_salable && (isCalcurates(product) || isSaas(product))"><a :href="getProductUrl(product)" class="btn btn-primary flex gap-2 !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" >From <span class="price-wrapper text-white flex"><span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value,false, {maximumFractionDigits: 0})"></span>/Month</span></a></template><!-- revising demand --><template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable && (isRevisingDemand(product) || isRequestQuote(product))"><a :href="getProductUrl(product)" class="btn btn-primary flex gap-2 !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" ><span class="price-wrapper text-white flex"><span class="amsite-stock-status" x-html="product.custom_stock_status"></span></span></a></template><template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable && (!isRevisingDemand(product) && !isRequestQuote(product))"><div class="w-auto justify-center text-sm text-left"><span class="inline-block w-3 h-3 bg-red-500 rounded-full flex-shrink-0"></span> <span class="text-sm text-gray-700 text-left">Out of stock</span></div></template></div></div></div></template></div><div class="pb-6 text-center"><div class="am-search-view-all" x-show="getResultProductsCount() >= 1"><a :href="resultPageUrl + latestQuery" class="link-as-text am-text-small uppercase font-bold">More results <span x-show="getResultProductsCount() > 0">(<span x-text="sections.products.total_count"></span>)</span></a></div></div></div></div></template> <template x-if=" sections?.page?.items?.length"><div class="md:w-full" x-show="showHandler('page')" x-cloak> <div class="w-full mb-6 am-search-item-list"><h3 class="text-lg font-bold mb-2 px-4" x-text="sections.page.title"></h3><template x-for="(item, index) in sections.page.items" :key="index"><div><a class="w-full block hover:bg-gray-100 py-2 px-4" :href="`${BASE_URL + item.url}`"><span x-html="item.title" class="font-semibold"></span></a> <span class="text-black block mt-1 px-4 block" x-html="item.description"></span></div></template></div></div></template> <template x-if=" sections?.recentSearches?.items?.length"><div class="md:w-full" x-show="showHandler('recentSearches')" x-cloak> <div class="w-full mb-4 am-search-item-list"><span class="block am-text-caption font-bold uppercase mb-2" x-text="sections.recentSearches.title"></span> <div><template x-for="(searchItem, index) in sections.recentSearches.items" :key="index"><a class="block mb-2 last:mb-0 text-secondary hover:text-primary am-text-small" :href="resultPageUrl + searchItem.name.toLowerCase().replace(/<[^>]*>?/gm, '')" x-html="searchItem.name"></a></template></div></div></div></template> <template x-if=" sections?.category?.items?.length"><div class="md:w-full" x-show="showHandler('category')" x-cloak> <div class="w-full mb-6 am-search-item-list"><h3 class="text-lg font-bold mb-2 px-4" x-text="sections.category.title"></h3><template x-for="(item, index) in sections.category.items" :key="index"><div><a class="w-full block hover:bg-gray-100 py-2 px-4" :href="window.BASE_URL + item.url"><span x-html="item.name" class="font-semibold"></span></a> <span class="text-black block mt-1 px-4 block" x-html="item.description" x-show="item.description"></span></div></template></div></div></template> <template x-if=" sections?.popularSearches?.items?.length"><div class="md:w-full" x-show="showHandler('popularSearches')" x-cloak> <div class="w-full mb-4 am-search-item-list"><span class="block am-text-caption font-bold uppercase mb-2" x-text="sections.popularSearches.title"></span> <div><template x-for="(searchItem, index) in sections.popularSearches.items" :key="index"><a class="block mb-2 last:mb-0 text-secondary hover:text-primary am-text-small" :href="resultPageUrl + searchItem.name.toLowerCase().replace(/<[^>]*>?/gm, '')" x-html="searchItem.name"></a></template></div></div></div></template> <template x-if=" sections?.browsingHistory?.items?.length"><div class="md:w-full" x-show="showHandler('browsingHistory')" x-cloak> <div class="w-full mb-4 am-search-item-list"><span class="block am-text-caption font-bold uppercase mb-2" x-text="sections.browsingHistory.title"></span> <div><template x-for="(searchItem, index) in sections.browsingHistory.items" :key="index"><a class="block mb-2 last:mb-0 text-secondary hover:text-primary am-text-small" :href="resultPageUrl + searchItem.name.toLowerCase().replace(/<[^>]*>?/gm, '')" x-html="searchItem.name"></a></template></div></div></div></template></div><div class="relative" :class="{ 'am-search-content': latestQuery.length >= minSearchLength || ( showOnFirstClick('recentSearches') || showOnFirstClick('popularSearches') || showOnFirstClick('browsingHistory') ), 'w-full': latestQuery.length < minSearchLength && ( !showOnFirstClick('recentSearches') && !showOnFirstClick('popularSearches') && !showOnFirstClick('browsingHistory') ), 'am-search-horizontal-view': isHorizontalView, 'am-search-sidebar-disabled': isSidebarSectionsDisabled(), }"><div class="flex flex-nowrap flex-col" x-show="latestQuery.length < minSearchLength" x-cloak> </div><template x-if="!noResultsFound && !isHorizontalView && latestQuery.length >= minSearchLength"> <div class="w-full pb-20 md:pb-0 md:pt-5 md:px-7 lg:px-5"><div class="relative flex flex-wrap w-full group" :class="{'without-see-more': sections.products.items?.length === 1}" ><template x-for="(product, index) in (sections.products.items || [])" :key="index"> <div class="flex w-full mb-5 pb-5 border-b group-[.without-see-more]:border-0 group-[.without-see-more]:mb-0 group-[.without-see-more]:pb-0"><div class="hidden md:!block md:pr-5"><a :href="getProductUrl(product)" class="flex justify-center align-center w-[111px] h-[111px] p-3 bg-indigo-100 rounded leading-4" x-ref="amLabelParent" ><img class="lazy hover:shadow-sm object-contain min-w-52" :src="getProductImageUrl(product)" :alt="product.small_image.label" x-ref="amLabelImgParent" width="111" height="111" /> <template x-if="product.product_label?.length > 0"><div class="flex absolute flex-col" style="gap:7px" x-ref="amLabelWrapper"><template x-for="label in product.product_label"><div :class="`amlabel-position-wrapper relative max-w-full h-fit-content w-fit-content flex gap-amlabel-margin z-20${elementStyle}${amLabelStyle}`" :style="`order: ${label.priority}`" x-data="{...initAmlabel_67bf234ad5998(), parentContainerProcessor: initParentContainerProcessor(), labelItemProcessor: initLabelItemProcessor()}" x-init="initLabel($el)" x-intersect.once="render()" x-ref="amLabelElement" :data-position="label.frontend_settings.position" :data-size="label.frontend_settings.image_size" :data-wrapper-class="`amlabel-position-${label.frontend_settings.position}-${product.id}-cat`" ><div x-ref="amLabel" x-cloak x-show="initialized" x-transition:enter="transition ease-out duration-250" x-transition:enter-start="opacity-0 transform scale-90" x-transition:enter-end="opacity-100 transform scale-100" @click.prevent="labelRedirect(label.frontend_settings.redirect_url)" :class="`group relative amasty-label-container amasty-label-for-${product.id} amasty-label-container-${label.label_id}-${product.id}-cat`" :style="label.frontend_settings.style" :data-amlabel-order="label.priority" :aria-describedby="'label-tooltip-' + label.label_id"><template x-if="label.tooltip.content?.length > 0"><div :id="'label-tooltip-' + label.label_id" x-ref="tooltip" class="absolute -top-full invisible opacity-0 transition-opacity -translate-x-1/2 text-center rounded z-[-1] w-max max-w-[200px] mb-3 group-hover:z-30 shadow-md px-5 py-2 group-hover:visible group-hover:opacity-100 after:absolute after:border-color-inherit after:top-[calc(100%-theme(space.1))] after:left-1/2 after:-translate-x-1/2 after:border-4 after:rotate-45" :style="`background-color: ${label.tooltip.background_color}; border-color: ${label.tooltip.background_color}`" role="tooltip"><span :style="`color: ${label.tooltip.color}`" x-html="label.tooltip.content"></span></div></template><template x-if="label.frontend_settings.label_text"><div class="amlabel-text text-center whitespace-nowrap" :class="{'absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2': label.frontend_settings.image}" x-text="label.frontend_settings.label_text" :style="label.frontend_settings.style"></div></template><template x-if="label.frontend_settings.image"><img :id="`amasty-label-image-${label.label_id}-${product.id}-cat`" class="lazy amasty-label-image opacity-100 align-top h-full" :src="getImgLabelPath(label.frontend_settings.image)" :title="label.frontend_settings.alt_tag" :width="getImageSize()" :alt="label.frontend_settings.alt_tag" /></template></div></div></template></div></template> </a> <template x-if="config.isProductReviewsBlockEnabled"> <template x-if="product.rating_summary !== 0"><div class="mt-1"><div class="flex flex-col"><div class="flex gap-x-2 items-center"><span class="am-text-small font-bold" x-text="product.ratingData.averageRating"></span> <div class="flex"><template x-for="starFilled in product.ratingData.starsFilled"><svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-4 h-4" viewBox="3 0 20 20" :style="`color: ${product.ratingData.yellowHex}`" fill="currentColor"><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></template><template x-if="product.ratingData.starFragment > 0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="3 0 20 20" fill="currentColor" class="w-4 h-4"><defs><linearGradient :id="'partialFill' + product.id"><stop offset="0%" :stop-color="product.ratingData.yellowHex"/><stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.yellowHex"/><stop :offset="product.ratingData.starFragment * 100 + '%'" :stop-color="product.ratingData.greyHex"/><stop offset="100%" :stop-color="product.ratingData.greyHex"/></linearGradient></defs><g :fill="'url(#partialFill' + product.id + ')'"><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"/></g></svg></template><template x-for="starEmpty in product.ratingData.starsEmpty"><svg xmlns="http://www.w3.org/2000/svg" class="fill-current w-4 h-4" :style="`color: ${product.ratingData.greyHex}`" viewBox="3 0 20 20" fill="currentColor"><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></template></div></div><template x-if="product.rating_summary > 0"><a :href="`${getProductUrl(product)}#reviews`" class="am-text-small"><span class="text-sm" x-html="product.reviews_count"></span> reviews</a></template></div></div></template></template></div><div class="product-info flex flex-col grow"><div class="relative items-center justify-center text-primary text-lg pb-2"><a class="link-as-text font-bold amsearch-product-name block text-lg leading-6" x-html="product.name" :href="getProductUrl(product)" :class="{'pr-12': product.hyva_compatible}" ></a> <img x-show="product.hyva_compatible" class="lazy amsite-ignore-lazy-load absolute right-0 -top-5" src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva&#x20;compatibility"></div><div class="am-text-small" x-html="truncateWithDots(product.short_description.html, config.shortDescriptionLength)" ></div><div class="pt-2 flex items-center gap-3"><!-- ordinary m2 product --><template x-if="config.isProductAddToCartBlockEnabled && product.is_salable && !isService(product) && !isCalcurates(product)"><a :href="getProductUrl(product)" class="btn btn-primary !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" ><span x-show="isM1(product)" class="type">M1</span> <span x-show="!isM1(product)" class="type">M2</span> <span class="price-wrapper text-white"><span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value,false, {maximumFractionDigits: 0})"></span></span></a></template><!-- when m2 product has m1 product --><template x-if="product.opposite_product_data && product.opposite_product_data.is_salable && !isService(product)"><a :href="getProductUrl(product.opposite_product_data)" class="btn btn-primary !px-4 !py-2 !bg-transparent hover:!bg-orange-50 text-primary hover:!text-primary border border-orange-500 leading-4 tracking-basePx min-w-[92px]" ><span x-show="isM1(product.opposite_product_data)" class="type">M1</span> <span x-show="!isM1(product.opposite_product_data)" class="type">M2</span> <span class="price-wrapper text-primary"><span class="price" x-html="hyva.formatPrice(product.opposite_product_data.price_range.minimum_price.final_price.value, false, {maximumFractionDigits: 0})"></span></span></a></template><!-- service without price --><template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable_service && isService(product)"><a :href="getProductUrl(product)" class="btn btn-primary !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" >See details</a></template><!-- service with price --><template x-if="config.isProductAddToCartBlockEnabled && isService(product) && product.is_salable_service"><a :href="getProductUrl(product)" class="btn btn-primary !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" ><span class="price-wrapper text-white"><span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value,false, {maximumFractionDigits: 0})"></span></span></a></template><!-- calcurates and Saas --><template x-if="config.isProductAddToCartBlockEnabled && product.is_salable && (isCalcurates(product) || isSaas(product))"><a :href="getProductUrl(product)" class="btn btn-primary flex gap-2 !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" >From <span class="price-wrapper text-white flex"><span class="price" x-html="hyva.formatPrice(product.price_range.minimum_price.final_price.value,false, {maximumFractionDigits: 0})"></span>/Month</span></a></template><!-- revising demand --><template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable && (isRevisingDemand(product) || isRequestQuote(product))"><a :href="getProductUrl(product)" class="btn btn-primary flex gap-2 !px-4 !py-2 leading-5 tracking-basePx min-w-[92px]" ><span class="price-wrapper text-white flex"><span class="amsite-stock-status" x-html="product.custom_stock_status"></span></span></a></template><template x-if="config.isProductAddToCartBlockEnabled && !product.is_salable && (!isRevisingDemand(product) && !isRequestQuote(product))"><div class="w-auto justify-center text-sm text-left"><span class="inline-block w-3 h-3 bg-red-500 rounded-full flex-shrink-0"></span> <span class="text-sm text-gray-700 text-left">Out of stock</span></div></template></div></div></div></template></div><div class="pb-6 text-center"><div class="am-search-view-all" x-show="getResultProductsCount() >= 1"><a :href="resultPageUrl + latestQuery" class="link-as-text am-text-small uppercase font-bold">More results <span x-show="getResultProductsCount() > 0">(<span x-text="sections.products.total_count"></span>)</span></a></div></div></div></template><div class="px-6 py-5" x-show="noResultsFound && !errorMessage" x-cloak><div class="am-text-small text-secondary" x-html="'Your search returned no results'"</div></div><div class="p-4 box-border w-full h-full flex" x-show="noResultsFound && errorMessage" x-cloak><div class="text-center flex align-center w-full text-xl justify-center content-center flex-row bg-gray-100 items-center flex-wrap h-full max-h-[90vh] word-break" x-html="errorMessage"></div></div></div></div></div></template></div></div> <div class="flex items-center header-icons-container group-[.page-header.-sticky]:lg:fixed group-[.page-header.-sticky]:lg:top-6 group-[.page-header.-sticky]:lg:right-8 group-[.page-header.-sticky]:2xl:right-20"><!-- Authorization link --> <nav class="am-authorization-link hidden lg:!block" aria-labelledby="customer-menu" ><a href="https://amasty.com/customer/account/index/" class="flex p-1 text-primary hover:text-primary hover:bg-gray-50" aria-label="Log&#x20;in" ><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" class="mr-1" role="img"> <g id="heroicons-outline/user-circle"> <path id="Vector_2" d="M17.9815 18.7248C16.6121 16.9175 14.4424 15.75 12 15.75C9.55761 15.75 7.38789 16.9175 6.01846 18.7248M17.9815 18.7248C19.8335 17.0763 21 14.6744 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 14.6744 4.1665 17.0763 6.01846 18.7248M17.9815 18.7248C16.3915 20.1401 14.2962 21 12 21C9.70383 21 7.60851 20.1401 6.01846 18.7248M15 9.75C15 11.4069 13.6569 12.75 12 12.75C10.3431 12.75 9 11.4069 9 9.75C9 8.09315 10.3431 6.75 12 6.75C13.6569 6.75 15 8.09315 15 9.75Z" stroke="#030712" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </g> <title>user-circle</title></svg> <span class="whitespace-nowrap">Log in</span></a></nav> <!--Search Icon--><button id="menu-search-icon" class="btn-icon inline-block ml-1 no-underline sm:ml-3 hover:text-black lg:hidden group-[.page-header.-sticky]:lg:block" @click.prevent="searchOpen = !searchOpen;" aria-label="Toggle&#x20;search&#x20;form" x-on:set-search-open-status.window="searchOpen = event.detail" aria-haspopup="true" :aria-expanded="searchOpen" x-ref="searchButton" ><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" class="p-1" aria-hidden="true"> <g id="heroicons-outline/magnifying-glass_2"> <path id="Vector_3" d="M21 21L15.8033 15.8033M15.8033 15.8033C17.1605 14.4461 18 12.5711 18 10.5C18 6.35786 14.6421 3 10.5 3C6.35786 3 3 6.35786 3 10.5C3 14.6421 6.35786 18 10.5 18C12.5711 18 14.4461 17.1605 15.8033 15.8033Z" stroke="#0F172A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </g> </svg> </button> <!-- Currency --> <nav class="am-currency-link relative hidden lg:!block mx-5" x-data="initCurrencySwitcher()" @keyup.escape="open = false"><button type="button" id="currency-menu" class="flex items-center p-1 !bg-transparent !text-primary tracking-basePx hover:!bg-gray-50" @click="open = !open" @click.outside="open = false" :aria-expanded="open ? 'true' : 'false'" aria-label="My&#x20;Account" aria-haspopup="true" ><template x-if="currentCurrencyCode === 'USD'"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" role="img"> <g id="heroicons-outline/currency-dollar"> <path id="Vector_4" d="M12 6V18M9 15.1818L9.87887 15.841C11.0504 16.7197 12.9498 16.7197 14.1214 15.841C15.2929 14.9623 15.2929 13.5377 14.1214 12.659C13.5355 12.2196 12.7677 12 11.9999 12C11.275 12 10.5502 11.7804 9.99709 11.341C8.891 10.4623 8.891 9.03772 9.9971 8.15904C11.1032 7.28036 12.8965 7.28036 14.0026 8.15904L14.4175 8.48863M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z" stroke="#0F172A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </g> <title>currency/currency-dollar</title></svg> </template><template x-if="currentCurrencyCode === 'EUR'"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" role="img"> <g id="heroicons-outline/currency-euro"> <path id="Vector_5" d="M14.25 7.75625C12.667 7.19798 10.8341 7.5519 9.56802 8.81802C7.81066 10.5754 7.81066 13.4246 9.56802 15.182C10.8341 16.4481 12.667 16.802 14.25 16.2437M7.5 10.5H12.75M7.5 13.5H12.75M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z" stroke="#0F172A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </g> <title>currency/currency-euro</title></svg> </template><template x-if="currentCurrencyCode === 'GBP'"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" role="img"> <g id="heroicons-outline/currency-pound"> <path id="Vector_6" d="M14.1213 7.62877C12.9497 6.45719 11.0503 6.45719 9.87868 7.62877C9.37424 8.13321 9.08699 8.7726 9.01694 9.43073C8.9944 9.64251 9.01512 9.85582 9.04524 10.0667L9.5512 13.6084C9.68065 14.5146 9.5307 15.4386 9.12135 16.2573L9 16.5L10.5385 15.9872C11.0003 15.8332 11.4997 15.8332 11.9615 15.9872L12.6158 16.2053C13.182 16.394 13.7999 16.3501 14.3336 16.0832L15 15.75M8.25 12H12M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z" stroke="#0F172A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </g> <title>currency/currency-pound</title></svg> </template><span class="ml-1" x-text="currentCurrencyCode"></span> <svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </button> <nav class="*:border-sky-100 absolute right-0 z-20 p-1 border rounded min-w-[160px] mt-2 -mr-4 px-1 overflow-auto shadow-lg lg:mt-3 bg-white" x-cloak x-show="open" aria-labelledby="currency-menu" @click.outside="open = false" > <a class="am-text-small bold !text-primary block px-2 py-1 hover:bg-gray-50" href="#" :class="{ 'font-bold': currentCurrencyCode === 'USD'}" aria-label="Switch&#x20;Currency" data-post='{"action":"https:\/\/amasty.com\/directory\/currency\/switch\/","data":{"currency":"USD"}}'>US Dollar - USD</a> <a class="am-text-small bold !text-primary block px-2 py-1 hover:bg-gray-50" href="#" :class="{ 'font-bold': currentCurrencyCode === 'EUR'}" aria-label="Switch&#x20;Currency" data-post='{"action":"https:\/\/amasty.com\/directory\/currency\/switch\/","data":{"currency":"EUR"}}'>Euro - EUR</a> <a class="am-text-small bold !text-primary block px-2 py-1 hover:bg-gray-50" href="#" :class="{ 'font-bold': currentCurrencyCode === 'GBP'}" aria-label="Switch&#x20;Currency" data-post='{"action":"https:\/\/amasty.com\/directory\/currency\/switch\/","data":{"currency":"GBP"}}'>British Pound - GBP</a> </nav></nav><script data-info="not-move-to-bottom"> function initCurrencySwitcher() { "use strict"; const currentCurrencyCode = 'USD'; return { open: false, currentCurrencyCode: '', init() { this.getCurrencyCode(); }, getCurrencyCode () { this.currentCurrencyCode = currentCurrencyCode; } } }</script> <!--Cart --><div class="relative -top-0.5"> <button id="menu-cart-icon" class="btn-icon relative inline-block no-underline hover:text-black" x-ref="cartButton" data-amtheme-js="minicart" :aria-disabled="isCartEmpty()" title="Cart" @click.prevent.stop="openShoppingCart()" @toggle-cart.window="toggleCart($event)" @mouseenter.prevent.stop="() => {$dispatch('toggle-cart', { isOpen: true })}" @mouseleave.prevent.stop="() => {$dispatch('close-cart-with-delay')}" :aria-expanded="isCartOpen" aria-haspopup="dialog" data-href="https://amasty.com/checkout/cart/" ><span class="sr-only label" x-text="` View cart, ${isCartEmpty() ? 'Cart is empty' : hyva.str( 'You have %1 product%2 in your cart.', cart.summary_count, cart.summary_count === 1 ? '' : 's' )}` " ></span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" role="img"> <g id="heroicons-outline/shopping-bag"> <path id="Vector_7" d="M15.7505 10.5V6C15.7505 3.92893 14.0716 2.25 12.0005 2.25C9.92942 2.25 8.25048 3.92893 8.25048 6V10.5M19.6065 8.50723L20.8697 20.5072C20.9396 21.1715 20.4188 21.75 19.7508 21.75H4.25012C3.58221 21.75 3.06138 21.1715 3.1313 20.5072L4.39446 8.50723C4.45473 7.93466 4.93755 7.5 5.51328 7.5H18.4877C19.0634 7.5 19.5462 7.93466 19.6065 8.50723ZM8.62548 10.5C8.62548 10.7071 8.45759 10.875 8.25048 10.875C8.04338 10.875 7.87548 10.7071 7.87548 10.5C7.87548 10.2929 8.04338 10.125 8.25048 10.125C8.45759 10.125 8.62548 10.2929 8.62548 10.5ZM16.1255 10.5C16.1255 10.7071 15.9576 10.875 15.7505 10.875C15.5434 10.875 15.3755 10.7071 15.3755 10.5C15.3755 10.2929 15.5434 10.125 15.7505 10.125C15.9576 10.125 16.1255 10.2929 16.1255 10.5Z" stroke="#030712" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> </g> <title>shopping-bag</title></svg> <span x-cloak class="absolute -bottom-[2px] -right-[7px] h-[15px] min-w-[15px] text-xs rounded-full font-bold" :class="isCartEmpty() ? 'bg-gray-200 text-primary' : 'bg-rose-500 text-white'" aria-hidden="true" x-show="cart.summary_count !== undefined" ><span x-text="cart.summary_count" class="px-[2px] tracking-normal" ></span></span></button> <section x-cloak x-show="cart" id="cart-drawer" x-data="initCartDrawer()" @private-content-loaded.window="getData($event.detail.data)" @toggle-cart.window="toggleCartDrawer($event)" @close-cart-with-delay.window="closeCartWithDelay($event)" @keydown.escape="closeCartDrawer" ><div role="dialog" aria-labelledby="cart-drawer-title" aria-modal="true" :aria-hidden="!open" class="absolute top-8 right-0 z-30 flex"><div class="relative w-screen max-w-[363px] max-h-0 rounded shadow-xl transition-maxHeight overflow-hidden duration-300 ease-linear" :class="{'max-h-screen': open}" @mouseenter.prevent.stop="isGlobalOpen = true" @mouseleave.prevent.stop="closeCartWithDelay()" x-show="open" x-transition:enter-start="!max-h-0" x-transition:enter-end="!max-h-screen" x-transition:leave-start="!max-h-screen" x-transition:leave-end="!max-h-0" x-ref="cartDialogContent" role="region" :tabindex="open ? 0 : -1" aria-label="My&#x20;Cart" ><div class="flex flex-col border rounded bg-white" x-show="itemsCount"><template x-if="itemsCount"><div class="relative grid gap-2 max-h-[50vh] overflow-y-auto pt-5 px-5" ><div class="hidden bg-gray-100 text-center py-3" data-amsite-js="removeBlock">Item deleted</div><template x-for="item in cartItems"><div class="border-b last:border-0 last:pb-5" :data-amsite-js="item.item_id"><div class="relative flex flex-col items-start pb-3" data-amsite-js="item-main-block"><div class="flex items-center min-h-9 gap-3 justify-between w-full"><template x-if="item.product_has_url"><a :href="item.product_url" x-html="item.product_name" class="link-as-text font-bold" :aria-label="hyva.strf('Product\u0020\u0022\u00250\u0022', item.product_name)" ></a></template><template x-if="!item.product_has_url"><span x-html="item.product_name" class="font-bold"></span></template><button type="button" class="btn-icon hover:text-secondary focus:text-secondary inline-flex -mr-2 px-2" @delete-item-from-cart-called-outside.window="deleteItemFromCart($event.detail.item, $event.detail.target)" @click="item.is_transfered || item.is_lp_free_gift ? $dispatch('minicart-popup-show-notification', {detail: {item, $el}}) : deleteItemFromCart(item, $event.target)" :aria-label="hyva.strf('Remove\u0020product\u0020\u0022\u00250\u0022\u0020from\u0020cart', item.product_name)" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/></svg> </button></div><!-- conventional products --><template x-if="item.product_type !== 'virtual'"><template x-for="option in item.options"><div class="pt-1 am-text-caption text-secondary"><span x-text="option.label + ':'"></span> <span x-html="option.value"></span></div></template></template><!-- support subscriptions--><template x-if="item.product_type === 'virtual'"><ul class="ul-reset pt-1 am-text-caption text-secondary minicart-subscription-options"><template x-if="item.subscription_type"><li> <span>Subscription type:</span> <span x-html="item.subscription_type"></span></li></template><template x-if="item.partner_level"><li> <span>Partner level:</span> <span x-html="item.partner_level"></span></li></template><template x-if="item.product_trial"><li> <span>Free trial:</span> <span x-html="item.product_trial + ' days'"></span></li></template><template x-if="item.product_subscription_start_date"><li> <span>Start date:</span> <span x-html="item.product_subscription_start_date"></span></li></template><template x-if="item.product_subscription_version === 'Pro' || item.product_subscription_version === 'Premium' || item.product_subscription_version === 'Amasty One'"><li> <span class="block mb-2">Additional options:</span> <span x-html="getAdditionalOptions(item)"></span></li></template></ul></template><p class="m-0 pt-2" >1 x <template x-if="item.subscription_product_price"><span x-html="hyva.formatPrice(item.subscription_product_price, false, {maximumFractionDigits: 0})"></span></template><template x-if="!item.subscription_product_price"><span x-html="item.product_price"></span></template></p></div></div></template></div></template><template x-if="itemsCount"><div class="rounded"><div class="relative grid py-3 pb-6 px-5 bg-container-lighter"><div class="text-right"><p class="m-0">Subtotal <span class="text-right inline-block min-w-24" x-html="cart.subtotal"></span></p><template x-if="cart.discounts.length"><template x-for="discount in cart.discounts"><template x-if="discount.value"><p class="m-0"><span class="inline-flex flex-col leading-4"><span> Discount</span> <span class="text-secondary" x-html="discount.name"></span></span> <span class="text-right inline-block min-w-24" x-html="discount.amount"></span></p></template></template></template><template x-if="cart.storecredit.length"><template x-for="credit in cart.storecredit"><template x-if="credit.value"><p class="m-0"><span x-html="credit.name"></span> <span class="text-right inline-block min-w-24" x-html="credit.amount"></span></p></template></template></template><template x-if="cart.taxes.length"><template x-for="tax in cart.taxes"><template x-if="tax.value"><p class="m-0"><span x-html="tax.name"></span> <span class="text-right inline-block min-w-24" x-html="tax.amount"></span></p></template></template></template><p class="m-0 font-bold">Grand Total <span class="text-right inline-block min-w-24" x-html="cart.grand_total[0].amount"></span></p></div><div class="flex justify-between items-center mt-5"><a href="https://amasty.com/checkout/cart/" class="btn btn-as-text ml-5" data-metrics-element="mini-cart-view-cart" aria-label="View&#x20;Cart" >View Cart</a> <a href="https://amasty.com/checkout/" class="btn btn-primary" data-metrics-element="mini-cart-view-checkout" aria-label="Checkout" >Checkout</a></div></div></div></template></div> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></section> <div x-data="Object.assign({}, hyva.modal(), AmMiniCartPopupNotification())" x-on:minicart-popup-show-notification.window="showNotification($event.detail)" > <div x-cloak x-bind="overlay('minicart-popup-notification')" x-spread="overlay('minicart-popup-notification')" class="am-overlay-popup"><div class="am-container-popup inset-0"><div x-ref="minicart-popup-notification" role="dialog" aria-modal="true" class="am-dialog-popup max-w-[480px]"> <div class="text-center"><button type="button" class="am-close-popup" aria-label="Close" x-on:click="hide()" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </button> <div class="text-4xl">⚠️</div><div class="mt-5 mb-7" x-ref="minicartNotificationContent"></div><div><button class="btn btn-primary !mr-7" x-on:click="$dispatch('delete-item-from-cart-called-outside', {item, target})" >Yes, delete it</button> <button class="btn btn-as-text" x-on:click="hide()" aria-label="Close" >No, keep it</button></div></div></div></div></div></div></div></div></div></div><div data-amsite-js="fake-empty-block-for-sticky-menu" class="hidden h-16"></div> <section class="ammenu-robots-navigation"><nav class="navigation" data-action="navigation" aria-disabled="true" aria-hidden="true" tabindex="-1"><ul aria-disabled="true" aria-hidden="true"> <li class="category-item nav-0" role="presentation"><a href="https://amasty.com/magento-2-extensions.html" tabindex="-1" title="Magento&#x20;2&#x20;Extensions">Magento 2 Extensions</a> <ul class="submenu"> <li class="category-item nav-0-0" role="presentation"><a href="https://amasty.com/hyva-theme-extensions-for-magento-2.html" tabindex="-1" title="Hyva&#x20;Theme&#x20;Extensions">Hyva Theme Extensions</a> </li> <li class="category-item nav-0-1" role="presentation"><a href="https://amasty.com/hyva-checkout-ready-extensions-for-magento-2.html" tabindex="-1" title="Hyva&#x20;Checkout&#x20;Ready">Hyva Checkout Ready</a> </li> <li class="category-item nav-0-2" role="presentation"><a href="https://amasty.com/usability-navigation-extensions-for-magento-2.html" tabindex="-1" title="Navigation&#x20;&amp;&#x20;Search">Navigation &amp; Search</a> </li> <li class="category-item nav-0-3" role="presentation"><a href="https://amasty.com/catalog-management-extensions-for-magento-2.html" tabindex="-1" title="Catalog&#x20;Management">Catalog Management</a> </li> <li class="category-item nav-0-4" role="presentation"><a href="https://amasty.com/checkout-extensions-for-magento-2.html" tabindex="-1" title="Checkout">Checkout</a> </li> <li class="category-item nav-0-5" role="presentation"><a href="https://amasty.com/law-based-extensions-for-magento-2.html" tabindex="-1" title="Law-Based&#x20;Extensions">Law-Based Extensions</a> </li> <li class="category-item nav-0-6" role="presentation"><a href="https://amasty.com/shipping-extensions-for-magento-2.html" tabindex="-1" title="Shipping">Shipping</a> </li> <li class="category-item nav-0-7" role="presentation"><a href="https://amasty.com/seo-optimization-extensions-for-magento-2.html" tabindex="-1" title="SEO">SEO</a> </li> <li class="category-item nav-0-8" role="presentation"><a href="https://amasty.com/promotions-extensions-for-magento-2.html" tabindex="-1" title="Promotions">Promotions</a> </li> <li class="category-item nav-0-9" role="presentation"><a href="https://amasty.com/images-media-extensions-for-magento-2.html" tabindex="-1" title="Images&#x20;&amp;&#x20;Media">Images &amp; Media</a> </li> <li class="category-item nav-0-10" role="presentation"><a href="https://amasty.com/administration-extensions-for-magento-2.html" tabindex="-1" title="Administration">Administration</a> </li> <li class="category-item nav-0-11" role="presentation"><a href="https://amasty.com/b2b-extensions-for-magento-2.html" tabindex="-1" title="B2B&#x20;Products">B2B Products</a> </li> <li class="category-item nav-0-12" role="presentation"><a href="https://amasty.com/ai-extensions-for-magento-2.html" tabindex="-1" title="AI-Powered&#x20;Extensions">AI-Powered Extensions</a> </li> <li class="category-item nav-0-13" role="presentation"><a href="https://amasty.com/free-magento-2-extensions.html" tabindex="-1" title="Free&#x20;Magento&#x20;2&#x20;Extensions">Free Magento 2 Extensions</a> </li> <li class="category-item nav-0-14" role="presentation"><a href="https://amasty.com/contacts" tabindex="-1" title="Support&#x20;Packs">Support Packs</a> </li> <li class="category-item nav-0-15" role="presentation"><a href="https://amasty.com/research-product-demand.html" tabindex="-1" title="Research&#x20;Product&#x20;Demand">Research Product Demand</a> </li> <li class="category-item nav-0-16" role="presentation"><a href="https://trello.com/b/mGKdSV3a/%F0%9F%9A%A9-amasty-product-roadmap-%F0%9F%9A%A9" tabindex="-1" title="Public&#x20;Roadmap">Public Roadmap</a> </li> </ul></li> <li class="category-item nav-1" role="presentation"><a href="https://amasty.com/magento-2-solutions.html" tabindex="-1" title="Suites">Suites</a> <ul class="submenu"> <li class="category-item nav-1-0" role="presentation"><a href="https://amasty.com/hyva-solutions-for-magento-2.html" tabindex="-1" title="Hyva&#x20;Solutions">Hyva Solutions</a> </li> <li class="category-item nav-1-1" role="presentation"><a href="https://amasty.com/usability-navigation-solutions-for-magento-2.html" tabindex="-1" title="Enhanced&#x20;Navigation">Enhanced Navigation</a> </li> <li class="category-item nav-1-2" role="presentation"><a href="https://amasty.com/packs-for-magento-2.html" tabindex="-1" title="Packs">Packs</a> </li> <li class="category-item nav-1-3" role="presentation"><a href="https://amasty.com/suites-for-magento-2.html" tabindex="-1" title="Suites">Suites</a> </li> <li class="category-item nav-1-4" role="presentation"><a href="https://amasty.com/sales-and-marketing-solutions-for-magento-2.html" tabindex="-1" title="Sales&#x20;&amp;&#x20;Marketing">Sales &amp; Marketing</a> </li> <li class="category-item nav-1-5" role="presentation"><a href="https://amasty.com/user-experience-solutions-for-magento-2.html" tabindex="-1" title="User&#x20;Experience">User Experience</a> </li> <li class="category-item nav-1-6" role="presentation"><a href="https://amasty.com/order-management-solutions-for-magento-2.html" tabindex="-1" title="Order&#x20;Management">Order Management</a> </li> </ul></li> <li class="category-item nav-2" role="presentation"><a href="https://amasty.com/contacts/" tabindex="-1" title="Support">Support</a> </li> <li class="category-item nav-3" role="presentation"><a href="https://amasty.com/magento-services.html" tabindex="-1" title="Services">Services</a> <ul class="submenu"> <li class="category-item nav-3-0" role="presentation"><a href="https://amasty.com/magento-development-services.html" tabindex="-1" title="High-Demand&#x20;Services">High-Demand Services</a> </li> <li class="category-item nav-3-1" role="presentation"><a href="https://amasty.com/magento-development-services.html" tabindex="-1" title="Magento&#x20;Development&#x20;Services">Magento Development Services</a> </li> <li class="category-item nav-3-2" role="presentation"><a href="https://amasty.com/magento-hyva-theme-development-service.html" tabindex="-1" title="Hyva&#x20;Development&#x20;Services">Hyva Development Services</a> </li> <li class="category-item nav-3-3" role="presentation"><a href="https://amasty.com/magento-optimization-service.html" tabindex="-1" title="Magento&#x20;Optimization&#x20;Services">Magento Optimization Services</a> </li> <li class="category-item nav-3-4" role="presentation"><a href="https://amasty.com/magento-2-support-and-maintenance-service.html" tabindex="-1" title="Magento&#x20;Maintenance&#x20;Services">Magento Maintenance Services</a> </li> <li class="category-item nav-3-5" role="presentation"><a href="https://amasty.com/magento-2-upgrade-service.html" tabindex="-1" title="Magento&#x20;Upgrade&#x20;Services">Magento Upgrade Services</a> </li> <li class="category-item nav-3-6" role="presentation"><a href="https://amasty.com/magento-integration-service.html" tabindex="-1" title="Magento&#x20;Integration&#x20;Services">Magento Integration Services</a> </li> <li class="category-item nav-3-7" role="presentation"><a href="https://amasty.com/managed-it-service.html" tabindex="-1" title="Managed&#x20;Services">Managed Services</a> </li> <li class="category-item nav-3-8" role="presentation"><a href="https://amasty.com/shopify-website-development-service.html" tabindex="-1" title="Shopify&#x20;Services">Shopify Services</a> </li> <li class="category-item nav-3-9" role="presentation"><a href="https://amasty.com/magento-services.html" tabindex="-1" title="E-Commerce&#x20;Services">E-Commerce Services</a> </li> <li class="category-item nav-3-10" role="presentation"><a href="https://amasty.com/qa-testing-services.html" tabindex="-1" title="QA&#x20;Testing&#x20;Services">QA Testing Services</a> </li> <li class="category-item nav-3-11" role="presentation"><a href="https://amasty.com/hire-developers.html" tabindex="-1" title="Hire&#x20;Developers">Hire Developers</a> </li> </ul></li> <li class="category-item nav-4" role="presentation"><a href="https://amasty.com/shopify-apps.html" tabindex="-1" title="Shopify&#x20;Apps">Shopify Apps</a> </li> <li class="category-item nav-5" role="presentation"><a href="https://amasty.com/amasty-promo.html" tabindex="-1" title="Special&#x20;Offers">Special Offers</a> </li> <li class="category-item nav-6" role="presentation"><a href="https://amasty.com/amasty-loyalty-program.html" tabindex="-1" title="Loyalty&#x20;Programs">Loyalty Programs</a> </li> <li class="category-item nav-7" role="presentation"><a href="https://amasty.com/blog/" tabindex="-1" title="Blog">Blog</a> </li> <li class="category-item nav-8" role="presentation"><a href="https://amasty.com/knowledge-base/" tabindex="-1" title="FAQ">FAQ</a> </li> </ul></nav></section> <section class="ammenu-menu-wrapper" data-nosnippet data-bind=" scope: 'ammenu_wrapper', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_wrapper': { component: 'Amasty_MegaMenuLite/js/wrapper', data: {&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:700,&quot;mobile_font&quot;:700,&quot;elems&quot;:[{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:&quot;&lt;div class=\&quot;ammenu-view-all-mobile-link\&quot;&gt;\r\n &lt;a class=\&quot;ammenu-link view-all\&quot;\r\n href=\&quot;\/magento-2-extensions.html\&quot;\r\n aria-label=\&quot;Go to All Magento 2 Extensions\&quot;\r\n title=\&quot;Go to All Magento 2 Extensions\&quot;\r\n role=\&quot;link\&quot;\r\n tabindex=\&quot;0\&quot;\r\n &gt;\r\n All Magento 2 Extensions\r\n &lt;\/a&gt;\r\n&lt;\/div&gt;\r\n\r\n &lt;div class=\&quot;ammenu-widget-wrapper block widget mega-menu-products-list\&quot; data-amsite-js=\&quot;top-product-widget\&quot;&gt; &lt;div class=\&quot;block-title\&quot;&gt;Popular right now&lt;\/div&gt; &lt;div class=\&quot;block-content\&quot;&gt;&lt;ul class=\&quot;widget-product-items\&quot;&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/cookie-consent-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Cookie&#x20;Consent&#x20;&#x28;GDPR&#x29;\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/c\/o\/cookie-consent-for-magento-2_6253b4c79f9ab.png\&quot; alt=\&quot;Cookie Consent (GDPR) for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Cookie Consent (GDPR)&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Improved&#x20;Layered&#x20;Navigation\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/m\/improved-layered-navigation-for-magento-2_5.png\&quot; alt=\&quot;Improved Layered Navigation for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;amasty-label-container amasty-label-container-13-506-cat amasty-label-for-506\&quot; style=\&quot;display: none; width:111px;\&quot; data-mage-init=&#039;{\&quot;Amasty_Label\/js\/initLabel\&quot;:{ \&quot;mode\&quot;: \&quot;cat\&quot;, \&quot;isAdminArea\&quot;: \&quot;\&quot;, \&quot;config\&quot;: {\&quot;position\&quot;:\&quot;top-center\&quot;,\&quot;size\&quot;:\&quot;\&quot;,\&quot;path\&quot;:\&quot;.product-image-container, .product-item-photo, .cdz-product-top\&quot;,\&quot;mode\&quot;:\&quot;prod\&quot;,\&quot;move\&quot;:0,\&quot;product\&quot;:\&quot;506\&quot;,\&quot;label\&quot;:13,\&quot;margin\&quot;:7,\&quot;alignment\&quot;:0,\&quot;order\&quot;:5,\&quot;redirect_url\&quot;:\&quot;\&quot;,\&quot;tooltip\&quot;:{\&quot;backgroundColor\&quot;:\&quot;\&quot;,\&quot;color\&quot;:\&quot;\&quot;,\&quot;status\&quot;:1,\&quot;content\&quot;:\&quot;\&quot;}}, \&quot;productId\&quot;: \&quot;506\&quot;, \&quot;selector\&quot;: \&quot;.amasty-label-container-13-506-cat\&quot; }}&#039;&gt;&lt;div class=\&quot;amlabel-text\&quot;&gt;&lt;\/div&gt; &lt;img id=\&quot;amasty-label-image-13-506-cat\&quot; class=\&quot;amasty-label-image\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\&quot; style=\&quot;opacity: 1 !important;vertical-align: top;\&quot; title=\&quot;Improved&#x20;Layered&#x20;Navigation&#x20;for&#x20;Magento&#x20;2\&quot; alt=\&quot;Improved&#x20;Layered&#x20;Navigation&#x20;for&#x20;Magento&#x20;2\&quot; &gt;&lt;\/div&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Improved Layered Navigation&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/google-tag-manager-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Google&#x20;Analytics&#x20;4&#x20;with&#x20;GTM&#x20;Support\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon-google-tag-manager-for-magento-2.png\&quot; alt=\&quot;Google Analytics 4 with GTM Support for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Google Analytics 4 with GTM Support&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;\/ul&gt;&lt;\/div&gt; &lt;a href=\&quot;\/featured-extensions-for-magento-2.html\&quot; class=\&quot;block-link-below\&quot; tabindex=\&quot;0\&quot; title=\&quot;View&#x20;All&#x20;BestSellers\&quot;&gt;View All BestSellers&lt;\/a&gt; &lt;\/div&gt;\r\n\r\n\r\n&lt;div class=\&quot;ammenu-m2-dropdown-banners\&quot; data-amsite-js=\&quot;ammenu-m2-dropdown-banners\&quot;&gt;\r\n &lt;a class=\&quot;amsite-menu-picker-btn action secondary\&quot; href=\&quot;\/latest-updates-magento-2-extensions.html?utm_source=menu&amp;utm_medium=widget&amp;utm_campaign=recent_updates\&quot; title=\&quot;Go to this page\&quot;&gt;\r\n Check Module Updates\r\n &lt;\/a&gt;\r\n &lt;img src=\&quot;https:\/\/cdn.amasty.com\/media\/amsite\/adobe-partner-badge-2x.png\&quot; alt=\&quot;Adobe partner logo\&quot; width=\&quot;180\&quot; \r\n height=\&quot;46\&quot;&gt;\r\n&lt;\/div&gt; &quot;,&quot;type&quot;:{&quot;value&quot;:1,&quot;label&quot;:&quot;vertical&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:3,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Hyva Theme Extensions&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-83&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/hyva-theme-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:162,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/custom-form-for-magento-2.html&quot;,&quot;name&quot;:&quot;Custom Form&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/social-login-for-magento-2.html&quot;,&quot;name&quot;:&quot;Social Login&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/google-tag-manager-for-magento-2.html&quot;,&quot;name&quot;:&quot;Google Analytics 4 with GTM&quot;}],&quot;label&quot;:{&quot;label&quot;:&quot;HOT&quot;,&quot;label_text_color&quot;:&quot;#ffffff&quot;,&quot;label_background_color&quot;:&quot;#ff2f7a&quot;},&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Hyva Checkout Ready&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-109&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/hyva-checkout-ready-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:135,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/out-of-stock-notification-for-magento-2.html&quot;,&quot;name&quot;:&quot;Out of Stock Notification&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/order-attributes-for-magento-2.html&quot;,&quot;name&quot;:&quot;Order Attributes&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shipping-restrictions-for-magento-2.html&quot;,&quot;name&quot;:&quot;Shipping Restrictions &quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Navigation &amp; Search&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-26&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/usability-navigation-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:21,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html&quot;,&quot;name&quot;:&quot;Improved Layered Navigation&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;TOP&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;}},{&quot;url&quot;:&quot;https:\/\/amasty.com\/mega-menu-for-magento-2.html&quot;,&quot;name&quot;:&quot;Mega Menu Pro&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/elasticsearch-for-magento-2.html&quot;,&quot;name&quot;:&quot;Elastic Search&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Catalog Management&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-28&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/catalog-management-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:34,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/product-feed-for-magento-2.html&quot;,&quot;name&quot;:&quot;Product Feed&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/improved-sorting-for-magento-2.html&quot;,&quot;name&quot;:&quot;Improved Sorting&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shop-by-brand-for-magento-2.html&quot;,&quot;name&quot;:&quot;Shop by Brand&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Checkout&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-35&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/checkout-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:27,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/one-step-checkout-for-magento-2.html&quot;,&quot;name&quot;:&quot;One Step Checkout Pro&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;TOP&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;}},{&quot;url&quot;:&quot;https:\/\/amasty.com\/customer-attributes-for-magento-2.html&quot;,&quot;name&quot;:&quot;Customer Attributes&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/delivery-date-manager-for-magento-2.html&quot;,&quot;name&quot;:&quot;Delivery Date Manager&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Law-Based Extensions&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-112&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/law-based-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:8,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/cookie-consent-for-magento-2.html&quot;,&quot;name&quot;:&quot;Cookie Consent&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/omnibus-price-tracker-for-magento-2.html&quot;,&quot;name&quot;:&quot;Omnibus Price Tracker&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/age-verification-for-magento-2.html&quot;,&quot;name&quot;:&quot;Age Verification&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;NEW&quot;,&quot;label_text_color&quot;:&quot;#ffffff&quot;,&quot;label_background_color&quot;:&quot;#4d91f8&quot;}}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Shipping&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-30&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/shipping-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:19,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/shipping-rules-for-magento-2.html&quot;,&quot;name&quot;:&quot;Shipping Rules&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shipping-table-rates-for-magento-2.html&quot;,&quot;name&quot;:&quot;Shipping Table Rates&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/store-pickup-with-locator-for-magento-2.html&quot;,&quot;name&quot;:&quot;Store Pickup with Locator&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;SEO&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-33&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/seo-optimization-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:29,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/seo-toolkit-for-magento-2.html&quot;,&quot;name&quot;:&quot;SEO Toolkit Pro&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/google-indexing-api-for-magento-2.html&quot;,&quot;name&quot;:&quot;Google Indexing API&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;NEW&quot;,&quot;label_text_color&quot;:&quot;#ffffff&quot;,&quot;label_background_color&quot;:&quot;#4d91f8&quot;}},{&quot;url&quot;:&quot;https:\/\/amasty.com\/google-page-speed-optimizer-for-magento-2.html&quot;,&quot;name&quot;:&quot;Google Page Speed Optimizer Pro&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Promotions&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-29&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/promotions-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:44,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/free-gift-for-magento-2.html&quot;,&quot;name&quot;:&quot;Free Gift&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;TOP&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;}},{&quot;url&quot;:&quot;https:\/\/amasty.com\/special-promotions-pro-for-magento-2.html&quot;,&quot;name&quot;:&quot;Special Promotions Pro&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/automatic-related-products-for-magento-2.html&quot;,&quot;name&quot;:&quot;Automatic Related Products&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Images &amp; Media&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-36&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/images-media-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:15,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/product-labels-for-magento-2.html&quot;,&quot;name&quot;:&quot;Product Labels&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/promo-banners-for-magento-2.html&quot;,&quot;name&quot;:&quot;Promo Banners&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/color-swatches-pro-for-magento-2.html&quot;,&quot;name&quot;:&quot;Color Swatches Pro&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Administration&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-82&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/administration-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:25,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/admin-actions-log-for-magento-2.html&quot;,&quot;name&quot;:&quot;Admin Actions Log&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/advanced-permissions-for-magento-2.html&quot;,&quot;name&quot;:&quot;Advanced Permissions&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/payment-restrictions-for-magento-2.html&quot;,&quot;name&quot;:&quot;Payment Restrictions&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;B2B Products&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-61&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/b2b-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:27,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/b2b-ecommerce-suite-for-magento-2.html&quot;,&quot;name&quot;:&quot;B2B E-commerce Premium Suite&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/import-and-export-for-magento-2.html&quot;,&quot;name&quot;:&quot;Import and Export Premium&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/b2b-company-account-for-magento-2.html&quot;,&quot;name&quot;:&quot;B2B Company Account&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;AI-Powered Extensions&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-103&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/ai-extensions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:3,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/blog-pro-for-magento-2.html&quot;,&quot;name&quot;:&quot;Blog Pro&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/chatgpt-ai-content-for-magento-2.html&quot;,&quot;name&quot;:&quot;ChatGPT AI Content Generator&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/google-automated-discounts-for-magento-2.html&quot;,&quot;name&quot;:&quot;Google Automated Discounts&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Free Magento 2 Extensions&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-43&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/free-magento-2-extensions.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:8,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/google-page-speed-optimizer-lite-for-magento-2.html&quot;,&quot;name&quot;:&quot;Google Page Speed Optimizer&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/recently-viewed-products-popup-for-magento-2.html&quot;,&quot;name&quot;:&quot;Recently Viewed Products&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/mega-menu-lite-for-magento-2.html&quot;,&quot;name&quot;:&quot;Mega Menu&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:700,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Support Packs&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-79&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/contacts&quot;,&quot;current&quot;:false,&quot;items_count&quot;:0,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:null},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:700,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Research Product Demand&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-69&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/research-product-demand.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:57,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:null},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Public Roadmap&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-97&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/trello.com\/b\/mGKdSV3a\/%F0%9F%9A%A9-amasty-product-roadmap-%F0%9F%9A%A9&quot;,&quot;current&quot;:false,&quot;items_count&quot;:0,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;}],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Magento 2 Extensions&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-25&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;0&quot;,&quot;content&quot;:&quot;&lt;div class=\&quot;ammenu-dropdown-wrapper -desktop\&quot;&gt;\r\n &lt;div class=\&quot;left-side\&quot;&gt;\r\n &lt;div class=\&quot;ammenu-widget-wrapper block widget mega-menu-products-list\&quot; data-amsite-js=\&quot;top-product-widget\&quot;&gt; &lt;div class=\&quot;block-title\&quot;&gt;Popular right now&lt;\/div&gt; &lt;div class=\&quot;block-content\&quot;&gt;&lt;ul class=\&quot;widget-product-items\&quot;&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/cookie-consent-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Cookie&#x20;Consent&#x20;&#x28;GDPR&#x29;\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/c\/o\/cookie-consent-for-magento-2_6253b4c79f9ab.png\&quot; alt=\&quot;Cookie Consent (GDPR) for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Cookie Consent (GDPR)&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Improved&#x20;Layered&#x20;Navigation\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/m\/improved-layered-navigation-for-magento-2_5_png.webp\&quot; alt=\&quot;Improved Layered Navigation for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;amasty-label-container amasty-label-container-13-506-cat amasty-label-for-506\&quot; style=\&quot;display: none; width:111px;\&quot; data-mage-init=&#039;{\&quot;Amasty_Label\/js\/initLabel\&quot;:{ \&quot;mode\&quot;: \&quot;cat\&quot;, \&quot;isAdminArea\&quot;: \&quot;\&quot;, \&quot;config\&quot;: {\&quot;position\&quot;:\&quot;top-center\&quot;,\&quot;size\&quot;:\&quot;\&quot;,\&quot;path\&quot;:\&quot;.product-image-container, .product-item-photo, .cdz-product-top\&quot;,\&quot;mode\&quot;:\&quot;prod\&quot;,\&quot;move\&quot;:0,\&quot;product\&quot;:\&quot;506\&quot;,\&quot;label\&quot;:13,\&quot;margin\&quot;:7,\&quot;alignment\&quot;:0,\&quot;order\&quot;:5,\&quot;redirect_url\&quot;:\&quot;\&quot;,\&quot;tooltip\&quot;:{\&quot;backgroundColor\&quot;:\&quot;\&quot;,\&quot;color\&quot;:\&quot;\&quot;,\&quot;status\&quot;:1,\&quot;content\&quot;:\&quot;\&quot;}}, \&quot;productId\&quot;: \&quot;506\&quot;, \&quot;selector\&quot;: \&quot;.amasty-label-container-13-506-cat\&quot; }}&#039;&gt;&lt;div class=\&quot;amlabel-text\&quot;&gt;&lt;\/div&gt; &lt;img id=\&quot;amasty-label-image-13-506-cat\&quot; class=\&quot;amasty-label-image\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\&quot; style=\&quot;opacity: 1 !important;vertical-align: top;\&quot; title=\&quot;Improved&#x20;Layered&#x20;Navigation&#x20;for&#x20;Magento&#x20;2\&quot; alt=\&quot;Improved&#x20;Layered&#x20;Navigation&#x20;for&#x20;Magento&#x20;2\&quot; &gt;&lt;\/div&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Improved Layered Navigation&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/google-tag-manager-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Google&#x20;Analytics&#x20;4&#x20;with&#x20;GTM&#x20;Support\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon-google-tag-manager-for-magento-2_png.webp\&quot; alt=\&quot;Google Analytics 4 with GTM Support for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Google Analytics 4 with GTM Support&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;\/ul&gt;&lt;\/div&gt; &lt;a href=\&quot;\/hyva-theme-extensions-for-magento-2.html?utm_source=menu&amp;utm_medium=widget&amp;utm_campaign=hyva_extensions\&quot; class=\&quot;block-link-below\&quot; tabindex=\&quot;0\&quot; title=\&quot;View&#x20;All&#x20;Hyva&#x20;Extensions\&quot;&gt;View All Hyva Extensions&lt;\/a&gt; &lt;\/div&gt;\r\n\r\n &lt;div class=\&quot;ammenu-m2-dropdown-banners\&quot; data-amsite-js=\&quot;ammenu-m2-dropdown-banners\&quot;&gt;\r\n &lt;a class=\&quot;amsite-menu-picker-btn action secondary\&quot; href=\&quot;\/latest-updates-magento-2-extensions.html?utm_source=menu&amp;utm_medium=widget&amp;utm_campaign=recent_updates\&quot; title=\&quot;Go to this page\&quot;&gt;\r\n Check Module Updates\r\n &lt;\/a&gt;\r\n &lt;img src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/amsite\/adobe-partner-badge-2x_png.webp\&quot; alt=\&quot;Adobe partner logo\&quot; width=\&quot;180\&quot; \r\n height=\&quot;46\&quot;&gt;\r\n&lt;\/div&gt; \r\n\r\n &lt;\/div&gt;\r\n &lt;div class=\&quot;right-side\&quot;&gt;\r\n &lt;!-- ko scope: \&quot;index = ammenu_columns_wrapper\&quot; --&gt; &lt;!-- ko template: getTemplate() --&gt;&lt;!-- \/ko --&gt; &lt;!-- \/ko --&gt;\r\n &lt;\/div&gt;\r\n&lt;\/div&gt;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-extensions.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:261,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/tier-price-for-magento-2.html&quot;,&quot;name&quot;:&quot;Tier Price for Magento 2&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;fade_in&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:&quot;&lt;div class=\&quot;ammenu-view-all-mobile-link\&quot;&gt;\r\n &lt;a class=\&quot;ammenu-link view-all\&quot;\r\n href=\&quot;\/magento-2-solutions.html\&quot;\r\n aria-label=\&quot;Go to Solutions\&quot;\r\n title=\&quot;Go to Solutions\&quot;\r\n role=\&quot;link\&quot;\r\n tabindex=\&quot;0\&quot;\r\n &gt;\r\n All Solutions\r\n &lt;\/a&gt;\r\n&lt;\/div&gt;\r\n\r\n &lt;div class=\&quot;ammenu-widget-wrapper block widget mega-menu-products-list\&quot; data-amsite-js=\&quot;top-product-widget\&quot;&gt; &lt;div class=\&quot;block-title\&quot;&gt;Featured Products&lt;\/div&gt; &lt;div class=\&quot;block-content\&quot;&gt;&lt;ul class=\&quot;widget-product-items\&quot;&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/b2b-ecommerce-suite-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to B2B&#x20;E-commerce&#x20;Premium&#x20;Solution\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon_b2b_premium_2.png\&quot; alt=\&quot;B2B E-commerce Premium Solution for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;B2B E-commerce Premium Solution&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Google&#x20;Page&#x20;Speed&#x20;Optimizer&#x20;Powered&#x20;by&#x20;SpeedSize&#x2122;&#x20;AI&#x20;Pro\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/g\/o\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2_629ed9b6e2f0e.png\&quot; alt=\&quot;Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;amasty-label-container amasty-label-container-13-2699-cat amasty-label-for-2699\&quot; style=\&quot;display: none; width:111px;\&quot; data-mage-init=&#039;{\&quot;Amasty_Label\/js\/initLabel\&quot;:{ \&quot;mode\&quot;: \&quot;cat\&quot;, \&quot;isAdminArea\&quot;: \&quot;\&quot;, \&quot;config\&quot;: {\&quot;position\&quot;:\&quot;top-center\&quot;,\&quot;size\&quot;:\&quot;\&quot;,\&quot;path\&quot;:\&quot;.product-image-container, .product-item-photo, .cdz-product-top\&quot;,\&quot;mode\&quot;:\&quot;prod\&quot;,\&quot;move\&quot;:0,\&quot;product\&quot;:\&quot;2699\&quot;,\&quot;label\&quot;:13,\&quot;margin\&quot;:7,\&quot;alignment\&quot;:0,\&quot;order\&quot;:5,\&quot;redirect_url\&quot;:\&quot;\&quot;,\&quot;tooltip\&quot;:{\&quot;backgroundColor\&quot;:\&quot;\&quot;,\&quot;color\&quot;:\&quot;\&quot;,\&quot;status\&quot;:1,\&quot;content\&quot;:\&quot;\&quot;}}, \&quot;productId\&quot;: \&quot;2699\&quot;, \&quot;selector\&quot;: \&quot;.amasty-label-container-13-2699-cat\&quot; }}&#039;&gt;&lt;div class=\&quot;amlabel-text\&quot;&gt;&lt;\/div&gt; &lt;img id=\&quot;amasty-label-image-13-2699-cat\&quot; class=\&quot;amasty-label-image\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\&quot; style=\&quot;opacity: 1 !important;vertical-align: top;\&quot; title=\&quot;Google&#x20;Page&#x20;Speed&#x20;Optimizer&#x20;Powered&#x20;by&#x20;SpeedSize&#x2122;&#x20;AI&#x20;Pro&#x20;for&#x20;Magento&#x20;2\&quot; alt=\&quot;Google&#x20;Page&#x20;Speed&#x20;Optimizer&#x20;Powered&#x20;by&#x20;SpeedSize&#x2122;&#x20;AI&#x20;Pro&#x20;for&#x20;Magento&#x20;2\&quot; &gt;&lt;\/div&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;\/ul&gt;&lt;\/div&gt; &lt;a href=\&quot;\/magento-2-extensions.html\&quot; class=\&quot;block-link-below\&quot; tabindex=\&quot;0\&quot; title=\&quot;View&#x20;All&#x20;BestSellers\&quot;&gt;View All BestSellers&lt;\/a&gt; &lt;\/div&gt;\r\n&quot;,&quot;type&quot;:{&quot;value&quot;:1,&quot;label&quot;:&quot;vertical&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:3,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Hyva Solutions&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-104&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/hyva-solutions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:8,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/gdpr-for-magento-2.html&quot;,&quot;name&quot;:&quot;GDPR Pro&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/gift-card-for-magento-2.html&quot;,&quot;name&quot;:&quot;Gift Card Pro&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/product-attachments-for-magento-2.html&quot;,&quot;name&quot;:&quot;Product Attachments&quot;}],&quot;label&quot;:{&quot;label&quot;:&quot;HOT&quot;,&quot;label_text_color&quot;:&quot;#ffffff&quot;,&quot;label_background_color&quot;:&quot;#ff2f7a&quot;},&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:1,&quot;label&quot;:&quot;vertical&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:0,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Enhanced Navigation&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-72&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;99999&quot;,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/usability-navigation-solutions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:5,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/premium-custom-layered-navigation-for-magento-2.html&quot;,&quot;name&quot;:&quot;Layered Navigation Premium&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/advanced-search-for-magento-2.html&quot;,&quot;name&quot;:&quot;Advanced Search&quot;}],&quot;label&quot;:{&quot;label&quot;:&quot;TOP&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;},&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Packs&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-113&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/packs-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:2,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/ultimate-sale-booster-for-magento-2.html&quot;,&quot;name&quot;:&quot;Sale Booster Pack&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/elastic-layered-navigation-for-magento-2.html&quot;,&quot;name&quot;:&quot;Elastic Layered Navigation&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Suites&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-114&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/suites-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:4,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/promotion-suite-middle-for-magento-2.html&quot;,&quot;name&quot;:&quot;Promotion Suite Pro&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/security-suite-for-magento-2.html&quot;,&quot;name&quot;:&quot;Security Suite &quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shipping-suite-for-magento-2.html&quot;,&quot;name&quot;:&quot;Shipping Suite Pro&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Sales &amp; Marketing&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-73&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;99999&quot;,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/sales-and-marketing-solutions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:11,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/abandoned-cart-email-for-magento-2.html&quot;,&quot;name&quot;:&quot;Abandoned Cart Email&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/reward-points-for-magento-2.html&quot;,&quot;name&quot;:&quot;Reward Points&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/special-promotions-for-magento-2.html&quot;,&quot;name&quot;:&quot;Special Promotions&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/facebook-pixel-for-magento-2.html&quot;,&quot;name&quot;:&quot;Facebook Pixel&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/advanced-product-reviews-for-magento-2.html&quot;,&quot;name&quot;:&quot;Advanced Product Reviews&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;User Experience&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-77&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/user-experience-solutions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:5,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/request-a-quote-for-magento-2.html&quot;,&quot;name&quot;:&quot;Request a Quote&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/google-page-speed-optimizer-premium-for-magento-2.html&quot;,&quot;name&quot;:&quot;Google Page Speed Optimizer Premium&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/store-locator-for-magento-2.html&quot;,&quot;name&quot;:&quot;Store Locator&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Order Management&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-74&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/order-management-solutions-for-magento-2.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:5,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/rma-for-magento-2.html&quot;,&quot;name&quot;:&quot;RMA&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/pre-order-for-magento-2.html&quot;,&quot;name&quot;:&quot;Pre Order&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/advanced-reports-for-magento-2.html&quot;,&quot;name&quot;:&quot;Advanced Reports&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;}],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Suites&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-71&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;1&quot;,&quot;content&quot;:&quot;&lt;div class=\&quot;ammenu-dropdown-wrapper -desktop\&quot;&gt;\r\n &lt;div class=\&quot;left-side\&quot;&gt;\r\n &lt;div class=\&quot;ammenu-widget-wrapper block widget mega-menu-products-list\&quot; data-amsite-js=\&quot;top-product-widget\&quot;&gt; &lt;div class=\&quot;block-title\&quot;&gt;Featured Products&lt;\/div&gt; &lt;div class=\&quot;block-content\&quot;&gt;&lt;ul class=\&quot;widget-product-items\&quot;&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/google-automated-discounts-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Google&#x20;Automated&#x20;Discounts&#x20;Premium\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/g\/o\/google-automated-discounts-for-magento-2_6568768b9b091.png\&quot; alt=\&quot;Google Automated Discounts Premium for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Google Automated Discounts Premium&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/b2b-ecommerce-suite-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to B2B&#x20;E-commerce&#x20;Premium&#x20;Solution\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon_b2b_premium_2_png.webp\&quot; alt=\&quot;B2B E-commerce Premium Solution for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;B2B E-commerce Premium Solution&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Google&#x20;Page&#x20;Speed&#x20;Optimizer&#x20;Powered&#x20;by&#x20;SpeedSize&#x2122;&#x20;AI&#x20;Pro\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/g\/o\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2_629ed9b6e2f0e_png.webp\&quot; alt=\&quot;Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro for Magento 2\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;amasty-label-container amasty-label-container-13-2699-cat amasty-label-for-2699\&quot; style=\&quot;display: none; width:111px;\&quot; data-mage-init=&#039;{\&quot;Amasty_Label\/js\/initLabel\&quot;:{ \&quot;mode\&quot;: \&quot;cat\&quot;, \&quot;isAdminArea\&quot;: \&quot;\&quot;, \&quot;config\&quot;: {\&quot;position\&quot;:\&quot;top-center\&quot;,\&quot;size\&quot;:\&quot;\&quot;,\&quot;path\&quot;:\&quot;.product-image-container, .product-item-photo, .cdz-product-top\&quot;,\&quot;mode\&quot;:\&quot;prod\&quot;,\&quot;move\&quot;:0,\&quot;product\&quot;:\&quot;2699\&quot;,\&quot;label\&quot;:13,\&quot;margin\&quot;:7,\&quot;alignment\&quot;:0,\&quot;order\&quot;:5,\&quot;redirect_url\&quot;:\&quot;\&quot;,\&quot;tooltip\&quot;:{\&quot;backgroundColor\&quot;:\&quot;\&quot;,\&quot;color\&quot;:\&quot;\&quot;,\&quot;status\&quot;:1,\&quot;content\&quot;:\&quot;\&quot;}}, \&quot;productId\&quot;: \&quot;2699\&quot;, \&quot;selector\&quot;: \&quot;.amasty-label-container-13-2699-cat\&quot; }}&#039;&gt;&lt;div class=\&quot;amlabel-text\&quot;&gt;&lt;\/div&gt; &lt;img id=\&quot;amasty-label-image-13-2699-cat\&quot; class=\&quot;amasty-label-image\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\&quot; style=\&quot;opacity: 1 !important;vertical-align: top;\&quot; title=\&quot;Google&#x20;Page&#x20;Speed&#x20;Optimizer&#x20;Powered&#x20;by&#x20;SpeedSize&#x2122;&#x20;AI&#x20;Pro&#x20;for&#x20;Magento&#x20;2\&quot; alt=\&quot;Google&#x20;Page&#x20;Speed&#x20;Optimizer&#x20;Powered&#x20;by&#x20;SpeedSize&#x2122;&#x20;AI&#x20;Pro&#x20;for&#x20;Magento&#x20;2\&quot; &gt;&lt;\/div&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;\/ul&gt;&lt;\/div&gt; &lt;a href=\&quot;\/all-magento-2-bundles\&quot; class=\&quot;block-link-below\&quot; tabindex=\&quot;0\&quot; title=\&quot;View&#x20;ready-made&#x20;bundles&#x20;list\&quot;&gt;View ready-made bundles list&lt;\/a&gt; &lt;\/div&gt;\r\n\r\n &lt;\/div&gt;\r\n &lt;div class=\&quot;right-side\&quot;&gt;\r\n &lt;!-- ko scope: \&quot;index = ammenu_columns_wrapper\&quot; --&gt; &lt;!-- ko template: getTemplate() --&gt;&lt;!-- \/ko --&gt; &lt;!-- \/ko --&gt;\r\n &lt;\/div&gt;\r\n&lt;\/div&gt;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-solutions.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:43,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html&quot;,&quot;name&quot;:&quot;Improved Layered Navigation&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;TOP&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;}},{&quot;url&quot;:&quot;https:\/\/amasty.com\/elasticsearch-for-magento-2.html&quot;,&quot;name&quot;:&quot;Elastic Search&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/mega-menu-for-magento-2.html&quot;,&quot;name&quot;:&quot;Mega Menu Pro&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;fade_in&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:700,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Support&quot;,&quot;is_category&quot;:false,&quot;id&quot;:&quot;custom-node-4&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;2&quot;,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/contacts\/&quot;,&quot;current&quot;:false,&quot;items_count&quot;:null,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:null},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:&quot;&lt;div class=\&quot;ammenu-view-all-mobile-link\&quot;&gt;\r\n &lt;a class=\&quot;ammenu-link view-all\&quot;\r\n href=\&quot;\/magento-services.html\&quot;\r\n aria-label=\&quot;Go to All Services\&quot;\r\n title=\&quot;Go to All Services\&quot;\r\n role=\&quot;link\&quot;\r\n tabindex=\&quot;0\&quot;\r\n &gt;\r\n All Services\r\n &lt;\/a&gt;\r\n&lt;\/div&gt;\r\n\r\n &lt;div class=\&quot;ammenu-widget-wrapper block widget mega-menu-products-list\&quot; data-amsite-js=\&quot;top-product-widget\&quot;&gt; &lt;div class=\&quot;block-title\&quot;&gt;Featured Services&lt;\/div&gt; &lt;div class=\&quot;block-content\&quot;&gt;&lt;ul class=\&quot;widget-product-items\&quot;&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-optimization-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;Optimization&#x20;Service\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-optimization-service_63f5d17699021.png\&quot; alt=\&quot;Magento Optimization Service\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento Optimization Service&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;2&#x20;Support&#x20;and&#x20;Maintenance&#x20;Service\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-support-and-maintenance-service_64c2674727566.png\&quot; alt=\&quot;Magento 2 Support and Maintenance Service\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento 2 Support and Maintenance Service&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-website-development-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;Website&#x20;Development\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-website-development-service_64be2084385cb.png\&quot; alt=\&quot;Magento Website Development\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento Website Development&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-2-upgrade-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;2&#x20;Upgrade&#x20;Service\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-upgrade-service_61a5e5cfefab3.png\&quot; alt=\&quot;Magento 2 Upgrade Service\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento 2 Upgrade Service&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-to-shopify-migration-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;to&#x20;Shopify&#x20;Migration&#x20;Service\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon-magento-to-shopify-migration-for-magento-2.png\&quot; alt=\&quot;Magento to Shopify Migration Service\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento to Shopify Migration Service&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;\/ul&gt;&lt;\/div&gt; &lt;a href=\&quot;\/magento-services.html\&quot; class=\&quot;block-link-below\&quot; tabindex=\&quot;0\&quot; title=\&quot;View&#x20;All&#x20;BestSellers\&quot;&gt;View All BestSellers&lt;\/a&gt; &lt;\/div&gt;\r\n\r\n\r\n&quot;,&quot;type&quot;:{&quot;value&quot;:1,&quot;label&quot;:&quot;vertical&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;High-Demand Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-111&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-development-services.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:4,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-development.html&quot;,&quot;name&quot;:&quot;Magento Custom Development&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-optimization-service.html&quot;,&quot;name&quot;:&quot;Magento Optimization&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-upgrade-service.html&quot;,&quot;name&quot;:&quot;Magento 2 Upgrade Service&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;10%&quot;,&quot;label_text_color&quot;:&quot;#ffffff&quot;,&quot;label_background_color&quot;:&quot;#f9425a&quot;}},{&quot;url&quot;:&quot;https:\/\/amasty.com\/website-development-service.html&quot;,&quot;name&quot;:&quot;Custom Website Development Services&quot;}],&quot;label&quot;:{&quot;label&quot;:&quot;TOP&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;},&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Magento Development Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-84&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-development-services.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:17,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-website-development-service.html&quot;,&quot;name&quot;:&quot;Magento Website Development&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-mobile-app-development-service.html&quot;,&quot;name&quot;:&quot;Magento Mobile App Development&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-code-audit-service.html&quot;,&quot;name&quot;:&quot;Magento Code Audit&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-outsourcing-services.html&quot;,&quot;name&quot;:&quot;Magento Outsourcing Services&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Hyva Development Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-108&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-hyva-theme-development-service.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:3,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-hyva-theme-development-service.html&quot;,&quot;name&quot;:&quot;Hyva Theme Development&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/hyva-theme-migration-service.html&quot;,&quot;name&quot;:&quot;Hyva Theme Migration&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-hyva-theme-customization-service.html&quot;,&quot;name&quot;:&quot;Hyva Theme Customization&quot;}],&quot;label&quot;:{&quot;label&quot;:&quot;HOT&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;},&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Magento Optimization Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-85&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-optimization-service.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:6,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-performance-audit.html&quot;,&quot;name&quot;:&quot;Magento Performance Audit&quot;,&quot;label&quot;:{&quot;label&quot;:&quot;FREE&quot;,&quot;label_text_color&quot;:&quot;#ffffff&quot;,&quot;label_background_color&quot;:&quot;#4d91f8&quot;}},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-seo-services.html&quot;,&quot;name&quot;:&quot;Magento SEO Services&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/website-ui-ux-audit.html&quot;,&quot;name&quot;:&quot;Website UI\/UX Audit&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Magento Maintenance Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-86&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:6,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html&quot;,&quot;name&quot;:&quot;Magento 2 Support and Maintenance&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/installation-service.html&quot;,&quot;name&quot;:&quot;Installation Service&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-security-patch.html&quot;,&quot;name&quot;:&quot;Magento Security Patch Installation&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Magento Upgrade Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-87&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-upgrade-service.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:5,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-1-to-2-migration-service.html&quot;,&quot;name&quot;:&quot;Magento 1 to 2 Migration&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-server-configuration-and-migration-service.html&quot;,&quot;name&quot;:&quot;Magento Server Configuration and Migration&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Magento Integration Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-89&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-integration-service.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:7,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/amazon-integration-for-magento-2.html&quot;,&quot;name&quot;:&quot;Magento 2 Amazon Integration&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-microsoft-dynamics-integration-service.html&quot;,&quot;name&quot;:&quot;Magento 2 Microsoft Integration&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/sap-integration-services-magento.html&quot;,&quot;name&quot;:&quot;Magento 2 SAP Integration&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-2-salesforce-integration-service.html&quot;,&quot;name&quot;:&quot;Magento 2 Salesforce Integration&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Managed Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-115&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/managed-it-service.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:4,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/managed-ecommerce-service.html&quot;,&quot;name&quot;:&quot;E-commerce Managed Services&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/managed-security-service.html&quot;,&quot;name&quot;:&quot;Managed Security Services&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/managed-magento-service.html&quot;,&quot;name&quot;:&quot;Magento Managed Services&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Shopify Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-90&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/shopify-website-development-service.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:11,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-to-shopify-migration-service.html&quot;,&quot;name&quot;:&quot;Magento to Shopify Migration&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/custom-shopify-theme-development-service.html&quot;,&quot;name&quot;:&quot;Custom Shopify Theme Development&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shopify-app-development-service.html&quot;,&quot;name&quot;:&quot;Shopify App Development&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shopify-site-speed-optimization-service.html&quot;,&quot;name&quot;:&quot;Shopify Speed Optimization&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shopify-to-woocommerce-migration-service.html&quot;,&quot;name&quot;:&quot;Shopify to WooCommerce Migration&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/shopify-integration-service.html&quot;,&quot;name&quot;:&quot;Shopify Integration&quot;}],&quot;label&quot;:{&quot;label&quot;:&quot;HOT&quot;,&quot;label_text_color&quot;:&quot;#1a1a1a&quot;,&quot;label_background_color&quot;:&quot;#ffed11&quot;},&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;E-Commerce Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-92&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-services.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:5,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/e-commerce-site-development-service.html&quot;,&quot;name&quot;:&quot;E-commerce Site Development&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/hire-magento-experts-business-models.html&quot;,&quot;name&quot;:&quot;Service Pricing Models&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/ecommerce-website-redesign-services.html&quot;,&quot;name&quot;:&quot;E-commerce Website Redesign&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;QA Testing Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-93&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/qa-testing-services.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:2,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/qa-for-ecommerce-business-service.html&quot;,&quot;name&quot;:&quot;E-commerce QA testing&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Hire Developers&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-94&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:null,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/hire-developers.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:7,&quot;top_products&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/hire-php-developer.html&quot;,&quot;name&quot;:&quot;Hire PHP Developer&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/hire-certified-magento-2-developers.html&quot;,&quot;name&quot;:&quot;Hire Magento 2 Developer&quot;},{&quot;url&quot;:&quot;https:\/\/amasty.com\/hire-shopify-developers.html&quot;,&quot;name&quot;:&quot;Hire Shopify Developers&quot;}],&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;}],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Services&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-37&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;3&quot;,&quot;content&quot;:&quot;&lt;div class=\&quot;ammenu-dropdown-wrapper -desktop\&quot;&gt;\r\n &lt;div class=\&quot;left-side\&quot;&gt;\r\n &lt;a href=\&quot;https:\/\/amasty.com\/magento-2-upgrade-service.html?utm_source=menu&amp;utm_medium=widget&amp;utm_campaign=services_banner\&quot;&gt;&lt;img src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/wysiwyg\/amasty\/banner-upgrade-service_png.webp\&quot; alt=\&quot;banner-review\&quot; style=\&quot;margin-bottom: 30px;\&quot;&gt;&lt;\/a&gt;\r\n &lt;!-- &lt;div class=\&quot;ammenu-widget-wrapper block widget mega-menu-products-list\&quot; data-amsite-js=\&quot;top-product-widget\&quot;&gt; &lt;div class=\&quot;block-title\&quot;&gt;TOP-4 Amasty services&lt;\/div&gt; &lt;div class=\&quot;block-content\&quot;&gt;&lt;ul class=\&quot;widget-product-items\&quot;&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-optimization-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;Optimization&#x20;Service\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-optimization-service_63f5d17699021_png.webp\&quot; alt=\&quot;Magento Optimization Service\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento Optimization Service&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;2&#x20;Support&#x20;and&#x20;Maintenance&#x20;Service\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-support-and-maintenance-service_64c2674727566_png.webp\&quot; alt=\&quot;Magento 2 Support and Maintenance Service\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento 2 Support and Maintenance Service&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-website-development-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;Website&#x20;Development\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-website-development-service_64be2084385cb_png.webp\&quot; alt=\&quot;Magento Website Development\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento Website Development&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;li class=\&quot;product-item\&quot;&gt;&lt;a href=\&quot;https:\/\/amasty.com\/magento-2-upgrade-service.html\&quot; class=\&quot;item-link\&quot; tabindex=\&quot;0\&quot; role=\&quot;link\&quot; title=\&quot;Go to Magento&#x20;2&#x20;Upgrade&#x20;Service\&quot;&gt; &lt;span class=\&quot;product-image-container\&quot; style=\&quot;width:160px;\&quot;&gt;&lt;span class=\&quot;product-image-wrapper\&quot; style=\&quot;padding-bottom: 100%;\&quot;&gt;&lt;img class=\&quot;product-image-photo\&quot; src=\&quot;https:\/\/cdn.amasty.com\/media\/amasty\/webp\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-upgrade-service_61a5e5cfefab3_png.webp\&quot; alt=\&quot;Magento 2 Upgrade Service\&quot;\/&gt;&lt;\/span&gt;&lt;\/span&gt; &lt;div class=\&quot;product-item-name\&quot;&gt;&lt;span class=\&quot;ammenu-text\&quot;&gt;Magento 2 Upgrade Service&lt;\/span&gt; &lt;span class=\&quot;ammenu-label\&quot;&gt;TOP&lt;\/span&gt;&lt;\/div&gt;&lt;\/a&gt;&lt;\/li&gt; &lt;\/ul&gt;&lt;\/div&gt;&lt;\/div&gt; --&gt;\r\n &lt;button class=\&quot;amform-show-popup-imitation\&quot;&gt;Show Form&lt;\/button&gt;\r\n &lt;\/div&gt;\r\n &lt;div class=\&quot;right-side\&quot;&gt;\r\n &lt;!-- ko scope: \&quot;index = ammenu_columns_wrapper\&quot; --&gt; &lt;!-- ko template: getTemplate() --&gt;&lt;!-- \/ko --&gt; &lt;!-- \/ko --&gt;\r\n &lt;\/div&gt;\r\n&lt;\/div&gt;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/magento-services.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:75,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;fade_in&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:700,&quot;mobile_font&quot;:700,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Shopify Apps&quot;,&quot;is_category&quot;:true,&quot;id&quot;:&quot;category-node-107&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;4&quot;,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/shopify-apps.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:0,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:null},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;700&quot;,&quot;mobile_font&quot;:&quot;700&quot;,&quot;icon&quot;:&quot;https:\/\/cdn.amasty.com\/media\/amasty\/ammegamenu\/Heart_2x_1.jpg&quot;,&quot;icon_extension&quot;:&quot;jpg&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Special Offers&quot;,&quot;is_category&quot;:false,&quot;id&quot;:&quot;custom-node-1&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;6&quot;,&quot;content&quot;:&quot;&lt;div class=\&quot;ammenu-custom-container -full -loyalty\&quot; &gt;\r\n &lt;ul class=\&quot;ammenu-items\&quot;&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Amasty Special Offers page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuOffers\&quot; href=\&quot;\/amasty-promo.html\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Special Offers&lt;\/span&gt; &lt;\/a&gt;&lt;\/li&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to AmastyAll Bundles page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuOffers\&quot; href=\&quot;\/all-magento-2-bundles\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;All Bundles&lt;\/span&gt; &lt;\/a&gt;&lt;\/li&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Replace Third-Party Modules Offer page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuOffers\&quot; href=\&quot;\/amasty-only-offer\/\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Replace Modules Offer&lt;\/span&gt; &lt;\/a&gt;&lt;\/li&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Custom Bundle page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuOffers\&quot; href=\&quot;\/custom-bundle.html\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Custom Bundle Offer&lt;\/span&gt; &lt;\/a&gt;&lt;\/li&gt;\r\n&lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Free Resources page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuOffers\&quot; href=\&quot;\/free-magento-resources\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Free Resources&lt;\/span&gt; &lt;\/a&gt;&lt;\/li&gt;\r\n &lt;\/ul&gt;\r\n&lt;\/div&gt;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/amasty-promo.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:&quot;0&quot;,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;400&quot;,&quot;mobile_font&quot;:&quot;400&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Loyalty Programs&quot;,&quot;is_category&quot;:false,&quot;id&quot;:&quot;custom-node-11&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;7&quot;,&quot;content&quot;:&quot;&lt;div class=\&quot;ammenu-custom-container -full -loyalty\&quot; &gt;\r\n &lt;ul class=\&quot;ammenu-items\&quot;&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Amasty Loyalty Program page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuLoyalty\&quot; href=\&quot;\/amasty-loyalty-program.html\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Amasty Loyalty Program&lt;\/span&gt; &lt;\/a&gt;&lt;\/li&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Partner Program page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuLoyalty\&quot; href=\&quot;\/partnership-program.html\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Partner Program&lt;\/span&gt; &lt;\/a&gt;&lt;\/li&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Affiliate Program page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuLoyalty\&quot; href=\&quot;\/affiliate-program.html\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Affiliate Program&lt;\/span&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n &lt;li class=\&quot;ammenu-wrapper category-item\&quot;&gt;&lt;a class=\&quot;ammenu-link\&quot; title=\&quot;go to Official Partners page\&quot; analytics-custom-menu-items=\&quot;DropDownMenuLoyalty\&quot; href=\&quot;\/partners.html\&quot;&gt;&lt;span class=\&quot;ammenu-wrapper\&quot;&gt;Official Partners&lt;\/span&gt;&lt;\/a&gt;&lt;\/li&gt;\r\n &lt;\/ul&gt;\r\n&lt;\/div&gt;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/amasty-loyalty-program.html&quot;,&quot;current&quot;:false,&quot;items_count&quot;:&quot;0&quot;,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;400&quot;,&quot;mobile_font&quot;:&quot;400&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;Blog&quot;,&quot;is_category&quot;:false,&quot;id&quot;:&quot;custom-node-2&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;8&quot;,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/blog\/&quot;,&quot;current&quot;:false,&quot;items_count&quot;:&quot;0&quot;,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;},{&quot;show_mobile_content&quot;:0,&quot;mobile_content&quot;:null,&quot;type&quot;:{&quot;value&quot;:0,&quot;label&quot;:&quot;do not show&quot;},&quot;submenu_type&quot;:false,&quot;width&quot;:0,&quot;width_value&quot;:0,&quot;column_count&quot;:4,&quot;hide_content&quot;:false,&quot;desktop_font&quot;:&quot;400&quot;,&quot;mobile_font&quot;:&quot;400&quot;,&quot;elems&quot;:[],&quot;__disableTmpl&quot;:true,&quot;name&quot;:&quot;FAQ&quot;,&quot;is_category&quot;:false,&quot;id&quot;:&quot;custom-node-10&quot;,&quot;status&quot;:1,&quot;sort_order&quot;:&quot;9&quot;,&quot;content&quot;:&quot;&quot;,&quot;url&quot;:&quot;https:\/\/amasty.com\/knowledge-base\/&quot;,&quot;current&quot;:true,&quot;items_count&quot;:&quot;0&quot;,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:&quot;none&quot;}],&quot;__disableTmpl&quot;:true,&quot;name&quot;:null,&quot;is_category&quot;:null,&quot;id&quot;:null,&quot;status&quot;:0,&quot;sort_order&quot;:null,&quot;content&quot;:null,&quot;url&quot;:null,&quot;current&quot;:true,&quot;items_count&quot;:null,&quot;hide_mobile_content&quot;:false,&quot;submenu_animation&quot;:null}, config: {&quot;is_hamburger&quot;:false,&quot;color_settings&quot;:{&quot;color_template&quot;:&quot;custom&quot;,&quot;main_menu_background&quot;:&quot;#fff&quot;,&quot;main_menu_background_hover&quot;:&quot;#FFFFFF&quot;,&quot;main_menu_text&quot;:&quot;#1a1a1a&quot;,&quot;main_menu_text_hover&quot;:&quot;#FF5B0F&quot;,&quot;submenu_background_color&quot;:&quot;#fff&quot;,&quot;submenu_background_image&quot;:&quot;&quot;,&quot;submenu_text&quot;:&quot;#1a1a1a&quot;,&quot;submenu_text_hover&quot;:&quot;#FF5B0F&quot;,&quot;current_category_color&quot;:&quot;#ff5b0f&quot;,&quot;toggle_icon_color&quot;:&quot;#1a1a1a&quot;,&quot;hamburger_icon_color&quot;:&quot;#1a1a1a&quot;},&quot;mobile_menu_title&quot;:&quot;&quot;,&quot;mobile_menu_width&quot;:1023,&quot;welcome_message&quot;:{&quot;message&quot;:&quot;Default welcome msg!&quot;},&quot;invitation_url&quot;:&quot;&quot;,&quot;hide_view_all_link&quot;:true,&quot;mobile_class&quot;:&quot;drill&quot;,&quot;is_sticky&quot;:1,&quot;is_icons_available&quot;:&quot;both&quot;,&quot;animation_time&quot;:0.2,&quot;hamburger_animation&quot;:&quot;none&quot;}, children: [], settings: {&quot;account&quot;:{&quot;is_logged_in&quot;:false,&quot;login&quot;:&quot;https:\/\/amasty.com\/customer\/account\/login\/&quot;,&quot;create&quot;:&quot;https:\/\/amasty.com\/customer\/account\/create\/&quot;,&quot;logout&quot;:&quot;https:\/\/amasty.com\/customer\/account\/logout\/&quot;,&quot;account&quot;:&quot;https:\/\/amasty.com\/customer\/account\/&quot;},&quot;switcher&quot;:{&quot;current_code&quot;:&quot;default&quot;,&quot;current_name&quot;:&quot;Amasty Store&quot;,&quot;current_store_id&quot;:&quot;1&quot;,&quot;items&quot;:[{&quot;url&quot;:&quot;https:\/\/amasty.com\/stores\/store\/redirect\/___store\/default\/uenc\/aHR0cHM6Ly9hbWFzdHkuY29tL2ZhcS9jYXRlZ29yeS92aWV3L2lkLzY5Lw~~\/___from_store\/default\/&quot;,&quot;code&quot;:&quot;default&quot;,&quot;name&quot;:&quot;Amasty Store&quot;}]},&quot;currency&quot;:[{&quot;data-post&quot;:&quot;{\&quot;action\&quot;:\&quot;https:\\\/\\\/amasty.com\\\/directory\\\/currency\\\/switch\\\/\&quot;,\&quot;data\&quot;:{\&quot;currency\&quot;:\&quot;GBP\&quot;}}&quot;,&quot;name&quot;:&quot;British Pound&quot;,&quot;code&quot;:&quot;GBP&quot;,&quot;code_title&quot;:&quot;GBP&quot;,&quot;current_currency&quot;:false},{&quot;data-post&quot;:&quot;{\&quot;action\&quot;:\&quot;https:\\\/\\\/amasty.com\\\/directory\\\/currency\\\/switch\\\/\&quot;,\&quot;data\&quot;:{\&quot;currency\&quot;:\&quot;EUR\&quot;}}&quot;,&quot;name&quot;:&quot;Euro&quot;,&quot;code&quot;:&quot;EUR&quot;,&quot;code_title&quot;:&quot;EUR&quot;,&quot;current_currency&quot;:false},{&quot;data-post&quot;:&quot;{\&quot;action\&quot;:\&quot;https:\\\/\\\/amasty.com\\\/directory\\\/currency\\\/switch\\\/\&quot;,\&quot;data\&quot;:{\&quot;currency\&quot;:\&quot;USD\&quot;}}&quot;,&quot;name&quot;:&quot;US Dollar&quot;,&quot;code&quot;:&quot;USD&quot;,&quot;code_title&quot;:&quot;USD&quot;,&quot;current_currency&quot;:true}]}, links: [] } } } }"> <!-- ko if: !$data.isMobile() --><section class="ammenu-nav-sections -topmenu "><nav class="ammenu-main-container" aria-label="Main Menu" role="navigation" data-action="navigation" style=" background: &#x23;fff; color: &#x23;1a1a1a;"><ul class="ammenu-items -root" role="menubar"> <li class="ammenu-item category-item magento® 2 extensions" data-bind=" scope: 'ammenu_topmenu_item_0', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_0': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 0, id: 'category-node-25' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 700" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">Magento® 2 Extensions</span> <span class="ammenu-count">261</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item suites" data-bind=" scope: 'ammenu_topmenu_item_1', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_1': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 1, id: 'category-node-71' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 700" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">Suites</span> <span class="ammenu-count">43</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item support" data-bind=" scope: 'ammenu_topmenu_item_2', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_2': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 2, id: 'custom-node-4' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 700" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">Support</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item services" data-bind=" scope: 'ammenu_topmenu_item_3', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_3': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 3, id: 'category-node-37' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 700" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">Services</span> <span class="ammenu-count">75</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item shopify apps" data-bind=" scope: 'ammenu_topmenu_item_4', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_4': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 4, id: 'category-node-107' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 700" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">Shopify Apps</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item special offers" data-bind=" scope: 'ammenu_topmenu_item_5', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_5': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 5, id: 'custom-node-1' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 700" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <figure class="ammenu-icon-block -icon" style=" -webkit-mask-image: url&#x28;https&#x3A;&#x2F;&#x2F;cdn.amasty.com&#x2F;media&#x2F;amasty&#x2F;ammegamenu&#x2F;Heart_2x_1.jpg&#x29;; maskImage: url&#x28;https&#x3A;&#x2F;&#x2F;cdn.amasty.com&#x2F;media&#x2F;amasty&#x2F;ammegamenu&#x2F;Heart_2x_1.jpg&#x29;; background-color: &#x23;1a1a1a; background-image: url&#x28;https&#x3A;&#x2F;&#x2F;cdn.amasty.com&#x2F;media&#x2F;amasty&#x2F;ammegamenu&#x2F;Heart_2x_1.jpg&#x29;; " data-bind=" style: { 'background-color': item.color() && item.icon ? item.color() : '' } "></figure> <p class="ammenu-text-block"><span class="ammenu-text">Special Offers</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item loyalty programs" data-bind=" scope: 'ammenu_topmenu_item_6', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_6': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 6, id: 'custom-node-11' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 400" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">Loyalty Programs</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item blog" data-bind=" scope: 'ammenu_topmenu_item_7', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_7': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 7, id: 'custom-node-2' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 400" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">Blog</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> <li class="ammenu-item category-item faq" data-bind=" scope: 'ammenu_topmenu_item_8', mageInit: { 'Magento_Ui/js/core/app': { components: { 'ammenu_topmenu_item_8': { component: 'Amasty_MegaMenuLite/js/top_menu/item', elemIndex: 8, id: 'custom-node-10' } } } }"> <!-- ko if: item.isVisible --><a class="ammenu-link" data-ammenu-js="desktop-menu-main-link" style="font-weight: 400" data-bind=" event: item.isInteractive ? { mouseenter: onMouseenter, keypress: onMouseenter, mouseleave: onMouseleave, click: onClick } : false, style: { 'color': item.color() ? item.color() : '', 'background': item.backgroundColor() ? item.backgroundColor() : '' }, attr: { href: item.url ? item.url : 'javascript:void(0)', tabindex: item.isInteractive ? '0' : '-1', role: !item.isInteractive ? 'heading' : false }, css: { '-current': item.current, '-disabled': !item.isInteractive }"> <p class="ammenu-text-block"><span class="ammenu-text">FAQ</span> </p></a> <!-- /ko --> <!-- ko scope: 'index = ammenu_submenu_wrapper' --><!-- ko template: { name: getTemplate(), data: { item: $parent.item, event: { mouseleave: function () { $parent.item.isActive(false); }, mouseenter: function () { $parent.item.isActive(true); } } } }--><!-- /ko --><!-- /ko --></li> </ul></nav></section><!-- /ko --> <!-- ko if: $data.isMobile() || $data.is_hamburger --><!-- ko scope: 'index = ammenu_sidebar_menu_wrapper' --><!-- ko template: getTemplate() --><!-- /ko --><!-- /ko --><!-- /ko --></section></header> <div class="breadcrumbs"></div><main id="maincontent" class="page-main"><div class="page messages"> <div data-placeholder="messages"></div> <div data-bind="scope: 'messages'" data-amtheme-js="page-messages"><div class="amtheme-messages" data-amtheme-js="amtheme-messages" data-bind="css: { '-sticky-message': isMessageSticky(), '-visible': isVisible() }"><!-- ko if: cookieMessages && cookieMessages.length > 0 --><div aria-atomic="true" role="alert" class="messages" data-bind="foreach: { data: cookieMessages, as: 'message' }"><div data-amtheme-js="message" data-bind="afterRender: $parent.autoHideMessage($element), attr: { class: 'message-' + message.type + ' ' + message.type + ' message', 'data-ui-id': 'message-' + message.type }"><div class="flex items-center max-w-78 mx-auto"><!-- ko if: message.type === 'success' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#064E3B" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg><!-- /ko --><!-- ko if: message.type === 'error' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#881337" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg><!-- /ko --><!-- ko if: message.type === 'notice' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#1E3A8A" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><!-- /ko --><!-- ko if: message.type === 'info' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#1E3A8A" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><!-- /ko --><!-- ko if: message.type === 'warning' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#78350F" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><!-- /ko --><div data-bind="html: $parent.prepareMessageForHtml(message.text)" class="message-text"></div><button type="button" aria-label="Close Message" class="message-close hover:text-black message-svg-icon" data-amtheme-js="message-close" data-bind="click: $parent.hideMessage.bind($parent, $element), css: { 'text-red-900': message.type === 'error', 'text-emerald-900': message.type === 'success', 'text-amber-900': message.type === 'warning', 'text-blue-900': (message.type === 'info' || message.type === 'notice')}"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /></svg></button></div></div></div><!-- /ko --><!-- ko if: messages().messages && messages().messages.length > 0 --><div aria-atomic="true" role="alert" class="messages" data-bind="foreach: { data: messages().messages, as: 'message' }"><div data-amtheme-js="message" data-bind="afterRender: $parent.autoHideMessage($element), attr: { class: 'message-' + message.type + ' ' + message.type + ' message', 'data-ui-id': 'message-' + message.type }"><div class="flex items-center max-w-78 mx-auto"><!-- ko if: message.type === 'success' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#064E3B" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /></svg><!-- /ko --><!-- ko if: message.type === 'error' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#881337" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg><!-- /ko --><!-- ko if: message.type === 'notice' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#1E3A8A" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><!-- /ko --><!-- ko if: message.type === 'info' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#1E3A8A" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><!-- /ko --><!-- ko if: message.type === 'warning' --><svg xmlns="http://www.w3.org/2000/svg" class="message-svg-icon" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="#78350F" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><!-- /ko --><span data-bind="html: $parent.prepareMessageForHtml(message.text)" class="message-text"></span> <button type="button" aria-label="Close Message" class="message-close hover:text-black message-svg-icon" data-amtheme-js="message-close" data-bind="click: $parent.hideMessage.bind($parent, $element), css: { 'text-red-900': message.type === 'error', 'text-emerald-900': message.type === 'success', 'text-amber-900': message.type === 'warning', 'text-blue-900': (message.type === 'info' || message.type === 'notice')}"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /></svg></button></div></div></div><!-- /ko --></div></div> <script data-info="not-move-to-bottom"> function initMessages() { "use strict"; return { messages: window.mageMessages || [], isEmpty() { return this.messages.reduce( function (isEmpty, message) { return isEmpty && message === undefined }, true ) }, removeMessage(messageIndex) { this.messages[messageIndex] = undefined; }, addMessages(messages, hideAfter) { messages.map((message) => { this.messages = this.messages.concat(message); if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { hideAfter = window.defaultSuccessMessageTimeout; } if (hideAfter) { this.setHideTimeOut(this.messages.length -1, hideAfter); } }); }, setHideTimeOut(messageIndex, hideAfter) { setTimeout((messageIndex) => { this.removeMessage(messageIndex); }, hideAfter, messageIndex); }, eventListeners: { ['@messages-loaded.window'](event) { this.addMessages(event.detail.messages, event.detail.hideAfter) }, ['@private-content-loaded.window'](event) { const data = event.detail.data; if ( data.messages && data.messages.messages && data.messages.messages.length ) { this.addMessages(data.messages.messages); } }, ['@clear-messages.window']() { this.messages = []; } } } }</script><section id="messages" x-data="initMessages()" x-bind="eventListeners" aria-live="assertive" role="alert" ><template x-if="!isEmpty()"><div class="w-full"><div class="messages mx-auto"><template x-for="(message, index) in messages" :key="index"><div><template x-if="message"><div class="message" :class="message.type" :ui-id="'message-' + message.type" ><div class="flex items-center max-w-78 mx-auto"><template x-if="message.type === 'success'"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-emerald-900" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m9 12 2 2 4-4m6 2a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/><title>check-circle</title></svg> </template><template x-if="message.type === 'error'"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-rose-900" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3Z"/><title>exclamation</title></svg> </template><template x-if="message.type === 'warning'"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-amber-900" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/><title>exclamation-circle</title></svg> </template><template x-if="message.type === 'info' || message.type === 'notice'"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-blue-900" width="20" height="20" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/><title>information-circle</title></svg> </template><span class="ml-2" x-html="message.text"></span> <button type="button" class="ml-auto p-0" :class="{ 'text-red-900': message.type === 'error', 'text-emerald-900': message.type === 'success', 'text-amber-900': message.type === 'warning', 'text-blue-900': (message.type === 'info' || message.type === 'notice') }" aria-label="Close message" @click.prevent="removeMessage(index)" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-current" width="20" height="20" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/></svg> </button></div></div></template></div></template></div></div></template></section></div> <a id="contentarea" tabindex="-1"></a><div class="columns"><div class="column main"><div class="amtheme-product-wrap"><div class="product media"> <a id="gallery-prev-area" tabindex="-1"></a><div class="action-skip-wrapper"> <a class="action skip gallery-next-area" href="#gallery-next-area"><span> Skip to the end of the images gallery</span></a></div> <div class="gallery-placeholder _block-content-loading -improve-desktop-view" data-gallery-role="gallery-placeholder"><img alt="main product photo" title="intro" class="lazy gallery-placeholder__image amsite-ignore-lazy-load" src="https://cdn.amasty.com/media/catalog/product/cache/442addc013119a99308eafd27d784beb/screenshots/special-occasion-coupons-for-magento-2/intro.png" /> <div class="amsite-placeholder-items"> <img class="lazy amsite-ignore-lazy-load" src="https://cdn.amasty.com/media/catalog/product/cache/d492300003ec9ae05261558b2c675287/screenshots/special-occasion-coupons-for-magento-2/intro.png" alt="automatically provide personal discounts to thousands of customers"> <img class="lazy amsite-ignore-lazy-load" src="https://cdn.amasty.com/media/catalog/product/cache/d492300003ec9ae05261558b2c675287/screenshots/special-occasion-coupons-for-magento-2/1.png" alt="send promo codes based on unique customers' events"> <img class="lazy amsite-ignore-lazy-load" src="https://cdn.amasty.com/media/catalog/product/cache/d492300003ec9ae05261558b2c675287/screenshots/special-occasion-coupons-for-magento-2/2.png" alt="fine-tune the dispatch options for each coupon type"></div></div> <div class="action-skip-wrapper"> <a class="action skip gallery-prev-area" href="#gallery-prev-area"><span> Skip to the beginning of the images gallery</span></a></div> <a id="gallery-next-area" tabindex="-1"></a> <div class="amsite-after-gallery"><div class="links-wrapper -with-book-demo"> <div class="amsite-product-link amsite-explore-demo"><button type="button" title="Explore&#x20;Demo" aria-label="Explore&#x20;Demo" class="action outline -with-icon -icon-left" data-amsite-analytics-js="explore-demo-product-page" data-product-name-analytics="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" data-amsite-js="explore-demo"><svg class="amtheme-icon -monitor" data-amsite-analytics-js="explore-demo-product-page" data-product-name-analytics="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" focusable="false"><use xlink:href="#icon-monitor"/></svg>Explore Demo</button> <div class="amsite-demo-links dropdown dropdown-switcher" data-role="dropdownDialog" data-mage-init='{"amsiteExploreDemoDropdown":{}}'><svg class="amsite-close amtheme-icon" data-amtheme-js="svg" data-amsite-js="close-dropdown"><use xlink:href="#icon-close" data-amtheme-js="id"></use></svg><ul class="items"> <li class="item"><a href="https://special-occasion-coupons-m2.magento-demo.amasty.com/admin/admin/system_config/edit/section/amasty_birth/" class="amsite-link" title="Backend&#x20;settings" aria-label="Backend&#x20;settings" target="_blank">Backend settings</a> <span class="amsite-label">configure coupon settings</span></li> </ul></div></div><!-- For case add demo links to sticky add to cart --><div class="amsite-product-link amsite-explore-demo -for-sticky" data-amsite-js="explore-demo-sticky-wrapper"><button type="button" title="Explore&#x20;Demo" aria-label="Explore&#x20;Demo" class="action outline -with-icon -icon-left" data-amsite-analytics-js="explore-demo-product-page" data-product-name-analytics="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" data-amsite-js="explore-demo-sticky"><svg class="amtheme-icon -monitor" data-amsite-analytics-js="explore-demo-product-page" data-product-name-analytics="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" focusable="false"><use xlink:href="#icon-monitor"/></svg>Explore Demo</button> <div class="amsite-demo-links dropdown dropdown-switcher" data-role="dropdownDialog" data-mage-init='{"amsiteExploreDemoDropdown":{"dropdownConfig":{"appendTo": "[data-amsite-js=explore-demo-sticky-wrapper]", "triggerTarget": "[data-amsite-js=explore-demo-sticky]"}}}'><svg class="amsite-close amtheme-icon" data-amtheme-js="svg" data-amsite-js="close-dropdown"><use xlink:href="#icon-close" data-amtheme-js="id"></use></svg><ul class="items"> <li class="item"><a href="https://special-occasion-coupons-m2.magento-demo.amasty.com/admin/admin/system_config/edit/section/amasty_birth/" class="amsite-link" title="Backend&#x20;settings" aria-label="Backend&#x20;settings" target="_blank">Backend settings</a> <span class="amsite-label">configure coupon settings</span></li> </ul></div></div> <div class="amsite-product-link -user-guide"><a href="https://amasty.com/docs/doku.php?id=magento_2:special_occasion_coupons" title="User&#x20;Guide" aria-label="User&#x20;Guide" class="action outline -with-icon" target="_blank">User Guide <svg class="amtheme-icon -external" focusable="false"><use xlink:href="#icon-external-link"/></svg></a></div> <div class="amsite-product-link -book-demo"><a class="action outline" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book&#x20;a&#x20;Live&#x20;Demo" aria-label="Book&#x20;a&#x20;Live&#x20;Demo" rel="nofollow" target="_blank">Book a Live Demo</a></div> <div class="amsite-product-link -youtube"><button type="button" title="Explore&#x20;Video" aria-label="Explore&#x20;Video" class="action outline" data-amsite-analytics-js="open-popup-youtube-video" btn-fancybox-popup="fancybox-youtube-container" >Explore Video</button></div></div> <div class="amsite-compatibility"><svg class="amtheme-icon -magento-icon" focusable="false"><use xlink:href="#icon-magento-logo"/></svg>2.3.7, 2.4.2 - 2.4.6</div> <div class="amsite-trust-budgets"> <div class="magezon-builder magezon-builder-preload"><div class="auke6mm mgz-element mgz-element-row full_width_row"><div class="mgz-element-inner auke6mm-s"><div class="inner-content mgz-container"><div class="rabmt1x mgz-element mgz-element-column mgz-col-md-4"><div class="mgz-element-inner rabmt1x-s"><div class="wmr46hs mgz-element mgz-child mgz-element-single_image mgz-image-hovers"><div class="mgz-element-inner wmr46hs-s"><div class="mgz-single-image-wrapper"><div class="mgz-single-image-inner "><img class="lazy mgz-hover-main" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/marketing/trust-badges/v2._marketplace_approved.png" alt="v2._marketplace_approved" title="" /></div></div></div></div></div></div><div class="vxtq7c3 mgz-element mgz-element-column mgz-col-md-4"><div class="mgz-element-inner vxtq7c3-s"><div class="pw5ooqx mgz-element mgz-child mgz-element-single_image mgz-image-hovers"><div class="mgz-element-inner pw5ooqx-s"><div class="mgz-single-image-wrapper"><div class="mgz-single-image-inner "><img class="lazy mgz-hover-main" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/marketing/trust-badges/hyva-default.png" alt="hyva-default" title="" /></div></div></div></div></div></div><div class="egebyb0 mgz-element mgz-element-column mgz-col-md-4"><div class="mgz-element-inner egebyb0-s"><div class="nd5lplq mgz-element mgz-child mgz-element-single_image mgz-image-hovers"><div class="mgz-element-inner nd5lplq-s"><div class="mgz-single-image-wrapper"><div class="mgz-single-image-inner "><img class="lazy mgz-hover-main" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/marketing/trust-badges/Timely_customer_support.png" alt="Timely_customer_support" title="" /></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="amtheme-product-info"><div class="amsite-product-title"> <div class="page-title-wrapper product"><h1 class="page-title" data-ui-id="page-title-wrapper" >Special Occasion Coupons <span class="page-title-label">for Magento 2</span> </h1> </div> </div><div class="amtheme-short-info"> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">5.0</p><a href="https://amasty.com/special-occasion-coupons-for-magento-2.html#reviews" class="flex max-w-[85px]" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" > <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/special-occasion-coupons-for-magento-2.html#reviews" aria-label="Reviews" >2&nbsp;<span>Reviews</span></a></div></div><div class="product-info-main"> <div class="product attribute overview"> <div class="value" ><p>Generate and send discount coupons based on birthdays, newsletter subscriptions, order placement and other events. Use custom email templates to draw customers’ attention and build their loyalty.</p></div></div> <div class="amsite-features-block"><ul class="amsite-list"> <li class="item">Generate coupons based on multiple events</li> <li class="item">Send promo codes to customers automatically</li> <li class="item">Choose the date of dispatch and set the expiry period for each coupon type</li> <li class="item">Automatically delete unused coupons</li> <li class="item">Use predefined or custom email templates</li> <li class="item">Hyva-compatible by default</li> <li class="item"><b>New!</b>Hyvä Checkout compatible by default</li> </ul></div> <div class="product-add-form -subscription-product"> <div class="product-sticky-add-form" data-mage-init='{"amStickyAddToCart":{ "selectors": { "productNameSource": "[data-ui-id=page-title-wrapper]" }, "isAjaxEnabled": "1", "ajaxAddToCartUrl": "https://amasty.com/amasty_jettheme/ajax/addToCart/", "prices": { "dataProductId": "686", "priceConfig": {"productId":686,"priceFormat":{"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":109,"adjustments":[]},"oldPrice":{"amount":109,"adjustments":[]},"basePrice":{"amount":109,"adjustments":[]},"finalPrice":{"amount":109,"adjustments":[]}},"idSuffix":"_clone","tierPrices":[],"calculationAlgorithm":"TOTAL_BASE_CALCULATION","baseOldPrice":{"amount":109,"adjustments":[]}} } }}' ></div> <form data-product-sku="special-occasion-coupons-for-magento-2" data-amtheme-js="form" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw~/product/686/" method="post" id="product_addtocart_form" data-product-name-analytics="Special Occasion Coupons for Magento 2" ><input type="hidden" name="product" value="686" /><input type="hidden" name="selected_configurable_option" value="" /><input type="hidden" name="related_product" id="related-products-field" value="" /><input type="hidden" name="item" value="686" /><input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /> <div class="product-options-wrapper qty-round" id="product-options-wrapper" data-hasrequired="&#x2A;&#x20;Required&#x20;Fields"><div class="fieldset" tabindex="0"> <div class="swatch-opt -round" data-role="swatch-options"></div> <div class="amrec-product-view hidden "><div class="amrec-purchase-option"><div class="amrec-purchase-radio"><input type="radio" class="amrec-input -radio" name="subscribe" id="radio_subscribe_product" value="subscribe" data-amrec-js="purchase-type" data-validate="{'validate-one-required-by-name':true}" data-errors-message-box="[data-amrec-js='validation-error']" checked><label for="radio_subscribe_product" class="amrec-label"></label></div></div><div data-amrec-js="validation-error"></div></div></div></div> <div class="amtheme-add-form-bottom"> <div class="amsite-subscribe-product-info"><div class="amsite-price-license-info-wrapper"><!--start tmp block--> <div class="product-info-price"><div class="price-box price-final_price" data-role="priceBox" data-product-id="686" data-price-box="product-id-686"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-686" data-price-amount="109" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$109</span></span> </span></span> </div></div> <!--end tmp block--> <div class="amsite-product-license-block ml-3 -mt-1"><span>Transparent pricing </span> <span class="amsite-tooltip-container -mobile-bottom -desktop-right"><span class="tooltip-toggle"></span> <span class="tooltip-content -license-info">We believe in being open and honest with our customers. When you buy our module, you get one <span data-amsite-js="transparent-pricing-period"></span> of free support and updates. <br><br> <span class="block mb-1 font-bold">Here&#039;s what you get:</span> <span class="font-bold">Free updates for 1 <span data-amsite-js="transparent-pricing-period"></span>:</span> You&#039;ll receive the latest versions of the module at no extra cost. <br> <span class="font-bold">Free support: </span> Our team will help you with any questions or issues after your purchase. <br> <span class="font-bold">Cancel &amp; renew options: </span> You can cancel your subscription at any time and renew it later, but keep in mind that an additional fee will apply if you choose to renew.</span></span></div> </div> <div class="product-options-bottom"> <!--start tmp block--> <div class="box-tocart"><div class="fieldset"><div class="actions"><button type="submit" title="Add to Cart" class="action primary tocart" data-amtheme-js="addtocart-button" id="product-addtocart-button"><span class="amtheme-title">Add to Cart</span></button> <div id="instant-purchase" data-bind="scope:'instant-purchase'"><!-- ko template: getTemplate() --><!-- /ko --></div></div></div></div> <!--end tmp block--> <a href="#" class="action towishlist" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":686,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw~"}}' data-action="add-to-wishlist" title="Add&#x20;to&#x20;Wish&#x20;List" aria-label="Add&#x20;to&#x20;Wish&#x20;List"><svg class="amtheme-icon -hover-bg"><use xlink:href="#icon-wishlist"/></svg><span class="amtheme-title">Add&#x20;to&#x20;Wish&#x20;List</span></a> </div> <div class="edition-type-wrapper" data-amsite-js="edition-type-wrapper"><div class="updates-info"><span data-amsite-js="period-support-and-updates">Product updates and support for 12 months</span></div><div class="after-info"><p class="after-price">Updates and support prolongation - <span class="old-price" data-amsite-js="recurring-old-price"></span> <span data-amsite-js="product-recurring-price">$69</span></p><span class="more-info" data-amtheme-js="subscription-more-info-open-"> more info </span></div><div class="amtheme-popup-block" tabindex="0" data-mage-init='{"amPopup":{"trigger": "subscription-more-info-open-"}}'><div class="popup-inner"><div class="amtheme-button-close" tabindex="0" title="Close" aria-label="Close" data-amtheme-js="popup-close"><svg class="amtheme-icon -icon-close"><use xlink:href="#icon-close" /></svg></div><div class="subscriptions-popup-details"><h2 class="title">Price details</h2><div class="product-info -first"><div class="row"><div class="name">Special Occasion Coupons for Magento 2</div></div><div class="row"><div class="info" data-amsite-js="support-and-updates-popup-text">Product updates and support service subscription included</div></div></div><div class="product-info"><div class="row"><div class="name" data-amsite-js="price-paid-day">Price to be paid today</div><div class="price"><span class="old-price" data-amsite-js="full-old-final-price"></span> <b> <span data-amsite-js="product-final-price">$109</span></b></div></div><div class="row"><div class="info">Subscription for the following <span data-amsite-js="popup-periods-support">years</span></div><div class="period -time"><span class="summ"><span class="old-price" data-amsite-js="recurring-old-price"></span> <b> <span data-amsite-js="product-recurring-price-in-popup">$69</span></b></span> / <span class="year" data-amsite-js="popup-period-support">Year</span></div></div><div class="hidden text-right am-text-small text-secondary" data-amsite-js="start-subscription-period">starting Feb 26, 2025</div></div></div></div></div></div> </div> <div class="amtheme-actions-wrap"><div class="product-social-links"> <div class="product-addto-links" data-role="add-to-links"> </div></div></div> </div></form></div> </div></div></div> <div class="amrelated-pack-wrapper" data-amrelated-js="pack-wrapper" data-pack-id="66" id="amrelated-pack-66-67bf234ae7b29"><h3 class="amrelated-title" data-amrelated-js="pack-title">Pick a combo deal with <span style="color:red;">15%</span> discount:</h3><div class="amrelated-content-wrapper"><div class="amrelated-pack-list -wide "> <div class="amrelated-pack-item -wide -discount-applied -main" data-amrelated-js="pack-item" data-item-role="main" data-product-id="686"><div class="amrelated-info"><div class="amrelated-photo-container"> <a href="https://amasty.com/special-occasion-coupons-for-magento-2.html" title="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" aria-label="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" data-amsite-js="bundle-image-link" class="amrelated-link"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/4ff0f4765f9064797651333409ff491d/s/p/special-occasion-coupons-for-magento-2_2x.png" class="lazy amrelated-photo" alt="Special Occasion Coupons for Magento 2"></a> <div class="amrelated-discount -product" data-amrelated-js="item-price-discount">15% </div></div> <div class="amrelated-details"><div class="amrelated-name"><a title="Special&#x20;Occasion&#x20;Coupons&#x20;M2" data-amsite-analytics-js="bundle-product-name" data-product-name-analytics="Special Occasion Coupons M2" aria-label="Special&#x20;Occasion&#x20;Coupons&#x20;for&#x20;Magento&#x20;2" href="https://amasty.com/special-occasion-coupons-for-magento-2.html" class="amrelated-link">Special Occasion Coupons M2</a></div> <div class="price-box"><div class="price-box price-final_price" data-role="priceBox" data-product-id="686" data-price-box="product-id-686"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-686" data-price-amount="109" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$109</span></span> </span></span> </div></div></div></div></div> <span class="amrelated-plus">+</span> <div class="amrelated-pack-items -selected" data-amrelated-js="pack-container"><div class="amrelated-background" data-amrelated-js="selected-background"></div> <div class="amrelated-pack-item -wide -discount-applied -selected" data-amrelated-js="pack-item" data-product-id="508"><div class="amrelated-info"><div class="amrelated-photo-container"> <input type="checkbox" class="amrelated-checkbox" id="amrelated-checkbox508-66-67bf234ae7b29" name="amrelated_products[508]" data-amrelated-js="checkbox" checked="checked" value="1"/><label for="amrelated-checkbox508-66-67bf234ae7b29" class="label"></label> <a href="https://amasty.com/free-gift-for-magento-2.html" title="Free&#x20;Gift&#x20;for&#x20;Magento&#x20;2" aria-label="Free&#x20;Gift&#x20;for&#x20;Magento&#x20;2" data-amsite-js="bundle-image-link" class="amrelated-link"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/4ff0f4765f9064797651333409ff491d/f/r/free-gift-for-magento-2_627a6860de3db.png" class="lazy amrelated-photo" alt="Free Gift for Magento 2"></a> <div class="amrelated-discount -product" data-amrelated-js="item-price-discount">15% </div></div> <div class="amrelated-details"><div class="amrelated-name"><a title="Free&#x20;Gift&#x20;M2" data-amsite-analytics-js="bundle-product-name" data-product-name-analytics="Free Gift M2" aria-label="Free&#x20;Gift&#x20;for&#x20;Magento&#x20;2" href="https://amasty.com/free-gift-for-magento-2.html" class="amrelated-link">Free Gift M2</a></div> <div class="price-box"><div class="price-box price-final_price" data-role="priceBox" data-product-id="508" data-price-box="product-id-508"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-508" data-price-amount="239" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$239</span></span> </span></span> </div></div></div></div></div> <span class="amrelated-plus">+</span> <div class="amrelated-pack-item -wide -discount-applied -selected" data-amrelated-js="pack-item" data-product-id="728"><div class="amrelated-info"><div class="amrelated-photo-container"> <input type="checkbox" class="amrelated-checkbox" id="amrelated-checkbox728-66-67bf234ae7b29" name="amrelated_products[728]" data-amrelated-js="checkbox" checked="checked" value="1"/><label for="amrelated-checkbox728-66-67bf234ae7b29" class="label"></label> <a href="https://amasty.com/gift-card-for-magento-2.html" title="Gift&#x20;Card&#x20;Pro&#x20;for&#x20;Magento&#x20;2" aria-label="Gift&#x20;Card&#x20;Pro&#x20;for&#x20;Magento&#x20;2" data-amsite-js="bundle-image-link" class="amrelated-link"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/4ff0f4765f9064797651333409ff491d/i/c/icon-gift-card-pro-for-magento-2_1.png" class="lazy amrelated-photo" alt="Gift Card Pro for Magento 2"></a> <div class="amrelated-discount -product" data-amrelated-js="item-price-discount">15% </div></div> <div class="amrelated-details"><div class="amrelated-name"><a title="Gift&#x20;Card&#x20;Pro&#x20;M2" data-amsite-analytics-js="bundle-product-name" data-product-name-analytics="Gift Card Pro M2" aria-label="Gift&#x20;Card&#x20;Pro&#x20;for&#x20;Magento&#x20;2" href="https://amasty.com/gift-card-for-magento-2.html" class="amrelated-link">Gift Card Pro M2</a></div> <div class="price-box"><div class="price-box price-final_price" data-role="priceBox" data-product-id="728" data-price-box="product-id-728"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-728" data-price-amount="399" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$399</span></span> </span></span> </div></div></div></div></div></div> </div><span class="amrelated-equal ">=</span> <div class="amrelated-summary-content "><div class="amrelated-price-wrapper"><div class="amrelated-full-price" data-amrelated-js="bundle-price-full"><span class="price">$747</span></div><div class="amrelated-discount -summary">Save <span class="amount" data-amrelated-js="bundle-price-discount"><span class="price">$112.05</span></span></div><div class="main price -sale" data-amrelated-js="bundle-final-price"><span class="price">$634.95</span></div></div> <div class="amrelated-tocart-wrapper"><button class="action primary" type="button" data-amrelated-js="add-to-cart" data-amtheme-js="show-bundle-popup" aria-label="Add&#x20;to&#x20;Cart" title="Add&#x20;to&#x20;Cart">Add to Cart</button></div></div></div></div> <input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /> <div id="authenticationPopup" data-bind="scope:'authenticationPopup', style: {display: 'none'}"> <!-- ko template: getTemplate() --><!-- /ko --> </div> <div class="amform-parent" x-data="{...hyva.modal()}" @amcform-hide-modal-188.window="hide"><button type="button" @click="show" data-amform-show="188" aria-label="Show&#x20;form" class="btn btn-primary inline-flex">Free Consultation</button> <div x-cloak x-spread="overlay()" x-bind="overlay()" class="am-overlay-popup"><div class="am-container-popup inset-0 max-md:!top-10"><div x-ref="dialog" role="dialog" class="am-dialog-popup rounded-lg w-full md:w-1/2 xl:w-5/12 max-h-[80vh] max-w-[80vw] group"><button @click="hide" aria-label="Close&#x20;form" class="am-close-popup"><svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg></button> <form class="rendered-form amform-form mb-12 mx-auto group-[.am-dialog-popup]:mb-0 default" id="amform-form-188" action="https://amasty.com/amasty_customform/form/submit/" enctype="multipart/form-data" method="post"><input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /><input name="form_id" type="hidden" value="188" /><input name="is_survey" type="hidden" value="0" /><div class="flex flex-col max-w-md group-[.am-dialog-popup]:max-w-3xl m-auto amform-wrapper" data-element="form-content"> <div class="grid grid-cols-6 gap-x-2 gap-y-6 items-start" id="page-1" x-ref="page1188"> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" x-data="{ focused: false, value: '' }"> <input type="text" id="first-name-form-188" name="first-name" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" data-errormsg="Please use only letters (a-z or A-Z) or numbers (0-9) in this field.No spaces or other characters are allowed." maxlength="40" pattern="^[a-zA-Z0-9 ]+$" required placeholder="Type&#x20;here..." ><label class=" label " for="first-name-form-188">First Name</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" style="default;" x-data="{ focused: false, value: '' }"> <input type="text" id="last-name-form-188" name="last-name" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" style="default;" data-errormsg="Please use only letters (a-z or A-Z) or numbers (0-9) in this field.No spaces or other characters are allowed." maxlength="255" pattern="^[a-zA-Z0-9 ]+$" required placeholder="Type&#x20;here..." ><label class=" label " for="last-name-form-188">Last Name</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" style="default;" x-data="{ focused: false, value: '' }"> <input type="email" id="email-form-188" name="email" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" style="default;" maxlength="255" required placeholder="Type&#x20;here..." ><label class=" label " for="email-form-188">Email</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" x-data="{ focused: false, value: '' }"> <input type="text" id="company-form-188" name="company" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" placeholder="Type&#x20;here..." ><label class="field-optional after:text-secondary-lighter label " for="company-form-188">Company</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" x-data="{ focused: false, value: '' }"> <textarea id="description-form-188" name="description" class="focus:border-gray-500 border-gray-300 w-full border-gray-300 w-full py-1 " maxlength="255" required x-model="value" @focus="focused = true" @blur="focused = value" rows="5" placeholder="Type&#x20;here..." ></textarea> <label class=" label " for="description-form-188">Your Message</label></div><!-- Checkboxes --> <div class="col-span-6 amcform-toolbar flex align-center items-center gap-x-2 justify-center mt-4"> <button type="submit" x-data class="btn btn-primary justify-center w-64" @click.prevent="initFormEvents188().processSubmit( $refs.page1188, $refs.tab1188, $event)">CONTACT US</button> </div></div> </div> <!--Validations--><!--Dependencies--><!--Survey--> <!--Default values--><!--Init google map--></form> </div></div></div></div> <div class="amsite-m2-product-promotion -picture"> <a class="amsite-link" href="https://amasty.com/partnership-program.html" title="Partner With Us" data-promo-id="banner-pdp-partnership" data-promo-name="SO Partnership" data-promo-creative="pdp-so-feb25" > <picture class="amsite-picture"> <source media="(min-width: 1024px)" srcset="https://cdn.amasty.com/media/wysiwyg/amasty/product_page/product_page_feb25.png 1x, https://cdn.amasty.com/media/wysiwyg/amasty/product_page/product_page_feb25_2x.png 2x"> <source media="(max-width: 1024px)" sizes="1px" srcset="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVR4nGP6DwABBQECz6AuzQAAAABJRU5ErkJggg=="> <img class="lazy amsite-img lazy" height="80" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/wysiwyg/amasty/product_page/product_page_feb25.png" alt="" > </picture> </a> </div> <div class="amtheme-productinfo-wrap"><div class="amtheme-productaside-wrap"> <div class="am-custom-tabs-wrapper mx-auto" x-data="amCustomTabs" x-init="initAmCustomTabs()" @resize.window.debounce="checkIsMobileResolution()" @visibilitychange.window.debounce="checkIsMobileResolution()" x-bind="eventListeners" x-spread="eventListeners"><template x-if="tabs.length && !isAccordion && !isMobile"><div class="am-tabs-nav"><nav class="mx-auto flex justify-between border-b-1"><template x-for="tab in tabs" :key="tab.alias"><a :href="'#' + tab.alias" :data-tab="tab.alias" role="tab" :aria-label="tab.alias" class="relative top-[1px] flex pt-1 pb-2 font-bold text-secondary focus:rounded-none hover:text-primary transition-colors text-lg analytics-product-tab-title" @click.prevent.stop="setActiveTabs(tab.name)" :class="{ 'amtab-active !text-black': tab.isActive, 'border-b-1 border-black': tab.isActive }" ><span class="analytics-product-tab-title" x-html="tab.title" :aria-label="tab.alias"></span> <template x-if="tab.alias === 'changelog' && isChangelogVersion"><span x-html="'v ' + isChangelogVersion" class="relative -top-2 text-primary ml-1 px-2 py-1 h-max am-text-extrasmall bg-gray-200 uppercase inline-block rounded-lg"></span></template></a></template></nav></div></template><div class="am-tabs w-full" role="tablist"> <div class="am-tabs-item" role="tabpanel" ><template x-if="isAccordion || isMobile"><div class="amtab-accordion-tab" role="tab"><a href="#description" data-tab="description" aria-label="description" class="flex justify-between py-4 items-center cursor-pointer w-full text-primary hover:text-primary border-b-1 analytics-product-tab-title" :class="{'border-b-1': !isActiveTab('amcustomtabs_tabs_1')}" @click.prevent.stop="setActiveTabs('amcustomtabs_tabs_1')" ><span class="title text-md md:text-lg font-semibold analytics-product-tab-title" aria-label="description">Description</span> <span class="py-1 px-1 transition-transform transform duration-300 ease-in-out" :class="{'rotate-180': isActiveTab('amcustomtabs_tabs_1')}" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="icon-arrow" width="20" height="20" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </span></a></div></template><div class="tab-content pt-5 md:pt-10 description" :class="{ 'card tab-view': !isAccordion && !isMobile, 'md:px-4 py-4 accordion-view': isAccordion, 'border-b-1': isMobile && isActiveTab('amcustomtabs_tabs_1') }" id="amcustomtabs_tabs_1" x-cloak x-show="isActiveTab('amcustomtabs_tabs_1')" ><div class="am-custom-tab am-custom-tab-1"><div class="amsite-description-tab"> <div class="magezon-builder magezon-builder-preload"><div class="rho8moi mgz-element mgz-element-row full_width_row mgz-row-equal-height content-top"><div class="mgz-element-inner rho8moi-s"><div class="inner-content mgz-container"><div class="jdlrn1f mgz-element mgz-element-column mgz-col-md-12"><div class="mgz-element-inner jdlrn1f-s"><div data-background-type="image" data-parallax-image-background-position="center top" class="mgz-parallax jdlrn1f-p"><div class="lazy-bg mgz-parallax-inner"></div></div><div class="tbo84a5 mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner tbo84a5-s"><h3>Provide personal discounts to thousands of customers</h3></div></div><div class="jltch7m mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner jltch7m-s"><div class="remark"><p>It's obvious that a timely offered discount builds customer loyalty and significantly increases the chances of conversion. But if you are running a huge online store, you'll hardly be able to generate and timely provide personal discounts to thousands of customers.</p></div><div class="grey-section -justify"><div class="color-block-text -custom-class"></div></div></div></div></div></div></div></div></div><div class="xv72136 mgz-element mgz-element-row full_width_row"><div class="mgz-element-inner xv72136-s"><div class="inner-content mgz-container"><div class="cnhyd41 mgz-element mgz-element-column mgz-col-xs-12"><div class="mgz-element-inner cnhyd41-s"><div class="rhtfvjx mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner rhtfvjx-s"><h2 style="text-align: center;">Automatically send promo codes based on unique events</h2></div></div><div class="rrlty1f mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner rrlty1f-s"><p>Smoothly create and send codes based on customer birthdays, wishlists or newsletter subscriptions. The module allows sending coupons even to the clients who haven't logged in for a specific time period or who got registered a year ago.</p><ul><li>Specify a date of dispatch as well as an expiry date for each coupon type.</li> <li>Choose among different discount variants and use custom email templates.</li> </ul></div></div></div></div></div></div></div><div class="c2au69w mgz-element mgz-element-row full_width_row"><div class="mgz-element-inner c2au69w-s"><div class="inner-content mgz-container"><div class="jeq33w0 mgz-element mgz-element-column mgz-col-md-12"><div class="mgz-element-inner jeq33w0-s"><div class="ruo4vea mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner ruo4vea-s"><h2>Generate coupons of multiple types</h2></div></div><div class="tlkeeye mgz-element mgz-element-row full_width_row"><div class="mgz-element-inner tlkeeye-s"><div class="inner-content mgz-container"><div class="v5ucwgo mgz-element mgz-element-column mgz-col-md-6"><div class="mgz-element-inner v5ucwgo-s"><div class="sakv4t5 mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner sakv4t5-s"><h3>Wishlist creation</h3></div></div><div class="gei78cv mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner gei78cv-s"><p>Wishlists clearly indicate that customers are interested in your products and are almost ready to start shopping. Use this opportunity to boost the number of orders by providing visitors with a discount once they add products to a wishlist.</p></div></div><div class="n9ap7fb mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner n9ap7fb-s"><h3>Newsletter subscriptions</h3></div></div><div class="lu4et36 mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner lu4et36-s"><p>Encourage customers to subscribe to your newsletter by offering a tempting deal. Apart from that, this is an easy and effective way to enrich your customer emails list for marketing purposes.</p></div></div><div class="u7xn0vc mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner u7xn0vc-s"><h3>Customer registration</h3></div></div><div class="iga2j4y mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner iga2j4y-s"><p>Want to motivate store visitors to buy more and increase the average order value? Just send a discount promo code right after a customer's registration.</p></div></div><div class="xl5quqv mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner xl5quqv-s"><h3>One more year since registration</h3></div></div><div class="nnte75k mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner nnte75k-s"><div class="color-block-text -custom-class-1"><p>As soon as customer retention is one of the most vital things for each store, sending 'One more year with us' promo coupons is an effective way to show your love and attention to clients.</p></div></div></div></div></div><div class="benumls mgz-element mgz-element-column mgz-col-md-6"><div class="mgz-element-inner benumls-s"><div class="fcadlra mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner fcadlra-s"><h3>Birthday coupons</h3></div></div><div class="vy2kcbi mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner vy2kcbi-s"><p>Wish customers a happy birthday by sending them special promo codes. The module will automatically dispatch emails with warm greetings and discounts on a specified date. Also, the extension is protected from abuse: the coupon code can be sent only once per year even if the user changed his birth date.</p></div></div><div class="nkqyaup mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner nkqyaup-s"><h3>No customer activity</h3></div></div><div class="qpovs5h mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner qpovs5h-s"><p>Send discount coupons to customers who haven't visited your store for a long time to motivate them come back and make purchases. This easy, but very effective step will definitely help you increase sales.</p></div></div><div class="x26hf1t mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner x26hf1t-s"><h3>Order placement</h3></div></div><div class="ntpsqan mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner ntpsqan-s"><div class="two-columns equal -justify"><div class="color-block-text -custom-class-2"><p>Offer promo codes to shoppers who have just placed an order in your store. Due to a timely sent incentive you are more likely to win their loyalty and make them return to your website for more purchases.</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="c7ee6ic mgz-element mgz-element-row full_width_row"><div class="mgz-element-inner c7ee6ic-s"><div class="inner-content mgz-container"><div class="eb46por mgz-element mgz-element-column mgz-col-xs-12"><div class="mgz-element-inner eb46por-s"><div class="n4c4rea mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner n4c4rea-s"><h2 style="text-align: center;">Advanced settings</h2></div></div><div class="mdg3fnd mgz-element mgz-element-row full_width_row mgz-row-wrap-reverse"><div class="mgz-element-inner mdg3fnd-s"><div class="inner-content mgz-container"><div class="ukhpike mgz-element mgz-element-column mgz-col-md-6"><div class="mgz-element-inner ukhpike-s"><div class="vhsdh37 mgz-element mgz-element-section"><div class="mgz-element-inner vhsdh37-s"><div class="wa8lvuq mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner wa8lvuq-s"><h3 class="blue">Fine-tune coupons dispatch</h3></div></div><div class="mieo182 mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner mieo182-s"><p><span>Configure the following options for each coupon type:</span></p></div></div><div class="hj6cchm mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner hj6cchm-s"><ul><li>Set a time period after the event when the promo code will be sent <i>(it's possible to send a birthday coupon before the birth date)</i>.</li> <li>Use a separate email template for each coupon type.</li> <li>Choose the discount type <i>(percent of product price discount; fixed amount discount; fixed amount discount for whole cart)</i>.</li> <li>Set the discount amount.</li> <li>Indicate an expiry period.</li> <li>Limit the number of coupon uses.</li> <li>Specify customer groups for which the coupon will be available.</li> <li>Set the minimal order subtotal.</li> </ul></div></div><div class="iiw1apj mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner iiw1apj-s"><p><b><span>NOTE:</span></b> You can set all these options per store view and website.</p></div></div><div class="uk0s2a8 mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner uk0s2a8-s"><h3>Automatically remove expired coupons</h3></div></div><div class="ak0i2nq mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner ak0i2nq-s"><p><span>Specify the time period after which invalid promo codes should be deleted. This way you'll be able to keep your promo code base clean and up-to-date.</span></p></div></div><div class="oivb6us mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner oivb6us-s"><h3>Customize email templates</h3></div></div><div class="rdwexkw mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner rdwexkw-s"><p><span>The extension lets you choose whether to use predefined email templates or create your own custom template for each coupon type to amaze your customers with catchy images and informative texts.</span></p></div></div></div></div></div></div><div class="kdmqk48 mgz-element mgz-element-column mgz-col-md-6"><div class="mgz-element-inner kdmqk48-s"><div class="ss97u1k mgz-element mgz-child mgz-element-single_image mgz-image-hovers"><div class="mgz-element-inner ss97u1k-s"><div class="mgz-single-image-wrapper"><div class="mgz-single-image-inner "><img class="lazy mgz-hover-main" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/extensions/special-occasion-coupons-for-magento-2/special-occasion-coupons-for-magento-2-settings.png" alt="special-occasion-coupons-for-magento-2-settings" title="" /></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="cilojua mgz-element mgz-element-row full_width_row"><div class="mgz-element-inner cilojua-s"><div class="inner-content mgz-container"><div class="rxp5iux mgz-element mgz-element-column mgz-col-xs-12"><div class="mgz-element-inner rxp5iux-s"><div class="guvers8 mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner guvers8-s"><h2 style="text-align: center;">Extra options for the comprehensive coupon management</h2></div></div></div></div></div></div></div><div class="y5km6vn mgz-element mgz-element-row full_width_row mgz-row-equal-height content-top"><div class="mgz-element-inner y5km6vn-s"><div class="inner-content mgz-container"><div class="w7ej59g mgz-element mgz-element-column mgz-col-md-6 mgz-col-sm-12 mgz-col-xs-12 mgz-row-gap-margin"><div class="mgz-element-inner w7ej59g-s pbuilder-product-featuring"><div data-background-type="image" data-parallax-image-background-position="center top" class="mgz-parallax w7ej59g-p"><div class="lazy-bg mgz-parallax-inner"></div></div><div class="ssidp6s mgz-element mgz-child mgz-element-single_image mgz-image-hovers"><div class="mgz-element-inner ssidp6s-s"><div class="mgz-single-image-wrapper"><div class="mgz-single-image-inner "><img class="lazy mgz-hover-main" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/extensions/magento-2/multiple-coupons-for-magento-2.png" alt="multiple-coupons-for-magento-2" width="111" height="111" title="" /></div></div></div></div><div class="kbr4tf0 mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner kbr4tf0-s"><h2 style="text-align: center;"><a href="https://amasty.com/multiple-coupons-for-magento-2.html">Multiple Coupons M2</a></h2></div></div><div class="q2h3cru mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner q2h3cru-s"><ul><li>Enable applying several coupons per order</li> <li>Let both guests and registered users to use coupons</li> <li>Apply coupons to orders from the admin panel</li> <li>Build a coupon hierarchy to avoid contradictions</li> </ul></div></div></div></div><div class="f99qg6q mgz-element mgz-element-column mgz-col-md-6 mgz-col-sm-12 mgz-col-xs-12 mgz-row-gap-margin"><div class="mgz-element-inner f99qg6q-s pbuilder-product-featuring"><div data-background-type="image" data-parallax-image-background-position="center top" class="mgz-parallax f99qg6q-p"><div class="lazy-bg mgz-parallax-inner"></div></div><div class="vgek7ll mgz-element mgz-child mgz-element-single_image mgz-image-hovers"><div class="mgz-element-inner vgek7ll-s"><div class="mgz-single-image-wrapper"><div class="mgz-single-image-inner "><img class="lazy mgz-hover-main" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/extensions/magento-2/generate-and-import-coupons-for-magento-2.png" alt="generate-and-import-coupons-for-magento-2" width="111" height="111" title="" /></div></div></div></div><div class="brkch2j mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner brkch2j-s"><h2 style="text-align: center;"><a href="https://amasty.com/generate-and-import-coupons-for-magento-2.html">Generate and Import Coupons M2</a></h2></div></div><div class="d9w664j mgz-element mgz-child mgz-element-text"><div class="mgz-element-inner d9w664j-s"><ul><li>View end export detailed coupon usage reports</li> <li>Generate and import coupons per cart price rules</li> <li>Use pre-made templates for the accurate codes generation</li> <li>Provide coupons via URLs</li> </ul></div></div></div></div></div></div></div></div> <div class="amsite-reason-choose"><div class="amsite-item -adobe"><div class="amsite-head"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/header-adobe.png" alt="" width="184" height="40"></div><div class="amsite-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/silver-partner-adobe.png" alt="Adobe partner logo" width="143" height="46"></div></div><div class="amsite-item -magento"><div class="amsite-head"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/header-magento.png" alt="" width="184" height="40"></div><div class="amsite-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/magento.svg" alt="Magento Marketplace logo" width="146" height="32"></div></div><div class="amsite-item -trust"><div class="amsite-head"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/header-trust.png" alt="" width="184" height="40"></div><div class="amsite-content"><div class="amsite-row"><span class="amsite-score">4.4</span> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/trust-logo.svg" width="100" height="23"></div><div class="amsite-row"><span class="amsite-text"> See 500+ verified reviews</span></div></div></div><div class="amsite-item -single"><div class="amsite-head"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/header-single.png" alt="" width="184" height="40"></div><div class="amsite-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/single.svg" alt="1 Single points of sales" width="136" height="52"></div></div><div class="amsite-item -amasty"><div class="amsite-head"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/header-amasty.png" alt="" width="184" height="40"></div><div class="amsite-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/svg/icons/reason-to-choose/amasty.svg" alt="Trusted by Customers" width="150" height="34"></div></div></div></div></div></div></div> <div class="am-tabs-item" role="tabpanel" ><template x-if="isAccordion || isMobile"><div class="amtab-accordion-tab" role="tab"><a href="#faq" data-tab="faq" aria-label="faq" class="flex justify-between py-4 items-center cursor-pointer w-full text-primary hover:text-primary border-b-1 analytics-product-tab-title" :class="{'border-b-1': !isActiveTab('amcustomtabs_tabs_4')}" @click.prevent.stop="setActiveTabs('amcustomtabs_tabs_4')" ><span class="title text-md md:text-lg font-semibold analytics-product-tab-title" aria-label="faq">FAQ</span> <span class="py-1 px-1 transition-transform transform duration-300 ease-in-out" :class="{'rotate-180': isActiveTab('amcustomtabs_tabs_4')}" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="icon-arrow" width="20" height="20" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </span></a></div></template><div class="tab-content pt-5 md:pt-10 faq" :class="{ 'card tab-view': !isAccordion && !isMobile, 'md:px-4 py-4 accordion-view': isAccordion, 'border-b-1': isMobile && isActiveTab('amcustomtabs_tabs_4') }" id="amcustomtabs_tabs_4" x-cloak x-show="isActiveTab('amcustomtabs_tabs_4')" ><div class="am-custom-tab am-custom-tab-4"><div class="amfaq-product-tab"> <div class="amfaq_questions widget"> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af22a3" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">Are Amasty extensions compatible with all themes and extensions by other vendors?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af22a3" x-ref="container_67bf234af22a3" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary">Amasty extensions work with all plugins we issued and with most 3rd-party plugins. If you come across a Magento 2 compatibility issue with any third-party module, we’ll definitely try to help you. If you face any technical issues, please create a ticket...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/are-amasty-extensions-compatible-with-all-themes-and-extensions-by-other-vendors.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">Are Amasty extensions compatible with all themes and extensions by other vendors?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234af256c()" x-init="ratingInit_67bf234af256c()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af2784" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">Will I get free support and updates?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af2784" x-ref="container_67bf234af2784" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary"> Product updates for extensions purchased before Feb 1, 2022With the transition to product subscriptions, you will receive product updates for all extensions purchased before Feb 1, 2022 throughout the entire grace period — up to Aug 1, 2022. If you ...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/will-i-get-free-support-and-updates.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">Will I get free support and updates?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234af2b3a()" x-init="ratingInit_67bf234af2b3a()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af2cd0" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">Do you have the installation service in magento?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af2cd0" x-ref="container_67bf234af2cd0" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary"> Yes, you can use installation and configuration services that are available as the part of Pro and Premium add-ons for your product subscriptions.Please note that this installation service doesn’t include uninstallation. So, if you need to completely...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/can-i-have-amasty-extension-installed.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">Do you have the installation service in magento?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234af2f77()" x-init="ratingInit_67bf234af2f77()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af30f2" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">Can I request a free trial?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af30f2" x-ref="container_67bf234af30f2" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary">Amasty doesn’t provide any trials of Magento extensions. There's one exception: Amasty extensions are provided for testing or demo purposes to our official Platinum Partners as a part of the “access to Amasty extensions for testing purposes with Composer...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/can-i-request-a-free-trial.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">Can I request a free trial?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234af322f()" x-init="ratingInit_67bf234af322f()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af3394" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">Can I test an Amasty extension on a staging site before transferring it to a live one in magento?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af3394" x-ref="container_67bf234af3394" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary">Yes, you can install any Amasty extension on a test site and configure all the settings there before doing it on your live store.</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/can-i-test-an-amasty-extension-on-a-staging-site.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">Can I test an Amasty extension on a staging site before transferring it to a live one in magento?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234af34b2()" x-init="ratingInit_67bf234af34b2()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af361b" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">How can I get a refund?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af361b" x-ref="container_67bf234af361b" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary"> Amasty offers to its Customers a thirty (30) day money-back guarantee for the Software. In case the acquired extension didn’t meet your expectations, our support team is always ready to help you. Fees for support subscriptions and any services provided...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/can-i-get-a-refund-if-an-extension-doesn-t-suit-me.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">How can I get a refund?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234af3902()" x-init="ratingInit_67bf234af3902()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af3a77" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">How can I receive a discount?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af3a77" x-ref="container_67bf234af3a77" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary"> We are now working at a loyalty program for our customers that is supposed to bring even greater benefits in the long term. While it’s not out yet, you can look through these Special Offers. New discounts and specials are added every month. To stay ...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/will-i-get-any-other-benefits.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">How can I receive a discount?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234af3d1b()" x-init="ratingInit_67bf234af3d1b()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234af3e91" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">How to update a Magento 2 Amasty extension?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234af3e91" x-ref="container_67bf234af3e91" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary"> Updating an Amasty extension follows the same process as installing a module. To update a single extension:Run the following command to update a specific Amasty extension:composer update amasty/&lt;module-name&gt; To update multiple extensions:You can...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/upgrade-magento-2-extension.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">How to update a Magento 2 Amasty extension?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234b000b1()" x-init="ratingInit_67bf234b000b1()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234b0021b" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">If I need additional features to be added to an Amasty extension, how can I ask for it in magento?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234b0021b" x-ref="container_67bf234b0021b" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary">To leave your feature request, log in to your customer account and open the Products tab. Then, scroll down to the bottom of the page, and leave your feature request in the following form: As soon as you send your request, it is considered by our ...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/how-to-ask-more-features-to-be-added-to-my-extension.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">If I need additional features to be added to an Amasty extension, how can I ask for it in magento?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234b00364()" x-init="ratingInit_67bf234b00364()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234b004c0" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">Magento 2 Amasty extensions installation</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234b004c0" x-ref="container_67bf234b004c0" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary"> Amasty extension packages include all necessary files, setup guides, and a license agreement, with some even offering example import files to simplify the process.Important: Since January 14, 2025, all Amasty extensions will only be available for installation...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/how-to-install-magento-2-extension.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">Magento 2 Amasty extensions installation</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234b00b27()" x-init="ratingInit_67bf234b00b27()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234b00cb9" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">How can I prolong support in magento?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234b00cb9" x-ref="container_67bf234b00cb9" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary"> If you have an active support service subscription, it grants you access to support services for all products purchased before Feb,1 as long as your subscription is active. Alternatively, support services are only available as the part of a product ...</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/how-can-i-prolong-support.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">How can I prolong support in magento?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234b00f5f()" x-init="ratingInit_67bf234b00f5f()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234b010fb" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">Can I change the EE extension to CE for free in magento?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234b010fb" x-ref="container_67bf234b010fb" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary">Usually, no, you can&rsquo;t exchange modules. Please, contact our support managers and they&rsquo;ll consider your case individually. &rarr; Learn more about our special offers</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/can-i-change-the-ee-extension-to-ce-for-free.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">Can I change the EE extension to CE for free in magento?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234b01219()" x-init="ratingInit_67bf234b01219()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> <div class="amquestion-wrapper border-container border-b mb-4 pb-4" x-data="{selected: null}" ><button class="flex am-text-base btn-as-text btn font-normal normal-case text-left" type="button" @click="selected !== 1 ? selected = 1 : selected = null" aria-controls="questionid_67bf234b01389" :aria-expanded="[selected === 1 ? 'true' : 'false']" ><span class="duration-300 " :class="{'rotate-45': selected === 1}"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray-500 rotate-45" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </span> <span class="question-text ml-4">How can I get a discount to re-purchase plugins in magento?</span></button> <div class="text-base relative overflow-hidden pl-10" id="questionid_67bf234b01389" x-ref="container_67bf234b01389" :tabindex="selected == 1 ? '': '-1'" x-show="selected == 1" x-cloak ><div class="mt-4 text-secondary">Usually, we don&rsquo;t provide any discounts. But you can contact us, and we&rsquo;ll consider your case individually. &rarr; Learn more about our special offers</div><div class="sm:flex items-center justify-between"> <div class="mt-2"><a href="https://amasty.com/knowledge-base/how-can-i-get-a-discount-to-re-purchase-plugins.html" class="text-blue-600 text-sm" >Read More <span class="sr-only">How can I get a discount to re-purchase plugins in magento?</span></a></div> <div class="mt-4 flex"> <div x-data="ratingData_67bf234b0148e()" x-init="ratingInit_67bf234b0148e()" x-bind="eventListeners" x-spread="eventListeners" x-show="isLoaded" class="max-xs:w-full" ><template x-for="item in items"><div class="bg-gray-100 py-3 lg:py-1 px-3 rounded text-sm"><template x-if="votingBehavior === 'yesno' || votingBehavior === 'voting'"><div class="flex items-center"><span>Was this answer helpful?</span> <a href="#" aria-label="Vote&#x20;yes" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 1)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">Yes</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 15 7-7 7 7"/><title>chevron-up</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.positiveRating" :class="{'font-bold': item.isVoted && item.isPositiveVoted}" ></span></template><span :class="{'ml-2' : votingBehavior === 'voting'}">|</span> <a href="#" aria-label="Vote&#x20;no" class="text-blue-600" :class="{ 'font-semibold': item.isVoted && !item.isPositiveVoted, 'hover:underline': votingBehavior !== 'voting' }" @click.prevent="setRating(item.id, 0)" ><template x-if="votingBehavior === 'yesno'"><span class="px-1">No</span></template><template x-if="votingBehavior === 'voting'"><span class="px-1"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="inline-block" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/><title>chevron-down</title></svg> </span></template></a> <template x-if="votingBehavior === 'voting'"><span x-text="item.negativeRating" :class="{'font-bold': item.isVoted && !item.isPositiveVoted}" ></span></template><template x-if="item.isVoted && votingBehavior !== 'voting'"><span class="amfaq-rating-data-wrapper"><span x-text="item.positiveRating"></span> <span>people of</span> <span x-text="getTotalRating(item.positiveRating, item.negativeRating)"></span> <span>found this answer helpful</span></span></template><div></template><template x-if="votingBehavior === 'average'"><div class="flex items-center max-xs:flex-col max-xs:gap-3"><span>Rate the answer?</span> <div class="flex mx-4"><template x-for="star in stars"><button type="button" class="cursor-pointer hover:!bg-transparent focus:!bg-transparent" :class="{'group faq-star-rating': star <= hovered}" :aria-label="getStarsLabel(star)" @mouseover="hovered = star" @mouseleave="hovered = 0" @click="setStarRating(item.id, star)" ><template x-if="votedQuestions[item.id] && star <= votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-yellow-400 stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template><template x-if="!votedQuestions[item.id] || star > votedQuestions[item.id]"><svg xmlns="http://www.w3.org/2000/svg" class="stroke-1 fill-transparent stroke-gray-500 group-[.faq-star-rating]:fill-yellow-400 group-[.faq-star-rating]:stroke-yellow-400 lg:w-4 lg:h-4" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" width="24" height="24" role="img"> <path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"/> <title>star</title></svg> </template></button></template></div><template x-if="isShowZeroRating(parseFloat(item.average))"><span class="text-xs text-gray-500" x-text="'Total rating: ' + parseFloat(item.average).toFixed(1)" ></span></template></div></template></div></template> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></div></div></div></div></div> </div> <div x-data="productURLData_67bf234b05cbc()" x-init="initialize()" ></div> </div></div></div></div> <div class="am-tabs-item" role="tabpanel" ><template x-if="isAccordion || isMobile"><div class="amtab-accordion-tab" role="tab"><a href="#reviews" data-tab="reviews" aria-label="reviews" class="flex justify-between py-4 items-center cursor-pointer w-full text-primary hover:text-primary border-b-1 analytics-product-tab-title" :class="{'border-b-1': !isActiveTab('amcustomtabs_tabs_3')}" @click.prevent.stop="setActiveTabs('amcustomtabs_tabs_3')" ><span class="title text-md md:text-lg font-semibold analytics-product-tab-title" aria-label="reviews">Reviews</span> <span class="py-1 px-1 transition-transform transform duration-300 ease-in-out" :class="{'rotate-180': isActiveTab('amcustomtabs_tabs_3')}" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="icon-arrow" width="20" height="20" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </span></a></div></template><div class="tab-content pt-5 md:pt-10 reviews" :class="{ 'card tab-view': !isAccordion && !isMobile, 'md:px-4 py-4 accordion-view': isAccordion, 'border-b-1': isMobile && isActiveTab('amcustomtabs_tabs_3') }" id="amcustomtabs_tabs_3" x-cloak x-show="isActiveTab('amcustomtabs_tabs_3')" ><div class="am-custom-tab am-custom-tab-3"><div class="amtabs-review"> <div class="mx-auto items-center review-list customer-reviews" id="reviews" aria-label="Customer&#x20;Reviews" x-data="amReviews()" x-bind="eventListeners"><div ><div class="amreview-info-wrapper flex justify-between flex-wrap md:flex-nowrap md:pb-10 md:border-b-1"><div class="flex flex-col w-full sm:flex-row"> <div class="flex mb-3 pb-3 border-b-2 sm:border-b-0 sm:border-r-2 sm:pb-0 sm:pr-14 sm:mr-14"><p class="mr-3 mb-0 text-5xl">5</p><div class="amreview-rating-wrapper float-left"><p class="am-text-caption uppercase font-bold mb-2 mt-1">2 reviews</p><div class="amstars-rating-container flex -ml-1" title="5&#x20;stars" > <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> </div></div></div> <div class="amreview-summary-details lg:border-r-2 border-solid border-gray-500 pr-4 pl-6 mr-auto m-0 align-middle h-fit order-3 lg:order-none basis-full lg:basis-auto" x-data="amSummaryDetails()" x-show="isVisibleDetails" x-bind="eventListeners" x-cloak> <button class="amreview-label block" rel="nofollow" @click="applyFilterByStars(5)"><label for="amreview-bar-5" class="amreview-stars inline-block min-w-[3rem] text-right text-sm text-gray-500 hover:text-amber-500 hover:cursor-pointer">5 stars</label> <progress class="amreview-bar lg:w-20 h-1.5 align-middle mx-4 [&::-webkit-progress-bar]:bg-gray-200 [&::-webkit-progress-value]:bg-yellow-300" id="amreview-bar-5" value="100" max="100"></progress><p class="amreview-text inline-block text-sm hover:text-amber-500">100% (2)</p></button> <button class="amreview-label block" rel="nofollow" @click="applyFilterByStars(4)"><label for="amreview-bar-4" class="amreview-stars inline-block min-w-[3rem] text-right text-sm text-gray-500 hover:text-amber-500 hover:cursor-pointer">4 stars</label> <progress class="amreview-bar lg:w-20 h-1.5 align-middle mx-4 [&::-webkit-progress-bar]:bg-gray-200 [&::-webkit-progress-value]:bg-yellow-300" id="amreview-bar-4" value="0" max="100"></progress><p class="amreview-text inline-block text-sm hover:text-amber-500">0% (0)</p></button> <button class="amreview-label block" rel="nofollow" @click="applyFilterByStars(3)"><label for="amreview-bar-3" class="amreview-stars inline-block min-w-[3rem] text-right text-sm text-gray-500 hover:text-amber-500 hover:cursor-pointer">3 stars</label> <progress class="amreview-bar lg:w-20 h-1.5 align-middle mx-4 [&::-webkit-progress-bar]:bg-gray-200 [&::-webkit-progress-value]:bg-yellow-300" id="amreview-bar-3" value="0" max="100"></progress><p class="amreview-text inline-block text-sm hover:text-amber-500">0% (0)</p></button> <button class="amreview-label block" rel="nofollow" @click="applyFilterByStars(2)"><label for="amreview-bar-2" class="amreview-stars inline-block min-w-[3rem] text-right text-sm text-gray-500 hover:text-amber-500 hover:cursor-pointer">2 stars</label> <progress class="amreview-bar lg:w-20 h-1.5 align-middle mx-4 [&::-webkit-progress-bar]:bg-gray-200 [&::-webkit-progress-value]:bg-yellow-300" id="amreview-bar-2" value="0" max="100"></progress><p class="amreview-text inline-block text-sm hover:text-amber-500">0% (0)</p></button> <button class="amreview-label block" rel="nofollow" @click="applyFilterByStars(1)"><label for="amreview-bar-1" class="amreview-stars inline-block min-w-[3rem] text-right text-sm text-gray-500 hover:text-amber-500 hover:cursor-pointer">1 star</label> <progress class="amreview-bar lg:w-20 h-1.5 align-middle mx-4 [&::-webkit-progress-bar]:bg-gray-200 [&::-webkit-progress-value]:bg-yellow-300" id="amreview-bar-1" value="0" max="100"></progress><p class="amreview-text inline-block text-sm hover:text-amber-500">0% (0)</p></button> </div> <div class="trustpilot-block"> <div class="flex items-center"> <span class="text-4xl mr-2"> 4.4 </span> <span class="review-trustpilot-icon inline-block"></span> </div> <a href="https://www.trustpilot.com/review/amasty.com" class="am-text-extrasmall uppercase font-bold link-as-text tracking-widest flex items-center" target="_blank"> See 500+ verified reviews <svg class="ml-1" width="14" height="14" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> <g id="heroicons-micro/arrow-top-right-on-square"> <g id="Union"> <path d="M6.21967 8.71967C5.92678 9.01256 5.92678 9.48744 6.21967 9.78033C6.51256 10.0732 6.98744 10.0732 7.28033 9.78033L12.5 4.56066V6.25C12.5 6.66421 12.8358 7 13.25 7C13.6642 7 14 6.66421 14 6.25V2.75C14 2.33579 13.6642 2 13.25 2H9.75C9.33579 2 9 2.33579 9 2.75C9 3.16421 9.33579 3.5 9.75 3.5H11.4393L6.21967 8.71967Z" /> <path d="M3.5 6.75C3.5 6.05964 4.05964 5.5 4.75 5.5H7C7.41421 5.5 7.75 5.16421 7.75 4.75C7.75 4.33579 7.41421 4 7 4H4.75C3.23122 4 2 5.23122 2 6.75V11.25C2 12.7688 3.23122 14 4.75 14H9.25C10.7688 14 12 12.7688 12 11.25V9C12 8.58579 11.6642 8.25 11.25 8.25C10.8358 8.25 10.5 8.58579 10.5 9V11.25C10.5 11.9404 9.94036 12.5 9.25 12.5H4.75C4.05964 12.5 3.5 11.9404 3.5 11.25V6.75Z" /> </g> </g> </svg> </a> </div></div> <div class="amreview-add-new mt-4 md:mt-0" x-data="initAddReviewClickBtn()" x-init="$dispatch('reload-customer-section-data')" @private-content-loaded.window="receiveCustomerData($event.detail.data)" ><a href="https://amasty.com/customer/account/login/" title="Add&#x20;Your&#x20;Review" aria-label="Add&#x20;Your&#x20;Review" @click.prevent="showAuthPopup()" id="amreview-toform" data-amreview-js="amreview-toform" data-amsl-scroll-to="#review-form" class="action secondary amreview-button min-w-[210px]">Add Your Review</a></div></div> <div class="amrev-items-block w-full py-6 md:py-0"> <ol class="items amreview-review-items"> <li class="review-item py-6 justify-between mb-0 flex-wrap border-solid border-b border-gray-300 block md:flex" data-amreview-js="review-entity" data-amreview-id="10846" itemscope itemprop="review" itemtype="http://schema.org/Review" x-data="amReviewItem()"><div class="md:w-1/4 relative mb-5"><div class="max-md:flex max-md:items-center max-md:justify-between"><div class="amreview-author break-all am-text-small mb-0 md:mr-7" itemprop="author">Hugo Ribeiro <br> <span class="text-secondary" itemprop="author">Eternal and Modern, Marketing</span> </div><p class="amreview-date text-secondary am-text-caption mb-0 md:mt-2"><time class="review-details-value" itemprop="datePublished" datetime="Jul&#x20;18,&#x20;2023">Jul 18, 2023</time></p></div></div><div class="amreview-description-wrap md:w-3/4 max-w-[100%]"><div class="amrev-desc-title items-center flex justify-between"><span class="amreview-title-review pb-3 text-lg font-bold" itemprop="name"> 10% more subscriptions after 1 month of using</span> </div> <div class="amstars-rating-container flex mb-1" title="5&#x20;stars" itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" > <meta itemprop="worstRating" content="1"/><meta itemprop="bestRating" content="100"/> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <span itemprop="ratingValue" class="hidden">100%</span> </div> <div class="my-2 break-words"> <div class="amshowmore-container" x-data="{ isHidden:false }"><span class="amreview-text block relative overflow-hidden my-1 text-ellipsis after:absolute after:bottom-1 after:right-0 after:left-0 after:pointer-events-none after:bg-gradient-to-b after:from-transparent after:to-white" :class="isHidden ? 'max-h-[6.25rem] after:h-8' : 'after:h-0'" x-cloak>After using this module for 1 month, we got 10% more subscriptions. I highly recommend it to anyone seeking to incentivize newsletter or loyalty card sign-ups.</span> </div> </div> <div class="block pt-7"><p class="font-bold">Amasty answer</p><div class="mt-1">Hi Hugo, thank you so much for the detailed feedback and for choosing Amasty&#039;s extensions! We&#039;re thrilled to hear that the module has helped you to attract more subscribers. We appreciate your recommendation and look forward to continuing to provide reliable solutions for your online store!</div></div> </div></li> <li class="review-item py-6 justify-between mb-0 flex-wrap border-solid border-b border-gray-300 block md:flex" data-amreview-js="review-entity" data-amreview-id="7096" itemscope itemprop="review" itemtype="http://schema.org/Review" x-data="amReviewItem()"><div class="md:w-1/4 relative mb-5"><div class="max-md:flex max-md:items-center max-md:justify-between"><div class="amreview-author break-all am-text-small mb-0 md:mr-7" itemprop="author">Romers </div><p class="amreview-date text-secondary am-text-caption mb-0 md:mt-2"><time class="review-details-value" itemprop="datePublished" datetime="Dec&#x20;21,&#x20;2016">Dec 21, 2016</time></p></div></div><div class="amreview-description-wrap md:w-3/4 max-w-[100%]"><div class="amrev-desc-title items-center flex justify-between"><span class="amreview-title-review pb-3 text-lg font-bold" itemprop="name">Thanks to Amasty for a new extension</span> </div> <div class="amstars-rating-container flex mb-1" title="5&#x20;stars" itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" > <meta itemprop="worstRating" content="1"/><meta itemprop="bestRating" content="100"/> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="text-yellow-300" width="20" height="20" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> <span itemprop="ratingValue" class="hidden">100%</span> </div> <div class="my-2 break-words"> <div class="amshowmore-container" x-data="{ isHidden:false }"><span class="amreview-text block relative overflow-hidden my-1 text-ellipsis after:absolute after:bottom-1 after:right-0 after:left-0 after:pointer-events-none after:bg-gradient-to-b after:from-transparent after:to-white" :class="isHidden ? 'max-h-[6.25rem] after:h-8' : 'after:h-0'" x-cloak>This product is a huge help to us. We have a big store with an endless customers’ e-mails database. Despite the high standards and expectations, in general, we are totally satisfied with the results with this Amasty’s extension. Thank you for your work!</span> </div> </div> </div></li> </ol><div class="toolbar review-toolbar amreview-toolbar-wrap"></div></div></div></div> <div x-data="hyva.modal()"> <div x-cloak x-bind="overlay('form-review-popup')" x-spread="overlay('form-review-popup')" class="am-overlay-popup z-60"><div class="am-container-popup inset-0"><div x-ref="form-review-popup" role="dialog" aria-modal="true" aria-labelledby="form-review-popup" class="am-dialog-popup w-full sm:max-w-[510px] sm:max-h-[90vh]"> <button type="button" class="am-close-popup" title="Close" aria-label="Close" role="button" x-on:click="hide()" ><svg xmlns="http://www.w3.org/2000/svg" stroke="currentColor" viewBox="0 0 24 24" class="stroke-2" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </button> <div class="mx-auto items-center" id="review-form" tabindex="0"><div class="card w-full flex flex-col items-center"><h3 class="am-title-h2 sm:text-4xl">Write your own review</h3><form class="review-form" id="review_form" @submit.prevent="submitForm()" action="https://amasty.com/review/product/post/id/686/" x-data="Object.assign(hyva.formValidation($el), initAmReviewForm_67bf234b0959a())" data-product-id="686" enctype="multipart/form-data" > <fieldset><legend class="text-xs"><span> You&#039;re reviewing:</span> <span class="font-semibold">Special Occasion Coupons for Magento 2</span></legend> <fieldset class="amreview-rating-group" name="rating-group"><div class="flex flex-col mt-4 mb-3"><div class="text-md hidden">Your Rating:</div><div><div id="product-review-table"> <div class=""><p class="text-center">Please rate name <span class="font-bold">Special Occasion Coupons for Magento 2</span> <span class="block"> from 1 to 5 stars</span></p><div class="relative flex justify-center mt-2 focus-within:ring-1 " > <div class="" @click="clickedRatingId = 1 || 0" @mouseover="hovered = 1 || 0" @mouseleave="hovered = 0;" ><label class="rating-1 m-0 cursor-pointer text-gray-400" for="Overall&#x20;extension&#x20;rating_1_67bf234b0959a" id="Overall&#x20;extension&#x20;rating_1_67bf234b0959a_label" ><span class="text-gray-400" :class="{ 'text-yellow-400' : 1 <= clickedRatingId || 1 <= hovered }" ><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" width="32" height="32" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> </span> <input class="absolute opacity-0 bottom-0 left-0 cursor-pointer" type="radio" required data-msg-required="Please&#x20;select&#x20;one&#x20;of&#x20;each&#x20;of&#x20;the&#x20;ratings&#x20;above." name="ratings[1]" id="Overall&#x20;extension&#x20;rating_1_67bf234b0959a" value="1" aria-label="1&#x20;star" /></label></div> <div class="" @click="clickedRatingId = 2 || 0" @mouseover="hovered = 2 || 0" @mouseleave="hovered = 0;" ><label class="rating-2 m-0 cursor-pointer text-gray-400" for="Overall&#x20;extension&#x20;rating_2_67bf234b0959a" id="Overall&#x20;extension&#x20;rating_2_67bf234b0959a_label" ><span class="text-gray-400" :class="{ 'text-yellow-400' : 2 <= clickedRatingId || 2 <= hovered }" ><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" width="32" height="32" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> </span> <input class="absolute opacity-0 bottom-0 left-0 cursor-pointer" type="radio" name="ratings[1]" id="Overall&#x20;extension&#x20;rating_2_67bf234b0959a" value="2" aria-label="2&#x20;stars" /></label></div> <div class="" @click="clickedRatingId = 3 || 0" @mouseover="hovered = 3 || 0" @mouseleave="hovered = 0;" ><label class="rating-3 m-0 cursor-pointer text-gray-400" for="Overall&#x20;extension&#x20;rating_3_67bf234b0959a" id="Overall&#x20;extension&#x20;rating_3_67bf234b0959a_label" ><span class="text-gray-400" :class="{ 'text-yellow-400' : 3 <= clickedRatingId || 3 <= hovered }" ><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" width="32" height="32" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> </span> <input class="absolute opacity-0 bottom-0 left-0 cursor-pointer" type="radio" name="ratings[1]" id="Overall&#x20;extension&#x20;rating_3_67bf234b0959a" value="3" aria-label="3&#x20;stars" /></label></div> <div class="" @click="clickedRatingId = 4 || 0" @mouseover="hovered = 4 || 0" @mouseleave="hovered = 0;" ><label class="rating-4 m-0 cursor-pointer text-gray-400" for="Overall&#x20;extension&#x20;rating_4_67bf234b0959a" id="Overall&#x20;extension&#x20;rating_4_67bf234b0959a_label" ><span class="text-gray-400" :class="{ 'text-yellow-400' : 4 <= clickedRatingId || 4 <= hovered }" ><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" width="32" height="32" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> </span> <input class="absolute opacity-0 bottom-0 left-0 cursor-pointer" type="radio" name="ratings[1]" id="Overall&#x20;extension&#x20;rating_4_67bf234b0959a" value="4" aria-label="4&#x20;stars" /></label></div> <div class="" @click="clickedRatingId = 5 || 0" @mouseover="hovered = 5 || 0" @mouseleave="hovered = 0;" ><label class="rating-5 m-0 cursor-pointer text-gray-400" for="Overall&#x20;extension&#x20;rating_5_67bf234b0959a" id="Overall&#x20;extension&#x20;rating_5_67bf234b0959a_label" ><span class="text-gray-400" :class="{ 'text-yellow-400' : 5 <= clickedRatingId || 5 <= hovered }" ><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" width="32" height="32" aria-hidden="true"><path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z"/></svg> </span> <input class="absolute opacity-0 bottom-0 left-0 cursor-pointer" type="radio" name="ratings[1]" id="Overall&#x20;extension&#x20;rating_5_67bf234b0959a" value="5" aria-label="5&#x20;stars" /></label></div> </div></div></div><input type="hidden" name="validate_rating" value=""/></div></div></fieldset> <div class="mt-8"><div class="am-input field field-reserved required"><input name="nickname" type="text" required id="nickname_field_67bf234b0959a" placeholder="Nickname" /><label class="label" for="nickname_field_67bf234b0959a">Nickname</label></div> <div class="am-input field field-reserved required"><input name="title" type="text" required id="summary_field_67bf234b0959a" placeholder="Summary&#x20;of&#x20;your&#x20;review" /><label class="label" for="summary_field_67bf234b0959a">Summary of your review</label></div><div class="am-input field field-reserved required"><textarea name="detail" required cols="5" id="review_field_67bf234b0959a" placeholder="Review" ></textarea> <label class="label" for="review_field_67bf234b0959a">Review</label></div><div class="am-input field field-reserved"><input name="company" type="text" id="review_company" placeholder="Company" /><label class="field-optional after:text-secondary-lighter label" for="review_company">Company </label></div><div class="am-input field field-reserved"><input name="position" type="text" id="review_position" placeholder="Position" /><label class="field-optional after:text-secondary-lighter label" for="review_position">Position </label></div> <div class="am-input field field-reserved"><textarea name="like_about" rows="3" maxlength="700" id="amreview-pros-field_67bf234b0959a" placeholder="Advantages" ></textarea> <label class="field-optional after:text-secondary-lighter label" for="amreview-pros-field_67bf234b0959a">Advantages </label></div><div class="am-input field field-reserved"><textarea name="not_like_about" rows="3" maxlength="700" id="amreview-cons-field_67bf234b0959a" placeholder="Disadvantages" ></textarea> <label class="field-optional after:text-secondary-lighter label" for="amreview-cons-field_67bf234b0959a">Disadvantages </label></div> <div class="review-field-image w-full flex !mt-3 field pl-0.5 "><label class="label mr-14 font-bold">Add your photo</label> <input class="amrev-input" name="review_images[]" accept="image/*" multiple type="file" ></div> </div></fieldset><div class="mt-3"><div class="text-center"><button type="submit" class="btn btn-primary">Send Review</button></div></div></form></div></div></div></div></div></div></div></div></div></div> <div class="am-tabs-item" role="tabpanel" ><template x-if="isAccordion || isMobile"><div class="amtab-accordion-tab" role="tab"><a href="#customization" data-tab="customization" aria-label="customization" class="flex justify-between py-4 items-center cursor-pointer w-full text-primary hover:text-primary border-b-1 analytics-product-tab-title" :class="{'border-b-1': !isActiveTab('amcustomtabs_tabs_15')}" @click.prevent.stop="setActiveTabs('amcustomtabs_tabs_15')" ><span class="title text-md md:text-lg font-semibold analytics-product-tab-title" aria-label="customization">Customization</span> <span class="py-1 px-1 transition-transform transform duration-300 ease-in-out" :class="{'rotate-180': isActiveTab('amcustomtabs_tabs_15')}" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="icon-arrow" width="20" height="20" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </span></a></div></template><div class="tab-content pt-5 md:pt-10 customization" :class="{ 'card tab-view': !isAccordion && !isMobile, 'md:px-4 py-4 accordion-view': isAccordion, 'border-b-1': isMobile && isActiveTab('amcustomtabs_tabs_15') }" id="amcustomtabs_tabs_15" x-cloak x-show="isActiveTab('amcustomtabs_tabs_15')" ><div class="am-custom-tab am-custom-tab-15"><div class="amsite-tab-content -customization"> <h2 class="amsite-title">Do you need specific features added so you can achieve your business goals?</h2> <p class=amsite-text>Drop us a line and we'll customize this extension for you!</p> </div> <form class="rendered-form amform-form mb-12 mx-auto group-[.am-dialog-popup]:mb-0 default" id="amform-form-9" action="https://amasty.com/amasty_customform/form/submit/" enctype="multipart/form-data" method="post"><input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /><input name="form_id" type="hidden" value="9" /><input name="is_survey" type="hidden" value="0" /><div class="flex flex-col max-w-md group-[.am-dialog-popup]:max-w-3xl m-auto amform-wrapper" data-element="form-content"> <div class="grid grid-cols-6 gap-x-2 gap-y-6 items-start" id="page-1" x-ref="page19"> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" x-data="{ focused: false, value: '' }"> <input type="text" id="first-name-form-9" name="first-name" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" maxlength="40" required placeholder="Type&#x20;here..." ><label class=" label " for="first-name-form-9">First Name</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" style="default;" x-data="{ focused: false, value: '' }"> <input type="text" id="last-name-form-9" name="last-name" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" style="default;" maxlength="255" required placeholder="Type&#x20;here..." ><label class=" label " for="last-name-form-9">Last Name</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" style="default;" x-data="{ focused: false, value: '' }"> <input type="email" id="email-form-9" name="email" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" style="default;" maxlength="255" required placeholder="Type&#x20;here..." ><label class=" label " for="email-form-9">Business email</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" style="default;" x-data="{ focused: false, value: '' }"> <input type="text" id="phone-form-9" name="phone" class=" border-gray-300 w-full border-gray-300 w-full py-1 " x-model="value" @focus="focused = true" @blur="focused = value" style="default;" maxlength="255" required placeholder="Type&#x20;here..." ><label class=" label " for="phone-form-9">Business Phone Number</label></div><!-- Dropdown / Select --> <!-- Simple input --> <div class="am-input field field-reserved col-span-6 form-control mb-1 fieldset-block relative" x-data="{ focused: false, value: '' }"> <textarea id="description-form-9" name="description" class="focus:border-gray-500 border-gray-300 w-full border-gray-300 w-full py-1 " maxlength="255" required x-model="value" @focus="focused = true" @blur="focused = value" rows="4" placeholder="Type&#x20;here..." ></textarea> <label class=" label " for="description-form-9">What&#039;s your wish?</label></div><!-- Checkboxes --> <div class="col-span-6 amcform-toolbar flex align-center items-center gap-x-2 justify-center mt-4"> <button type="submit" x-data class="btn btn-primary justify-center w-64" @click.prevent="initFormEvents9().processSubmit( $refs.page19, $refs.tab19, $event)">Send request</button> </div></div> </div> <!--Validations--><!--Dependencies--><!--Survey--> <!--Default values--><!--Init google map--></form></div></div></div> <div class="am-tabs-item" role="tabpanel" ><template x-if="isAccordion || isMobile"><div class="amtab-accordion-tab" role="tab"><a href="#changelog" data-tab="changelog" aria-label="changelog" class="flex justify-between py-4 items-center cursor-pointer w-full text-primary hover:text-primary border-b-1 analytics-product-tab-title" :class="{'border-b-1': !isActiveTab('amcustomtabs_tabs_16')}" @click.prevent.stop="setActiveTabs('amcustomtabs_tabs_16')" ><span class="title text-md md:text-lg font-semibold analytics-product-tab-title" aria-label="changelog">Change Log</span> <span class="py-1 px-1 transition-transform transform duration-300 ease-in-out" :class="{'rotate-180': isActiveTab('amcustomtabs_tabs_16')}" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="icon-arrow" width="20" height="20" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </span></a></div></template><div class="tab-content pt-5 md:pt-10 change log" :class="{ 'card tab-view': !isAccordion && !isMobile, 'md:px-4 py-4 accordion-view': isAccordion, 'border-b-1': isMobile && isActiveTab('amcustomtabs_tabs_16') }" id="amcustomtabs_tabs_16" x-cloak x-show="isActiveTab('amcustomtabs_tabs_16')" ><div class="am-custom-tab am-custom-tab-16"><div class="amsite-changelog-tab"> <div class="amsite-changelog-top"><div class="amtheme-content"><div class="amtheme-card-block flex"><p class="!mb-5">You can install extensions and updates via Composer</p><div class="amtheme-actions !mt-auto"><a class="action" title="Check&#x20;Now" aria-label="Check&#x20;Now" href="https://amasty.com/knowledge-base/upgrade-magento-2-extension.html">Check now →</a></div></div><div class="amtheme-card-block"><p>See Magento (and other software) versions we support and guarantee their compatibility with our extensions</p><div class="amtheme-actions"><a class="action" title="Check&#x20;Now" aria-label="Check&#x20;Now" href="https://amasty.com/knowledge-base/what-magento-versions-amasty-supports.html">Check now →</a></div></div></div><div class="amtheme-actions customer-login"> <a class="action secondary" href="https://amasty.com/customer/account/login/" title="My&#x20;Downloads" aria-label="My&#x20;Downloads" data-social-login-redirect="/amcustomer/account/products">My Downloads</a></div></div> <div class="changelog-block " > <div class="changelog-list" data-amsite-js="changelog-list-main"> <div class="tab-item " id="main_changelog_0" data-role="content" data-mage-init='{"amsiteChangelogAccordion": {}}'> <div class="changelog-item" data-role="collapsible" data-amsite-js="changelog-item"><div class="changelog-title" data-role="trigger" data-amsite-js="changelog-title"><span class="amsite-title">Version <span class="amsite-label">1.0.8</span></span> <div class="amsite-date">Last Update: Jun 30, 2022</div></div><div class="changelog-content" data-role="content"> <div class="amsite-date"><span class="amsite-label">1.0.8</span> - Jun 30, 2022</div><ul class="items"> <li class="item"><span class="amsite-label">Compatibility</span> now the extension is compatible with PHP up to 8.1</li> </ul> <div class="amsite-date"><span class="amsite-label">1.0.7</span> - Jan 21, 2021</div><ul class="items"> <li class="item"><span class="amsite-label">Fix</span> we solved the problem with email sending</li> </ul> <div class="amsite-date"><span class="amsite-label">1.0.6</span> - Nov 16, 2020</div><ul class="items"> <li class="item"><span class="amsite-label">Improvement</span> the code was enhanced according to Magento standards</li> </ul> <div class="amsite-date"><span class="amsite-label">1.0.5</span> - May 27, 2020</div><ul class="items"> <li class="item"><span class="amsite-label">Fix</span> we solved the problem with email sending after order place</li> </ul> <div class="amsite-date"><span class="amsite-label">1.0.4</span> - Dec 02, 2019</div><ul class="items"> <li class="item"><span class="amsite-label">Fix</span> we solved the problem with sending coupon code before order completing</li> </ul> <div class="amsite-date"><span class="amsite-label">1.0.3</span> - Mar 28, 2019</div><ul class="items"> <li class="item"><span class="amsite-label">New</span> the ability to manage all existing cron tasks on a Cron Tasks List grid in backend was added. Run cron tasks and generate their schedule by clicking the ‘Run Cron’ button. Also, delete tasks in bulk, use filtering and sorting options when it is needed.</li> </ul> <div class="amsite-date"><span class="amsite-label">1.0.2</span> - Nov 06, 2018</div><ul class="items"> <li class="item"><span class="amsite-label">Improvement</span> the code was enhanced</li> </ul> <div class="amsite-date"><span class="amsite-label">1.0.1</span> - Sep 07, 2018</div><ul class="items"> <li class="item"><span class="amsite-label">Compatibility</span> the compatibility with Magento 2.2.x was enhanced</li> </ul> </div></div> </div> </div></div></div></div></div></div></div></div><style> @media only screen and (min-width: 768px) { [id^="tab-label-amcustomtabs_tabs"][data-role="collapsible"] { max-width: 20%; } } </style> <div class="block related" data-mage-init='{"relatedProducts":{"relatedCheckbox":".related.checkbox"}}' data-limit="0" data-shuffle="0"> <div class="block-title title" id="block-related-heading" role="heading" title="Recommended&#x20;for&#x20;you" aria-level="2">Recommended for you</div><div class="block-content content" aria-labelledby="block-related-heading"><div class="products wrapper grid products-grid products-related"><ol class="products list items product-items amtheme-products-secondary amtheme-slick-slider" data-mage-init='{"slickSlider": { "isOnMobile": true, "sliderOptions": { "dots": true, "infinite": false, "slidesToShow": 5, "slidesToScroll": 5, "responsive": [ { "breakpoint": 1024, "settings": { "slidesToShow": 4, "slidesToScroll": 4 } }, { "breakpoint": 769, "settings": { "slidesToShow": 3.5, "slidesToScroll": 2, "dots": false, "arrows": false } }, { "breakpoint": 640, "settings": { "slidesToShow": 2.5, "slidesToScroll": 1, "dots": false, "arrows": false } }, { "breakpoint": 480, "settings": { "slidesToShow": 2.2, "slidesToScroll": 1, "dots": false, "arrows": false } }, { "breakpoint": 360, "settings": { "slidesToShow": 1.5, "slidesToScroll": 1, "dots": false, "arrows": false } } ] } }}'> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/multiple-coupons-for-magento-2.html" title="Multiple&#x20;Coupons&#x20;M2" aria-label="Multiple&#x20;Coupons&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/m/u/multiple-coupons-for-magento-2_2x_1.png" alt="Multiple Coupons for Magento 2"/></span></span></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Multiple&#x20;Coupons&#x20;M2" aria-label="Multiple&#x20;Coupons&#x20;M2" href="https://amasty.com/multiple-coupons-for-magento-2.html">Multiple Coupons M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="500" data-price-box="product-id-500"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-500" data-price-amount="159" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$159</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;500&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;500&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Multiple&#x20;Coupons&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/custom-stock-status-for-magento-2.html" title="Custom&#x20;Stock&#x20;Status&#x20;M2" aria-label="Custom&#x20;Stock&#x20;Status&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/c/u/custom-stock-status-for-magento-2_61a5ee69b5b75.png" alt="Custom Stock Status for Magento 2"/></span></span></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Custom&#x20;Stock&#x20;Status&#x20;M2" aria-label="Custom&#x20;Stock&#x20;Status&#x20;M2" href="https://amasty.com/custom-stock-status-for-magento-2.html">Custom Stock Status M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="504" data-price-box="product-id-504"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-504" data-price-amount="209" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$209</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;504&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;504&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Custom&#x20;Stock&#x20;Status&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/free-gift-for-magento-2.html" title="Free&#x20;Gift&#x20;M2" aria-label="Free&#x20;Gift&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/f/r/free-gift-for-magento-2_627a6860de3db.png" alt="Free Gift for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-508-cat amasty-label-for-508" style="display: none; width:111px;" data-mage-init='{"Amasty_Label/js/initLabel":{ "mode": "cat", "isAdminArea": "", "config": {"position":"top-center","size":"","path":".product-image-container, .product-item-photo, .cdz-product-top","mode":"prod","move":0,"product":"508","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "508", "selector": ".amasty-label-container-13-508-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-508-cat" class="lazy amasty-label-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/amasty/amlabel/top-rated-new-2x.png" style="opacity: 1 !important;vertical-align: top;" title="Free&#x20;Gift&#x20;for&#x20;Magento&#x20;2" alt="Free&#x20;Gift&#x20;for&#x20;Magento&#x20;2" ></div></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Free&#x20;Gift&#x20;M2" aria-label="Free&#x20;Gift&#x20;M2" href="https://amasty.com/free-gift-for-magento-2.html">Free Gift M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="508" data-price-box="product-id-508"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-508" data-price-amount="239" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$239</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;508&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;508&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Free&#x20;Gift&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/product-labels-for-magento-2.html" title="Product&#x20;Labels&#x20;M2" aria-label="Product&#x20;Labels&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/p/r/product-labels-for-magento-2_61a5ece777124.png" alt="Product Labels for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-538-cat amasty-label-for-538" style="display: none; width:111px;" data-mage-init='{"Amasty_Label/js/initLabel":{ "mode": "cat", "isAdminArea": "", "config": {"position":"top-center","size":"","path":".product-image-container, .product-item-photo, .cdz-product-top","mode":"prod","move":0,"product":"538","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "538", "selector": ".amasty-label-container-13-538-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-538-cat" class="lazy amasty-label-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/amasty/amlabel/top-rated-new-2x.png" style="opacity: 1 !important;vertical-align: top;" title="Product&#x20;Labels&#x20;for&#x20;Magento&#x20;2" alt="Product&#x20;Labels&#x20;for&#x20;Magento&#x20;2" ></div></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Product&#x20;Labels&#x20;M2" aria-label="Product&#x20;Labels&#x20;M2" href="https://amasty.com/product-labels-for-magento-2.html">Product Labels M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="538" data-price-box="product-id-538"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-538" data-price-amount="209" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$209</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;538&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;538&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Product&#x20;Labels&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/special-promotions-pro-for-magento-2.html" title="Special&#x20;Promotions&#x20;Pro&#x20;M2" aria-label="Special&#x20;Promotions&#x20;Pro&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/s/p/special-promotions-pro-for-magento-2_64d0cf2c44caf.png" alt="Special Promotions Pro for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-649-cat amasty-label-for-649" style="display: none; width:111px;" data-mage-init='{"Amasty_Label/js/initLabel":{ "mode": "cat", "isAdminArea": "", "config": {"position":"top-center","size":"","path":".product-image-container, .product-item-photo, .cdz-product-top","mode":"prod","move":0,"product":"649","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "649", "selector": ".amasty-label-container-13-649-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-649-cat" class="lazy amasty-label-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/amasty/amlabel/top-rated-new-2x.png" style="opacity: 1 !important;vertical-align: top;" title="Special&#x20;Promotions&#x20;Pro&#x20;for&#x20;Magento&#x20;2" alt="Special&#x20;Promotions&#x20;Pro&#x20;for&#x20;Magento&#x20;2" ></div></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Special&#x20;Promotions&#x20;Pro&#x20;M2" aria-label="Special&#x20;Promotions&#x20;Pro&#x20;M2" href="https://amasty.com/special-promotions-pro-for-magento-2.html">Special Promotions Pro M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="649" data-price-box="product-id-649"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-649" data-price-amount="319" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$319</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;649&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;649&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Special&#x20;Promotions&#x20;Pro&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/loyalty-program-for-magento-2.html" title="Loyalty&#x20;Program&#x20;M2" aria-label="Loyalty&#x20;Program&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/l/o/loyalty-program-for-magento-2_2x.png" alt="Loyalty Program for Magento 2"/></span></span></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Loyalty&#x20;Program&#x20;M2" aria-label="Loyalty&#x20;Program&#x20;M2" href="https://amasty.com/loyalty-program-for-magento-2.html">Loyalty Program M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="673" data-price-box="product-id-673"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-673" data-price-amount="349" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$349</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;673&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;673&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Loyalty&#x20;Program&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/generate-and-import-coupons-for-magento-2.html" title="Generate&#x20;and&#x20;Import&#x20;Coupons&#x20;M2" aria-label="Generate&#x20;and&#x20;Import&#x20;Coupons&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/g/e/generate-and-import-coupons-for-magento-2_2x.png" alt="Generate and Import Coupons for Magento 2"/></span></span></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Generate&#x20;and&#x20;Import&#x20;Coupons&#x20;M2" aria-label="Generate&#x20;and&#x20;Import&#x20;Coupons&#x20;M2" href="https://amasty.com/generate-and-import-coupons-for-magento-2.html">Generate and Import Coupons M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="707" data-price-box="product-id-707"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-707" data-price-amount="189" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$189</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;707&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;707&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Generate&#x20;and&#x20;Import&#x20;Coupons&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/gift-card-for-magento-2.html" title="Gift&#x20;Card&#x20;Pro&#x20;M2" aria-label="Gift&#x20;Card&#x20;Pro&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/i/c/icon-gift-card-pro-for-magento-2_1.png" alt="Gift Card Pro for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-14-728-cat amasty-label-for-728" style="display: none; width:111px;" data-mage-init='{"Amasty_Label/js/initLabel":{ "mode": "cat", "isAdminArea": "", "config": {"position":"top-center","size":"","path":".product-image-container, .product-item-photo, .cdz-product-top","mode":"prod","move":0,"product":"728","label":14,"margin":7,"alignment":0,"order":7,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "728", "selector": ".amasty-label-container-14-728-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-14-728-cat" class="lazy amasty-label-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/amasty/amlabel/amasty-recommended-2x.png" style="opacity: 1 !important;vertical-align: top;" title="Gift&#x20;Card&#x20;Pro&#x20;for&#x20;Magento&#x20;2" alt="Gift&#x20;Card&#x20;Pro&#x20;for&#x20;Magento&#x20;2" ></div></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Gift&#x20;Card&#x20;Pro&#x20;M2" aria-label="Gift&#x20;Card&#x20;Pro&#x20;M2" href="https://amasty.com/gift-card-for-magento-2.html">Gift Card Pro M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="728" data-price-box="product-id-728"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-728" data-price-amount="399" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$399</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;728&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;728&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Gift&#x20;Card&#x20;Pro&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/custom-options-conditions-for-magento-2.html" title="Custom&#x20;Promo&#x20;Conditions&#x20;M2" aria-label="Custom&#x20;Promo&#x20;Conditions&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/c/u/custom-promo-conditions-for-magento-2_2x.png" alt="Custom Promo Conditions for Magento 2"/></span></span></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Custom&#x20;Promo&#x20;Conditions&#x20;M2" aria-label="Custom&#x20;Promo&#x20;Conditions&#x20;M2" href="https://amasty.com/custom-options-conditions-for-magento-2.html">Custom Promo Conditions M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="921" data-price-box="product-id-921"> <span class="old-price sly-old-price no-display"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span class="price-label">Regular Price</span> <span id="old-price-921" data-price-amount="99" data-price-type="oldPrice" class="price-wrapper " ><span class="price">$99</span></span> </span></span> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-921" data-price-amount="79" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$79</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;921&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;921&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Custom&#x20;Promo&#x20;Conditions&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> <li class="item product product-item" style="display: none;"> <div class="product-item-info "><a href="https://amasty.com/product-feed-for-magento-2.html" title="Product&#x20;Feed&#x20;M2" aria-label="Product&#x20;Feed&#x20;M2" class="product photo product-item-photo"> <span class="product-image-container" style="width:222px;"><span class="product-image-wrapper" style="padding-bottom: 100%;"><img class="lazy product-image-photo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/catalog/product/cache/ba238ead2674f123f2c985de93ccf97b/p/r/product-feed-for-magento-2_63f6257390eef.png" alt="Product Feed for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-521-cat amasty-label-for-521" style="display: none; width:111px;" data-mage-init='{"Amasty_Label/js/initLabel":{ "mode": "cat", "isAdminArea": "", "config": {"position":"top-center","size":"","path":".product-image-container, .product-item-photo, .cdz-product-top","mode":"prod","move":0,"product":"521","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "521", "selector": ".amasty-label-container-13-521-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-521-cat" class="lazy amasty-label-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/media/amasty/amlabel/top-rated-new-2x.png" style="opacity: 1 !important;vertical-align: top;" title="Product&#x20;Feed&#x20;for&#x20;Magento&#x20;2" alt="Product&#x20;Feed&#x20;for&#x20;Magento&#x20;2" ></div></a> <div class="product details product-item-details"><span class="product name product-item-name "><a class="product-item-link" title="Product&#x20;Feed&#x20;M2" aria-label="Product&#x20;Feed&#x20;M2" href="https://amasty.com/product-feed-for-magento-2.html">Product Feed M2</a></span> <div class="price-box price-final_price" data-role="priceBox" data-product-id="521" data-price-box="product-id-521"> <span class="normal-price"> <span class="price-container price-final_price&#x20;tax&#x20;weee" > <span id="product-price-521" data-price-amount="229" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$229</span></span> </span></span> </div> <div class="product actions product-item-actions"> <button type="button" class="action tocart primary" data-amtheme-js="ajax-tocart" data-post='&#x7B;&quot;action&quot;&#x3A;&quot;https&#x3A;&#x5C;&#x2F;&#x5C;&#x2F;amasty.com&#x5C;&#x2F;checkout&#x5C;&#x2F;cart&#x5C;&#x2F;add&#x5C;&#x2F;uenc&#x5C;&#x2F;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&#x5C;&#x2F;product&#x5C;&#x2F;521&#x5C;&#x2F;&quot;,&quot;data&quot;&#x3A;&#x7B;&quot;product&quot;&#x3A;&quot;521&quot;,&quot;uenc&quot;&#x3A;&quot;aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw&#x7E;&quot;&#x7D;&#x7D;' title="Add&#x20;to&#x20;Cart" data-product-name-analytics="Product&#x20;Feed&#x20;M2" aria-label="Add&#x20;to&#x20;Cart">Add to Cart</button> </div></div></div></li> </ol></div></div></div> </div></div> </div></div></main><footer class="page-footer"> <div class="bg-indigo-800"><div class="p-6 text-white text-center lg:flex lg:items-center lg:justify-between lg:px-12 max-w-screen-3xl xl:px-20 xl:mx-auto"><div><h4 class="m-0 mb-2 mx-auto font-gilr max-xs:max-w-xs !text-lg xs:!text-2xl lg:mb-0 lg:text-left">Never miss an update, join our newsletter club!</h4><p class="m-0 lg:text-left">Get the news, special offers, digests in your inbox</p></div><div class="lg:ml-5 lg:grow"><form class="form subscribe" action="https://amasty.com/newsletter/subscriber/new/" method="post" x-data="Object.assign(hyva.formValidation($el), initNewsletterForm())" @submit.prevent="submitForm()" id="newsletter-validate-detail" aria-label="Subscribe&#x20;to&#x20;Newsletter" ><div class="flex max-xs:flex-col justify-center gap-2 lg:justify-end"><div class="am-input field field-reserved !mb-0 light-error-text min-w-56 lg:w-full lg:max-w-sm"><input name="email" type="email" required id="newsletter-subscribe" placeholder="Enter&#x20;your&#x20;email&#x20;address" aria-describedby="footer-newsletter-heading" ><label for="newsletter-subscribe">Email Address</label> <input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /></div> <button class="btn btn-secondary h-fit max-xs:mt-5" type="submit">Subscribe</button></div></form><script data-info="not-move-to-bottom"> function initNewsletterForm() { return { errors: 0, submitForm() { this.validate() .then(() => { const $form = document.querySelector('#newsletter-validate-detail'); if (this.errors === 0) { $form.submit(); } }) .catch((invalid) => { if (invalid.length > 0) { invalid[0].focus(); } }); } } }</script></div></div></div> <div x-data="initAmBackToTopBtn()" x-cloak @keyup.enter="$el.click()" class="p-4 bg-gray-600 transition-all hover:bg-gray-500 text-white text-center font-bold cursor-pointer am-text-small md:fixed md:right-0 md:bottom-[313px] md:z-[999] md:py-4 md:pl-2 md:pr-2 md:text-xs md:rounded-bl-xl md:rounded-tl-xl md:flex md:flex-col md:items-center md:gap-2 md:opacity-0" tabindex="0" data-role="button"><svg xmlns="http://www.w3.org/2000/svg" width="26" height="18" viewBox="0 0 30 30" fill="none" class="fill-white hidden md:!inline-block md:rotate-90" role="img"> <path fill-rule="evenodd" clip-rule="evenodd" d="M7.65685 22.0711L1.29289 15.7071C0.902369 15.3166 0.902369 14.6834 1.29289 14.2929L7.65685 7.92893C8.04738 7.53841 8.68054 7.53841 9.07107 7.92893C9.46159 8.31946 9.46159 8.95262 9.07107 9.34315L4.41421 14L28 14V16L4.41421 16L9.07107 20.6569C9.46159 21.0474 9.46159 21.6805 9.07107 22.0711C8.68054 22.4616 8.04738 22.4616 7.65685 22.0711Z"/> <title>arrow-left</title></svg> <div class="tracking-widest md:[writing-mode:tb-rl] md:rotate-180">BACK TO TOP</div></div><script data-info="not-move-to-bottom"> function initAmBackToTopBtn() { const SCROLL_THRESHOLD = 600; const CSS_CLASSES = { visibleClass: 'md:opacity-100' }; return { isMobile: true, init() { const matchMedia = window.matchMedia('(max-width: 768px)'); this.isMobile = matchMedia.matches; if (!this.isMobile) { this._addScrollListener(); } this._initClickOnBtnListeners(); }, _initClickOnBtnListeners() { this.$el.addEventListener('click', () => window.scrollTo({ top: 0, behavior: 'smooth' })); }, _addScrollListener() { window.addEventListener('scroll', this.throttle(() => { if (window.scrollY > SCROLL_THRESHOLD) { this.$el.classList.add(CSS_CLASSES.visibleClass); } else { this.$el.classList.remove(CSS_CLASSES.visibleClass); } }, 100)); }, ...AmsiteUtils() } }</script><div class="footer content"> <div class="bg-gray-800"><div class="pt-9 px-8 max-xs:px-6 lg:px-12 xl:px-20 lg:flex lg:pt-16 max-w-screen-3xl xl:mx-auto"><div class="flex lg:flex-col items-start justify-between mb-8"><div class="lg:mb-5"><div class="max-w-36 lg:max-w-none"> <a class="logo flex" href="https://amasty.com/" title="1" aria-label="store logo"><img src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/images/footer-logo.svg" title="Amasty&#x20;logo" alt="Amasty&#x20;logo" class="lazy logo-image" width="198" height="48" /></a></div> <ul class="flex items-center ul-reset mt-4 lg:mt-5"><li class="m-0"><a href="https://www.youtube.com/user/AmastyTeam?sub_confirmation=1" class="inline-block" target="_blank" aria-label="Youtube" rel="nofollow" ><svg xmlns="http://www.w3.org/2000/svg" width="23" height="28" fill="none" class="fill-gray-400 hover:fill-gray-300" role="img"><path d="M19.455 20.481H17.94l.007-.893a.72.72 0 01.713-.72h.097a.72.72 0 01.715.72l-.017.893zm-5.682-1.913c-.384 0-.698.262-.698.583v4.341c0 .32.314.581.698.581.386 0 .7-.26.7-.581v-4.34c0-.322-.314-.584-.7-.584zM23 16.14v8.258C23 26.38 21.307 28 19.237 28H3.763C1.693 28 0 26.38 0 24.398V16.14c0-1.98 1.693-3.602 3.763-3.602h15.474c2.07 0 3.763 1.621 3.763 3.602zM4.795 25.295v-8.7l1.917.002v-1.29L1.6 15.3v1.267l1.596.005v8.723h1.6zm5.75-7.403H8.946v4.645c0 .672.04 1.008-.002 1.126-.13.36-.715.743-.943.04-.038-.124-.004-.496-.005-1.134l-.006-4.677H6.4l.004 4.604c.001.705-.016 1.231.006 1.47.039.423.025.915.41 1.196.72.526 2.1-.078 2.444-.83l-.003.96 1.285.001v-7.401zm5.117 5.32l-.004-3.867c-.001-1.473-1.088-2.356-2.562-1.164l.006-2.874-1.597.002-.008 9.922 1.314-.02.12-.617c1.678 1.562 2.733.491 2.73-1.383zm5.005-.513l-1.2.006-.003.165v.679a.66.66 0 01-.655.659h-.235a.66.66 0 01-.656-.66v-1.785h2.746v-1.048c0-.767-.02-1.532-.082-1.97-.196-1.386-2.114-1.606-3.082-.897a1.83 1.83 0 00-.671.916c-.136.399-.204.943-.204 1.635v2.305c0 3.832 4.589 3.29 4.042-.005zm-6.152-12.516c.083.204.211.369.385.493.172.123.391.184.654.184.231 0 .435-.063.613-.193.177-.13.327-.324.449-.582l-.03.636h1.782v-7.69h-1.403v5.985c0 .324-.263.59-.585.59a.59.59 0 01-.584-.59V3.03h-1.464v5.188c0 .66.011 1.101.03 1.324.02.222.071.435.153.641zM9.113 5.84c0-.739.06-1.315.181-1.73.122-.415.34-.748.656-.999.315-.252.718-.379 1.208-.379.413 0 .766.083 1.061.243.297.162.526.372.684.631.162.26.271.528.33.801.06.277.09.696.09 1.26v1.945c0 .713-.029 1.238-.084 1.571-.054.334-.17.644-.351.935a1.676 1.676 0 01-.686.64 2.164 2.164 0 01-.968.206c-.406 0-.748-.057-1.03-.176a1.418 1.418 0 01-.658-.534 2.386 2.386 0 01-.335-.862c-.067-.336-.099-.842-.099-1.516l.001-2.036zm1.396 3.055c0 .435.32.79.71.79.389 0 .707-.355.707-.79V4.8c0-.434-.318-.79-.708-.79-.389 0-.709.356-.709.79v4.095zm-4.933 2.067h1.682l.001-5.899L9.247.01h-1.84L6.351 3.764 5.279 0H3.46l2.114 5.066.003 5.896z"/><title>social/social-youtube</title></svg> </a></li> <li class="m-0 ml-5"><a href="https://www.linkedin.com/company/amasty" class="inline-block" target="_blank" aria-label="Linkedin" rel="nofollow" ><svg xmlns="http://www.w3.org/2000/svg" width="23" height="23" fill="none" class="fill-gray-400 hover:fill-gray-300" role="img"><path d="M2.778 0c1.51.001 2.754 1.25 2.75 2.771C5.526 4.364 4.208 5.564 2.76 5.53 1.29 5.559-.001 4.329 0 2.761A2.775 2.775 0 012.778 0zM4.381 22.997H1.147a.76.76 0 01-.76-.762V8.405c0-.42.34-.76.76-.76h3.234c.42 0 .76.34.76.76v13.83a.76.76 0 01-.76.762zM23 12.502c0-2.9-2.345-5.25-5.237-5.25h-.83a4.646 4.646 0 00-4.076 2.411.348.348 0 00-.043-.005V7.96a.316.316 0 00-.316-.316H8.463a.316.316 0 00-.315.316v14.72c0 .175.141.317.315.317h4.123a.316.316 0 00.316-.315v-8.505c0-1.47 1.17-2.69 2.636-2.707a2.667 2.667 0 012.698 2.673v8.54c0 .174.141.316.315.316l4.133.001a.316.316 0 00.316-.316V12.5z"/><title>social/social-linkedin</title></svg> </a></li> <li class="m-0 ml-5"><a href="https://www.facebook.com/Amasty.Ltd" class="inline-block" target="_blank" aria-label="Facebook" rel="nofollow" ><svg xmlns="http://www.w3.org/2000/svg" width="13" height="25" fill="none" class="fill-gray-400 hover:fill-gray-300" role="img"><path d="M8.503 25.484V14.266h3.765l.564-4.372h-4.33V7.103c0-1.266.352-2.129 2.167-2.129h2.315V1.062C12.584 1.01 11.21.89 9.611.89 6.273.89 3.988 2.928 3.988 6.67v3.224H.213v4.372h3.775v11.218h4.515z"/><title>social/social-facebook</title></svg> </a></li> <li class="m-0 ml-5"><a href="https://twitter.com/AmastyTeam" class="inline-block" target="_blank" aria-label="Twitter" rel="nofollow" ><svg xmlns="http://www.w3.org/2000/svg" width="28" height="22" fill="none" class="fill-gray-400 hover:fill-gray-300" role="img"><path d="M8.805 22c10.567 0 16.346-8.465 16.346-15.805 0-.24 0-.48-.017-.718A11.482 11.482 0 0028 2.6c-1.049.45-2.16.744-3.3.874A5.611 5.611 0 0027.227.403a11.754 11.754 0 01-3.648 1.348 5.813 5.813 0 00-3.26-1.678 5.921 5.921 0 00-3.642.585 5.641 5.641 0 00-2.523 2.606 5.392 5.392 0 00-.365 3.553A16.748 16.748 0 017.23 5.133a16.22 16.22 0 01-5.281-4.12 5.4 5.4 0 00-.63 4.049 5.562 5.562 0 002.408 3.367 5.851 5.851 0 01-2.607-.695v.07c0 1.282.46 2.525 1.3 3.518a5.784 5.784 0 003.309 1.927 5.927 5.927 0 01-2.594.096 5.571 5.571 0 002.044 2.76 5.88 5.88 0 003.323 1.097 11.78 11.78 0 01-7.134 2.383c-.458-.001-.914-.028-1.368-.08a16.67 16.67 0 008.805 2.49"/><title>social/social-twitter</title></svg> </a></li></ul></div> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Magento_Theme/images/footer/new-trustpilot.svg" alt="Trustpilot logo" width="120" height="52"></div> <div x-data="initFooterLinksAccordion()" data-amsite-js="footer-links-accordion" class="lg:flex lg:justify-between lg:ml-24 xl:ml-32 lg:flex-grow lg:max-w-4xl"><details class="py-3 lg:p-0 border-b border-primary-darker lg:border-none"><summary x-data="{ isOpen: false }" @click="isOpen = $event.target.open && window.matchMedia('(max-width: 1023px)') ? true : !isOpen" class="flex justify-between items-center"><h3 class="m-0 text-gray-50">Legal</h3><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray w-5 h-5 lg:hidden" width="20" height="20" :class="{ 'rotate-180': isOpen }" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </summary><ul class="ul-reset pt-3"><li class="mb-1"><a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Terms and conditions page" href="https://amasty.com/terms-and-conditions.html"> Terms &amp; Conditions </a></li> <li class="mb-1"><a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Data processing consent page" href="https://amasty.com/data-processing-consent.html"> Data Processing Consent </a></li> <li class="mb-1"><a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Privacy policy page" href="https://amasty.com/privacy-policy.html"> Privacy Policy </a></li> <li class="mb-1"><a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to License agreement page" href="https://amasty.com/license.html"> License Agreement </a></li> <li class="mb-1"><a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Support License Agreement page" href="https://amasty.com/support-license-agreement.html"> Support License Agreement </a></li></ul></details><details class="py-3 lg:p-0 border-b border-primary-darker lg:border-none"><summary x-data="{ isOpen: false }" @click="isOpen = $event.target.open && window.matchMedia('(max-width: 1023px)') ? true : !isOpen" class="flex justify-between items-center"><h3 class="m-0 text-gray-50">Knowledge Base</h3><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray w-5 h-5 lg:hidden" width="20" height="20" :class="{ 'rotate-180': isOpen }" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </summary><ul class="ul-reset pt-3"><li class="mb-1"> <a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Knowledge page" href="https://amasty.com/knowledge-base/"> FAQ </a> </li> <li class="mb-1"> <a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Support Knowledge Base page" target="_blank" href="https://support.amasty.com/portal/en/kb"> Support Knowledge Base </a> </li> <li class="mb-1"> <a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Product Comparison page" href="https://amasty.com/extension-comparisons.html"> Product Comparison </a> </li> <li class="mb-1"> <a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to User Guides page" href="https://amasty.com/docs/doku.php?id=magento_2"> User Guides </a> </li></ul></details><details class="py-3 lg:p-0 border-b border-primary-darker lg:border-none"><summary x-data="{ isOpen: false }" @click="isOpen = $event.target.open && window.matchMedia('(max-width: 1023px)') ? true : !isOpen" class="flex justify-between items-center"><h3 class="m-0 text-gray-50">Corporate</h3><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" class="stroke-gray w-5 h-5 lg:hidden" width="20" height="20" :class="{ 'rotate-180': isOpen }" aria-hidden="true" focusable="false"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 9-7 7-7-7"/></svg> </summary><ul class="ul-reset pt-3"><li class="mb-1"> <a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to About Us page" href="https://amasty.com/about.html"> About Us </a> </li> <li class="mb-1"> <a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Media Kit page" href="https://amasty.com/about.html#media-kit"> Media Kit </a> </li> <li class="mb-1"> <a class="text-gray hover:text-gray-300 duration-200" aria-label="Go to Blog" href="https://amasty.com/blog/"> Blog </a> </li></ul></details></div><script data-info="not-move-to-bottom"> 'use strict'; function initFooterLinksAccordion() { const detailsElements = document.querySelectorAll('[data-amsite-js="footer-links-accordion"] details'); const matchMedia = window.matchMedia('(max-width: 1023px)'); function detectMobile() { return matchMedia.matches; } function setBehavior() { const isMobile = detectMobile(); if (!isMobile) { detailsElements.forEach((details) => { details.setAttribute('open', ''); details.addEventListener('click', preventClose); }); } else { detailsElements.forEach((details) => { details.removeAttribute('open'); details.removeEventListener('click', preventClose); }); } } function preventClose(e) { if (e.target.nodeName !== 'A') { e.preventDefault(); } } matchMedia.addEventListener('change', setBehavior); return { init() { setBehavior(); } } }</script></div><div class="flex gap-2 pt-7 px-6 xs:px-8 max-xs:px-6 bg-gray-800 lg:pt-16 lg:justify-center"> <img class="lazy amsite-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Magento_Theme/images/footer/paypal.svg" alt="Paypal card" ><img class="lazy amsite-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Magento_Theme/images/footer/american.svg" alt="American Express card" ><img class="lazy amsite-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Magento_Theme/images/footer/discover.svg" alt="Discover card" ><img class="lazy amsite-image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Magento_Theme/images/footer/mastercard.svg" alt="Mastercard" ><img class="lazy amsite-image" src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Magento_Theme/images/footer/visa.svg" alt="Visa card" ></div><!-- styles for cms block --><div class="hidden text-gray hover:text-gray-300 mb-1"></div></div> <div class="amtheme-footer-section"> </div></div></footer> <div x-data="{...hyva.modal(), ...initAmGdprPolicyPopup()}" x-init="initGdprPopup()" x-spread="eventListeners" x-bind="eventListeners"><div x-cloak x-spread="overlay('amgdpr-policy-popup')" x-bind="overlay('amgdpr-policy-popup')" class="fixed inset-0 flex items-center justify-center text-left bg-black bg-opacity-50 z-40"><div x-ref="amgdpr-policy-popup" role="dialog" aria-labelledby="amgdpr-policy-content" class="flex flex-col bg-white shadow-xl rounded-lg p-10 max-h-[95vh] max-w-6xl relative"><div tabindex="0" @focusin="focusAcceptButton()"></div><button @click="$dispatch('amgdpr-close-policy')" x-ref="amgdpr-close-policy" aria-label="Close" class="absolute right-4 top-4 text-gray-300 transition hover:text-black focus:drop-shadow-md hover:drop-shadow-md"><svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20" class="h-6 w-6" width="24" height="24" role="img"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 0 1 1.414 0L10 8.586l4.293-4.293a1 1 0 1 1 1.414 1.414L11.414 10l4.293 4.293a1 1 0 0 1-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 0 1-1.414-1.414L8.586 10 4.293 5.707a1 1 0 0 1 0-1.414Z" clip-rule="evenodd"/><title>x</title></svg> </button> <div class="flex w-full"><p class="w-full text-blue-500 text-3xl mb-5 ml-3" x-text="title"></p></div><div x-show="notificationText && policyData.versionChanged" class="flex w-full"><p class="mb-4 p-4 bg-yellow-100 w-full" x-text="notificationText"></p></div><div id="amgdpr-policy-content" class="max-h-[500px] overflow-auto first:mx-0 child:mx-0" tabindex="0" x-html="policyText"></div><div class="mt-8 flex w-full justify-center"><button x-focus-first @click="$dispatch('amgdpr-accept-policy')" x-ref="amgdpr-accept-policy" type="button" class="btn btn-primary uppercase font-bold" aria-label="I&#x20;have&#x20;read&#x20;and&#x20;accept">I have read and accept</button></div><div tabindex="0" @focusin="focusCloseButton()"></div></div></div></div> <style> :root { /* Bar Color Settings */ --ambar-background: #fff; --ambar-links-color: #326ed1; --ambar-policy-text: #374151; /* Buttons Color Settings */ --ambar-button-accept-color: #337ab7; --ambar-button-accept-hover-color: #337ab7; --ambar-button-accept-text: #fff; --ambar-button-accept-hover-text: #fff; --ambar-button-allow-color: #337ab7; --ambar-button-allow-hover-color: #337ab7; --ambar-button-allow-text: #fff; --ambar-button-allow-hover-text: #fff; --ambar-button-decline-color: #337ab7; --ambar-button-decline-hover-color: #337ab7; --ambar-button-decline-text: #fff; --ambar-button-decline-hover-text: #fff; --ambar-button-settings-color: #337ab7; --ambar-button-settings-hover-color: #337ab7; --ambar-button-settings-text: #fff; --ambar-button-settings-hover-text: #fff; /* Buttons Order Settings */ --ambar-button-accept-order: 0; --ambar-button-allow-order: 0; --ambar-button-settings-order: 0; --ambar-button-decline-order: 0; }</style> <section x-cloak x-data="{isLoading: false}" @amcaptcha-loading-start.window="isLoading = true" @amcaptcha-loading-stop.window="isLoading = false"> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002]" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div></section> <style> :root { --amlabel-margin-between: 7px; }</style> <div x-data="{ ...hyva.modal({ duration: 150, transitionEnter: 'transform duration-150', transitionLeave: 'transform duration-150' }), ...initAmastyCookieBar() }" x-init="initBar()" x-spread="eventListeners" x-bind="eventListeners" x-cloak id="am-cookie-bar" > <div x-cloak x-bind="overlay('am-cookie-bar')" x-spread="overlay('am-cookie-bar')" class=""><div class="fixed flex justify-center items-center text-left z-10 inset-0"><div x-ref="am-cookie-bar" role="dialog" aria-modal="true" x-no-overlay aria-label="Cookie&#x20;Bar" class="flex w-[90%] max-w-screen-md shadow-xl rounded-lg relative p-12 overflow-auto bg-container"> <div class="flex flex-col max-w-[740px] justify-center"><div class="flex w-full justify-end"><button type="button" @click="$dispatch('close-cookie-bar')" class="am-close-popup" title="Close" aria-label="Close" role="button" x-on:click="hide()" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </button></div><div class="flex w-full justify-center flex-col"> <div class="w-full"><p class="text-ambar-policy-text am-text-small text-center">We use cookies to help improve our services, make personal offers, and enhance your experience. If you do not accept optional cookies below, your experience may be affected. If you want to know more, please read the <a href="/privacy-policy.html" title="Cookie Policy">Cookie Policy</a></p></div> <div class="flex flex-wrap w-full justify-center gap-4 mt-6"> <button @click.prevent="$dispatch(&#x27;cookiebar-action-allow&#x27;)" class="ambar-btn-accept&#x20;btn&#x20;btn-secondary" data-role="action">Accept Cookies</button> <button @click.prevent="$dispatch(&#x27;cookiebar-action-settings&#x27;)" class="ambar-btn-settings&#x20;btn&#x20;btn-as-text&#x20;&#x21;px-4" data-role="action">Custom Settings</button> </div></div></div></div></div></div></div> <div x-data="{...hyva.modal(), ...initCookieBarSettings()}" x-spread="eventListeners" x-bind="eventListeners"><div x-cloak x-spread="overlay('am-cookie-bar-settings')" x-bind="overlay('am-cookie-bar-settings')" class="am-overlay-popup"><div class="am-container-popup inset-0 items-center"><div x-ref="am-cookie-bar-settings" role="dialog" aria-labelledby="cookiebar-groups" class="am-dialog-popup max-w-3xl max-h-[92vh] max-xs:!mx-4 max-lg:mx-16 !rounded-xl"><div tabindex="0" @focusin="focusDoneButton()"></div><button type="button" @click="$dispatch(hide('close-am-cookie-bar-settings'))" x-ref="ambar-settings-close" class="am-close-popup" title="Close" aria-label="Close" role="button" x-on:click="hide()" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </button> <p class="mb-7">Please select and accept your Cookies Group</p><div id="cookiebar-groups" class="max-h-[500px] overflow-auto mb-6 pr-7"> <div class="w-full flex flex-col"><template x-for="group in $store.AmastyCookieGroups.groupData" :key="group.groupId"><div class="mb-10"><div class="flex justify-between items-start mb-2"><h3 class="!text-base md:!text-xl ambar-group-title" x-text="group.name"></h3><div class="am-pretty-checkbox"><input type="checkbox" name="groups[]" x-model="group.checked" :id="`amcookie-popup-group-${group.groupId}`" :disabled="group.isEssential" :value="group.groupId" :aria-label="group.name" ><label :for="`amcookie-popup-group-${group.groupId}`"></label></div></div><p class="am-text-caption md:!text-sm ambar-group-description" x-html="group.description"></p><button class="btn btn-as-link md:!text-sm md:am-text-small" type="button" aria-label="More Information" @click="$dispatch('popup\u002Dopen\u002Dam\u002Dcookie\u002Dgroup\u002Dinfo', group)">More Information</button></div></template></div> <div x-data="{...hyva.modal(), ...initCookieGroupInfo_67bf234b1dad3()}" x-spread="eventListeners" x-bind="eventListeners"><div x-cloak x-spread="overlay('popup-am-cookie-group-info')" x-bind="overlay('popup-am-cookie-group-info')" class="am-overlay-popup"><div class="am-container-popup inset-0 items-center"><div x-ref="popup-am-cookie-group-info" role="dialog" aria-labelledby="the-label" class="am-dialog-popup max-w-7xl max-h-[92vh] max-xs:!mx-4 max-lg:mx-16 !rounded-xl"><template x-if="group"><div x-focus-first><button type="button" @click="$dispatch('popup-close-am-cookie-group-info')" x-ref="ambar-settings-close" class="am-close-popup" title="Close" aria-label="Close" role="button" x-on:click="hide()" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </button> <div class="md:flex md:justify-start pb-4"><h3 class="text-xl font-semibold" x-text="group.name"></h3></div><template x-if="group.description"><p class="mb-4" x-html="group.description"></p></template><div class="overflow-x-scroll md:overflow-x-auto"><table class="table-auto w-full mb-4 text-left"><thead><tr class="table table-fixed w-full"><th class="am-text-caption">Cookie Name</th><th class="am-text-caption">Cookie Provider</th><th class="am-text-caption">Cookie Description</th><th class="am-text-caption">Cookie Lifetime</th><th class="am-text-caption">Cookie Type</th></tr></thead><tbody class="block max-h-[500px] overflow-auto"><template x-for="(item, index) in group.cookies" :key="index"><tr class="table table-fixed w-full"><td x-text="item.name" class="break-words"></td><td x-text="item.provider" class=""></td><td x-html="item.description" class=""></td><td x-text="item.lifetime" class=""></td><td x-text="item.type" class=""></td></tr></template></tbody></table></div></div></template><button @click="$dispatch('popup-close-am-cookie-group-info')" aria-label="Done" class="btn btn-secondary w-full">Done</button></div></div></div></div></div><div class="w-full flex"><button class="btn btn-secondary w-full" x-ref="ambar-settings-done" x-focus-first @click="$dispatch('cookiebar-action-accept', $store.AmastyCookieGroups.getCheckedGroupIds())">Done</button></div><div tabindex="0" @focusin="focusCloseButton()"></div></div></div></div></div> <script data-info="not-move-to-bottom"> (function() { const PROMOTION_SELECTOR = '[data-promo-id]'; _trackPromotions(PROMOTION_SELECTOR); _initListener(); setTimeout(function () { console.log('delay_backstopjs_ready'); }, 7000); function _initListener () { document.body.addEventListener('initAnalyticsPromotion', function (e) { _trackPromotions(e.detail.element); }); } function _trackPromotions(selector) { const ecommerceAttributes = ['id', 'name', 'creative', 'position']; const elements = document.querySelectorAll(selector); [...elements].forEach((element) => { const elementPromotion = element; const params = {}; ecommerceAttributes.forEach((item) => { params[item] = elementPromotion.getAttribute('data-promo-' + item); }); _trackPromotionViews(elementPromotion, params); _trackPromotionClick(elementPromotion, params); }); } function _trackPromotionViews(element, params) { const observer = new IntersectionObserver(function (entries, observerer) { entries.forEach(function (entry) { if (entry.isIntersecting && entry.target.offsetHeight !== 0) { window.dataLayer.push({ 'event': 'view_promotion', any_transmitted_info: params.creative, any_transmitted_info_2: params.id, any_transmitted_info_3: params.name }); observerer.unobserve(entry.target); } }); }); observer.observe(element); } function _trackPromotionClick (element, params) { element.addEventListener('click', function () { if (!window.hasOwnProperty('google_tag_manager')) { return; } window.dataLayer.push({ 'event': 'select_promotion', 'any_transmitted_info': params.creative, 'any_transmitted_info_2': params.id, 'any_transmitted_info_3': params.name }); }); } }())</script> <script data-info="not-move-to-bottom"> 'use strict'; (function () { _initListeners(); function _initListeners() { _triggerAddToCartEvents(); } function _triggerDefaultAddToCartMatomo(productObject) { productObject.items.forEach(function(item) { window._mtm.push({ 'event': 'SuccessfulAddCart', 'any_transmitted_info': item.item_name }); }); } function _triggerAddToCartEvents() { let isAddCartFromPopup = false; let isAddCartFromProductPageFirstScree = false; const addCartBtn = document.querySelector('.amtheme-product-wrap [data-amtheme-js="addtocart-button"]'); if (addCartBtn) { addCartBtn.addEventListener('click', function () { if (!addCartBtn.closest('.amtheme-popup-block')) { isAddCartFromProductPageFirstScree = true; } }); } document.body.addEventListener('addProductFromBundlePopup', function () { isAddCartFromPopup = true; }); document.body.addEventListener('am.popupOpened', function () { const btnInPopup = document.querySelector('.amtheme-popup-block [data-amtheme-js="addtocart-button"]'); if (btnInPopup) { document.querySelector('.amtheme-popup-block [data-amtheme-js="addtocart-button"]').addEventListener('click', function () { isAddCartFromPopup = true; }); } }); document.body.addEventListener('successfulAddCart', (e) => { e.detail.forEach(function (productObject) { if (productObject.product_name) { if (isAddCartFromPopup) { window.dataLayer.push( { 'event': 'AddCartPopup', 'product_name': productObject.product_name } ); window._mtm.push({ 'event': 'AddCartPopup', 'any_transmitted_info': productObject.product_name }); } else if (isAddCartFromProductPageFirstScree) { window.dataLayer.push( { 'event': 'AddCartProduct', 'product_name': productObject.product_name } ); window._mtm.push({ 'event': 'AddCartProduct', 'any_transmitted_info': productObject.product_name, }); } } window.dataLayer.push({ event: 'SuccessfulAddCart', ecommerce: { value: productObject.value, items: productObject.items } }); _triggerDefaultAddToCartMatomo(productObject); }); isAddCartFromPopup = false; }); } }())</script> <script data-info="not-move-to-bottom"> (function() { const sentAnalyticsData = function (data) { data.forEach((item) => { if (item.event && item.event === 'triggerCustomSubmitForm') { window.dataLayer.push({ 'event': item.data }); } if (item.event && item.event === 'successfulAddCart') { document.body.dispatchEvent(new CustomEvent('successfulAddCart', { detail: item.data })); checkUpdateMiniCart(); } }); }; document.addEventListener('DOMContentLoaded', function () { const urlString = `${window.BASE_URL}rest/V1/amasty_gtm/get-analytics-data`; fetch(urlString) .then(response => response.json()) .then(function (response) { if (response.length) { const data = JSON.parse(response); if (typeof window.dataLayer === 'undefined') { window.dataLayer = []; } const interval = setInterval(() => { if (window.MatomoTagManager) { clearInterval(interval); sentAnalyticsData(data); } }, 1000); } }); }); function checkUpdateMiniCart() { window.dispatchEvent(new CustomEvent('reload-customer-section-data')); } }())</script> <script data-info="not-move-to-bottom"> 'use strict'; (function() { const SELECTORS = { footerSubscriptionForm: '#newsletter-validate-detail', customerAccountSubscriptionForm: '[data-amsite-js="customer-account-newsletter-form"]', customerAccountCheckboxNewsletter: '[data-amsite-js="checkbox-newsletter-customer-account"]', requestQuoteTopForm: '#amform-form-51', requestQuoteDescriptionForm: '#amform-form-52' }; _checkSubmitSubscribeInFooter(); _checkSubmitSubscribeInCustomerAccount(); _submitCustomOneVariableForms(SELECTORS.requestQuoteTopForm, 'SendFormPDPRequestQuote', 'SendFormPDPRequestQuote'); _submitCustomOneVariableForms(SELECTORS.requestQuoteDescriptionForm, 'SendFormPDPRequestQuote', 'SendAdditionalFormPDPRequestQuote'); _universalTrackingSubmitForm(); function _checkSubmitSubscribeInFooter() { const subscriptionForm = document.querySelector(SELECTORS.footerSubscriptionForm); if (subscriptionForm) { subscriptionForm.addEventListener('submit', () => { window.hyva.formValidation(subscriptionForm).validate() .then(() => { window.dataLayer.push( { 'event': 'setPositionToSubscribeNewsletter', 'subscribe_newsletter_position': 'SubscriptionFooter' }); }) .catch(() => { return false; }); }); } } function _checkSubmitSubscribeInCustomerAccount() { const subscriptionForm = document.querySelector(SELECTORS.customerAccountSubscriptionForm); if (subscriptionForm) { subscriptionForm.addEventListener('submit', () => { hyva.formValidation(subscriptionForm).validate() .then(() => { if (subscriptionForm.querySelector(SELECTORS.customerAccountCheckboxNewsletter).checked) { window.dataLayer.push( { 'event': 'setPositionToSubscribeNewsletter', 'subscribe_newsletter_position': 'SubscriptionCustomerAccount' }); } }) .catch(() => { return false; }); }); } } function _submitCustomOneVariableForms(formSelector, eventName, variableValue = '') { const form = document.querySelector(formSelector); if (form) { form.addEventListener('submit', () => { if (jQuery(form).validation('isValid')) { window.dataLayer.push( { 'event': eventName, 'any_transmitted_info': variableValue }); } }); } } function _universalTrackingSubmitForm() { window.addEventListener('amcform-success-submitted', () => { setTimeout(() => { fetch(`${window.BASE_URL}rest/V1/amasty_gtm/get-analytics-data`) .then((response) => { return response.json(); }) .then((data) => { if (data) { _checkFormAnalytics(JSON.parse(data)); } }) .catch(function(error) { console.log(error.message); }); }, 1000); }); } function _checkFormAnalytics(data) { data.forEach(function(item) { if (item.event && item.event === 'triggerCustomSubmitForm') { window.dataLayer.push({ 'event': item.data }); } }); } })();</script> <div class="am-hyva-loader-wrapper flex flex-row justify-center items-center w-full h-full fixed select-none z-[1000002] hidden" style="left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);background: rgba(255,255,255,0.7);" x-data="{ isLoading: false }" x-on:show-global-loader.window="isLoading = true; $root.classList.remove('hidden');" x-on:hide-global-loader.window="isLoading = false; $root.classList.add('hidden');" x-show="isLoading" x-transition:enter="ease-out duration-200" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0"><div class="am-hyva-loader flex items-center flex-col justify-center w-full h-full"><div class="amsite-head">Loading</div><div class="flex mt-1"><span class="square relative w-5 h-5"></span> <span class="square two relative w-5 h-5"></span> <span class="square three relative w-5 h-5"></span> <span class="square fourth relative w-5 h-5"></span></div></div></div> <script data-info="not-move-to-bottom"> 'use strict'; (function() { const SELECTORS = [ { selector: '[data-amsite-analytics-js="btn-add-to-cart-in-page-builder-template"]', action: 'add_to_cart_tariff_block', attr: 'data-product-name-analytics' }, { selector: '[analytics-comparison-block-feature-list]', action: 'view_features_tariff_block', attr: 'analytics-comparison-block-feature-list' }, { selector: '[analytics-comparison-block-demo-view]', action: 'view_demo_tariff_block', attr: 'analytics-comparison-block-demo-view' }, { selector: '[analytics-comparison-block-product-name]', action: 'click_product_name_tariff_block', attr: 'analytics-comparison-block-product-name' } ]; function attachEventListener(selector, action, attr) { document.querySelectorAll(selector).forEach((button) => { button.addEventListener('click', () => { const productName = button.getAttribute(attr); pushAnalyticsFromComparisonBlock(action, productName); }); }); } function pushAnalyticsFromComparisonBlock(actionName, productName) { window.dataLayer.push({ 'event': 'ClickOnComparisonBlock', 'any_transmitted_info': actionName, 'product_name': productName }); } function trackMatomoProductViews() { window._paq.push(['setEcommerceView', "special-occasion-coupons-for-magento-2", "Special Occasion Coupons for Magento 2", "Magento 2" ]); window._paq.push(['trackPageView']); } SELECTORS.forEach(({ selector, action, attr }) => attachEventListener(selector, action, attr)); window.addEventListener('matomo-has-loaded', trackMatomoProductViews); })();</script> <div x-data="AmAuthPopup()" x-on:private-content-loaded.window="initializeAuthPopup(event.detail)" x-on:amsl-show-popup.window="showOnExternalEvent(event)" x-on:amsl-hide-popup.window="hide(modalName)" x-on:amsl-content-updated.window="bindLinksEvents()" > <div x-cloak x-bind="overlay('social-login-popup')" x-spread="overlay('social-login-popup')" class="am-overlay-popup z-60"><div class="am-container-popup inset-0"><div x-ref="social-login-popup" role="dialog" aria-modal="true" aria-labelledby="social-login-popup" class="am-dialog-popup w-full sm:max-w-[560px]"> <div id="social-login-popup" class="amsl-hyva-popup-block group relative focus:outline-none focus-within:outline-none -social-bottom" role="dialog" aria-labelledby="amsl-popup-dialog" tabindex="0" x-on:click.stop ><h2 class="amsl-dialog-title sr-only" id="amsl-popup-dialog" >Login and Registration Form</h2><div class="amsl-tabs-wrapper" title="Login and Registration Form" ><ul class="amsl-hyva-tablist flex mb-6 font-gilr am-title-h2 ul-reset text-secondary-lighter" role="tablist" x-on:keydown="onKeypress($event)" x-show="activeTab !== 'amsl-forgot'" ><li class="amsl-title grow m-0 pb-4 text-center border-b border-primary" id="tab-amsl-login" role="tab" aria-controls="amsl-login-content" tabindex="0" :class="{ '-active text-primary !border-black': activeTab === 'amsl-login' }" ><span class="amsl-link cursor-pointer" data-toggle="switch" x-on:click.prevent=" activeTab = 'amsl-login' " >Login</span></li> <li class="amsl-title grow m-0 pb-4 text-center border-b border-primary" id="tab-amsl-register" role="tab" aria-controls="amsl-register-content" tabindex="0" :class="{ '-active text-primary !border-black': activeTab == 'amsl-register' }" ><span class="amsl-link cursor-pointer" x-on:click.prevent=" activeTab = 'amsl-register' " >Register</span></li></ul><div id="amsl-login-content" x-show="activeTab === 'amsl-login'" x-cloak role="tabpanel" aria-labelledby="tab-amsl-login" ><template x-if="formMessages.has('amsl-login')"><div class="mt-4"><template x-for="message in formMessages.get('amsl-login')" :key="message" ><div class="message error"><span x-html="message"></span></div></template></div></template><div class="amsl-content amsl-login-content amsl-position-variations "><template x-if="!isLogged"><div class="amsl-form"> <div class="max-w-[480px] mx-auto my-0"><strong class="block mb-2 text-center group-[.amsl-hyva-popup-block]:hidden am-title-h2" role="heading" aria-level="2">Log in to Amasty</strong> <div class="card"><div aria-labelledby="am-block-customer-login-heading"><form class="form form-login" action="https://amasty.com/customer/account/loginPost/" method="post" x-data="Object.assign(hyva.formValidation($el), initCustomerLoginForm())" @submit.prevent="submitForm()" id="customer-login-form"><input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /> <fieldset class="fieldset login"><legend class="mb-3"><h2 class="text-xl font-medium title-font text-primary">Login</h2></legend><div class="text-secondary-darker mb-6 text-center group-[.amsl-hyva-popup-block]:text-left">If you have an account with us, please log in.</div><div class="am-input field field-reserved email required"><input name="login[username]" class="form-input" required value="" autocomplete="off" id="email" type="email" placeholder="Email" /><label class="label" for="email">Email</label></div><div class="am-input field password field-reserved required control !mt-6 peer"><input name="login[password]" class="form-input" required :type="customer_form_login_popup_showPassword ? 'text' : 'password'" placeholder="Password" autocomplete="off" id="am-pass" /><label for="am-pass" class="label">Password</label></div><a class="am-text-caption block -mt-5 peer-[.field-error]:-mt-2" href="https://amasty.com/customer/account/forgotpassword/">Forgot password?</a> <button type="submit" class="btn btn-primary mt-6 w-full disabled:opacity-75" name="send" >Log In</button> <div><template x-if="displayErrorMessage"><p class="text-red flex items-center"><span class="inline-block w-8 h-8 mr-3"><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4m0 4h.01M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/><title>exclamation-circle</title></svg> </span> <template x-for="errorMessage in errorMessages"><span x-html="errorMessage"></span></template></p></template></div></fieldset></form></div></div></div> </div></template> <div class="am-social-icons max-w-[480px] mx-auto" data-amsite-js="am-social-icons"><span class="amsl-separator flex items-center justify-center my-7 w-full h-px bg-gray-200"><span class="am-text-caption text-secondary-lighter uppercase font-bold bg-white px-2">or continue with</span></span> <div class="amsl-social-wrapper&#x20;with-labels" ><div class="amsl-social-login -labeled-buttons"><template x-if="socialErrorMessage"><p class="amsl-error -social message error mb-4" x-text="socialErrorMessage"></p></template><div class="amsl-buttons flex flex-col xs:flex-row gap-3" :class="{'-show-all': canShowAllSocialIcons()}" > <div class="amsl-button-wrapper w-full group google with-label"><a class="amsl-button -google&#x20;-rectangular group-[.facebook]:bg-blue-800 hover:opacity-80 group-[.google]:bg-blue-500 flex items-center px-3 py-2 rounded transition" x-on:click="socialLoginClick($event)" href="https://amasty.com/amsociallogin/social/login/?type=google" title="Sign in with Google" role="link" ><span class="amsl-social-icon pointer-events-none bg-white rounded group-[.facebook]:text-blue-800" role="img" aria-label="Sign in with Google" ><svg xmlns="http://www.w3.org/2000/svg" xmlns:v="https://vecta.io/nano" viewBox="0 0 31 33" fill="none" width="24" height="24" role="img"><path d="M1.125 10.662c-.726 1.85-1.1 3.841-1.023 5.869-.061 3.005.825 5.947 2.383 8.465l4.781-3.654c-.261-.501-.478-1.03-.643-1.586-.625-1.678-.712-3.469-.371-5.174l-5.127-3.92z" fill="#fbbc05"/><path d="M15.832.502l-.775.045c-6.14.075-11.7 4.435-13.93 10.115l5.125 3.918c.711-3.552 3.289-6.733 6.809-7.75 3.23-1.155 6.557.145 9.322 1.85 1.399-1.331 2.71-2.751 3.998-4.189C23.437 1.989 19.706.395 15.832.502zm.016 13.736v.041l.047-.041c-.016 0-.031 0-.047 0z" fill="#ea4335"/><path d="M23.387 14.219c-2.298-.001-4.595.006-6.891.01l-.648.496.008 4.953 9.035.107c-.76 2.645-2.493 5.106-5.121 6.061-4.56 2.039-10.247-.148-12.514-4.533l-4.777 3.662c1.906 3.086 4.822 5.537 8.256 6.682 5.873 2.003 13.093.505 17.002-4.602 2.853-3.577 3.502-8.348 3.193-12.805l-7.543-.031z" fill="#34a853"/><path d="M23.385 14.219c-2.514-.001-5.026.006-7.537.01l.008 5.449 9.035.107c-.69 2.401-2.185 4.647-4.42 5.756l4.959 3.84c.852-.669 1.63-1.442 2.307-2.326 2.853-3.577 3.502-8.348 3.193-12.805l-7.545-.031z" fill="#4285f4"/><title>google</title></svg> </span> <span class="amsl-text pointer-events-none text-white am-text-small w-[80%] xs:w-[85%] text-center">Google</span> </a></div></div></div></div> </div></div></div><div id="amsl-register-content" x-show="activeTab === 'amsl-register'" x-cloak role="tabpanel" aria-labelledby="tab-amsl-register" ><template x-if="formMessages.has('amsl-register')"><div class="mt-4"><template x-for="message in formMessages.get( 'amsl-register' )" :key="message" ><div class="message error"><span x-html="message"></span></div></template></div></template><div class="amsl-content amsl-register-content"><template x-if="!isLogged"><div class="amsl-form"> <div class="mb-8 max-w-[480px] mx-auto"><form class="form create hyva-account form-create-account" action="https://amasty.com/customer/account/createpost/" x-data="Object.assign(hyva.formValidation($el), initForm())" id="accountcreate" @submit.prevent="submitForm()" method="post" id="form-validate" enctype="multipart/form-data" autocomplete="off" ><input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /> <div class="flex flex-col"><p class="text-center group-[.amsl-hyva-popup-block]:text-left mb-0">Use your customer account to view all invoices and purchases for one-clickdownloads, update extensions to the latest versions for free, and extend your support period.</p><fieldset class="mt-6 card"><legend class="hidden"><span> Personal Information</span></legend><input type="hidden" name="success_url" value=""><input type="hidden" name="error_url" value=""><div class="group-[.amsl-hyva-popup-block]:flex gap-2"><div class="am-input field field-reserved w-full"><input type="text" id="firstname" name="firstname" value="" placeholder="First&#x20;Name" minlength="2" data-validate='{"validate-not-only-special": true}' required @input.debounce="onChange"><label for="firstname">First Name</label></div><div class="am-input field field-reserved w-full"><input type="text" id="lastname" name="lastname" value="" placeholder="Last&#x20;Name" minlength="2" data-validate='{"validate-not-only-special": true}' required @input.debounce="onChange"><label for="lastname">Last Name</label></div></div></fieldset><fieldset class="my-5 card group-[.amsl-hyva-popup-block]:mt-0 !mb-2"><legend class="hidden"><span> Sign-in Information</span></legend><div class="am-input field field-reserved"><input type="email" name="email" autocomplete="email" id="am-email-address" placeholder="Email" required value="" class="form-input" data-validate-hidden @input.debounce="onChange" /><label for="am-email-address">Email</label></div><div class="flex xs:gap-2 flex-col xs:flex-row"><div class="am-input field field-reserved w-full sm:!mb-0"> <input :type="customer_form_register_popup_showPassword ? 'text' : 'password'" type="password" data-validate-hidden id="password" name="password" minlength="8" class="form-input" placeholder="Password" data-validate='{"password-strength": {"minCharacterSets": 3}}' @input.debounce="onChange" autocomplete="off" ><label for="password">Password</label> <span class="option">8 or more characters</span> <div id="password-strength-meter-container" data-role="password-strength-meter" aria-live="polite" class="hidden" ><div id="password-strength-meter" class="password-strength-meter">Strength: <span id="password-strength-meter-label" data-role="password-strength-meter-label">No Password</span></div></div></div><div class="am-input field field-reserved w-full !mb-0"><input :type="customer_form_register_popup_showPasswordConfirm ? 'text' : 'password'" type="password" name="password_confirmation" title="Confirm&#x20;Password" id="password-confirmation" placeholder="Confirm&#x20;Password" data-validate='{"equalTo": "password"}' @input.debounce="onChange" required class="form-input" autocomplete="off" ><label for="password-confirmation">Confirm Password</label></div></div> <div class="mt-6"> <div class="field field-reserved choice choice-wrapper gdpr !mb-4" data-role="amasty-gdpr-consent" data-amgdpr-content-from="registration"><input type="hidden" name="amgdpr_agreement[privacy_checkbox]" value="0"><input type="checkbox" name="amgdpr_agreement[privacy_checkbox]" title="Privacy&#x20;Checkbox" id="amprivacy-checkbox-67bf234b20791" class="amgdpr-checkbox" data-consent-id="1" required value="1"><label for="amprivacy-checkbox-67bf234b20791" class="label amgdpr-label"><span class="amgdpr-text">I have read and accepted the <a href="/terms-and-conditions.html" target="_blank" title="Go to this page">Terms & Conditions</a>, <a href="/privacy-policy.html" target="_blank" title="Go to this page">Privacy Policy</a>, <a href="/license.html" target="_blank" title="Go to this page">License Agreement</a>, and <a href="/support-license-agreement.html" target="_blank" title="Go to this page">Support License Agreement</a></span></label> </div> <div class="field field-reserved choice choice-wrapper gdpr !mb-4" data-role="amasty-gdpr-consent" data-amgdpr-content-from="registration"><input type="hidden" name="amgdpr_agreement[data_processing_consent]" value="0"><input type="checkbox" name="amgdpr_agreement[data_processing_consent]" title="Processing&#x20;of&#x20;my&#x20;personal&#x20;data" id="amprivacy-checkbox-67bf234b207a9" class="amgdpr-checkbox" data-consent-id="2" value="1"><label for="amprivacy-checkbox-67bf234b207a9" class="label amgdpr-label"><span class="amgdpr-text">I hereby give my consent with <a href="/data-processing-consent.html" target="_blank" title="Go to this page">processing of my personal data</a> for marketing purposes</span></label> <span class="optional">Optional</span> </div> <input type="hidden" name="am-gdpr-checkboxes-from" value="registration" /></div></fieldset></div><button type="submit" class="action submit primary btn btn-primary disabled:opacity-75 w-full" >Create an Account</button></form></div> </div></template> <div class="am-social-icons max-w-[480px] mx-auto" data-amsite-js="am-social-icons"><span class="amsl-separator flex items-center justify-center my-7 w-full h-px bg-gray-200"><span class="am-text-caption text-secondary-lighter uppercase font-bold bg-white px-2">or continue with</span></span> <div class="amsl-social-wrapper&#x20;with-labels" ><div class="amsl-social-login -labeled-buttons"><template x-if="socialErrorMessage"><p class="amsl-error -social message error mb-4" x-text="socialErrorMessage"></p></template><div class="amsl-buttons flex flex-col xs:flex-row gap-3" :class="{'-show-all': canShowAllSocialIcons()}" > <div class="amsl-button-wrapper w-full group google with-label"><a class="amsl-button -google&#x20;-rectangular group-[.facebook]:bg-blue-800 hover:opacity-80 group-[.google]:bg-blue-500 flex items-center px-3 py-2 rounded transition" x-on:click="socialLoginClick($event)" href="https://amasty.com/amsociallogin/social/login/?type=google" title="Sign in with Google" role="link" ><span class="amsl-social-icon pointer-events-none bg-white rounded group-[.facebook]:text-blue-800" role="img" aria-label="Sign in with Google" ><svg xmlns="http://www.w3.org/2000/svg" xmlns:v="https://vecta.io/nano" viewBox="0 0 31 33" fill="none" width="24" height="24" role="img"><path d="M1.125 10.662c-.726 1.85-1.1 3.841-1.023 5.869-.061 3.005.825 5.947 2.383 8.465l4.781-3.654c-.261-.501-.478-1.03-.643-1.586-.625-1.678-.712-3.469-.371-5.174l-5.127-3.92z" fill="#fbbc05"/><path d="M15.832.502l-.775.045c-6.14.075-11.7 4.435-13.93 10.115l5.125 3.918c.711-3.552 3.289-6.733 6.809-7.75 3.23-1.155 6.557.145 9.322 1.85 1.399-1.331 2.71-2.751 3.998-4.189C23.437 1.989 19.706.395 15.832.502zm.016 13.736v.041l.047-.041c-.016 0-.031 0-.047 0z" fill="#ea4335"/><path d="M23.387 14.219c-2.298-.001-4.595.006-6.891.01l-.648.496.008 4.953 9.035.107c-.76 2.645-2.493 5.106-5.121 6.061-4.56 2.039-10.247-.148-12.514-4.533l-4.777 3.662c1.906 3.086 4.822 5.537 8.256 6.682 5.873 2.003 13.093.505 17.002-4.602 2.853-3.577 3.502-8.348 3.193-12.805l-7.543-.031z" fill="#34a853"/><path d="M23.385 14.219c-2.514-.001-5.026.006-7.537.01l.008 5.449 9.035.107c-.69 2.401-2.185 4.647-4.42 5.756l4.959 3.84c.852-.669 1.63-1.442 2.307-2.326 2.853-3.577 3.502-8.348 3.193-12.805l-7.545-.031z" fill="#4285f4"/><title>google</title></svg> </span> <span class="amsl-text pointer-events-none text-white am-text-small w-[80%] xs:w-[85%] text-center">Google</span> </a></div></div></div></div> </div></div></div></div><div class="amsl-tabs-wrapper -forgot" x-show="activeTab === 'amsl-forgot'" title="Forgot Your Password Form" x-cloak ><ul class="amsl-tablist mb-12 ul-reset text-center" role="tablist" ><li class="amsl-title" id="tab-amsl-forgot" role="tab" aria-controls="amsl-forgot-content" ><span class="amsl-link -active am-title-h2 font-bold" @click.prevent >Forgot your password?</span></li></ul><div id="amsl-forgot-content" role="tabpanel" aria-labelledby="tab-amsl-forgot"><template x-if="formMessages.has('amsl-forgot')"><div class="mt-4"><template x-for="message in formMessages.get('amsl-forgot')" :key="message" ><div class="message error"><span x-html="message"></span></div></template></div></template><div class="amsl-content amsl-forgot-content"><template x-if="!isLogged"><div class="amsl-form"> <div class="max-w-[480px] mx-auto my-0"><div class=""><form action="https://amasty.com/catalog/product/forgotpasswordpost/" method="post" class="!max-w-[inherit] !mb-7" id="user_forgotpassword" x-data="Object.assign(hyva.formValidation($el), initPasswordForm())" @submit.prevent="submitForm();"><input name="form_key" type="hidden" value="is0PXzIDcqelORnX" /> <input type="hidden" name="formId" value="user_forgotpassword"/> <fieldset class="fieldset mb-6"><div class="text-center mb-6">Please enter your email address below to receive a password reset link.</div><div class="am-input field field-reserved email required !mb-0"><input type="email" name="email" alt="email" id="email_address" class="form-input" placeholder="Email&#x20;address" required value="" /><label class="label" for="email_address">Email address</label></div></fieldset><button type="submit" class="action submit w-full primary disabled:opacity-75" >Reset My Password</button></form><div class="text-center">or go back to <a class="back" href="https://amasty.com/customer/account/login/" aria-label="Login&#x20;page" >Login page</a></div></div></div> </div></template></div></div></div></div><button type="button" class="am-close-popup" title="Close" aria-label="Close" role="button" x-on:click="hide()" ><svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" viewBox="0 0 24 24" width="24" height="24" role="img"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18 18 6M6 6l12 12"/><title>x</title></svg> </button> </div></div></div></div> <div x-data="AmAuthPopupNotification()" x-init="initialize()" x-on:amsl-popup-show-notification.window="showNotification($event.detail)" > <div x-cloak x-bind="overlay('amsl-popup-notification')" x-spread="overlay('amsl-popup-notification')" class="am-overlay-popup"><div class="amsl-popup-notification am-container-popup inset-0"><div x-ref="amsl-popup-notification" role="dialog" aria-modal="true" class="am-dialog-popup w-full sm:max-w-[560px] !bg-green-50"> <span class="absolute top-0 left-0 pt-1 w-full rounded-tl-md rounded-tr-md bg-lime-500"></span> <div class="py-10 text-center"><div class="mb-8"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="45" viewBox="0 0 34 35" fill="none" role="img"> <path d="M0 34.38H34V0.38H0V34.38Z" fill="url(#pattern0)"/> <defs> <pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1"> <use xlink:href="#image0" transform="scale(0.015625)"/> </pattern> <image id="image0" width="64" height="64" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAP90lEQVR4AeyZA5CtRxCFpyqFZ9u2bdu2bduvrGfbtm2bq9hO1kbnnP8iU/fdODPhrfp6d6/7/NPdZ2aV5dv/NwnonTb+WoV58rDBDXnW8jN53uobedL0efLdWktxf0mgbMJgDQkamSPiVIGPUu7XFXnVVSRggEjgQPzsJ/Kyg0AUibtafjpQtmCwxle7M52JuVRKUh7UE3ndG8kPA8NdPwP6iLxoKykP60vMxVJbgbIBgxUkaFSmL3dnksgzhV0CBPR1JR80Aj/JUIjSXVAWknyvtkScLrQcKNMwWAFXOcNXezInfn8kFxPkFfcIAEa6fgagHF52FHncSBJuVJLvD+dsApRJGKwRfrLAtW/2Z5XE29VEXvf0EQDw79c9vKsg7HjeD4EyCYM10PzmYhUIGqLIq85vCsDfWRrPWzsNMfZSaQk9mrspUKZgsAaWeNPPtqaT2Mul0fDaOc3PVwBOBTZDedRQEm9Wka/3ZtkOlCkYrIFGmBGTIDHqbBFnmUvgEKALAAIHewVIulNDvj2YPRgoUzBYJfRYntfhJ/KJPGmiCaA1Ql2A29UpQDTKIT1QJmCwCUfi/sjThdjpmSwY7iPAoB9L4FY1CsB+UPBfIwAs74Koc0VpePwLEMAe0IZewRmFaJqcCAWBMgGDVVIe1O0VcaogryoF0EuAv9MWe8cgm+WXuzLGJN6qmhEoEzBYBXO+UcRpCPC4sR8BhtMiu5d/VWGpfLAu9YdAmYLBKnB6zTgFOOu1MagJ0I3LH16hvHx3KIeELE19AShTMFgFdT037kpZkZed/DpBGiQu/5iLJYSe4eNNaeYAZQoGm9AOv5t8r5ZmhUfqAnAvgPlf09k0fbg+Ne1wpX+NFcbsr8ftMGucZwG8+v4FqOHU//trUn8BlEkYbEE7fJ3NjXMe9a8lP8qnBGoJ+8RHG9OcBsokDFZIeVC/fvT5Yhx/3AprFniUJsAwbw+IvlBcPt2SdhNQJmGwQuiR3F9xacvL9lrt+wow2CkBeAV4gDL0AHuAMgmDcWBnj8VdLef2/4O02h+l4d4HvOrkrJKEm1XYAD/6x58HwPYujjpbVHAW4O78/pIfqQnQ1REKllkoGk6QJgFlCgZjIPGx4Sfzs6trc3/kzwgwhCLRJNEMcTfIwxNOhI14v0L/KAHwxYeEHctDS8uEmByT9Ff7mgA8He7vNEJ52pS9gCJwU8TTocSIkwW2fHc4Z0Og/iwY/nTg9IaFHnUn/6y5Xve++Agw3PEHzipgKTxv5bwHN0XcP6Ck3OTDmUL+eVhdzaLOFWuDhtkTAg1GuY2IvVRqbMzFkqOx+vh3B0yeynjsLaD8wfCngi8zIvSYnvzAX5m8R4D+oA+Txygs4ewHWEZIhv80kaS7NWmk+N6Eq4uT5U3oNZ618DTUj+EsFwHlC8OfBr5cb1hd1rz7yGug/2XvmzwJ1ErgaTPBFRb6Bgjq9IFElALPEHCW6P6fwlAw/Bfg+/VzzhfoLbAqzgClo35o3p7DJGmSMIDX+Xr82bZt27Zt27Zt27Zt27Zt5MXv6Yt5ajGzu5//eKfQ1VnheDOzx5+eEKG3dszd9w3sEFg7vLBYhNdM4YkJw8MjxnZWa6CCqNjTxjNeREjKZ8UfoAHS+80usDhBdYDw9rSMCboCb+IJmVIJ4/Ru1CeXDaPOxYglUnPbQJXwp7/47taJLzIl/e7WSQKTBsD5xDxiuvrTNzeN/3EI+uJX1451T+Tmt1qdPk7AVH7A6FaeZxU9S+HFWDoBgzKEY7BJoe25VLwn5XPc3HFSVBnS2F9HJP03UIE//SBCcJ98aVMQmBEIwRMgFw3MWwZXvLLaD5LyDEYpypkFxgZq+ene6Y0JjALk8U4FksEGHP5keWo5KUBuDrTEppZM3ePmaITo+HJNyPiicOZVoenFlBRSBpZfWpbwdM+LB015WJ3yxmbs8v45g/OScFW8AjCZPQI7Sp5R+LyP4fqGLkIu8llcoQNnKcqMG/OLthJdaqZABf5AN0LRW2xPEcoCJQGz4PQv55ovHZhK32PRo7yiGf1+MhOg8tap7VKMpwirEDq6Z6VYJIoWxvdd4CTQASjNgaKFwXi+BIcob8e4LxzW+Dmc3BGowJ86xqA4werK/maoKZ+hn3uBBI0eXl4/vqU8uksDBdb6eE1RhBI9v1hPYCjpwBCi1RGkjfvSRuRITd//8Lwhy2vHNcpjuzW8Y7tAlcgTYIBdBk7pdWFQlO5H+cxPKSZEeZawb5zYWu7YqL3cvVmb9QAzwkiLIUKJocpH5w8tPVDj8nVwhOhIGGIB11GMizGiFdtZLu+c1lFeOLRRHt6xUe7Zoq18cM4QxweqOrpPIAS+/bf1eM8GkKvqip7Pc8IU27MO+MhOjXL+Ml3lrCW7yp2btJdHd26Ux3dvlCf3apSn92tQympReTW8yrMM5fjSkY3y7IGN8kg8z4hXr9pZzli8q5y+WNdHLx7emC9Q9Y084f3/REh++Tsqnwbox/vWAOU7A7xzemd57qBGuXPj9nLNap3loe1bKGV5vLx0RFP5Fw8PxDk4f/6QRnlm/6aBntij4egeo6j60umLmJKfEoaaqqcVIQaYIAnGoCs5cMrX254Kje5qsaq7Iie0hftL4d0Ht2spb5zQKuTlvnAHz8lxU2a/K6oVvgWyayFLCqTPnKPMURumV0xttc3fv81RBpgvq3nP6FnBgff+GtoU4UKJOYrwV7C+CcWsA1JYePMegxBa0dMGPUd5+4oiyFi1no8bYKA6i3foZNo2AyUPiNow7I8xu+wIVOAPMMCqBjEgEPi3RI3uEp5QFMHy9Hmexf1NfBjAJIjygHkmGELU8Cwl1ZKawstTGLA/NcZzIk2X0RUUUgVy3b5/IsMAW7Iea7Ks429liHrlJ6zwR2a0MLO7NIBKzgDyWiSYBsdusiqv/UE8NyFWaGstU0C4U9S1VABKC31RFnxg5iJydAk14a1T2o8JVFDlSeTl3qk81IzwGyieyvPWcgQ2VRWWCqAQZwAKIiy2wxRDuS8qACeQIowklKUOokNBnURNYBT3kqrjBjyPqYoe7VGXibE79g1UUOVJeOUoSgtRwvZlhEBvSkL/7tXzc1VhKjx5rdsAPJMG4GkzymBr0e6kwTAMYmpsEQR8rhhKBaSnP5iWwqIE/VU3mstqYbxo9eXloxuibJpABVWehFdOTy8xAvRrhIGD5+uFKfk5/o62yn9UNVOAkEJbBCQZun+r1vLUPo0I17agsB2B9vJ2EJv3ztTWhvWcaPAdhst6AdLGvoKoUUitIvmtka023OHiQJXoPom8OTsnJvK0X0P0hNV6wKp1xQM8T/lm25KfwpTXeArPJ7xw91M6yl+/Zme5IYATYIb3bhmG2boVUdLr8QPRgiPoGjZSm/g/MeLt54M3PLVvAz/w2UU9bo5GDz0l1+PkKUMQnjG0R0jl8jqrr+fzO5DXdcWzImfPZgBdQI5KA3ktDYS3kMfybt+wqTgyhMc/vEOj3LtFa7ltg45yw1qd5cqVu8plKzaBNN20Tke5df0On2OQvgtY4dMx5lSBqm90n4SwB6awqrRJShqjv6Cc5zxfr8Z1pLdrCENDGkAaZBSkEYQ372J92pacDaPAiI4mRp7zvPzW3kSQcyvIoK44useob0ZXGbG33wlqgxsliyI4UKJfLEphymSrUYFVY3mtuNXgGmr3H53Hc+6p2tIgo0A7JDCFFUHLV9KCgmZx2pijAuh73q+d5hFEl6N36Q65FqAmfPfVNWO2B6o68oQBZqOEAfrF/F5i2poK17w3vYoLuXrkfh25ekRhIFie9ycKJkZUFEJCZ+/HCawSO3ouqXAdnJNwTW7jM67vKp5b9LQxwgDtYbUfAzwEKahBKEBQrau7t+Lw3986KaGErZB0T29X3YFiejboy2kQY9bH9TkjGiOK4JBpAII78r6qnjzAWJxCSd52bh4ASYTIb2wGkzbGvTRQ1dF9ApH3t/WlcC409NNfLZLGoijBzOJUbuxNbgpjQspDLc7zlrgYhkHqxug2qnvZEi1goMOIC8EZVzvDAZx7h2cxPMhxyFw3rHeQ20zz06gf0UavClR11C9EwWYpWK6uhNAWKwimqGS7UlgwMwMrVOhlMQWNnSHCamfytR+DMAYjMqb0yehwTinPmAdog5bH1IFPLxmhxPa6EPY+UeE5shlHiPuuczKDe96lfjAcCmxR5ZBAVUf9ggGG8sUUplaZkQtK8QCPq8gE4nmWRTKsvFjOQlrksRf7DqJiDOCNfoyRcM1YDKBva3mMqre/GRQ2CFEQmsFEmnFFIAWNm0giJDKxSGMxJL6guI4VqOroPknEjOr0bC8Gw8cpYqMTNbVqi6cTiGBIiMGf2LO5CnPRcl36tc9Y3BK33CWQqFHUagaZsBYd9h2a7yS0MXM8fMD6AKM8c0CT+DAyr6oXUgY+CHCI/0wRkchQTKx859NYWltsoH4g4RfdYd0fcm1NSHuRF1IKu8oVGAIRDNm4db2Oct0aneXMJSxBdZUHtmkRFSgoKiot8HHG6J7k5LoejzGMc/cZQBE09rWrd5Yb1w4E8cEMXSNAiE9+dnMs8t4S70eCHH126QpdX4YBrwoDbRekbchA1T/07yYjzELp9DSLW6biZWF+z+ZtxcuuCEHOWSrW7kJpip+9ZCi/eJwv3vUtpnbfVq0MRRnRwBDCUFSIKkaRUoE4xrnU8rma8kaE7WO7NgojksPiKK9a1zceumuJ7NmICI5Aj+t4aIfGp8ElOgJVb+jpA0aYJxT/JAenNC+gnRQ9ZdGm0hcs0/VGhOi1T+3dOCiEXD0K1AzBJ4aOQjTfXZu2fZXhK2piKioiclFCDZHP4JrnLVl5hoJ4fDPfRUxz1Vf6qBXZSbLgKdQIknQSTWaOova8QNUbev0wprZDh2DHxWTkmytW6ipXrdr1YZzf8mQoG5GxXBSZ8aIr/D1Q9Q/BFkeL1dy7pIaIET0iIgzLi2Z65ubh3S5HxZTQINXUAcYSLTqO1FEjKIyf1MgZ7jJHkqokPowp6jp+9W+EwtLDhlUnD5bXEqgGFbHQuX7UiVflrNRQMxhDdKG80ouyVnkprngpdj5nGJGhFUoPNQJl5vlsn7mBmq1PgRU5UmZAP63x5w9BeOmf4en1btug/f5Llu8ql0YqqSEZHTnzUzyzzty3ZSuDMILuQxm1AvPUNQAh00myVYsUz2l99gm+jgj+z1/m3+YSEf7ThZIHRrV+qrlx0awppwZca32XR8pFxChmWpnNDx5VTOW3gik19HotWpQkJ1EcTZ/VruMCVW/w509FdISxYwtr0WcPamwZxfKwwLkRCdfHVta9ERlPPLh9y4tP7l1Ll4N1BmkCLfVeb5GE0kU0Pb5H4/pYg2gEqt7gz18ekfczhpH2jwL6ZBjj82jHnwdV/jwU/jyKbPM87scW2ifRQc6J1FggUA0M/gfsGVXkq95xtgAAAABJRU5ErkJggg=="/> </defs> <title>thumb</title></svg> </div><template x-if="notification"><div x-html="notification"></div></template></div></div></div></div></div> <div><div x-data="AmAuthPopupReviewForm()" x-on:private-content-loaded.window.once="initializeReviewForm()" ></div></div> <div class="copyright px-6 xs:px-8 pt-4 lg:pt-5 lg:pb-12 pb-9 bg-gray-800 text-secondary-lighter lg:text-center text-sm"><span>© 2009-2025 Amasty. All Rights Reserved.</span></div> </div><script> var LOCALE = 'en\u002DUS'; var BASE_URL = 'https\u003A\u002F\u002Famasty.com\u002F'; var require = { 'baseUrl': 'https\u003A\u002F\u002Fcdn.amasty.com\u002Fstatic\u002Fversion1740558685\u002Ffrontend\u002FAmasty\u002FAmTheme\u002Fen_US' };</script><script type="text/javascript" src="https://cdn.amasty.com/static/version1740558685/_cache/merged/99d148032876ed95668760c4893bc3be.min.js"></script><script type="text/x-magento-init"> { "*": { "Magento_PageCache/js/form-key-provider": { "isPaginationCacheEnabled": 0 } } }</script><script> const initAmsiteCookieConsent = function () { let isFirstVisit = false; let allCookiesAllowed = false; let analyticsCookiesAllowed = false; let statisticsCookiesAllowed = false; let advertisingCookiesAllowed = false; const ACTION_DEFAULT = 'default'; const ACTION_UPDATE = 'update'; const CONSENT_GRANTED = 'granted'; const CONSENT_DENIED = 'denied'; const COOKIE_TYPES = { analytics_storage: 'analytics_storage', ad_personalization: 'ad_personalization', ad_storage: 'ad_storage', ad_user_data: 'ad_user_data' }; _setConsentValue(ACTION_DEFAULT); _setAdditionData(); _listenCookieUpdate(); function _getCookie(name) { let matches = document.cookie.match(new RegExp( "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" )); return matches ? decodeURIComponent(matches[1]) : undefined; } function _checkCookieAnalyticIsAllowed() { const amCookieAllowed = _getCookie('amcookie_allowed'); const ID_ADVERTISING = '2'; const ID_ANALYTICS_GROUP = '3'; const ID_STATISTICS = '4'; isFirstVisit = !amCookieAllowed; allCookiesAllowed = amCookieAllowed && amCookieAllowed === '0'; analyticsCookiesAllowed = amCookieAllowed && amCookieAllowed.includes(ID_ANALYTICS_GROUP); statisticsCookiesAllowed = amCookieAllowed && amCookieAllowed.includes(ID_STATISTICS); advertisingCookiesAllowed = amCookieAllowed && amCookieAllowed.includes(ID_ADVERTISING); } function _listenCookieUpdate() { window.addEventListener('cookiebar-action-accept-finish', () => _setConsentValue(ACTION_UPDATE)); window.addEventListener('cookiebar-action-allow-finish', () => _setConsentValue(ACTION_UPDATE)); } function _setConsentValue(action) { let consentTypes = ["ad_storage","ad_user_data","ad_personalization","analytics_storage"]; _checkCookieAnalyticIsAllowed(); if (action === ACTION_DEFAULT && isFirstVisit) { _setDefaultValues(consentTypes); } else if (action === ACTION_DEFAULT && !isFirstVisit) { _updateValues(consentTypes, ACTION_DEFAULT); } else { _updateValues(consentTypes, ACTION_UPDATE); } } function _setAdditionData() { if (1) { gtag('set', 'url_passthrough', true); } if (1) { gtag('set', 'ads_data_redaction', true); } } function _setDefaultValues(consentTypes) { let config = {}; consentTypes.forEach(key => config[key] = CONSENT_GRANTED); gtag('consent', ACTION_DEFAULT, config); let configForCountryWithRestrictions = {...config}; consentTypes.forEach(key => configForCountryWithRestrictions[key] = CONSENT_DENIED); configForCountryWithRestrictions.region = ['AT','BE','BG','HR','CY','CZ','DK','EE','FI','FR','DE','EL','HU','IS','IE','IT','LV','LI','LT','LU','MT','NL','NO','PL','PT','RO','SK','SI','ES','SE','UK','US-CA','US-CO','US-CT','US-VA','US-UT'] gtag('consent', ACTION_DEFAULT, configForCountryWithRestrictions); } function _updateValues(consentTypes, action) { let isAnalyticsStoragePresent = consentTypes.includes(COOKIE_TYPES.analytics_storage); let isPersonalizationStoragePresent = consentTypes.includes(COOKIE_TYPES.ad_personalization); let isStoragePresent = consentTypes.includes(COOKIE_TYPES.ad_storage); let isUserDataPresent = consentTypes.includes(COOKIE_TYPES.ad_user_data); let config = {}; consentTypes.forEach(key => config[key] = CONSENT_DENIED); if (allCookiesAllowed) { consentTypes.forEach(key => config[key] = CONSENT_GRANTED); } if (isAnalyticsStoragePresent && analyticsCookiesAllowed || isAnalyticsStoragePresent && statisticsCookiesAllowed) { config[COOKIE_TYPES.analytics_storage] = CONSENT_GRANTED; } if (isPersonalizationStoragePresent && advertisingCookiesAllowed) { config[COOKIE_TYPES.ad_personalization] = CONSENT_GRANTED; } if (isStoragePresent && advertisingCookiesAllowed) { config[COOKIE_TYPES.ad_storage] = CONSENT_GRANTED; } if (isUserDataPresent && advertisingCookiesAllowed) { config[COOKIE_TYPES.ad_user_data] = CONSENT_GRANTED; } gtag('consent', action, config); } }</script><script> window._vwo_code = window._vwo_code || (function(){ var account_id=634212, settings_tolerance=2000, library_tolerance=2500, use_existing_jquery=false, is_spa=1, hide_element='body', /* DO NOT EDIT BELOW THIS LINE */ f=false,d=document,code={use_existing_jquery:function(){return use_existing_jquery;},library_tolerance:function(){return library_tolerance;},finish:function(){if(!f){f=true;var a=d.getElementById('_vis_opt_path_hides');if(a)a.parentNode.removeChild(a);}},finished:function(){return f;},load:function(a){var b=d.createElement('script');b.src=a;b.type='text/javascript';b.innerText;b.onerror=function(){_vwo_code.finish();};d.getElementsByTagName('head')[0].appendChild(b);},init:function(){ window.settings_timer=setTimeout(function () {_vwo_code.finish() },settings_tolerance);var a=d.createElement('style'),b=hide_element?hide_element+'{opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important;}':'',h=d.getElementsByTagName('head')[0];a.setAttribute('id','_vis_opt_path_hides');a.setAttribute('type','text/css');if(a.styleSheet)a.styleSheet.cssText=b;else a.appendChild(d.createTextNode(b));h.appendChild(a);this.load('https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&f='+(+is_spa)+'&r='+Math.random());return settings_timer; }};window._vwo_settings_timer = code.init(); return code; }());</script><script> var BASE_URL = 'https://amasty.com/'; var THEME_PATH = 'https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US'; var COOKIE_CONFIG = { "expires": null, "path": "\u002F", "domain": ".amasty.com", "secure": true, "lifetime": "31556952", "cookie_restriction_enabled": false }; var CURRENT_STORE_CODE = 'default'; var CURRENT_WEBSITE_ID = '1'; window.hyva = window.hyva || {} window.cookie_consent_groups = window.cookie_consent_groups || {} window.cookie_consent_groups['necessary'] = true; window.cookie_consent_config = window.cookie_consent_config || {}; window.cookie_consent_config['necessary'] = [].concat( window.cookie_consent_config['necessary'] || [], [ 'user_allowed_save_cookie', 'form_key', 'mage-messages', 'private_content_version', 'mage-cache-sessid', 'last_visited_store', 'section_data_ids' ] );</script><script> 'use strict'; (function( hyva, undefined ) { function lifetimeToExpires(options, defaults) { const lifetime = options.lifetime || defaults.lifetime; if (lifetime) { const date = new Date; date.setTime(date.getTime() + lifetime * 1000); return date; } return null; } function generateRandomString() { const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', length = 16; let formKey = '', charactersLength = allowedCharacters.length; for (let i = 0; i < length; i++) { formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] } return formKey; } const sessionCookieMarker = {noLifetime: true} const cookieTempStorage = {}; const internalCookie = { get(name) { const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); return v ? v[2] : null; }, set(name, value, days, skipSetDomain) { let expires, path, domain, secure, samesite; const defaultCookieConfig = { expires: null, path: '/', domain: null, secure: false, lifetime: null, samesite: 'lax' }; const cookieConfig = window.COOKIE_CONFIG || {}; expires = days && days !== sessionCookieMarker ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; path = cookieConfig.path || defaultCookieConfig.path; domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); secure = cookieConfig.secure || defaultCookieConfig.secure; samesite = cookieConfig.samesite || defaultCookieConfig.samesite; document.cookie = name + "=" + encodeURIComponent(value) + (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + (path ? '; path=' + path : '') + (domain ? '; domain=' + domain : '') + (secure ? '; secure' : '') + (samesite ? '; samesite=' + samesite : 'lax'); }, isWebsiteAllowedToSaveCookie() { const allowedCookies = this.get('user_allowed_save_cookie'); if (allowedCookies) { const allowedWebsites = JSON.parse(unescape(allowedCookies)); return allowedWebsites[CURRENT_WEBSITE_ID] === 1; } return false; }, getGroupByCookieName(name) { const cookieConsentConfig = window.cookie_consent_config || {}; let group = null; for (let prop in cookieConsentConfig) { if (!cookieConsentConfig.hasOwnProperty(prop)) continue; if (cookieConsentConfig[prop].includes(name)) { group = prop; break; } } return group; }, isCookieAllowed(name) { const cookieGroup = this.getGroupByCookieName(name); return cookieGroup ? window.cookie_consent_groups[cookieGroup] : this.isWebsiteAllowedToSaveCookie(); }, saveTempStorageCookies() { for (const [name, data] of Object.entries(cookieTempStorage)) { if (this.isCookieAllowed(name)) { this.set(name, data['value'], data['days'], data['skipSetDomain']); delete cookieTempStorage[name]; } } } }; hyva.getCookie = (name) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; } return internalCookie.get(name); } hyva.setCookie = (name, value, days, skipSetDomain) => { const cookieConfig = window.COOKIE_CONFIG || {}; if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { cookieTempStorage[name] = {value, days, skipSetDomain}; return; } return internalCookie.set(name, value, days, skipSetDomain); } hyva.setSessionCookie = (name, value, skipSetDomain) => { return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) } hyva.getBrowserStorage = () => { const browserStorage = window.localStorage || window.sessionStorage; if (!browserStorage) { console.warn('Browser Storage is unavailable'); return false; } try { browserStorage.setItem('storage_test', '1'); browserStorage.removeItem('storage_test'); } catch (error) { console.warn('Browser Storage is not accessible', error); return false; } return browserStorage; } hyva.postForm = (postParams) => { const form = document.createElement("form"); let data = postParams.data; if (! postParams.skipUenc && ! data.uenc) { data.uenc = btoa(window.location.href); } form.method = "POST"; form.action = postParams.action; Object.keys(postParams.data).map(key => { const field = document.createElement("input"); field.type = 'hidden' field.value = postParams.data[key]; field.name = key; form.appendChild(field); }); const form_key = document.createElement("input"); form_key.type = 'hidden'; form_key.value = hyva.getFormKey(); form_key.name="form_key"; form.appendChild(form_key); document.body.appendChild(form); form.submit(); } hyva.getFormKey = function () { let formKey = hyva.getCookie('form_key'); if (!formKey) { formKey = generateRandomString(); hyva.setCookie('form_key', formKey); } return formKey; } hyva.formatPrice = (value, showSign) => { const formatter = new Intl.NumberFormat( 'en\u002DUS', { style: 'currency', currency: 'USD', signDisplay: showSign ? "always" : "auto" } ); return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? formatter.formatToParts(value).map(({type, value}) => { switch (type) { case 'currency': return '$' || value; case 'minusSign': return '- '; case 'plusSign': return '+ '; default : return value; } }).reduce((string, part) => string + part) : formatter.format(value); } const formatStr = function (str, nStart) { const args = Array.from(arguments).slice(2); return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { const idx = parseInt(n) - nStart; if (args[idx] === null || args[idx] === void 0) { return m; } return p.length % 2 ? p.slice(0, -1).replace('%%', '%') + args[idx] : p.replace('%%', '%') + n; }) } hyva.str = function (string) { const args = Array.from(arguments); args.splice(1, 0, 1); return formatStr.apply(undefined, args); } hyva.strf = function () { const args = Array.from(arguments); args.splice(1, 0, 0); return formatStr.apply(undefined, args); } /** * Take a html string as `content` parameter and * extract an element from the DOM to replace in * the current page under the same selector, * defined by `targetSelector` */ hyva.replaceDomElement = (targetSelector, content) => { const parser = new DOMParser(); const doc = parser.parseFromString(content, 'text/html'); const contentNode = doc.querySelector(targetSelector); if (!contentNode) { return; } const tmpScripts = contentNode.getElementsByTagName('script'); if (tmpScripts.length > 0) { const scripts = []; for (let i = 0; i < tmpScripts.length; i++) { scripts.push(tmpScripts[i]); } for (let i = 0; i < scripts.length; i++) { let script = document.createElement('script'); script.innerHTML = scripts[i].innerHTML; document.head.appendChild(script); scripts[i].parentNode.removeChild(scripts[i]); } } document.querySelector(targetSelector).replaceWith(contentNode); window.dispatchEvent(new CustomEvent("reload-customer-section-data")); hyva.initMessages(); } const replace = {['+']: '-', ['/']: '_', ['=']: ','}; hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); let currentTrap; const focusableElements = (rootElement) => { const selector = 'button, [href], input, select, textarea, details'; return Array.from(rootElement.querySelectorAll(selector)) .filter(el => el.style.display !== 'none' && !el.disabled && el.tabIndex !== -1) } const focusTrap = (e) => { const isTabPressed = e.key === 'Tab' || e.keyCode === 9; if (!isTabPressed) return; const focusable = focusableElements(currentTrap) const firstFocusableElement = focusable[0] const lastFocusableElement = focusable[focusable.length - 1] e.shiftKey ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) }; hyva.releaseFocus = (rootElement) => { if (currentTrap && (!rootElement || rootElement === currentTrap)) { currentTrap.removeEventListener('keydown', focusTrap) currentTrap = null } } hyva.trapFocus = (rootElement) => { if (!rootElement) return; hyva.releaseFocus() currentTrap = rootElement rootElement.addEventListener('keydown', focusTrap) const firstElement = focusableElements(rootElement)[0] firstElement && firstElement.focus() } hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) }( window.hyva = window.hyva || {} ));</script><script> (function() { const proLargeOption = 'Maintenance included for all products purchased before Feb 1, 2022 ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-right">' + '<span class="tooltip-toggle"></span><span class="tooltip-content">' + '- <a href="/knowledge-base/what-magento-versions-amasty-supports.html">Compatibility with Magento</a>' + ' versions supported by Adobe <br>' + '- Bug fixes <br>' + '- Security patches</span></span>'; const trainingSession = 'Training sessions ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-left">' + '<span class="tooltip-toggle"></span><span class="tooltip-content large">' + 'Extensions covered by the training:<br>' + '<span class="for-tooltip-left-indent -dot"> Promotion Suite for Magento 2</span><br>' + '<span class="for-tooltip-left-indent">Special Promotions Pro for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Loyalty Program for Magento 2</span><br>' + '<span class="for-tooltip-left-indent">Free Gift for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot">Reward Points for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Google Page Speed Optimizer for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> SEO Toolkit for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Shipping Suite for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Shipping Table Rates for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Shipping Restrictions for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Shipping Rules for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Delivery Date Manager for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Shipping & Payment By Customer Groups for Magento 2</span><br>' + '<span class="for-tooltip-left-indent -dot"> Shipping Cost Calculator for Magento 2</span><br>' + '<span class="for-tooltip-left-indent">Free Shipping Bar for Magento 2</span><br>' + '</span></span>'; const configurationSession = 'Free configuration service ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-right">' + '<span class="tooltip-toggle"></span><span class="tooltip-content large">' + 'Extension covered within the configuration service:<br>' + '<span class="for-tooltip-left-indent -dot"> Google Page Speed Optimizer</span><br>' + '<span class="for-tooltip-left-indent -dot">Free Gift</span><br>' + '<span class="for-tooltip-left-indent -dot">Special Promotions (Pro)</span><br>' + '<span class="for-tooltip-left-indent -dot">Shipping Suite</span><br>' + '<span class="for-tooltip-left-indent -dot">SEO Toolkit</span><br>' + '<span class="for-tooltip-left-indent -dot">Import and Export</span><br>' + '</span></span>' + '<span class="option-caption"> on request</span>'; const litePerfomance = 'Lite Performance Audit ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-left">' + '<span class="tooltip-toggle"></span><span class="tooltip-content large">' + 'In terms of the Performance Audit (Lite version) we will:<br>' + '<span class="for-tooltip-left-indent -dot"> scan your website using Google PageSpeed Insights</span><br>' + '<span class="for-tooltip-left-indent -dot"> analyse Core web Vitals</span><br>' + '<span class="for-tooltip-left-indent -dot"> offer basic technical guidance in alignment with Magento code' + ' standards and overall coding practices</span><br>' + '<span class="for-tooltip-left-indent -dot"> provide recommendations for optimizing your Magento usage ' + '(version management, updates, security patches, module usage)</span><br>' + '<span class="for-tooltip-left-indent -dot"> furnish general recommendations for server and cache' + ' management</span><br>' + '</span></span>' + '<br><span class="option-caption">once per quarter</span>'; const litePerfomanceCoreWebVitals = 'Lite Performance Audit + special offer for Core Web Vitals optimization ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-left">' + '<span class="tooltip-toggle"></span><span class="tooltip-content large">' + 'In terms of the Performance Audit (Lite version) we will:<br>' + '<span class="for-tooltip-left-indent -dot"> scan your website using Google PageSpeed Insights</span><br>' + '<span class="for-tooltip-left-indent -dot"> analyse Core web Vitals</span><br>' + '<span class="for-tooltip-left-indent -dot"> offer basic technical guidance in alignment with Magento code' + ' standards and overall coding practices</span><br>' + '<span class="for-tooltip-left-indent -dot"> provide recommendations for optimizing your Magento usage ' + '(version management, updates, security patches, module usage)</span><br>' + '<span class="for-tooltip-left-indent -dot"> furnish general recommendations for server and cache' + ' management</span><br>' + '</span></span>' + '<br><span class="option-caption">once per quarter</span>'; const partnerPricePro = '<span class="special-partner">Special price for partners</span> ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-right">' + '<span class="tooltip-toggle"></span><span class="tooltip-content">' + 'Get annual subscription by a special price based on your partner level:<br>' + '<span class="for-tooltip-left-indent -dot"> Bronze - $2199</span><br>' + '<span class="for-tooltip-left-indent -dot"> Silver - $2069</span><br>' + '<span class="for-tooltip-left-indent -dot"> Gold - $1939</span><br>' + '<span class="for-tooltip-left-indent -dot"> Platinum - $1809</span><br>' + '</span></span>'; const partnerPricePremium = '<span class="special-partner">Special price for partners</span> ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-right">' + '<span class="tooltip-toggle"></span><span class="tooltip-content">' + 'Get annual subscription by a special price based on your partner level:<br>' + '<span class="for-tooltip-left-indent -dot"> Bronze - $2439</span><br>' + '<span class="for-tooltip-left-indent -dot"> Silver - $2299</span><br>' + '<span class="for-tooltip-left-indent -dot"> Gold - $2149</span><br>' + '<span class="for-tooltip-left-indent -dot"> Platinum - $2009</span><br>' + '</span></span>'; const partnerPriceAmastyOne = '<span class="special-partner">Special price for partners</span> ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-right">' + '<span class="tooltip-toggle"></span><span class="tooltip-content">' + 'Get annual subscription by a special price based on your partner level:<br>' + '<span class="for-tooltip-left-indent -dot"> Bronze - $2929</span><br>' + '<span class="for-tooltip-left-indent -dot"> Silver - $2759</span><br>' + '<span class="for-tooltip-left-indent -dot"> Gold - $2589</span><br>' + '<span class="for-tooltip-left-indent -dot"> Platinum - $2409</span><br>' + '</span></span>'; const partnerPriceAgencyPremium = '<span class="special-partner"><a href="/partnership-program.html">Partner ' + 'Program</a> Discounts</span> ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-right">' + '<span class="tooltip-toggle"></span><span class="tooltip-content">' + 'Get a <b>20% discount</b> on <br>' + 'the deposit of any level.' + '</span></span><br><span class="option-caption">for agencies only</span>'; const partnerPriceAgencyAmastyOne = '<span class="special-partner"><a href="/partnership-program.html">Partner ' + 'Program</a> Discounts</span> ' + '<span class="amsite-tooltip-container -mobile-bottom -desktop-right">' + '<span class="tooltip-toggle"></span><span class="tooltip-content">' + 'Get a <b>30% discount</b> on <br>' + 'the deposit of any level.' + '</span></span><br><span class="option-caption">for agencies only</span>'; window.dataForSubscriptions = Object.freeze({ individual: { month: { Pro: [ 'Free installation for all extensions <br><span class="option-caption">' + 'on request</span>', configurationSession ], Premium: [ 'Pro included', 'Instant support in Slack', 'Free installation of version updates <br><span class="option-caption">' + 'on request</span>' ], 'Amasty One': [ 'Premium included', 'Personal account manager', 'Screen sharing and video calls for configuration questions', trainingSession, litePerfomanceCoreWebVitals ] }, annual: { Pro: [ 'Free installation for all extensions <br><span class="option-caption">' + 'on request</span>', configurationSession ], Premium: [ 'Pro included', 'Instant support in Slack', 'Free installation of version updates <br><span class="option-caption">' + 'on request</span>', litePerfomance ], 'Amasty One': [ 'Premium included', 'Personal account manager', 'Screen sharing and video calls for configuration questions', trainingSession, litePerfomanceCoreWebVitals ] } }, corporate: { month: { Pro: [ 'Free installation for all extensions <br><span class="option-caption">' + 'on request</span>', configurationSession, partnerPricePro ], Premium: [ 'Pro included', 'Instant support in Slack', 'Free installation of version updates <br><span class="option-caption">' + 'on request</span>', '<span class="special-partner">Personal account manager</span>', partnerPricePremium, partnerPriceAgencyPremium ], 'Amasty One': [ 'Premium included', 'Screen sharing and video calls for configuration questions', trainingSession, litePerfomanceCoreWebVitals, '<span class="special-partner">Support for 10 clients is included in the annual ' + 'subscription</span>', partnerPriceAmastyOne, partnerPriceAgencyAmastyOne ] }, annual: { Pro: [ 'Free installation for all extensions <br><span class="option-caption">' + 'on request</span>', configurationSession, partnerPricePro ], Premium: [ 'Pro included', 'Instant support in Slack', 'Free installation of version updates <br><span class="option-caption">' + 'on request</span>', litePerfomance, '<span class="special-partner">Personal account manager</span>', partnerPricePremium, partnerPriceAgencyPremium ], 'Amasty One': [ 'Premium included', 'Screen sharing and video calls for configuration questions', trainingSession, litePerfomanceCoreWebVitals, '<span class="special-partner">Support for 10 clients is included in the annual ' + 'subscription</span>', partnerPriceAmastyOne, partnerPriceAgencyAmastyOne ] } }, partner: { month: { Pro: [ 'Free installation for all extensions <br><span class="option-caption">' + 'on request</span>', configurationSession, partnerPricePro ], Premium: [ 'Pro included', 'Instant support in Slack', 'Free installation of version updates <br><span class="option-caption">' + 'on request</span>', '<span class="special-partner">Personal account manager</span>', partnerPricePremium, partnerPriceAgencyPremium ], 'Amasty One': [ 'Premium included', 'Screen sharing and video calls for configuration questions', trainingSession, litePerfomanceCoreWebVitals, '<span class="special-partner">Support for 10 clients is included in the annual ' + 'subscription</span>', partnerPriceAmastyOne, partnerPriceAgencyAmastyOne ] }, annual: { Pro: [ 'Free installation for all extensions <br><span class="option-caption">' + 'on request</span>', configurationSession, partnerPricePro ], Premium: [ 'Pro included', 'Instant support in Slack', 'Free installation of version updates <br><span class="option-caption">' + 'on request</span>', litePerfomance, '<span class="special-partner">Personal account manager</span>', partnerPricePremium, partnerPriceAgencyPremium ], 'Amasty One': [ 'Premium included', 'Screen sharing and video calls for configuration questions', trainingSession, litePerfomanceCoreWebVitals, '<span class="special-partner">Support for 10 clients is included in the annual ' + 'subscription</span>', partnerPriceAmastyOne, partnerPriceAgencyAmastyOne ] } } }); })();</script><script> 'use strict'; (() => { hyva.formatPrice = (value, showSign, options = {}) => { const formatter = new Intl.NumberFormat( 'en\u002DUS', Object.assign({ style: 'currency', currency: 'USD', signDisplay: showSign ? 'always' : 'auto' }, options) ); return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? formatter.formatToParts(value).map(({type, value}) => { switch (type) { case 'currency': return '\u0024' || value; case 'minusSign': return '- '; case 'plusSign': return '+ '; default : return value; } }).reduce((string, part) => string + part) : formatter.format(value); } })()</script><script src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Magento_Theme/js/utils/svg-amasty-sprite.min.js" async></script><script type="text/x-magento-init"> { "body": { "addToWishlist": {"productType":["simple","virtual","downloadable","bundle","grouped","configurable"]} } }</script><script type="text/x-magento-init"> { "*": { "cookieStatus": {} } }</script><script type="text/x-magento-init"> { "*": { "mage/cookies": { "expires": null, "path": "\u002F", "domain": ".amasty.com", "secure": true, "lifetime": "31556952" } } }</script><script> window.cookiesConfig = window.cookiesConfig || {}; window.cookiesConfig.secure = true; </script><script> require.config({ map: { '*': { wysiwygAdapter: 'mage/adminhtml/wysiwyg/tiny_mce/tinymce5Adapter' } } });</script><script> (function () { 'use strict'; window.amRecaptchaModel = { formsToProtect: "\u0023form\u002Dforgotpassword,\u0023user_forgotpassword,form\u005Baction\u002A\u003D\u0022createpost\u0022\u005D,\u0023review_form,\u0023adyen\u002Dcc\u002Dform,\u005Bdata\u002Damsite\u002Djs\u003D\u0022billing\u002Daddress\u002Dform\u0022\u005D,.form.form\u002Dlogin,form\u005Baction\u002A\u003D\u0022customer\u002Faccount\u002Fcreatepost\u0022\u005D,form\u005Baction\u002A\u003D\u0022customer\u002Faccount\u002FloginPost\u0022\u005D,form\u005Baction\u002A\u003D\u0022newsletter\u002Fsubscriber\u002Fnew\u0022\u005D,form\u005Baction\u002A\u003D\u0022contact\u002Findex\u002Fpost\u0022\u005D,form\u005Baction\u002A\u003D\u0022customer\u002Faccount\u002Fforgotpasswordpost\u0022\u005D,\u0023review_form,form\u005Baction\u002A\u003D\u0022customer\u002Faccount\u002Fresetpasswordpost\u0022\u005D,form\u005Baction\u002A\u003D\u0022checkout_payment_captcha\u0022\u005D,form\u005Baction\u002A\u003D\u0022amasty_customform\u002Fform\u002Fsubmit\u0022\u005D,form\u005Baction\u002A\u003D\u0022faq\u002Findex\u002Fsave\u0022\u005D,.form.password.forget", isEnabledOnPayments: "1", checkoutRecaptchaValidateUrl: "https://amasty.com/amcapthca/checkout/validate/", invisibleCaptchaCustomForm: "1", recaptchaConfig: { lang: "hl\u003Den" || 'hl=en', theme: "light", badge: "bottomleft", sitekey: "6LcoY6UZAAAAAP7Dqjtr6MPM8yGySn617oAlWVSx", size: "invisible" }, url: 'https://www.google.com/recaptcha/api.js', isCaptchaScriptLoaded: false, isInvisible: "invisible" === 'invisible', /** * Submit event * * @param {Object} $event * @return {void} */ execute: function ($event) { const eventTarget = $event?.target; if (this.isCaptchaScriptLoaded) { this.executeCaptcha(eventTarget); } else { window.addEventListener('amcaptcha-script-loaded', () => { this.isCaptchaScriptLoaded = true; this.executeCaptcha(eventTarget); this.initAmcaptchaBadges(); }); this.loadRecaptchaScript(); } }, /** * Execute original submit * * @param {Object} $event * @param {HTMLElement} $el * @return {void} */ recaptchaCallback: function ($event, $el) { this.shouldExecuteCallback($event, $el) && $el.dispatchEvent(new CustomEvent('amrecaptcha-executable-callback')); }, /** * Reset captcha * * @param {Object} $event * @param {HTMLElement} $el */ expiredCallback: function($event, $el) { this.shouldExecuteCallback($event, $el) && grecaptcha.reset($event.detail.widgetId); }, /** * Checks if event is fired on submitted element * * @param {Object} $event * @param {HTMLElement} $el * @return {boolean} */ shouldExecuteCallback: function($event, $el) { const eventWidgetId = $event.detail.widgetId; const elementWidgetId = $el.dataset.amCaptchaWidgetId || $el.closest('form')?.dataset.amCaptchaWidgetId; return eventWidgetId === elementWidgetId; }, /** * Run captcha for widget by id * * @param {HTMLElement} eventTarget * @return {void} */ executeCaptcha: function(eventTarget) { if (!eventTarget.dataset.hasOwnProperty('amCaptchaRendered')) { this.bindCaptchaGlobalCallbacks(eventTarget); this.renderCaptcha(eventTarget); eventTarget.dataset.amCaptchaRendered = ''; } const widgetId = this.getWidgetId(eventTarget); if (!widgetId) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ { type: "error", text: 'Recaptcha\u0020cannot\u0020properly\u0020validate\u0020form.' } ]); return; } window.dispatchEvent(new CustomEvent('amcaptcha-loading-start')); grecaptcha.reset(widgetId); if (!this.isInvisible) { this.stopAmcaptchaLoading(); return; } grecaptcha.execute(widgetId) .then(() => this.stopAmcaptchaLoading()) .catch(() => this.stopAmcaptchaLoading()); }, /** * Add recaptcha script to page * * @return {void} */ loadRecaptchaScript: function () { const lang = window.amRecaptchaModel.recaptchaConfig.lang; const url = `${window.amRecaptchaModel.url}?onload=amRecaptchaLoadCallback&render=explicit&${lang}`; const script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.async = true; document.head.appendChild(script); }, /** * Stop loader on page * * @return {void} */ stopAmcaptchaLoading: function () { window.dispatchEvent(new CustomEvent('amcaptcha-loading-stop')); }, /** * Add attributes to hide captcha badge * * @return {void} */ initAmcaptchaBadges: function () { if (!this.isInvisible) { return; } document.querySelectorAll('.grecaptcha-badge')?.forEach(captchaBadge => { captchaBadge?.setAttribute('x-data', '{ visible: true }'); captchaBadge?.setAttribute('x-on:amcaptcha-loading-start.window', 'visible = true'); captchaBadge?.setAttribute('x-on:amcaptcha-loading-stop.window', 'visible = false'); captchaBadge?.setAttribute(':class', '!visible && "invisible"'); }); }, /** * Get form widgetId * * @param {HTMLElement} eventTarget * @return {string} */ getWidgetId: function (eventTarget) { return eventTarget.dataset.amCaptchaWidgetId || eventTarget.closest('form')?.dataset.amCaptchaWidgetId; }, /** * Add captcha badge or checkbox to protected form. * Store widgetId in dataset to pass this info in callbacks * * @param {HTMLElement} eventTarget * @return {void} */ renderCaptcha: function (eventTarget) { const captchaElement = document.createElement('div'); const formContent = eventTarget.closest('form')?.querySelector('[data-element="form-content"]') ?? eventTarget.closest('form'); formContent?.appendChild(captchaElement); eventTarget.dataset.amCaptchaWidgetId = grecaptcha.render(captchaElement, { ...window.amRecaptchaModel?.recaptchaConfig, callback: () => { window.dispatchEvent(new CustomEvent( 'amrecaptcha-callback', { detail: this.getCaptchaCallbackDetail(eventTarget) })); }, 'expired-callback': () => { window.dispatchEvent(new CustomEvent( 'amrecaptcha-expired-callback', { detail: this.getCaptchaCallbackDetail(eventTarget) })); } }); }, /** * Get detail property for callback event * * @param {HTMLElement} eventTarget * @return {object} */ getCaptchaCallbackDetail: function (eventTarget) { return { widgetId: eventTarget.dataset.amCaptchaWidgetId, form: eventTarget } }, /** * Add functions that will be called on the global state * * @param {HTMLElement} eventTarget * @return {void} */ bindCaptchaGlobalCallbacks: function (eventTarget) { eventTarget.setAttribute( 'x-on:amrecaptcha-callback.window', `amRecaptchaModel.recaptchaCallback($event, $el)` ); eventTarget.setAttribute( 'x-on:amrecaptcha-expired-callback.window', 'amRecaptchaModel.expiredCallback($event, $el)' ); } }; })(window.amRecaptchaModel = window.amRecaptchaModel || {}); window.amRecaptchaLoadCallback = function () { window.dispatchEvent(new CustomEvent('amcaptcha-script-loaded')); }</script><script> (function (hyva) { 'use strict'; /** * We use multiple Store objects depending on which Alpine version is */ const isAlpineV3 = true; /** * @returns {string} */ function getInitEventName() { return isAlpineV3 ? 'alpine:init' : 'spruce:init'; } /** * @returns {Object} */ function getStoreObject() { return isAlpineV3 ? Alpine : Spruce; } hyva.amStorage = { /** * @param {string} key * @param {Object} object * @returns {void} */ create: (key, object) => { const eventName = key.toLowerCase() + '-created'; document.addEventListener(getInitEventName(), () => { getStoreObject().store(key, object); document.dispatchEvent(new Event(eventName)); }); }, /** * @param {string} key * @returns {Object} */ getStorage: (key) => { return getStoreObject().store(key); }, /** * @param {string} key * @param {Object} object * @returns {void} */ reInit: (key, object) => { isAlpineV3 ? getStoreObject().store(key, object) : getStoreObject().reset(key, object); } }; }(window.hyva = window.hyva || {}));</script><script> window.amastyCookieManager = window.amastyCookieManager || {};</script><script> window.amRecaptchaModel = window.amRecaptchaModel || {};</script><script> 'use strict'; (function(hyva) { const formValidationRules = { required(value, options, field, context) { const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element, msg = 'This\u0020is\u0020a\u0020required\u0020field.'; if (el.type === 'radio' || el.type === 'checkbox') { return (value === undefined || value.length === 0) ? msg : true; } el.setAttribute('required', ''); el.checkValidity(); return el.validity.valueMissing ? msg : true; }, maxlength(value, options, field, context) { const n = Number(options) if (value.length > n) { return n === 1 ? hyva.strf('Please\u0020enter\u0020no\u0020more\u0020than\u00201\u0020character.') : hyva.strf('Please\u0020enter\u0020no\u0020more\u0020than\u0020\u00250\u0020characters.', options) } return true; }, minlength(value, options, field, context) { const n = Number(options) if (value.length > 0 && value.length < n) { return n === 1 ? hyva.strf('Please\u0020enter\u0020at\u0020least\u00201\u0020character.') : hyva.strf('Please\u0020enter\u0020at\u0020least\u0020\u00250\u0020characters.', options) } return true; }, max(value, options, field, context) { field.element.setAttribute('max', options); field.element.checkValidity(); if (field.element.validity.rangeOverflow) { return hyva.strf('Please\u0020enter\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options); } return true; }, min(value, options, field, context) { field.element.setAttribute('min', options); field.element.checkValidity(); if (field.element.validity.rangeUnderflow) { return hyva.strf('Please\u0020enter\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00250\u0022.', options); } return true; }, step(value, options, field, context) { field.element.setAttribute('step', options); field.element.checkValidity(); if (field.element.validity.stepMismatch) { const val = Number(options); return hyva.strf('Please\u0020enter\u0020a\u0020valid\u0020value.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00250\u0022\u0020and\u0020\u0022\u00251\u0022.', Math.floor(val), Math.ceil(val)); } return true; }, pattern(value, options, field, context) { field.element.setAttribute('pattern', options); field.element.checkValidity(); if (field.element.validity.patternMismatch) { return field.element.title ? hyva.strf('Please\u0020match\u0020the\u0020requested\u0020format\u003A\u0020\u00250.', field.element.title) : 'Please\u0020match\u0020the\u0020requested\u0020format.' } return true; }, email(value, options, field, context) { const rule = /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i; if (value.length > 0 && !rule.test(value)) { return 'Please\u0020enter\u0020a\u0020valid\u0020email\u0020address.'; } return true; }, password(value, options, field, context) { const rule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/; if (value.length > 0 && !rule.test(value)) { return 'Please\u0020provide\u0020at\u0020least\u0020one\u0020upper\u0020case,\u0020one\u0020lower\u0020case,\u0020one\u0020digit\u0020and\u0020one\u0020special\u0020character\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026\u002A\u002D\u0029'; } return true; }, equalTo(value, options, field, context) { const dependencyField = context.fields[options].element; if (value !== dependencyField.value) { const dependencyFieldName = dependencyField.label || dependencyField.title || (dependencyField.labels && dependencyField.labels[0] && dependencyField.labels[0].innerText) || dependencyField.name; return hyva.strf('This\u0020field\u0020value\u0020must\u0020be\u0020the\u0020same\u0020as\u0020\u0022\u00250\u0022.', dependencyFieldName); } return true; } }; function raceSome(promises, pred) { return new Promise((resolve, reject) => { if (promises.length === 0) { return resolve(); } let settled = false, nDone = 0; const resolveIf = v => { if (!settled && (pred(v) || ++nDone === promises.length)) { settled = true; resolve(v); } return v; } promises.map(promise => { promise.then(resolveIf).catch(reason => { settled = true; reject(reason) }); return promise; }); }); } const INPUT_ATTRIBUTE_RULES = {min: 'min', max: 'max', required: 'required', minlength: 'minlength', maxlength: 'maxlength', step: 'step', pattern: 'pattern'} const INPUT_TYPE_RULES = {email: 'email'} function getRules(element) { let rules = {}; Object.keys(INPUT_ATTRIBUTE_RULES).forEach(attrName => { if (element.hasAttribute(attrName)) { rules[INPUT_ATTRIBUTE_RULES[attrName]] = element.getAttribute(attrName); } }) if (INPUT_TYPE_RULES[element.type]) { rules[INPUT_TYPE_RULES[element.type]] = true; } if (element.dataset.validate) { try { Object.assign(rules, JSON.parse(element.dataset.validate)); } catch (error) { console.error('Validator error. Cannot parse data-validate attribute of element:\n', element); } } return rules; } function isInvalidRuleResult(ruleState) { return typeof ruleState === 'string' || !ruleState || (ruleState.type && ruleState.content); } async function runValidateFn(rule, options, value, field) { return formValidationRules[rule](value, options, field, this); } function generateId() { let id; do { id = `${this.idPrefix}-${++this.idSeq}`; } while (document.getElementById(id)); return id; } function isVisible(element) { const el = element.type !== 'hidden' ? element : (element.parentElement || {}); return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length) } function elementWillValidate(element) { return (element.willValidate || element.type === 'hidden') && element.tagName !== 'BUTTON' && element.disabled === false && !(element.tagName === 'INPUT' && element.type === 'submit') && (element.hasAttribute('data-validate-hidden') || isVisible(element)) } function createMessageContainer(el, fieldWrapperClassName) { if (! el.parentElement) { return; } const refocus = document.activeElement === el; const wrapper = document.createElement('div'); wrapper.classList.add.apply(wrapper.classList, fieldWrapperClassName.split(' ')); el.parentElement.insertBefore(wrapper, el); wrapper.appendChild(el); refocus && document.activeElement !== el && el.focus(); return wrapper; } function containerNotFound(selector, el) { const msg = `Cannot find message container element ${selector} of ${el.name}`; console.error(msg, el); throw msg; } function createTextInputFrom(el) { const text = document.createElement('INPUT'); text.type = 'text'; text.value = el.value; return text; } function classNamesToSelector(classNames) { return classNames.split(' ') .filter(className => className.length > 0) .map(className => `.${className}`) .join('') } function hasMessagesWrapper(field, messagesWrapperClassName) { return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName)); } function getMessagesWrapper(field, messagesWrapperClassName) { if (hasMessagesWrapper.call(this, field, messagesWrapperClassName)) { return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName)); } const msgWrapper = document.createElement('ul'); const msgId = generateId.call(this); msgWrapper.id = msgId; field.element.setAttribute('aria-errormessage', msgId); field.element.setAttribute('aria-describedby', msgId); msgWrapper.classList.add.apply(msgWrapper.classList, messagesWrapperClassName.split(' ')); if (field.validateOnChange) { msgWrapper.setAttribute('aria-live', 'polite'); } this.getMessageContainer(field).appendChild(msgWrapper); return msgWrapper; } function getCheckedValues(field) { const name = field.element.name.replace(/([\\"])/g, '\\$1'); const elements = field.element.form.querySelectorAll('input[name="' + name + '"]:checked'); return Array.from(elements).map(el => el.value); } function escapeHtml(s) { const div = document.createElement('div') div.innerText = s; return div.innerHTML; } function formValidation(formElement, options) { if (formElement.tagName === 'FORM') { formElement.setAttribute('novalidate', ''); } else { console.error('formValidation can be initialized only on FORM element', formElement); return; } options = Object.assign({ fieldWrapperClassName: 'field field-reserved', messagesWrapperClassName: 'messages', validClassName: 'field-success', invalidClassName: 'field-error', pageMessagesWrapperSelector: null, scrollToFirstError: true, }, options || {}); return { state: { valid: false, }, fields: {}, idSeq: 0, idPrefix: formElement.id || 'vld-msg', setupFields(elements) { this.fields = {}; Array.from(elements).forEach(element => { if (elementWillValidate(element)) { this.setupField(element); } }); }, setupField(element) { if (! element) return; const onChange = !!element.dataset.onChange; if (elementWillValidate(element)) { const rules = getRules(element); if (Object.keys(rules).length > 0) { if (this.fields[element.name]) { Object.assign(this.fields[element.name].rules, rules); } else { this.fields[element.name] = { element, rules: rules, validateOnChange: onChange, state: { valid: null, rules: {} } } } } } else { console.error('Element will not validate', element); } }, onSubmit(event) { if (event.target.tagName === 'FORM') { event.preventDefault(); this.validate() .then(() => event.target.submit()) .catch(invalidElements => {}); } }, onChange(event) { event.target.dataset.onChange = 'true'; if (!Object.keys(this.fields).length) { this.setupFields(formElement.elements); } if (!Object.keys(this.fields).includes(event.target.name)) { this.setupField(event.target); } const field = this.fields[event.target.name]; this.validateField(field); field && field.element.removeAttribute('data-on-change') }, validateSafe() { return new Promise(resolve => this.validate().then(() => resolve(true)).catch(() => {})) }, validate() { if (!Object.keys(this.fields).length || !Object.keys(this.fields).length !== formElement.elements.length) { this.setupFields(formElement.elements); } return new Promise(async (resolve, reject) => { if (formElement.elements) { await raceSome(this.validateFields(), result => result !== true) const invalidFields = Object.values(this.fields).filter(field => !field.state.valid); this.state.valid = invalidFields.length === 0; if (this.state.valid) { resolve(); } else { if (options.scrollToFirstError && invalidFields.length > 0) { invalidFields[0].element.focus() invalidFields[0].element.select && invalidFields[0].element.select(); } reject(invalidFields.map(field => field.element)); } } }); }, validateFields() { const fields = Object.values(this.fields); fields.forEach(field => { this.getMessageContainer(field).classList.remove(options.validClassName, options.invalidClassName) }); return fields.map(field => this.validateField(field)) }, validateField(field) { if (! field || ! elementWillValidate(field.element)) { return new Promise(resolve => resolve(true)) } let value; if (field.element.type === 'checkbox') { value = getCheckedValues(field); } else if (field.element.type === 'radio') { value = getCheckedValues(field)[0] || undefined; } else if (field.element.tagName === 'SELECT' && field.element.multiple) { value = Array.from(field.element.selectedOptions).map(opt => opt.value); } else { value = field.element.value; } const rules = field.rules || {}; field.state.valid = true; this.showFieldState(field); const fieldValidations = Object.keys(rules).filter(rule => formValidationRules[rule]).map(async rule => { return runValidateFn.call(this, rule, rules[rule], value, field).then(result => { field.state.rules[rule] = result; return result; }) }); return new Promise(resolve => { Promise.all(fieldValidations).then(results => { field.state.valid = !elementWillValidate(field.element) || rules.length === 0 || !results.some(isInvalidRuleResult) this.showFieldState(field); resolve(field.state.valid); }) }); }, getMessagesByField(field) { const messages = []; const invalidRules = Object.keys(field.state.rules).filter(rule => isInvalidRuleResult(field.state.rules[rule])); field.rules && Object.keys(field.rules).forEach((rule) => { if (invalidRules.includes(rule)) { const customMessage = field.element.getAttribute('data-msg-' + rule); const message = customMessage ? customMessage : field.state.rules[rule]; const ruleOptions = JSON.parse(JSON.stringify(field.rules[rule])); if (typeof message === 'undefined' || message === null || (typeof message !== 'string' && ! message.type)) { messages.push(hyva.strf('Validation rule "%0" failed.', rule)); } else if (Array.isArray(ruleOptions)) { ruleOptions.unshift(message.type ? message.content : message); const content = hyva.strf.apply(null, ruleOptions); messages.push(message.type ? {type: message.type, content} : content); } else { const content = hyva.strf(message.type ? message.content : message, ruleOptions) messages.push(message.type ? {type: message.type, content} : content); } } }); return messages; }, /** @deprecated */ getFieldWrapper(field) { return this.getMessageContainer(field) }, getMessageContainer(field) { let container; const pageSelector = field.element.getAttribute('data-validation-container') || options.pageMessagesContainerSelector; if (pageSelector) { container = document.querySelector(pageSelector) || containerNotFound(pageSelector, field.element) } else { const containerSelector = classNamesToSelector(options.fieldWrapperClassName); container = field.element.closest(containerSelector) || createMessageContainer(field.element, options.fieldWrapperClassName) || containerNotFound(containerSelector, field.element); } return container; }, showFieldState(field) { const container = this.getMessageContainer(field), hasErrorMessages = hasMessagesWrapper.call(this, field, options.messagesWrapperClassName), messages = this.getMessagesByField(field).map(m => { return m.type !== 'html' ? escapeHtml(m.type ? m.content : m) : m.content; }); container.classList.toggle(options.validClassName, field.state.valid && ! hasErrorMessages); container.classList.toggle(options.invalidClassName, !field.state.valid || hasErrorMessages); this.createHtmlErrorMessage(field, messages); if (field.state.valid) { field.element.removeAttribute('aria-invalid'); } else { field.element.setAttribute('aria-invalid', 'true'); if (! document.activeElement) { field.element.focus(); } } }, removeMessages(field, messagesClass) { if (! hasMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName)) { return; } const msgWrapper = getMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName); const messages = msgWrapper.querySelectorAll(`[data-msg-field='${field.element.name}']`); Array.from(messages).forEach(msg => msg.remove()); if (msgWrapper && msgWrapper.childElementCount === 0) { field.element.removeAttribute('aria-errormessage'); field.element.removeAttribute('aria-describedby'); msgWrapper.remove(); } }, createErrorMessage(field, messages) { const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml) this.createHtmlErrorMessage(field, htmlMessages); }, createHtmlErrorMessage(field, messages) { this.removeMessages(field, options.messagesWrapperClassName); field.element.removeAttribute('aria-errormessage'); field.element.removeAttribute('aria-describedby'); if (!field.state.valid) { const msgWrapper = this.addHtmlMessages(field, options.messagesWrapperClassName, messages); field.element.setAttribute('aria-errormessage', msgWrapper.id); field.element.setAttribute('aria-describedby', msgWrapper.id); } }, /** @deprecated */ createMessage(field, message) { return this.addMessages(field, options.messagesWrapperClassName, message); }, addMessages(field, messagesClass, messages) { const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml) return this.addHtmlMessages(field, messagesClass, htmlMessages); }, addHtmlMessages(field, messagesClass, htmlMessages) { const msgWrapper = getMessagesWrapper.call(this, field, messagesClass); (Array.isArray(htmlMessages) ? htmlMessages : [htmlMessages]).forEach((htmlMessage) => { const li = document.createElement('li'); li.innerHTML = htmlMessage; li.setAttribute('data-msg-field', field.element.name); msgWrapper.appendChild(li); }); return msgWrapper; }, setField(name, value) { this.fields[name].element.value = value; this.fields[name].element.dispatchEvent((new Event('input'))); this.validateField(this.fields[name]); } } } hyva.formValidation = formValidation; hyva.formValidation.rules = formValidationRules; hyva.formValidation.setInputAttributeRuleName = (attrName, ruleName) => INPUT_ATTRIBUTE_RULES[attrName] = ruleName || attrName; hyva.formValidation.setInputTypeRuleName = (typeName, ruleName) => INPUT_TYPE_RULES[typeName] = ruleName || typeName; hyva.formValidation.addRule = (name, validator) => formValidationRules[name] = validator; }(window.hyva = window.hyva || {}));</script><script> function initHeader () { return { searchOpen: false, cart: {}, isCartOpen: false, getData(data) { if (data.cart) { this.cart = data.cart } }, isCartEmpty() { return !this.cart.summary_count }, toggleCart(event) { if (event.detail && event.detail.isOpen !== undefined) { this.isCartOpen = event.detail.isOpen if (!this.isCartOpen && this.$refs && this.$refs.cartButton) { this.$refs.cartButton.focus() } } else { this.isCartOpen = true } }, openShoppingCart() { window.location.href = this.$el.getAttribute('data-href'); } } }</script><script> 'use strict'; function amXsearchProductsComponent() { return { getResultProductsCount() { const suggestions = this.sections.products; const totalCount = suggestions?.total_count ?? 0; const itemsCount = suggestions?.items?.length ?? 0; return totalCount > 0 ? totalCount - itemsCount : 0; }, processProductName(value) { if (value.items) { value.items = value.items.map(item => { item.name = this.addHighlight(item, 'name'); item.sku = this.addHighlight(item, 'sku'); item.name = this.truncateWithDots(item.name, this.productNameMaxLength, true); return item; }); } return value; }, addHighlight(product, key = 'name') { const name = product[key]; const { latestQuery } = this; const queries = latestQuery.toLowerCase().split(" "); let highlightedName = name; for (const query of queries) { if (query.trim() !== "") { const regex = new RegExp(`(?!<[^>]*)(${query})(?![^<]*>)`, "gi"); highlightedName = highlightedName.replace(regex, match => `<span class="amsearch-highlight">${match}</span>`); } } return highlightedName; }, truncateWithDots(str, maxLength, returnOriginal = false) { if (maxLength === '' || maxLength < 1) { return returnOriginal ? str : ""; } let output = []; let tagBuffer = []; let count = 0; let inTag = false; for (const char of str) { if (char === "<") { inTag = true; } if (inTag) { tagBuffer.push(char); } else { count++; } if (char === ">") { inTag = false; output.push(tagBuffer.join("")); tagBuffer = []; } else if (!inTag) { output.push(char); } if (count >= maxLength) { break; } } if (count >= maxLength) { output.push("..."); } while (tagBuffer.length > 0) { const closingTagPos = str.indexOf(">", str.indexOf(tagBuffer.join("")) + tagBuffer.length); if (closingTagPos !== -1) { output.push(str.slice(str.indexOf(tagBuffer.join("")) + tagBuffer.length, closingTagPos + 1)); tagBuffer = []; } else { break; } } return output.join(""); }, getProductUrl(product) { return window.BASE_URL + product.url_key + (product.url_suffix || ''); }, getProductImageUrl(product) { const imageUrl = product.small_image.url; let mediaURL = this.config.customMediaUrl || imageUrl; if (mediaURL.includes('/media') && imageUrl.startsWith('media/')) { mediaURL = mediaURL.replace('/media', ''); } return (imageUrl.includes('://') ? '' : mediaURL) + imageUrl; }, /** * * @param product */ getRating(product) { const { rating_summary } = product; product.ratingData = { ratingSteps: 5, starsFilled: Math.floor(+rating_summary / 100 * 5), starFragment: rating_summary / 100 * 5 % 1, starsEmpty: Math.floor(5 - (+rating_summary / 100 * 5)), yellowHex: '#FE9901', greyHex: '#cbd5e0', averageRating: (rating_summary / 20).toFixed(1) }; return product; }, isM1(product) { return product.type === 1 }, isSaas(product) { return product.custom_stock_status === 'Saas' }, isService(product) { return product.type === +'99' }, isRequestQuote(product) { return product.custom_stock_status === 'Request a quote' }, isRevisingDemand(product) { return product.custom_stock_status === 'Revising demand' }, isCalcurates(product) { return product.id === 1490 } } }</script><script> 'use strict'; (()=> { const browserCache = { set(key, value) { const now = new Date(); const item = { value: value, expiry: now.getTime() + 5 * 60 * 1000, }; localStorage.setItem(key, JSON.stringify(item)); }, get(key) { const itemStr = localStorage.getItem(key); if (!itemStr) { return null; } const item = JSON.parse(itemStr); const now = new Date(); if (now.getTime() > item.expiry) { localStorage.removeItem(key); return null; } return item.value; } }; window._amXSearchConfigFetcher = null; window.amXsearchAutocompleteComponent = () => { const INITIAL_QUERY_CACHE_KEY = 'x.InitialQuery'; const CONFIG_QUERY_CACHE_KEY = 'x.ConfigQuery'; const PREV_QUERY_CACHE_KEY = 'x.PrevQuery'; const HEADER_TYPE = 'b'; const cache = {}; const dataSections = { products: false, category: false, page: false, faq: false, landingPage: false, browsingHistory: false, popularSearches: false, bestsellers: false, recentSearches: false, recentlyViewed: false, brand: false, blog: false }; return { isLoading: false, searchInitialized: false, latestQuery: '', productNameMaxLength: 100, resultPageUrl: 'https://amasty.com/catalogsearch/result/?q=', minSearchLength: 3, maxSearchLength: 128, isDefaultSearchInput: true, isFullWidthSearch: false, searchPopupWidth: 900, showOverlay: false, config: {}, slider: { bestsellers: false, recentlyViewed: false }, isHorizontalView: true, noResultsFound: false, errorMessage: null, isProductsShown: false, regex: { tags: /(<([^>]+)>)/gi }, sections: Object.create(dataSections), isHyvaUiHeader() { return HEADER_TYPE.length && HEADER_TYPE !== 'default'; }, checkHyvaUiHeaderVariant(needle) { return this.isHyvaUiHeader() && needle === HEADER_TYPE; }, dynamicLayout($el) { const matchMedia = window.matchMedia('(max-width: 768px)'); const isHorizontalViewPopupWidth = this.searchPopupWidth < 700 && !this.isDefaultSearchInput && !this.isFullWidthSearch; this.isHorizontalView = !matchMedia.matches ? isHorizontalViewPopupWidth : true; matchMedia.addEventListener('change', event => { this.isHorizontalView = !matchMedia.matches ? isHorizontalViewPopupWidth : true; }) if (!window._amXSearchConfigFetcher) { window._amXSearchConfigFetcher = new Promise(async resolve => { const cachedData = browserCache.get(CONFIG_QUERY_CACHE_KEY); if (cachedData) { return resolve(cachedData); } const query = `query {config: storeConfig { isProductReviewsBlockEnabled: amasty_xsearch_product_reviews isProductAddToCartBlockEnabled: amasty_xsearch_product_add_to_cart isRedirectToSingleProductEnabled: amasty_xsearch_product_redirect_single_product isFullScreenMode: amasty_xsearch_general_full_screen isGridView: amasty_xsearch_product_popup_display isShowSku: amasty_xsearch_product_show_sku shortDescriptionLength: amasty_xsearch_product_desc_length customMediaUrl: secure_base_media_url amasty_xsearch_products_title: amasty_xsearch_product_title amasty_xsearch_popularSearches_title: amasty_xsearch_popular_searches_title amasty_xsearch_browsingHistory_title: amasty_xsearch_browsing_history_title amasty_xsearch_recentSearches_title: amasty_xsearch_recent_searches_title amasty_xsearch_recentlyViewed_title: amasty_xsearch_recently_viewed_title amasty_xsearch_landingPage_title: amasty_xsearch_landing_page_title amasty_xsearch_bestsellers_position amasty_xsearch_faq_title amasty_xsearch_brand_title amasty_xsearch_blog_title amasty_xsearch_category_title amasty_xsearch_bestsellers_title amasty_xsearch_page_title amasty_xsearch_popularSearches_first_click: amasty_xsearch_popular_searches_first_click amasty_xsearch_browsingHistory_first_click: amasty_xsearch_browsing_history_first_click amasty_xsearch_recentSearches_first_click: amasty_xsearch_recent_searches_first_click amasty_xsearch_layout_enabled amasty_xsearch_layout_border amasty_xsearch_layout_hover amasty_xsearch_layout_highlight amasty_xsearch_layout_background amasty_xsearch_layout_text amasty_xsearch_layout_hover_text amasty_xsearch_layout_search_button amasty_xsearch_layout_search_button_text }}`; const response = await this.fetch(query, {}, CONFIG_QUERY_CACHE_KEY, false); if (response.errors && response.errors.length > 0) { console.error(response.errors); } browserCache.set(CONFIG_QUERY_CACHE_KEY, response); resolve(response); }); } _amXSearchConfigFetcher.then(response => { if (!response?.data?.config) { return; } this.config = response.data.config; this.processCustomLayoutStyles($el); }); if (typeof this.searchOpen !== "undefined") { this.$watch('searchOpen', val => { if (!val && this.isMobile('(max-width: 1023px)')) { document.body.classList.remove('amxsearch-open'); $el.classList.add('hidden'); return; } if (this.isMobile('(max-width: 1023px)')) { $el.classList.remove('hidden'); document.body.classList.add('amxsearch-open'); } else { if (val) { $el.classList.add('show-search-wrapper'); } } if (document.body.classList.contains('-ammenu-opened')) { const event = new Event('click'); document.querySelector('[data-ammenu-js="menu-toggle"]').dispatchEvent(event); } requestAnimationFrame(() => { const searchInput = document.querySelector('#search'); searchInput && searchInput.focus(); }); }); } if (typeof this.showOverlay !== "undefined") { this.$watch('showOverlay', val => { if (!val) { return; } this.applyHyvaUiHeaderConfig() }); } this.applyHeaderTypeToContainers(); }, isSidebarSectionsDisabled() { if (!this.isHorizontalView) { return !Object.entries(this.sections).some(([key, value]) => key !== 'products' && key !== 'bestsellers' && key !== 'recentlyViewed' && value.total_count > 0 ); } }, showSideBar() { const recentlyViewed = this.sections?.recentlyViewed; return this.latestQuery.length >= 3 || (recentlyViewed && recentlyViewed?.items?.length); }, showHandler(blockName) { if (this.isProductsShown) { if (blockName === 'products') { return true; } else { return false } } else { return this.latestQuery.length >= this.minSearchLength || this.showOnFirstClick(blockName); } }, showOnFirstClick(blockName) { const sectionsToCheck = [ 'popularSearches', 'browsingHistory', 'recentSearches' ]; if (!sectionsToCheck.includes(blockName)) { return false; } return this.latestQuery.length < this.minSearchLength && this.config[`amasty_xsearch_${blockName}_first_click`] && this.sections[blockName]?.items?.length; }, processCustomLayoutStyles() { const conf = key => this.config[`amasty_xsearch_layout_${key}`]; if (!conf("enabled")) { return ""; } const styles = [ "border", "hover", "highlight", "background", "text", "hover_text", 'search_button', 'search_button_text' ]; const cachedConf = styles.reduce((acc, key) => { acc[key] = conf(key); return acc; }, {}); const getDarken = (color, amount) => { const hex = parseInt(color.slice(1), 16); const r = Math.min(255, Math.max(0, ((hex >> 16) & 0xff) + amount)); const g = Math.min(255, Math.max(0, ((hex >> 8) & 0xff) + amount)); const b = Math.min(255, Math.max(0, (hex & 0xff) + amount)); return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, "0")}`; }; const prefix = "--amsearch-color-"; styles.forEach((key) => { const color = cachedConf[key]; document.body.style.setProperty(prefix + key, `#${color}`); document.body.style.setProperty(`${prefix + key}-focus`, getDarken(`#${color}`, -12)); document.body.style.setProperty(`${prefix + key}-hover`, getDarken(`#${color}`, -16)); }); }, canShowSection(sectionData) { return sectionData && sectionData.items && sectionData.items.length > 0; }, initialSectionLoad() { const req = this.fetch(`query xSearchQuery { recentlyViewed: xsearchRecentlyViewed { items { small_image { label url } id is_salable short_description { html } name options_container rating_summary reviews_count sku url_key url_suffix price_range { minimum_price { regular_price { value currency } final_price { value currency } } maximum_price { regular_price { value currency } final_price { value currency } } } } } popularSearches: xsearchPopularSearches { code items { name num_results url } total_count } recentSearches: xsearchRecentSearches { code items { name num_results url } total_count } browsingHistory: xsearchBrowsingHistory { code items { name url } total_count } }`, {}, INITIAL_QUERY_CACHE_KEY); req.then(response => { if (response.errors && response.errors.length > 0) { console.error(response.errors); } this.searchInitialized = true; this.processResponse(response); }); }, encodeHtml(html) { const txt = document.createElement('textarea'); txt.textContent = this.stripTags(html) || ''; return txt.innerHTML; }, stripTags: function (string) { if (this.regex.tags.test(string)) { return string.replace(this.regex.tags, ''); } return string; }, sanitize(value) { if (typeof DOMPurify === 'function') { return DOMPurify.sanitize(value) } else { return this.encodeHtml(value) } }, doSearch() { const { searchInput } = this.$refs; const { latestQuery, minSearchLength } = this; const inputText = this.sanitize(searchInput.value); if (inputText !== latestQuery && cache[PREV_QUERY_CACHE_KEY]) { delete cache[PREV_QUERY_CACHE_KEY]; } this.latestQuery = this.sanitize(searchInput.value); if (inputText.length < minSearchLength) { this.showOverlay = true; this.initialSectionLoad(); return; } this.noResultsFound = null; this.errorMessage = null; const query = `query xSearchQuery($inputText: String!) { products: xsearchProducts(search: $inputText) { code items { __typename small_image { label url } id is_salable short_description { html } name rating_summary reviews_count sku url_key url_suffix price_range { minimum_price { regular_price { value currency } final_price { value currency } } maximum_price { regular_price { value currency } final_price { value currency } } } type hyva_compatible custom_stock_status opposite_product is_salable_service show_in_ajax_search opposite_product_data { name type is_salable url_key url_suffix price_range { minimum_price { regular_price { value currency } final_price { value currency } } maximum_price { final_price { value currency } } } } product_label { label_id name status priority is_single use_for_parent frontend_settings { label_text type image image_size position style alt_tag redirect_url } tooltip { status color background_color content } } } total_count } browsingHistory: xsearchBrowsingHistory { code items { name url } total_count } recentSearches: xsearchRecentSearches { code items { name num_results url } total_count } popularSearches: xsearchPopularSearches { code items { name num_results url } total_count } terms: xsearchRelatedTerms(search: $inputText) { items { count name } } } `; const req = this.fetch(query, { inputText }, PREV_QUERY_CACHE_KEY); req.then(response => { if (response.errors && response.errors.length > 0) { this.errorMessage = response.errors[0].message; console.error(this.errorMessage); } this.searchInitialized = true; this.processResponse(response); }); }, fetch(query, variables = {}, cacheKey = null, useLoading = true) { if (cacheKey && cache[cacheKey]) { return Promise.resolve(cache[cacheKey]); } if (useLoading) { this.isLoading = true; } const req = fetch(`${BASE_URL}graphql`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query, variables}), }); req.catch(reason => console.error(reason)); return req.then(response => { if (!response.ok) { throw new Error(`HTTP error: ${response.status}`); } const body = response.json(); if (cacheKey) { cache[cacheKey] = body; } return body; }); }, checkSearchInput() { if (this.$refs.searchInput.value === '') { this.clear(); } }, redirect() { this.isLoading = true; const { searchInput } = this.$refs; const inputText = this.sanitize(searchInput.value); const products = this.sections.products; if (products && products.items.length === 1 && this.config.isRedirectToSingleProductEnabled) { location.href = this.getProductUrl(products.items[0]); return; } const url = 'https://amasty.com/catalogsearch/result/?q='; location.href = url + inputText; }, focusElement(element) { if (element && element.nodeName === "DIV") { element.focus(); return true; } return false; }, processResponse(response) { this.updateSections(response.data); }, clear() { const initialQueryCache = cache[INITIAL_QUERY_CACHE_KEY]; if (!initialQueryCache) { return; } initialQueryCache.then(result => { this.updateSections(result.data ?? {}); }); }, closeSearch() { if (this.searchOpen) { this.searchOpen = false; this.$root.classList.remove('show-search-wrapper'); } this.$nextTick(() => { this.showOverlay = false; this.searchInitialized = false; }) if (this.checkHyvaUiHeaderVariant('c')) { this.$refs.searchContainerDesktop.classList.remove(HEADER_TYPE + '-header-type'); } }, processItemsWithRating(value) { if (value.items) { value.items = value.items.map(this.getRating.bind(this)); } return value; }, processSection(key, value) { if (!value) { return value; } let processedValue; switch (key) { case 'recentlyViewed': case 'bestsellers': processedValue = this.processItemsWithRating(value); if (processedValue.items) { processedValue.items = (processedValue.items || []).map(item => { item.isSliderItem = true; return item; }); } break; case 'products': processedValue = this.processItemsWithRating(value); processedValue = this.processProductName(processedValue); break; default: processedValue = value; } processedValue.title = this.config[`amasty_xsearch_${key}_title`]; return processedValue; }, updateSections(rows) { this.isProductsShown = false; if (!this.showOverlay) { this.showOverlay = true; } this.isLoading = false; this.noResultsFound = !rows.products?.total_count && this.latestQuery.length >= this.minSearchLength; if (!this.noResultsFound) { this.errorMessage = null; } if (rows.products?.total_count) { this.isProductsShown = true; } for (const key in dataSections) { const data = rows[key]; this.sections[key] = data?.items?.length > 0 ? this.processSection(key, data) : {items: [], total_count: 0}; } if (this.latestQuery.length >= this.minSearchLength) { return; } for (const key in this.slider) { const items = rows[key]?.items; if (rows.hasOwnProperty(key) && items?.length && !this.slider[key]) { this.slider[key] = this.amXsearchCarouselComponent(key, items.length); } } }, ...AmsiteUtils() } } })();</script><script> 'use strict'; /** * Carousel component for xsearch * * @param key * @param itemCount * @returns Object */ function amXsearchCarouselComponent(key, itemCount) { return { itemCount, pageSize: 4, active: 0, slider: null, pageFillers: 0, sliderEl: false, smallWindowItemWidth: false, init($refs) { const sliderEl = $refs[`${key}Container`]; if (!sliderEl || itemCount === 0) { return this; } if (sliderEl) { if (!this.isDefaultSearchInput && !this.isFullWidthSearch) { if (this.searchPopupWidth <= 900) { this.smallWindowItemWidth = sliderEl.clientWidth / 3; } if (this.searchPopupWidth <= 700) { this.smallWindowItemWidth = sliderEl.clientWidth / 2; } if (this.searchPopupWidth <= 500) { this.smallWindowItemWidth = sliderEl.clientWidth - 30; } } } this.sliderEl = sliderEl; this.recalculate(); }, getSlider() { return this.sliderEl.querySelector('.carousel-slides'); }, calcPageSize() { const slider = this.getSlider(); if (!slider) { return this; } const slides = slider.querySelectorAll('.carousel-slide'); if (this.smallWindowItemWidth) { slides.forEach(slide => { slide.style.width = `${this.smallWindowItemWidth}px`; }); } const firstSlide = slides[0]; this.itemCount = slides.length; this.pageSize = Math.round(slider.clientWidth / firstSlide.clientWidth); this.pageFillers = this.pageSize * Math.ceil(this.itemCount / this.pageSize) - this.itemCount; }, calcActive() { const slider = this.getSlider(); if (!slider) { return this; } const sliderItems = Math.round(this.itemCount) + Math.round(this.pageFillers); const calculatedActiveSlide = Math.round( Math.round(slider.scrollLeft) / (Math.round(slider.scrollWidth) / sliderItems) ); this.active = Math.round(calculatedActiveSlide / Math.round(this.pageSize)) * Math.round(this.pageSize); }, prev() { this.scrollTo(this.active - this.pageSize); }, next() { this.scrollTo(this.active + this.pageSize); }, scrollTo(index) { const slider = this.getSlider(); if (!slider) { return this; } const slideWidth = slider.scrollWidth / (this.itemCount + this.pageFillers); slider.scrollLeft = Math.floor(slideWidth) * index; this.calcActive(); }, isActive(index) { return index === this.active; }, recalculate() { this.calcPageSize(); setTimeout(() => this.calcActive(), 100); }, onResize() { this.calcPageSize(); setTimeout(() => this.calcActive(), 100); } }; }</script><script> 'use strict'; function amXsearchAutocompleteHyvaUIHeaderCompat() { const HEADER_TYPE = 'b'; return { applyHyvaUiHeaderConfig() { const searchContent = document.getElementById('search-content'); if (this.isFullWidthSearch) { if (!this.isHorizontalView) { if (this.checkHyvaUiHeaderVariant('b')) { searchContent.style = 'max-width:none'; searchContent.parentNode.style = 'padding-right:0; padding-left:0;'; } if (this.checkHyvaUiHeaderVariant('c')) { this.$refs.searchContainerDesktop.classList.add(HEADER_TYPE + '-header-type'); this.$refs.searchForm.style = 'padding-right:0; padding-left:0;'; } } if (this.checkHyvaUiHeaderVariant('a')) { searchContent.style = 'max-width: none'; } } }, applyHeaderTypeToContainers() { const searchHeader = document.getElementById('header'); const columnMain = document.querySelector('.column.main'); const searchContent = document.getElementById('search-content'); const headerTypeClass = HEADER_TYPE + '-header-type'; if (searchHeader || columnMain) { searchHeader.classList.add(headerTypeClass); columnMain.classList.add(headerTypeClass); } if (this.checkHyvaUiHeaderVariant('a')) { searchContent.className = 'container'; } } } }</script><script> 'use strict'; function initAmlabel_67bf234ad57d5() { return { element: null, elementStyle: null, parent: null, parentWidth: null, initialized: false, wrapperClass: '', wrapperStyle: null, labelContainer: null, labelWidth: null, amLabelStyle: null, /** * @param $el */ initLabel($el) { this.element = $el; this.labelContainer = this.$refs.amLabel; this.labelWidth = Number(this.$refs.amLabelElement.dataset.size); this.parent = this.$refs.amLabelParent; this.parentWidth = this.$refs.amLabelImgParent.width; this.wrapperClass = `[data-wrapper-class=${this.$refs.amLabelElement.dataset.wrapperClass}]`; this.wrapperStyle = this.$refs.amLabelWrapper.classList; switch ($el.dataset.position) { case '0': this.elementStyle = ' top-0 left-0'; this.amLabelStyle = ' items-start' break; case '1': this.elementStyle = ' top-0 mx-auto'; this.amLabelStyle = ' items-start' break; case '2': this.elementStyle = ' top-0 right-0'; this.amLabelStyle = ' items-end' break; case '3': this.elementStyle = ' top-1/2 -translate-y-1/2 left-0'; this.amLabelStyle = ' items-start' break; case '4': this.elementStyle = ' top-1/2 -translate-y-1/2 mx-auto'; this.amLabelStyle = ' items-start' break; case '5': this.elementStyle = ' top-1/2 -translate-y-1/2 right-0'; this.amLabelStyle = ' items-end' break; case '6': this.elementStyle = ' bottom-0 left-0'; this.amLabelStyle = ' items-start' break; case '7': this.elementStyle = ' bottom-0 mx-auto'; this.amLabelStyle = ' items-start' break; case '8': this.elementStyle = ' bottom-0 right-0'; this.amLabelStyle = ' items-end' break; } this.$refs.amLabelWrapper.classList = this.wrapperStyle + this.elementStyle; if ('0' === '0') { this.$refs.amLabelWrapper.classList = this.$refs.amLabelWrapper.classList + this.amLabelStyle; } }, /** * @return {void} */ render() { if (this.element.dataset.amlabelObserved) { return; } this.element.dataset.amlabelObserved = true; this.parentContainerProcessor.process(this); this.labelItemProcessor.process(this); this.initialized = true; }, /** * @param url * @returns {string} */ getImgLabelPath(url) { const baseUrl = BASE_URL.replace('index.php/', ''); return `${baseUrl}media/amasty/amlabel/${url}`; }, /** * @param url */ labelRedirect(url) { return window.location.assign(`${BASE_URL + url}`); }, /** * @returns {string|string} */ getImageSize() { return this.labelWidth ? this.parentWidth * this.labelWidth / 100 + 'px': ''; } } }</script><script> 'use strict'; function initAmlabel_67bf234ad5998() { return { element: null, elementStyle: null, parent: null, parentWidth: null, initialized: false, wrapperClass: '', wrapperStyle: null, labelContainer: null, labelWidth: null, amLabelStyle: null, /** * @param $el */ initLabel($el) { this.element = $el; this.labelContainer = this.$refs.amLabel; this.labelWidth = Number(this.$refs.amLabelElement.dataset.size); this.parent = this.$refs.amLabelParent; this.parentWidth = this.$refs.amLabelImgParent.width; this.wrapperClass = `[data-wrapper-class=${this.$refs.amLabelElement.dataset.wrapperClass}]`; this.wrapperStyle = this.$refs.amLabelWrapper.classList; switch ($el.dataset.position) { case '0': this.elementStyle = ' top-0 left-0'; this.amLabelStyle = ' items-start' break; case '1': this.elementStyle = ' top-0 mx-auto'; this.amLabelStyle = ' items-start' break; case '2': this.elementStyle = ' top-0 right-0'; this.amLabelStyle = ' items-end' break; case '3': this.elementStyle = ' top-1/2 -translate-y-1/2 left-0'; this.amLabelStyle = ' items-start' break; case '4': this.elementStyle = ' top-1/2 -translate-y-1/2 mx-auto'; this.amLabelStyle = ' items-start' break; case '5': this.elementStyle = ' top-1/2 -translate-y-1/2 right-0'; this.amLabelStyle = ' items-end' break; case '6': this.elementStyle = ' bottom-0 left-0'; this.amLabelStyle = ' items-start' break; case '7': this.elementStyle = ' bottom-0 mx-auto'; this.amLabelStyle = ' items-start' break; case '8': this.elementStyle = ' bottom-0 right-0'; this.amLabelStyle = ' items-end' break; } this.$refs.amLabelWrapper.classList = this.wrapperStyle + this.elementStyle; if ('0' === '0') { this.$refs.amLabelWrapper.classList = this.$refs.amLabelWrapper.classList + this.amLabelStyle; } }, /** * @return {void} */ render() { if (this.element.dataset.amlabelObserved) { return; } this.element.dataset.amlabelObserved = true; this.parentContainerProcessor.process(this); this.labelItemProcessor.process(this); this.initialized = true; }, /** * @param url * @returns {string} */ getImgLabelPath(url) { const baseUrl = BASE_URL.replace('index.php/', ''); return `${baseUrl}media/amasty/amlabel/${url}`; }, /** * @param url */ labelRedirect(url) { return window.location.assign(`${BASE_URL + url}`); }, /** * @returns {string|string} */ getImageSize() { return this.labelWidth ? this.parentWidth * this.labelWidth / 100 + 'px': ''; } } }</script><script> function initCartDrawer() { return { isGlobalOpen: false, open: false, isLoading: false, cart: {}, maxItemsToDisplay: 10, itemsCount: 0, isHoverOnCartWrapper: false, totalCartAmount: 0, removedBlock: [], mainBlock: [], getData(data) { if (data.cart) { this.cart = data.cart; this.itemsCount = data.cart.items && data.cart.items.length || 0; this.totalCartAmount = this.cart.summary_count; this.setCartItems(); } }, cartItems: [], setCartItems() { this.cartItems = this.cart.items && this.cart.items.sort((a, b) => b.item_id - a.item_id) || []; if (this.maxItemsToDisplay > 0) { this.cartItems = this.cartItems.slice(0, parseInt(this.maxItemsToDisplay, 10)); } this.removeActions(); }, deleteItemFromCart(item, target) { const formKey = hyva.getFormKey(); const postUrl = BASE_URL + 'checkout/sidebar/removeItem/'; this.isLoading = true; this.animationRemoveItem(item.item_id, target); fetch(postUrl, { "headers": { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }, "body": "form_key=" + formKey + "&item_id=" + item.item_id, "method": "POST", "mode": "cors", "credentials": "include" }).then(response => { if (response.redirected) { window.location.href = response.url; } else if (response.ok) { return response.json(); } else { window.dispatchMessages && window.dispatchMessages([{ type: 'warning', text: 'Could\u0020not\u0020remove\u0020item\u0020from\u0020quote.' }]); this.isLoading = false; } }).then(result => { if (!result.success) { window.dispatchMessages && window.dispatchMessages([{ type: 'error', text: result.error_message }], 5000) this.isLoading = false; } window.dispatchEvent(new CustomEvent('reload-customer-section-data')); }); }, toggleCartDrawer(event) { if (this.isMobile('(max-width: 1023px)')) { return; } if (event.detail && event.detail.isOpen !== undefined) { if (event.detail.isOpen) { this.isOpen = true; this.openCartDrawer() this.isGlobalOpen = !event.detail.showAfterAdd; } else { this.open = false; this.$refs && this.$refs.cartDialogContent && hyva.releaseFocus(this.$refs.cartDialogContent) } } else { this.openCartDrawer() } }, openCartDrawer() { this.open = true; this.$nextTick(() => { this.$refs && this.$refs.cartDialogContent }) setTimeout(() => { this.$refs.cartDialogContent.focus() }, 500); if (this.closeTimeout) { clearTimeout(this.closeTimeout); } this.closeTimeout = setTimeout(() => { if (!this.isGlobalOpen) { this.closeCartDrawer(); } }, 5000); }, closeCartDrawer() { this.$dispatch('toggle-cart', { isOpen: false }); }, closeCartWithDelay() { this.isGlobalOpen = false; setTimeout(() => { if (this.isGlobalOpen) { return; } this.closeCartDrawer(); }, 500); }, getAdditionalOptions(item) { var period = item.product_subscription_period, typeUser = item.subscription_type.toLowerCase(), typeVersion = item.product_subscription_version; period = period === 'year' ? 'annual' : period; if (window.dataForSubscriptions[typeUser]) { return '<p class="list-item">&mdash; ' + window.dataForSubscriptions[typeUser][period][typeVersion] .join('</p><p class="list-item">&mdash; ') + '</p>'; } return ''; }, animationRemoveItem(itemId, target) { const itemBlock = target.closest(`[data-amsite-js="${itemId}"]`); const removeBlock = document.querySelector('[data-amsite-js="removeBlock"]'); const mainBlock = itemBlock.querySelector('[data-amsite-js="item-main-block"]'); const clonedRemoveBlock = removeBlock.cloneNode(true); mainBlock.classList.add('hidden'); itemBlock.appendChild(clonedRemoveBlock); clonedRemoveBlock.classList.remove('hidden'); this.removedBlock.push(clonedRemoveBlock); this.mainBlock.push(mainBlock); }, removeActions() { if (this.removedBlock.length) { this.removedBlock.forEach((block) => { block.remove(); }); this.mainBlock.forEach((block) => { block.classList.remove('hidden'); }); this.isLoading = false; if (document.body.classList.contains('checkout-cart-index')) { window.location.reload(); } } }, showRemoveMessage(item, target) { window.dispatchEvent( new CustomEvent('minicart-popup-show-notification', {detail: {item, target}}) ) }, ...AmsiteUtils() } }</script><script> const AmMiniCartPopupNotification = function () { const TEXTS = { transferred: 'This\u0020product\u0020is\u0020transferred.\u0020If\u0020you\u0020delete\u0020it,\u0020you\u0020will\u0020no\u0020longer\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020be\u0020able\u0020to\u0020buy\u0020it\u0020with\u0020a\u0020100\u0025\u0020discount\u0020for\u0020the\u0020initial\u0020order.\u0020Would\u0020you\u0020still\u0020like\u0020to\u0020proceed\u003F', free: 'Are\u0020you\u0020sure\u0020you\u0020want\u0020to\u0020remove\u0020the\u0020free\u0020gift\u0020from\u0020the\u0020cart\u003F\u0020Once\u0020deleted\u000A\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020\u0020you\u0020won\u2019t\u0020be\u0020able\u0020to\u0020add\u0020it\u0020again.', }; return { item: {}, target: null, showNotification(data) { this.item = data.detail.item; this.target = data.detail.$el; this.createContentForPopup(this.item ); this.show('minicart-popup-notification'); }, createContentForPopup(item) { const itemType = item.is_transfered ? 'transferred' : 'free'; this.$refs.minicartNotificationContent.textContent = TEXTS[itemType]; } } }</script><script type="text/x-magento-init"> { ".breadcrumbs": { "breadcrumbs": {"categoryUrlSuffix":".html","useCategoryPathInUrl":1,"product":"Special Occasion Coupons for Magento 2","breadcrumbs":[{"label":"Promotions","link":"https:\/\/amasty.com\/promotions-extensions-for-magento-2.html"},{"label":"Magento 2 Extensions","link":"https:\/\/amasty.com\/magento-2-extensions.html"}]} } }</script><script type="text/x-magento-init"> { "*": { "Magento_Ui/js/core/app": { "components": { "messages": { "component": "Magento_Theme/js/view/messages", "floatingMessages": "true" } } } } }</script><script type="text/x-magento-init"> { "[data-gallery-role=gallery-placeholder]": { "amsiteGalleryInit": { "mixins":["magnifier/magnify"], "magnifierOpts": {"fullscreenzoom":"20","top":"","left":"","width":"","height":"","eventType":"hover","enabled":false}, "data": [{"thumb":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/d492300003ec9ae05261558b2c675287\/screenshots\/special-occasion-coupons-for-magento-2\/intro.png","img":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/442addc013119a99308eafd27d784beb\/screenshots\/special-occasion-coupons-for-magento-2\/intro.png","full":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/8b14a410c096e2fc1a81f19ab33fad4c\/screenshots\/special-occasion-coupons-for-magento-2\/intro.png","caption":"automatically provide personal discounts to thousands of customers","position":"1","isMain":false,"type":"image","videoUrl":null},{"thumb":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/d492300003ec9ae05261558b2c675287\/screenshots\/special-occasion-coupons-for-magento-2\/1.png","img":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/442addc013119a99308eafd27d784beb\/screenshots\/special-occasion-coupons-for-magento-2\/1.png","full":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/8b14a410c096e2fc1a81f19ab33fad4c\/screenshots\/special-occasion-coupons-for-magento-2\/1.png","caption":"send promo codes based on unique customers' events","position":"2","isMain":false,"type":"image","videoUrl":null},{"thumb":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/d492300003ec9ae05261558b2c675287\/screenshots\/special-occasion-coupons-for-magento-2\/2.png","img":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/442addc013119a99308eafd27d784beb\/screenshots\/special-occasion-coupons-for-magento-2\/2.png","full":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/8b14a410c096e2fc1a81f19ab33fad4c\/screenshots\/special-occasion-coupons-for-magento-2\/2.png","caption":"fine-tune the dispatch options for each coupon type","position":"3","isMain":false,"type":"image","videoUrl":null},{"thumb":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/d492300003ec9ae05261558b2c675287\/screenshots\/special-occasion-coupons-for-magento-2\/3.png","img":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/442addc013119a99308eafd27d784beb\/screenshots\/special-occasion-coupons-for-magento-2\/3.png","full":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/8b14a410c096e2fc1a81f19ab33fad4c\/screenshots\/special-occasion-coupons-for-magento-2\/3.png","caption":"choose predefined email templates or create your own custom one","position":"4","isMain":false,"type":"image","videoUrl":null}], "options": {"nav":"thumbs","loop":true,"keyboard":true,"arrows":true,"allowfullscreen":true,"showCaption":false,"width":960,"thumbwidth":180,"thumbheight":132,"height":704,"transitionduration":600,"transition":"crossfade","navarrows":true,"navtype":"slides","navdir":"horizontal","thumbmargin":2}, "fullscreen": {"nav":"thumbs","loop":true,"navdir":"horizontal","navarrows":true,"navtype":"slides","arrows":true,"showCaption":false,"transitionduration":600,"transition":"crossfade"}, "breakpoints": {"mobile":{"conditions":{"max-width":"1023px"},"options":{"options":{"nav":false}}}} ,"amGalleryConfig": { "position": "bottom" } } } }</script><script type="text/x-magento-init"> { "[data-gallery-role=gallery-placeholder]": { "Magento_ProductVideo/js/fotorama-add-video-events": { "videoData": [{"mediaType":"image","videoUrl":null,"isBase":false},{"mediaType":"image","videoUrl":null,"isBase":false},{"mediaType":"image","videoUrl":null,"isBase":false},{"mediaType":"image","videoUrl":null,"isBase":false}], "videoSettings": [{"playIfBase":"0","showRelated":"0","videoAutoRestart":"0"}], "optionsVideoData": {"687":[],"688":[],"2840":[]} } } }</script><script type="text/x-magento-init"> { ".amshopby-option-link [data-amshopby-js='brand-tooltip']": { "amShopbyTooltipInit": { "additionalClasses": "-no-double", "position": { "my": "left bottom-10", "at": "left top", "collision": "flipfit flip" }, "selector": "a" } } }</script><script type="text/x-magento-init"> { "[data-role=swatch-options]": { "Magento_Swatches/js/swatch-renderer": { "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["687"]},{"id":"5","label":"Enterprise","products":["688"]},{"id":"81","label":"Magento Cloud","products":["2840"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"687":{"baseOldPrice":{"amount":109},"oldPrice":{"amount":109},"basePrice":{"amount":109},"finalPrice":{"amount":109},"tierPrices":[],"msrpPrice":{"amount":0}},"688":{"baseOldPrice":{"amount":409},"oldPrice":{"amount":409},"basePrice":{"amount":409},"finalPrice":{"amount":409},"tierPrices":[],"msrpPrice":{"amount":0}},"2840":{"baseOldPrice":{"amount":709},"oldPrice":{"amount":709},"basePrice":{"amount":709},"finalPrice":{"amount":709},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":109},"oldPrice":{"amount":109},"basePrice":{"amount":109},"finalPrice":{"amount":109}},"productId":"686","chooseText":"Choose an Option...","images":[],"index":{"687":{"135":"4"},"688":{"135":"5"},"2840":{"135":"81"}},"salable":{"135":{"4":["687"],"5":["688"],"81":["2840"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"687":"special-occasion-coupons-for-magento-2-ce","688":"special-occasion-coupons-for-magento-2-ee","2840":"special-occasion-coupons-for-magento-2-mce"},"label_reload":"https:\/\/amasty.com\/amasty_label\/ajax\/label\/","label_category":".product-image-container, .product-item-photo, .cdz-product-top","label_product":".fotorama__stage, #amasty-main-container","original_product_id":"686"}, "jsonSwatchConfig": {"135":{"4":{"type":"0","value":"Community","label":"Community"},"5":{"type":"0","value":"Enterprise","label":"Enterprise"},"81":{"type":"0","value":"Magento Cloud","label":"Magento Cloud"},"additional_data":"{\"swatch_input_type\":\"text\",\"update_product_preview_image\":1,\"use_product_image_for_swatch\":0}"}}, "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "gallerySwitchStrategy": "prepend", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}}, "showTooltip": 1 } }, "*" : { "Magento_Swatches/js/catalog-add-to-cart": {} } }</script><script type="text/x-magento-init"> { "*": { "Amasty_Stockstatus/js/amstockstatus": {"changeConfigurableStatus":1,"type":"product.info.options.swatches","info_block":"","display_in_dropdowns":1,"should_load_stock":true,"4":{"custom_status":"","custom_status_text":"","product_id":"687","is_in_stock":1,"pricealert":""},"5":{"custom_status":"","custom_status_text":"","product_id":"688","is_in_stock":1,"pricealert":""},"81":{"custom_status":"","custom_status_text":"","product_id":"2840","is_in_stock":1,"pricealert":""}} } }</script><script> require([ 'jquery', ], function($){ //<![CDATA[ $.extend(true, $, { calendarConfig: { dayNames: ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], dayNamesMin: ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"], monthNames: ["January","February","March","April","May","June","July","August","September","October","November","December"], monthNamesShort: ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"], infoTitle: 'About\u0020the\u0020calendar', firstDay: 1, closeText: 'Close', currentText: 'Go\u0020Today', prevText: 'Previous', nextText: 'Next', weekHeader: 'WK', timeText: 'Time', hourText: 'Hour', minuteText: 'Minute', dateFormat: "D, d M yy", // $.datepicker.RFC_2822 showOn: 'button', showAnim: '', changeMonth: true, changeYear: true, buttonImageOnly: null, buttonImage: null, showButtonPanel: true, showWeek: true, timeFormat: '', showTime: false, showHour: false, showMinute: false } }); enUS = {"m":{"wide":["January","February","March","April","May","June","July","August","September","October","November","December"],"abbr":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}}; // en_US locale reference //]]> });</script><script type="text/x-magento-init"> { "#instant-purchase": { "Magento_Ui/js/core/app": {"components":{"instant-purchase":{"component":"Magento_InstantPurchase\/js\/view\/instant-purchase","config":{"template":"Magento_InstantPurchase\/instant-purchase","buttonText":"Instant Purchase","purchaseUrl":"https:\/\/amasty.com\/instantpurchase\/button\/placeOrder\/"}}}} } }</script><script type="text/x-magento-init"> { "body": { "addToWishlist": {"productType":"configurable"} } }</script><script> window.swatchesOptionsConfig = {"Year":{"ce":{"recurringPrice":["$69"],"finalPrice":["$109"],"periodSupportText":["12 months"],"isNewPricingPolicy":false},"ee":{"recurringPrice":["$249"],"finalPrice":["$409"],"periodSupportText":["12 months"],"isNewPricingPolicy":false},"mce":{"recurringPrice":["$429"],"finalPrice":["$709"],"periodSupportText":["12 months"],"isNewPricingPolicy":false}}};</script><script> require([ 'jquery', 'priceBox' ], function($){ var dataPriceBoxSelector = '[data-role="priceBox"]', dataProductIdSelector = '[data-product-id="686"]', priceBoxes = $(dataPriceBoxSelector + dataProductIdSelector), productPopupSelector = '.amtheme-product-popup'; if (priceBoxes.closest(productPopupSelector).length) { priceBoxes = $(productPopupSelector + ' ' + dataPriceBoxSelector + dataProductIdSelector); } priceBoxes = priceBoxes.filter(function(index, elem){ return !$(elem).find('.price-from').length; }); priceBoxes.priceBox({'priceConfig': {"productId":686,"priceFormat":{"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":109,"adjustments":[]},"oldPrice":{"amount":109,"adjustments":[]},"basePrice":{"amount":109,"adjustments":[]},"finalPrice":{"amount":109,"adjustments":[]}},"idSuffix":"_clone","tierPrices":[],"calculationAlgorithm":"TOTAL_BASE_CALCULATION","baseOldPrice":{"amount":109,"adjustments":[]}}}); });</script><script type="text/javascript"> require(['jquery', 'Amasty_Preorder/js/product/preorder_configurable'], function($) { $widget = $.mage.amastyPreorderConfigurable({ availabilityElement: '.product-preorder-message', isAllProductsPreorder: 0, preOrderNote: 'You pay for the pre-order at a discounted price and receive the extension\'s package once it’s released', addToCartLabel: 'PRE-ORDER', map: [], currentAttributes: {"135":"Edition"}, originalNote: 'In stock' }); });</script><script type="text/x-magento-init"> { "#amrelated-pack-66-67bf234ae7b29": { "Amasty_Mostviewed/js/ampack":{"product_id":686,"discount_amount":10,"parent_info":{"price":109,"qty":1},"discount_type":2,"apply_for_parent":true,"apply_only_for_all":false,"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"products":{"508":{"price":239,"qty":1,"discount_amount":null},"728":{"price":399,"qty":1,"discount_amount":null}},"conditional_discounts":{"2":10,"3":15},"priceFormatFull":{"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true},"isCollapsibleOnMobile":false} } }</script><script type="text/x-magento-init"> { "[data-amrelated-js='add-to-cart']": { "Amasty_Mostviewed/js/ampackcart":{"url":"https:\/\/amasty.com\/ammostviewed\/cart\/add\/","isAjaxCartEnabled":0} } }</script><script>window.authenticationPopup = {"autocomplete":"off","customerRegisterUrl":"https:\/\/amasty.com\/customer\/account\/create\/","customerForgotPasswordUrl":"https:\/\/amasty.com\/customer\/account\/forgotpassword\/","baseUrl":"https:\/\/amasty.com\/","customerLoginUrl":"https:\/\/amasty.com\/customer\/ajax\/login\/"}</script><script type="text/x-magento-init"> { "#authenticationPopup": { "Magento_Ui/js/core/app": {"components":{"authenticationPopup":{"component":"Magento_Customer\/js\/view\/authentication-popup","children":{"messages":{"component":"Magento_Ui\/js\/view\/messages","displayArea":"messages"},"captcha":{"component":"Magento_Captcha\/js\/view\/checkout\/loginCaptcha","displayArea":"additional-login-form-fields","formId":"user_login","configSource":"checkout"}}}}} }, "*": { "Magento_Ui/js/block-loader": "https\u003A\u002F\u002Fcdn.amasty.com\u002Fstatic\u002Fversion1740558685\u002Ffrontend\u002FAmasty\u002FAmTheme\u002Fen_US\u002Fimages\u002Floader\u002D1.gif" } }</script><script type="text/x-magento-init"> { "*": { "Magento_Customer/js/section-config": { "sections": {"stores\/store\/switch":["*"],"stores\/store\/switchrequest":["*"],"directory\/currency\/switch":["*"],"*":["messages"],"customer\/account\/logout":["*","recently_viewed_product","recently_compared_product","persistent"],"customer\/account\/loginpost":["*"],"customer\/account\/createpost":["*"],"customer\/account\/editpost":["*"],"customer\/ajax\/login":["checkout-data","cart","captcha"],"catalog\/product_compare\/add":["compare-products"],"catalog\/product_compare\/remove":["compare-products"],"catalog\/product_compare\/clear":["compare-products"],"sales\/guest\/reorder":["cart"],"sales\/order\/reorder":["cart"],"checkout\/cart\/add":["cart","directory-data"],"checkout\/cart\/delete":["cart"],"checkout\/cart\/updatepost":["cart"],"checkout\/cart\/updateitemoptions":["cart"],"checkout\/cart\/couponpost":["cart"],"checkout\/cart\/estimatepost":["cart"],"checkout\/cart\/estimateupdatepost":["cart"],"checkout\/onepage\/saveorder":["cart","checkout-data","last-ordered-items"],"checkout\/sidebar\/removeitem":["cart"],"checkout\/sidebar\/updateitemqty":["cart"],"rest\/*\/v1\/carts\/*\/payment-information":["cart","last-ordered-items","captcha","instant-purchase"],"rest\/*\/v1\/guest-carts\/*\/payment-information":["cart","captcha"],"rest\/*\/v1\/guest-carts\/*\/selected-payment-method":["cart","checkout-data"],"rest\/*\/v1\/carts\/*\/selected-payment-method":["cart","checkout-data","instant-purchase"],"customer\/address\/*":["instant-purchase"],"customer\/account\/*":["instant-purchase"],"vault\/cards\/deleteaction":["instant-purchase"],"paypal\/express\/placeorder":["cart","checkout-data"],"paypal\/payflowexpress\/placeorder":["cart","checkout-data"],"paypal\/express\/onauthorization":["cart","checkout-data"],"persistent\/index\/unsetcookie":["persistent"],"review\/product\/post":["review"],"wishlist\/index\/add":["wishlist"],"wishlist\/index\/remove":["wishlist"],"wishlist\/index\/updateitemoptions":["wishlist"],"wishlist\/index\/update":["wishlist"],"wishlist\/index\/cart":["wishlist","cart"],"wishlist\/index\/fromcart":["wishlist","cart"],"wishlist\/index\/allcart":["wishlist","cart"],"wishlist\/shared\/allcart":["wishlist","cart"],"wishlist\/shared\/cart":["cart"],"gdpr\/customer\/anonymise":["customer"],"ammostviewed\/cart\/add":["cart","messages"],"faq\/index\/save":["faq"],"amasty_jettheme\/ajax\/addtocompare":["compare-products"],"amasty_jettheme\/ajax\/addtowishlist":["wishlist"],"amasty_cart\/cart\/post":["cart","messages","directory-data"]}, "clientSideSections": ["checkout-data","cart-data","faq_product"], "baseUrls": ["https:\/\/amasty.com\/"], "sectionNames": ["messages","customer","compare-products","last-ordered-items","cart","directory-data","captcha","instant-purchase","loggedAsCustomer","persistent","review","wishlist","faq","recently_viewed_product","recently_compared_product","product_data_storage","paypal-billing-agreement"] } } }</script><script type="text/x-magento-init"> { "*": { "Magento_Customer/js/customer-data": { "sectionLoadUrl": "https\u003A\u002F\u002Famasty.com\u002Fcustomer\u002Fsection\u002Fload\u002F", "expirableSectionLifetime": 60, "expirableSectionNames": ["cart","persistent"], "cookieLifeTime": "31556952", "updateSessionUrl": "https\u003A\u002F\u002Famasty.com\u002Fcustomer\u002Faccount\u002FupdateSession\u002F" } } }</script><script type="text/x-magento-init"> { "*": { "Magento_Customer/js/invalidation-processor": { "invalidationRules": { "website-rule": { "Magento_Customer/js/invalidation-rules/website-rule": { "scopeConfig": { "websiteId": "1" } } } } } } }</script><script type="text/x-magento-init"> { "body": { "pageCache": {"url":"https:\/\/amasty.com\/page_cache\/block\/render\/id\/686\/","handles":["default","catalog_product_view","catalog_product_view_type_configurable","catalog_product_view_id_686","catalog_product_view_sku_special-occasion-coupons-for-magento-2","hyva_default","hyva_catalog_product_view","hyva_catalog_product_view_type_configurable","hyva_catalog_product_view_id_686","hyva_catalog_product_view_sku_special-occasion-coupons-for-magento-2","hyva_amcookiebar_popup","am_mega_menu_layout","catalog_product_view_custom_stock_status_in_stock"],"originalRequest":{"route":"catalog","controller":"product","action":"view","uri":"\/special-occasion-coupons-for-magento-2.html"},"versionCookieName":"private_content_version"} } }</script><script type="text/javascript"> var $zoho = $zoho || {}; $zoho.salesiq = $zoho.salesiq || { widgetcode: "ea5ee0680c5e32cfaed3ad895e0035997af0d8f138230bae4a7829abb7fcf825", values: {}, ready: function () { $zoho.salesiq.customfield.add( { "name": "_default.name", "hint": "Enter your First and Last Name", "type": "text", "required": "true", "visibility": "both" }); $zoho.salesiq.customfield.add( { "name": "_default.email", "hint": "Your Email", "type": "text", "required": "true", "visibility": "both" }); $zoho.salesiq.visitor.name(" "); $zoho.salesiq.visitor.email(""); $zoho.salesiq.domain("amasty.com"); } }; var d = document; s = d.createElement("script"); s.type = "text/javascript"; s.id = "zsiqscript"; s.defer = true; s.src = "https://salesiq.zoho.eu/widget"; t = d.getElementsByTagName("script")[0]; setTimeout(() => { t.parentNode.insertBefore(s, t); }, 10000);</script><script type="text/x-magento-init"> { "*": { "Amasty_ZohoChat/js/liveChat": {} } }</script><script> 'use strict'; function initFormEvents188() { return { options: { classes: { disableClass: '-disabled', errorClass: '-error', errorMsgBoxClass: '.input-error-box', validInputClass: ['valid'], invalidInputClass: ['invalid', 'invalid:border-red-500'], modalTriggerClass: '[data-survey-trigger="confirmation-modal-trigger"]', groupRequireClass: '.group-required', surveyContentClass: 'data-element="form-content"' }, messages: { defaultErrorMessage: 'Please\u0020fill\u0020out\u0020this\u0020field.' }, isAjax: true, }, processSubmit: function(page, tab, event) { const form = event.detail?.form ?? event.target.closest('form'); this.checkByAdvancedValidation(form).then(() => { this.performSubmit(event); return true; }).catch(() => { return false; }); }, checkByAdvancedValidation: function (form) { return window.hyva.formValidation(form).validate(); }, performSubmit: function (event) { const formNode = event.detail?.form ?? this.getFormNode(event.target); if (this.isAjaxSubmit(formNode)) { const url = formNode.getAttribute('action'); const headers = { contentType: 'application/x-www-form-urlencoded; charset=utf-8' } const formData = new FormData(formNode); formData.set('ajax', 'true'); fetch(url, { method: 'POST', body: formData, headers: headers }).then((response) => { if (response.ok) { return response.text(); } }).then((response) => { try { const parsedResponse = JSON.parse(String(response)); if (parsedResponse.result === 'success') { window.dispatchEvent(new CustomEvent('amcform-hide-modal-188')); window.dispatchEvent(new CustomEvent('amcform-success-submitted')); formNode.reset(); formNode.querySelector('a[href="#page-1"')?.click(); } } catch (error) { const messageText = 'Unknown\u0020error\u0020occurred.\u0020Please\u0020try\u0020again\u0020later\u0020or\u0020use\u0020Contact\u0020Us\u0020link\u0020in\u0020the\u0020menu.'; window.dispatchMessages && window.dispatchMessages([{type: "warning", text: messageText}], 5000); } }).finally(() => { window.dispatchEvent(new CustomEvent("reload-customer-section-data")); window.scrollTo({ top: 0, behavior: 'smooth' }); }); } else { formNode.submit(); } }, isAjaxSubmit: function (formNode) { return this.options.isAjax && !formNode.querySelector('input[type="file"]:not([disabled])'); }, getFormNode: function (formElement) { return formElement.closest('#amform-form-188'); }, toggleOnCheckbox(el) { const checkbox = el.querySelector('input'); const isChecked = checkbox.checked; isChecked ? checkbox.removeAttribute('checked') : checkbox.setAttribute('checked', true); }, toggleDisablingClass(el, next) { if (el.classList.contains(this.options.classes.disableClass) && next) { el.classList.remove(this.options.classes.disableClass); } else if (!next) { el.classList.add(this.options.classes.disableClass); } }, pageValidation(el, tab, event) { const page = event.detail?.form ?? event.target.closest('form'); this.checkByAdvancedValidation(page).then(() => { el.parentElement.scrollIntoView({ behavior: "smooth" }); if (tab) { tab.classList.remove(this.options.classes.errorClass); } return true; }).catch(() => { event.preventDefault(); event.stopImmediatePropagation(); if (tab) { tab.classList.add(this.options.classes.errorClass); } return false; }); }, toggleErrorMessage(state, field, message) { let errorBox = field.parentElement.querySelector(this.options.classes.errorMsgBoxClass); if (!errorBox) { errorBox = field.querySelector(this.options.classes.errorMsgBoxClass); } if (errorBox) { this.switchErrorVisibility(state, errorBox, message); } }, switchErrorVisibility(state, box, message) { switch (state) { case 'show': box.innerHTML = message; box.style.display = 'block'; box.scrollIntoView({ behavior: 'smooth', block: 'start'}); break; case 'hide': box.style.display = 'none'; box.innerHTML = ''; break; } }, submitSurveyForm(element, event, page, tab) { let form = document.getElementById('amform-form-188'); let sPage = form.querySelector('[x-ref="' + page + '"]'); let sTab = form.querySelector('[x-ref="' + tab + '"]'); let isValid = this.pageValidation(sPage, sTab, event); if (!isValid) { return false; } else { element.querySelector(this.options.classes.modalTriggerClass).click() } }, showConfirmForm: function (result) { let form = document.getElementById('amform-form-188'); if (result) { form.submit(); } } } }</script><script> (function setDependencies() { const form = document.getElementById('amform-form-188'); const relatedFields = form.querySelectorAll('[data-dependency]'); if (!relatedFields.length) { return; } relatedFields.forEach(relatedField => { const dependency = relatedField.dataset.dependency.split(','); const dependencyFields = []; dependency.forEach(dependency => { dependencyFields.push(form.querySelectorAll(`[x-ref="${dependency.trim()}"]`)); }); dependencyFields.forEach(element => { let field = element[0]; let mutationCallback = (mutationsList) => { for (const mutation of mutationsList) { if (mutation.type !== "attributes" || mutation.attributeName !== "disabled") return updateDependency(dependencyFields, relatedField); } }; let observer = new MutationObserver(mutationCallback); field.closest('.fieldset-block').addEventListener('change', () => { updateDependency(dependencyFields, relatedField) }, false); observer.observe(field, { attributes: true }) }); updateDependency(dependencyFields, relatedField); }); function canBeChecked(type) { return type === 'checkbox' || type === 'radio'; } function updateDependency(dependencyFields, relatedField) { let isVisible = true; dependencyFields.forEach(otherFieldDependency => { if (canBeChecked(otherFieldDependency[0].type) && !otherFieldDependency[0].checked || otherFieldDependency[0].type === undefined && !otherFieldDependency[0].selected || otherFieldDependency[0].disabled) { isVisible = false; } }); if (isVisible) { relatedField.style.display = 'block'; relatedField.querySelectorAll('input, select, textarea, option').forEach(input => { input.removeAttribute('disabled'); }) } else { relatedField.style.display = 'none'; relatedField.querySelectorAll('input, select, textarea, option').forEach(input => { input.setAttribute('disabled', 'disabled'); }); } } })();</script><script> (function fillFormData(formId) { const params = {"urlSession":"https:\/\/amasty.com\/amasty_customform\/form\/sessiondata\/","formId":188,"productId":"686"}; const formData = 'form_id=' + formId + '&product_id=' + params.productId; const form = document.getElementById('amform-form-' + formId + ''); const parseXData = function (node) { try { const xDataString = (node.getAttribute('x-data') ?? '{}') .replace(/[\n ]+/g, '') .replace(/(\w+):/g, '"$1":') .replace(/'/g, '"'); return JSON.parse(xDataString); } catch (e) { console.log(e); return null; } }; const updateWrapperXData = function (inputNode, inputData) { try { const inputWrapper = inputNode.closest('.fieldset-block'); const xDataObject = parseXData(inputWrapper); if (typeof xDataObject.value !== 'undefined' && xDataObject.value !== inputData) { xDataObject.value = inputData; inputWrapper.setAttribute('x-data', JSON.stringify(xDataObject)); } } catch (e) { console.error(e); } }; const getValueAsArray = function(inputData) { return ( typeof inputData === 'string' ? [inputData] : Array.isArray(inputData) ? inputData : [] ); } const checkNodesByValues = function(nodes, values, attributeName) { values.forEach(function (value) { const nodeToSetAttribute = nodes.find(node => node.getAttribute('value') === value); nodeToSetAttribute && (nodeToSetAttribute[attributeName] = true); }); } const textInputFiller = { supportedInputTypes: [ 'text', 'email', 'number', 'date', 'time' ], supportedTagNames: [ 'textarea' ], support: function (inputNode) { return this.supportedInputTypes.includes(inputNode.getAttribute('type')) || this.supportedTagNames.includes(inputNode.tagName.toLowerCase()); }, fill: function (inputNode, inputData) { if (typeof inputData !== 'string') { return; } inputNode.value = inputData; updateWrapperXData(inputNode, inputData); } }; const selectInputFiller = { supportedTagNames: [ 'select' ], support: function (inputNode) { return this.supportedTagNames.includes(inputNode.tagName.toLowerCase()); }, fill: function (inputNode, inputData) { const optionValues = getValueAsArray(inputData); if (optionValues.length === 0) { return; } this.clearSelectedAttribute(inputNode); checkNodesByValues(Array.from(inputNode.options), optionValues, 'selected'); updateWrapperXData(inputNode, optionValues); }, clearSelectedAttribute: function (inputNode) { Array.from(inputNode.options).forEach((option) => { option.selected = false; option.removeAttribute('selected'); }); } }; const checkableInputFiller = { supportedInputTypes: [ 'checkbox', 'radio' ], support: function (inputNode) { return this.supportedInputTypes.includes(inputNode.getAttribute('type')); }, fill: function (inputNode, inputData) { const inputName = inputNode.getAttribute('name'); const checkboxList = document.querySelectorAll(`input[name="${inputName}"]`); const checkboxValues = getValueAsArray(inputData); if (checkboxValues.length === 0) { return; } this.uncheck(checkboxList); checkNodesByValues(Array.from(checkboxList), checkboxValues, 'checked'); this.fillRating(inputNode, inputData); }, fillRating(inputNode, inputData) { if (!this.isRating(inputNode) || typeof inputData !== 'string') { return; } const xDataContainer = inputNode.closest('[x-data]'); if (!xDataContainer?.getAttribute('x-data').includes('clickedRatingId')) { return; } const xData = parseXData(xDataContainer); if (!xData) { return; } xData.clickedRatingId = inputData; xDataContainer.setAttribute('x-data', JSON.stringify(xData)); xDataContainer.querySelector('input:checked')?.click(); }, isRating: function(inputNode) { return inputNode.name.startsWith('rating-'); }, uncheck: function (checkboxList) { checkboxList.forEach(function (checkbox) { checkbox.checked = false; }); } }; const inputFillerPool = { excludedInputNames: [ 'form_id', 'form_key', 'is_survey' ], inputFillers: [ textInputFiller, selectInputFiller, checkableInputFiller ], fill: function (inputNode, inputData) { if (this.shouldExclude(inputNode)) { return; } for (const fillerIndex in this.inputFillers) { if (this.inputFillers[fillerIndex].support(inputNode)) { this.inputFillers[fillerIndex].fill(inputNode, inputData); inputNode.closest('.fieldset-block').dispatchEvent(new Event('change')); break; } } }, shouldExclude: function (inputNode) { return this.excludedInputNames.includes(inputNode.getAttribute('name')) || inputNode.getAttribute('type') === 'hidden'; } }; function requestData(url, body) { return new Promise((resolve, reject) => { fetch(url, { method: 'POST', body: body, headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'X-Requested-With': 'XMLHttpRequest' } }).then(response => response.json()) .then(data => { resolve(data); }) .catch((error) => { reject(error); }); }); } requestData(params.urlSession, formData).then(data => { const formFields = data.form_fields ?? {}; const persistedInputNames = Object.keys(formFields); persistedInputNames.forEach(inputName => { const inputNode = form.querySelector(`[name^="${inputName}"]`); !!inputNode && inputFillerPool.fill(inputNode, formFields[inputName]); }); }) })(188);</script><script type="text/x-magento-init"> { "body": { "requireCookie": {"noCookieUrl":"https:\/\/amasty.com\/cookie\/index\/noCookies\/","triggers":[".action.towishlist"],"isRedirectCmsPage":true} } }</script><script type="text/x-magento-init"> { "*": { "Magento_Catalog/js/product/view/provider": { "data": {"items":{"686":{"add_to_cart_button":{"post_data":"{\"action\":\"https:\\\/\\\/amasty.com\\\/checkout\\\/cart\\\/add\\\/uenc\\\/%25uenc%25\\\/product\\\/686\\\/\",\"data\":{\"product\":\"686\",\"uenc\":\"%uenc%\"}}","url":"https:\/\/amasty.com\/checkout\/cart\/add\/uenc\/%25uenc%25\/product\/686\/","required_options":true},"add_to_compare_button":{"post_data":null,"url":"{\"action\":\"https:\\\/\\\/amasty.com\\\/catalog\\\/product_compare\\\/add\\\/\",\"data\":{\"product\":\"686\",\"uenc\":\"aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw~\"}}","required_options":null},"price_info":{"final_price":109,"max_price":109,"max_regular_price":109,"minimal_regular_price":109,"special_price":null,"minimal_price":109,"regular_price":109,"formatted_prices":{"final_price":"<span class=\"price\">$109.00<\/span>","max_price":"<span class=\"price\">$109.00<\/span>","minimal_price":"<span class=\"price\">$109.00<\/span>","max_regular_price":"<span class=\"price\">$109.00<\/span>","minimal_regular_price":null,"special_price":null,"regular_price":"<span class=\"price\">$109.00<\/span>"},"extension_attributes":{"msrp":{"msrp_price":"<span class=\"price\">$0.00<\/span>","is_applicable":"","is_shown_price_on_gesture":"","msrp_message":"","explanation_message":"Our price is lower than the manufacturer&#039;s &quot;minimum advertised price.&quot; As a result, we cannot show you the price in catalog or the product page. <br><br> You have no obligation to purchase the product once you know the price. You can simply remove the item from your cart."},"tax_adjustments":{"final_price":109,"max_price":109,"max_regular_price":109,"minimal_regular_price":109,"special_price":109,"minimal_price":109,"regular_price":109,"formatted_prices":{"final_price":"<span class=\"price\">$109.00<\/span>","max_price":"<span class=\"price\">$109.00<\/span>","minimal_price":"<span class=\"price\">$109.00<\/span>","max_regular_price":"<span class=\"price\">$109.00<\/span>","minimal_regular_price":null,"special_price":"<span class=\"price\">$109.00<\/span>","regular_price":"<span class=\"price\">$109.00<\/span>"}},"weee_attributes":[],"weee_adjustment":"<span class=\"price\">$109.00<\/span>"}},"images":[{"url":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/bb8e97a9ddc3d82fc043ed846d9f3d1c\/s\/p\/special-occasion-coupons-for-magento-2_2x.png","code":"recently_viewed_products_grid_content_widget","height":485,"width":485,"label":"Special Occasion Coupons for Magento 2","resized_width":485,"resized_height":485},{"url":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/bb8e97a9ddc3d82fc043ed846d9f3d1c\/s\/p\/special-occasion-coupons-for-magento-2_2x.png","code":"recently_viewed_products_list_content_widget","height":485,"width":485,"label":"Special Occasion Coupons for Magento 2","resized_width":485,"resized_height":485},{"url":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/c0f736f50f461282ed263518cf9066d1\/s\/p\/special-occasion-coupons-for-magento-2_2x.png","code":"recently_viewed_products_images_names_widget","height":80,"width":80,"label":"Special Occasion Coupons for Magento 2","resized_width":80,"resized_height":80},{"url":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/bb8e97a9ddc3d82fc043ed846d9f3d1c\/s\/p\/special-occasion-coupons-for-magento-2_2x.png","code":"recently_compared_products_grid_content_widget","height":485,"width":485,"label":"Special Occasion Coupons for Magento 2","resized_width":485,"resized_height":485},{"url":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/bb8e97a9ddc3d82fc043ed846d9f3d1c\/s\/p\/special-occasion-coupons-for-magento-2_2x.png","code":"recently_compared_products_list_content_widget","height":485,"width":485,"label":"Special Occasion Coupons for Magento 2","resized_width":485,"resized_height":485},{"url":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/c0f736f50f461282ed263518cf9066d1\/s\/p\/special-occasion-coupons-for-magento-2_2x.png","code":"recently_compared_products_images_names_widget","height":80,"width":80,"label":"Special Occasion Coupons for Magento 2","resized_width":80,"resized_height":80}],"url":"https:\/\/amasty.com\/special-occasion-coupons-for-magento-2.html","id":686,"name":"Special Occasion Coupons for Magento 2","type":"configurable","is_salable":"1","store_id":1,"currency_code":"USD","extension_attributes":{"review_html":" <div class=\"product-reviews-summary short flex gap-2\"><p class=\"mb-0 am-text-small font-bold\">5.0<\/p><a href=\"https:\/\/amasty.com\/special-occasion-coupons-for-magento-2.html#reviews\" class=\"flex max-w-[85px]\" data-amsite-js=\"scroll-open-tab\" data-tab-destination=\"reviews\" > <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"currentColor\" viewBox=\"0 0 20 20\" class=\"text-yellow-300\" width=\"20\" height=\"20\" aria-hidden=\"true\"><path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z\"\/><\/svg>\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"currentColor\" viewBox=\"0 0 20 20\" class=\"text-yellow-300\" width=\"20\" height=\"20\" aria-hidden=\"true\"><path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z\"\/><\/svg>\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"currentColor\" viewBox=\"0 0 20 20\" class=\"text-yellow-300\" width=\"20\" height=\"20\" aria-hidden=\"true\"><path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z\"\/><\/svg>\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"currentColor\" viewBox=\"0 0 20 20\" class=\"text-yellow-300\" width=\"20\" height=\"20\" aria-hidden=\"true\"><path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z\"\/><\/svg>\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" fill=\"currentColor\" viewBox=\"0 0 20 20\" class=\"text-yellow-300\" width=\"20\" height=\"20\" aria-hidden=\"true\"><path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 0 0 .95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 0 0-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 0 0-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 0 0-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 0 0 .951-.69l1.07-3.292Z\"\/><\/svg>\n <\/a> <a class=\"am-text-small link-as-text\" data-amsite-js=\"scroll-open-tab\" data-tab-destination=\"reviews\" href=\"https:\/\/amasty.com\/special-occasion-coupons-for-magento-2.html#reviews\" aria-label=\"Reviews\" >2&nbsp;<span>Reviews<\/span><\/a><\/div>","wishlist_button":{"post_data":null,"url":"{\"action\":\"https:\\\/\\\/amasty.com\\\/wishlist\\\/index\\\/add\\\/\",\"data\":{\"product\":686,\"uenc\":\"aHR0cHM6Ly9hbWFzdHkuY29tL3NwZWNpYWwtb2NjYXNpb24tY291cG9ucy1mb3ItbWFnZW50by0yLmh0bWw~\"}}","required_options":null}},"is_available":true}},"store":"1","currency":"USD","productCurrentScope":"website"} } } }</script><script> function ratingData_67bf234af256c() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234af256c() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234af2b3a() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234af2b3a() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234af2f77() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234af2f77() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234af322f() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234af322f() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234af34b2() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234af34b2() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234af3902() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234af3902() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234af3d1b() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139,1142], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234af3d1b() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234b000b1() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139,1142,6936], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234b000b1() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234b00364() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139,1142,6936,7586], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234b00364() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234b00b27() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139,1142,6936,7586,7647], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234b00b27() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234b00f5f() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139,1142,6936,7586,7647,8188], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234b00f5f() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234b01219() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139,1142,6936,7586,7647,8188,8196], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234b01219() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script> function ratingData_67bf234b0148e() { const starLabel = 'star'; const starsLabel = 'stars'; return { votingBehavior: 'average', hideZeroRating: 1, itemsIds: [1137,1141,1135,1140,1136,1139,1142,6936,7586,7647,8188,8196,8197], dataUrl: 'https://amasty.com/faq/index/rating/', isLoaded: false, isLogin: false, items: [], isLoading: false, stars: [1,2,3,4,5], storageKey: 'amfaq-average-rating-storage', votedQuestions: {}, hovered: 0, isSocialLoginEnabled: true, isGuestRatingAllowed: false, isSocialPopupEnabled: true, ratingInit_67bf234b0148e() { this.getVoted(); if (this.votingBehavior === 'average') { this.votedQuestions = this.localGet() ?? {}; } }, setFAQRating: "mutation rateAmFaqQuestion(\n $id: Int!,\n $type: AmFaqVoteTypeEnum!,\n $value: String!,\n $revote: Boolean,\n $oldValue: String\n ) {rateAmFaqQuestion(\n input: {\n question_id: $id,\n vote_type: $type,\n value: $value,\n is_revote: $revote,\n old_value: $oldValue\n }) {\n error\n message\n }}", getVoted() { let itemsURL = '', item = this.itemsIds[this.itemsIds.length - 1]; if (itemsURL) {itemsURL += '&'}; itemsURL += 'items[]=' + item; fetch(this.dataUrl + '?'+itemsURL+'&isAjax=true', { method: 'POST', headers: { 'X-Requested-With': 'XMLHttpRequest' } } ) .then(response => response.json()) .then(result => { this.items = result }) .catch(this.displayError) .finally(() => { this.isLoaded = true; }); }, getTotalRating(positive, negative) { return parseInt(positive) + Math.abs(parseInt(negative)); }, isShowZeroRating(rating) { return !(this.hideZeroRating && rating === 0); }, useQuery(query, variables) { return fetch(BASE_URL + 'graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Store': 'default' }, credentials: 'include', body: JSON.stringify({query: query, variables: variables}), }).then(response => response.json()).catch(this.displayError) }, setRating(id, value, revote = false) { let oldValue = this.localGet()?.[id]; if (parseInt(oldValue) === parseInt(value)) { return; } this.isLoading = true; this.useQuery( this.setFAQRating, { id: id, type: this.votingBehavior.toUpperCase(), value: value, revote: revote, oldValue: oldValue ? oldValue : '' } ).then(response => { const result = response?.data?.rateAmFaqQuestion; if (result.error) { /* if enabled social login module*/ if (this.isSocialLoginEnabled && !this.isGuestRatingAllowed && !this.isLogin && this.isSocialPopupEnabled) { window.dispatchEvent(new CustomEvent('hyva-modal-show', { detail: { dialog: 'social-login-popup' } })); return; } this.showMessage('error', result.message); return; } if (result.message) { this.showMessage('success', result.message); } this.items.map(item => { if (item.id === id) { item.isVoted = true; if (this.votingBehavior === 'average') { this.recalculateAverage(id, value); } else { if (value) { item.isPositiveVoted = true; item.positiveRating = ++item.positiveRating; } else { item.isPositiveVoted = false; item.negativeRating = ++item.negativeRating; } } } }); }).finally(() => { this.isLoading = false; }); }, setStarRating(id, value) { this.setRating(id, value, this.checkVoted(id)); }, recalculateAverage(id, value) { this.items.map(item => { if (item.id === id) { let total = parseInt(item.total), average = parseFloat(item.average), newAverage = (average * total + parseInt(value)) / (total + 1); if (this.votedQuestions && this.votedQuestions[id] !== undefined) { const oldValue = this.votedQuestions[id]; newAverage = total > 1 ? (average * total - parseInt(oldValue) + parseInt(value)) / total : parseInt(value); } else { item.total++; } this.votedQuestions[id] = value; this.localSet(this.votedQuestions); item.average = newAverage; } }) }, checkVoted(id) { return this.votedQuestions && this.votedQuestions[id] !== undefined; }, localSet(value) { window.localStorage.setItem(this.storageKey, JSON.stringify(value)); }, localGet() { return JSON.parse(window.localStorage.getItem(this.storageKey)); }, displayError(error) { if (error.name === 'AbortError') { console.log('Fetch aborted'); } else { this.showMessage( 'error', 'Something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.' ); } }, showMessage(type, message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: type, text: message}], 10000 ); }, getStarsLabel(index) { return index > 1 ? index + ' ' + starsLabel : index + ' ' + starLabel; }, eventListeners: { ['@private-content-loaded.window'](event) { const faqData = event.detail.data?.faq; if (faqData.name || faqData.email) { this.isLogin = true; } } } } }</script><script type="application/ld+json"> {"@context":"http:\/\/schema.org","@type":"FAQPage","speakable":{"@type":"SpeakableSpecification","xPath":["\/html\/head\/title"]},"mainEntity":[{"@type":"Question","position":"-116","name":"Are Amasty extensions compatible with all themes and extensions by other vendors?","text":"Are Amasty extensions compatible with all themes and extensions by other vendors?","author":"Guest","dateCreated":"2021-09-04 07:37:00","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"Amasty extensions work with all plugins we issued and with most 3rd-party plugins. If you come across a Magento 2 compatibility issue with any third-party module, we\u2019ll definitely try to help you.\r\nIf you face any technical issues, please create a ticket ...","dateCreated":"2025-02-25 18:43:54","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/are-amasty-extensions-compatible-with-all-themes-and-extensions-by-other-vendors.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-115","name":"Will I get free support and updates?","text":"Will I get free support and updates?","author":"Guest","dateCreated":"2021-09-04 07:37:00","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":" Product updates\u00a0for extensions purchased before Feb 1, 2022With the transition to product subscriptions, you will receive product updates for all extensions purchased before Feb 1, 2022 throughout the entire grace period \u2014 up to Aug 1, 2022.\u00a0If you want ...","dateCreated":"2025-02-26 08:35:50","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/will-i-get-free-support-and-updates.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-114","name":"Do you have the installation service in magento?","text":"Do you have the installation service in magento?","author":"Guest","dateCreated":"2021-09-04 07:37:00","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":" Yes, you can use installation and configuration services that are available as the part of Pro and Premium add-ons for your product subscriptions.Please note that this installation service doesn\u2019t include uninstallation. So, if you need to completely uninstall...","dateCreated":"2025-02-25 13:47:32","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/can-i-have-amasty-extension-installed.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-113","name":"Can I request a free trial?","text":"Can I request a free trial?","author":"Guest","dateCreated":"2021-09-04 07:37:00","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"Amasty doesn\u2019t provide any trials of Magento extensions.\r\nThere's one exception: Amasty extensions are provided for testing or demo purposes to our official Platinum Partners as a part of the \u201caccess to Amasty extensions for testing purposes with Composer...","dateCreated":"2025-02-25 17:47:13","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/can-i-request-a-free-trial.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-112","name":"Can I test an Amasty extension on a staging site before transferring it to a live one in magento?","text":"Can I test an Amasty extension on a staging site before transferring it to a live one in magento?","author":"Guest","dateCreated":"2021-09-04 07:37:00","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"Yes, you can install any Amasty extension on a test site and configure all the settings there before doing it on your live store.","dateCreated":"2025-02-25 12:28:48","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/can-i-test-an-amasty-extension-on-a-staging-site.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-111","name":"How can I get a refund?","text":"How can I get a refund?","author":"Guest","dateCreated":"2021-09-04 07:37:00","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":" Amasty offers to its Customers a thirty (30) day money-back guarantee for the Software. In case the acquired extension didn\u2019t meet your expectations, our support team is always ready to help you. Fees for support subscriptions and any services provided by...","dateCreated":"2025-02-25 11:01:23","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/can-i-get-a-refund-if-an-extension-doesn-t-suit-me.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-110","name":"How can I receive a discount?","text":"How can I receive a discount?","author":"Guest","dateCreated":"2021-09-04 07:37:00","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":" We are now working at a loyalty program for our customers that is supposed to bring even greater benefits in the long term.\u00a0While it\u2019s not out yet, you can look through these Special Offers. New discounts and specials are added every month.\u00a0To stay updated...","dateCreated":"2025-02-21 16:28:24","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/will-i-get-any-other-benefits.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-109","name":"How to update a Magento 2 Amasty extension?","text":"How to update a Magento 2 Amasty extension?","author":"Guest","dateCreated":"2021-09-04 07:37:01","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":" Updating an Amasty extension follows the same process as installing a module.\u00a0To update a single extension:Run the following command to update a specific Amasty extension:composer update amasty\/&lt;module-name&gt;\u00a0To update multiple extensions:You can update...","dateCreated":"2025-02-26 13:49:25","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/upgrade-magento-2-extension.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-108","name":"If I need additional features to be added to an Amasty extension, how can I ask for it in magento?","text":"If I need additional features to be added to an Amasty extension, how can I ask for it in magento?","author":"Guest","dateCreated":"2021-09-04 07:37:01","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"To leave your feature request, log in to your customer account and open the Products tab. Then, scroll down to the bottom of the page, and leave your feature request in the following form:\r\n\r\nAs soon as you send your request, it is considered by our Product...","dateCreated":"2025-02-14 13:22:29","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/how-to-ask-more-features-to-be-added-to-my-extension.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-106","name":"Magento 2 Amasty extensions installation","text":"Magento 2 Amasty extensions installation","author":"Guest","dateCreated":"2021-09-04 07:37:01","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":" Amasty extension packages include all necessary files, setup guides, and a license agreement, with some even offering example import files to simplify the process.Important: Since January 14, 2025, all Amasty extensions will only be available for installation...","dateCreated":"2025-02-26 13:25:25","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/how-to-install-magento-2-extension.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-104","name":"How can I prolong support in magento?","text":"How can I prolong support in magento?","author":"Guest","dateCreated":"2021-09-04 07:37:01","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":" If you have an active support service subscription, it grants you access to support services for all products purchased before Feb,1 as long as your subscription is active.\u00a0Alternatively, support services are only available as the part of a product subscription...","dateCreated":"2025-02-19 10:23:59","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/how-can-i-prolong-support.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-101","name":"Can I change the EE extension to CE for free in magento?","text":"Can I change the EE extension to CE for free in magento?","author":"Guest","dateCreated":"2021-09-04 07:37:01","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"Usually, no, you can&rsquo;t exchange modules. Please, contact our support managers and they&rsquo;ll consider your case individually.\r\n&rarr; Learn more about our special offers","dateCreated":"2025-02-26 08:15:34","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/can-i-change-the-ee-extension-to-ce-for-free.html","upvoteCount":"0","downvoteCount":"0"}},{"@type":"Question","position":"-100","name":"How can I get a discount to re-purchase plugins in magento?","text":"How can I get a discount to re-purchase plugins in magento?","author":"Guest","dateCreated":"2021-09-04 07:37:01","answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"Usually, we don&rsquo;t provide any discounts. But you can contact us, and we&rsquo;ll consider your case individually.\r\n&rarr; Learn more about our special offers","dateCreated":"2025-02-24 23:03:07","author":"Admin","url":"https:\/\/amasty.com\/knowledge-base\/how-can-i-get-a-discount-to-re-purchase-plugins.html","upvoteCount":"0","downvoteCount":"0"}}]}</script><script> function productURLData_67bf234b05cbc() { const COOKIE_EXPIRES = 1; const COOKIE_NAME = 'faq_product'; const COOKIE_VALUE = window.location.href; return { initialize() { hyva.setCookie(COOKIE_NAME, COOKIE_VALUE, COOKIE_EXPIRES); }, } }</script><script> 'use strict'; function amSummaryDetails() { return { isVisibleDetails: false, filterReviewUrl: 'https://amasty.com/review/product/listAjax/amreview_sort/newest/stars/STAR/id/686/', eventListeners: { ['@toggle-state-summary-details.window'](event) { this.isVisibleDetails = event.detail.isVisibleDetails; }, ['@am-stars-filter-clear.window'](event) { const productUrl = event.detail.productUrl; !!productUrl && this.dispatchFilterEvent(productUrl); }, }, /** * @param {int} stars * @returns {void} */ applyFilterByStars: function (stars) { this.dispatchFilterEvent(this.filterReviewUrl.replace('STAR', stars.toString())); }, /** * @param {string} url * @returns {void} */ dispatchFilterEvent: function (url) { window.dispatchEvent(new CustomEvent('amreviews-filter', { detail: { url: url }})); } } }</script><script> function initAddReviewClickBtn() { return { isLoggedIn: false, receiveCustomerData(privateData) { this.isLoggedIn = this.isCustomerLoggedIn(privateData); }, showAuthPopup() { if (!this.isLoggedIn) { const browserStorage = hyva.getBrowserStorage(); if (browserStorage) { browserStorage.removeItem('data_social_login_redirect'); } window.dispatchEvent( new CustomEvent('hyva-modal-show', {detail: {dialog: "social-login-popup"}}) ) } else { window.dispatchEvent( new CustomEvent('hyva-modal-show', {detail: {dialog: "form-review-popup"}}) ) } }, ...AmsiteUtils(), ...AmAuthPopup() } }</script><script> 'use strict'; function amReviewItem() { return { reply: false, comments: false, qtyComments: 0, /** * @returns {void} */ toggleReply: function () { if (this.comments && !this.reply) { this.reply = true; return; } if (this.comments && this.reply) { this.reply = false; this.comments = false; return; } this.reply = !this.reply; }, /** * @returns {void} */ toggleComments: function () { if (!this.qtyComments) { return; } if (this.reply && !this.comments) { this.comments = true; return; } this.comments = !this.comments; this.toggleReply(); } } }</script><script> function initAmReviewForm_67bf234b0959a() { return { displayNickname: false, displayErrorMessage: false, errorMessages: [], errors: 0, hovered: 0, clickedRatingId: 0, nickname: null, summary: null, ratings: [], review: null, url: 'https://amasty.com/review/product/post/', /** * @returns void */ submitForm: function () { this.validate() .then(() => { const $form = this.$root; if (this.errors === 0) { this.placeReview(); } }) .catch((invalid) => { if (invalid.length > 0) { invalid[0].focus(); } }); }, /** * @returns void */ placeReview: function () { const form = this.$root; const body = new FormData(form); const productId = form.dataset.productId ?? 0; const url = new URL(this.url + `id/${productId}/`) body.append('form_key', hyva.getFormKey()); this.displayErrorMessage = false; fetch(url.toString(), { method: 'POST', headers: Object.assign({ 'X-Requested-With': 'XMLHttpRequest' }), body: body }).then(response => { if (!response.redirected) { return response.json(); } let data = {}; if (response.status !== 200 || !response.ok) { data.errors = true; } this.setMessage(data); }).then(() => { this.hide(); form.reset(); this.clickedRatingId = 0; window.scrollTo({ top: 0, behavior: 'smooth' }); window.dispatchMessages([ { type: "success", text: "You submitted your review for moderation." } ], 5000); }); }, /** * @param {Object} data * @returns void */ setMessage: function(data) { if (data.errors) { this.displayErrorMessage = true; this.hide(); window.scrollTo({ top: 0, behavior: 'smooth' }); window.dispatchMessages([ { type: "error", text: "Submitting your review failed, please try again" } ], 5000); } } } }</script><script> 'use strict'; function initFormEvents9() { return { options: { classes: { disableClass: '-disabled', errorClass: '-error', errorMsgBoxClass: '.input-error-box', validInputClass: ['valid'], invalidInputClass: ['invalid', 'invalid:border-red-500'], modalTriggerClass: '[data-survey-trigger="confirmation-modal-trigger"]', groupRequireClass: '.group-required', surveyContentClass: 'data-element="form-content"' }, messages: { defaultErrorMessage: 'Please\u0020fill\u0020out\u0020this\u0020field.' }, isAjax: true, }, processSubmit: function(page, tab, event) { const form = event.detail?.form ?? event.target.closest('form'); this.checkByAdvancedValidation(form).then(() => { this.performSubmit(event); return true; }).catch(() => { return false; }); }, checkByAdvancedValidation: function (form) { return window.hyva.formValidation(form).validate(); }, performSubmit: function (event) { const formNode = event.detail?.form ?? this.getFormNode(event.target); if (this.isAjaxSubmit(formNode)) { const url = formNode.getAttribute('action'); const headers = { contentType: 'application/x-www-form-urlencoded; charset=utf-8' } const formData = new FormData(formNode); formData.set('ajax', 'true'); fetch(url, { method: 'POST', body: formData, headers: headers }).then((response) => { if (response.ok) { return response.text(); } }).then((response) => { try { const parsedResponse = JSON.parse(String(response)); if (parsedResponse.result === 'success') { window.dispatchEvent(new CustomEvent('amcform-hide-modal-9')); window.dispatchEvent(new CustomEvent('amcform-success-submitted')); formNode.reset(); formNode.querySelector('a[href="#page-1"')?.click(); } } catch (error) { const messageText = 'Unknown\u0020error\u0020occurred.\u0020Please\u0020try\u0020again\u0020later\u0020or\u0020use\u0020Contact\u0020Us\u0020link\u0020in\u0020the\u0020menu.'; window.dispatchMessages && window.dispatchMessages([{type: "warning", text: messageText}], 5000); } }).finally(() => { window.dispatchEvent(new CustomEvent("reload-customer-section-data")); window.scrollTo({ top: 0, behavior: 'smooth' }); }); } else { formNode.submit(); } }, isAjaxSubmit: function (formNode) { return this.options.isAjax && !formNode.querySelector('input[type="file"]:not([disabled])'); }, getFormNode: function (formElement) { return formElement.closest('#amform-form-9'); }, toggleOnCheckbox(el) { const checkbox = el.querySelector('input'); const isChecked = checkbox.checked; isChecked ? checkbox.removeAttribute('checked') : checkbox.setAttribute('checked', true); }, toggleDisablingClass(el, next) { if (el.classList.contains(this.options.classes.disableClass) && next) { el.classList.remove(this.options.classes.disableClass); } else if (!next) { el.classList.add(this.options.classes.disableClass); } }, pageValidation(el, tab, event) { const page = event.detail?.form ?? event.target.closest('form'); this.checkByAdvancedValidation(page).then(() => { el.parentElement.scrollIntoView({ behavior: "smooth" }); if (tab) { tab.classList.remove(this.options.classes.errorClass); } return true; }).catch(() => { event.preventDefault(); event.stopImmediatePropagation(); if (tab) { tab.classList.add(this.options.classes.errorClass); } return false; }); }, toggleErrorMessage(state, field, message) { let errorBox = field.parentElement.querySelector(this.options.classes.errorMsgBoxClass); if (!errorBox) { errorBox = field.querySelector(this.options.classes.errorMsgBoxClass); } if (errorBox) { this.switchErrorVisibility(state, errorBox, message); } }, switchErrorVisibility(state, box, message) { switch (state) { case 'show': box.innerHTML = message; box.style.display = 'block'; box.scrollIntoView({ behavior: 'smooth', block: 'start'}); break; case 'hide': box.style.display = 'none'; box.innerHTML = ''; break; } }, submitSurveyForm(element, event, page, tab) { let form = document.getElementById('amform-form-9'); let sPage = form.querySelector('[x-ref="' + page + '"]'); let sTab = form.querySelector('[x-ref="' + tab + '"]'); let isValid = this.pageValidation(sPage, sTab, event); if (!isValid) { return false; } else { element.querySelector(this.options.classes.modalTriggerClass).click() } }, showConfirmForm: function (result) { let form = document.getElementById('amform-form-9'); if (result) { form.submit(); } } } }</script><script> (function setDependencies() { const form = document.getElementById('amform-form-9'); const relatedFields = form.querySelectorAll('[data-dependency]'); if (!relatedFields.length) { return; } relatedFields.forEach(relatedField => { const dependency = relatedField.dataset.dependency.split(','); const dependencyFields = []; dependency.forEach(dependency => { dependencyFields.push(form.querySelectorAll(`[x-ref="${dependency.trim()}"]`)); }); dependencyFields.forEach(element => { let field = element[0]; let mutationCallback = (mutationsList) => { for (const mutation of mutationsList) { if (mutation.type !== "attributes" || mutation.attributeName !== "disabled") return updateDependency(dependencyFields, relatedField); } }; let observer = new MutationObserver(mutationCallback); field.closest('.fieldset-block').addEventListener('change', () => { updateDependency(dependencyFields, relatedField) }, false); observer.observe(field, { attributes: true }) }); updateDependency(dependencyFields, relatedField); }); function canBeChecked(type) { return type === 'checkbox' || type === 'radio'; } function updateDependency(dependencyFields, relatedField) { let isVisible = true; dependencyFields.forEach(otherFieldDependency => { if (canBeChecked(otherFieldDependency[0].type) && !otherFieldDependency[0].checked || otherFieldDependency[0].type === undefined && !otherFieldDependency[0].selected || otherFieldDependency[0].disabled) { isVisible = false; } }); if (isVisible) { relatedField.style.display = 'block'; relatedField.querySelectorAll('input, select, textarea, option').forEach(input => { input.removeAttribute('disabled'); }) } else { relatedField.style.display = 'none'; relatedField.querySelectorAll('input, select, textarea, option').forEach(input => { input.setAttribute('disabled', 'disabled'); }); } } })();</script><script> (function fillFormData(formId) { const params = {"urlSession":"https:\/\/amasty.com\/amasty_customform\/form\/sessiondata\/","formId":9,"productId":"686"}; const formData = 'form_id=' + formId + '&product_id=' + params.productId; const form = document.getElementById('amform-form-' + formId + ''); const parseXData = function (node) { try { const xDataString = (node.getAttribute('x-data') ?? '{}') .replace(/[\n ]+/g, '') .replace(/(\w+):/g, '"$1":') .replace(/'/g, '"'); return JSON.parse(xDataString); } catch (e) { console.log(e); return null; } }; const updateWrapperXData = function (inputNode, inputData) { try { const inputWrapper = inputNode.closest('.fieldset-block'); const xDataObject = parseXData(inputWrapper); if (typeof xDataObject.value !== 'undefined' && xDataObject.value !== inputData) { xDataObject.value = inputData; inputWrapper.setAttribute('x-data', JSON.stringify(xDataObject)); } } catch (e) { console.error(e); } }; const getValueAsArray = function(inputData) { return ( typeof inputData === 'string' ? [inputData] : Array.isArray(inputData) ? inputData : [] ); } const checkNodesByValues = function(nodes, values, attributeName) { values.forEach(function (value) { const nodeToSetAttribute = nodes.find(node => node.getAttribute('value') === value); nodeToSetAttribute && (nodeToSetAttribute[attributeName] = true); }); } const textInputFiller = { supportedInputTypes: [ 'text', 'email', 'number', 'date', 'time' ], supportedTagNames: [ 'textarea' ], support: function (inputNode) { return this.supportedInputTypes.includes(inputNode.getAttribute('type')) || this.supportedTagNames.includes(inputNode.tagName.toLowerCase()); }, fill: function (inputNode, inputData) { if (typeof inputData !== 'string') { return; } inputNode.value = inputData; updateWrapperXData(inputNode, inputData); } }; const selectInputFiller = { supportedTagNames: [ 'select' ], support: function (inputNode) { return this.supportedTagNames.includes(inputNode.tagName.toLowerCase()); }, fill: function (inputNode, inputData) { const optionValues = getValueAsArray(inputData); if (optionValues.length === 0) { return; } this.clearSelectedAttribute(inputNode); checkNodesByValues(Array.from(inputNode.options), optionValues, 'selected'); updateWrapperXData(inputNode, optionValues); }, clearSelectedAttribute: function (inputNode) { Array.from(inputNode.options).forEach((option) => { option.selected = false; option.removeAttribute('selected'); }); } }; const checkableInputFiller = { supportedInputTypes: [ 'checkbox', 'radio' ], support: function (inputNode) { return this.supportedInputTypes.includes(inputNode.getAttribute('type')); }, fill: function (inputNode, inputData) { const inputName = inputNode.getAttribute('name'); const checkboxList = document.querySelectorAll(`input[name="${inputName}"]`); const checkboxValues = getValueAsArray(inputData); if (checkboxValues.length === 0) { return; } this.uncheck(checkboxList); checkNodesByValues(Array.from(checkboxList), checkboxValues, 'checked'); this.fillRating(inputNode, inputData); }, fillRating(inputNode, inputData) { if (!this.isRating(inputNode) || typeof inputData !== 'string') { return; } const xDataContainer = inputNode.closest('[x-data]'); if (!xDataContainer?.getAttribute('x-data').includes('clickedRatingId')) { return; } const xData = parseXData(xDataContainer); if (!xData) { return; } xData.clickedRatingId = inputData; xDataContainer.setAttribute('x-data', JSON.stringify(xData)); xDataContainer.querySelector('input:checked')?.click(); }, isRating: function(inputNode) { return inputNode.name.startsWith('rating-'); }, uncheck: function (checkboxList) { checkboxList.forEach(function (checkbox) { checkbox.checked = false; }); } }; const inputFillerPool = { excludedInputNames: [ 'form_id', 'form_key', 'is_survey' ], inputFillers: [ textInputFiller, selectInputFiller, checkableInputFiller ], fill: function (inputNode, inputData) { if (this.shouldExclude(inputNode)) { return; } for (const fillerIndex in this.inputFillers) { if (this.inputFillers[fillerIndex].support(inputNode)) { this.inputFillers[fillerIndex].fill(inputNode, inputData); inputNode.closest('.fieldset-block').dispatchEvent(new Event('change')); break; } } }, shouldExclude: function (inputNode) { return this.excludedInputNames.includes(inputNode.getAttribute('name')) || inputNode.getAttribute('type') === 'hidden'; } }; function requestData(url, body) { return new Promise((resolve, reject) => { fetch(url, { method: 'POST', body: body, headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'X-Requested-With': 'XMLHttpRequest' } }).then(response => response.json()) .then(data => { resolve(data); }) .catch((error) => { reject(error); }); }); } requestData(params.urlSession, formData).then(data => { const formFields = data.form_fields ?? {}; const persistedInputNames = Object.keys(formFields); persistedInputNames.forEach(inputName => { const inputNode = form.querySelector(`[name^="${inputName}"]`); !!inputNode && inputFillerPool.fill(inputNode, formFields[inputName]); }); }) })(9);</script><script> function amCustomTabs() { const hash = window.location.hash; const selectors = { tabItem: '.am-tabs-item' } return { isChangelogVersion: '1.0.8', isMobile: false, tabs: [{"name":"amcustomtabs_tabs_1","title":"Description","alias":"description","isActive":false},{"name":"amcustomtabs_tabs_4","title":"FAQ","alias":"faq","isActive":false},{"name":"amcustomtabs_tabs_3","title":"Reviews","alias":"reviews","isActive":false},{"name":"amcustomtabs_tabs_15","title":"Customization","alias":"customization","isActive":false},{"name":"amcustomtabs_tabs_16","title":"Change Log","alias":"changelog","isActive":false}], isAccordion: false, isOpenAllTabs: false, initAmCustomTabs() { this.checkIsMobileResolution(); this.prepareTabs(); this.$nextTick(() => { this.checkOpenTabs(); }) }, prepareTabs() { if (this.tabs.some(tab => tab.alias === 'product-overview-tab')) { this.removeTab('description'); } }, removeTab(tabName) { this.tabs = this.tabs.filter(tab => tab.alias !== tabName); }, setActiveTabs(currentName) { const anchor = document.getElementById(currentName).closest(selectors.tabItem); const behavior = this.isAccordion ? 'instant' : 'smooth'; for (let tab of this.tabs) { if (this.isOpenAllTabs) { this._toggleCollapsible(currentName, tab); } else { if (tab.isActive && this.isMobile) { tab.isActive = false; } else { tab.isActive = currentName === tab.name; } } } if (!this.isOpenAllTabs && this.isMobile) { this._scrollToElement(anchor, behavior); } }, isActiveTab(currentName) { for (let tab of this.tabs) { if (currentName === tab.name) { return tab.isActive; } } }, checkIsMobileResolution() { this.isMobile = window.matchMedia('(max-width: 768px)').matches; }, checkOpenTabs() { if (hash) { this._activatePreselectedTab(); } else { if (!this.isOpenAllTabs) { this.tabs[0].isActive = true; } else { this._setActiveAllTabs(); } } }, _activatePreselectedTab() { let tabAnchor; for (let tab of this.tabs) { if (hash === '#' + tab.alias) { tabAnchor = document.getElementById(tab.name).closest(selectors.tabItem); tab.isActive = true; this._dispatchTabCollapsedEvent(tabAnchor, 'smooth'); } } if (this.isOpenAllTabs) { this._setActiveAllTabs(); this._dispatchTabCollapsedEvent(tabAnchor, 'smooth'); } }, _dispatchTabCollapsedEvent(data) { window.dispatchEvent(new CustomEvent('amtabs-collapsed', { detail: { element: data, } })); }, _setActiveAllTabs() { for (let tab of this.tabs) { tab.isActive = true; } }, _toggleCollapsible(currentName, tab) { if (currentName === tab.name) { tab.isActive = !tab.isActive; } }, _scrollToElement(el, behavior) { setTimeout(() => { const stickyProductBlock = document.querySelector('.amsticky-cart-block.-amsticky-cart-active'); const additionalHeight = stickyProductBlock ? stickyProductBlock.offsetHeight : 0; window.scrollTo(({ top: el.getBoundingClientRect().top + window.scrollY - additionalHeight, behavior: behavior ? behavior : "auto" })) },50); }, eventListeners: { ['@amtabs-collapsed.window'](event) { this._scrollToElement(event.detail.element, 'smooth'); } } } }</script><script type="text/x-magento-init"> { "[data-amtheme-js=ajax-tocart]": { "amAjaxCart": { "actionUrl": "https://amasty.com/amasty_jettheme/ajax/addToCart/", "classes":{ "addToCartButtonDisable": "disabled -show-spinner" } } } }</script><script type="text/x-magento-init"> { ".block.related": { "amRelatedAnalytics": { "viewUrl": "https://amasty.com/ammostviewed/analytics/view/", "blockId": 6, "relatedProducts": [521], "clickUrl": "https://amasty.com/ammostviewed/analytics/click/" } } }</script><script type="text/x-magento-init"> { "*": { "Amasty_Preorder/js/product/preorder_list": { "jsonConfig" : {"500":{"configurable":{"entity":"500","swatchOpt":".swatch-opt-500","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"500":{"135":"Edition"}},"isAllProductsPreorder":0}},"504":{"configurable":{"entity":"504","swatchOpt":".swatch-opt-504","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"504":{"135":"Edition"}},"isAllProductsPreorder":0}},"508":{"configurable":{"entity":"508","swatchOpt":".swatch-opt-508","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"508":{"135":"Edition"}},"isAllProductsPreorder":0}},"538":{"configurable":{"entity":"538","swatchOpt":".swatch-opt-538","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"538":{"135":"Edition"}},"isAllProductsPreorder":0}},"649":{"configurable":{"entity":"649","swatchOpt":".swatch-opt-649","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"649":{"135":"Edition"}},"isAllProductsPreorder":0}},"673":{"configurable":{"entity":"673","swatchOpt":".swatch-opt-673","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"673":{"135":"Edition"}},"isAllProductsPreorder":0}},"707":{"configurable":{"entity":"707","swatchOpt":".swatch-opt-707","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"707":{"135":"Edition"}},"isAllProductsPreorder":0}},"728":{"configurable":{"entity":"728","swatchOpt":".swatch-opt-728","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"728":{"135":"Edition"}},"isAllProductsPreorder":0}},"921":{"configurable":{"entity":"921","swatchOpt":".swatch-opt-921","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"921":{"135":"Edition"}},"isAllProductsPreorder":0}},"521":{"configurable":{"entity":"521","swatchOpt":".swatch-opt-521","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"521":{"135":"Edition"}},"isAllProductsPreorder":0}}} } } }</script><script type="text/x-magento-init"> { "[data-amtheme-js=ajax-tocart]": { "amAjaxCart": { "actionUrl": "https://amasty.com/amasty_jettheme/ajax/addToCart/", "classes":{ "addToCartButtonDisable": "disabled -show-spinner" } } } }</script><script type="text/x-magento-init"> { "*": { "Amasty_Preorder/js/product/preorder_list": { "jsonConfig" : [] } } }</script><script> 'use strict'; function amReviews() { return Object.assign({ reviewSelectors: { customerReviewList: '#reviews' }, eventListeners: { ['@amreviews-filter.window'](event) { this.filterReviews(event.detail.url); } }, /** * @param {string} url * @returns {void} */ filterReviews: function (url) { fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } }).then(response => { return response.ok ? response.text() : Promise.reject(`${response.status} ${response.statusText}`); }).then(result => { !!result && hyva.replaceDomElement(this.reviewSelectors.customerReviewList, result); this.$nextTick(() => { this.scrollToReviewsBlock(); }) }).catch(error => { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ { type: "error", text: error } ]); }) }, /** * @returns {void} */ scrollToReviewsBlock: function () { document.querySelector(this.reviewSelectors.customerReviewList).scrollIntoView({ behavior: 'smooth', block: 'start' }); } }, typeof amReviewCommentsHandler === 'function' ? amReviewCommentsHandler() : {} ); }</script><script type="text/x-magento-init"> { "*": { "Magento_Ui/js/core/app": { "components": { "storage-manager": { "component": "Magento_Catalog/js/storage-manager", "appendTo": "", "storagesConfiguration" : {"recently_viewed_product":{"requestConfig":{"syncUrl":"https:\/\/amasty.com\/catalog\/product\/frontend_action_synchronize\/"},"lifetime":"1000","allowToSendRequest":null},"recently_compared_product":{"requestConfig":{"syncUrl":"https:\/\/amasty.com\/catalog\/product\/frontend_action_synchronize\/"},"lifetime":"1000","allowToSendRequest":null},"product_data_storage":{"updateRequestConfig":{"url":"https:\/\/amasty.com\/rest\/default\/V1\/products-render-info"},"requestConfig":{"syncUrl":"https:\/\/amasty.com\/catalog\/product\/frontend_action_synchronize\/"},"allowToSendRequest":null}} } } } } }</script><script type="text/x-magento-init"> { "*": { "Amasty_AdminCustomerSections/js/adminCustomerSections": {} } }</script><script> 'use strict'; function initAmGdprPolicyPopup() { return { /** * @typedef PolicyData * @property {string} policyVersion * @property {boolean} show * @property {string} title * @property{boolean} versionChanged * @property {boolean} hideClose * @property {boolean} action */ eventListeners: { ['@amgdpr-accept-policy']() { if (this.consentId) { window.dispatchEvent(new CustomEvent('amgdpr-consent-accepted', {detail: this.consentId})); this.consentId = undefined; this.hide('amgdpr-policy-popup'); } else { this.acceptPolicy(); } }, ['@amgdpr-show-policy.window'](event) { this.consentId = event.detail; this.fetchPolicyContent().then(() => { this.$nextTick(() => { this.show('amgdpr-policy-popup'); }); }); }, ['@amgdpr-close-policy']() { this.hide('amgdpr-policy-popup'); } }, textUrl: 'https://amasty.com/gdpr/policy/policytext/', acceptUrl: 'https://amasty.com/gdpr/policy/accept/', popupDataUrl: 'https://amasty.com/gdpr/policy/popupData/', notificationText: 'We would like to inform you that our Privacy Policy has been amended.Please, read and accept the new terms.', showOnPageLoad: '', /** * @type PolicyData */ policyData: { policyVersion: '', show: false, title: '', versionChanged: false, hideClose: false, action: true }, title: '', policyText: '', consentId: undefined, initGdprPopup: function () { this.fetchPolicyData().then(() => { if ((this.showOnPageLoad && this.policyData.show) || this.policyData.versionChanged) { this.fetchPolicyContent().then(() => { this.$nextTick(() => { this.show('amgdpr-policy-popup'); }); }); } }); }, /** * @returns {Promise} */ fetchPolicyData: function () { return fetch(this.popupDataUrl) .then(response => response.json()) .then((data) => { this.policyData = {...data} }) .catch(error => this.dispatchErrorMessage(error)); }, /** * @returns {Promise} */ fetchPolicyContent: function () { this.title = ''; this.policyText = ''; const params = !!this.consentId ? '?' + new URLSearchParams({consent_id: this.consentId}) : '' return fetch(this.textUrl + params) .then(response => response.json()) .then(policyContent => { this.title = policyContent.title; this.policyText = policyContent.content; }).catch(error => this.dispatchErrorMessage(error)); }, /** * @returns {void} */ acceptPolicy: function () { window.dispatchEvent(new Event('amgdpr-loading-start')); const body = new URLSearchParams({form_key: hyva.getFormKey(), ...this.policyData}); const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; fetch(this.acceptUrl, {method: 'POST', body, headers: {'Content-Type': contentType}}) .then(response => response.json()) .then(data => { if (data.error) { this.dispatchErrorMessage(data.message) } else { this.notificationText = ''; this.hide('amgdpr-policy-popup'); } }) .catch(error => this.dispatchErrorMessage(error)) .finally(() => window.dispatchEvent(new Event('amgdpr-loading-stop'))); }, /** * @param {string} message * @returns {void} */ dispatchErrorMessage: function (message) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ { type: "error", text: message } ]); }, /** * @returns {void} */ focusAcceptButton: function () { this.$refs['amgdpr-accept-policy']?.focus(); }, /** * @returns {void} */ focusCloseButton: function () { this.$refs['amgdpr-close-policy']?.focus(); } } }</script><script>require(['magezonBuilder']);</script><script>require(['Magezon_PageBuilder/js/common']);</script><script> (() => { function src_default(Alpine) { Alpine.directive("intersect", (el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { let evaluate = evaluateLater(expression); let options = { rootMargin: getRootMargin(modifiers), threshold: getThreshhold(modifiers) }; let observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting === (value === "leave")) return; evaluate(); modifiers.includes("once") && observer.disconnect(); }); }, options); observer.observe(el); cleanup(() => { observer.disconnect(); }); }); } function getThreshhold(modifiers) { if (modifiers.includes("full")) return 0.99; if (modifiers.includes("half")) return 0.5; if (!modifiers.includes("threshold")) return 0; let threshold = modifiers[modifiers.indexOf("threshold") + 1]; if (threshold === "100") return 1; if (threshold === "0") return 0; return Number(`.${threshold}`); } function getLengthValue(rawValue) { let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); return match ? match[1] + (match[2] || "px") : void 0; } function getRootMargin(modifiers) { const key = "margin"; const fallback = "0px 0px 0px 0px"; const index = modifiers.indexOf(key); if (index === -1) return fallback; let values = []; for (let i = 1; i < 5; i++) { values.push(getLengthValue(modifiers[index + i] || "")); } values = values.filter((v) => v !== void 0); return values.length ? values.join(" ").trim() : fallback; } document.addEventListener("alpine:init", () => { window.Alpine.plugin(src_default); }); })();</script><script type="module" src="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Hyva_Theme/js/alpine3.min.js" defer crossorigin ></script><script> 'use strict'; function dispatchMessages(messages, hideAfter) { const messagesEvent = new CustomEvent("messages-loaded", { detail: { messages: messages, hideAfter: hideAfter } }); window.dispatchEvent(messagesEvent); } if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } (function( hyva, undefined ) { hyva.initFormKey = () => { const inputSelector = 'input[name="form_key"]', formKey = hyva.getFormKey(); Array.from(document.querySelectorAll(inputSelector)).map(function (input) { input.value = formKey }); } hyva.initMessages = () => { try { const messages = hyva.getCookie('mage-messages'); window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; dispatchMessages(window.mageMessages); const skipSetDomain = true; hyva.setCookie('mage-messages','', -1, skipSetDomain); } catch (error) { console.warn('Error parsing Cookie Messages:', error); } } window.addEventListener('DOMContentLoaded', hyva.initFormKey); hyva.alpineInitialized(hyva.initMessages) }( window.hyva = window.hyva || {} ));</script><script> 'use strict'; { const private_content_key = 'mage-cache-storage'; const private_content_expire_key = 'mage-cache-timeout'; const private_content_version_key = 'private_content_version'; const section_data_ids_key = 'section_data_ids'; const mage_cache_session_id_key = 'mage-cache-sessid'; const last_visited_store_key = 'last_visited_store'; const ttl = 3600; if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); } function loadSectionData () { const browserStorage = hyva.getBrowserStorage(); if (!browserStorage) { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: "warning", text: "Please enable LocalStorage in your browser." }] ); return; } try { let isInvalid = false; if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { isInvalid = true; } hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); if (!hyva.getCookie(mage_cache_session_id_key)) { isInvalid = true; const skipSetDomain = true; const days = false; hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) } const cookieVersion = hyva.getCookie(private_content_version_key); const storageVersion = browserStorage.getItem(private_content_version_key); if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { isInvalid = true; } const privateContentExpires = browserStorage.getItem(private_content_expire_key); if (privateContentExpires && new Date(privateContentExpires) < new Date()) { browserStorage.removeItem(private_content_key); } if (isInvalid) { fetchPrivateContent([]); } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); if ( privateContent && privateContentExpires && privateContent.cart && privateContent.customer ) { dispatchPrivateContent(privateContent); } else { fetchPrivateContent([]); } } else { dispatchPrivateContent({}); } } catch (error) { console.warn('Error retrieving Private Content:', error); } } hyva.alpineInitialized(loadSectionData) window.addEventListener('reload-customer-section-data', loadSectionData); function dispatchPrivateContent(data) { const privateContentEvent = new CustomEvent("private-content-loaded", { detail: { data: data } }); window.dispatchEvent(privateContentEvent); } function fetchPrivateContent(sections) { fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { method: 'GET', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } }) .then(response => response.json()) .then( data => { if (data) { try { const browserStorage = hyva.getBrowserStorage(); const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { delete oldSectionData['checkout-data']; } const newSectionData = Object.assign(oldSectionData, data); dispatchPrivateContent(newSectionData); if (newSectionData.messages && newSectionData.messages.messages ) { newSectionData.messages.messages = []; } browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); browserStorage.setItem(private_content_expire_key, expiresAt); const newCookieVersion = hyva.getCookie(private_content_version_key); browserStorage.setItem(private_content_version_key, newCookieVersion); hyva.setCookie( section_data_ids_key, JSON.stringify( Object.keys(data).reduce((sectionDataIds, sectionKey) => { sectionDataIds[sectionKey] = data[sectionKey]['data_id']; return sectionDataIds; }, {}) ), false, true ); } catch (error) { console.warn("Couldn't store privateContent", error); } } } ); } }</script><script> (() => { document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); })()</script><script> (events => { const dispatchUserInteractionEvent = () => { events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) window.dispatchEvent(new Event('init-external-scripts')) }; events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown'])</script><script> (function () { const reviewComponent = document.querySelector('[x-data="initReviewForm()"]'); reviewComponent?.setAttribute( 'x-init', `$watch( 'errorMessages', errorMessages => { errorMessages?.length > 0 && window.dispatchEvent(new CustomEvent("reload-customer-section-data")) } );${reviewComponent.getAttribute('x-init') || ''}` ); })();</script><script> 'use strict'; (function () { const modals = []; const excludedFromFocusTrapping = new Set(); function loadInertPolyfill(callback) { if (window.hyva.modal.disableInertPolyfill) { callback && callback(); } else { const polyfill = document.createElement('script'); polyfill.src = 'https\u003A\u002F\u002Fcdn.amasty.com\u002Fstatic\u002Fversion1740558685\u002Ffrontend\u002FAmasty\u002FAmTheme\u002Fen_US\u002FHyva_Theme\u002Fjs\u002Fwicg\u002Dinert\u002D3.1.1\u002Finert.min.js'; callback && polyfill.addEventListener('load', callback); const firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(polyfill, firstScriptTag); } } let isInertPolyfillLoaded = 0; function setSiblingsInert(dialogElement, toState) { if (isInertPolyfillLoaded === 0) { isInertPolyfillLoaded = 1; loadInertPolyfill(() => { isInertPolyfillLoaded = 2; setSiblingsInert(dialogElement, toState) }) return; } if (isInertPolyfillLoaded === 1) { return; } let el = dialogElement; while (el && (el = el.parentElement)) { if (el === document.body || el.parentElement === null) continue; Array.from(el.parentElement.children).forEach(sibling => { if (sibling !== el) { sibling.inert = toState; } }) } (function setChildrenInert(el, toState) { if (el) { el.inert = toState; Array.from(el.children).forEach(child => setChildrenInert(child, toState)); } })(findParentWithOverlaySpread(dialogElement), ! toState) excludedFromFocusTrapping.forEach(selector => { Array.from(document.querySelectorAll(selector)).map(el => el.inert = false); }) } function findParentWithOverlaySpread(el) { while (el && (el = el.parentElement)) { if (el === document.body || el.parentElement === null) continue; if (el.hasAttribute('x-spread') && el.getAttribute('x-spread').indexOf('overlay(') !== -1) { return el; } } } function freeFocusFromModalTrap(modal) { const dialogElement = modal.instance.$refs[modal.name]; isOverlayDisabled(dialogElement) || modal.instance.$nextTick(() => setSiblingsInert(dialogElement, false)); } function trapFocusInNextModalWithOverlay() { for (let idx = modals.length -1; idx >= 0; idx--) { const nextOnStack = modals[idx]; const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; if (! isOverlayDisabled(nextDialogElement)) { nextOnStack.instance.$nextTick(() => setSiblingsInert(nextDialogElement, true)); break; } } } function focusables(dialogElement) { const selector = 'a, button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; return Array.from(dialogElement.querySelectorAll(selector)) .filter(el => !el.hasAttribute('disabled')); } function firstVisible(elements) { const a = Array.from(elements); for (let i = 0; i < a.length; i++) { if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; } return null; } function isInViewport(element) { const rect = element && element.getBoundingClientRect(); return rect && rect.top >= 0 && rect.left >= 0 && rect.right <= window.innerWidth && rect.bottom <= window.innerHeight; } function setFocusAfterTransition(dialogElement, duration) { window.setTimeout(() => { const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || focusables(dialogElement)[0] || null; focusElement && isInViewport(focusElement) && focusElement.focus(); }, duration + 1); } function determineTrigger($refs, dialog, trigger) { if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target && dialog.target.focus) { return dialog.target; } if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target && trigger.target.focus) { return trigger.target; } if (typeof trigger === 'string') { try { return $refs[trigger] || document.querySelector(trigger) } catch (e) {} } if (trigger instanceof Element) { return trigger; } return null; } function isOverlayDisabled(dialog) { return dialog && dialog.hasAttribute('x-no-overlay') } function areRemainingModalsWithoutOverlay(modals) { const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); return overflowDisabled.length === modals.length; } window.hyva.modal = function(options) { const config = Object.assign({ dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', transitionEnterStart: 'opacity-0', transitionEnterEnd: 'opacity-100', transitionLeave: 'transition ease-in duration-300', transitionLeaveStart: 'opacity-100', transitionLeaveEnd: 'opacity-0', }, options); let lastHide = 0; return { opened: {}, show(dialog, trigger) { const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); const name = typeof dialog === 'string' ? dialog : config.dialog; const dialogElement = this.$refs[name]; if (! dialogElement) { return; } const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); dialogElement.scrollTop = 0; if (this.opened[name]) { return; } if (focusTargetAfterHide) { focusTargetAfterHide.setAttribute('aria-expanded', 'true'); } this.opened[name] = true; useOverlay && this.$nextTick(() => setSiblingsInert(dialogElement, true)); setFocusAfterTransition(dialogElement, config.duration); const frame = {name, instance: this, focusTarget: focusTargetAfterHide, time: Date.now()}; modals.push(frame); if (useOverlay) { document.body.classList.add('overflow-hidden'); } return new Promise(resolve => frame.resolve = resolve); }, cancel() { this.hide(false); }, ok() { this.hide(true); }, hide(value) { if (Date.now() - lastHide < config.duration) { return; } lastHide = Date.now(); const modal = modals.pop() || {}; const name = modal.name; this.opened[name] = false; freeFocusFromModalTrap(modal) trapFocusInNextModalWithOverlay(); const nextFocusAfterHide = modal.focusTarget; nextFocusAfterHide && setTimeout(() => { nextFocusAfterHide.setAttribute('aria-expanded', 'false'); nextFocusAfterHide.focus() }, config.duration); if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { document.body.classList.remove('overflow-hidden'); } modal.resolve(value); }, overlay(dialog) { const name = typeof dialog === 'string' ? dialog : config.dialog; return { ['x-show']() { return this.opened[name] }, ['x-transition:enter']: config.transitionEnter, ['x-transition:enter-start']: config.transitionEnterStart, ['x-transition:enter-end']: config.transitionEnterEnd, ['x-transition:leave']: config.transitionLeave, ['x-transition:leave-start']: config.transitionLeaveStart, ['x-transition:leave-end']: config.transitionLeaveEnd, ['@hyva-modal-show.window'](event) { event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) } }; } }; } window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] window.hyva.modal.pop = function () { if (modals.length > 0) { const modal = modals[modals.length -1]; modal.instance.hide(); } } window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { typeof selectors === 'string' || selectors instanceof String ? excludedFromFocusTrapping.add(selectors) : selectors.map(selector => excludedFromFocusTrapping.add(selector)); } window.hyva.modal.eventListeners = { keydown: event => { if (event.key === 'Escape') { window.hyva.modal.pop(); } }, click: event => { if (modals.length > 0) { const modal = modals[modals.length -1]; const dialog = modal.instance.$refs[modal.name]; if (modal.time + 50 < Date.now() && ! isOverlayDisabled(dialog) && ! dialog.contains(event.target)) { modal.instance.hide(); } } } }; document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); document.addEventListener('click', window.hyva.modal.eventListeners.click); })();</script><script> (function () { 'use strict'; const storageName = 'AmastyCookieGroups'; !!hyva.amStorage && hyva.amStorage.create(storageName, { /** * @type {{ * checked: boolean, * cookies: {description: string, lifetime: number|null, name: string, provider: string, type: string}[], * description: string, * groupId: string|number, * isEssential: boolean, * name: string * }[]} name */ groupData: [], cookiePolicy: undefined, lastUpdate: undefined, /** * @returns {string|number[]} */ getEssentialGroupIds: function () { return this.groupData.reduce(function (essentialGroupIds, group) { if (group.isEssential) { essentialGroupIds.push(group.groupId) } return essentialGroupIds; }, []); }, /** * @returns {string|number[]} */ getCheckedGroupIds: function () { return this.groupData.reduce(function (checkedGroupIds, group) { if (group.checked) { checkedGroupIds.push(group.groupId); } return checkedGroupIds; }, []); }, /** * @param {string} cookieName * @returns {boolean} */ isCookieEssential: function (cookieName) { const allEssentialCookies = this.getEssentialCookies(); return !!allEssentialCookies.find(cookie => cookie.name === cookieName); }, /** * @returns {array} */ getEssentialCookies: function () { return this.groupData .filter(group => group.isEssential) .map(group => group.cookies) .flat(); }, /** * @returns {boolean} */ hasGroupData: function () { return !!this.groupData.length; }, /** * @param {string} cookieName * @param {string} pattern * @returns {boolean} */ isEssentialByPattern: function (cookieName, pattern) { const essentialCookiePatterns = this.getEssentialCookiesPattern(pattern); return essentialCookiePatterns.some((pattern) => !!cookieName.match(this.getCookiePattern(pattern))); }, /** * @param {string} pattern * @return {Array} */ getEssentialCookiesPattern: function (pattern) { return this.getCookiesByPattern(pattern, this.getEssentialCookies()); }, /** * @param {string} pattern * @param {Array|undefined} cookies * @return {Array} */ getCookiesByPattern: function (pattern, cookies) { if (typeof cookie === 'undefined') { cookies = this.getAllCookies(); } return cookies .map((cookie) => typeof cookie === 'object' ? cookie.name : cookie.split('=')[0].trim()) .filter((cookie) => cookie.match(pattern) !== null); }, /** * @returns {array} */ getDisallowedCookies: function () { const disallowedCookie = decodeURIComponent(hyva.getCookie('amcookie_disallowed') ?? ''); if (!disallowedCookie) { return []; } return disallowedCookie.split(','); }, /** * @returns {string} */ getCookiePattern: function (pattern) { return `^${pattern.replaceAll('*', '.*')}$`; }, /** * @returns {array} */ getAllCookies: function () { return document.cookie.split(';'); }, /** * @param {boolean} setAcceptance * @returns {Promise} */ updateGroupData: function (setAcceptance = false) { const cookieFetchUrl = `${BASE_URL}amcookie/cookie/cookies`; return fetch(cookieFetchUrl, { method: "POST", headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' }, body: new URLSearchParams({ allowed: hyva.getCookie('amcookie_allowed'), restriction: hyva.getCookie('amcookie_policy_restriction') }) }).then(response => { if (response.ok) { return response.json(); } return Promise.reject(`${response.status} ${response.statusText}`); }).then(data => { this.cookiePolicy = data.cookiePolicy ?? 'allowed'; this.lastUpdate = data.lastUpdate ?? 0; this.groupData = [...data.groupData]; hyva.setCookie('amcookie_policy_restriction', this.cookiePolicy, 10); if (setAcceptance) { amastyCookieManager.setLastCookieAcceptance(this.lastUpdate); } return data; }).catch(error => { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ { type: "error", text: error } ]); }).finally(() => window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated'))); } }); })();</script><script> (function (amastyCookieManager) { 'use strict'; amastyCookieManager.pattern = '{(?<cookiePattern>.*)}'; amastyCookieManager.getAmastyCookieGroupStorage = function () { return hyva?.amStorage?.getStorage('AmastyCookieGroups') ?? {}; }; amastyCookieManager.deleteDisallowedCookie = function () { const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; disallowedCookies.forEach((name) => { const pattern = name.match(this.pattern); if (!!pattern && !!amastyCookieGroupStorage) { const cookiePattern = amastyCookieGroupStorage.getCookiePattern(pattern.groups.cookiePattern) ?? ''; amastyCookieGroupStorage.getCookiesByPattern(cookiePattern).forEach((cookieName) => { this.deleteNotEssentialCookie(cookieName); }); } else { this.deleteNotEssentialCookie(name); } }); }; amastyCookieManager.isCookieAllowed = function (cookieName) { const allowedGroups = hyva.getCookie('amcookie_allowed'); const disallowedCookie = this.getAmastyCookieGroupStorage()?.getDisallowedCookies() ?? []; const isCookiePolicyAllowed = hyva.getCookie('amcookie_policy_restriction') === 'allowed'; const isCookieEssential = this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName); const isCookieEssentialByPattern = this.getAmastyCookieGroupStorage()?.isEssentialByPattern(cookieName, this.pattern); if (!isCookiePolicyAllowed || isCookieEssential || isCookieEssentialByPattern) { return true; } return !((!allowedGroups && !disallowedCookie) || this.isCookieDisallowed(cookieName)); }; amastyCookieManager.isCookieDisallowed = function (cookieName) { const amastyCookieGroupStorage = this.getAmastyCookieGroupStorage(); const disallowedCookies = amastyCookieGroupStorage?.getDisallowedCookies() ?? []; return disallowedCookies.some((cookie) => { const pattern = cookie.match(this.pattern); return !!pattern && !!cookieName.match(amastyCookieGroupStorage?.getCookiePattern(pattern.groups.cookiePattern)); }) || disallowedCookies.indexOf(cookieName) !== -1; }; amastyCookieManager.processManageableCookies = function () { let cookieScripts = document.querySelectorAll('script[data-amcookie-groupid][type="text/plain"]'); cookieScripts.forEach((elem) => { if (this.isChecked(elem.dataset['amcookie-groupid'])) { let elClone = elem.cloneNode(true).setAttribute('type', 'text/javascript'); elem.remove(); document.body.appendChild(elClone); } }); }; amastyCookieManager.deleteNotEssentialCookie = function (cookieName) { if (!this.getAmastyCookieGroupStorage()?.isCookieEssential(cookieName)) { hyva.setCookie(cookieName, '', -1, true); } }; amastyCookieManager.setLastCookieAcceptance = function (lastUpdate) { localStorage.setItem('am-last-cookie-acceptance', lastUpdate); }; window.addEventListener('amasty-cookie-group-updated', () => { amastyCookieManager.deleteDisallowedCookie(); }); window.addEventListener('private-content-loaded', () => { amastyCookieManager.getAmastyCookieGroupStorage()?.hasGroupData() && amastyCookieManager.deleteDisallowedCookie(); }); }(window.amastyCookieManager = window.amastyCookieManager || {}));</script><script> (function () { 'use strict'; window.addEventListener('cookiebar-action-accept', (event) => { const groups = event.detail; const url = `${BASE_URL}amcookie/cookie/savegroups`; const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; const body = new URLSearchParams({ form_key: hyva.getFormKey() }); groups.length && groups.map(groupId => body.append('groups[]', groupId)); fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) .then(response => { if (response.ok) { return response.json(); } return Promise.reject(`${response.status} ${response.statusText}`); }) .then(data => { if (data.success) { !!hyva.amStorage && hyva.amStorage.getStorage('AmastyCookieGroups').updateGroupData(true); } }) .catch(error => { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ { type: "error", text: error } ]); }) .finally(() => { amastyCookieManager.processManageableCookies(); window.dispatchEvent(new CustomEvent('cookiebar-action-accept-finish')); window.dispatchEvent(new CustomEvent('amasty-cookie-group-updated')); setTimeout(() => { window.dispatchEvent(new CustomEvent('reload-customer-section-data')); }, 100); }); }); })();</script><script> (function () { 'use strict'; window.addEventListener('cookiebar-action-allow', () => { const url = `${BASE_URL}amcookie/cookie/allow`; const contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; const body = new URLSearchParams({ form_key: hyva.getFormKey() }); fetch(url, {method: 'POST', body, headers: {'Content-Type': contentType}}) .then(response => { if (response.ok) { return response; } return Promise.reject(`${response.status} ${response.statusText}`); }) .then(() => { !!hyva.amStorage && hyva.amStorage.getStorage('AmastyCookieGroups').updateGroupData(true); }) .catch(error => { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages([ { type: "error", text: error } ]); }) .finally(() => { amastyCookieManager.processManageableCookies(); window.dispatchEvent(new CustomEvent('cookiebar-action-allow-finish')); setTimeout(() => { window.dispatchEvent(new CustomEvent('reload-customer-section-data')); }, 100); }); }); })();</script><script> (function () { 'use strict'; window.addEventListener('cookiebar-action-settings', () => { window.dispatchEvent(new Event('open-am-cookie-bar-settings')); }); })();</script><script> window.addEventListener('init-fancybox', () => { if (!!window.Fancybox) { return; } const script = document.createElement('script'); script.src = 'https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Amasty_AdvancedReviewHyva/vendor/fancybox/fancybox.min.js'; script.async = true; document.body.appendChild(script); script.onload = () => { window.dispatchEvent(new CustomEvent('fancyboxLoaded', {})); } const styles = document.createElement('link'); styles.rel = 'stylesheet'; styles.href = 'https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Amasty_AdvancedReviewHyva/vendor/fancybox/fancybox.min.css'; document.head.appendChild(styles); }, { once: true, passive: true }); window.addEventListener('fancyboxLoaded', () => { Fancybox.bind('[data-fancybox="gallery"]', { Thumbs : false }); });</script><script> 'use strict'; function initParentContainerProcessor() { const selectors = { labelContainer: '.amasty-label-container', galleryImg: '#gallery img:not(.amasty-label-image)' } return { /** * @param {AmlabelComponent} label * @return {void} */ process: function (label) { this.moveLabelToParent(label); this.setParentStyles(label); }, /** * @param {AmlabelComponent} label * @return {void} */ moveLabelToParent: function (label) { const newParent = this.getNewParent(label); if (!newParent) { return; } const wrapperElement = newParent.querySelector(label.wrapperClass); label.parent = newParent; if (wrapperElement && !wrapperElement.isSameNode(label.element)) { this.insertLabelByPriority(label, wrapperElement); } else { newParent.prepend(label.element); } }, /** * @param {AmlabelComponent} label * @return {HTMLElement|null} */ getNewParent: function (label) { let newParent = label.element.closest(label.config.path) || this.findPreviousNodeExcludingScriptsAndDifferentLabels(label.element)?.querySelector(label.config.path) || label.parent.querySelector(label.config.path); if (!newParent && label.config.move !== 1 && label.config.mode === 'prod') { newParent = document.querySelector(selectors.galleryImg)?.parentElement; } return newParent; }, /** * @param {HTMLElement} element * @return {HTMLElement|null} */ findPreviousNodeExcludingScriptsAndDifferentLabels: function (element) { const previousElement = element?.previousElementSibling; if (!previousElement) { return null; } if (previousElement?.tagName !== 'SCRIPT' && !previousElement?.className?.includes?.('amlabel-position-wrapper') ) { return previousElement; } return this.findPreviousNodeExcludingScriptsAndDifferentLabels(previousElement); }, /** * @param {AmlabelComponent} label * @param {HTMLElement} wrapperElement * @return {void} */ insertLabelByPriority: function (label, wrapperElement) { const labelContainers = wrapperElement.querySelectorAll(selectors.labelContainer); const currentLabelOrder = label.labelContainer.dataset.amlabelOrder; let insertAfterContainer = null; labelContainers.forEach(labelContainer => { if (labelContainer.dataset.amlabelOrder < currentLabelOrder) { insertAfterContainer = labelContainer; } }); insertAfterContainer === null ? wrapperElement.prepend(label.labelContainer) : insertAfterContainer.after(label.labelContainer); label.element.remove(); label.element = wrapperElement; }, /** * @param {AmlabelComponent} label * @return {void} */ setParentStyles: function (label) { /* required for child position absolute */ !(label.parent.style.position === 'absolute') && (label.parent.style.position = 'relative'); !label.parent.style.width && label.parent.classList.add('w-fit-content'); !label.parent.style.marginLeft && label.parent.classList.add('ml-auto'); !label.parent.style.marginRight && label.parent.classList.add('mr-auto'); }, } }</script><script> 'use strict'; function initLabelItemProcessor() { /** * @typedef {Object} AmlabelComponent * * @property {HTMLElement} element Label wrapper element * @property {HTMLElement} parent Element where label should be placed * @property {boolean} initialized Is label initialized * @property {string} wrapperClass Dynamic class for label wrapper to place multiple labels properly by position * @property {HTMLElement} labelContainer Container for label text image and tooltip * @property {Config} config Label Configuration * @property {Object} parentContainerProcessor * @property {Object} labelItemProcessor */ /** * @typedef {Object} AmLabelConfig * * @property {0|1} alignment Labels Alignment config value (0 - Horizontal| 1 - Vertical) * @property {number} label Label Id * @property {number} margin Margin between labels config value * @property {('cat'|'prod')} mode Label mode * @property {number} move * @property {number} order Label order * @property {string} path The css selector to which label should place * @property {string} position Label position * @property {string} product Product Id * @property {string} redirect_url * @property {string} size Label size * @property {{ * backgroundColor: string, * color: string, * content: string, * status: 1|2|3 * }} tooltip */ return { /** * @param {AmlabelComponent} label * @return {void} */ process: function(label) { this.setLabelSize(label); this.setLinkProps(label); }, /** * @param {AmlabelComponent} label * @return {void} */ setLabelSize: function (label) { if (!label.config.size) { return; } label.labelContainer.style.width = label.parent.offsetWidth * label.config.size / 100 + 'px'; }, /** * * @param {Object} $event * @param {HTMLElement} tooltipNode */ placeTooltip: function($event, tooltipNode) { const labelNode = $event.target; const labelNodeRect = labelNode.getBoundingClientRect(); tooltipNode.style.bottom = (window.innerHeight - labelNodeRect.top) + 'px'; tooltipNode.style.left = (labelNodeRect.left + labelNode.offsetWidth / 2 ) + 'px'; }, /** * @param {AmlabelComponent} label * @return {void} */ setLinkProps: function (label) { !!label.config.redirect_url && label.labelContainer.classList.add('-link', 'cursor-pointer'); }, /** * @param {Object} $event Click event * @param {string} redirectUrl */ openLink: function($event, redirectUrl) { if (redirectUrl.length === 0) { return; } $event.preventDefault(); window.open(redirectUrl, '_blank'); } } }</script><script> (function () { 'use strict'; const observedEvent = 'amlabel-swatch-product-changed'; const selectors = { swatchOptions: 'div[x-data^=initConfigurable][x-data*=Options]', addToCartFormOnListing: 'form.product_addtocart_form', galleryImage: '#gallery img:not(.amasty-label-image)', labelWrapper: '.amlabel-position-wrapper' } /** * @return {void} */ const injectLabelObserver = function () { const swatches = document.querySelectorAll(selectors.swatchOptions); swatches.forEach(swatch => { const isListing = !!swatch.closest(selectors.addToCartFormOnListing); const injectedDispatch = `$dispatch('${observedEvent}', ` + `{productIndex: productIndex, element: $el, optionConfig: optionConfig, isListing: ${isListing ? 1 : 0}})`; let mutatedInitAttribute = swatch.getAttribute('x-init'); mutatedInitAttribute += `; $watch('productIndex', (productIndex) => { ${injectedDispatch} });`; swatch.setAttribute('x-init', mutatedInitAttribute); }); } /** * @param {{ * productIndex: number, * element: HTMLElement, * optionConfig: Object, * isListing: 0|1 * }} payload * @return {void} */ const updateLabel = function ({detail: payload}) { const {productIndex, element, optionConfig, isListing} = payload; if (!productIndex) { return; } const reloadUrl = optionConfig.label_reload; const headers = { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", }; const body = new URLSearchParams({ product_ids: productIndex, in_product_list: isListing }); const labelContainerSelector = isListing ? optionConfig.label_category : optionConfig.label_product; fetch(`${reloadUrl}?${body.toString()}`, {headers: headers, method: 'GET'}).then((response) => { if (response.ok) { return response.json(); } }).then((result) => { const labelHtml = result.labels && result.labels[productIndex]; let labelContainer = findClosest(element, labelContainerSelector); if (labelContainer === null && isListing === 0) { labelContainer = document.querySelector(selectors.galleryImage)?.parentElement; } if (!!labelContainer) { !!labelHtml ? replaceLabels(labelContainer, labelHtml) : clearLabelWrapper(labelContainer); } }).catch((error) => { typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( [{ type: 'error', text: error }], 5000 ); }); } /** * We use approach from hyva.replaceDomElement method to replace labels and init components * * @param {HTMLElement} labelContainer * @param {string} labelHtml * @return {void} */ function replaceLabels(labelContainer, labelHtml) { const parser = new DOMParser(); const doc = parser.parseFromString(labelHtml, 'text/html'); const nodes = doc.querySelectorAll(selectors.labelWrapper); if (!nodes) { return; } clearLabelWrapper(labelContainer); const tmpScripts = doc.getElementsByTagName('script'); if (tmpScripts.length > 0) { const scripts = [...tmpScripts]; scripts.forEach(script => { let scriptNode = document.createElement('script'); scriptNode.innerHTML = script.innerHTML; document.head.appendChild(scriptNode); script.parentNode.removeChild(script); }); } labelContainer.append(...nodes); } /** * @param {HTMLElement} labelContainer * @return {void} */ function clearLabelWrapper(labelContainer) { labelContainer.querySelectorAll(selectors.labelWrapper).forEach(wrapper => wrapper.remove()); } /** * @param {HTMLElement} currentElement * @param {string} selector * @return {HTMLElement|null} */ function findClosest(currentElement, selector) { const maxDepth = 3; let counter = 0; let closest = null; while (currentElement.parentNode && closest === null && counter < maxDepth) { ++counter; currentElement = currentElement.parentNode; closest = currentElement.querySelector(selector); } return closest; } injectLabelObserver(); window.addEventListener(observedEvent, updateLabel); })();</script><script> (function () { 'use strict'; const selectors = { body: '.catalog-product-view', productItem: 'product-item' } window.addEventListener('alpine:init', () => { Alpine.directive('amintersect', (el, { expression }, { evaluate, cleanup }) => { const observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (entry.isIntersecting) { evaluate(expression); observer.disconnect(); } }) }, { threshold: 0.5 }); observer.observe(getElement()); cleanup(() => { observer.disconnect() }); function getElement() { return !!document.querySelector(selectors.body) ? el.parentNode : getCategoryProductBlock(el); } function getCategoryProductBlock(el) { if (el.previousElementSibling === null) { return el; } if (!el.previousElementSibling.classList.contains(selectors.productItem)) { return getCategoryProductBlock(el.previousElementSibling); } return el.previousElementSibling; } }); }); })();</script><script> 'use strict'; (() => { function _calculateStrength({elementID, valid}) { const password = document.getElementById(elementID), emailElm = document.getElementById('email_address'); let displayScore; if (!password || !password.value) { displayScore = 0; } else { if (emailElm && password.value && emailElm.value && password.value.toLowerCase() === emailElm.value.toLowerCase()) { displayScore = 1; } else { const zxcvbnScore = zxcvbn(password.value).score; displayScore = valid && zxcvbnScore > 0 ? zxcvbnScore : 1; } } _displayStrength(displayScore); } function _displayStrength(displayScore) { let strengthLabel = '', className; switch (displayScore) { case 0: strengthLabel = "No\u0020Password"; className = 'password-none'; break; case 1: strengthLabel = "Weak"; className = 'password-weak'; break; case 2: strengthLabel = "Medium"; className = 'password-medium'; break; case 3: strengthLabel = "Strong"; className = 'password-strong'; break; case 4: strengthLabel = "Very\u0020Strong"; className = 'password-very-strong'; break; } const meterElm = document.getElementById('password-strength-meter-container'), meterLabelElm = document.getElementById('password-strength-meter-label'); if (meterElm) { meterElm.className = ''; meterElm.classList.add(className); meterLabelElm.textContent = strengthLabel; } } let loading = false; const callbacks = []; function loadZxcvbn(cb) { callbacks.push(cb); if (loading) return; loading = true; const script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'https\u003A\u002F\u002Fcdn.amasty.com\u002Fstatic\u002Fversion1740558685\u002Ffrontend\u002FAmasty\u002FAmTheme\u002Fen_US\u002Fjs\u002Fzxcvbn.min.js'; script.async = true; script.onload = () => callbacks.forEach(cb => cb()); document.head.appendChild(script); } window.addEventListener('password-validate', function (evt) { const meterElm = document.getElementById('password-strength-meter-container'), meterLabelElm = document.getElementById('password-strength-meter-label'); if (meterElm && meterLabelElm) { if (evt.detail && evt.detail.elementID) { const cb = () => _calculateStrength(evt.detail); window.zxcvbn ? cb() : loadZxcvbn(cb) } } }); document.addEventListener('DOMContentLoaded', () => { hyva && hyva.formValidation && hyva.formValidation.addRule('password-strength', function(value, options, field, context) { let counter = 0; const minCharacterSets = options.minCharacterSets !== undefined ? options.minCharacterSets : 1; if (value.match(/\d+/)) { counter++; } if (value.match(/[a-z]+/)) { counter++; } if (value.match(/[A-Z]+/)) { counter++; } if (value.match(/[^a-zA-Z0-9]+/)) { counter++; } queueMicrotask(() => { window.dispatchEvent(new CustomEvent('password-validate', { detail: { elementID: field.element.id || 'password', valid: field.state.valid }})); }); if (counter < minCharacterSets) { const missing = minCharacterSets - counter; return hyva.str('The\u0020password\u0020must\u0020include\u0020at\u0020least\u0020\u00251\u0020or\u0020more\u0020of\u003A\u0020uppercase\u0020\u0028A\u002DZ\u0029,\u0020lowercase\u0020\u0028a\u002Dz\u0029,\u0020number\u0020and\u0020symbol.', missing); } return true; }); }) })();</script><script> 'use strict'; function initAmastyCookieBar() { return { eventListeners: { ['@close-cookie-bar']() { this.hide('am-cookie-bar'); }, ['@open-cookie-bar']() { this.show('am-cookie-bar'); }, ['@amasty-cookie-group-updated.window']() { const lastUpdate = !!hyva.amStorage ? hyva.amStorage.getStorage('AmastyCookieGroups').lastUpdate : 0; if (this.isShowNotificationBar(this.firstShowProcess, lastUpdate)) { !this.opened['am-cookie-bar'] && this.show('am-cookie-bar'); } else { !!this.opened['am-cookie-bar'] && this.hide('am-cookie-bar'); } } }, firstShowProcess: '0', initBar: function () { window.isGdprCookieEnabled = true; !!hyva.amStorage && hyva.amStorage.getStorage('AmastyCookieGroups').updateGroupData(); }, /** * @param {string|number} firstShowProcess * @param {number} lastUpdate * @returns {boolean} */ isShowNotificationBar: function (firstShowProcess, lastUpdate) { return (this.isNeedFirstShow(firstShowProcess, lastUpdate) && !hyva.getCookie('amcookie_allowed') || this.isNeedShowOnUpdate(lastUpdate)); }, /** * @param {string|number} firstShowProcess * @param {number} lastUpdate * @returns {boolean} */ isNeedFirstShow: function (firstShowProcess, lastUpdate) { hyva.getBrowserStorage().setItem('amCookieBarFirstShowTime', lastUpdate); if (firstShowProcess === '0') { return true; } if (hyva.getBrowserStorage().getItem('amCookieBarFirstShow') !== '1') { hyva.getBrowserStorage().setItem('amCookieBarFirstShow', '1'); return true; } return false; }, /** * @param {number} lastUpdate * @returns {boolean} */ isNeedShowOnUpdate: function (lastUpdate) { if (!lastUpdate) { return false; } return this.isNeedShowAfterLastVisit(lastUpdate) || this.isNeedShowAfterLastAccept(lastUpdate); }, /** * @param {number} lastUpdate * @returns {boolean} */ isNeedShowAfterLastVisit: function (lastUpdate) { let needToShowAfterLastVisit = lastUpdate > hyva.getBrowserStorage().getItem('amCookieBarFirstShowTime'); if (needToShowAfterLastVisit) { hyva.getBrowserStorage().setItem('amCookieBarFirstShow', null); hyva.setCookie('amcookie_allowed', '', -1, true); } return needToShowAfterLastVisit; }, /** * @param {number} lastUpdate * @returns {boolean} */ isNeedShowAfterLastAccept: function (lastUpdate) { let needToShowAfterLastAccept = false; if (hyva.getBrowserStorage().getItem('am-last-cookie-acceptance')) { needToShowAfterLastAccept = lastUpdate > hyva.getBrowserStorage().getItem('am-last-cookie-acceptance'); } return needToShowAfterLastAccept; }, }; }</script><script> 'use strict'; function initCookieGroupInfo_67bf234b1dad3() { return { group: null, eventListeners: { ['@popup-close-am-cookie-group-info.window']() { this.hide('popup-am-cookie-group-info'); }, ['@popup-open-am-cookie-group-info.window'](event) { this.group = event.detail; if (!!this.group) { /* If modal have big cookies list this can lead to trigger hide event in hyva.modal.eventListeners.click, so we should wait till this.group is reassigned */ this.$nextTick(() => this.show('popup-am-cookie-group-info')); } } } } }</script><script> 'use strict'; function initCookieBarSettings() { return { eventListeners: { ['@close-am-cookie-bar-settings.window']() { !!this.opened['am-cookie-bar-settings'] && this.hide('am-cookie-bar-settings'); }, ['@open-am-cookie-bar-settings.window']() { !this.opened['am-cookie-bar-settings'] && this.show('am-cookie-bar-settings'); }, ['@cookiebar-action-accept-finish.window']() { !!this.opened['am-cookie-bar-settings'] && this.hide('am-cookie-bar-settings'); } }, focusDoneButton: function () { this.$refs['ambar-settings-done']?.focus(); }, focusCloseButton: function () { this.$refs['ambar-settings-close']?.focus(); } } }</script><script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/amasty.com\/","name":"Home"}}]}</script><script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"WebSite","url":"https:\/\/amasty.com\/","name":"Amasty","potentialAction":{"@type":"SearchAction","target":"https:\/\/amasty.com\/catalogsearch\/result\/?q={search_term_string}","query-input":"required name=search_term_string"}}</script><script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Organization","url":"https:\/\/amasty.com\/","name":"Amasty","logo":"https:\/\/cdn.amasty.com\/static\/version1700640514\/frontend\/Amasty\/AmastyTheme\/en_US\/images\/logo.svg","description":"Amasty is a leading provider of feature-rich Magento extensions, robust e-commerce solutions and all-round e-commerce IT services. An official Adobe partner, Amasty has been continuously growing its vast catalog of 300+ powerful Magento extensions since 2009. Amasty\u2019s Improved Layered Navigation has been installed on over 15.3K stores, solidifying its position as a leader in the Magento market....","contactPoint":[{"@type":"ContactPoint","telephone":"+1-347-897-9078","contactType":"technical support"},{"@type":"ContactPoint","telephone":"+1-347-897-9078","contactType":"customer service"}],"address":{"addressCountry":"Cyprus","postalCode":"2407","addressRegion":"Egkomi","addressLocality":"Nicosia","streetAddress":"73 Metochiou"},"sameAs":["https:\/\/www.facebook.com\/Amasty.Ltd\/","https:\/\/twitter.com\/AmastyTeam","https:\/\/www.instagram.com\/amastypeople\/","https:\/\/www.youtube.com\/user\/AmastyTeam","https:\/\/www.linkedin.com\/company\/amasty","https:\/\/www.pinterest.com\/amastybusiness\/"]}</script><script type="text/x-magento-init"> { "nav.navigation": { "amMenu": {} }, "[data-amtheme-js='form-minisearch']": { "amSearch": {} }, "[data-amtheme-js='backtotop-wrap']": { "backTop": {} } }</script><script type="text/x-magento-init"> { ".products-grid.grid, .products-list.list": { "amsiteBehaviorProductItem": {} }, "[data-role=vertical-screenshot-link], .faq-screenshot-thumb, .amblog-content img.size-full": { "amsiteOpenImageFancybox": {} }, "[btn-fancybox-popup]": { "amsiteOpenHtmlFancybox": {} }, ".swiper-container:not(.lazy-swiper)": { "amsiteMainSwiper": {} }, "[data-role=vertical-screenshots]": { "amsiteVerticalSwiper": {} }, "*": { "amsiteFishText": {} } }</script><script type="text/x-magento-init"> { ".mgz-block-content [data-role=tocart-form], #product_addtocart_form, #ajax-product_addtocart_form": { "amAjaxCart": { "actionUrl": "https://amasty.com/amasty_jettheme/ajax/addToCart/", "classes":{ "addToCartButtonDisable": "disabled -show-spinner" } } } }</script><script> var amsiteGlobalPriceFormat = {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true};</script><script> 'use strict'; window.addEventListener('DOMContentLoaded', () => { (function() { hyva.formValidation.addRule('required', (value, options, field, context) => { const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element, msg = 'This\u0020is\u0020a\u0020required\u0020field'; if (el.type === 'radio' || el.type === 'checkbox') { return (value === undefined || value.length === 0) ? msg : true; } el.setAttribute('required', ''); el.checkValidity(); return el.validity.valueMissing ? msg : true; }) hyva.formValidation.addRule('email', (value, options, field, context) => { const rule = /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i; if (value.length > 0 && !rule.test(value)) { return 'Please\u0020enter\u0020a\u0020valid\u0020email'; } return true; }) hyva.formValidation.addRule('minlength', (value, options, field, context) => { const n = Number(options) if (value.length > 0 && value.length < n) { return n === 1 ? hyva.strf('Please\u0020enter\u0020at\u0020least\u00201\u0020character.') : hyva.strf('This\u0020text\u0020length\u0020should\u0020be\u0020more\u0020than\u0020\u00250\u0020characters', options) } return true; }) hyva.formValidation.addRule('validate-not-only-special', (value, options, field, context) => { const test = /^[ \t[\]\\$&+,:;=?@#|'<>{}".^*()%!-]+$/.test(value); if (test) { return 'This\u0020field\u0020can\u0027t\u0020contain\u0020special\u0020characters\u0020only'; } return true; }) hyva.formValidation.addRule('validate-domain-url', (value, options, field, context) => { const test = value.length === 0 || /^((https?:\/\/)?(www\.)?((?!www\.)[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$)(:(\d+))?\/?/i.test(value); if (test) { return true; } return 'Please\u0020enter\u0020a\u0020valid\u0020domain.\u0020Ex.\u003A\u0020storename.com'; }) function createTextInputFrom(el) { const text = document.createElement('INPUT'); text.type = 'text'; text.value = el.value; return text; } })(); })</script><script> 'use strict'; (() => { document.querySelectorAll('[data-content-type="tab-item"]').forEach(tabItem => { tabItem.setAttribute('x-show', `tab === '${tabItem.id}'`); }); document.querySelectorAll('[data-content-type="tabs"]').forEach(tab => { const defaultActiveTab = parseInt(tab.dataset.activeTab) || 0; tab.querySelectorAll('.tab-header').forEach((tabHeader, index) => { const tabLink = tabHeader.querySelector('a'); const tabId = tabLink.getAttribute('href').replace('#', ''); tabHeader.setAttribute(':class', `{ 'active': tab === '${tabId}' }`); tabLink.setAttribute('x-on:click.prevent', `tab = '${tabId}'`); if (index === defaultActiveTab) { tab.setAttribute('x-data', `{ tab: '${tabId}' }`); } }); }); })();</script><script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Product","name":"Special Occasion Coupons for Magento 2","description":"Generate and send discount coupons based on birthdays, newsletter subscriptions, order placement and other events. Use custom email templates to draw customers\u2019 attention and build their loyalty.","image":"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/8b14a410c096e2fc1a81f19ab33fad4c\/s\/p\/special-occasion-coupons-for-magento-2_2x.png","offers":[{"@type":"Offer","priceCurrency":"USD","price":109,"availability":"https:\/\/schema.org\/InStock","itemCondition":"https:\/\/schema.org\/NewCondition","seller":{"@type":"Organization","name":"Amasty Store"},"url":"https:\/\/amasty.com\/special-occasion-coupons-for-magento-2.html","sku":"special-occasion-coupons-for-magento-2","mpn":"special-occasion-coupons-for-magento-2"}],"url":"https:\/\/amasty.com\/special-occasion-coupons-for-magento-2.html","aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"reviewCount":2},"review":[{"@type":"Review","author":{"@type":"Person","name":"Hugo Ribeiro"},"datePublished":"2023-07-18 16:23:00","name":" 10% more subscriptions after 1 month of using","reviewBody":"After using this module for 1 month, we got 10% more subscriptions. I highly recommend it to anyone seeking to incentivize newsletter or loyalty card sign-ups.","reviewRating":{"@type":"Rating","ratingValue":100,"bestRating":100}},{"@type":"Review","author":{"@type":"Person","name":"Romers"},"datePublished":"2016-12-20 21:00:00","name":"Thanks to Amasty for a new extension","reviewBody":"This product is a huge help to us. We have a big store with an endless customers\u2019 e-mails database. Despite the high standards and expectations, in general, we are totally satisfied with the results with this Amasty\u2019s extension. Thank you for your work!","reviewRating":{"@type":"Rating","ratingValue":100,"bestRating":100}}],"sku":"special-occasion-coupons-for-magento-2","mpn":"special-occasion-coupons-for-magento-2"}</script><script type="text/x-magento-init"> { "*": { "amsiteAsyncLoadCss": { "cssFileUrl": "https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/css/source/bundle-module/product-page/bundle-async-load.min.css" } } }</script><script> const AmAuthPopupReloadContent = function () { const customerMenuSelector = '\u0023customer\u002Dmenu\u0020\u007E\u0020nav'; return { contentUpdaters: [], initContentUpdaters() { window.addEventListener('amsl-register-content-updater', (event) => { event.stopPropagation(); if (typeof event.detail === 'function') { this.registerContentUpdater(event.detail); } }, true) }, reloadContent() { return Promise.all([ this.reloadHeader(), ...this.contentUpdaters.map(updater => updater()) ]).then(this.updateFormKey); }, registerContentUpdater(updater) { this.contentUpdaters.push(updater); }, async reloadHeader() { const response = await fetch( `${BASE_URL}amsociallogin_hyva\u002Fheader\u002Fupdate?isAjax=1`, { method: 'GET', headers: { 'Content-type': 'application/json' } } ); const result = await response.json(); const {customer_menu_html: customerMenuHtml} = result; const container = document.createElement('div'); container.innerHTML = customerMenuHtml; const currentMenu = document.querySelector(customerMenuSelector); const newMenu = container.querySelector(customerMenuSelector); if (currentMenu && newMenu) { currentMenu.replaceWith(newMenu); } }, updateFormKey() { const formKeyInputs = document.querySelectorAll('input[name="form_key"]'); formKeyInputs.forEach(input => input.value = hyva.getFormKey()); } } }</script><script> const AmAuthPopupRedirect = function () { const redirectTimeout = 4000; const redirectUrl = 'https://amasty.com/customer/account/'; return { processRedirect(forceRedirectUrl) { if (forceRedirectUrl) { setTimeout(() => { this.resetSessionCookie(); window.location.assign(forceRedirectUrl); }, redirectTimeout); return; } setTimeout(() => { this.resetSessionCookie(); window.location.assign(this._getRedirectUrl()); }, redirectTimeout); }, _getRedirectUrl() { const browserStorage = hyva.getBrowserStorage(); if (browserStorage) { const url = browserStorage.getItem('data_social_login_redirect') || redirectUrl; browserStorage.removeItem('data_social_login_redirect'); return url; } }, reloadCustomerData() { this.resetSessionCookie(); window.dispatchEvent(new CustomEvent("reload-customer-section-data")); }, resetSessionCookie() { hyva.setCookie('mage-cache-sessid', '', -1, true); }, reloadPage() { setTimeout(() => { this.resetSessionCookie(); window.location.reload(true) }, redirectTimeout) }, reloadViaAjax() { window.addEventListener('private-content-loaded', () => { this.reloadContent().then(() => { window.dispatchEvent( new CustomEvent('amsl-content-updated') ); }).catch( (error) => { console.error(error); this.reloadPage(); } ); }, {once: true}); this.reloadCustomerData(); window.dispatchEvent( new CustomEvent('amsl-popup-ajax-login-success') ); } } }</script><script> const AmAuthPopupNotification = function () { const modalName = 'amsl\u002Dpopup\u002Dnotification'; return { ...AmAuthPopupModal(modalName), notification: '', initialize() { this.initModalSettings(); }, showNotification(messages) { if (!messages) { return; } this.notification = Array.isArray(messages) ? messages.join('<br>') : messages; window.dispatchEvent( new CustomEvent('amsl-hide-popup') ); this.show(modalName); } } }</script><script> const AmAuthPopupModal = function (modalName) { const canCloseByOverlayClick = true; return { ...hyva.modal(), animationDuration: 500, initModalSettings() { if (!canCloseByOverlayClick) { this.restrictOverlayClick(); } }, restrictOverlayClick() { document.addEventListener('click', (event) => { const modal = this.$refs[modalName]; const isVisible = this.opened[modalName]; if (isVisible && !modal.contains(event.target) && !modal.hasAttribute('x-no-overlay')) { event.stopPropagation(); } }, {capture: true}); } } }</script><script> function initCustomerLoginForm() { return { errors: 0, customer_form_login_popup_showPassword: false, displayErrorMessage: false, errorMessages: [], setErrorMessages(messages) { this.errorMessages = [messages] this.displayErrorMessage = this.errorMessages.length }, submitForm() { this.validate() .then(() => { const $form = document.querySelector('#customer-login-form'); if (this.errors === 0) { $form.submit(); } }) .catch((invalid) => { if (invalid.length > 0) { invalid[0].focus(); } }); } } }</script><script> function AmSocialLogin() { return { socialErrorMessage: '', isPopupEnabled: '1', initializeSocialLogin() { this.initContentUpdaters(); }, socialLoginClick(event) { if (this.messageEventListener) { window.removeEventListener('message', this.messageEventListener); } this.messageEventListener = this.onMessageEvent.bind(this); window.addEventListener('message', this.messageEventListener); if (this.isPopupEnabled) { window.open( event.currentTarget.href + '&isAjax=true', event.currentTarget.title, this.getPopupParams() ); } else { window.location.assign(event.currentTarget.href); } event.stopPropagation(); event.preventDefault(); return false; }, onSocialResponse(data) { const isSuccessfulResult = data.result === 1; if (isSuccessfulResult) { window.dispatchEvent( new CustomEvent( 'amsl-popup-show-notification', { detail: data.messages } ) ); if (data.redirect_data && data.redirect_data.url) { this.processRedirect(data.redirect_data.url); } else { this.processRedirect(); } } else { this.socialErrorMessage = data.messages.pop(); setTimeout(() => { this.socialErrorMessage = ''; }, 5000); if (data?.redirect_data?.redirectWithError) { this.processRedirect(); } } }, onMessageEvent(event) { if (event.data['redirect_data']) { this.onSocialResponse(event.data); } }, getPopupParams(w, h, l, t) { let screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft, screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop, outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.body.clientWidth, outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : (document.body.clientHeight - 22), width = w ? w : 500, height = h ? h : 420, left = l ? l : parseInt(screenX + ((outerWidth - width) / 2), 10), top = t ? t : parseInt(screenY + ((outerHeight - height) / 2.5), 10); return ( 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top ); }, ...AmAuthPopupRedirect(), ...AmAuthPopupReloadContent() } }</script><script> function initForm() { return { errors: 0, customer_form_register_popup_showPassword: false, customer_form_register_popup_showPasswordConfirm: false, submitForm() { this.validate() .then(() => { const $form = document.querySelector('#accountcreate'); if (this.errors === 0) { $form.submit(); } }) .catch((invalid) => { if (invalid.length > 0) { invalid[0].focus(); } }); }, } }</script><script> function AmSocialLogin() { return { socialErrorMessage: '', isPopupEnabled: '1', initializeSocialLogin() { this.initContentUpdaters(); }, socialLoginClick(event) { if (this.messageEventListener) { window.removeEventListener('message', this.messageEventListener); } this.messageEventListener = this.onMessageEvent.bind(this); window.addEventListener('message', this.messageEventListener); if (this.isPopupEnabled) { window.open( event.currentTarget.href + '&isAjax=true', event.currentTarget.title, this.getPopupParams() ); } else { window.location.assign(event.currentTarget.href); } event.stopPropagation(); event.preventDefault(); return false; }, onSocialResponse(data) { const isSuccessfulResult = data.result === 1; if (isSuccessfulResult) { window.dispatchEvent( new CustomEvent( 'amsl-popup-show-notification', { detail: data.messages } ) ); if (data.redirect_data && data.redirect_data.url) { this.processRedirect(data.redirect_data.url); } else { this.processRedirect(); } } else { this.socialErrorMessage = data.messages.pop(); setTimeout(() => { this.socialErrorMessage = ''; }, 5000); if (data?.redirect_data?.redirectWithError) { this.processRedirect(); } } }, onMessageEvent(event) { if (event.data['redirect_data']) { this.onSocialResponse(event.data); } }, getPopupParams(w, h, l, t) { let screenX = typeof window.screenX !== 'undefined' ? window.screenX : window.screenLeft, screenY = typeof window.screenY !== 'undefined' ? window.screenY : window.screenTop, outerWidth = typeof window.outerWidth !== 'undefined' ? window.outerWidth : document.body.clientWidth, outerHeight = typeof window.outerHeight !== 'undefined' ? window.outerHeight : (document.body.clientHeight - 22), width = w ? w : 500, height = h ? h : 420, left = l ? l : parseInt(screenX + ((outerWidth - width) / 2), 10), top = t ? t : parseInt(screenY + ((outerHeight - height) / 2.5), 10); return ( 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top ); }, ...AmAuthPopupRedirect(), ...AmAuthPopupReloadContent() } }</script><script> function initPasswordForm() { return { errors: 0, submitForm() { this.validate() .then(() => { const $form = document.querySelector('#user_forgotpassword'); if (this.errors === 0) { $form.submit(); } }) .catch((invalid) => { if (invalid.length > 0) { invalid[0].focus(); } }); } } }</script><script> const AmAuthPopup = function () { const TAB_ID_LOGIN = 'amsl\u002Dlogin'; const TAB_ID_REGISTER = 'amsl\u002Dregister'; const TAB_ID_FORGOT = 'amsl\u002Dforgot'; const IS_KNOWN_CUSTOMER = false; const modalName = 'social\u002Dlogin\u002Dpopup'; let componentInitialized = false; const reCaptchaStatusBySection = { login: '', register: '', forgotPassword: '', } const reCaptchaStatusFor = section => reCaptchaStatusBySection[section]; return { isGuestCheckoutAllowed: true, isAccountForgotPasswordPage: false, activeTab: TAB_ID_LOGIN, tabs: [TAB_ID_LOGIN, TAB_ID_REGISTER], socialIconsExpansionState: { [TAB_ID_LOGIN]: false, [TAB_ID_REGISTER]: false }, isLoading: false, modalName, isLogged: false, socialIconsExpanded: false, initializeAuthPopup(privateData) { this.browserStorage = hyva.getBrowserStorage(); if (privateData?.data?.customer?.firstname && !IS_KNOWN_CUSTOMER) { componentInitialized = false; this.reloadExpiredCustomerData(); return; } if (componentInitialized) { return; } componentInitialized = true; const origShow = this.show; const origHide = this.hide; this.show = (name, event, activeTabName) => { origShow.call(this, name, event); this.activeTab = activeTabName || TAB_ID_LOGIN; } this.hide = (...args) => { origHide.call(this, args); setTimeout(() => { this.clearForms(); this.clearFormMessages(); }, this.animationDuration + 1) } this.initModalSettings(); this.bindLinksEvents(privateData); this.initContentUpdaters(); if (!this.isGuestCheckoutAllowed) { this.bindAuthenticationEvent(); } }, _setCustomRedirectUrl(elem) { const redirectUrl = elem.getAttribute('data-social-login-redirect'); if (this.browserStorage) { this.browserStorage.removeItem('data_social_login_redirect'); } if (redirectUrl && this.browserStorage) { this.browserStorage.setItem('data_social_login_redirect', redirectUrl); } }, bindAuthenticationEvent() { window.addEventListener('toggle-authentication', (event) => { event.stopPropagation(); if (!this.isLoggedIn()) { this.show( this.modalName, event ); } else { window.location.assign(event.detail.url) } }, true) }, bindLinksEvents(privateData) { if (!this.isLoggedIn(privateData)) { this.bindOpeningEvents(); this.bindForgotLinkEvent(); requestAnimationFrame(() => { this.processForms(); }) } else { this.initLogout(); } }, bindOpeningEvents() { const accountLinks = document.querySelectorAll(`nav.am-authorization-link a[href^="${BASE_URL}customer/account"], .amsite-changelog-tab a[href^="${BASE_URL}customer/account"]`) || []; accountLinks.forEach(elem => { const isRegisterLink = /create\/?(\?.+)?(\#.+)?$/.test(elem.href); elem.removeAttribute('onclick'); elem.setAttribute('aria-haspopup', 'dialog'); elem.addEventListener('click', (event) => { this._setCustomRedirectUrl(elem); event.preventDefault(); this.show( this.modalName, event, isRegisterLink ? TAB_ID_REGISTER : TAB_ID_LOGIN ); }) }); if (reCaptchaStatusFor('register')) { this.moveRecaptchaElement('.recaptcha-create-wrapper'); } if (reCaptchaStatusFor('login')) { this.moveRecaptchaElement('.recaptcha-login-wrapper'); } }, bindForgotLinkEvent() { const modalContainer = this.$el || this.$root; const forgotLinks = modalContainer.querySelectorAll( `a[href^="${BASE_URL}customer/account/forgotpassword"]` ) || []; forgotLinks.forEach((element) => { element.addEventListener('click', (event) => { event.preventDefault(); element.setAttribute('aria-haspopup', 'dialog'); this.activeTab = TAB_ID_FORGOT; }) }) if (reCaptchaStatusFor('forgotPassword') && !this.isAccountForgotPasswordPage) { this.moveRecaptchaElement('.recaptcha-forgot-wrapper'); } }, isLoggedIn(privateData) { try { privateData = privateData?.data || JSON.parse(hyva.getBrowserStorage()['mage-cache-storage']); return this.isLogged = !!(privateData?.customer?.firstname); } catch { } return this.isLogged = false; }, showOnExternalEvent(event) { const eventData = event.detail || {}; const message = eventData?.message; const tabName = eventData?.tabName || TAB_ID_LOGIN; this.show(this.modalName, event, tabName); if (message) { this.setFormMessages(tabName, [message]); } }, canShowAllSocialIcons() { return this.socialIconsExpansionState[this.activeTab]; }, showAllSocialIcons() { this.socialIconsExpanded = true; this.socialIconsExpansionState[this.activeTab] = true; }, setLoading(isLoading) { const formButtons = this.$refs[this.modalName].querySelectorAll('[type="submit"]'); formButtons.forEach(button => { if (isLoading) { button.setAttribute('disabled', 'disabled') } else { button.removeAttribute('disabled'); } }) this.isLoading = isLoading; }, reloadExpiredCustomerData() { const sections = ['mage-cache-storage', 'private_content_version', 'mage-cache-timeout']; sections.forEach(section => localStorage.removeItem(section)); hyva.setCookie('mage-cache-sessid', '', -1); window.dispatchEvent(new CustomEvent("reload-customer-section-data")); }, moveRecaptchaElement(element) { const captchaElement = document.querySelector(element); if (!captchaElement) { return; } const container = captchaElement.closest('.amsl-form').querySelector('.actions-toolbar'); container.prepend(captchaElement); }, onKeypress(event) { const activeTabIndex = this.tabs.indexOf(this.activeTab); if (activeTabIndex < 0 || event.code === 'Tab') { return; } switch (event.code) { case 'Enter': case 'Space': this.activeTab = event.target.id.replace('tab-', ''); break; case 'ArrowRight': this.activeTab = this.tabs[(activeTabIndex + 1) % this.tabs.length] break; case 'ArrowLeft': this.activeTab = this.tabs[(activeTabIndex + this.tabs.length - 1) % this.tabs.length] break; case 'End': this.activeTab = this.tabs[this.tabs.length - 1] break; case 'Home': this.activeTab = this.tabs[0] break; } document.getElementById('tab-' + this.activeTab).focus(); }, ...AmAuthPopupModal(modalName), ...AmAuthPopupForms(), ...AmAuthPopupRedirect(), ...AmAuthPopupReloadContent(), ...AmAuthPopupLogout(), ...(typeof AmSocialLogin === 'function' ? AmSocialLogin() : {}) } }</script><script> (function () { const resetPasswordForms = document.querySelectorAll('form[action*="/forgotpasswordpost"]'); resetPasswordForms.forEach(form => { form.classList.add('form','password', 'forget'); }); })(); const AmAuthPopupForms = function () { const TAB_ID_LOGIN = 'amsl\u002Dlogin'; const TAB_ID_REGISTER = 'amsl\u002Dregister'; const TAB_ID_FORGOT = 'amsl\u002Dforgot'; const formsConfig = JSON.parse(`\u007B\u0022amsl\u002Dlogin\u0022\u003A\u007B\u0022formType\u0022\u003A\u0022amsl\u002Dlogin\u0022,\u0022formId\u0022\u003A\u0022customer\u002Dlogin\u002Dform\u0022,\u0022successMessage\u0022\u003A\u0022You\u0020have\u0020successfully\u0020logged\u0020in\u0022,\u0022submitUrlReplacement\u0022\u003A\u0022amsociallogin\u005C\u002Faccount\u0022\u007D,\u0022amsl\u002Dregister\u0022\u003A\u007B\u0022formType\u0022\u003A\u0022amsl\u002Dregister\u0022,\u0022formId\u0022\u003A\u0022accountcreate\u0022,\u0022successMessage\u0022\u003A\u0022Thank\u0020you\u0020for\u0020registering\u0020with\u0020us\u0022,\u0022submitUrlReplacement\u0022\u003A\u0022amsociallogin\u005C\u002Faccount\u0022\u007D,\u0022amsl\u002Dforgot\u0022\u003A\u007B\u0022formType\u0022\u003A\u0022amsl\u002Dforgot\u0022,\u0022formId\u0022\u003A\u0022user_forgotpassword\u0022,\u0022customSubmitUrl\u0022\u003A\u0022\u005C\u002Fcustomer\u005C\u002Faccount\u005C\u002Fforgotpasswordpost\u0022\u007D\u007D`); return { formMessages: new Map(), processForms() { Object.values(formsConfig).forEach((formOptions) => { this.processForm(formOptions); }) }, processForm(formOptions) { const { formId } = formOptions; const formElement = document.querySelector(`#social-login-popup #${formId}`); if (formElement) { this.bindFormSubmit(formElement, formOptions); } }, bindFormSubmit(formElement, formOptions) { const { formType, successMessage, submitUrlReplacement, customSubmitUrl } = formOptions; let submitUrl = customSubmitUrl || formElement.action; if (submitUrlReplacement) { submitUrl = submitUrl.replace('customer/account', submitUrlReplacement); } formElement.submit = () => { this.clearFormMessages(); this.setLoading(true); this.browserStorage = hyva.getBrowserStorage(); this.formAjaxSubmit( formElement, submitUrl ).then((result) => { if (result.errors) { this.setFormMessages(formType, result.errors); return; } const notification = result.success || successMessage; this.hide(this.modalName); if (notification) { window.dispatchEvent( new CustomEvent( 'amsl-popup-show-notification', { detail: notification } ) ); } if (!submitUrl.includes('forgotpasswordpost')) { this.processRedirect(); } else { setTimeout(() => { document.querySelector('[x-data="AmAuthPopupNotification()"] > .am-overlay-popup').style.display = 'none'; }, 4000) } }).finally(() => { this.setLoading(false); }) } }, async formAjaxSubmit(form, url) { let errors = null; let success = null; try { const response = await fetch(url, { method: 'POST', body: new FormData(form) }) const messages = this.extractMageMessages(); const errorMessages = messages.filter(({type}) => type === 'error'); const successMessages = messages.filter(({type}) => type === 'success'); if (errorMessages.length) { errors = errorMessages.map(({text}) => text); } if (successMessages.length) { success = successMessages.pop().text || ''; } if (errors && Array.isArray(errors) && this.detectSpecialBehaviour(response, errors)) { errors = null; } } catch (error) { console.error(error); errors = ['Sorry,\u0020something\u0020went\u0020wrong.\u0020Please\u0020try\u0020again\u0020later.']; } return { errors, success }; }, extractMageMessages() { const messagesCookie = hyva.getCookie('mage-messages'); const messages = messagesCookie ? JSON.parse(decodeURIComponent(messagesCookie)) : []; hyva.setCookie('mage-messages','', -1, true); return messages; }, clearFormMessages() { this.formMessages = new Map(); }, setFormMessages(formType, messages) { const formMessages = new Map(this.formMessages); formMessages.set(formType, messages); this.formMessages = formMessages; }, clearForms() { const forms = this.$refs[this.modalName].querySelectorAll('form') || []; forms.forEach((form) => form.reset()); }, detectSpecialBehaviour(response, errors) { const errorPattern = 'You have an active'; const ulrPattern = 'amasty_recurring/customer/subscriptions/'; const cookieLifeTime = 31536000; if (errors[0].includes(errorPattern) && response.url.includes(ulrPattern)) { this.browserStorage.setItem('data_social_login_redirect', response.url); window.hyva.setCookie('mage-messages', `[{"type":"error","text":"${errors[0]}"}]`, cookieLifeTime, true); return true; } return false; } } }</script><script> const AmAuthPopupLogout = function () { return { initLogout() { const logoutLinks = document.querySelectorAll(`a[href*="customer/account/logout"]`) || []; logoutLinks.forEach(elem => { elem.addEventListener('click', (event) => { event.preventDefault(); this.sendLogOut() }) }) }, sendLogOut() { fetch(BASE_URL + "customer/account/logout", { method: 'GET', credentials: "include" }).then(response => { window.dispatchEvent( new CustomEvent( 'amsl-popup-show-notification', { detail: 'You\u0020have\u0020signed\u0020out\u0020and\u0020will\u0020go\u0020to\u0020our\u0020homepage\u0020in\u00205\u0020seconds' } ) ); this.processRedirect(this.isInAccountSection() ? BASE_URL : ''); }) .catch(error => { console.error(error); this.processRedirect(); }) }, isInAccountSection() { return document.querySelector('body').classList.contains('account'); } } }</script><script> const AmAuthPopupReviewForm = function () { const reloadUrl = 'https\u003A\u002F\u002Famasty.com\u002Famsociallogin_hyva\u002Fajax\u002Freviewform\u002Fid\u002F686\u002F'; const reviewFormBlockSelector = '\u0023review\u002Dform'; function cloneScriptNode(node) { const scriptClone = document.createElement('script') scriptClone.text = node.innerHTML; Array.from(node.attributes).forEach(attribute => { scriptClone.setAttribute(attribute.name, attribute.value); }); return scriptClone; } function reExecuteScripts(node) { node.querySelectorAll('script').forEach( (scriptNode) => node.replaceWith(cloneScriptNode(node)) ); } return { initializeReviewForm() { window.dispatchEvent( new CustomEvent( 'amsl-register-content-updater', { detail: this.reloadReviewForm.bind(this) } ) ) }, async reloadReviewForm() { try { const response = await fetch( reloadUrl, { method: 'GET', headers: { 'Content-Type': 'application/json' } } ); const result = await response.json(); if (result && result.form) { const bufferElement = document.createElement('div'); bufferElement.innerHTML = result.form; const newElement = bufferElement.querySelector(reviewFormBlockSelector); const existingElement = document.querySelector(reviewFormBlockSelector); reExecuteScripts(newElement); existingElement.replaceWith(newElement); } } catch (error) { console.error('Failed to update review form'); console.error(error); } } } }</script><script> (() => { 'use strict'; const gridSizes = { options: { elementSelector: '[data-mage-init*="components/grid-sizes"]', childrenInLine: '[class*="amtab-cell"], [class*="amtab-title"]', childrenInRow: '[class*="amtab-table"], [class*="amtab-head"]', cellSelect: '.amtab-cell', lineSelect: '.amtab-table-line', hoverlineClass: '-amtab-hoverline', activeClass: '-active', wrapperClass: '.amtab-grid-wrapper', tabWrapperClass: '.tab-content' }, targetElem: {}, initGridSizes: function () { let self = this; let elements = document.querySelectorAll(this.options.elementSelector); if (!elements.length) { return; } this._loadGridCss(); for (let element of elements) { let lines = element.querySelectorAll(this.options.lineSelect); for (let line of lines) { self._initClickOnLine(line, element); } this._setTabsGridPaddings(element); } }, _initClickOnLine(line, element) { let cells = line.querySelectorAll(this.options.cellSelect); for (let cell of cells) { cell.addEventListener('click', (event) => { this._gridHighlight(event, element) }); } }, _gridHighlight: function (e, element) { let self = this; self._clearTable(element); e.target.classList.add(self.options.activeClass); self.targetElem = { node: e.target, position: null }; self._highlightRow(element); self._highlightColumn(element); }, _highlightRow: function () { let self = this, targetLine = self.targetElem.node.closest(self.options.lineSelect); targetLine.classList.add(self.options.activeClass); let lineChildren = targetLine.querySelectorAll(self.options.childrenInLine); for (let [index, cell] of lineChildren.entries()) { if (cell.classList.contains(self.options.activeClass)) { self.targetElem.position = index; break; } cell.classList.add(self.options.hoverlineClass); } }, _highlightColumn: function (element) { let self = this; let childrenInRow = element.querySelectorAll(self.options.childrenInRow); for (let elem of childrenInRow) { if (elem.classList.contains(self.options.activeClass)) { break; } let cells = elem.querySelectorAll(self.options.childrenInLine); for (let [index, cell] of cells.entries()) { if (index === parseInt(self.targetElem.position)) { cell.classList.add(self.options.hoverlineClass); } } } }, _clearTable: function (element) { let self = this; element.querySelectorAll('.' + self.options.hoverlineClass).forEach((el) => { el.classList.remove(self.options.hoverlineClass) }); element.querySelectorAll('.' + self.options.activeClass).forEach((el) => { el.classList.remove(self.options.activeClass) }); }, _setTabsGridPaddings(element) { const gridWrapper = element.closest(this.options.wrapperClass); const tabWrapper = gridWrapper.closest(this.options.tabWrapperClass); if (gridWrapper.classList.contains('-small')) { tabWrapper.classList.add('md:pb-36'); } }, _loadGridCss() { const styles = document.createElement('link'); styles.rel = 'stylesheet'; styles.href = 'https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/Amasty_CustomTabsHyva/css/grids.min.css'; document.head.appendChild(styles); } } document.addEventListener('DOMContentLoaded', () => { gridSizes.initGridSizes(); }); })()</script><script> 'use strict'; (() => { const allAnchorLinks = document.querySelectorAll('[data-amsite-js="scroll-open-tab"]'); const allDeprecatedAnchorLinks = document.querySelectorAll('[observed-link-tab]'); const isMobile = AmsiteUtils().isMobile('(max-width: 769px)'); [...allAnchorLinks, ...allDeprecatedAnchorLinks].forEach(anchorLink => { anchorLink.addEventListener('click', (event) => { event.preventDefault(); const tabDestination = anchorLink.getAttribute('data-tab-destination') || anchorLink.getAttribute('href').replace('#', ''); const tab = document.querySelector(`[data-tab="${tabDestination}"]`); const indent = isMobile ? 140 : 100; if (tab) { tab.click(); window.scrollTo({ top: tab.getBoundingClientRect().top + window.scrollY - indent, behavior: 'smooth' }); } }); }); })()</script><script> (function () { 'use strict'; /** * Config to determine which element is responsible for the form submission * * @type {[{elementSelector: undefined|string, submitAttribute: string}]} */ const formWrapperConfig = [{"elementSelector":null,"submitAttribute":"submit"},{"elementSelector":"[type=\"submit\"]","submitAttribute":"click"}]; const initWrapFormSubmit = function () { document.addEventListener("DOMContentLoaded", function () { wrapFormSubmit(window.amRecaptchaModel?.formsToProtect || ''); }); }; /** * Replace protected forms submit with amRecaptchaModel.execute($event) method. * Call original submit on amrecaptcha-callback event after successful captcha validation. * * @return {void} */ const wrapFormSubmit = function (formsSelector) { if (formsSelector.length === 0) { return; } document.querySelectorAll(formsSelector)?.forEach(formElement => { if (!formElement) { return; } const { elementToWrap, attributeNameToWrap } = resolveElementWrapping(formElement); if (!elementToWrap || !attributeNameToWrap) { return; } setElementAttributes(formElement, elementToWrap, attributeNameToWrap); }); }; /** * Call wrapFormSubmit on event to add form to amRecaptchaModel protection - for forms which are created dynamically */ document.addEventListener("add-form-to-amrecaptcha-protection", (event) => { wrapFormSubmit(event.detail); }); /** * Find submit event and DOM element that has this event using formWrapperConfig. * * @param {HTMLElement} formElement * @return {{elementToWrap: undefined|string, attributeNameToWrap: undefined|string}} */ const resolveElementWrapping = function (formElement) { let result = { elementToWrap: undefined, attributeNameToWrap: undefined }; formWrapperConfig.forEach(({ elementSelector, submitAttribute }) => { const elementToWrap = !!elementSelector ? formElement.querySelector(elementSelector) : formElement; if (!elementToWrap) { return; } const attributeNameToWrap = elementToWrap.getAttributeNames().find( (elementAttribute) => { /** @type {string[]} */ const submitAttributeVariations = ['@', 'x-on:'].map(variation => variation + submitAttribute); return submitAttributeVariations.some( (submitAttributeVariation) => elementAttribute.startsWith(submitAttributeVariation) ) } ); if (!attributeNameToWrap) { return; } result.elementToWrap = elementToWrap; result.attributeNameToWrap = attributeNameToWrap; }); return result; } /** * Set attribute to wrap original submit, add eventListeners for captcha callbacks * * @param {HTMLElement} formElement * @param {HTMLElement} elementToWrap * @param {string} attributeNameToWrap */ const setElementAttributes = function (formElement, elementToWrap, attributeNameToWrap) { const originalSubmit = elementToWrap.getAttribute(attributeNameToWrap); elementToWrap.removeAttribute(attributeNameToWrap); /** * To properly set submit attribute - we need to replace '@' with 'x-on:' * and add preventDefault behaviour */ elementToWrap.setAttribute( attributeNameToWrap.replace(/^@/, 'x-on:').replace(/.prevent$/, '') + '.prevent', 'amRecaptchaModel.execute($event)' ); elementToWrap.setAttribute( 'x-on:amrecaptcha-executable-callback', originalSubmit ); } initWrapFormSubmit(); })(window.amRecaptchaModel = window.amRecaptchaModel || {});</script><script>window.amlazy = function() {if (typeof window.amlazycallback !== "undefined") {setTimeout(window.amlazycallback, 500);setTimeout(window.amlazycallback, 1500);}}</script><script> var yall=function(){"use strict";return function(e){var t=(e=e||{}).lazyClass||"lazy",n=e.lazyBackgroundClass||"lazy-bg",o="idleLoadTimeout"in e?e.idleLoadTimeout:200,r=e.observeChanges||!1,i=e.events||{},a=e.noPolyfill||!1,s=window,c="requestIdleCallback",l="IntersectionObserver",u=l in s&&l+"Entry"in s,d=/baidu|(?:google|bing|yandex|duckduck)bot/i.test(navigator.userAgent),v=["srcset","src","poster"],f=[],b=function(e,o){return f.slice.call((o||document).querySelectorAll(e||"img[data-src],video."+t+",iframe."+t+", ."+n))},g=function(t){var o=t.parentNode;"PICTURE"==o.nodeName&&h(b("source",o),m),"VIDEO"==t.nodeName&&h(b("source",t),m),m(t);var r=t.classList;r.contains(n)&&(r.remove(n),r.add(e.lazyBackgroundLoaded||"lazy-bg-loaded"))},y=function(e){for(var t in i)e.addEventListener(t,i[t].listener||i[t],i[t].options||void 0)},m=function(e){for(var n in v)if(v[n]in e.dataset){e.setAttribute(v[n],e.dataset[v[n]]);e.classList.add("lazy-loaded");var o=e.parentNode;"SOURCE"===e.nodeName&&o.autoplay&&(o.load(),/Trident/.test(navigator.userAgent)&&o.play(),o.classList.remove(t)),e.classList.remove(t)}},h=function(e,t){for(var n=0;n<e.length;n++)s[l]&&t instanceof s[l]?t.observe(e[n]):t(e[n])},p=b();if(h(p,y),u&&!d){var L=new s[l](function(e){h(e,function(e){if(e.isIntersecting||e.intersectionRatio){var t=e.target;c in s&&o?s[c](function(){g(t)},{timeout:o}):g(t),L.unobserve(t),(p=p.filter(function(e){return e!=t})).length||r||L.disconnect()}})},{rootMargin:("threshold"in e?e.threshold:200)+"px 0%"});h(p,L),r&&h(b(e.observeRootSelector||"body"),function(t){new MutationObserver(function(){h(b(),function(e){p.indexOf(e)<0&&(p.push(e),y(e),u&&!d?L.observe(e):(a||d)&&h(p,g))})}).observe(t,e.mutationObserverOptions||{childList:!0,subtree:!0})})}else(a||d)&&h(p,g)}}(); window.amlazycallback = function () { yall() }; yall({ events: { load: function (event) { if (!event.target.classList.contains("lazy") && event.target.nodeName == "IMG") { event.target.classList.add("lazy-loaded"); } } } }); </script><noscript id="deferred-css"><link rel="stylesheet" type="text/css" media="print" href="https://cdn.amasty.com/static/version1740558685/frontend/Amasty/AmTheme/en_US/css/print.min.css" /><link rel="stylesheet" type="text/css" media="all" href="https://cdn.amasty.com/static/version1740558685/_cache/merged/fonts_ea0ed758deb0843f830f0e98146097db.min.css" /></noscript><script>var loadDeferredStyles = function() {var addStylesNode = document.getElementById("deferred-css");var replacement = document.createElement("div");replacement.innerHTML = addStylesNode.textContent;document.body.appendChild(replacement);addStylesNode.parentElement.removeChild(addStylesNode);};window.addEventListener('load', loadDeferredStyles);</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10