CINXE.COM
Magento 2 Extensions | Best Magento Premium Plugins Store | Hyva-compatible Magento Modules | Magento 2 Online Commerce Webshop | Magento Add On Shop by Amasty
<!doctype html><html lang="en"><head prefix="og: http://ogp.me/ns# category: http://ogp.me/ns/category#"> <meta charset="utf-8"/> <meta name="title" content="Magento 2 Extensions | Best Magento Premium Plugins Store | Hyva-compatible Magento Modules | Magento 2 Online Commerce Webshop | Magento Add On Shop by Amasty"/> <meta name="description" content="Need more powerful and Hyva-compatible functionality for your Magento 2 store? Check sought-after Magento 2 extensions here – both paid and free. Amasty is always among the first to provide you with new modules to buy, magento 2 plugins and features for Magento 2.3+!"/> <meta name="robots" content="INDEX,FOLLOW"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="format-detection" content="telephone=no"/> <title>Magento 2 Extensions | Best Magento Premium Plugins Store | Hyva-compatible Magento Modules | Magento 2 Online Commerce Webshop | Magento Add On Shop by Amasty</title> <link rel="stylesheet" type="text/css" media="all" href="https://cdn.amasty.com/static/version1739349122/_cache/merged/44a5dd2ba5fab4863facc82d1919a5f3.min.css" /> <link rel="stylesheet" type="text/css" media="screen and (min-width: 320px)" href="https://cdn.amasty.com/static/version1739349122/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/version1739349122/frontend/Amasty/AmTheme/en_US/css/source/bundle-module/category-page/category-page-bundle-l.min.css" /> <link rel="canonical" href="https://amasty.com/magento-2-extensions.html" /> <link rel="preload" as="font" type="font/woff2" crossorigin="anonymous" href="https://cdn.amasty.com/static/version1739349122/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/version1739349122/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/version1739349122/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/version1739349122/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> <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%}</style><link rel="next" href="https://amasty.com/magento-2-extensions.html?p=2" /> </head><body data-container="body" data-mage-init='{"loaderAjax": {}, "loader": { "icon": "https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/images/loader-2.gif"}}' id="html-body" ontouchstart="() => {}" class="amasty-jet-theme amsite-scroll-ajax-body page-with-filter amasty-mega-menu page-products categorypath-magento-2-extensions category-magento-2-extensions catalog-category-view page-layout-2columns-left"> <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/version1739349122/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 search 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 are you looking for?" 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 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 && !noResultsFound && 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_67bea95d68b3f(), 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/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva 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_67bea95d68d50(), 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/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva 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 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 search 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 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 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 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 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 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 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 2 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 Theme 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 Checkout 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 & Search">Navigation & 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 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 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 & Media">Images & 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 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 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 Magento 2 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 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 Product 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 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 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 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 & Marketing">Sales & 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 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 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 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 Development 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 Development 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 Optimization 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 Maintenance 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 Upgrade 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 Integration 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 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 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 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 Testing 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 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 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 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 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: {"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":700,"mobile_font":700,"elems":[{"show_mobile_content":0,"mobile_content":"<div class=\"ammenu-view-all-mobile-link\">\r\n <a class=\"ammenu-link view-all\"\r\n href=\"\/magento-2-extensions.html\"\r\n aria-label=\"Go to All Magento 2 Extensions\"\r\n title=\"Go to All Magento 2 Extensions\"\r\n role=\"link\"\r\n tabindex=\"0\"\r\n >\r\n All Magento 2 Extensions\r\n <\/a>\r\n<\/div>\r\n\r\n <div class=\"ammenu-widget-wrapper block widget mega-menu-products-list\" data-amsite-js=\"top-product-widget\"> <div class=\"block-title\">Popular right now<\/div> <div class=\"block-content\"><ul class=\"widget-product-items\"> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/cookie-consent-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Cookie Consent (GDPR)\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/c\/o\/cookie-consent-for-magento-2_6253b4c79f9ab.png\" alt=\"Cookie Consent (GDPR) for Magento 2\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Cookie Consent (GDPR)<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Improved Layered Navigation\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/m\/improved-layered-navigation-for-magento-2_5.png\" alt=\"Improved Layered Navigation for Magento 2\"\/><\/span><\/span> <div class=\"amasty-label-container amasty-label-container-13-506-cat amasty-label-for-506\" 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\":\"506\",\"label\":13,\"margin\":7,\"alignment\":0,\"order\":5,\"redirect_url\":\"\",\"tooltip\":{\"backgroundColor\":\"\",\"color\":\"\",\"status\":1,\"content\":\"\"}}, \"productId\": \"506\", \"selector\": \".amasty-label-container-13-506-cat\" }}'><div class=\"amlabel-text\"><\/div> <img id=\"amasty-label-image-13-506-cat\" class=\"amasty-label-image\" src=\"https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\" style=\"opacity: 1 !important;vertical-align: top;\" title=\"Improved Layered Navigation for Magento 2\" alt=\"Improved Layered Navigation for Magento 2\" ><\/div> <div class=\"product-item-name\"><span class=\"ammenu-text\">Improved Layered Navigation<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/google-tag-manager-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Google Analytics 4 with GTM Support\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon-google-tag-manager-for-magento-2.png\" alt=\"Google Analytics 4 with GTM Support for Magento 2\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Google Analytics 4 with GTM Support<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <\/ul><\/div> <a href=\"\/featured-extensions-for-magento-2.html\" class=\"block-link-below\" tabindex=\"0\" title=\"View All BestSellers\">View All BestSellers<\/a> <\/div>\r\n\r\n\r\n<div class=\"ammenu-m2-dropdown-banners\" data-amsite-js=\"ammenu-m2-dropdown-banners\">\r\n <a class=\"amsite-menu-picker-btn action secondary\" href=\"\/latest-updates-magento-2-extensions.html?utm_source=menu&utm_medium=widget&utm_campaign=recent_updates\" title=\"Go to this page\">\r\n Check Module Updates\r\n <\/a>\r\n <img src=\"https:\/\/cdn.amasty.com\/media\/amsite\/adobe-partner-badge-2x.png\" alt=\"Adobe partner logo\" width=\"180\" \r\n height=\"46\">\r\n<\/div> ","type":{"value":1,"label":"vertical"},"submenu_type":false,"width":0,"width_value":0,"column_count":3,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Hyva Theme Extensions","is_category":true,"id":"category-node-83","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/hyva-theme-extensions-for-magento-2.html","current":false,"items_count":162,"top_products":[{"url":"https:\/\/amasty.com\/custom-form-for-magento-2.html","name":"Custom Form"},{"url":"https:\/\/amasty.com\/social-login-for-magento-2.html","name":"Social Login"},{"url":"https:\/\/amasty.com\/google-tag-manager-for-magento-2.html","name":"Google Analytics 4 with GTM"}],"label":{"label":"HOT","label_text_color":"#ffffff","label_background_color":"#ff2f7a"},"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Hyva Checkout Ready","is_category":true,"id":"category-node-109","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/hyva-checkout-ready-extensions-for-magento-2.html","current":false,"items_count":135,"top_products":[{"url":"https:\/\/amasty.com\/out-of-stock-notification-for-magento-2.html","name":"Out of Stock Notification"},{"url":"https:\/\/amasty.com\/order-attributes-for-magento-2.html","name":"Order Attributes"},{"url":"https:\/\/amasty.com\/shipping-restrictions-for-magento-2.html","name":"Shipping Restrictions "}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Navigation & Search","is_category":true,"id":"category-node-26","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/usability-navigation-extensions-for-magento-2.html","current":false,"items_count":21,"top_products":[{"url":"https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html","name":"Improved Layered Navigation","label":{"label":"TOP","label_text_color":"#1a1a1a","label_background_color":"#ffed11"}},{"url":"https:\/\/amasty.com\/mega-menu-for-magento-2.html","name":"Mega Menu Pro"},{"url":"https:\/\/amasty.com\/elasticsearch-for-magento-2.html","name":"Elastic Search"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Catalog Management","is_category":true,"id":"category-node-28","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/catalog-management-extensions-for-magento-2.html","current":false,"items_count":34,"top_products":[{"url":"https:\/\/amasty.com\/product-feed-for-magento-2.html","name":"Product Feed"},{"url":"https:\/\/amasty.com\/improved-sorting-for-magento-2.html","name":"Improved Sorting"},{"url":"https:\/\/amasty.com\/shop-by-brand-for-magento-2.html","name":"Shop by Brand"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Checkout","is_category":true,"id":"category-node-35","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/checkout-extensions-for-magento-2.html","current":false,"items_count":27,"top_products":[{"url":"https:\/\/amasty.com\/one-step-checkout-for-magento-2.html","name":"One Step Checkout Pro","label":{"label":"TOP","label_text_color":"#1a1a1a","label_background_color":"#ffed11"}},{"url":"https:\/\/amasty.com\/customer-attributes-for-magento-2.html","name":"Customer Attributes"},{"url":"https:\/\/amasty.com\/delivery-date-manager-for-magento-2.html","name":"Delivery Date Manager"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Law-Based Extensions","is_category":true,"id":"category-node-112","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/law-based-extensions-for-magento-2.html","current":false,"items_count":8,"top_products":[{"url":"https:\/\/amasty.com\/cookie-consent-for-magento-2.html","name":"Cookie Consent"},{"url":"https:\/\/amasty.com\/omnibus-price-tracker-for-magento-2.html","name":"Omnibus Price Tracker"},{"url":"https:\/\/amasty.com\/age-verification-for-magento-2.html","name":"Age Verification","label":{"label":"NEW","label_text_color":"#ffffff","label_background_color":"#4d91f8"}}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Shipping","is_category":true,"id":"category-node-30","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/shipping-extensions-for-magento-2.html","current":false,"items_count":19,"top_products":[{"url":"https:\/\/amasty.com\/shipping-rules-for-magento-2.html","name":"Shipping Rules"},{"url":"https:\/\/amasty.com\/shipping-table-rates-for-magento-2.html","name":"Shipping Table Rates"},{"url":"https:\/\/amasty.com\/store-pickup-with-locator-for-magento-2.html","name":"Store Pickup with Locator"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"SEO","is_category":true,"id":"category-node-33","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/seo-optimization-extensions-for-magento-2.html","current":false,"items_count":29,"top_products":[{"url":"https:\/\/amasty.com\/seo-toolkit-for-magento-2.html","name":"SEO Toolkit Pro"},{"url":"https:\/\/amasty.com\/google-indexing-api-for-magento-2.html","name":"Google Indexing API","label":{"label":"NEW","label_text_color":"#ffffff","label_background_color":"#4d91f8"}},{"url":"https:\/\/amasty.com\/google-page-speed-optimizer-for-magento-2.html","name":"Google Page Speed Optimizer Pro"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Promotions","is_category":true,"id":"category-node-29","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/promotions-extensions-for-magento-2.html","current":false,"items_count":44,"top_products":[{"url":"https:\/\/amasty.com\/free-gift-for-magento-2.html","name":"Free Gift","label":{"label":"TOP","label_text_color":"#1a1a1a","label_background_color":"#ffed11"}},{"url":"https:\/\/amasty.com\/special-promotions-pro-for-magento-2.html","name":"Special Promotions Pro"},{"url":"https:\/\/amasty.com\/automatic-related-products-for-magento-2.html","name":"Automatic Related Products"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Images & Media","is_category":true,"id":"category-node-36","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/images-media-extensions-for-magento-2.html","current":false,"items_count":15,"top_products":[{"url":"https:\/\/amasty.com\/product-labels-for-magento-2.html","name":"Product Labels"},{"url":"https:\/\/amasty.com\/promo-banners-for-magento-2.html","name":"Promo Banners"},{"url":"https:\/\/amasty.com\/color-swatches-pro-for-magento-2.html","name":"Color Swatches Pro"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Administration","is_category":true,"id":"category-node-82","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/administration-extensions-for-magento-2.html","current":false,"items_count":25,"top_products":[{"url":"https:\/\/amasty.com\/admin-actions-log-for-magento-2.html","name":"Admin Actions Log"},{"url":"https:\/\/amasty.com\/advanced-permissions-for-magento-2.html","name":"Advanced Permissions"},{"url":"https:\/\/amasty.com\/payment-restrictions-for-magento-2.html","name":"Payment Restrictions"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"B2B Products","is_category":true,"id":"category-node-61","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/b2b-extensions-for-magento-2.html","current":false,"items_count":27,"top_products":[{"url":"https:\/\/amasty.com\/b2b-ecommerce-suite-for-magento-2.html","name":"B2B E-commerce Premium Suite"},{"url":"https:\/\/amasty.com\/import-and-export-for-magento-2.html","name":"Import and Export Premium"},{"url":"https:\/\/amasty.com\/b2b-company-account-for-magento-2.html","name":"B2B Company Account"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"AI-Powered Extensions","is_category":true,"id":"category-node-103","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/ai-extensions-for-magento-2.html","current":false,"items_count":3,"top_products":[{"url":"https:\/\/amasty.com\/blog-pro-for-magento-2.html","name":"Blog Pro"},{"url":"https:\/\/amasty.com\/chatgpt-ai-content-for-magento-2.html","name":"ChatGPT AI Content Generator"},{"url":"https:\/\/amasty.com\/google-automated-discounts-for-magento-2.html","name":"Google Automated Discounts"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Free Magento 2 Extensions","is_category":true,"id":"category-node-43","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/free-magento-2-extensions.html","current":false,"items_count":8,"top_products":[{"url":"https:\/\/amasty.com\/google-page-speed-optimizer-lite-for-magento-2.html","name":"Google Page Speed Optimizer"},{"url":"https:\/\/amasty.com\/recently-viewed-products-popup-for-magento-2.html","name":"Recently Viewed Products"},{"url":"https:\/\/amasty.com\/mega-menu-lite-for-magento-2.html","name":"Mega Menu"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":700,"mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Support Packs","is_category":true,"id":"category-node-79","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/contacts","current":false,"items_count":0,"hide_mobile_content":false,"submenu_animation":null},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":700,"mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Research Product Demand","is_category":true,"id":"category-node-69","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/research-product-demand.html","current":false,"items_count":57,"hide_mobile_content":false,"submenu_animation":null},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Public Roadmap","is_category":true,"id":"category-node-97","status":1,"sort_order":null,"content":"","url":"https:\/\/trello.com\/b\/mGKdSV3a\/%F0%9F%9A%A9-amasty-product-roadmap-%F0%9F%9A%A9","current":false,"items_count":0,"hide_mobile_content":false,"submenu_animation":"none"}],"__disableTmpl":true,"name":"Magento 2 Extensions","is_category":true,"id":"category-node-25","status":1,"sort_order":"0","content":"<div class=\"ammenu-dropdown-wrapper -desktop\">\r\n <div class=\"left-side\">\r\n <div class=\"ammenu-widget-wrapper block widget mega-menu-products-list\" data-amsite-js=\"top-product-widget\"> <div class=\"block-title\">Popular right now<\/div> <div class=\"block-content\"><ul class=\"widget-product-items\"> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/cookie-consent-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Cookie Consent (GDPR)\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/c\/o\/cookie-consent-for-magento-2_6253b4c79f9ab.png\" alt=\"Cookie Consent (GDPR) for Magento 2\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Cookie Consent (GDPR)<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Improved Layered Navigation\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/m\/improved-layered-navigation-for-magento-2_5.png\" alt=\"Improved Layered Navigation for Magento 2\"\/><\/span><\/span> <div class=\"amasty-label-container amasty-label-container-13-506-cat amasty-label-for-506\" 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\":\"506\",\"label\":13,\"margin\":7,\"alignment\":0,\"order\":5,\"redirect_url\":\"\",\"tooltip\":{\"backgroundColor\":\"\",\"color\":\"\",\"status\":1,\"content\":\"\"}}, \"productId\": \"506\", \"selector\": \".amasty-label-container-13-506-cat\" }}'><div class=\"amlabel-text\"><\/div> <img id=\"amasty-label-image-13-506-cat\" class=\"amasty-label-image\" src=\"https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\" style=\"opacity: 1 !important;vertical-align: top;\" title=\"Improved Layered Navigation for Magento 2\" alt=\"Improved Layered Navigation for Magento 2\" ><\/div> <div class=\"product-item-name\"><span class=\"ammenu-text\">Improved Layered Navigation<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/google-tag-manager-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Google Analytics 4 with GTM Support\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon-google-tag-manager-for-magento-2.png\" alt=\"Google Analytics 4 with GTM Support for Magento 2\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Google Analytics 4 with GTM Support<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <\/ul><\/div> <a href=\"\/hyva-theme-extensions-for-magento-2.html?utm_source=menu&utm_medium=widget&utm_campaign=hyva_extensions\" class=\"block-link-below\" tabindex=\"0\" title=\"View All Hyva Extensions\">View All Hyva Extensions<\/a> <\/div>\r\n\r\n <div class=\"ammenu-m2-dropdown-banners\" data-amsite-js=\"ammenu-m2-dropdown-banners\">\r\n <a class=\"amsite-menu-picker-btn action secondary\" href=\"\/latest-updates-magento-2-extensions.html?utm_source=menu&utm_medium=widget&utm_campaign=recent_updates\" title=\"Go to this page\">\r\n Check Module Updates\r\n <\/a>\r\n <img src=\"https:\/\/cdn.amasty.com\/media\/amsite\/adobe-partner-badge-2x.png\" alt=\"Adobe partner logo\" width=\"180\" \r\n height=\"46\">\r\n<\/div> \r\n\r\n <\/div>\r\n <div class=\"right-side\">\r\n <!-- ko scope: \"index = ammenu_columns_wrapper\" --> <!-- ko template: getTemplate() --><!-- \/ko --> <!-- \/ko -->\r\n <\/div>\r\n<\/div>","url":"https:\/\/amasty.com\/magento-2-extensions.html","current":false,"items_count":261,"top_products":[{"url":"https:\/\/amasty.com\/tier-price-for-magento-2.html","name":"Tier Price for Magento 2"}],"hide_mobile_content":false,"submenu_animation":"fade_in"},{"show_mobile_content":0,"mobile_content":"<div class=\"ammenu-view-all-mobile-link\">\r\n <a class=\"ammenu-link view-all\"\r\n href=\"\/magento-2-solutions.html\"\r\n aria-label=\"Go to Solutions\"\r\n title=\"Go to Solutions\"\r\n role=\"link\"\r\n tabindex=\"0\"\r\n >\r\n All Solutions\r\n <\/a>\r\n<\/div>\r\n\r\n <div class=\"ammenu-widget-wrapper block widget mega-menu-products-list\" data-amsite-js=\"top-product-widget\"> <div class=\"block-title\">Featured Products<\/div> <div class=\"block-content\"><ul class=\"widget-product-items\"> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/b2b-ecommerce-suite-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to B2B E-commerce Premium Solution\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon_b2b_premium_2.png\" alt=\"B2B E-commerce Premium Solution for Magento 2\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">B2B E-commerce Premium Solution<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Google Page Speed Optimizer Powered by SpeedSize™ AI Pro\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/g\/o\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2_629ed9b6e2f0e.png\" alt=\"Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro for Magento 2\"\/><\/span><\/span> <div class=\"amasty-label-container amasty-label-container-13-2699-cat amasty-label-for-2699\" 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\":\"2699\",\"label\":13,\"margin\":7,\"alignment\":0,\"order\":5,\"redirect_url\":\"\",\"tooltip\":{\"backgroundColor\":\"\",\"color\":\"\",\"status\":1,\"content\":\"\"}}, \"productId\": \"2699\", \"selector\": \".amasty-label-container-13-2699-cat\" }}'><div class=\"amlabel-text\"><\/div> <img id=\"amasty-label-image-13-2699-cat\" class=\"amasty-label-image\" src=\"https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\" style=\"opacity: 1 !important;vertical-align: top;\" title=\"Google Page Speed Optimizer Powered by SpeedSize™ AI Pro for Magento 2\" alt=\"Google Page Speed Optimizer Powered by SpeedSize™ AI Pro for Magento 2\" ><\/div> <div class=\"product-item-name\"><span class=\"ammenu-text\">Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <\/ul><\/div> <a href=\"\/magento-2-extensions.html\" class=\"block-link-below\" tabindex=\"0\" title=\"View All BestSellers\">View All BestSellers<\/a> <\/div>\r\n","type":{"value":1,"label":"vertical"},"submenu_type":false,"width":0,"width_value":0,"column_count":3,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Hyva Solutions","is_category":true,"id":"category-node-104","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/hyva-solutions-for-magento-2.html","current":false,"items_count":8,"top_products":[{"url":"https:\/\/amasty.com\/gdpr-for-magento-2.html","name":"GDPR Pro"},{"url":"https:\/\/amasty.com\/gift-card-for-magento-2.html","name":"Gift Card Pro"},{"url":"https:\/\/amasty.com\/product-attachments-for-magento-2.html","name":"Product Attachments"}],"label":{"label":"HOT","label_text_color":"#ffffff","label_background_color":"#ff2f7a"},"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":1,"label":"vertical"},"submenu_type":false,"width":0,"width_value":0,"column_count":0,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Enhanced Navigation","is_category":true,"id":"category-node-72","status":1,"sort_order":"99999","content":"","url":"https:\/\/amasty.com\/usability-navigation-solutions-for-magento-2.html","current":false,"items_count":5,"top_products":[{"url":"https:\/\/amasty.com\/premium-custom-layered-navigation-for-magento-2.html","name":"Layered Navigation Premium"},{"url":"https:\/\/amasty.com\/advanced-search-for-magento-2.html","name":"Advanced Search"}],"label":{"label":"TOP","label_text_color":"#1a1a1a","label_background_color":"#ffed11"},"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Packs","is_category":true,"id":"category-node-113","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/packs-for-magento-2.html","current":false,"items_count":2,"top_products":[{"url":"https:\/\/amasty.com\/ultimate-sale-booster-for-magento-2.html","name":"Sale Booster Pack"},{"url":"https:\/\/amasty.com\/elastic-layered-navigation-for-magento-2.html","name":"Elastic Layered Navigation"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Suites","is_category":true,"id":"category-node-114","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/suites-for-magento-2.html","current":false,"items_count":4,"top_products":[{"url":"https:\/\/amasty.com\/promotion-suite-middle-for-magento-2.html","name":"Promotion Suite Pro"},{"url":"https:\/\/amasty.com\/security-suite-for-magento-2.html","name":"Security Suite "},{"url":"https:\/\/amasty.com\/shipping-suite-for-magento-2.html","name":"Shipping Suite Pro"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Sales & Marketing","is_category":true,"id":"category-node-73","status":1,"sort_order":"99999","content":"","url":"https:\/\/amasty.com\/sales-and-marketing-solutions-for-magento-2.html","current":false,"items_count":11,"top_products":[{"url":"https:\/\/amasty.com\/abandoned-cart-email-for-magento-2.html","name":"Abandoned Cart Email"},{"url":"https:\/\/amasty.com\/reward-points-for-magento-2.html","name":"Reward Points"},{"url":"https:\/\/amasty.com\/special-promotions-for-magento-2.html","name":"Special Promotions"},{"url":"https:\/\/amasty.com\/facebook-pixel-for-magento-2.html","name":"Facebook Pixel"},{"url":"https:\/\/amasty.com\/advanced-product-reviews-for-magento-2.html","name":"Advanced Product Reviews"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"User Experience","is_category":true,"id":"category-node-77","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/user-experience-solutions-for-magento-2.html","current":false,"items_count":5,"top_products":[{"url":"https:\/\/amasty.com\/request-a-quote-for-magento-2.html","name":"Request a Quote"},{"url":"https:\/\/amasty.com\/google-page-speed-optimizer-premium-for-magento-2.html","name":"Google Page Speed Optimizer Premium"},{"url":"https:\/\/amasty.com\/store-locator-for-magento-2.html","name":"Store Locator"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Order Management","is_category":true,"id":"category-node-74","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/order-management-solutions-for-magento-2.html","current":false,"items_count":5,"top_products":[{"url":"https:\/\/amasty.com\/rma-for-magento-2.html","name":"RMA"},{"url":"https:\/\/amasty.com\/pre-order-for-magento-2.html","name":"Pre Order"},{"url":"https:\/\/amasty.com\/advanced-reports-for-magento-2.html","name":"Advanced Reports"}],"hide_mobile_content":false,"submenu_animation":"none"}],"__disableTmpl":true,"name":"Suites","is_category":true,"id":"category-node-71","status":1,"sort_order":"1","content":"<div class=\"ammenu-dropdown-wrapper -desktop\">\r\n <div class=\"left-side\">\r\n <div class=\"ammenu-widget-wrapper block widget mega-menu-products-list\" data-amsite-js=\"top-product-widget\"> <div class=\"block-title\">Featured Products<\/div> <div class=\"block-content\"><ul class=\"widget-product-items\"> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/google-automated-discounts-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Google Automated Discounts Premium\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/g\/o\/google-automated-discounts-for-magento-2_6568768b9b091.png\" alt=\"Google Automated Discounts Premium for Magento 2\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Google Automated Discounts Premium<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/b2b-ecommerce-suite-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to B2B E-commerce Premium Solution\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon_b2b_premium_2.png\" alt=\"B2B E-commerce Premium Solution for Magento 2\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">B2B E-commerce Premium Solution<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Google Page Speed Optimizer Powered by SpeedSize™ AI Pro\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/g\/o\/google-page-speed-optimizer-powered-by-speedsize-for-magento-2_629ed9b6e2f0e.png\" alt=\"Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro for Magento 2\"\/><\/span><\/span> <div class=\"amasty-label-container amasty-label-container-13-2699-cat amasty-label-for-2699\" 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\":\"2699\",\"label\":13,\"margin\":7,\"alignment\":0,\"order\":5,\"redirect_url\":\"\",\"tooltip\":{\"backgroundColor\":\"\",\"color\":\"\",\"status\":1,\"content\":\"\"}}, \"productId\": \"2699\", \"selector\": \".amasty-label-container-13-2699-cat\" }}'><div class=\"amlabel-text\"><\/div> <img id=\"amasty-label-image-13-2699-cat\" class=\"amasty-label-image\" src=\"https:\/\/cdn.amasty.com\/media\/amasty\/amlabel\/top-rated-new-2x.png\" style=\"opacity: 1 !important;vertical-align: top;\" title=\"Google Page Speed Optimizer Powered by SpeedSize™ AI Pro for Magento 2\" alt=\"Google Page Speed Optimizer Powered by SpeedSize™ AI Pro for Magento 2\" ><\/div> <div class=\"product-item-name\"><span class=\"ammenu-text\">Google Page Speed Optimizer Powered by SpeedSize\u2122 AI Pro<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <\/ul><\/div> <a href=\"\/all-magento-2-bundles\" class=\"block-link-below\" tabindex=\"0\" title=\"View ready-made bundles list\">View ready-made bundles list<\/a> <\/div>\r\n\r\n <\/div>\r\n <div class=\"right-side\">\r\n <!-- ko scope: \"index = ammenu_columns_wrapper\" --> <!-- ko template: getTemplate() --><!-- \/ko --> <!-- \/ko -->\r\n <\/div>\r\n<\/div>","url":"https:\/\/amasty.com\/magento-2-solutions.html","current":false,"items_count":43,"top_products":[{"url":"https:\/\/amasty.com\/improved-layered-navigation-for-magento-2.html","name":"Improved Layered Navigation","label":{"label":"TOP","label_text_color":"#1a1a1a","label_background_color":"#ffed11"}},{"url":"https:\/\/amasty.com\/elasticsearch-for-magento-2.html","name":"Elastic Search"},{"url":"https:\/\/amasty.com\/mega-menu-for-magento-2.html","name":"Mega Menu Pro"}],"hide_mobile_content":false,"submenu_animation":"fade_in"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":700,"mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Support","is_category":false,"id":"custom-node-4","status":1,"sort_order":"2","content":"","url":"https:\/\/amasty.com\/contacts\/","current":false,"items_count":null,"hide_mobile_content":false,"submenu_animation":null},{"show_mobile_content":0,"mobile_content":"<div class=\"ammenu-view-all-mobile-link\">\r\n <a class=\"ammenu-link view-all\"\r\n href=\"\/magento-services.html\"\r\n aria-label=\"Go to All Services\"\r\n title=\"Go to All Services\"\r\n role=\"link\"\r\n tabindex=\"0\"\r\n >\r\n All Services\r\n <\/a>\r\n<\/div>\r\n\r\n <div class=\"ammenu-widget-wrapper block widget mega-menu-products-list\" data-amsite-js=\"top-product-widget\"> <div class=\"block-title\">Featured Services<\/div> <div class=\"block-content\"><ul class=\"widget-product-items\"> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-optimization-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento Optimization Service\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-optimization-service_63f5d17699021.png\" alt=\"Magento Optimization Service\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento Optimization Service<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento 2 Support and Maintenance Service\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-support-and-maintenance-service_64c2674727566.png\" alt=\"Magento 2 Support and Maintenance Service\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento 2 Support and Maintenance Service<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-website-development-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento Website Development\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-website-development-service_64be2084385cb.png\" alt=\"Magento Website Development\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento Website Development<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-2-upgrade-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento 2 Upgrade Service\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-upgrade-service_61a5e5cfefab3.png\" alt=\"Magento 2 Upgrade Service\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento 2 Upgrade Service<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-to-shopify-migration-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento to Shopify Migration Service\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/i\/c\/icon-magento-to-shopify-migration-for-magento-2.png\" alt=\"Magento to Shopify Migration Service\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento to Shopify Migration Service<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <\/ul><\/div> <a href=\"\/magento-services.html\" class=\"block-link-below\" tabindex=\"0\" title=\"View All BestSellers\">View All BestSellers<\/a> <\/div>\r\n\r\n\r\n","type":{"value":1,"label":"vertical"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"High-Demand Services","is_category":true,"id":"category-node-111","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-development-services.html","current":false,"items_count":4,"top_products":[{"url":"https:\/\/amasty.com\/magento-development.html","name":"Magento Custom Development"},{"url":"https:\/\/amasty.com\/magento-optimization-service.html","name":"Magento Optimization"},{"url":"https:\/\/amasty.com\/magento-2-upgrade-service.html","name":"Magento 2 Upgrade Service","label":{"label":"10%","label_text_color":"#ffffff","label_background_color":"#f9425a"}},{"url":"https:\/\/amasty.com\/website-development-service.html","name":"Custom Website Development Services"}],"label":{"label":"TOP","label_text_color":"#1a1a1a","label_background_color":"#ffed11"},"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Magento Development Services","is_category":true,"id":"category-node-84","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-development-services.html","current":false,"items_count":17,"top_products":[{"url":"https:\/\/amasty.com\/magento-website-development-service.html","name":"Magento Website Development"},{"url":"https:\/\/amasty.com\/magento-mobile-app-development-service.html","name":"Magento Mobile App Development"},{"url":"https:\/\/amasty.com\/magento-code-audit-service.html","name":"Magento Code Audit"},{"url":"https:\/\/amasty.com\/magento-outsourcing-services.html","name":"Magento Outsourcing Services"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"Hyva Development Services","is_category":true,"id":"category-node-108","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-hyva-theme-development-service.html","current":false,"items_count":3,"top_products":[{"url":"https:\/\/amasty.com\/magento-hyva-theme-development-service.html","name":"Hyva Theme Development"},{"url":"https:\/\/amasty.com\/hyva-theme-migration-service.html","name":"Hyva Theme Migration"},{"url":"https:\/\/amasty.com\/magento-hyva-theme-customization-service.html","name":"Hyva Theme Customization"}],"label":{"label":"HOT","label_text_color":"#1a1a1a","label_background_color":"#ffed11"},"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Magento Optimization Services","is_category":true,"id":"category-node-85","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-optimization-service.html","current":false,"items_count":6,"top_products":[{"url":"https:\/\/amasty.com\/magento-performance-audit.html","name":"Magento Performance Audit","label":{"label":"FREE","label_text_color":"#ffffff","label_background_color":"#4d91f8"}},{"url":"https:\/\/amasty.com\/magento-seo-services.html","name":"Magento SEO Services"},{"url":"https:\/\/amasty.com\/website-ui-ux-audit.html","name":"Website UI\/UX Audit"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Magento Maintenance Services","is_category":true,"id":"category-node-86","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html","current":false,"items_count":6,"top_products":[{"url":"https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html","name":"Magento 2 Support and Maintenance"},{"url":"https:\/\/amasty.com\/installation-service.html","name":"Installation Service"},{"url":"https:\/\/amasty.com\/magento-security-patch.html","name":"Magento Security Patch Installation"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Magento Upgrade Services","is_category":true,"id":"category-node-87","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-2-upgrade-service.html","current":false,"items_count":5,"top_products":[{"url":"https:\/\/amasty.com\/magento-1-to-2-migration-service.html","name":"Magento 1 to 2 Migration"},{"url":"https:\/\/amasty.com\/magento-server-configuration-and-migration-service.html","name":"Magento Server Configuration and Migration"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Magento Integration Services","is_category":true,"id":"category-node-89","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-integration-service.html","current":false,"items_count":7,"top_products":[{"url":"https:\/\/amasty.com\/amazon-integration-for-magento-2.html","name":"Magento 2 Amazon Integration"},{"url":"https:\/\/amasty.com\/magento-2-microsoft-dynamics-integration-service.html","name":"Magento 2 Microsoft Integration"},{"url":"https:\/\/amasty.com\/sap-integration-services-magento.html","name":"Magento 2 SAP Integration"},{"url":"https:\/\/amasty.com\/magento-2-salesforce-integration-service.html","name":"Magento 2 Salesforce Integration"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Managed Services","is_category":true,"id":"category-node-115","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/managed-it-service.html","current":false,"items_count":4,"top_products":[{"url":"https:\/\/amasty.com\/managed-ecommerce-service.html","name":"E-commerce Managed Services"},{"url":"https:\/\/amasty.com\/managed-security-service.html","name":"Managed Security Services"},{"url":"https:\/\/amasty.com\/managed-magento-service.html","name":"Magento Managed Services"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Shopify Services","is_category":true,"id":"category-node-90","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/shopify-website-development-service.html","current":false,"items_count":11,"top_products":[{"url":"https:\/\/amasty.com\/magento-to-shopify-migration-service.html","name":"Magento to Shopify Migration"},{"url":"https:\/\/amasty.com\/custom-shopify-theme-development-service.html","name":"Custom Shopify Theme Development"},{"url":"https:\/\/amasty.com\/shopify-app-development-service.html","name":"Shopify App Development"},{"url":"https:\/\/amasty.com\/shopify-site-speed-optimization-service.html","name":"Shopify Speed Optimization"},{"url":"https:\/\/amasty.com\/shopify-to-woocommerce-migration-service.html","name":"Shopify to WooCommerce Migration"},{"url":"https:\/\/amasty.com\/shopify-integration-service.html","name":"Shopify Integration"}],"label":{"label":"HOT","label_text_color":"#1a1a1a","label_background_color":"#ffed11"},"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","elems":[],"__disableTmpl":true,"name":"E-Commerce Services","is_category":true,"id":"category-node-92","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/magento-services.html","current":false,"items_count":5,"top_products":[{"url":"https:\/\/amasty.com\/e-commerce-site-development-service.html","name":"E-commerce Site Development"},{"url":"https:\/\/amasty.com\/hire-magento-experts-business-models.html","name":"Service Pricing Models"},{"url":"https:\/\/amasty.com\/ecommerce-website-redesign-services.html","name":"E-commerce Website Redesign"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"QA Testing Services","is_category":true,"id":"category-node-93","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/qa-testing-services.html","current":false,"items_count":2,"top_products":[{"url":"https:\/\/amasty.com\/qa-for-ecommerce-business-service.html","name":"E-commerce QA testing"}],"hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Hire Developers","is_category":true,"id":"category-node-94","status":1,"sort_order":null,"content":"","url":"https:\/\/amasty.com\/hire-developers.html","current":false,"items_count":7,"top_products":[{"url":"https:\/\/amasty.com\/hire-php-developer.html","name":"Hire PHP Developer"},{"url":"https:\/\/amasty.com\/hire-certified-magento-2-developers.html","name":"Hire Magento 2 Developer"},{"url":"https:\/\/amasty.com\/hire-shopify-developers.html","name":"Hire Shopify Developers"}],"hide_mobile_content":false,"submenu_animation":"none"}],"__disableTmpl":true,"name":"Services","is_category":true,"id":"category-node-37","status":1,"sort_order":"3","content":"<div class=\"ammenu-dropdown-wrapper -desktop\">\r\n <div class=\"left-side\">\r\n <a href=\"https:\/\/amasty.com\/magento-2-upgrade-service.html?utm_source=menu&utm_medium=widget&utm_campaign=services_banner\"><img src=\"https:\/\/cdn.amasty.com\/media\/wysiwyg\/amasty\/banner-upgrade-service.png\" alt=\"banner-review\" style=\"margin-bottom: 30px;\"><\/a>\r\n <!-- <div class=\"ammenu-widget-wrapper block widget mega-menu-products-list\" data-amsite-js=\"top-product-widget\"> <div class=\"block-title\">TOP-4 Amasty services<\/div> <div class=\"block-content\"><ul class=\"widget-product-items\"> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-optimization-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento Optimization Service\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-optimization-service_63f5d17699021.png\" alt=\"Magento Optimization Service\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento Optimization Service<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-2-support-and-maintenance-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento 2 Support and Maintenance Service\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-support-and-maintenance-service_64c2674727566.png\" alt=\"Magento 2 Support and Maintenance Service\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento 2 Support and Maintenance Service<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-website-development-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento Website Development\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-website-development-service_64be2084385cb.png\" alt=\"Magento Website Development\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento Website Development<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <li class=\"product-item\"><a href=\"https:\/\/amasty.com\/magento-2-upgrade-service.html\" class=\"item-link\" tabindex=\"0\" role=\"link\" title=\"Go to Magento 2 Upgrade Service\"> <span class=\"product-image-container\" style=\"width:160px;\"><span class=\"product-image-wrapper\" style=\"padding-bottom: 100%;\"><img class=\"product-image-photo\" src=\"https:\/\/cdn.amasty.com\/media\/catalog\/product\/cache\/4e759f6dd520f03226056bcaf7c201bf\/m\/a\/magento-2-upgrade-service_61a5e5cfefab3.png\" alt=\"Magento 2 Upgrade Service\"\/><\/span><\/span> <div class=\"product-item-name\"><span class=\"ammenu-text\">Magento 2 Upgrade Service<\/span> <span class=\"ammenu-label\">TOP<\/span><\/div><\/a><\/li> <\/ul><\/div><\/div> -->\r\n <button class=\"amform-show-popup-imitation\">Show Form<\/button>\r\n <\/div>\r\n <div class=\"right-side\">\r\n <!-- ko scope: \"index = ammenu_columns_wrapper\" --> <!-- ko template: getTemplate() --><!-- \/ko --> <!-- \/ko -->\r\n <\/div>\r\n<\/div>","url":"https:\/\/amasty.com\/magento-services.html","current":false,"items_count":75,"hide_mobile_content":false,"submenu_animation":"fade_in"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":700,"mobile_font":700,"elems":[],"__disableTmpl":true,"name":"Shopify Apps","is_category":true,"id":"category-node-107","status":1,"sort_order":"4","content":"","url":"https:\/\/amasty.com\/shopify-apps.html","current":false,"items_count":0,"hide_mobile_content":false,"submenu_animation":null},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"700","mobile_font":"700","icon":"https:\/\/cdn.amasty.com\/media\/amasty\/ammegamenu\/Heart_2x_1.jpg","icon_extension":"jpg","elems":[],"__disableTmpl":true,"name":"Special Offers","is_category":false,"id":"custom-node-1","status":1,"sort_order":"6","content":"<div class=\"ammenu-custom-container -full -loyalty\" >\r\n <ul class=\"ammenu-items\">\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Amasty Special Offers page\" analytics-custom-menu-items=\"DropDownMenuOffers\" href=\"\/amasty-promo.html\"><span class=\"ammenu-wrapper\">Special Offers<\/span> <\/a><\/li>\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to AmastyAll Bundles page\" analytics-custom-menu-items=\"DropDownMenuOffers\" href=\"\/all-magento-2-bundles\"><span class=\"ammenu-wrapper\">All Bundles<\/span> <\/a><\/li>\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Replace Third-Party Modules Offer page\" analytics-custom-menu-items=\"DropDownMenuOffers\" href=\"\/amasty-only-offer\/\"><span class=\"ammenu-wrapper\">Replace Modules Offer<\/span> <\/a><\/li>\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Custom Bundle page\" analytics-custom-menu-items=\"DropDownMenuOffers\" href=\"\/custom-bundle.html\"><span class=\"ammenu-wrapper\">Custom Bundle Offer<\/span> <\/a><\/li>\r\n<li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Free Resources page\" analytics-custom-menu-items=\"DropDownMenuOffers\" href=\"\/free-magento-resources\"><span class=\"ammenu-wrapper\">Free Resources<\/span> <\/a><\/li>\r\n <\/ul>\r\n<\/div>","url":"https:\/\/amasty.com\/amasty-promo.html","current":false,"items_count":"0","hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"400","mobile_font":"400","elems":[],"__disableTmpl":true,"name":"Loyalty Programs","is_category":false,"id":"custom-node-11","status":1,"sort_order":"7","content":"<div class=\"ammenu-custom-container -full -loyalty\" >\r\n <ul class=\"ammenu-items\">\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Amasty Loyalty Program page\" analytics-custom-menu-items=\"DropDownMenuLoyalty\" href=\"\/amasty-loyalty-program.html\"><span class=\"ammenu-wrapper\">Amasty Loyalty Program<\/span> <\/a><\/li>\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Partner Program page\" analytics-custom-menu-items=\"DropDownMenuLoyalty\" href=\"\/partnership-program.html\"><span class=\"ammenu-wrapper\">Partner Program<\/span> <\/a><\/li>\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Affiliate Program page\" analytics-custom-menu-items=\"DropDownMenuLoyalty\" href=\"\/affiliate-program.html\"><span class=\"ammenu-wrapper\">Affiliate Program<\/span><\/a><\/li>\r\n <li class=\"ammenu-wrapper category-item\"><a class=\"ammenu-link\" title=\"go to Official Partners page\" analytics-custom-menu-items=\"DropDownMenuLoyalty\" href=\"\/partners.html\"><span class=\"ammenu-wrapper\">Official Partners<\/span><\/a><\/li>\r\n <\/ul>\r\n<\/div>","url":"https:\/\/amasty.com\/amasty-loyalty-program.html","current":false,"items_count":"0","hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"400","mobile_font":"400","elems":[],"__disableTmpl":true,"name":"Blog","is_category":false,"id":"custom-node-2","status":1,"sort_order":"8","content":"","url":"https:\/\/amasty.com\/blog\/","current":false,"items_count":"0","hide_mobile_content":false,"submenu_animation":"none"},{"show_mobile_content":0,"mobile_content":null,"type":{"value":0,"label":"do not show"},"submenu_type":false,"width":0,"width_value":0,"column_count":4,"hide_content":false,"desktop_font":"400","mobile_font":"400","elems":[],"__disableTmpl":true,"name":"FAQ","is_category":false,"id":"custom-node-10","status":1,"sort_order":"9","content":"","url":"https:\/\/amasty.com\/knowledge-base\/","current":false,"items_count":"0","hide_mobile_content":false,"submenu_animation":"none"}],"__disableTmpl":true,"name":null,"is_category":null,"id":null,"status":0,"sort_order":null,"content":null,"url":null,"current":false,"items_count":null,"hide_mobile_content":false,"submenu_animation":null}, config: {"is_hamburger":false,"color_settings":{"color_template":"custom","main_menu_background":"#fff","main_menu_background_hover":"#FFFFFF","main_menu_text":"#1a1a1a","main_menu_text_hover":"#FF5B0F","submenu_background_color":"#fff","submenu_background_image":"","submenu_text":"#1a1a1a","submenu_text_hover":"#FF5B0F","current_category_color":"#ff5b0f","toggle_icon_color":"#1a1a1a","hamburger_icon_color":"#1a1a1a"},"mobile_menu_title":"","mobile_menu_width":1023,"welcome_message":{"message":"Default welcome msg!"},"invitation_url":"","hide_view_all_link":true,"mobile_class":"drill","is_sticky":1,"is_icons_available":"both","animation_time":0.2,"hamburger_animation":"none"}, children: [], settings: {"account":{"is_logged_in":false,"login":"https:\/\/amasty.com\/customer\/account\/login\/","create":"https:\/\/amasty.com\/customer\/account\/create\/","logout":"https:\/\/amasty.com\/customer\/account\/logout\/","account":"https:\/\/amasty.com\/customer\/account\/"},"switcher":{"current_code":"default","current_name":"Amasty Store","current_store_id":"1","items":[{"url":"https:\/\/amasty.com\/stores\/store\/redirect\/___store\/default\/uenc\/aHR0cHM6Ly9hbWFzdHkuY29tLz9fX19zdG9yZT1kZWZhdWx0\/___from_store\/default\/","code":"default","name":"Amasty Store"}]},"currency":[{"data-post":"{\"action\":\"https:\\\/\\\/amasty.com\\\/directory\\\/currency\\\/switch\\\/\",\"data\":{\"currency\":\"GBP\"}}","name":"British Pound","code":"GBP","code_title":"GBP","current_currency":false},{"data-post":"{\"action\":\"https:\\\/\\\/amasty.com\\\/directory\\\/currency\\\/switch\\\/\",\"data\":{\"currency\":\"EUR\"}}","name":"Euro","code":"EUR","code_title":"EUR","current_currency":false},{"data-post":"{\"action\":\"https:\\\/\\\/amasty.com\\\/directory\\\/currency\\\/switch\\\/\",\"data\":{\"currency\":\"USD\"}}","name":"US Dollar","code":"USD","code_title":"USD","current_currency":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: #fff; color: #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(https://cdn.amasty.com/media/amasty/ammegamenu/Heart_2x_1.jpg); maskImage: url(https://cdn.amasty.com/media/amasty/ammegamenu/Heart_2x_1.jpg); background-color: #1a1a1a; background-image: url(https://cdn.amasty.com/media/amasty/ammegamenu/Heart_2x_1.jpg); " 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"><ul class="items"> <!-- remove home from breadcrumbs --> <!-- remove home from breadcrumbs --> <li class="item category25"> <a href="https://amasty.com/magento-2-extensions.html" title="">Magento 2 Extensions</a> </li> <!-- remove home from breadcrumbs --> <li class="item all"> <strong>All</strong> </li> </ul></div><main id="maincontent" class="page-main"> <a id="contentarea" tabindex="-1"></a><div class="columns"><div class="column 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> <div class="amsite-topcategory-promotion" data-amsite-js="top-category-promotion"></div> <div class="category-page-title-wrapper"><h1 class="category-page-title" data-amsite-js="category-page-title">Magento 2 Extensions</h1></div><input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <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 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 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="s26Veii2LgQQnfiP" /><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 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 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 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 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 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 id="amasty-shopby-product-list"> <div class="top-toolbar"> <div class="toolbar toolbar-products" data-mage-init='{"productListToolbarForm":{"mode":"product_list_mode","direction":"product_list_dir","order":"product_list_order","limit":"product_list_limit","modeDefault":"grid","directionDefault":"asc","orderDefault":"position","limitDefault":15,"url":"https:\/\/amasty.com\/magento-2-extensions.html","formKey":"s26Veii2LgQQnfiP","post":false}}'> <div class="modes"> <strong class="modes-label" id="modes-label">View as</strong> <strong title="Grid" class="modes-mode active mode-grid" data-value="grid"><svg class="amtheme-icon -active" focusable="false"><use xlink:href="#icon-view-block"/></svg></strong> <a class="modes-mode mode-list" title="List" href="#" data-role="mode-switcher" data-value="list" id="mode-list" aria-labelledby="modes-label mode-list"><svg class="amtheme-icon -hover" focusable="false"><use xlink:href="#icon-view-list"/></svg></a> </div> <div class="field limiter"><label class="label" for="limiter">Items:</label> <div class="control"><select id="limiter" data-role="limiter" class="limiter-options amtheme-select" tabindex="-1"> <option value="15" selected="selected" >15</option> <option value="30" >30</option> <option value="50" >50</option></select> <div class="amtheme-select-block -no-border -amsite" data-mage-init='{"amSelect": {"selectId": "limiter"}}' data-amselect-js="select"><span role="button" tabindex="0" class="amtheme-placeholder" data-amselect-js="placeholder"><span class="amtheme-content" data-amselect-js="placeholder-content">15</span></span> <ul role="list" class="amtheme-line-options" data-amselect-js="options"> <li class="amtheme-option" tabindex="0" data-amselect-js="item" data-amselect-value="15" >15</li> <li class="amtheme-option" tabindex="0" data-amselect-js="item" data-amselect-value="30" >30</li> <li class="amtheme-option" tabindex="0" data-amselect-js="item" data-amselect-value="50" >50</li> </ul></div></div></div> <p class="toolbar-amount" id="toolbar-amount"> Items <span class="toolbar-number">1</span> to <span class="toolbar-number">15</span> of <span class="toolbar-number">261</span> total </p> <div class="toolbar-sorter sorter"><div class="amtheme-filter-wrap"><div class="amtheme-filter-button" data-amtheme-js="filter-sidebar"> <svg class="amtheme-icon -filter" focusable="false"><use xlink:href="#icon-filter"/></svg> <strong class="filter-title-text">Filters</strong></div></div><label class="sorter-label" for="sorter">Sort By</label> <select id="sorter" data-role="sorter" class="sorter-options amtheme-select"> <option value="position" selected="selected" >Bestsellers</option> <option value="recently_updated" >Recently Updated</option> <option value="rating_summary" >Most Rated</option></select> <div class="amtheme-select-block -no-border" data-mage-init='{"amSelect": {"selectId": "sorter"}}' data-amselect-js="select" ><ul role="list" class="amtheme-select-options" data-amselect-js="options" > <li class="amtheme-option -selected" tabindex="0" data-amselect-js="item" data-amselect-value="position" ><span class="amtheme-title">Bestsellers</span></li> <li class="amtheme-option " tabindex="0" data-amselect-js="item" data-amselect-value="recently_updated" ><span class="amtheme-title">Recently Updated</span></li> <li class="amtheme-option " tabindex="0" data-amselect-js="item" data-amselect-value="rating_summary" ><span class="amtheme-title">Most Rated</span></li> </ul><span role="button" tabindex="0" class="amtheme-placeholder" data-amselect-js="placeholder" ><span class="amtheme-content" data-amselect-js="placeholder-content">Bestsellers</span></span></div> <a title="Set Descending Direction" href="#" class="action sorter-action sort-asc" data-role="direction-switcher" aria-label="Set Descending Direction" data-value="desc"><svg class="amtheme-icon -circle" focusable="false"><use xlink:href="#icon-sort-view"/></svg></a> </div> </div></div> <div class="catalog-topnav amasty-catalog-topnav"> <div class="block filter" data-mage-init='{ "collapsible": { "openedState": "active", "collapsible": true, "active": false, "collateral": { "openedState": "filter-active", "element": "body" } }, "amLayeredNavigationMobile":{} }'><button class="action button-as-link amtheme-close" type="button" data-amtheme-js="layered-close" aria-label="Close filter" title="Close filter"><svg class="amtheme-icon -close"><use xlink:href="#icon-close"/></svg></button> <div class="block-title filter-title" data-role="title" data-count="0">Shop By</div><div class="block-content filter-content"> <strong role="heading" aria-level="2" class="block-subtitle filter-subtitle">Filters</strong> <div class="filter-options" id="narrow-by-list" data-role="content" data-amtheme-js="navigation-filter" data-mage-init='{ "accordion": { "openedState": "-active", "collapsible": true, "active": false, "animate": { "duration": 200 }, "multipleCollapsible": false }}'> <div data-role="collapsible" class="filter-options-item" data-amtheme-js="navigation-filter-item"><div data-role="title" class="filter-options-title -product type">Product type</div><div data-role="content" class="filter-options-content"> <form class="am-ranges type" data-am-js="ranges" data-amshopby-filter="type" data-amshopby-filter-request-var="type" autocomplete="off"><ol class="items am-filter-items-type -am-singleselect" > <li class="item " data-label="Magento 2"> <input name="amshopby[type][]" value="2" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d73d3a link " data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?type=2" rel="nofollow"><span class="label">Magento 2</span> <span class="count">260<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Services"> <input name="amshopby[type][]" value="99" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d73f50 link " data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?type=99" rel="nofollow"><span class="label">Services</span> <span class="count">1<span class="filter-count-label">item</span></span> </a> </li> </ol></form> </div></div> <div data-role="collapsible" class="filter-options-item" data-amtheme-js="navigation-filter-item"><div data-role="title" class="filter-options-title -product tag">Product Tag</div><div data-role="content" class="filter-options-content"> <form class="am-ranges tag" data-am-js="ranges" data-amshopby-filter="tag" data-amshopby-filter-request-var="tag" autocomplete="off"><ol class="items am-filter-items-tag -am-singleselect" > <li class="item " data-label="Accurate Products Search"> <input name="amshopby[tag][]" value="24" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d7436d link -blue" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=24" rel="nofollow"><span class="label">Accurate Products Search</span> <span class="count">6<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Fast & Easy Store Control"> <input name="amshopby[tag][]" value="22" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d74467 link -blue" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=22" rel="nofollow"><span class="label">Fast & Easy Store Control</span> <span class="count">12<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Higher Positions in Google"> <input name="amshopby[tag][]" value="29" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d7454c link -blue" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=29" rel="nofollow"><span class="label">Higher Positions in Google</span> <span class="count">8<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Hyva-ready Extensions"> <input name="amshopby[tag][]" value="26" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d74618 link -green" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=26" rel="nofollow"><span class="label">Hyva-ready Extensions</span> <span class="count">156<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Multichannel Selling"> <input name="amshopby[tag][]" value="30" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d746df link -purple" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=30" rel="nofollow"><span class="label">Multichannel Selling</span> <span class="count">4<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Recently Launched"> <input name="amshopby[tag][]" value="28" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d747a2 link -yellow" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=28" rel="nofollow"><span class="label">Recently Launched</span> <span class="count">15<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Sales Boosters"> <input name="amshopby[tag][]" value="31" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d74863 link -purple" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=31" rel="nofollow"><span class="label">Sales Boosters</span> <span class="count">13<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Selling Checkout"> <input name="amshopby[tag][]" value="25" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d7493b link -purple" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=25" rel="nofollow"><span class="label">Selling Checkout</span> <span class="count">4<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Site Speed Increase"> <input name="amshopby[tag][]" value="32" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d749fc link -yellow" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=32" rel="nofollow"><span class="label">Site Speed Increase</span> <span class="count">2<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="User Experience"> <input name="amshopby[tag][]" value="27" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d74ab9 link -brown" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=27" rel="nofollow"><span class="label">User Experience</span> <span class="count">30<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Ways to Return Users Back"> <input name="amshopby[tag][]" value="23" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d74b75 link -brown" data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=23" rel="nofollow"><span class="label">Ways to Return Users Back</span> <span class="count">6<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Hyva Checkout Ready"> <input name="amshopby[tag][]" value="97" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d74c32 link " data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?tag=97" rel="nofollow"><span class="label">Hyva Checkout Ready</span> <span class="count">135<span class="filter-count-label">items</span></span> </a> </li> </ol></form> </div></div> </div></div></div></div> <div class="products wrapper grid products-grid" data-amsite-js="category-page-list" data-amsite-analytics-js="category-page-list"><ol class="products list items product-items"> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-506 { background: #d6bdff }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/improved-layered-navigation-for-magento-2.html" class="product photo product-item-photo amsite-product-506 " aria-label="Improved Layered Navigation M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/i/m/improved-layered-navigation-for-magento-2_5.png" alt="Improved Layered Navigation for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-506-cat amasty-label-for-506" 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":"506","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "506", "selector": ".amasty-label-container-13-506-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-506-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="Improved Layered Navigation for Magento 2" alt="Improved Layered Navigation for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":506,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Improved Layered Navigation M2" aria-label="Improved Layered Navigation M2" href="https://amasty.com/improved-layered-navigation-for-magento-2.html">Improved Layered Navigation M2</a></strong> <div class="swatch-wrapper -round swatch-opt-506" data-role="swatch-option-506"></div> <!--short description--><div class="product description product-item-description"><a href="#choose_option" data-promo-id="banners-iln-m2" data-promo-name="Banners at ILN M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" style="margin-bottom: 20px;" /> </a> <p>Build the ultimate customer shopping experience and boost your store SEO rankings with a feature-rich navigation system. Display multiple filters and handy widgets to help visitors instantly find the products they need.</p> </div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Flexibly tailor filters' display to match your store needs</li> <li class="item">Use vertical and horizontal navigation blocks</li> <li class="item">Provide customers with extended filtering by Brands</li> <li class="item">Generate SEO-friendly URLs for your store pages</li> <li class="item">Create custom pages for specific filter results</li> <li class="item">Customize the color for selected filters</li> <li class="item">Speed up product filtering with AJAX</li> <li class="item"><strong>Hyva-ready</strong> storefront (<a href="https://improved-layered-navigation-hyva-m2.magento-demo.amasty.com/all-products" target="_blank">view demo >></a>)</li> <li class="item">Compatibility with <strong>Live Search</strong> for Enterprise and Cloud Editions</li> <li class="item">Hyva Checkout compatible by default </li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/improved-layered-navigation-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/improved-layered-navigation-for-magento-2.html#reviews" aria-label="Reviews" >84 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="506" data-price-box="product-id-506"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-506" data-price-amount="399" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$399</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="improved-layered-navigation-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/506/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="506"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNTA2Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Improved Layered Navigation for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Improved Layered Navigation for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-942 { background: #9ae9df }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/google-page-speed-optimizer-for-magento-2.html" class="product photo product-item-photo amsite-product-942 " aria-label="Google Page Speed Optimizer Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/g/o/google-page-speed-optimizer-for-magento-2_619b55c39bf05.png" alt="Google Page Speed Optimizer Pro for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-14-942-cat amasty-label-for-942" 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":"942","label":14,"margin":7,"alignment":0,"order":7,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "942", "selector": ".amasty-label-container-14-942-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-14-942-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="Google Page Speed Optimizer Pro for Magento 2" alt="Google Page Speed Optimizer Pro for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":942,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Google Page Speed Optimizer Pro M2" aria-label="Google Page Speed Optimizer Pro M2" href="https://amasty.com/google-page-speed-optimizer-for-magento-2.html">Google Page Speed Optimizer Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-942" data-role="swatch-option-942"></div> <!--short description--><div class="product description product-item-description"><a href="#choose_option" data-promo-id="optimizer-m2" data-promo-name="Google Page Speed Optimizer M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" /> </a></p> <p>Achieve higher scores in Google PageSpeed Insights with the Magento 2 Speed Optimization solution. Improve store performance to meet Google requirements and provide customers with a next-level shopping experience at the same time.</p> <br> </div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Optimize page experience on desktops and mobiles</li> <li class="item">Display images in the next-gen AVIF or WebP format </li> <li class="item">Automatically improve JS, CSS and HTML code structure</li> <li class="item">Compress media files and defer offscreen images using Lazy Load</li> <li class="item">Apply smart JS Bundling and Server Push</li> <li class="item">Explore the built-in diagnostics tool with <a href="https://youtu.be/AHn8ci1g-fw" target="_blank">configuration tips</a> </li> <li class="item">Speed up image optimization using Imagick library</li> <li class="item"><b>NEW:</b> Preload critical assets and resources</li> <li class="item">Compatibility with AWS Remote Storage </li> <li class="item">Hyva-ready storefront</li> <li class="item">Mage-OS compatible</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/google-page-speed-optimizer-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/google-page-speed-optimizer-for-magento-2.html#reviews" aria-label="Reviews" >24 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="942" data-price-box="product-id-942"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-942" data-price-amount="199" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$199</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="google-page-speed-optimizer-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/942/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="942"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvOTQyLw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Google Page Speed Optimizer Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Google Page Speed Optimizer Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-725 { background: #8ac0ff }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/one-step-checkout-for-magento-2.html" class="product photo product-item-photo amsite-product-725 " aria-label="One Step Checkout Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/o/n/one-step-checkout-for-magento-2_61c0864edb532.png" alt="One Step Checkout Pro for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-725-cat amasty-label-for-725" 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":"725","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "725", "selector": ".amasty-label-container-13-725-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-725-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="One Step Checkout Pro for Magento 2" alt="One Step Checkout Pro for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":725,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="One Step Checkout Pro M2" aria-label="One Step Checkout Pro M2" href="https://amasty.com/one-step-checkout-for-magento-2.html">One Step Checkout Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-725" data-role="swatch-option-725"></div> <!--short description--><div class="product description product-item-description"><a href="#choose_option" data-promo-id="banners-onestepcheckout-m2" data-promo-name="Banners at One Step Checkout M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" style="margin-bottom: 20px;" /> </a> <p>Increase your business’ revenue growth with a fast and customizable one-step checkout page. Provide shoppers with a smooth and clear checkout flow that will enhance the customer experience.</p></div><!--book-live-demo--> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Customize Magento 2 checkout page in a few clicks using drag-and-drop layout builder</li> <li class="item">Support multiple payment and shipping methods</li> <li class="item">Display delivery date and time options</li> <li class="item">Use onе of two customizable responsive themes</li> <li class="item">Increase average order value by offering extra service fees</li> <li class="item">Hyva-ready storefront</li> <li class="item">Mage-OS compatible</li> <li class="item"><a href="https://calendly.com/yuliya-simakovich/book-a-demo" rel="nofollow"><b>⏱Book a live demo</b></a></li> <li class="item"><p><a href="#see_examples"><b>View examples</b></a> of One Step Checkout on real stores.</p></li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/one-step-checkout-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/one-step-checkout-for-magento-2.html#reviews" aria-label="Reviews" >60 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="725" data-price-box="product-id-725"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-725" data-price-amount="289" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$289</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="single-step-checkout-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/725/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="725"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNzI1Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="One Step Checkout Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="One Step Checkout Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-649 { background: #9ae9df }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/special-promotions-pro-for-magento-2.html" class="product photo product-item-photo amsite-product-649 " aria-label="Special Promotions Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/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 Promotions Pro for Magento 2" alt="Special Promotions Pro for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":649,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Special Promotions Pro M2" aria-label="Special Promotions Pro M2" href="https://amasty.com/special-promotions-pro-for-magento-2.html">Special Promotions Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-649" data-role="swatch-option-649"></div> <!--short description--><div class="product description product-item-description"><p>Add our Magento 2 Advanced Promotions extension to shape your discounts with clever conditions. Create promotions based on customers' info and purchase history. Use 20 actions to be sure that your promotions are unique and relevant. </p></div><!--book-live-demo--> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Create 20+ promotion types for extraordinary deals</li> <li class="item">Use customer's attributes as rule conditions</li> <li class="item">Limit promotions based on customers' order history</li> <li class="item">Select the base price for discount calculation</li> <li class="item">Restrict promotions for products with special prices</li> <li class="item">Hyva-compatible by default</li> <li class="item">GraphQL Application Server compatible</li> <li class="item"><a href="https://calendly.com/yuliya-simakovich/book-a-demo" rel="nofollow"><b>⏱Book a live demo</b></a></li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/special-promotions-pro-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/special-promotions-pro-for-magento-2.html#reviews" aria-label="Reviews" >17 <span>Reviews</span></a></div> <!--start tmp block--> <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 tax 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> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="special-promotions-pro-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/649/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="649"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNjQ5Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Special Promotions Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Special Promotions Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-844 { background: #d6bdff }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/elasticsearch-for-magento-2.html" class="product photo product-item-photo amsite-product-844 " aria-label="Elastic Search M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/e/l/elasticsearch-for-magento-2_619b5b448d90d.png" alt="Elastic Search for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-844-cat amasty-label-for-844" 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":"844","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "844", "selector": ".amasty-label-container-13-844-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-844-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="Elastic Search for Magento 2" alt="Elastic Search for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":844,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Elastic Search M2" aria-label="Elastic Search M2" href="https://amasty.com/elasticsearch-for-magento-2.html">Elastic Search M2</a></strong> <div class="swatch-wrapper -round swatch-opt-844" data-role="swatch-option-844"></div> <!--short description--><div class="product description product-item-description"><p><a href="#choose_option" data-promo-id="banners-elastic-search-m2" data-promo-name="Banner Subscription Options at Elastic Search M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" style="margin-bottom: 20px;" /> </a></p> <a href="https://amasty.com/elasticsearch-engine-installation.html" data-promo-id="banner-short-description" data-promo-name="Banners in short description" data-promo-creative="from_elasticsearch_for_magento_2_to_elasticsearch_engine_installation" data-promo-position="banner_short_description"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/extensions/elasticsearch-for-magento-2/elasticsearch-banner.png" data-srcset="https://cdn.amasty.com/media/extensions/elasticsearch-for-magento-2/elasticsearch-banner-2.png 2x" alt="elasticsearch banner" title="elasticsearch banner in m2 extension" style="margin-bottom: 20px"></a> <p>Convert searches into sales with Elastic Search for Magento 2 module. Instantly show the most relevant search results to customers — guiding them to what they’re looking for quicker. </p> </div><!--book-live-demo--> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Full-text and full-website multilingual search</li> <li class="item">Partial search by SKU, name, attribute, or category</li> <li class="item">Autocomplete suggestions and typo corrections</li> <li class="item">Add alternate key words and words to ignore</li> <li class="item">Multi-store search</li> <li class="item">OpenSearch compatibility</li> <li class="item">Mobile-friendly</li> <li class="item">Hyva-ready storefront (<a href="https://elastic-search-hyva-m2.magento-demo.amasty.com/women/tops-women.html" target="_blank">view demo >></a>)</li> <li class="item"><a href="https://calendly.com/yuliya-simakovich/book-a-demo" rel="nofollow"><b>⏱Book a live demo</b></a></li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/elasticsearch-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/elasticsearch-for-magento-2.html#reviews" aria-label="Reviews" >14 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="844" data-price-box="product-id-844"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-844" data-price-amount="329" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$329</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="elasticsearch-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/844/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="844"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvODQ0Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Elastic Search for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Elastic Search for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-508 { background: #9ae9df }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/free-gift-for-magento-2.html" class="product photo product-item-photo amsite-product-508 " aria-label="Free Gift M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/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 Gift for Magento 2" alt="Free Gift for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":508,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Free Gift M2" aria-label="Free Gift M2" href="https://amasty.com/free-gift-for-magento-2.html">Free Gift M2</a></strong> <div class="swatch-wrapper -round swatch-opt-508" data-role="swatch-option-508"></div> <!--short description--><div class="product description product-item-description"><a href="#pricing" observed-link-tab data-promo-id="banners-freegift-m2" data-promo-name="Banners at Free Gift M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_pro.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_pro_2x.png 2x" alt="See available pricing options!" style="margin-bottom: 20px;" /> </a> <p>Create a great variety of promo campaigns with Magento 2 free gifts in your store to boost both sales and customers’ loyalty. Show catchy banners to inform customers about special offers and let visitors select a gift among available promo items.</p> </div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Get 5 additional promo actions</li> <li class="item">Add informative banners and labels to product pages</li> <li class="item">Create an unlimited number of rules with free gifts</li> <li class="item">Display a Free Gift Bar to show the amount left until free gift</li> <li class="item">Get a full overview of promotions performance via handy dashboard</li> <li class="item">Create sense of urgency and streamline purchases with Countdown Timer</li> <li class="item">Add free gifts manually from the admin panel</li> <li class="item">WCAG compliance for Luma Theme</li> <li class="item">Mage-OS compatible</li> <li class="item"><strong>Hyva-ready</strong> storefront (<a href="https://free-gift-hyva-m2.magento-demo.amasty.com/checkout/cart//">view demo >></a>)</li> <li class="item">GraphQL Application Server compatible</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.8</p><a href="https://amasty.com/free-gift-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="80%" stop-color="#fcd34d"/><stop offset="80%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/free-gift-for-magento-2.html#reviews" aria-label="Reviews" >11 <span>Reviews</span></a></div> <!--start tmp block--> <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 tax 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> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="free-gift-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/508/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="508"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNTA4Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Free Gift for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Free Gift for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-793 { background: #b4f3d5 }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/seo-toolkit-for-magento-2.html" class="product photo product-item-photo amsite-product-793 " aria-label="SEO Toolkit Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/s/e/seo-toolkit-for-magento-2_61a0985238d1b.png" alt="SEO Toolkit Pro for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-793-cat amasty-label-for-793" 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":"793","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "793", "selector": ".amasty-label-container-13-793-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-793-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="SEO Toolkit Pro for Magento 2" alt="SEO Toolkit Pro for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":793,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="SEO Toolkit Pro M2" aria-label="SEO Toolkit Pro M2" href="https://amasty.com/seo-toolkit-for-magento-2.html">SEO Toolkit Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-793" data-role="swatch-option-793"></div> <!--short description--><div class="product description product-item-description"><a href="#choose_option" data-promo-id="banners-seotoolkit-m2" data-promo-name="Banners at Seo Toolkit M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" style="margin-bottom: 20px;" /> </a> <p>Our Magento 2 SEO extension is an all-in-one solution designed to make your store take top positions in Google Search. Drive more organic traffic while saving money on paid ads. Maximize effectiveness by getting full control over every SEO-related feature.</p> </div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Eliminate duplicate content with unique product URLs</li> <li class="item">Highlight more information in search with rich snippets</li> <li class="item">Mass-optimize pages meta values with SEO templates</li> <li class="item">Connect all relevant pages with automatic cross-linking</li> <li class="item">Enhance store indexation with HTML and XML sitemaps</li> <li class="item">Avoid broken links with smart redirects</li> <li class="item">Monitor any page SEO health in real-time</li> <li class="item">Hyva-ready storefront</li> <li class="item">Hyvä Checkout compatible by default</li> <li class="item">Mage-OS compatible</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <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/seo-toolkit-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="95%" stop-color="#fcd34d"/><stop offset="95%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/seo-toolkit-for-magento-2.html#reviews" aria-label="Reviews" >18 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="793" data-price-box="product-id-793"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-793" data-price-amount="349" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$349</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="seo-toolkit-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/793/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="793"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNzkzLw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="SEO Toolkit Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="SEO Toolkit Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-521 { background: #f8bcf2 }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/product-feed-for-magento-2.html" class="product photo product-item-photo amsite-product-521 " aria-label="Product Feed M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/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 Feed for Magento 2" alt="Product Feed for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":521,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Product Feed M2" aria-label="Product Feed M2" href="https://amasty.com/product-feed-for-magento-2.html">Product Feed M2</a></strong> <div class="swatch-wrapper -round swatch-opt-521" data-role="swatch-option-521"></div> <!--short description--><div class="product description product-item-description"><p>Equip your store with an agile and highly intuitive feeds generator. Add Magento 2 Product Feed to promote your products cost-effectively and grow revenue thanks to extra sales channels. Create an unlimited number of custom feeds without technical skills, using our Magento Google shopping feed. </p> </div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Easily generate product feeds with ready-to-use templates</li> <li class="item">Use Wizard to set up Google and Facebook feeds quickly</li> <li class="item">Add condition-based attributes to your feeds</li> <li class="item">Set up the schedule for automatic feed generation</li> <li class="item">Track your sales efficiency with Google Analytics</li> <li class="item">Merge various attributes into one</li> <li class="item">🔥 <b>NEW:</b> <a href="#google-wizard">Automatically upload feeds to Google Merchant Center via API</a> </li> <li class="item">💎 New ready-made templates for TikTok, Instagram, Pinterest, Facebook, and eBay</li> <li class="item">Hyva-compatible by default</li> <li class="item">Hyvä Checkout ready</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/product-feed-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/product-feed-for-magento-2.html#reviews" aria-label="Reviews" >21 <span>Reviews</span></a></div> <!--start tmp block--> <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 tax 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> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="product-feed-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/521/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="521"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNTIxLw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Product Feed for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Product Feed for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-690 { background: #9ae9df }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/blog-pro-for-magento-2.html" class="product photo product-item-photo amsite-product-690 " aria-label="Blog Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/b/l/blog-pro-for-magento-2.png" alt="Blog Pro for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-14-690-cat amasty-label-for-690" 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":"690","label":14,"margin":7,"alignment":0,"order":7,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "690", "selector": ".amasty-label-container-14-690-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-14-690-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="Blog Pro for Magento 2" alt="Blog Pro for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":690,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Blog Pro M2" aria-label="Blog Pro M2" href="https://amasty.com/blog-pro-for-magento-2.html">Blog Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-690" data-role="swatch-option-690"></div> <!--short description--><div class="product description product-item-description"><p> Drive more targeted traffic to your store with Magento 2 Blog Pro extension. Power up your promotion strategy by sharing engaging content that converts visitors into customers and ranks higher on Google.</p></div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Flexibly customize your blog page layouts, fonts, widgets and structure</li> <li class="item">Utilize multi-level category tree and tags for convenient blog navigation</li> <li class="item">Display blog menu as a dropdown with categories</li> <li class="item">Make your blog more visible in Google search using built-in SEO features</li> <li class="item">Promote related products on blog post pages</li> <li class="item">Import and Export blog posts, categories, tags, authors, etc.</li> <li class="item">Provide a smooth and fast reading on mobiles with AMP</li> <li class="item">Hyva-ready storefront (<a href="https://blog-pro-hyva-m2.magento-demo.amasty.com/blog.html" target="_blank">view demo >></a>) </li> <li class="item">Hyva checkout compatible by default</li> <li class="item">Integration with Amasty <a href="https://amasty.com/chatgpt-ai-content-for-magento-2.html" target="_blank">AI Content Generator</a></li> <li class="item">Mage-OS compatible</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.8</p><a href="https://amasty.com/blog-pro-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="75%" stop-color="#fcd34d"/><stop offset="75%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/blog-pro-for-magento-2.html#reviews" aria-label="Reviews" >19 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="690" data-price-box="product-id-690"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-690" data-price-amount="349" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$349</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="blog-pro-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/690/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="690"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNjkwLw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Blog Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Blog Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-2202 { background: #f2f996 }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/google-tag-manager-for-magento-2.html" class="product photo product-item-photo amsite-product-2202 " aria-label="Google Analytics 4 with GTM Support M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/i/c/icon-google-tag-manager-for-magento-2.png" alt="Google Analytics 4 with GTM Support for Magento 2"/></span></span></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":2202,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Google Analytics 4 with GTM Support M2" aria-label="Google Analytics 4 with GTM Support M2" href="https://amasty.com/google-tag-manager-for-magento-2.html">Google Analytics 4 with GTM Support M2</a></strong> <div class="swatch-wrapper -round swatch-opt-2202" data-role="swatch-option-2202"></div> <!--short description--><div class="product description product-item-description">Unlock the full potential of your Magento store with the seamless integration to Google Analytics 4. Get access to a variety of built-in events and extended performance reports. Use Magento 2 Google Analytics extension to gain valuable insights into every stage of customer journey and make informed business decisions.<br><br></div><!--book-live-demo--> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Track product impressions & clicks</li> <li class="item">Observe shopping cart & checkout events</li> <li class="item">Discover promotions performance</li> <li class="item">Gain deeper insights with Custom Dimensions</li> <li class="item">Generate JSON file with a single click</li> <li class="item">Use Server-Side or Client-Side tracking </li> <li class="item">Track Google AdWords conversions and remarketing</li> <li class="item">Activate Dynamic Remarketing tracking</li> <li class="item">Enable Enhanced Conversion with user-provided data </li> <li class="item">Cookie Consent (GDPR) compliant, including Google <a href="#consent_mode_v2">Consent Mode V2</a></li> <li class="item">Hyvä-ready storefront and Hyvä Checkout ready</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <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/google-tag-manager-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/google-tag-manager-for-magento-2.html#reviews" aria-label="Reviews" >5 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="2202" data-price-box="product-id-2202"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-2202" data-price-amount="229" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$229</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="google-tag-manager-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/2202/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="2202"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvMjIwMi8~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Google Analytics 4 with GTM Support for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Google Analytics 4 with GTM Support for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-643 { background: #9ae9df }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/automatic-related-products-for-magento-2.html" class="product photo product-item-photo amsite-product-643 " aria-label="Automatic Related Products M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/a/u/automatic-related-products-for-magento-2_26.png" alt="Automatic Related Products for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-643-cat amasty-label-for-643" 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":"643","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "643", "selector": ".amasty-label-container-13-643-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-643-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="Automatic Related Products for Magento 2" alt="Automatic Related Products for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":643,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Automatic Related Products M2" aria-label="Automatic Related Products M2" href="https://amasty.com/automatic-related-products-for-magento-2.html">Automatic Related Products M2</a></strong> <div class="swatch-wrapper -round swatch-opt-643" data-role="swatch-option-643"></div> <!--short description--><div class="product description product-item-description"><p>Magento 2 Related Products extension is the tool dynamically showcase related product offers on the website, thus motivating customers to complement their orders with extra items. Flexibly adjust rules and conditions to enable smart personalized recommendations similarly to AI-driven solutions. </p></div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Use smart rule-based algorithm to offer related items, up-sells, and cross-sells</li> <li class="item">Show related products based on history of views or purchases</li> <li class="item">Display items on category, product, shopping cart pages, and custom positions</li> <li class="item">Offer bundle packs with fixed or percentage discount</li> <li class="item">Create a specified CMS page with all bundles</li> <li class="item">Monitor related offers efficiency with advanced analytics</li> <li class="item">Import and Export bundle packs data</li> <li class="item">Hyva-ready storefront (<a href="https://automatic-related-products-hyva-m2.magento-demo.amasty.com/breathe-easy-tank.html" target="_blank">view demo >></a>)</li> <li class="item">Hyva Checkout ready</li> <li class="item">Mage-OS compatible</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/automatic-related-products-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/automatic-related-products-for-magento-2.html#reviews" aria-label="Reviews" >23 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="643" data-price-box="product-id-643"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-643" data-price-amount="309" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$309</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="automatic-related-products-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/643/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="643"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNjQzLw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Automatic Related Products for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Automatic Related Products for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-857 { background: #f2f996 }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/gdpr-for-magento-2.html" class="product photo product-item-photo amsite-product-857 " aria-label="GDPR Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/g/d/gdpr-for-magento-2_625009f556deb.png" alt="GDPR Pro for Magento 2"/></span></span> <div class="amasty-label-container amasty-label-container-13-857-cat amasty-label-for-857" 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":"857","label":13,"margin":7,"alignment":0,"order":5,"redirect_url":"","tooltip":{"backgroundColor":"","color":"","status":1,"content":""}}, "productId": "857", "selector": ".amasty-label-container-13-857-cat" }}'><div class="amlabel-text"></div> <img id="amasty-label-image-13-857-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="GDPR Pro for Magento 2" alt="GDPR Pro for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":857,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="GDPR Pro M2" aria-label="GDPR Pro M2" href="https://amasty.com/gdpr-for-magento-2.html">GDPR Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-857" data-role="swatch-option-857"></div> <!--short description--><div class="product description product-item-description"><a href="#choose_option" data-promo-id="banners-gdpr-m2" data-promo-name="Banners at GDPR M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" style="margin-bottom: 20px;"> </a> <p>The Magento 2 GDPR extension is designed to help online stores comply with the latest legislative EU requirements and strengthen data security and privacy. Make sure that your site collects all required user consents to avoid penalties and protect your business.</p></div><!--book-live-demo--> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Comply with GDPR, CNIL and LGPD requirements</li> <li class="item">Obtain and record multiple users’ consent on various pages</li> <li class="item">Get cookie consents with an advanced popup</li> <li class="item">Let customers manage their personal data in personal accounts</li> <li class="item">Save personal data in recent documentation</li> <li class="item">Activate Google <a href="#consent_mode">Consent Mode V2</a></li> <li class="item">Use <a href="https://amasty.com/pwa-add-on-for-gdpr-for-magento-2.html">PWA add-on</a> for enhanced mobile performance</li> <li class="item">Hyva-ready storefront (<a href="https://gdpr-hyva-m2.magento-demo.amasty.com/gear/watches.html" target="_blank" rel="nofollow">view demo >></a>) </li> <li class="item"><strong>New!</strong> Hyvä Checkout ready</li> <li class="item"><a href="#wcag_compliance">✔️ ADA & WCAG compliant</a></li> <li class="item"><a href="https://calendly.com/yuliya-simakovich/book-a-demo" rel="nofollow"><b>⏱Book a live demo</b></a></li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/gdpr-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/gdpr-for-magento-2.html#reviews" aria-label="Reviews" >11 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="857" data-price-box="product-id-857"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-857" data-price-amount="279" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$279</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="gdpr-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/857/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="857"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvODU3Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="GDPR Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="GDPR Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-945 { background: #c4d2ff }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/shipping-suite-for-magento-2.html" class="product photo product-item-photo amsite-product-945 " aria-label="Shipping Suite Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/s/h/shipping-suite-for-magento-2.png" alt="Shipping Suite Pro for Magento 2"/></span></span></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":945,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Shipping Suite Pro M2" aria-label="Shipping Suite Pro M2" href="https://amasty.com/shipping-suite-for-magento-2.html">Shipping Suite Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-945" data-role="swatch-option-945"></div> <!--short description--><div class="product description product-item-description"><a href="#choose_option" data-promo-id="banners-shippingsuite-m2" data-promo-name="Banners at Shipping Suite M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" style="margin-bottom: 20px;" /> </a> <p>Take your delivery process under full control with Magento shipping software. Use the synergetic work of the 3 smart managing tools: shipping table rates, rules, and restrictions. </p></div><!--book-live-demo--> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Create an unlimited number of custom shipping options</li> <li class="item">Assign rates to specific products and product groups</li> <li class="item">Add rules and restrictions based on a variety of attributes</li> <li class="item">Allow customers to choose a suitable delivery date and time </li> <li class="item">Calculate delivery price based on volumetric weight</li> <li class="item"><b>Hyva-ready</b> storefront</li> <li class="item">Mage-OS compatible</li> <li class="item"><a href="https://calendly.com/yuliya-simakovich/book-a-demo" rel="nofollow"><b>⏱Book a live demo</b></a></li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/shipping-suite-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#fcd34d"/><stop offset="90%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/shipping-suite-for-magento-2.html#reviews" aria-label="Reviews" >9 <span>Reviews</span></a></div> <!--start tmp block--> <div class="price-box price-final_price" data-role="priceBox" data-product-id="945" data-price-box="product-id-945"> <span class="normal-price"> <span class="price-container price-final_price tax weee" > <span id="product-price-945" data-price-amount="499" data-price-type="finalPrice" class="price-wrapper " ><span class="price">$499</span></span> </span></span> </div> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="shipping-suite-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/945/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="945"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvOTQ1Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Shipping Suite Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Shipping Suite Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-538 { background: #9ae9df }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/product-labels-for-magento-2.html" class="product photo product-item-photo amsite-product-538 " aria-label="Product Labels M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/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 Labels for Magento 2" alt="Product Labels for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":538,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Product Labels M2" aria-label="Product Labels M2" href="https://amasty.com/product-labels-for-magento-2.html">Product Labels M2</a></strong> <div class="swatch-wrapper -round swatch-opt-538" data-role="swatch-option-538"></div> <!--short description--><div class="product description product-item-description"><p>Add Magento 2 Product Labels extension to highlight new arrivals, as well as special products and offers. Immediately draw customers' attention and grow sales up to 55%. Automatically run several marketing campaigns at a time!</p></div><!--book-live-demo--> <div class="amsite-live-demo"><a class="book-live-demo" href="https://calendly.com/yuliya-simakovich/book-a-demo" title="Book a Live Demo" aria-label="Book a Live Demo" rel="nofollow" target="_blank">Book a Live Demo <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right"/></svg></a></div> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Design catchy labels with ready-made shapes</li> <li class="item">Show various labels to different customer groups</li> <li class="item">Use flexible conditions for the labels display</li> <li class="item">Edit labels and сheck them with the preview option </li> <li class="item">Show several labels on one product</li> <li class="item">Hyva-ready storefront (<a href="https://product-labels-hyva-m2.magento-demo.amasty.com/women/tops-women.html" target="_blank">view demo >></a>)</li> <li class="item"><a href="#wcag_compliance">✔️ ADA & WCAG compliant</a></li> <li class="item">Compatibility with <strong>Live Search</strong> for Cloud Edition</li> <li class="item">Mage-OS compatible</li> <li class="item">Hyva Checkout compatible by default</li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/product-labels-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/product-labels-for-magento-2.html#reviews" aria-label="Reviews" >19 <span>Reviews</span></a></div> <!--start tmp block--> <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 tax 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> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="product-labels-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/538/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="538"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNTM4Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Product Labels for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Product Labels for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> <li class="item product product-item"><div class="product-item-info" data-amtheme-js="product" data-container="product-grid"> <style> .product-item-info:hover .amsite-product-728 { background: #9ae9df }</style> <img class="lazy hyva-label-top-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" data-src="https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/Amasty_CatalogCustomization/images/hyva/label.png" width="40" height="40" alt="Hyva compatibility" > <div class="product-photo-wrapper"><a href="https://amasty.com/gift-card-for-magento-2.html" class="product photo product-item-photo amsite-product-728 " aria-label="Gift Card Pro M2" tabindex="-1"> <span class="product-image-container" style="width:430px;"><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/dd7f24249e71a20e1c3a482e18db1167/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 Card Pro for Magento 2" alt="Gift Card Pro for Magento 2" ></div></a> <div class="amtheme-icons-position -top-left"> <div class="amtheme-compare amtheme-icon-wrapper -top-left-hover"></div></div> <div class="amtheme-icons-position -bottom-left"> <div class="amtheme-wishlist amtheme-icon-wrapper -bottom-left"> <div class="towishlist-wrap"><a href="#" class="action towishlist amtheme-circle-icon" title="Add to Wish List" aria-label="Add to Wish List" data-post='{"action":"https:\/\/amasty.com\/wishlist\/index\/add\/","data":{"product":728,"uenc":"aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~"}}' data-action="add-to-wishlist" role="button"><svg class="amtheme-icon -hover-bg" focusable="false"><use xlink:href="#icon-wishlist" /></svg></a></div> </div> </div> <div class="amtheme-icons-position -bottom-right"> </div> </div><div class="product details product-item-details"><strong class="product name product-item-name"><a class="product-item-link" title="Gift Card Pro M2" aria-label="Gift Card Pro M2" href="https://amasty.com/gift-card-for-magento-2.html">Gift Card Pro M2</a></strong> <div class="swatch-wrapper -round swatch-opt-728" data-role="swatch-option-728"></div> <!--short description--><div class="product description product-item-description"><a href="#choose_option" data-promo-id="gift-card-m2" data-promo-name="Gift Card M2" data-promo-creative="banner_see_subscription_options" data-promo-position="banner_short_description"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=" class="lazy" data-src="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_prem.png" data-srcset="https://cdn.amasty.com/media/marketing/m2/banners-for-compatibilities/pricing_premi_2x.png 2x" alt="See available pricing options!" /> </a> <p>Discover the omnichannel gift card program to streamline audience growth with Magento 2 Gift Card extension and win the market. Double sales and retain customers by providing advanced gifting options. Offer no-contact certificates that can be cashed-out later to grow revenue and keep business stable even during the lockdowns.</p> </div><!--book-live-demo--> <!--features--> <div class="amsite-features-block" data-mage-init='{"amViewMore":{}}'><div class="amsite-view" data-amsite-js="view-features" title="View features" aria-label="View features">View features</div><ul class="amsite-list" data-amsite-js="list-features"> <li class="item">Create gift cards with fixed or open amount price types of single or multiple usages</li> <li class="item">Ensure <a href="#performance_info">stable performance</a> while generating and uploading gift codes</li> <li class="item">Keep track of all purchased vouchers</li> <li class="item">Get a set of 15+ ready-to-use gift card images for different occasions</li> <li class="item">Add barcodes</li> <li class="item">Import and export gift card info</li> <li class="item">Return gift card balance during refunds</li> <li class="item">Compatibility with AWS Remote Storage</li> <li class="item">Compatibility with <strong>Live Search</strong> for Enterprise and Cloud editions</li> <li class="item">ADA & WCAG compliant (for Luma Theme)</li> <li class="item">Hyva-ready storefront (<a href="https://gift-card-hyva-m2.magento-demo.amasty.com/gift-cards.html" target="_blank" rel="nofollow">view demo >></a>) </li> <li class="item">Hyvä Checkout ready</li> <li class="item">Mage-OS compatible</li> <li class="item"><a href="https://calendly.com/yuliya-simakovich/book-a-demo" rel="nofollow"><b>⏱Book a live demo</b></a></li> <li class="amsite-hide" data-amsite-js="hide-features" title="Hide features" aria-label="Hide features">Hide features</li></ul></div></div><div class="product-item-inner "> <div class="product-reviews-summary short flex gap-2"><p class="mb-0 am-text-small font-bold">4.9</p><a href="https://amasty.com/gift-card-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" viewBox="0 0 20 20" fill="currentColor" class="w-5 h-5" aria-hidden="true"><defs><linearGradient id="amPartialFill"><stop offset="0%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#fcd34d"/><stop offset="85%" stop-color="#d1d5db"/><stop offset="100%" stop-color="#d1d5db"/></linearGradient></defs><g fill="url(#amPartialFill)"><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> </a> <a class="am-text-small link-as-text" data-amsite-js="scroll-open-tab" data-tab-destination="reviews" href="https://amasty.com/gift-card-for-magento-2.html#reviews" aria-label="Reviews" >12 <span>Reviews</span></a></div> <!--start tmp block--> <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 tax 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> <!--end tmp block--><div class="product actions product-item-actions" ><div class="actions-primary" > <!--start tmp block--> <form data-role="tocart-form" data-product-sku="gift-card-for-magento-2" action="https://amasty.com/checkout/cart/add/uenc/aHR0cHM6Ly9hbWFzdHkuY29tL21hZ2VudG8tMi1leHRlbnNpb25zLmh0bWw~/product/728/" data-amtheme-js="ajax-tocart" method="post"> <input type="hidden" name="product" value="728"><input type="hidden" name="uenc" value="aHR0cHM6Ly9hbWFzdHkuY29tL2NoZWNrb3V0L2NhcnQvYWRkL3VlbmMvYUhSMGNITTZMeTloYldGemRIa3VZMjl0TDIxaFoyVnVkRzh0TWkxbGVIUmxibk5wYjI1ekxtaDBiV3d-L3Byb2R1Y3QvNzI4Lw~~"> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /> <button type="submit" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Gift Card Pro for Magento 2" title="Add to Cart" class="action tocart primary"><span class="amtheme-title" data-amsite-analytics-js="btn-add-to-cart-on-category-page" data-product-name-analytics="Gift Card Pro for Magento 2">Add to Cart</span></button></form> <!--end tmp block--></div></div></div></div></li> </ol></div> <div class="toolbar toolbar-products" data-mage-init='{"productListToolbarForm":{"mode":"product_list_mode","direction":"product_list_dir","order":"product_list_order","limit":"product_list_limit","modeDefault":"grid","directionDefault":"asc","orderDefault":"position","limitDefault":15,"url":"https:\/\/amasty.com\/magento-2-extensions.html","formKey":"s26Veii2LgQQnfiP","post":false}}'> <nav class="pages" aria-label="Pagination"> <ul class="items pages-items"> <li class="item current"><strong class="page"><span class="label">You're currently reading page</span> 1</strong></li> <li class="item"><a href="https://amasty.com/magento-2-extensions.html?p=2" class="page" title="Page 2" aria-label="Page 2"><span class="label">Page</span> 2</a></li> <li class="item"><a href="https://amasty.com/magento-2-extensions.html?p=3" class="page" title="Page 3" aria-label="Page 3"><span class="label">Page</span> 3</a></li> <li class="item"><a href="https://amasty.com/magento-2-extensions.html?p=4" class="page" title="Page 4" aria-label="Page 4"><span class="label">Page</span> 4</a></li> <li class="item"><a href="https://amasty.com/magento-2-extensions.html?p=5" class="page" title="Page 5" aria-label="Page 5"><span class="label">Page</span> 5</a></li> </ul> <a class="action next" href="https://amasty.com/magento-2-extensions.html?p=2" title="Next" aria-label="Next"><span class="label">Page</span> <span>Next</span> <svg class="amtheme-icon" focusable="false"><use xlink:href="#icon-arrow-right-min"></use></svg></a> </nav> <div id="am-page-count" style="display: none">18</div> </div> </div> <div class="amshopby-filters-bottom-cms"></div> <div data-am-js="js-init"></div><div class="category-view"> <div class="category-description"><p></p> <!--separator--> <div class="section"> <div class="section-container section-content"> <div class="text-block"> <p>Do you need to buy a new Magento 2 module?</p> <p>Are you looking for additional features for your Magento 2 webshop?</p> <p>Do you need Magento 2 plugins with a high-quality code?</p> <p>At Amasty store you can choose from 150+ Magento 2 extensions. We <a href="https://amasty.com/blog/how-we-develop-magento-extensions/">develop our plugins</a> according to the latest Magento standards, test their functionality to make sure they’re ready for the release and support the buyers offering relevant solutions.</p> <p>All our plugins are designed to meet the needs of Magento 2 owners and solve their problems. We gather our client’s requests for new features, <a href="https://amasty.com/blog/how-we-develop-magento-extensions-part-2/">analyze</a> and implement them in our Magento 2 premium extensions. So, in case you've bought a module and miss any functionality, fill in the <a href="https://products.amasty.com/feature-request">feature request</a> and we will consider it asap.</p> <p>We offer Magento 2 modules by Amasty for all e-commerce aspects:</p> <ol> <li><a href="https://amasty.com/b2b-extensions-for-magento-2.html">B2B Products</a></li> <li><a href="https://amasty.com/usability-navigation-extensions-for-magento-2.html">Navigation & Search</a></li> <li><a href="https://amasty.com/catalog-management-extensions-for-magento-2.html">Catalog Management</a></li> <li><a href="https://amasty.com/promotions-extensions-for-magento-2.html">Promotions</a></li> <li><a href="https://amasty.com/shipping-extensions-for-magento-2.html">Shipping</a></li> <li><a href="https://amasty.com/order-management-extensions-for-magento-2.html">Order Management</a></li> <li><a href="https://amasty.com/seo-optimization-extensions-for-magento-2.html">SEO</a></li> <li><a href="https://amasty.com/checkout-extensions-for-magento-2.html">Checkout</a></li> <li><a href="https://amasty.com/images-media-extensions-for-magento-2.html">Images & Media</a></li> </ol> <p>You can find plugins and applications for Magento 2 stores with only vanilla or advanced features. Many of our plugins have add-ons with additional functionality. And we are constantly working on extending the list of best magento 2 extensions that can help you build an e-store meeting current market needs. See the list of upcoming plugins and offer ideas in our public <a href="https://trello.com/b/mGKdSV3a/%F0%9F%9A%A9-amasty-product-roadmap-%F0%9F%9A%A9">Product Roadmap</a>.</p> <p>You can also get <a href="https://amasty.com/magento-support-subscription-service.html">Ultimate Support</a> starting at 1,5$/day. One subscription covers all extensions in your account with: <p>- Support, installation, configuration and assistance in Slack</p> <p>- Access to all updates for products purchased before Feb1, 2022</p><p> <p>Reach your best results with Amasty’s Magento 2 commerce extensions!</p> <p><strong>Note</strong>: See what <a href="https://amasty.com/blog/infographics-top-30-features-for-online-store/">30 features any online store</a> should have.</p> <h3>What is a Magento plugin?</h3> <p>A Magento plugin is a piece of code that extends or customizes the functionality of a Magento store without modifying the core code. Plugins are used to add new features, integrate with third-party services, or modify existing functionality in a maintainable way, enhancing the functionality of eCommerce stores to meet specific business requirements.</p> </div> </div> </div></div></div></div><div class="sidebar sidebar-main"> <div class="block filter" data-mage-init='{ "collapsible": { "openedState": "active", "collapsible": true, "active": false, "collateral": { "openedState": "filter-active", "element": "body" } }, "amLayeredNavigationMobile":{} }'><button class="action button-as-link amtheme-close" type="button" data-amtheme-js="layered-close" aria-label="Close filter" title="Close filter"><svg class="amtheme-icon -close"><use xlink:href="#icon-close"/></svg></button> <div class="block-title filter-title" data-role="title" data-count="0">Shop By</div><div class="block-content filter-content"> <strong role="heading" aria-level="2" class="block-subtitle filter-subtitle">Filters</strong> <div class="filter-options" id="narrow-by-list" data-role="content" data-amtheme-js="navigation-filter" data-mage-init='{ "accordion": { "openedState": "-active", "collapsible": true, "active": false, "animate": { "duration": 200 }, "multipleCollapsible": false }}'> <div data-role="collapsible" class="filter-options-item" data-amtheme-js="navigation-filter-item"><div data-role="title" class="filter-options-title -category">Category</div><div data-role="content" class="filter-options-content"> <form data-amshopby-filter="category_ids" data-amshopby-filter-request-var="cat"><ul class="items am-filter-items-category_ids am-labels-folding -am-singleselect" > <li class="item -is-collapsible -is-expanded -filter-parent" data-label="All"> <a class="am-filter-item-67bea95d9457b amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="All" title="All" href="https://amasty.com/magento-2-extensions.html" > <span class="label">All</span> <span class="count">261<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="25" type="radio" aria-label="All" checked /><span class="amshopby-choice"></span> <ul class="items items-children level-1 -folding"> <li class="item -is-expanded -filter-parent" data-label="Featured Extensions"> <a class="am-filter-item-67bea95d94792 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Featured Extensions" title="Featured Extensions" href="https://amasty.com/featured-extensions-for-magento-2.html" > <span class="label">Featured Extensions</span> <span class="count">15<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="80" type="radio" aria-label="Featured Extensions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Hyva Theme Extensions"> <a class="am-filter-item-67bea95d94908 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Hyva Theme Extensions" title="Hyva Theme Extensions" href="https://amasty.com/hyva-theme-extensions-for-magento-2.html" > <span class="label">Hyva Theme Extensions</span> <span class="count">162<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="83" type="radio" aria-label="Hyva Theme Extensions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Hyva Checkout Ready"> <a class="am-filter-item-67bea95d94a43 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Hyva Checkout Ready" title="Hyva Checkout Ready" href="https://amasty.com/hyva-checkout-ready-extensions-for-magento-2.html" > <span class="label">Hyva Checkout Ready</span> <span class="count">135<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="109" type="radio" aria-label="Hyva Checkout Ready" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Navigation &amp; Search"> <a class="am-filter-item-67bea95d94b74 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Navigation &amp; Search" title="Navigation &amp; Search" href="https://amasty.com/usability-navigation-extensions-for-magento-2.html" > <span class="label">Navigation & Search</span> <span class="count">21<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="26" type="radio" aria-label="Navigation &amp; Search" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Catalog Management"> <a class="am-filter-item-67bea95d94ca0 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Catalog Management" title="Catalog Management" href="https://amasty.com/catalog-management-extensions-for-magento-2.html" > <span class="label">Catalog Management</span> <span class="count">34<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="28" type="radio" aria-label="Catalog Management" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Checkout"> <a class="am-filter-item-67bea95d94dc4 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Checkout" title="Checkout" href="https://amasty.com/checkout-extensions-for-magento-2.html" > <span class="label">Checkout</span> <span class="count">27<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="35" type="radio" aria-label="Checkout" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Google Extensions"> <a class="am-filter-item-67bea95d94ee3 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Google Extensions" title="Google Extensions" href="https://amasty.com/google-extensions-for-magento-2.html" > <span class="label">Google Extensions</span> <span class="count">17<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="110" type="radio" aria-label="Google Extensions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Law-Based Extensions"> <a class="am-filter-item-67bea95d95000 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Law-Based Extensions" title="Law-Based Extensions" href="https://amasty.com/law-based-extensions-for-magento-2.html" > <span class="label">Law-Based Extensions</span> <span class="count">8<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="112" type="radio" aria-label="Law-Based Extensions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Shipping"> <a class="am-filter-item-67bea95d95128 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Shipping" title="Shipping" href="https://amasty.com/shipping-extensions-for-magento-2.html" > <span class="label">Shipping</span> <span class="count">19<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="30" type="radio" aria-label="Shipping" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="SEO"> <a class="am-filter-item-67bea95d95244 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="SEO" title="SEO" href="https://amasty.com/seo-optimization-extensions-for-magento-2.html" > <span class="label">SEO</span> <span class="count">29<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="33" type="radio" aria-label="SEO" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Promotions"> <a class="am-filter-item-67bea95d95361 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Promotions" title="Promotions" href="https://amasty.com/promotions-extensions-for-magento-2.html" > <span class="label">Promotions</span> <span class="count">44<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="29" type="radio" aria-label="Promotions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Social Network Integrations"> <a class="am-filter-item-67bea95d95494 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Social Network Integrations" title="Social Network Integrations" href="https://amasty.com/social-extensions-for-magento-2.html" > <span class="label">Social Network Integrations</span> <span class="count">7<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="106" type="radio" aria-label="Social Network Integrations" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Images &amp; Media"> <a class="am-filter-item-67bea95d955a9 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Images &amp; Media" title="Images &amp; Media" href="https://amasty.com/images-media-extensions-for-magento-2.html" > <span class="label">Images & Media</span> <span class="count">15<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="36" type="radio" aria-label="Images &amp; Media" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Order Management"> <a class="am-filter-item-67bea95d956bd amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Order Management" title="Order Management" href="https://amasty.com/order-management-extensions-for-magento-2.html" > <span class="label">Order Management</span> <span class="count">28<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="32" type="radio" aria-label="Order Management" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Administration"> <a class="am-filter-item-67bea95d957ee amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Administration" title="Administration" href="https://amasty.com/administration-extensions-for-magento-2.html" > <span class="label">Administration</span> <span class="count">25<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="82" type="radio" aria-label="Administration" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="B2B Products"> <a class="am-filter-item-67bea95d9590d amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="B2B Products" title="B2B Products" href="https://amasty.com/b2b-extensions-for-magento-2.html" > <span class="label">B2B Products</span> <span class="count">27<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="61" type="radio" aria-label="B2B Products" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Import &amp; Export"> <a class="am-filter-item-67bea95d95a22 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Import &amp; Export" title="Import &amp; Export" href="https://amasty.com/import-export-extensions-for-magento-2.html" > <span class="label">Import & Export</span> <span class="count">7<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="81" type="radio" aria-label="Import &amp; Export" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="AI-Powered Extensions"> <a class="am-filter-item-67bea95d95b32 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="AI-Powered Extensions" title="AI-Powered Extensions" href="https://amasty.com/ai-extensions-for-magento-2.html" > <span class="label">AI-Powered Extensions</span> <span class="count">3<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="103" type="radio" aria-label="AI-Powered Extensions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="PWA Extensions"> <a class="am-filter-item-67bea95d95c51 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="PWA Extensions" title="PWA Extensions" href="https://amasty.com/pwa-extensions-for-magento-2.html" > <span class="label">PWA Extensions</span> <span class="count">20<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="62" type="radio" aria-label="PWA Extensions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Free Magento 2 Extensions"> <a class="am-filter-item-67bea95d95d63 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Free Magento 2 Extensions" title="Free Magento 2 Extensions" href="https://amasty.com/free-magento-2-extensions.html" > <span class="label">Free Magento 2 Extensions</span> <span class="count">8<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="43" type="radio" aria-label="Free Magento 2 Extensions" /><span class="amshopby-choice"></span> </li> <li class="item -is-expanded -filter-parent" data-label="Research Product Demand"> <a class="am-filter-item-67bea95d95e82 amshopby-filter-parent" data-am-js='filter-item-category-labelsFolding' aria-label="Research Product Demand" title="Research Product Demand" href="https://amasty.com/research-product-demand.html" > <span class="label">Research Product Demand</span> <span class="count">57<span class="filter-count-label">items</span></span> </a> <input class="am-input" name="amshopby[cat][]" value="69" type="radio" aria-label="Research Product Demand" /><span class="amshopby-choice"></span> </li> </ul></li> </ul></form></div></div> <div data-role="collapsible" class="filter-options-item" data-amtheme-js="navigation-filter-item"><div data-role="title" class="filter-options-title -hyva compatible">Hyva Compatible</div><div data-role="content" class="filter-options-content"> <form class="am-ranges hyva_compatible" data-am-js="ranges" data-amshopby-filter="hyva_compatible" data-amshopby-filter-request-var="hyva_compatible" autocomplete="off"><ol class="items am-filter-items-hyva_compatible -am-singleselect" > <li class="item " data-label="Hyva-ready storefront"> <input name="amshopby[hyva_compatible][]" value="90" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d96276 link " data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?hyva_compatible=90" rel="nofollow"><span class="label">Hyva-ready storefront</span> <span class="count">101<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Compatible by default"> <input name="amshopby[hyva_compatible][]" value="91" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d96371 link " data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?hyva_compatible=91" rel="nofollow"><span class="label">Compatible by default</span> <span class="count">61<span class="filter-count-label">items</span></span> </a> </li> </ol></form> </div></div> <div data-role="collapsible" class="filter-options-item" data-amtheme-js="navigation-filter-item"><div data-role="title" class="filter-options-title -hyva checkout compatible">Hyva Checkout Compatible</div><div data-role="content" class="filter-options-content"> <form class="am-ranges hyva_checkout_compatible" data-am-js="ranges" data-amshopby-filter="hyva_checkout_compatible" data-amshopby-filter-request-var="hyva_checkout_compatible" autocomplete="off"><ol class="items am-filter-items-hyva_checkout_compatible -am-singleselect" > <li class="item " data-label="Hyva Checkout ready"> <input name="amshopby[hyva_checkout_compatible][]" value="95" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d965c0 link " data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?hyva_checkout_compatible=95" rel="nofollow"><span class="label">Hyva Checkout ready</span> <span class="count">27<span class="filter-count-label">items</span></span> </a> </li> <li class="item " data-label="Compatible by default"> <input name="amshopby[hyva_checkout_compatible][]" value="96" type="radio" style="" class="input" /> <a class="am-filter-item-67bea95d966b5 link " data-am-js="filter-item-default" href="https://amasty.com/magento-2-extensions.html?hyva_checkout_compatible=96" rel="nofollow"><span class="label">Compatible by default</span> <span class="count">108<span class="filter-count-label">items</span></span> </a> </li> </ol></form> </div></div> </div></div></div> <div class="amsite-promotion-sidebar"> <div class="hint">40K+ SUBSCRIBERS</div> <div class="title">JOIN OUR NEWSLETTER CLUB</div> <div class="text">Get e-commerce hacks and our special deals right to your inbox! </div> <form class="rendered-form amform-form mb-12 mx-auto group-[.am-dialog-popup]:mb-0 default" id="amform-form-141" action="https://amasty.com/amasty_customform/form/submit/" enctype="multipart/form-data" method="post"><input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /><input name="form_id" type="hidden" value="141" /><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="page1141"> <!-- 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-141" 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 here..." ><label class=" label " for="email-form-141">Email</label></div><!-- Dropdown / Select --> <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="initFormEvents141().processSubmit( $refs.page1141, $refs.tab1141, $event)">JOIN!</button> </div></div> </div> <!--Validations--><!--Dependencies--><!--Survey--> <!--Default values--><!--Init google map--></form> </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 to 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 your email address" aria-describedby="footer-newsletter-heading" ><label for="newsletter-subscribe">Email Address</label> <input name="form_key" type="hidden" value="s26Veii2LgQQnfiP" /></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/version1739349122/frontend/Amasty/AmTheme/en_US/images/footer-logo.svg" title="Amasty logo" alt="Amasty 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/version1739349122/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 & 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/version1739349122/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/version1739349122/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/version1739349122/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/version1739349122/frontend/Amasty/AmTheme/en_US/Magento_Theme/images/footer/mastercard.svg" alt="Mastercard" ><img class="lazy amsite-image" src="https://cdn.amasty.com/static/version1739349122/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 have read and 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 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('cookiebar-action-allow')" class="ambar-btn-accept btn btn-secondary" data-role="action">Accept Cookies</button> <button @click.prevent="$dispatch('cookiebar-action-settings')" class="ambar-btn-settings btn btn-as-text !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_67bea95d9be14()}" 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() { function trackMatomoCategoryViews() { window._paq.push(['setEcommerceView', false, false, "Magento 2"]); window._paq.push(['trackPageView']); } window.addEventListener('matomo-has-loaded', trackMatomoCategoryViews); })();</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="s26Veii2LgQQnfiP" /> <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 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 -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="s26Veii2LgQQnfiP" /> <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 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 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 Password" id="password-confirmation" placeholder="Confirm 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 Checkbox" id="amprivacy-checkbox-67bea95d9dd6a" class="amgdpr-checkbox" data-consent-id="1" required value="1"><label for="amprivacy-checkbox-67bea95d9dd6a" 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 of my personal data" id="amprivacy-checkbox-67bea95d9dd81" class="amgdpr-checkbox" data-consent-id="2" value="1"><label for="amprivacy-checkbox-67bea95d9dd81" 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 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 -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/category/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="s26Veii2LgQQnfiP" /> <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 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 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 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> <div data-role="compare-sticky-link" data-bind="scope: 'compareProducts'"><div class="amtheme-sticky-compare hidden-print" data-bind="css: {'-show': !!compareProducts().count}, mageInit: { 'amStickyCompareLink': { 'referenceElement': '.products .product-items', 'offsetTopElements': '.-sticky-message' } }"><div class="amtheme-wrapper -link"> <a class="amtheme-link" data-bind="attr: {'href': compareProducts().listUrl}" title="Compare Items" aria-label="Compare Items"><span>Compare</span> <span class="amtheme-count" data-bind="text: '(' + compareProducts().count + ')', css: {'-show': !!compareProducts().count}"></span></a></div><div class="amtheme-wrapper -clear"><button id="compare-clear" class="amtheme-clear button-as-link" title="Clear Compare List" aria-label="Clear Compare List" data-post="{"action":"https:\/\/amasty.com\/catalog\/product_compare\/clear\/","data":{"uenc":"","confirmation":true,"confirmationMessage":"Are you sure you want to remove all items from your Compare Products list?"}}"><svg class="amtheme-icon"><use xlink:href="#icon-trash" /></svg></button></div></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\u002Fversion1739349122\u002Ffrontend\u002FAmasty\u002FAmTheme\u002Fen_US' };</script><script type="text/javascript" src="https://cdn.amasty.com/static/version1739349122/_cache/merged/a8e74fc4cdd09bf931fffde57aa260af.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/version1739349122/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/version1739349122/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_67bea95d68b3f() { 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_67bea95d68d50() { 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">— ' + window.dataForSubscriptions[typeUser][period][typeVersion] .join('</p><p class="list-item">— ') + '</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"> { "*": { "Magento_Ui/js/core/app": { "components": { "messages": { "component": "Magento_Theme/js/view/messages", "floatingMessages": "true" } } } } }</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\u002Fversion1739349122\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\/25\/","handles":["default","catalog_category_view","catalog_category_view_type_layered","catalog_category_view_displaymode_products","catalog_category_view_id_25","hyva_default","hyva_catalog_category_view","hyva_catalog_category_view_type_layered","hyva_catalog_category_view_displaymode_products","hyva_catalog_category_view_id_25","hyva_amcookiebar_popup","am_mega_menu_layout"],"originalRequest":{"route":"catalog","controller":"category","action":"view","uri":"\/magento-2-extensions.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":0}; 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"> { "body": { "addToWishlist": {"productType":["simple","virtual","downloadable","bundle","grouped","configurable"]} } }</script><script type="text/x-magento-init"> { "[data-role=swatch-option-506]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["507"]},{"id":"5","label":"Enterprise","products":["526"]},{"id":"81","label":"Magento Cloud","products":["2927"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"507":{"baseOldPrice":{"amount":399},"oldPrice":{"amount":399},"basePrice":{"amount":399},"finalPrice":{"amount":399},"tierPrices":[],"msrpPrice":{"amount":0}},"526":{"baseOldPrice":{"amount":699},"oldPrice":{"amount":699},"basePrice":{"amount":699},"finalPrice":{"amount":699},"tierPrices":[],"msrpPrice":{"amount":0}},"2927":{"baseOldPrice":{"amount":999},"oldPrice":{"amount":999},"basePrice":{"amount":999},"finalPrice":{"amount":999},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":399},"oldPrice":{"amount":399},"basePrice":{"amount":399},"finalPrice":{"amount":399}},"productId":"506","chooseText":"Choose an Option...","images":[],"index":{"507":{"135":"4"},"526":{"135":"5"},"2927":{"135":"81"}},"salable":{"135":{"4":["507"],"5":["526"],"81":["2927"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"507":"improved-layered-navigation-for-magento-2-ce","526":"improved-layered-navigation-for-magento-2-ee","2927":"improved-layered-navigation-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":"506"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-506]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":399},"oldPrice":{"amount":399},"basePrice":{"amount":399},"finalPrice":{"amount":399}} } } } }</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-option-942]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["943"]},{"id":"5","label":"Enterprise","products":["944"]},{"id":"81","label":"Magento Cloud","products":["2803"]}],"position":"0"},"562":{"id":"562","code":"license","label":"License","options":[{"id":"87","label":"Annual","products":["943","944","2803"]},{"id":"86","label":"Monthly","products":[]}],"position":"1"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"943":{"baseOldPrice":{"amount":199},"oldPrice":{"amount":199},"basePrice":{"amount":199},"finalPrice":{"amount":199},"tierPrices":[],"msrpPrice":{"amount":0}},"944":{"baseOldPrice":{"amount":499},"oldPrice":{"amount":499},"basePrice":{"amount":499},"finalPrice":{"amount":499},"tierPrices":[],"msrpPrice":{"amount":0}},"2803":{"baseOldPrice":{"amount":799},"oldPrice":{"amount":799},"basePrice":{"amount":799},"finalPrice":{"amount":799},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":199},"oldPrice":{"amount":199},"basePrice":{"amount":199},"finalPrice":{"amount":199}},"productId":"942","chooseText":"Choose an Option...","images":[],"index":{"943":{"135":"4","562":"87"},"944":{"135":"5","562":"87"},"2803":{"135":"81","562":"87"}},"salable":{"135":{"4":["943"],"5":["944"],"81":["2803"]},"562":{"87":["943","944","2803"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"943":"google-page-speed-optimizer-for-magento-2-ce","944":"google-page-speed-optimizer-for-magento-2-ee","2803":"google-page-speed-optimizer-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":"942"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-942]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":199},"oldPrice":{"amount":199},"basePrice":{"amount":199},"finalPrice":{"amount":199}} } } } }</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-option-725]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["726"]},{"id":"5","label":"Enterprise","products":["727"]},{"id":"81","label":"Magento Cloud","products":["2806"]}],"position":"0"},"562":{"id":"562","code":"license","label":"License","options":[{"id":"87","label":"Annual","products":["726","727","2806"]},{"id":"86","label":"Monthly","products":[]}],"position":"1"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"726":{"baseOldPrice":{"amount":289},"oldPrice":{"amount":289},"basePrice":{"amount":289},"finalPrice":{"amount":289},"tierPrices":[],"msrpPrice":{"amount":0}},"727":{"baseOldPrice":{"amount":589},"oldPrice":{"amount":589},"basePrice":{"amount":589},"finalPrice":{"amount":589},"tierPrices":[],"msrpPrice":{"amount":0}},"2806":{"baseOldPrice":{"amount":889},"oldPrice":{"amount":889},"basePrice":{"amount":889},"finalPrice":{"amount":889},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":289},"oldPrice":{"amount":289},"basePrice":{"amount":289},"finalPrice":{"amount":289}},"productId":"725","chooseText":"Choose an Option...","images":[],"index":{"726":{"135":"4","562":"87"},"727":{"135":"5","562":"87"},"2806":{"135":"81","562":"87"}},"salable":{"135":{"4":["726"],"5":["727"],"81":["2806"]},"562":{"87":["726","727","2806"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"726":"one-step-checkout-for-magento-2-ce","727":"single-step-checkout-for-magento-2-ee","2806":"one-step-checkout-pro-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":"725"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-725]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":289},"oldPrice":{"amount":289},"basePrice":{"amount":289},"finalPrice":{"amount":289}} } } } }</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-option-649]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["651"]},{"id":"5","label":"Enterprise","products":["652"]},{"id":"81","label":"Magento Cloud","products":["2816"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"651":{"baseOldPrice":{"amount":319},"oldPrice":{"amount":319},"basePrice":{"amount":319},"finalPrice":{"amount":319},"tierPrices":[],"msrpPrice":{"amount":0}},"652":{"baseOldPrice":{"amount":619},"oldPrice":{"amount":619},"basePrice":{"amount":619},"finalPrice":{"amount":619},"tierPrices":[],"msrpPrice":{"amount":0}},"2816":{"baseOldPrice":{"amount":919},"oldPrice":{"amount":919},"basePrice":{"amount":919},"finalPrice":{"amount":919},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":319},"oldPrice":{"amount":319},"basePrice":{"amount":319},"finalPrice":{"amount":319}},"productId":"649","chooseText":"Choose an Option...","images":[],"index":{"651":{"135":"4"},"652":{"135":"5"},"2816":{"135":"81"}},"salable":{"135":{"4":["651"],"5":["652"],"81":["2816"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"651":"special-promotions-pro-for-magento-2-ce","652":"special-promotions-pro-for-magento-2-ee","2816":"special-promotions-pro-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":"649"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-649]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":319},"oldPrice":{"amount":319},"basePrice":{"amount":319},"finalPrice":{"amount":319}} } } } }</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-option-844]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["845"]},{"id":"5","label":"Enterprise","products":["846"]},{"id":"81","label":"Magento Cloud","products":["2938"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"845":{"baseOldPrice":{"amount":329},"oldPrice":{"amount":329},"basePrice":{"amount":329},"finalPrice":{"amount":329},"tierPrices":[],"msrpPrice":{"amount":0}},"846":{"baseOldPrice":{"amount":629},"oldPrice":{"amount":629},"basePrice":{"amount":629},"finalPrice":{"amount":629},"tierPrices":[],"msrpPrice":{"amount":0}},"2938":{"baseOldPrice":{"amount":929},"oldPrice":{"amount":929},"basePrice":{"amount":929},"finalPrice":{"amount":929},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":329},"oldPrice":{"amount":329},"basePrice":{"amount":329},"finalPrice":{"amount":329}},"productId":"844","chooseText":"Choose an Option...","images":[],"index":{"845":{"135":"4"},"846":{"135":"5"},"2938":{"135":"81"}},"salable":{"135":{"4":["845"],"5":["846"],"81":["2938"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"845":"elasticsearch-for-magento-2-ce","846":"elasticsearch-for-magento-2-ee","2938":"elastic-search-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":"844"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-844]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":329},"oldPrice":{"amount":329},"basePrice":{"amount":329},"finalPrice":{"amount":329}} } } } }</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-option-508]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["509"]},{"id":"5","label":"Enterprise","products":["527"]},{"id":"81","label":"Magento Cloud","products":["2807"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"509":{"baseOldPrice":{"amount":239},"oldPrice":{"amount":239},"basePrice":{"amount":239},"finalPrice":{"amount":239},"tierPrices":[],"msrpPrice":{"amount":0}},"527":{"baseOldPrice":{"amount":539},"oldPrice":{"amount":539},"basePrice":{"amount":539},"finalPrice":{"amount":539},"tierPrices":[],"msrpPrice":{"amount":0}},"2807":{"baseOldPrice":{"amount":839},"oldPrice":{"amount":839},"basePrice":{"amount":839},"finalPrice":{"amount":839},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":239},"oldPrice":{"amount":239},"basePrice":{"amount":239},"finalPrice":{"amount":239}},"productId":"508","chooseText":"Choose an Option...","images":[],"index":{"509":{"135":"4"},"527":{"135":"5"},"2807":{"135":"81"}},"salable":{"135":{"4":["509"],"5":["527"],"81":["2807"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"509":"free-gift-for-magento-2-ce","527":"free-gift-for-magento-2-ee","2807":"free-gift-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":"508"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-508]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":239},"oldPrice":{"amount":239},"basePrice":{"amount":239},"finalPrice":{"amount":239}} } } } }</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-option-793]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["794"]},{"id":"5","label":"Enterprise","products":["795"]},{"id":"81","label":"Magento Cloud","products":["2745"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"794":{"baseOldPrice":{"amount":349},"oldPrice":{"amount":349},"basePrice":{"amount":349},"finalPrice":{"amount":349},"tierPrices":[],"msrpPrice":{"amount":0}},"795":{"baseOldPrice":{"amount":649},"oldPrice":{"amount":649},"basePrice":{"amount":649},"finalPrice":{"amount":649},"tierPrices":[],"msrpPrice":{"amount":0}},"2745":{"baseOldPrice":{"amount":949},"oldPrice":{"amount":949},"basePrice":{"amount":949},"finalPrice":{"amount":949},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":349},"oldPrice":{"amount":349},"basePrice":{"amount":349},"finalPrice":{"amount":349}},"productId":"793","chooseText":"Choose an Option...","images":[],"index":{"794":{"135":"4"},"795":{"135":"5"},"2745":{"135":"81"}},"salable":{"135":{"4":["794"],"5":["795"],"81":["2745"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"794":"seo-toolkit-for-magento-2-ce","795":"seo-toolkit-for-magento-2-ee","2745":"seo-toolkit-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":"793"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-793]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":349},"oldPrice":{"amount":349},"basePrice":{"amount":349},"finalPrice":{"amount":349}} } } } }</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-option-521]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["520"]},{"id":"5","label":"Enterprise","products":["554"]},{"id":"81","label":"Magento Cloud","products":["2875"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"520":{"baseOldPrice":{"amount":229},"oldPrice":{"amount":229},"basePrice":{"amount":229},"finalPrice":{"amount":229},"tierPrices":[],"msrpPrice":{"amount":0}},"554":{"baseOldPrice":{"amount":529},"oldPrice":{"amount":529},"basePrice":{"amount":529},"finalPrice":{"amount":529},"tierPrices":[],"msrpPrice":{"amount":0}},"2875":{"baseOldPrice":{"amount":829},"oldPrice":{"amount":829},"basePrice":{"amount":829},"finalPrice":{"amount":829},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":229},"oldPrice":{"amount":229},"basePrice":{"amount":229},"finalPrice":{"amount":229}},"productId":"521","chooseText":"Choose an Option...","images":[],"index":{"520":{"135":"4"},"554":{"135":"5"},"2875":{"135":"81"}},"salable":{"135":{"4":["520"],"5":["554"],"81":["2875"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"520":"product-feed-for-magento-2-ce","554":"product-feed-for-magento-2-ee","2875":"product-feed-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":"521"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-521]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":229},"oldPrice":{"amount":229},"basePrice":{"amount":229},"finalPrice":{"amount":229}} } } } }</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-option-690]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["691"]},{"id":"5","label":"Enterprise","products":["692"]},{"id":"81","label":"Magento Cloud","products":["2802"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"691":{"baseOldPrice":{"amount":349},"oldPrice":{"amount":349},"basePrice":{"amount":349},"finalPrice":{"amount":349},"tierPrices":[],"msrpPrice":{"amount":0}},"692":{"baseOldPrice":{"amount":649},"oldPrice":{"amount":649},"basePrice":{"amount":649},"finalPrice":{"amount":649},"tierPrices":[],"msrpPrice":{"amount":0}},"2802":{"baseOldPrice":{"amount":949},"oldPrice":{"amount":949},"basePrice":{"amount":949},"finalPrice":{"amount":949},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":349},"oldPrice":{"amount":349},"basePrice":{"amount":349},"finalPrice":{"amount":349}},"productId":"690","chooseText":"Choose an Option...","images":[],"index":{"691":{"135":"4"},"692":{"135":"5"},"2802":{"135":"81"}},"salable":{"135":{"4":["691"],"5":["692"],"81":["2802"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"691":"blog-pro-for-magento-2-ce","692":"blog-pro-for-magento-2-ee","2802":"blog-pro-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":"690"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-690]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":349},"oldPrice":{"amount":349},"basePrice":{"amount":349},"finalPrice":{"amount":349}} } } } }</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-option-2202]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["2214"]},{"id":"5","label":"Enterprise","products":["2215"]},{"id":"81","label":"Magento Cloud","products":["2925"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"2214":{"baseOldPrice":{"amount":229},"oldPrice":{"amount":229},"basePrice":{"amount":229},"finalPrice":{"amount":229},"tierPrices":[],"msrpPrice":{"amount":0}},"2215":{"baseOldPrice":{"amount":529},"oldPrice":{"amount":529},"basePrice":{"amount":529},"finalPrice":{"amount":529},"tierPrices":[],"msrpPrice":{"amount":0}},"2925":{"baseOldPrice":{"amount":829},"oldPrice":{"amount":829},"basePrice":{"amount":829},"finalPrice":{"amount":829},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":229},"oldPrice":{"amount":229},"basePrice":{"amount":229},"finalPrice":{"amount":229}},"productId":"2202","chooseText":"Choose an Option...","images":[],"index":{"2214":{"135":"4"},"2215":{"135":"5"},"2925":{"135":"81"}},"salable":{"135":{"4":["2214"],"5":["2215"],"81":["2925"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"2214":"google-tag-manager-for-magento-2-ce","2215":"google-tag-manager-for-magento-2-ee","2925":"google-tag-manager-gtm-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":"2202"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-2202]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":229},"oldPrice":{"amount":229},"basePrice":{"amount":229},"finalPrice":{"amount":229}} } } } }</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-option-643]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["644"]},{"id":"5","label":"Enterprise","products":["645"]},{"id":"81","label":"Magento Cloud","products":["2932"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"644":{"baseOldPrice":{"amount":309},"oldPrice":{"amount":309},"basePrice":{"amount":309},"finalPrice":{"amount":309},"tierPrices":[],"msrpPrice":{"amount":0}},"645":{"baseOldPrice":{"amount":609},"oldPrice":{"amount":609},"basePrice":{"amount":609},"finalPrice":{"amount":609},"tierPrices":[],"msrpPrice":{"amount":0}},"2932":{"baseOldPrice":{"amount":909},"oldPrice":{"amount":909},"basePrice":{"amount":909},"finalPrice":{"amount":909},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":309},"oldPrice":{"amount":309},"basePrice":{"amount":309},"finalPrice":{"amount":309}},"productId":"643","chooseText":"Choose an Option...","images":[],"index":{"644":{"135":"4"},"645":{"135":"5"},"2932":{"135":"81"}},"salable":{"135":{"4":["644"],"5":["645"],"81":["2932"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"644":"customers-also-viewed-for-magento-2-ce","645":"customers-also-viewed-for-magento-2-ee","2932":"automatic-related-products-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":"643"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-643]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":309},"oldPrice":{"amount":309},"basePrice":{"amount":309},"finalPrice":{"amount":309}} } } } }</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-option-857]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["858"]},{"id":"5","label":"Enterprise","products":["859"]},{"id":"81","label":"Magento Cloud","products":["2747"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"858":{"baseOldPrice":{"amount":279},"oldPrice":{"amount":279},"basePrice":{"amount":279},"finalPrice":{"amount":279},"tierPrices":[],"msrpPrice":{"amount":0}},"859":{"baseOldPrice":{"amount":579},"oldPrice":{"amount":579},"basePrice":{"amount":579},"finalPrice":{"amount":579},"tierPrices":[],"msrpPrice":{"amount":0}},"2747":{"baseOldPrice":{"amount":879},"oldPrice":{"amount":879},"basePrice":{"amount":879},"finalPrice":{"amount":879},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":279},"oldPrice":{"amount":279},"basePrice":{"amount":279},"finalPrice":{"amount":279}},"productId":"857","chooseText":"Choose an Option...","images":[],"index":{"858":{"135":"4"},"859":{"135":"5"},"2747":{"135":"81"}},"salable":{"135":{"4":["858"],"5":["859"],"81":["2747"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"858":"gdpr-for-magento-2-ce","859":"gdpr-for-magento-2-ee","2747":"gdpr-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":"857"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-857]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":279},"oldPrice":{"amount":279},"basePrice":{"amount":279},"finalPrice":{"amount":279}} } } } }</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-option-945]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["946"]},{"id":"5","label":"Enterprise","products":["947"]},{"id":"81","label":"Magento Cloud","products":["2776"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"946":{"baseOldPrice":{"amount":499},"oldPrice":{"amount":499},"basePrice":{"amount":499},"finalPrice":{"amount":499},"tierPrices":[],"msrpPrice":{"amount":0}},"947":{"baseOldPrice":{"amount":799},"oldPrice":{"amount":799},"basePrice":{"amount":799},"finalPrice":{"amount":799},"tierPrices":[],"msrpPrice":{"amount":0}},"2776":{"baseOldPrice":{"amount":1099},"oldPrice":{"amount":1099},"basePrice":{"amount":1099},"finalPrice":{"amount":1099},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":499},"oldPrice":{"amount":499},"basePrice":{"amount":499},"finalPrice":{"amount":499}},"productId":"945","chooseText":"Choose an Option...","images":[],"index":{"946":{"135":"4"},"947":{"135":"5"},"2776":{"135":"81"}},"salable":{"135":{"4":["946"],"5":["947"],"81":["2776"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"946":"shipping-suite-for-magento-2-ce","947":"shipping-suite-for-magento-2-ee","2776":"shipping-suite-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":"945"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-945]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":499},"oldPrice":{"amount":499},"basePrice":{"amount":499},"finalPrice":{"amount":499}} } } } }</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-option-538]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["539"]},{"id":"5","label":"Enterprise","products":["540"]},{"id":"81","label":"Magento Cloud","products":["2734"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"539":{"baseOldPrice":{"amount":209},"oldPrice":{"amount":209},"basePrice":{"amount":209},"finalPrice":{"amount":209},"tierPrices":[],"msrpPrice":{"amount":0}},"540":{"baseOldPrice":{"amount":509},"oldPrice":{"amount":509},"basePrice":{"amount":509},"finalPrice":{"amount":509},"tierPrices":[],"msrpPrice":{"amount":0}},"2734":{"baseOldPrice":{"amount":809},"oldPrice":{"amount":809},"basePrice":{"amount":809},"finalPrice":{"amount":809},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":209},"oldPrice":{"amount":209},"basePrice":{"amount":209},"finalPrice":{"amount":209}},"productId":"538","chooseText":"Choose an Option...","images":[],"index":{"539":{"135":"4"},"540":{"135":"5"},"2734":{"135":"81"}},"salable":{"135":{"4":["539"],"5":["540"],"81":["2734"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"539":"product-labels-for-magento-2-ce","540":"product-labels-for-magento-2-ee","2734":"product-labels-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":"538"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-538]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":209},"oldPrice":{"amount":209},"basePrice":{"amount":209},"finalPrice":{"amount":209}} } } } }</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-option-728]": { "Magento_Swatches/js/swatch-renderer": { "selectorProduct": ".product-item-info", "onlySwatches": true, "enableControlLabel": false, "numberToShow": 16, "jsonConfig": {"attributes":{"135":{"id":"135","code":"magento_edition","label":"Edition","options":[{"id":"4","label":"Community","products":["729"]},{"id":"5","label":"Enterprise","products":["730"]},{"id":"81","label":"Magento Cloud","products":["2791"]}],"position":"0"}},"template":"$<%- data.price %>","currencyFormat":"$%s","optionPrices":{"729":{"baseOldPrice":{"amount":399},"oldPrice":{"amount":399},"basePrice":{"amount":399},"finalPrice":{"amount":399},"tierPrices":[],"msrpPrice":{"amount":0}},"730":{"baseOldPrice":{"amount":699},"oldPrice":{"amount":699},"basePrice":{"amount":699},"finalPrice":{"amount":699},"tierPrices":[],"msrpPrice":{"amount":0}},"2791":{"baseOldPrice":{"amount":999},"oldPrice":{"amount":999},"basePrice":{"amount":999},"finalPrice":{"amount":999},"tierPrices":[],"msrpPrice":{"amount":0}}},"priceFormat":{"pattern":"$%s","precision":2,"requiredPrecision":2,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":false},"prices":{"baseOldPrice":{"amount":399},"oldPrice":{"amount":399},"basePrice":{"amount":399},"finalPrice":{"amount":399}},"productId":"728","chooseText":"Choose an Option...","images":[],"index":{"729":{"135":"4"},"730":{"135":"5"},"2791":{"135":"81"}},"salable":{"135":{"4":["729"],"5":["730"],"81":["2791"]}},"canDisplayShowOutOfStockStatus":true,"channel":"website","salesChannelCode":"base","sku":{"729":"gift-card-for-magento-2-ce","730":"gift-card-for-magento-2-ee","2791":"gift-card-pro-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":"728"}, "jsonSwatchConfig": [], "mediaCallback": "https\u003A\u002F\u002Famasty.com\u002Fswatches\u002Fajax\u002Fmedia\u002F", "jsonSwatchImageSizeConfig": {"swatchImage":{"width":30,"height":20},"swatchThumb":{"height":90,"width":110}} ,"showTooltip": 1 } } }</script><script type="text/x-magento-init"> { "[data-role=priceBox][data-price-box=product-id-728]": { "priceBox": { "priceConfig": { "priceFormat": {"pattern":"$%s","precision":0,"requiredPrecision":0,"decimalSymbol":".","groupSymbol":",","groupLength":3,"integerRequired":true}, "prices": {"baseOldPrice":{"amount":399},"oldPrice":{"amount":399},"basePrice":{"amount":399},"finalPrice":{"amount":399}} } } } }</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-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" : {"506":{"configurable":{"entity":"506","swatchOpt":".swatch-opt-506","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"506":{"135":"Edition"}},"isAllProductsPreorder":0}},"942":{"configurable":{"entity":"942","swatchOpt":".swatch-opt-942","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"942":{"135":"Edition","562":"License"}},"isAllProductsPreorder":0}},"725":{"configurable":{"entity":"725","swatchOpt":".swatch-opt-725","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"725":{"135":"Edition","562":"License"}},"isAllProductsPreorder":0}},"649":{"configurable":{"entity":"649","swatchOpt":".swatch-opt-649","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"649":{"135":"Edition"}},"isAllProductsPreorder":0}},"844":{"configurable":{"entity":"844","swatchOpt":".swatch-opt-844","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"844":{"135":"Edition"}},"isAllProductsPreorder":0}},"508":{"configurable":{"entity":"508","swatchOpt":".swatch-opt-508","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"508":{"135":"Edition"}},"isAllProductsPreorder":0}},"793":{"configurable":{"entity":"793","swatchOpt":".swatch-opt-793","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"793":{"135":"Edition"}},"isAllProductsPreorder":0}},"521":{"configurable":{"entity":"521","swatchOpt":".swatch-opt-521","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"521":{"135":"Edition"}},"isAllProductsPreorder":0}},"690":{"configurable":{"entity":"690","swatchOpt":".swatch-opt-690","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"690":{"135":"Edition"}},"isAllProductsPreorder":0}},"2202":{"configurable":{"entity":"2202","swatchOpt":".swatch-opt-2202","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"2202":{"135":"Edition"}},"isAllProductsPreorder":0}},"643":{"configurable":{"entity":"643","swatchOpt":".swatch-opt-643","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"643":{"135":"Edition"}},"isAllProductsPreorder":0}},"857":{"configurable":{"entity":"857","swatchOpt":".swatch-opt-857","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"857":{"135":"Edition"}},"isAllProductsPreorder":0}},"945":{"configurable":{"entity":"945","swatchOpt":".swatch-opt-945","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"945":{"135":"Edition"}},"isAllProductsPreorder":0}},"538":{"configurable":{"entity":"538","swatchOpt":".swatch-opt-538","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"538":{"135":"Edition"}},"isAllProductsPreorder":0}},"728":{"configurable":{"entity":"728","swatchOpt":".swatch-opt-728","addToCartLabel":"PRE-ORDER","map":[],"currentAttributes":{"728":{"135":"Edition"}},"isAllProductsPreorder":0}}} } } }</script><script type="text/javascript"> require([ "jquery" ], function($) { $(".amstockstatus").each(function(i, item) { var parent = $(item).parents(".item").first(); parent.find(".actions .stock").remove(); }) }); </script><script type="text/x-magento-init"> { ".sidebar #narrow-by-list": { "accordion": { "multipleCollapsible": true, "active": [] } } }</script><script type="text/x-magento-init"> { ".products-grid, .products-list": { "amShopbySwatchesChoose": { "listSwatches": [] } } }</script><script type="text/x-magento-init"> { "#narrow-by-list": { "amShopbyFiltersSync": { } } }</script><script type="text/x-magento-init"> { "[data-amsite-js=category-page-list]": { "Amasty_Scroll/js/amscroll": {"product_container":".products.products-grid:not(.amasty-banners), .products.products-list:not(.amasty-banners), .products-grid.grid:not(.amasty-banners)","product_link":".product-item-link","loadingImage":"https:\/\/cdn.amasty.com\/static\/version1739349122\/frontend\/Amasty\/AmTheme\/en_US\/Amasty_Scroll\/images\/loader.svg","pageNumbers":"0","pageNumberContent":"Page #","pageNumberStyle":"button","buttonColor":"#4776F0","buttonColorPressed":"#1846BE","loadingafterTextButton":"Load next","loadingbeforeTextButton":"Load previous","backToTop":{"enabled":"0","style_desktop":"text","style_mobile":"arrow","color":"#4776F0"},"backToTopText":"Back to Top","current_page":1,"footerSelector":".page-footer","actionMode":"auto"} } }</script><script type="text/x-magento-init"> { "body.page-with-filter, body.catalogsearch-result-index": { "amShopbyAjax": { "submitByClick": 0, "scrollUp": 2, "clearUrl": "https\u003A\u002F\u002Famasty.com\u002Fmagento\u002D2\u002Dextensions.html", "currentCategoryId": 25, "isCategorySingleSelect": 1, "isMemorizerAllowed": 0 } } }</script><script type="text/x-magento-init"> { "[data-am-js='filter-item-default']": { "amShopbyFilterItemDefault": { "collectFilters": 0, "clearUrl": "https://amasty.com/magento-2-extensions.html" } }, "*": { "amShopbyResponsive": {} } }</script><script type="text/x-magento-init"> { "[data-am-js='filter-item-category-labelsFolding']": { "amShopbyFilterCategory": { "type": "labelsFolding", "collectFilters": 0, "clearUrl": "https://amasty.com/magento-2-extensions.html" } } }</script><script type="text/x-magento-init"> { "[data-am-js='filter-item-category-labelsFolding']": { "amShopbyFilterCategory": { "type": "labelsFolding", "collectFilters": 0, "clearUrl": "https://amasty.com/magento-2-extensions.html" } } }</script><script> 'use strict'; function initFormEvents141() { 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-141')); 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-141'); }, 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-141'); 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-141'); if (result) { form.submit(); } } } }</script><script> (function setDependencies() { const form = document.getElementById('amform-form-141'); 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":141,"productId":0}; 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]); }); }) })(141);</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/version1739349122/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> '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\u002Fversion1739349122\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/version1739349122/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/version1739349122/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\u002Fversion1739349122\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_67bea95d9be14() { 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\/magento-2-extensions.html","name":"All"}}]}</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="text/x-magento-init"> { "*": { "amsiteAsyncLoadCss": { "cssFileUrl": "https://cdn.amasty.com/static/version1739349122/frontend/Amasty/AmTheme/en_US/css/source/bundle-module/category-page/bundle-async-load.min.css" } } }</script><script type="text/x-magento-init"> { "[data-amtheme-js='navigation-filter']": { "amLayeredNavigationAction": {} } }</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> (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 type="text/x-magento-init"> { "[data-role='compare-sticky-link']": { "Magento_Ui/js/core/app": {"components":{"compareProducts":{"component":"Magento_Catalog\/js\/view\/compare-products"}}} } }</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/version1739349122/frontend/Amasty/AmTheme/en_US/css/print.min.css" /><link rel="stylesheet" type="text/css" media="all" href="https://cdn.amasty.com/static/version1739349122/_cache/merged/fonts_44a5dd2ba5fab4863facc82d1919a5f3.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>