{"version":3,"sources":["webpack:///./src/Frontend/app/components/product-slider/product-slider.tsx","webpack:///./src/Frontend/app/views/product-slider/product-slider-view.tsx","webpack:///./src/Frontend/app/components/icons/icon.tsx","webpack:///./src/Frontend/app/components/anchor/anchor.tsx","webpack:///./src/Frontend/app/components/content-section/content-section.tsx","webpack:///./src/Frontend/app/components/cta-button/cta-button.tsx","webpack:///./src/Frontend/app/components/arrow-link/arrow-link.tsx","webpack:///./src/Frontend/app/utils/breakpoint-utils.ts","webpack:///./src/Frontend/app/components/tag/tag.tsx","webpack:///./src/Frontend/app/utils/tracking-utils.ts","webpack:///./src/Frontend/app/components/product-image/product-image.tsx","webpack:///./src/Frontend/app/components/product-authors/product-authors.tsx","webpack:///./src/Frontend/app/components/swiper/swiper-button.tsx","webpack:///./node_modules/tiny-invariant/dist/tiny-invariant.esm.js","webpack:///./node_modules/react-intersection-observer/react-intersection-observer.esm.js","webpack:///./src/Frontend/app/components/swiper/slider-swiper.tsx","webpack:///./src/Frontend/app/types/product.ts","webpack:///./src/Frontend/app/components/product-tile/product-tile-image.tsx","webpack:///./src/Frontend/app/components/product-tile/product-tile-title.tsx","webpack:///./src/Frontend/app/components/product-tile/product-tile.tsx"],"names":["initialConfigObject","haveStatus","setConfigurationObjectFromProducts","accumulator","product","status","ProductSlider","title","viewMoreLink","products","disableBackgroundColor","singleItemHighlight","btnIsLarge","props","swiperSettings","slidesToShow","length","swipeToSlide","lazyLoad","initialSlide","responsive","breakpoint","rat","settings","rabbit","dog","lion","horse","headerTitle","className","dangerouslySetInnerHTML","__html","headerLink","link","baseClass","someProducts","reduce","productSliderClasses","infoLabel","type","shape","map","index","key","ctaLink","undefined","hideBackground","hideStatus","hasTopPadding","sizes","trackingList","trackingPosition","render","this","contextModel","spriteUrl","viewBox","iconId","preserveAspectRatio","onClick","xmlnsXlink","xlinkHref","id","anchorId","hasNoMarginTop","hasNoMarginBottom","componentClasses","children","isLarge","isInverted","isSecondary","breakpoints","cat","wolf","rhino","elephant","mediaQueries","Object","keys","queryStrings","currentMediaQueries","handleMediaMatch","isMatching","forEach","mediaQuery","matchMedia","matches","addListener","event","tagTypeClassMap","NEWS","SPOT","BESTSELLER","BOOK_OF_THE_MONTH","UPCOMING","classModifier","rootClasses","EventTypes","CurrencyCodes","TrackingDimensions","ensureDataLayer","window","dataLayer","pushEcommerenceTrackingEvent","trackingEvent","push","pushTrackingEvent","pushClickTrackingEvent","productId","CLICK","ecommerce","click","actionField","list","name","position","pushDetailViewTrackingEvent","DETAIL_VIEW","detail","pushImpressionViewTrackingEvent","IMPRESSION_VIEW","impressions","ProductImage","ref","fallbackSrc","loading","src","authors","maxLines","classes","Wrapper","lines","author","url","href","direction","tabIndex","condition","message","Error","_defineProperty","obj","value","defineProperty","enumerable","configurable","writable","_extends","assign","target","i","arguments","source","prototype","hasOwnProperty","call","apply","_assertThisInitialized","self","ReferenceError","INSTANCE_MAP","Map","OBSERVER_MAP","ROOT_IDS","consecutiveRootId","observe","element","callback","options","threshold","_options","root","rootMargin","has","observerId","get","set","toString","getRootId","observerInstance","IntersectionObserver","instance","inView","observer","thresholds","Array","isArray","unobserve","itemsLeft","rootObserved","item","disconnect","changes","intersection","isIntersecting","intersectionRatio","some","_React$Component","subClass","superClass","InView","_this","_len","args","_key","concat","entry","node","triggerOnce","skip","setState","observeNode","state","onChange","create","constructor","__proto__","_proto","componentDidMount","componentDidUpdate","prevProps","prevState","componentWillUnmount","_this$props","handleChange","_this$state","isPlainChildren","handleNode","_this$props2","as","tag","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","initialState","useInView","_React$useState","setRef","current","buttonClasses","buttonClassName","nextArrow","prevArrow","draggable","infinite","speed","PriceTypesEnum","ProductStatusEnum","ProductStockStatusEnum","ProductTileImage","hasQuickView","imageSrcSet","imageFallbackSrc","detailsLabel","statusLabel","imageBaseClasses","Image","srcSet","alt","ProductTile","description","hideAuthors","onQuickViewClick","showCtaAsLink","clickTrackingEvent","onTileClick"],"mappings":"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","file":"10.4cefe1c309bfd059cfd4.js","sourcesContent":["import * as React from \"react\";\r\nimport { IProduct } from \"~/types/product\";\r\nimport ProductTile from \"~/components/product-tile/product-tile\";\r\nimport SliderSwiper from \"~/components/swiper/slider-swiper\";\r\nimport { breakpoints } from \"~/utils/breakpoint-utils\";\r\nimport { Settings } from \"react-slick\";\r\nimport ArrowLink from \"../arrow-link/arrow-link\";\r\nimport ContentSection from \"../content-section/content-section\";\r\nimport classNames from \"classnames\";\r\nimport Tag from \"../tag/tag\";\r\n\r\nexport interface IProductSliderProps {\r\n    title?: string;\r\n    viewMoreLink?: string;\r\n    products: IProduct[];\r\n    // addToBasketWebApiUrl: string;\r\n    // secondaryPriceLabel?: string;\r\n    disableBackgroundColor?: boolean;\r\n    singleItemHighlight?: boolean;\r\n    // discountPaddings?: boolean;\r\n    anchorId?: string;\r\n    btnIsLarge?: boolean;\r\n    infoLabel?: string;\r\n}\r\n\r\nconst initialConfigObject = { haveStatus: false };\r\n\r\nconst setConfigurationObjectFromProducts = (accumulator: typeof initialConfigObject, product: IProduct) => {\r\n    accumulator.haveStatus = !!product.status || accumulator.haveStatus;\r\n\r\n    return accumulator;\r\n};\r\n\r\nconst ProductSlider: React.FC<IProductSliderProps> = ({\r\n    title,\r\n    viewMoreLink,\r\n    products,\r\n    // addToBasketWebApiUrl,\r\n    // secondaryPriceLabel,\r\n    disableBackgroundColor,\r\n    singleItemHighlight,\r\n    // discountPaddings,\r\n    btnIsLarge,\r\n    ...props\r\n}) => {\r\n    const swiperSettings: Settings = {\r\n        slidesToShow: singleItemHighlight ? products.length : 5.2,\r\n        swipeToSlide: true,\r\n        lazyLoad: \"ondemand\",\r\n        initialSlide: 0,\r\n        responsive: [\r\n            {\r\n                breakpoint: breakpoints.rat,\r\n                settings: {\r\n                    slidesToShow: 1.2\r\n                }\r\n            },\r\n            {\r\n                breakpoint: breakpoints.rabbit,\r\n                settings: {\r\n                    slidesToShow: 1.5\r\n                }\r\n            },\r\n            {\r\n                breakpoint: breakpoints.dog - 1,\r\n                settings: {\r\n                    slidesToShow: 2.3\r\n                }\r\n            },\r\n            {\r\n                breakpoint: breakpoints.lion,\r\n                settings: {\r\n                    slidesToShow: singleItemHighlight ? products.length : 3.3\r\n                }\r\n            },\r\n            {\r\n                breakpoint: breakpoints.horse,\r\n                settings: {\r\n                    slidesToShow: singleItemHighlight ? products.length : 4.3\r\n                }\r\n            }\r\n        ]\r\n    };\r\n\r\n    const headerTitle = title && (\r\n        <h2 className=\"product-slider__title h2-style\" dangerouslySetInnerHTML={{ __html: title }} />\r\n    );\r\n    const headerLink = viewMoreLink && <ArrowLink className=\"product-slider__link\" link={viewMoreLink} />;\r\n\r\n    const baseClass = \"product-slider\";\r\n\r\n    const someProducts = React.useMemo(\r\n        () => products.reduce(setConfigurationObjectFromProducts, initialConfigObject),\r\n        [products]\r\n    );\r\n\r\n    const productSliderClasses = classNames(baseClass, `${baseClass}--n-products-${products.length}`);\r\n\r\n    return (\r\n        <ContentSection className={productSliderClasses} {...props}>\r\n            {(headerTitle || headerLink) && (\r\n                <div className={`${baseClass}__header`}>\r\n                    <div className={`${baseClass}__header-inner`}>\r\n                        {headerTitle}\r\n                        {props.infoLabel && (\r\n                            <Tag className={`${baseClass}__info-label`} type=\"UPCOMING\" shape=\"square\">\r\n                                {props.infoLabel}\r\n                            </Tag>\r\n                        )}\r\n                    </div>\r\n                    {headerLink}\r\n                </div>\r\n            )}\r\n            {products.length > 0 && (\r\n                <SliderSwiper className={productSliderClasses} settings={swiperSettings}>\r\n                    {products.map((product, index) => (\r\n                        <div key={index} className={`${baseClass}__item`}>\r\n                            <ProductTile\r\n                                {...product}\r\n                                btnIsLarge={btnIsLarge}\r\n                                ctaLink={singleItemHighlight ? product.ctaLink : undefined}\r\n                                className={`${baseClass}__product-tile`}\r\n                                // secondaryPrice={product.secondaryPrice}\r\n                                // secondaryPriceLabel={secondaryPriceLabel}\r\n                                // stockStatusLabel={product.stockStatusLabel}\r\n                                // numberOfProductsLabel={product.numberOfProductsLabel}\r\n                                // ctaLabel={product.primaryPrice}\r\n                                // addToBasketWebApiUrl={addToBasketWebApiUrl}\r\n                                hideBackground={disableBackgroundColor}\r\n                                hideStatus={!someProducts.haveStatus}\r\n                                hasTopPadding={someProducts.haveStatus}\r\n                                // bottomPaddedSubText={someProducts.haveSubText}\r\n                                // hasBottomPaddingNumberOfProducts={someProducts.haveNumberOfProductsLabel}\r\n                                singleItemHighlight={singleItemHighlight}\r\n                                sizes=\"150px\"\r\n                                trackingList=\"Product Slider\"\r\n                                trackingPosition={index + 1}\r\n                            />\r\n                        </div>\r\n                    ))}\r\n                </SliderSwiper>\r\n            )}\r\n        </ContentSection>\r\n    );\r\n};\r\n\r\nexport default React.memo(ProductSlider);\r\n","import * as React from \"react\";\r\nimport ProductSlider, { IProductSliderProps } from \"~/components/product-slider/product-slider\";\r\n\r\nexport interface IProductSliderViewProps {\r\n    contextModel: IProductSliderProps;\r\n}\r\n\r\nclass ProductSliderView extends React.PureComponent<IProductSliderViewProps> {\r\n    public render() {\r\n        return <ProductSlider {...this.props.contextModel} />;\r\n    }\r\n}\r\n\r\nexport default ProductSliderView;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport type TIconNames =\r\n    | \"24_expand\"\r\n    | \"24_play\"\r\n    | \"24_star\"\r\n    | \"24_trash\"\r\n    | \"32_add-user\"\r\n    | \"32_basket\"\r\n    | \"32_checkmark-circle\"\r\n    | \"32_checkmark\"\r\n    | \"32_error\"\r\n    | \"32_information\"\r\n    | \"32_katalog\"\r\n    | \"32_search\"\r\n    | \"32_truck-in-motion\"\r\n    | \"32_user\"\r\n    | \"32_warning\"\r\n    | \"icon_16_arrow-down\"\r\n    | \"icon_16_arrow-left\"\r\n    | \"icon_16_arrow-right-bold\"\r\n    | \"icon_16_arrow-right\"\r\n    | \"icon_16_arrow-up\"\r\n    | \"icon_28_close\"\r\n    | \"icon_32_thumbs-up\"\r\n    | \"icon_80x41_quotation-mark-gyldendal-dk\"\r\n    | \"icon_80x48_quotation-mark\"\r\n    | \"icon_checkbox-black\"\r\n    | \"icon_checkmark-black\"\r\n    | \"icon_download\"\r\n    | \"icon_herringbone-narrow\"\r\n    | \"icon_herringbone-wide\"\r\n    | \"icon_placeholder-email\"\r\n    | \"icon_placeholder-lock\"\r\n    | \"icon_placeholder-phone-small\"\r\n    | \"icon_placeholder-vip-white\"\r\n    | \"icon_placeholder_basket\"\r\n    | \"icon_placeholder_checkmark\"\r\n    | \"icon_placeholder_eye-closed\"\r\n    | \"icon_placeholder_eye\"\r\n    | \"icon_placeholder_facebook\"\r\n    | \"icon_placeholder_filtering\"\r\n    | \"icon_placeholder_hamburger\"\r\n    | \"icon_placeholder_instagram\"\r\n    | \"icon_placeholder_phone\"\r\n    | \"icon_placeholder_user\"\r\n    | \"icon_read\"\r\n    | \"icon_listen\";\r\n\r\nexport interface IIconProps {\r\n    iconId: TIconNames;\r\n    spriteUrl?: string;\r\n    viewBox?: string;\r\n    className?: string;\r\n    onClick?: () => void;\r\n}\r\n\r\nconst Icon: React.FC<IIconProps> = props => {\r\n    const spriteUrl = props.spriteUrl || \"\";\r\n    const viewBox = props.viewBox || \"0 0 32 32\";\r\n\r\n    return (\r\n        <svg\r\n            viewBox={viewBox}\r\n            className={classNames(props.className, \"icon\", `icon-${props.iconId}`)}\r\n            preserveAspectRatio=\"xMidYMid\"\r\n            onClick={() => props.onClick && props.onClick()}\r\n        >\r\n            <use xmlnsXlink=\"http://www.w3.org/1999/xlink\" xlinkHref={`${spriteUrl}#${props.iconId}`} />\r\n        </svg>\r\n    );\r\n};\r\n\r\nexport default Icon;\r\n","import * as React from \"react\";\r\n\r\nexport interface AnchorProps {\r\n    id?: string;\r\n}\r\n\r\nconst Anchor = ({ id }: AnchorProps) => {\r\n    return <div className=\"anchor\" id={id} />;\r\n};\r\n\r\nexport default Anchor;\r\n","import classNames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport Anchor from \"../anchor/anchor\";\r\n\r\nexport interface ContentSectionProps {\r\n    className?: string;\r\n    type?: \"default\" | \"full\";\r\n    anchorId?: string;\r\n    hasNoMarginTop?: boolean;\r\n    hasNoMarginBottom?: boolean;\r\n}\r\n\r\nconst ContentSection: React.FC<ContentSectionProps> = ({\r\n    className,\r\n    type = \"default\",\r\n    anchorId,\r\n    hasNoMarginTop,\r\n    hasNoMarginBottom,\r\n    ...props\r\n}) => {\r\n    const baseClass = \"content-section\";\r\n    const componentClasses = classNames(baseClass, className, {\r\n        [`${baseClass}--full`]: type === \"full\",\r\n        \"anchor-wrapper\": !!anchorId,\r\n        \"content-no-margin-top\": hasNoMarginTop,\r\n        \"content-no-margin-bottom\": hasNoMarginBottom\r\n    });\r\n    return (\r\n        <section className={componentClasses}>\r\n            {anchorId && <Anchor id={anchorId} />}\r\n            {props.children}\r\n        </section>\r\n    );\r\n};\r\n\r\nexport default ContentSection;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport interface ICtaButtonProps {\r\n    className?: string;\r\n    isLarge?: boolean;\r\n    isInverted?: boolean;\r\n    isSecondary?: boolean;\r\n    link: string;\r\n    onClick?(): void;\r\n}\r\n\r\nconst CtaButton = ({ className, isLarge, isInverted, isSecondary, link, onClick }: ICtaButtonProps) => {\r\n    const baseClass = \"cta-button\";\r\n    const componentClasses = classNames(className, baseClass, {\r\n        [`${baseClass}--large`]: isLarge,\r\n        [`${baseClass}--inverted`]: isInverted,\r\n        [`${baseClass}--secondary`]: isSecondary\r\n    });\r\n\r\n    return <div onClick={onClick} className={componentClasses} dangerouslySetInnerHTML={{ __html: link }} />;\r\n};\r\n\r\nexport default CtaButton;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport Icon from \"../icons/icon\";\r\n\r\nexport interface IArrowLinkProps {\r\n    className?: string;\r\n    link: string;\r\n}\r\n\r\nconst ArrowLink = ({ className, link }: IArrowLinkProps) => {\r\n    const baseClass = \"arrow-link\";\r\n    const componentClasses = classNames(baseClass, className);\r\n\r\n    return (\r\n        <div className={componentClasses}>\r\n            <Icon iconId=\"icon_16_arrow-right-bold\" />\r\n            <span dangerouslySetInnerHTML={{ __html: link }} />\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default ArrowLink;\r\n","interface IBreakpoints {\r\n    [key: string]: number;\r\n}\r\n\r\ninterface IMediaQueryStrings {\r\n    [key: string]: string;\r\n}\r\n\r\nexport type IMatchingQueries = { [key in Breakpoints]?: boolean };\r\n\r\nexport type Breakpoints =\r\n    | \"ratMin\"\r\n    | \"ratMax\"\r\n    | \"rabbitMin\"\r\n    | \"rabbitMax\"\r\n    | \"catMin\"\r\n    | \"catMax\"\r\n    | \"dogMin\"\r\n    | \"dogMax\"\r\n    | \"wolfMin\"\r\n    | \"wolfMax\"\r\n    | \"lionMin\"\r\n    | \"horseMin\"\r\n    | \"horseMax\"\r\n    | \"rhinoMin\"\r\n    | \"rhinoMax\"\r\n    | \"elephantMin\"\r\n    | \"elephantMax\";\r\n\r\nexport const breakpoints: IBreakpoints = {\r\n    rat: 360,\r\n    rabbit: 480,\r\n    cat: 640,\r\n    dog: 768,\r\n    wolf: 1024,\r\n    lion: 1100,\r\n    horse: 1400,\r\n    rhino: 1520,\r\n    elephant: 1670\r\n};\r\n\r\nconst mediaQueries: IMediaQueryStrings = Object.keys(breakpoints).reduce(\r\n    (queryStrings: IMediaQueryStrings, key) => {\r\n        queryStrings[`${key}Min`] = `(min-width: ${breakpoints[key]}px)`;\r\n        queryStrings[`${key}Max`] = `(max-width: ${breakpoints[key] - 1}px)`;\r\n        return queryStrings;\r\n    },\r\n    {}\r\n);\r\n\r\nconst setupMediaQueryListeners = () => {\r\n    Object.keys(mediaQueries).forEach((key: string) => {\r\n        const mediaQuery = matchMedia(mediaQueries[key]);\r\n\r\n        handleMediaMatch(mediaQuery.matches, key as Breakpoints); // Initial values\r\n        mediaQuery.addListener(event => handleMediaMatch(event.matches, key as Breakpoints));\r\n    });\r\n};\r\n\r\nconst currentMediaQueries: IMatchingQueries = {};\r\nconst handleMediaMatch = (isMatching: boolean, key: Breakpoints) => (currentMediaQueries[key] = isMatching);\r\n\r\nif (!__SERVER__) {\r\n    setupMediaQueryListeners();\r\n}\r\n\r\nexport { currentMediaQueries };\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { ProductStatus } from \"~/types/product\";\r\n\r\nexport interface ITagProps {\r\n    type?: ProductStatus;\r\n    children: React.ReactNode;\r\n    className?: string;\r\n    shape?: \"pill\" | \"square\";\r\n}\r\n\r\nexport const tagTypeClassMap: { [key in ProductStatus]: string } = {\r\n    NEWS: \"news\",\r\n    SPOT: \"spot\",\r\n    BESTSELLER: \"bestseller\",\r\n    BOOK_OF_THE_MONTH: \"botm\",\r\n    UPCOMING: \"upcoming\"\r\n};\r\n\r\nconst Tag: React.FC<ITagProps> = props => {\r\n    const classModifier = props.type && tagTypeClassMap[props.type];\r\n    const rootClasses = classNames(\"tag\", props.className, `tag--shape-${props.shape || \"pill\"}`, {\r\n        [`tag--${classModifier}`]: props.type\r\n    });\r\n\r\n    return (\r\n        <div className={rootClasses}>\r\n            <span className=\"tag__label\">{props.children}</span>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default Tag;\r\n","import { MembershipType } from \"~/types/membership\";\r\nimport { IBasketProduct, IProduct } from \"~/types/product\";\r\n// import { IBasketSummationProps } from \"~/components/basket-summation/basket-summation\";\r\nimport { IProductTileProps } from \"~/components/product-tile/product-tile\";\r\n\r\nenum EventTypes {\r\n    SIGNUP = \"eec.signup\",\r\n    PURCHASE = \"eec.purchase\",\r\n    CHECKOUT = \"eec.checkout\",\r\n    ADD_TO_BASKET = \"eec.add\",\r\n    REMOVE_FROM_BASKET = \"eec.remove\",\r\n    CLICK = \"eec.impressionClick\",\r\n    DETAIL_VIEW = \"eec.detail\",\r\n    IMPRESSION_VIEW = \"eec.impressionView\",\r\n    PROMO_VIEW = \"eec.promotionView\",\r\n    PROMO_CLICK = \"eec.promotionClick\",\r\n    VOUCHER = \"eec.voucher\"\r\n}\r\n\r\nenum CurrencyCodes {\r\n    DKK = \"DKK\"\r\n}\r\n\r\nenum TrackingDimensions {\r\n    CAMPAIGN_ID = \"dimension2\",\r\n    MEMBERSHIP_TYPE = \"dimension3\",\r\n    PAYMENT_PERIOD = \"dimension4\",\r\n    DISCOUNT_SPLASH = \"dimension5\"\r\n}\r\n\r\ninterface ITrackingProduct {\r\n    name?: string;\r\n    id?: string;\r\n    price?: number;\r\n    quantity?: number;\r\n    [TrackingDimensions.MEMBERSHIP_TYPE]?: MembershipType | string;\r\n    [TrackingDimensions.PAYMENT_PERIOD]?: string;\r\n    [TrackingDimensions.DISCOUNT_SPLASH]?: string;\r\n}\r\n\r\ninterface IProductImpression extends ITrackingProduct {\r\n    list?: string;\r\n    position: number | undefined;\r\n}\r\n\r\ninterface ICheckoutActionField {\r\n    step: string;\r\n    [TrackingDimensions.CAMPAIGN_ID]?: string;\r\n    option?: string;\r\n    coupon?: string;\r\n}\r\n\r\ninterface IEcommerceTrackingEvent<T> {\r\n    event: EventTypes;\r\n    ecommerce: T & { currencyCode?: CurrencyCodes };\r\n}\r\n\r\ninterface ITrackingEvent {\r\n    event: \"trackEvent\";\r\n    eventData: {\r\n        category: string;\r\n        action: string;\r\n        label: string;\r\n    };\r\n}\r\n\r\nconst mapProductsToTrackingProducts = (\r\n    { title, primaryPriceNumber, productId, quantityNumber, discounts }: IBasketProduct,\r\n    membershipType?: MembershipType,\r\n    paymentPeriod?: string\r\n): ITrackingProduct => {\r\n    const product: ITrackingProduct = {\r\n        name: title,\r\n        price: primaryPriceNumber,\r\n        quantity: quantityNumber || 1,\r\n        [TrackingDimensions.MEMBERSHIP_TYPE]: membershipType || \"\",\r\n        [TrackingDimensions.PAYMENT_PERIOD]: paymentPeriod || \"\",\r\n        [TrackingDimensions.DISCOUNT_SPLASH]: discounts?.map(discount => discount.label).join(\" | \") || \"\"\r\n    };\r\n\r\n    if (productId) {\r\n        product.id = productId;\r\n    }\r\n\r\n    return product;\r\n};\r\n\r\nexport interface ISignupTrackingParams {\r\n    campaignId?: string;\r\n    membershipType?: MembershipType;\r\n    currentStepIndex: number;\r\n    paymentPeriod?: string;\r\n    miniBasketProducts?: IBasketProduct[];\r\n}\r\n\r\ninterface ISignupTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        checkout: {\r\n            actionField: ICheckoutActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generateSignupTrackingEvent = ({\r\n    membershipType,\r\n    campaignId,\r\n    miniBasketProducts,\r\n    currentStepIndex,\r\n    paymentPeriod\r\n}: ISignupTrackingParams): ISignupTrackingEvent => {\r\n    const actionField: ICheckoutActionField = {\r\n        step: (currentStepIndex + 1).toString(),\r\n        option: currentStepIndex > 0 ? paymentPeriod : \"\"\r\n    };\r\n\r\n    actionField[TrackingDimensions.CAMPAIGN_ID] = campaignId || \"\";\r\n\r\n    const products: ITrackingProduct[] = miniBasketProducts\r\n        ? miniBasketProducts.map(product =>\r\n              mapProductsToTrackingProducts(product, membershipType, paymentPeriod)\r\n          )\r\n        : [];\r\n\r\n    const signupTrackingEvent = {\r\n        event: EventTypes.SIGNUP,\r\n        ecommerce: {\r\n            checkout: {\r\n                actionField,\r\n                products\r\n            }\r\n        }\r\n    };\r\n\r\n    return signupTrackingEvent;\r\n};\r\n\r\ninterface ICheckoutTrackingParams {\r\n    products?: IBasketProduct[];\r\n    paymentMethod?: string;\r\n    step: number;\r\n}\r\n\r\ninterface ICheckoutTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        checkout: {\r\n            actionField: ICheckoutActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generateCheckoutTrackingEvent = ({\r\n    products,\r\n    step,\r\n    paymentMethod\r\n}: ICheckoutTrackingParams): ICheckoutTrackingEvent => {\r\n    const actionField: ICheckoutActionField = {\r\n        step: `${step}`\r\n    };\r\n\r\n    if (paymentMethod) {\r\n        actionField.option = paymentMethod;\r\n    }\r\n\r\n    const mappedProducts: ITrackingProduct[] = products\r\n        ? products.map(product => mapProductsToTrackingProducts(product))\r\n        : [];\r\n\r\n    return {\r\n        event: EventTypes.CHECKOUT,\r\n        ecommerce: {\r\n            checkout: {\r\n                actionField,\r\n                products: mappedProducts\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IPurchaseTrackingParams {\r\n    membershipType?: MembershipType;\r\n    miniBasketProducts?: IBasketProduct[];\r\n    // miniBasketSummation?: IBasketSummationProps;\r\n    orderId?: string;\r\n    campaignId?: string;\r\n}\r\n\r\ninterface IPurchaseActionField {\r\n    [TrackingDimensions.CAMPAIGN_ID]?: string;\r\n    coupon?: string;\r\n    revenue?: number;\r\n    shipping?: number;\r\n    tax?: number;\r\n    id?: string;\r\n}\r\n\r\ninterface IPurchaseTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        purchase: {\r\n            actionField: IPurchaseActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generatePurchaseTrackingEvent = ({\r\n    membershipType,\r\n    miniBasketProducts,\r\n    // miniBasketSummation,\r\n    orderId,\r\n    campaignId\r\n}: IPurchaseTrackingParams): IPurchaseTrackingEvent => {\r\n    const actionField: IPurchaseActionField = {};\r\n\r\n    if (orderId) {\r\n        actionField.id = orderId;\r\n    }\r\n\r\n    actionField[TrackingDimensions.CAMPAIGN_ID] = campaignId || \"\";\r\n\r\n    // if (miniBasketSummation) {\r\n    //     actionField.tax = miniBasketSummation.vatNumber;\r\n    //     actionField.revenue = miniBasketSummation.totalPriceNumber;\r\n\r\n    //     if (miniBasketSummation.shippingFee) {\r\n    //         actionField.shipping = miniBasketSummation.shippingFeeNumber;\r\n    //     }\r\n    //     if (miniBasketSummation.voucherDiscount) {\r\n    //         actionField.coupon = miniBasketSummation.voucherDiscount;\r\n    //     }\r\n    // }\r\n\r\n    const products: ITrackingProduct[] = miniBasketProducts\r\n        ? miniBasketProducts.map(product => mapProductsToTrackingProducts(product, membershipType))\r\n        : [];\r\n\r\n    const purchaseTrackingEvent = {\r\n        event: EventTypes.PURCHASE,\r\n        ecommerce: {\r\n            currencyCode: CurrencyCodes.DKK,\r\n            purchase: {\r\n                actionField,\r\n                products\r\n            }\r\n        }\r\n    };\r\n\r\n    return purchaseTrackingEvent;\r\n};\r\n\r\ninterface IClickActionField {\r\n    list: string;\r\n}\r\n\r\ninterface IClickTrackingParams\r\n    extends Pick<IProductTileProps, \"trackingList\" | \"trackingPosition\" | \"productId\" | \"title\"> {}\r\n\r\ninterface IClickTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        click: {\r\n            actionField: IClickActionField;\r\n            products: IProductImpression[];\r\n        };\r\n    }> {}\r\n\r\nconst generateClickTrackingEvent = ({\r\n    trackingList,\r\n    trackingPosition,\r\n    productId,\r\n    title\r\n}: IClickTrackingParams): IClickTrackingEvent => {\r\n    return {\r\n        event: EventTypes.CLICK,\r\n        ecommerce: {\r\n            click: {\r\n                actionField: {\r\n                    list: trackingList\r\n                },\r\n                products: [\r\n                    {\r\n                        id: productId,\r\n                        name: title,\r\n                        position: trackingPosition\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IDetailActionField {\r\n    list: string;\r\n}\r\n\r\ninterface IDetailViewTrackingParams extends Pick<IProduct, \"title\" | \"productId\"> {\r\n    trackingList: string;\r\n}\r\n\r\ninterface IDetailViewTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        detail: {\r\n            actionField: IDetailActionField;\r\n            products: ITrackingProduct[];\r\n        };\r\n    }> {}\r\n\r\nconst generateDetailViewTrackingEvent = ({\r\n    title,\r\n    productId,\r\n    trackingList\r\n}: IDetailViewTrackingParams): IDetailViewTrackingEvent => {\r\n    return {\r\n        event: EventTypes.DETAIL_VIEW,\r\n        ecommerce: {\r\n            detail: {\r\n                actionField: {\r\n                    list: trackingList\r\n                },\r\n                products: [\r\n                    {\r\n                        id: productId,\r\n                        name: title\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IBasketTrackingParams {\r\n    products?: IBasketProduct[];\r\n    trackingList: string;\r\n}\r\n\r\ninterface IAddToBasketTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        add: {\r\n            actionField: { list: string };\r\n            products: ITrackingProduct[] | undefined;\r\n        };\r\n    }> {}\r\n\r\nconst generateAddToBasketTrackingEvent = ({\r\n    products,\r\n    trackingList\r\n}: IBasketTrackingParams): IAddToBasketTrackingEvent => {\r\n    const basketProducts = products && products.map(product => mapProductsToTrackingProducts(product));\r\n\r\n    return {\r\n        event: EventTypes.ADD_TO_BASKET,\r\n        ecommerce: {\r\n            add: {\r\n                actionField: { list: trackingList },\r\n                products: basketProducts\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IRemoveFromBasketTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        remove: {\r\n            actionField: { list: string };\r\n            products: ITrackingProduct[] | undefined;\r\n        };\r\n    }> {}\r\n\r\nconst generateRemoveFromBasketTrackingEvent = ({\r\n    products,\r\n    trackingList\r\n}: IBasketTrackingParams): IRemoveFromBasketTrackingEvent => {\r\n    const basketProducts = products && products.map(product => mapProductsToTrackingProducts(product));\r\n\r\n    return {\r\n        event: EventTypes.REMOVE_FROM_BASKET,\r\n        ecommerce: {\r\n            remove: {\r\n                actionField: { list: trackingList },\r\n                products: basketProducts\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IVoucherTrackingParams {\r\n    // summation?: IBasketSummationProps;\r\n    caller: string;\r\n    action: string;\r\n}\r\ninterface IVoucherTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        // summation?: IBasketSummationProps;\r\n        caller: string;\r\n        action: string;\r\n    }> {}\r\n\r\nconst generateVoucherTrackingEvent = (props: IVoucherTrackingParams): IVoucherTrackingEvent => {\r\n    return {\r\n        event: EventTypes.VOUCHER,\r\n        ecommerce: {\r\n            // summation: props.summation,\r\n            caller: props.caller,\r\n            action: props.action\r\n        }\r\n    };\r\n};\r\n\r\ninterface IImpressionViewTrackingParams\r\n    extends Required<Pick<IProductTileProps, \"trackingList\" | \"trackingPosition\" | \"productId\" | \"title\">> {}\r\n\r\ninterface IImpressionViewTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        impressions: IProductImpression[];\r\n    }> {}\r\n\r\nconst generateImpressionViewTrackingEvent = (\r\n    products: IImpressionViewTrackingParams[]\r\n): IImpressionViewTrackingEvent => {\r\n    return {\r\n        event: EventTypes.IMPRESSION_VIEW,\r\n        ecommerce: {\r\n            impressions: products.map(product => {\r\n                return {\r\n                    list: product.trackingList,\r\n                    position: product.trackingPosition,\r\n                    id: product.productId,\r\n                    name: product.title\r\n                };\r\n            })\r\n        }\r\n    };\r\n};\r\n\r\ninterface IPromoViewTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        promoView: {\r\n            promotions: Array<{\r\n                id: string;\r\n                name: string;\r\n                creative: string;\r\n                position: string;\r\n            }>;\r\n        };\r\n    }> {}\r\n\r\nconst generatePromoViewTrackingEvent = (): IPromoViewTrackingEvent => {\r\n    return {\r\n        event: EventTypes.PROMO_VIEW,\r\n        ecommerce: {\r\n            promoView: {\r\n                promotions: [\r\n                    {\r\n                        id: \"\",\r\n                        name: \"Splash\",\r\n                        creative: \"\",\r\n                        position: \"\"\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\ninterface IPromoClickTrackingEvent\r\n    extends IEcommerceTrackingEvent<{\r\n        promoClick: {\r\n            promotions: Array<{\r\n                id: string;\r\n                name: string;\r\n                creative: string;\r\n                position: string;\r\n            }>;\r\n        };\r\n    }> {}\r\n\r\nconst generatePromoClickTrackingEvent = (): IPromoClickTrackingEvent => {\r\n    return {\r\n        event: EventTypes.PROMO_CLICK,\r\n        ecommerce: {\r\n            promoClick: {\r\n                promotions: [\r\n                    {\r\n                        id: \"\",\r\n                        name: \"Splash\",\r\n                        creative: \"\",\r\n                        position: \"\"\r\n                    }\r\n                ]\r\n            }\r\n        }\r\n    };\r\n};\r\n\r\nconst ensureDataLayer = () => {\r\n    if (typeof window === \"undefined\") {\r\n        return false;\r\n    }\r\n\r\n    window.dataLayer = window.dataLayer || [];\r\n    return true;\r\n};\r\n\r\nconst pushEcommerenceTrackingEvent = (trackingEvent: IEcommerceTrackingEvent<unknown>) => {\r\n    if (ensureDataLayer()) window.dataLayer.push(trackingEvent);\r\n};\r\n\r\nexport const pushTrackingEvent = (trackingEvent: ITrackingEvent) => {\r\n    if (ensureDataLayer()) window.dataLayer.push(trackingEvent);\r\n};\r\n\r\nexport const pushAddToBasketTrackingEvent = (props: IBasketTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateAddToBasketTrackingEvent(props));\r\n\r\nexport const pushRemoveFromBasketTrackingEvent = (props: IBasketTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateRemoveFromBasketTrackingEvent(props));\r\n\r\nexport const pushSignupTrackingEvent = (props: ISignupTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateSignupTrackingEvent(props));\r\n\r\nexport const pushCheckoutTrackingEvent = (props: ICheckoutTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateCheckoutTrackingEvent(props));\r\n\r\nexport const pushPurchaseTrackingEvent = (props: IPurchaseTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generatePurchaseTrackingEvent(props));\r\n\r\nexport const pushClickTrackingEvent = (props: IClickTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateClickTrackingEvent(props));\r\n\r\nexport const pushDetailViewTrackingEvent = (props: IDetailViewTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateDetailViewTrackingEvent(props));\r\n\r\nexport const pushImpressionViewTrackingEvent = (props: IImpressionViewTrackingParams[]) =>\r\n    pushEcommerenceTrackingEvent(generateImpressionViewTrackingEvent(props));\r\n\r\nexport const pushPromoViewTrackingEvent = () =>\r\n    pushEcommerenceTrackingEvent(generatePromoViewTrackingEvent());\r\n\r\nexport const pushPromoClickTrackingEvent = () =>\r\n    pushEcommerenceTrackingEvent(generatePromoClickTrackingEvent());\r\n\r\nexport const pushVoucherTrackingEvent = (props: IVoucherTrackingParams) =>\r\n    pushEcommerenceTrackingEvent(generateVoucherTrackingEvent(props));\r\n","import * as React from \"react\";\r\n\r\nexport interface ProductImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"src\" | \"srcSet\"> {\r\n    className?: string;\r\n    fallbackSrc?: string;\r\n    srcSet: string;\r\n    sizes?: string;\r\n    loading?: React.ImgHTMLAttributes<HTMLImageElement>[\"loading\"];\r\n    ref?: React.Ref<HTMLImageElement>;\r\n    width?: string | number;\r\n    height?: string | number;\r\n}\r\n\r\nconst ProductImage: React.FC<ProductImageProps> = React.forwardRef(\r\n    ({ fallbackSrc, loading = \"lazy\", ...props }, ref) => {\r\n        return <img ref={ref} src={fallbackSrc} loading={loading} {...props} />;\r\n    }\r\n);\r\n\r\nexport default ProductImage;\r\n","import * as React from \"react\";\r\nimport { IProductAuthor } from \"~/types/product\";\r\nimport TruncateMarkup from \"react-truncate-markup\";\r\nimport classNames from \"classnames\";\r\n\r\ninterface IProductAuthorProps {\r\n    authors?: IProductAuthor[];\r\n    maxLines?: number;\r\n    className?: string;\r\n}\r\n\r\nconst ProductAuthors: React.FC<IProductAuthorProps> = ({ authors, className, maxLines }) => {\r\n    if (!authors?.length) {\r\n        return null;\r\n    }\r\n\r\n    const baseClass = \"product-authors\";\r\n    const classes = classNames(baseClass, className);\r\n\r\n    const Wrapper: React.FC = ({ children }) =>\r\n        maxLines ? (\r\n            <TruncateMarkup lines={maxLines}>{children}</TruncateMarkup>\r\n        ) : (\r\n            <React.Fragment>{children}</React.Fragment>\r\n        );\r\n\r\n    return (\r\n        <Wrapper>\r\n            <ul className={classes}>\r\n                {authors.map((author, index) => {\r\n                    return (\r\n                        <li key={index} className={`${baseClass}__item`}>\r\n                            {author.url ? (\r\n                                <a href={author.url} title={author.name}>\r\n                                    {author.name}\r\n                                </a>\r\n                            ) : (\r\n                                <span>{author.name}</span>\r\n                            )}\r\n                        </li>\r\n                    );\r\n                })}\r\n            </ul>\r\n        </Wrapper>\r\n    );\r\n};\r\n\r\nexport default ProductAuthors;\r\n","import * as React from \"react\";\r\nimport Icon, { TIconNames } from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\n\r\ninterface ISwiperButtonProps {\r\n    className?: string;\r\n    direction: \"LEFT\" | \"RIGHT\";\r\n    onClick?: () => void;\r\n}\r\n\r\nconst SwiperButton: React.SFC<ISwiperButtonProps> = ({ className, direction, onClick }) => {\r\n    const baseClass = \"swiper-button\";\r\n    const classes = classNames(baseClass, className, {\r\n        [`${baseClass}--right`]: direction === \"RIGHT\",\r\n        [`${baseClass}--left`]: direction === \"LEFT\"\r\n    });\r\n    const iconId: TIconNames = direction === \"RIGHT\" ? \"icon_16_arrow-right\" : \"icon_16_arrow-left\";\r\n\r\n    return (\r\n        <button tabIndex={0} className={classes} onClick={onClick}>\r\n            <Icon className=\"swiper-button__icon\" iconId={iconId} />\r\n        </button>\r\n    );\r\n};\r\n\r\nexport default SwiperButton;\r\n","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n    if (condition) {\n        return;\n    }\n    if (isProduction) {\n        throw new Error(prefix);\n    }\n    throw new Error(prefix + \": \" + (message || ''));\n}\n\nexport default invariant;\n","import { createElement, Component, useRef, useState, useCallback, useEffect } from 'react';\nimport invariant from 'tiny-invariant';\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nvar INSTANCE_MAP = new Map();\nvar OBSERVER_MAP = new Map();\nvar ROOT_IDS = new Map();\nvar consecutiveRootId = 0;\n/**\n * Generate a unique ID for the root element\n * @param root\n */\n\nfunction getRootId(root) {\n  if (!root) return '';\n  if (ROOT_IDS.has(root)) return ROOT_IDS.get(root);\n  consecutiveRootId += 1;\n  ROOT_IDS.set(root, consecutiveRootId.toString());\n  return ROOT_IDS.get(root) + '_';\n}\n/**\n * Monitor element, and trigger callback when element becomes inView\n * @param element {HTMLElement}\n * @param callback {Function} Called with inView\n * @param options {Object} InterSection observer options\n * @param options.threshold {Number} Number between 0 and 1, indicating how much of the element should be inView before triggering\n * @param options.root {HTMLElement}\n * @param options.rootMargin {String} The CSS margin to apply to the root element.\n */\n\n\nfunction observe(element, callback, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  // IntersectionObserver needs a threshold to trigger, so set it to 0 if it's not defined.\n  // Modify the options object, since it's used in the onChange handler.\n  if (!options.threshold) options.threshold = 0;\n  var _options = options,\n      root = _options.root,\n      rootMargin = _options.rootMargin,\n      threshold = _options.threshold; // Validate that the element is not being used in another <Observer />\n\n  !!INSTANCE_MAP.has(element) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"react-intersection-observer: Trying to observe %s, but it's already being observed by another instance.\\nMake sure the `ref` is only used by a single <Observer /> instance.\\n\\n%s\") : invariant(false) : void 0;\n  /* istanbul ignore if */\n\n  if (!element) return; // Create a unique ID for this observer instance, based on the root, root margin and threshold.\n  // An observer with the same options can be reused, so lets use this fact\n\n  var observerId = getRootId(root) + (rootMargin ? threshold.toString() + \"_\" + rootMargin : threshold.toString());\n  var observerInstance = OBSERVER_MAP.get(observerId);\n\n  if (!observerInstance) {\n    observerInstance = new IntersectionObserver(onChange, options);\n    /* istanbul ignore else  */\n\n    if (observerId) OBSERVER_MAP.set(observerId, observerInstance);\n  }\n\n  var instance = {\n    callback: callback,\n    element: element,\n    inView: false,\n    observerId: observerId,\n    observer: observerInstance,\n    // Make sure we have the thresholds value. It's undefined on a browser like Chrome 51.\n    thresholds: observerInstance.thresholds || (Array.isArray(threshold) ? threshold : [threshold])\n  };\n  INSTANCE_MAP.set(element, instance);\n  observerInstance.observe(element);\n  return instance;\n}\n/**\n * Stop observing an element. If an element is removed from the DOM or otherwise destroyed,\n * make sure to call this method.\n * @param element {Element}\n */\n\nfunction unobserve(element) {\n  if (!element) return;\n  var instance = INSTANCE_MAP.get(element);\n\n  if (instance) {\n    var observerId = instance.observerId,\n        observer = instance.observer;\n    var root = observer.root;\n    observer.unobserve(element); // Check if we are still observing any elements with the same threshold.\n\n    var itemsLeft = false; // Check if we still have observers configured with the same root.\n\n    var rootObserved = false;\n    /* istanbul ignore else  */\n\n    if (observerId) {\n      INSTANCE_MAP.forEach(function (item, key) {\n        if (key !== element) {\n          if (item.observerId === observerId) {\n            itemsLeft = true;\n            rootObserved = true;\n          }\n\n          if (item.observer.root === root) {\n            rootObserved = true;\n          }\n        }\n      });\n    }\n\n    if (!rootObserved && root) ROOT_IDS[\"delete\"](root);\n\n    if (observer && !itemsLeft) {\n      // No more elements to observe for threshold, disconnect observer\n      observer.disconnect();\n    } // Remove reference to element\n\n\n    INSTANCE_MAP[\"delete\"](element);\n  }\n}\n\nfunction onChange(changes) {\n  changes.forEach(function (intersection) {\n    var isIntersecting = intersection.isIntersecting,\n        intersectionRatio = intersection.intersectionRatio,\n        target = intersection.target;\n    var instance = INSTANCE_MAP.get(target); // Firefox can report a negative intersectionRatio when scrolling.\n\n    /* istanbul ignore else */\n\n    if (instance && intersectionRatio >= 0) {\n      // If threshold is an array, check if any of them intersects. This just triggers the onChange event multiple times.\n      var inView = instance.thresholds.some(function (threshold) {\n        return instance.inView ? intersectionRatio > threshold : intersectionRatio >= threshold;\n      });\n\n      if (isIntersecting !== undefined) {\n        // If isIntersecting is defined, ensure that the element is actually intersecting.\n        // Otherwise it reports a threshold of 0\n        inView = inView && isIntersecting;\n      }\n\n      instance.inView = inView;\n      instance.callback(inView, intersection);\n    }\n  });\n}\n\nfunction isPlainChildren(props) {\n  return typeof props.children !== 'function';\n}\n/**\n * Monitors scroll, and triggers the children function with updated props\n *\n <InView>\n {({inView, ref}) => (\n   <h1 ref={ref}>{`${inView}`}</h1>\n )}\n </InView>\n */\n\n\nvar InView = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(InView, _React$Component);\n\n  function InView() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n    _defineProperty(_assertThisInitialized(_this), \"state\", {\n      inView: false,\n      entry: undefined\n    });\n\n    _defineProperty(_assertThisInitialized(_this), \"node\", null);\n\n    _defineProperty(_assertThisInitialized(_this), \"handleNode\", function (node) {\n      if (_this.node) {\n        unobserve(_this.node);\n\n        if (!node && !_this.props.triggerOnce && !_this.props.skip) {\n          _this.setState({\n            inView: false,\n            entry: undefined\n          });\n        }\n      }\n\n      _this.node = node ? node : null;\n\n      _this.observeNode();\n    });\n\n    _defineProperty(_assertThisInitialized(_this), \"handleChange\", function (inView, entry) {\n      // Only trigger a state update if inView has changed.\n      // This prevents an unnecessary extra state update during mount, when the element stats outside the viewport\n      if (inView !== _this.state.inView || inView) {\n        _this.setState({\n          inView: inView,\n          entry: entry\n        });\n      }\n\n      if (_this.props.onChange) {\n        // If the user is actively listening for onChange, always trigger it\n        _this.props.onChange(inView, entry);\n      }\n    });\n\n    return _this;\n  }\n\n  var _proto = InView.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    !this.node ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"react-intersection-observer: No DOM node found. Make sure you forward \\\"ref\\\" to the root DOM element you want to observe.\") : invariant(false) : void 0;\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    // If a IntersectionObserver option changed, reinit the observer\n    if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip) {\n      unobserve(this.node);\n      this.observeNode();\n    }\n\n    if (prevState.inView !== this.state.inView) {\n      if (this.state.inView && this.props.triggerOnce) {\n        unobserve(this.node);\n        this.node = null;\n      }\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.node) {\n      unobserve(this.node);\n      this.node = null;\n    }\n  };\n\n  _proto.observeNode = function observeNode() {\n    if (!this.node || this.props.skip) return;\n    var _this$props = this.props,\n        threshold = _this$props.threshold,\n        root = _this$props.root,\n        rootMargin = _this$props.rootMargin;\n    observe(this.node, this.handleChange, {\n      threshold: threshold,\n      root: root,\n      rootMargin: rootMargin\n    });\n  };\n\n  _proto.render = function render() {\n    var _this$state = this.state,\n        inView = _this$state.inView,\n        entry = _this$state.entry;\n\n    if (!isPlainChildren(this.props)) {\n      return this.props.children({\n        inView: inView,\n        entry: entry,\n        ref: this.handleNode\n      });\n    }\n\n    var _this$props2 = this.props,\n        children = _this$props2.children,\n        as = _this$props2.as,\n        tag = _this$props2.tag,\n        triggerOnce = _this$props2.triggerOnce,\n        threshold = _this$props2.threshold,\n        root = _this$props2.root,\n        rootMargin = _this$props2.rootMargin,\n        onChange = _this$props2.onChange,\n        props = _objectWithoutPropertiesLoose(_this$props2, [\"children\", \"as\", \"tag\", \"triggerOnce\", \"threshold\", \"root\", \"rootMargin\", \"onChange\"]);\n\n    return /*#__PURE__*/createElement(as || tag || 'div', _extends({\n      ref: this.handleNode\n    }, props), children);\n  };\n\n  return InView;\n}(Component);\n\n_defineProperty(InView, \"displayName\", 'InView');\n\n_defineProperty(InView, \"defaultProps\", {\n  threshold: 0,\n  triggerOnce: false\n});\n\n/* eslint-disable react-hooks/exhaustive-deps */\nvar initialState = {\n  inView: false,\n  entry: undefined\n};\nfunction useInView(options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var ref = useRef();\n\n  var _React$useState = useState(initialState),\n      state = _React$useState[0],\n      setState = _React$useState[1];\n\n  var setRef = useCallback(function (node) {\n    if (ref.current) {\n      unobserve(ref.current);\n    }\n\n    if (options.skip) {\n      ref.current = undefined;\n      return;\n    }\n\n    if (node) {\n      observe(node, function (inView, intersection) {\n        setState({\n          inView: inView,\n          entry: intersection\n        });\n\n        if (inView && options.triggerOnce) {\n          // If it should only trigger once, unobserve the element after it's inView\n          unobserve(node);\n        }\n      }, options);\n    } // Store a reference to the node, so we can unobserve it later\n\n\n    ref.current = node;\n  }, [options.threshold, options.root, options.rootMargin, options.triggerOnce, options.skip]);\n  useEffect(function () {\n    if (!ref.current && state !== initialState && !options.triggerOnce && !options.skip) {\n      // If we don't have a ref, then reset the state (unless the hook is set to only `triggerOnce` or `skip`)\n      // This ensures we correctly reflect the current state - If you aren't observing anything, then nothing is inView\n      setState(initialState);\n    }\n  });\n  return [setRef, state.inView, state.entry];\n}\n\nexport default InView;\nexport { InView, useInView };\n","import * as React from \"react\";\r\nimport Slider, { Settings } from \"react-slick\";\r\nimport SwiperButton from \"~/components/swiper/swiper-button\";\r\nimport classNames from \"classnames\";\r\n\r\ninterface ISliderSwiperProps {\r\n    settings: Settings;\r\n    className?: string;\r\n    buttonClassName?: string;\r\n}\r\n\r\nconst SliderSwiper: React.FC<ISliderSwiperProps> = props => {\r\n    const buttonBaseClass = \"custom-slick-arrow\";\r\n    const buttonClasses = classNames(buttonBaseClass, props.buttonClassName);\r\n\r\n    return (\r\n        <div className=\"slider-swiper slider-swiper--hasPaddingBottom\">\r\n            <Slider\r\n                nextArrow={<SwiperButton className={buttonClasses} direction=\"RIGHT\" />}\r\n                prevArrow={<SwiperButton className={buttonClasses} direction=\"LEFT\" />}\r\n                draggable\r\n                infinite={false}\r\n                speed={300}\r\n                {...props.settings}\r\n            >\r\n                {props.children}\r\n            </Slider>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default SliderSwiper;\r\n","import { IDiscountOffer } from \"./discount-offer\";\r\n\r\nexport enum PriceTypesEnum {\r\n    \"CLUB\" = \"CLUB\",\r\n    \"VIP\" = \"VIP\",\r\n    \"SPOT\" = \"SPOT\"\r\n}\r\nexport type PriceTypes = keyof typeof PriceTypesEnum;\r\n\r\nexport enum ProductStatusEnum {\r\n    \"NEWS\" = \"NEWS\",\r\n    \"BESTSELLER\" = \"BESTSELLER\",\r\n    \"SPOT\" = \"SPOT\",\r\n    \"BOOK_OF_THE_MONTH\" = \"BOOK_OF_THE_MONTH\",\r\n    \"UPCOMING\" = \"UPCOMING\"\r\n}\r\nexport type ProductStatus = keyof typeof ProductStatusEnum;\r\n\r\nexport enum ProductStockStatusEnum {\r\n    \"LOW_IN_STOCK\" = \"warning\",\r\n    \"OUT_OF_STOCK\" = \"error\"\r\n}\r\n\r\nexport type ProductStockStatus = keyof typeof ProductStockStatusEnum;\r\n\r\nexport interface IProductAuthor {\r\n    name: string;\r\n    url?: string;\r\n}\r\n\r\nexport interface IProductDiscount {\r\n    label?: string;\r\n    value?: string;\r\n}\r\n\r\nexport interface IProduct {\r\n    productId: string;\r\n    title: string;\r\n    description?: string;\r\n    authors?: IProductAuthor[];\r\n    imageFallbackSrc?: string;\r\n    imageSrcSet?: string;\r\n    priceType?: PriceTypes;\r\n    status?: ProductStatus;\r\n    statusLabel?: string;\r\n    url?: string;\r\n    target?: string;\r\n    isCurrentBookOfTheMonth?: boolean;\r\n    bookOfTheMonthStatusLabel?: string;\r\n    materialType?: string;\r\n    ctaLink?: string;\r\n    primaryPrice?: string;\r\n}\r\n\r\nexport interface IBasketProduct extends IProduct {\r\n    quantityNumber: number;\r\n    quantity: string;\r\n    discountsModalTitle?: string;\r\n    totalLabel?: string;\r\n    priceLabel?: string;\r\n    discountLabel?: string;\r\n    calculatedPrimaryPrice: string;\r\n    calculatedPrimaryPriceNumber: number;\r\n    calculatedSecondaryPrice?: string;\r\n    calculatedSecondaryPriceNumber?: number;\r\n    isFree?: boolean;\r\n    materialType?: string;\r\n    numberOfProductsLabel?: string;\r\n    deliveryLabel?: string;\r\n    deliveryDetails?: string;\r\n    stockStatus?: ProductStockStatus;\r\n    stockStatusLabel?: string;\r\n    stockStatusDetails?: string;\r\n    discountOffer?: IDiscountOffer;\r\n    primaryPrice?: string;\r\n    primaryPriceNumber?: number;\r\n    secondaryPrice?: string;\r\n    discount?: string;\r\n    discounts?: IProductDiscount[];\r\n}\r\n","import classNames from \"classnames\";\r\nimport * as React from \"react\";\r\n// import ProductDiscountSplash from \"../product-discount-splash/product-discount-splash\";\r\nimport ProductImage, { ProductImageProps } from \"../product-image/product-image\";\r\nimport Icon from \"../icons/icon\";\r\nimport { IProductTileChildProps, IProductTileProps } from \"./product-tile\";\r\nimport Tag from \"../tag/tag\";\r\n\r\ninterface IProductTileImageProps\r\n    extends Pick<\r\n            IProductTileProps,\r\n            | \"hasQuickView\"\r\n            | \"imageSrcSet\"\r\n            | \"imageFallbackSrc\"\r\n            | \"url\"\r\n            | \"target\"\r\n            | \"title\"\r\n            // | \"discount\"\r\n            | \"status\"\r\n        >,\r\n        Pick<ProductImageProps, \"sizes\">,\r\n        IProductTileChildProps {\r\n    detailsLabel?: string;\r\n    hideStatus?: boolean;\r\n    statusLabel?: string;\r\n}\r\n\r\nconst ProductTileImage: React.FC<IProductTileImageProps> = ({\r\n    hasQuickView,\r\n    baseClass,\r\n    url,\r\n    target,\r\n    title,\r\n    imageSrcSet,\r\n    imageFallbackSrc,\r\n    sizes,\r\n    // discount,\r\n    detailsLabel,\r\n    hideStatus,\r\n    status,\r\n    statusLabel,\r\n    onClick\r\n}) => {\r\n    const imageBaseClasses = classNames(`${baseClass}__image-wrapper`, {\r\n        [`${baseClass}__image-wrapper--hasQuickView`]: hasQuickView\r\n    });\r\n\r\n    const Image = () =>\r\n        imageSrcSet ? (\r\n            <ProductImage\r\n                className=\"product-tile__image\"\r\n                srcSet={imageSrcSet}\r\n                fallbackSrc={imageFallbackSrc}\r\n                sizes={sizes || \"200px\"}\r\n                alt={title}\r\n            />\r\n        ) : null;\r\n\r\n    return hasQuickView ? (\r\n        <div className={imageBaseClasses} onClick={onClick}>\r\n            <Image />\r\n            {/* {discount && <ProductDiscountSplash discount={discount} />} */}\r\n            <button className={`${baseClass}__details-button`}>\r\n                <Icon iconId=\"24_expand\" className={`${baseClass}__details-icon`} />\r\n                <span>{detailsLabel}</span>\r\n            </button>\r\n        </div>\r\n    ) : (\r\n        <a className={imageBaseClasses} href={url} target={target} onClick={onClick}>\r\n            {!hideStatus && !!status && (\r\n                <Tag className={`${baseClass}__status-tag`} type={status}>\r\n                    {statusLabel}\r\n                </Tag>\r\n            )}\r\n            <Image />\r\n            {/* {discount && (\r\n                <ProductDiscountSplash className=\"product-tile__image-discount-splash\" discount={discount} />\r\n            )} */}\r\n        </a>\r\n    );\r\n};\r\n\r\nexport default React.memo(ProductTileImage);\r\n","import React from \"react\";\r\nimport { IProductTileChildProps, IProductTileProps } from \"./product-tile\";\r\nimport TruncateMarkup from \"react-truncate-markup\";\r\n\r\ninterface IProductTileTitleProps\r\n    extends Pick<IProductTileProps, \"hasQuickView\" | \"title\" | \"url\" | \"target\">,\r\n        IProductTileChildProps {}\r\n\r\nconst ProductTileTitle: React.FC<IProductTileTitleProps> = ({\r\n    baseClass,\r\n    title,\r\n    url,\r\n    target,\r\n    onClick,\r\n    hasQuickView\r\n}) => (\r\n    <TruncateMarkup lines={2}>\r\n        {hasQuickView ? (\r\n            <button className={`${baseClass}__title reset-button`} type=\"button\" onClick={onClick}>\r\n                {title}\r\n            </button>\r\n        ) : (\r\n            <a href={url} target={target} className={`${baseClass}__title reset-a`} onClick={onClick}>\r\n                {title}\r\n            </a>\r\n        )}\r\n    </TruncateMarkup>\r\n);\r\n\r\nexport default ProductTileTitle;\r\n","import * as React from \"react\";\r\n// import ButtonAddToBasket from \"~/components/button-add-to-basket/button-add-to-basket\";\r\nimport classNames from \"classnames\";\r\nimport { IProduct, PriceTypesEnum } from \"~/types/product\";\r\nimport CtaButton from \"~/components/cta-button/cta-button\";\r\n// import Icon from \"../icons/icon\";\r\nimport { pushClickTrackingEvent, pushImpressionViewTrackingEvent } from \"~/utils/tracking-utils\";\r\nimport { useInView } from \"react-intersection-observer\";\r\nimport ProductAuthors from \"../product-authors/product-authors\";\r\n// import { useSelector } from \"react-redux\";\r\n// import { selectIsOutOfStock } from \"~/store/reducers/basket/basket-reducer\";\r\n// import { IRootState } from \"~/store/reducers\";\r\n// import ErrorMessage from \"../error-message/error-message\";\r\nimport ProductTileImage from \"./product-tile-image\";\r\nimport ProductTileTitle from \"./product-tile-title\";\r\n// import { IDiscountOffer } from \"~/types/discount-offer\";\r\n// import DiscountModal from \"../product-details/discount-modal/discount-modal\";\r\n// import ProductDiscountSplash from \"../product-discount-splash/product-discount-splash\";\r\n// import { hasDeclinedDiscountThisOffer } from \"~/utils/discount-utils\";\r\n\r\nexport interface IProductTileProps extends IProduct {\r\n    className?: string;\r\n    hideBackground?: boolean;\r\n    hideStatus?: boolean;\r\n    hideAuthors?: boolean;\r\n    hasTopPadding?: boolean;\r\n    // bottomPaddedSubText?: boolean;\r\n    // hasBottomPaddingNumberOfProducts?: boolean;\r\n    ctaLabel?: string;\r\n    ctaLink?: string;\r\n    detailsLabel?: string;\r\n    hasQuickView?: boolean;\r\n    onQuickViewClick?: () => void;\r\n    // addToBasketWebApiUrl?: string;\r\n    // secondaryPriceLabel?: string;\r\n    sizes?: string;\r\n    trackingPosition?: number;\r\n    // discountOffer?: IDiscountOffer;\r\n    trackingList: string;\r\n    showCtaAsLink?: boolean;\r\n    singleItemHighlight?: boolean;\r\n    btnIsLarge?: boolean;\r\n    description?: string;\r\n    // showDiscountOfferModal?: boolean;\r\n}\r\n\r\nexport interface IProductTileChildProps {\r\n    baseClass: string;\r\n    onClick: () => void;\r\n}\r\n\r\nconst ProductTile: React.FC<IProductTileProps> = ({\r\n    // addToBasketWebApiUrl,\r\n    authors,\r\n    // bottomPaddedSubText,\r\n    btnIsLarge,\r\n    className,\r\n    // ctaLabel,\r\n    ctaLink,\r\n    description,\r\n    detailsLabel,\r\n    // discount,\r\n    // discountOffer,\r\n    // hasBottomPaddingNumberOfProducts,\r\n    hasQuickView,\r\n    hasTopPadding,\r\n    hideAuthors,\r\n    hideBackground,\r\n    hideStatus,\r\n    imageFallbackSrc,\r\n    imageSrcSet,\r\n    // materialType,\r\n    // numberOfProductsLabel,\r\n    onQuickViewClick,\r\n    productId,\r\n    // secondaryPrice,\r\n    // secondaryPriceLabel,\r\n    showCtaAsLink,\r\n    singleItemHighlight,\r\n    sizes,\r\n    status,\r\n    statusLabel,\r\n    // stockStatusLabel,\r\n    target,\r\n    title,\r\n    trackingList,\r\n    trackingPosition,\r\n    url\r\n    // showDiscountOfferModal = false,\r\n    // ...props\r\n}) => {\r\n    // const isOutOfStock = useSelector((state: IRootState) => selectIsOutOfStock(state, productId));\r\n    // const [discountModalOpen, setDiscountModalOpen] = React.useState(false);\r\n\r\n    // const onAddToBasket = () => {\r\n    //     if (!discountOffer) {\r\n    //         return;\r\n    //     }\r\n\r\n    //     if (hasDeclinedDiscountThisOffer(discountOffer)) {\r\n    //         return;\r\n    //     }\r\n\r\n    //     if (!showDiscountOfferModal) {\r\n    //         return;\r\n    //     }\r\n\r\n    //     setDiscountModalOpen(true);\r\n    // };\r\n\r\n    const baseClass = \"product-tile\";\r\n    const classes = classNames(baseClass, className, {\r\n        [`${baseClass}--noBackground`]: hideBackground,\r\n        [`${baseClass}--hasQuickView`]: hasQuickView,\r\n        [`${baseClass}--spot`]: status === PriceTypesEnum.SPOT,\r\n        [`${baseClass}--topPadded`]: hasTopPadding,\r\n        // [`${baseClass}--bottomPaddedSubText`]: bottomPaddedSubText,\r\n        // [`${baseClass}--bottomPaddedNumberOfProducts`]: hasBottomPaddingNumberOfProducts,\r\n        [`${baseClass}--singleProduct`]: singleItemHighlight\r\n    });\r\n\r\n    const [ref, inView] = useInView({\r\n        triggerOnce: true\r\n    });\r\n\r\n    const clickTrackingEvent = () =>\r\n        pushClickTrackingEvent({\r\n            productId,\r\n            title,\r\n            trackingList,\r\n            trackingPosition\r\n        });\r\n\r\n    React.useEffect(() => {\r\n        if (inView && trackingPosition) {\r\n            pushImpressionViewTrackingEvent([\r\n                {\r\n                    productId,\r\n                    title,\r\n                    trackingList,\r\n                    trackingPosition\r\n                }\r\n            ]);\r\n        }\r\n    }, [inView]);\r\n\r\n    const onTileClick = () => {\r\n        if (hasQuickView) {\r\n            onQuickViewClick?.();\r\n        } else {\r\n            clickTrackingEvent();\r\n        }\r\n    };\r\n    // const bottomClasses = classNames(`${baseClass}__bottom`, {\r\n    //     [`${baseClass}__bottom--subText`]: secondaryPrice || stockStatusLabel,\r\n    //     [`${baseClass}__bottom--numberOfProducts`]: numberOfProductsLabel\r\n    // });\r\n\r\n    return (\r\n        <div id={`product-${productId}`} className={classes} ref={ref}>\r\n            {/* {showDiscountOfferModal && discountOffer && (\r\n                <DiscountModal\r\n                    // disableWebApiUrl={disableDiscountOfferWebApiUrl}\r\n                    isOpen={discountModalOpen}\r\n                    setOpen={setDiscountModalOpen}\r\n                    addToBasketWebApiUrl={addToBasketWebApiUrl}\r\n                    discount={discountOffer}\r\n                    secondaryPriceLabel={secondaryPriceLabel}\r\n                    {...props}\r\n                />\r\n            )} */}\r\n            <ProductTileImage\r\n                status={status}\r\n                statusLabel={statusLabel}\r\n                hideStatus={hideStatus}\r\n                hasQuickView={hasQuickView}\r\n                onClick={onTileClick}\r\n                baseClass={baseClass}\r\n                url={url}\r\n                target={target}\r\n                title={title}\r\n                detailsLabel={detailsLabel}\r\n                imageSrcSet={imageSrcSet}\r\n                imageFallbackSrc={imageFallbackSrc}\r\n                sizes={sizes}\r\n                // discount={discount}\r\n            />\r\n            {/* {singleItemHighlight && discount && (\r\n                <ProductDiscountSplash className={`${baseClass}__discount-splash`} discount={discount} />\r\n            )} */}\r\n            <div className={`${baseClass}__info-container`}>\r\n                <div className={`${baseClass}__info`}>\r\n                    <ProductTileTitle\r\n                        hasQuickView={hasQuickView}\r\n                        baseClass={baseClass}\r\n                        title={title}\r\n                        url={url}\r\n                        target={target}\r\n                        onClick={onTileClick}\r\n                    />\r\n                    {!hideAuthors && (\r\n                        <ProductAuthors\r\n                            className={`${baseClass}__product-authors`}\r\n                            authors={authors}\r\n                            maxLines={1}\r\n                        />\r\n                    )}\r\n                    {/* {materialType && <span className={`${baseClass}__material-type`}>{materialType}</span>} */}\r\n                    {singleItemHighlight && description && (\r\n                        <div\r\n                            className={`${baseClass}__description`}\r\n                            dangerouslySetInnerHTML={{ __html: description }}\r\n                        />\r\n                    )}\r\n                </div>\r\n                {ctaLink && (\r\n                    <>\r\n                        {showCtaAsLink ? (\r\n                            <div\r\n                                onClick={() => {\r\n                                    if (!hasQuickView) {\r\n                                        clickTrackingEvent();\r\n                                    }\r\n                                }}\r\n                                className={`${baseClass}__cta-link`}\r\n                                dangerouslySetInnerHTML={{ __html: ctaLink }}\r\n                            />\r\n                        ) : (\r\n                            <CtaButton\r\n                                onClick={() => {\r\n                                    if (!hasQuickView) {\r\n                                        clickTrackingEvent();\r\n                                    }\r\n                                }}\r\n                                className={`${baseClass}__button`}\r\n                                link={ctaLink}\r\n                                isLarge={btnIsLarge ?? true}\r\n                            />\r\n                        )}\r\n                    </>\r\n                )}\r\n                {/* {addToBasketWebApiUrl && !ctaLink && (\r\n                    <ButtonAddToBasket\r\n                        className={`${baseClass}__button`}\r\n                        addToBasketWebApiUrl={addToBasketWebApiUrl}\r\n                        productId={productId}\r\n                        trackingList={trackingList}\r\n                        disabled={isOutOfStock.value}\r\n                        isLarge={btnIsLarge ?? true}\r\n                        onAdd={onAddToBasket}\r\n                    >\r\n                        {ctaLabel}\r\n                    </ButtonAddToBasket>\r\n                )} */}\r\n                {/* {(secondaryPrice || stockStatusLabel || numberOfProductsLabel) && (\r\n                    <div className={bottomClasses}>\r\n                        {isOutOfStock.value && isOutOfStock.error && (\r\n                            <ErrorMessage\r\n                                className={`${baseClass}__sub-text`}\r\n                                errorSeverity=\"error\"\r\n                                errorMessage={isOutOfStock.error}\r\n                            />\r\n                        )}\r\n                        {secondaryPriceLabel && secondaryPrice && (\r\n                            <div className={`${baseClass}__sub-text ${baseClass}__secondary-price`}>\r\n                                {secondaryPriceLabel} {secondaryPrice}\r\n                            </div>\r\n                        )}\r\n                        {stockStatusLabel && (\r\n                            <div className={`${baseClass}__sub-text ${baseClass}__stock-status`}>\r\n                                {stockStatusLabel}\r\n                            </div>\r\n                        )}\r\n\r\n                        {numberOfProductsLabel && (\r\n                            <div className={`${baseClass}__number-of-products`}>\r\n                                <Icon iconId=\"32_katalog\" />\r\n                                <span>{numberOfProductsLabel}</span>\r\n                            </div>\r\n                        )}\r\n                    </div>\r\n                )} */}\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default React.memo(ProductTile);\r\n"],"sourceRoot":""}