{"version":3,"sources":["webpack:///./src/Frontend/app/utils/body-class-util.ts","webpack:///./src/Frontend/app/components/navigation/navigation-primary-links/navigation-primary-links.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-site-logo/navigation-site-logo.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-dropdown.tsx","webpack:///./src/Frontend/app/utils/input-detection-utils.ts","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-dropdown-section/navigation-dropdown-section.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-spot/navigation-spot.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-dropdown/navigation-list/navigation-list.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-search/navigation-search.tsx","webpack:///./src/Frontend/app/components/navigation/navigation-global-sites/navigation-global-sites.tsx","webpack:///./src/Frontend/app/components/navigation/navigation.tsx","webpack:///./src/Frontend/app/views/navigation/navigation-view.tsx","webpack:///./src/Frontend/app/components/icons/icon.tsx","webpack:///./src/Frontend/app/utils/image-utils.ts","webpack:///./src/Frontend/app/components/responsive-image/responsive-image.tsx","webpack:///./src/Frontend/app/utils/breakpoint-utils.ts","webpack:///./src/Frontend/app/utils/tracking-utils.ts"],"names":["toggleBodyClass","bodyClass","toggleOn","hasBodyClass","document","body","classList","contains","add","remove","NavigationLinkType","props","className","href","logoLinkUrl","src","logoSrc","alt","logoAlt","state","isOpen","offsetX","handleClickOutside","bind","keyEventHandler","open","close","componentDidMount","addEventListener","this","componentWillUnmount","removeEventListener","event","domNode","container","target","key","handleDropdownClick","ask","wolfMax","preventDefault","stopPropagation","toggle","handleMouseOver","handleMouseLeave","setState","render","rootClasses","ref","node","onMouseLeave","url","onClick","onMouseEnter","onKeyPress","e","label","iconId","height","duration","CSSTransition","in","timeout","classNames","children","rootclasses","srcUrl","imgSrc","imgAlt","title","imgTitle","sizes","srcSetSizes","defaultSize","level","style","minHeight","Math","ceil","linkList","length","reduce","generatedLinks","link","index","type","push","itemClasses","links","item","spotContent","navigationSearchLabel","visibility","baseClass","role","tabIndex","window","toggeNavigationSearch","cursor","backgroundColor","border","logoLinkTarget","loading","dangerouslySetInnerHTML","__html","richText","sites","map","site","eventData","category","action","drawerIsOpen","globalSitesNavigationIsOpen","toggleDrawer","setValue","setStateToOpen","undefined","toggleGlobalSitesNavigation","setBodyOverlay","handleClick","drawerDomNode","drawer","navigationGlobalSitesConfig","navigationSiteLogoConfig","navigationPrimaryLinksConfig","navigationSearchConfig","navigationSearchOverlayConfig","navigationClasses","navigationLinksClasses","navigationButtonClasses","hasAnyNavigation","contentClassName","applyInlineTransitions","id","inputTitle","name","autoComplete","placeholder","searchText","suggestions","suggestion","searchOn","contextModel","spriteUrl","viewBox","preserveAspectRatio","xmlnsXlink","xlinkHref","getQueryParamDelimiter","indexOf","hasExistingQueryParam","generateSrcSet","srcSetSize","parameterDelimiter","srcSetSizeHighDensity","round","join","generateColumnImageProps","maxColumns","isFullWidth","gridMaxWidthFactor","ResponsiveImage","srcSet","breakpoints","rat","rabbit","cat","dog","wolf","lion","horse","rhino","elephant","mediaQueries","Object","keys","queryStrings","currentMediaQueries","handleMediaMatch","isMatching","forEach","mediaQuery","matchMedia","matches","addListener","EventTypes","CurrencyCodes","TrackingDimensions","ensureDataLayer","dataLayer","pushEcommerenceTrackingEvent","trackingEvent","pushTrackingEvent","pushClickTrackingEvent","trackingList","trackingPosition","productId","CLICK","ecommerce","click","actionField","list","products","position","pushDetailViewTrackingEvent","DETAIL_VIEW","detail","pushImpressionViewTrackingEvent","IMPRESSION_VIEW","impressions","product"],"mappings":"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","file":"32.743dcc65875a16fde67e.js","sourcesContent":["export function toggleBodyClass(bodyClass: string, toggleOn: boolean) {\r\n    const hasBodyClass = document.body.classList.contains(bodyClass);\r\n\r\n    if (toggleOn && hasBodyClass) {\r\n        return;\r\n    }\r\n\r\n    if (toggleOn && !hasBodyClass) {\r\n        document.body.classList.add(bodyClass);\r\n    } else {\r\n        document.body.classList.remove(bodyClass);\r\n    }\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport NavigationDropdown from \"~/components/navigation/navigation-dropdown/navigation-dropdown\";\r\nimport NavigationDropdownSection from \"~/components/navigation/navigation-dropdown/navigation-dropdown-section/navigation-dropdown-section\";\r\nimport NavigationSpot, {\r\n    INavigationSpotProps\r\n} from \"~/components/navigation/navigation-dropdown/navigation-spot/navigation-spot\";\r\nimport NavigationList from \"~/components/navigation/navigation-dropdown/navigation-list/navigation-list\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport enum NavigationLinkType {\r\n    SUBMENU = \"submenu\",\r\n    LINK = \"link\",\r\n    DIVIDER = \"divider\"\r\n}\r\n\r\nexport interface INavigationLink extends IBaseLink {\r\n    type: NavigationLinkType;\r\n    spotContent?: INavigationSpotProps;\r\n    links?: INavigationLink[];\r\n}\r\n\r\nexport interface INavigationPrimaryLinksProps {\r\n    links: INavigationLink[];\r\n}\r\n\r\nconst NavigationPrimaryLinks: React.SFC<INavigationPrimaryLinksProps> = props => {\r\n    const wrapperClasses = \"navigation-primary-links\";\r\n    const itemClasses = \"navigation-primary-links__list-item\";\r\n    const generateLinks = (links: INavigationLink[]): React.ReactNode[] => {\r\n        return links.reduce((generatedLinks: React.ReactNode[], item: INavigationLink, index: number) => {\r\n            if (item.type === \"link\") {\r\n                generatedLinks.push(\r\n                    <li key={index} className={itemClasses}>\r\n                        <a\r\n                            className=\"navigation-primary-links__link reset-a\"\r\n                            href={item.url}\r\n                            target={item.target}\r\n                        >\r\n                            <div className=\"navigation-primary-links__link-inner\">\r\n                                <span>{item.label}</span>\r\n                            </div>\r\n                        </a>\r\n                    </li>\r\n                );\r\n            }\r\n\r\n            if (item.type === \"submenu\") {\r\n                generatedLinks.push(\r\n                    <li key={index} className={itemClasses}>\r\n                        <NavigationDropdown {...item}>\r\n                            {item.spotContent && (\r\n                                <NavigationDropdownSection\r\n                                    className=\"navigation-dropdown__section--spot\"\r\n                                    {...item.spotContent}\r\n                                >\r\n                                    <NavigationSpot {...item.spotContent} />\r\n                                </NavigationDropdownSection>\r\n                            )}\r\n                            <NavigationDropdownSection {...item}>\r\n                                {item.links && <NavigationList linkList={item.links} />}\r\n                            </NavigationDropdownSection>\r\n                        </NavigationDropdown>\r\n                    </li>\r\n                );\r\n            }\r\n            return generatedLinks;\r\n        }, []);\r\n    };\r\n\r\n    return (\r\n        <div className=\"navigation-primary-links-wrapper\">\r\n            <ul className={wrapperClasses}>{generateLinks(props.links)}</ul>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default NavigationPrimaryLinks;\r\n","import * as React from \"react\";\r\n\r\nexport interface INavigationSiteLogoProps {\r\n    logoSrc: string;\r\n    logoAlt: string;\r\n    logoLinkUrl: string;\r\n}\r\n\r\nconst NavigationSiteLogo: React.SFC<INavigationSiteLogoProps> = props => {\r\n    return (\r\n        <a className=\"navigation-site-logo__link\" href={props.logoLinkUrl}>\r\n            <img className=\"navigation-site-logo__img\" src={props.logoSrc} alt={props.logoAlt} />\r\n        </a>\r\n    );\r\n};\r\n\r\nexport default NavigationSiteLogo;\r\n","import * as React from \"react\";\r\nimport Icon from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\nimport { debounce } from \"~/utils/function-utils\";\r\nimport { CSSTransition } from \"react-transition-group\";\r\nimport { currentMediaQueries } from \"~/utils/breakpoint-utils\";\r\nimport AnimateHeight from \"react-animate-height\";\r\nimport { isTouchInput } from \"~/utils/input-detection-utils\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport interface INavigationDropdownState {\r\n    isOpen: boolean;\r\n    offsetX: number;\r\n}\r\n\r\nclass NavigationDropdown extends React.Component<IBaseLink, INavigationDropdownState> {\r\n    private container: HTMLDivElement | null;\r\n    public state: INavigationDropdownState = {\r\n        isOpen: false,\r\n        offsetX: 0\r\n    };\r\n\r\n    constructor(props: IBaseLink) {\r\n        super(props);\r\n\r\n        this.handleClickOutside = this.handleClickOutside.bind(this);\r\n        this.keyEventHandler = this.keyEventHandler.bind(this);\r\n        this.open = this.open.bind(this);\r\n        this.close = this.close.bind(this);\r\n    }\r\n\r\n    public componentDidMount() {\r\n        document.addEventListener(\"click\", this.handleClickOutside);\r\n        document.addEventListener(\"keyup\", this.keyEventHandler);\r\n    }\r\n\r\n    public componentWillUnmount() {\r\n        document.removeEventListener(\"click\", this.handleClickOutside);\r\n        document.removeEventListener(\"keyup\", this.keyEventHandler);\r\n    }\r\n\r\n    private handleClickOutside(event: Event) {\r\n        const domNode = this.container;\r\n        if (!domNode || (event.target && !domNode.contains(event.target as Node))) {\r\n            this.close();\r\n        }\r\n    }\r\n\r\n    private keyEventHandler(event: KeyboardEvent) {\r\n        if (event.key === \"Escape\") {\r\n            this.close();\r\n        }\r\n    }\r\n\r\n    private handleDropdownClick(event: React.MouseEvent<HTMLAnchorElement>) {\r\n        if (isTouchInput() || currentMediaQueries.wolfMax) {\r\n            event.preventDefault();\r\n            event.stopPropagation();\r\n            this.toggle();\r\n        }\r\n    }\r\n\r\n    private handleMouseOver() {\r\n        if (currentMediaQueries.wolfMax) {\r\n            return;\r\n        }\r\n        this.open();\r\n    }\r\n\r\n    private handleMouseLeave() {\r\n        if (currentMediaQueries.wolfMax) {\r\n            return;\r\n        }\r\n        this.close();\r\n    }\r\n\r\n    private open() {\r\n        this.setState({\r\n            isOpen: true\r\n        });\r\n    }\r\n\r\n    private close() {\r\n        this.setState({\r\n            isOpen: false\r\n        });\r\n    }\r\n\r\n    private toggle() {\r\n        this.setState({\r\n            isOpen: !this.state.isOpen\r\n        });\r\n    }\r\n\r\n    public render() {\r\n        const rootClasses = classNames(\"navigation-dropdown\", {\r\n            \"navigation-dropdown--isOpen\": this.state.isOpen\r\n        });\r\n\r\n        return (\r\n            <div\r\n                className={rootClasses}\r\n                ref={node => (this.container = node)}\r\n                onMouseLeave={debounce(() => this.handleMouseLeave(), 200)}\r\n            >\r\n                <div className=\"navigation-dropdown__togglewrap\">\r\n                    <a\r\n                        href={this.props.url}\r\n                        className=\"navigation-primary-links__link navigation-dropdown__link reset-a\"\r\n                        target={this.props.target}\r\n                        onClick={(event: React.MouseEvent<HTMLAnchorElement>) =>\r\n                            this.handleDropdownClick(event)\r\n                        }\r\n                        onMouseEnter={debounce(() => this.handleMouseOver(), 200)}\r\n                        onKeyPress={e => {\r\n                            if (e.key === \" \") {\r\n                                e.preventDefault();\r\n                                this.toggle();\r\n                            }\r\n                        }}\r\n                    >\r\n                        <div className=\"navigation-primary-links__link-inner\">\r\n                            <span>{this.props.label}</span>\r\n                            <div className=\"navigation-dropdown__indicator\">\r\n                                <Icon\r\n                                    iconId={this.state.isOpen ? \"icon_16_arrow-up\" : \"icon_16_arrow-down\"}\r\n                                />\r\n                            </div>\r\n                        </div>\r\n                    </a>\r\n                </div>\r\n                <AnimateHeight height={this.state.isOpen ? \"auto\" : 0} duration={300}>\r\n                    <CSSTransition\r\n                        in={this.state.isOpen}\r\n                        timeout={300}\r\n                        classNames=\"navigation-dropdown__dropdown-wrapper\"\r\n                    >\r\n                        <div className=\"navigation-dropdown__dropdown-wrapper\">\r\n                            <div className=\"navigation-dropdown__dropdown\">{this.props.children}</div>\r\n                        </div>\r\n                    </CSSTransition>\r\n                </AnimateHeight>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default NavigationDropdown;\r\n","import whatInput from \"what-input\";\r\n\r\nexport const isTouchInput = (): boolean => {\r\n    return whatInput.ask(\"intent\") === \"touch\";\r\n};\r\n\r\nexport const isKeyboardInput = (): boolean => {\r\n    return whatInput.ask(\"intent\") === \"keyboard\";\r\n};\r\n\r\nexport const isMouseInput = (): boolean => {\r\n    return whatInput.ask(\"intent\") === \"mouse\";\r\n};\r\n\r\nconst getCurrentInput = (): string => {\r\n    return whatInput.ask(\"intent\");\r\n};\r\n\r\nexport default getCurrentInput;\r\n","import * as React from \"react\";\r\nimport Icon from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport interface INavigationDropdownSectionProps extends IBaseLink {\r\n    className?: string;\r\n}\r\n\r\nconst NavigationDropdownSection: React.SFC<INavigationDropdownSectionProps> = props => {\r\n    const rootclasses = classNames(\"navigation-dropdown__section\", props.className);\r\n\r\n    return (\r\n        <div className={rootclasses}>\r\n            <div className=\"navigation-dropdown__section-header\">\r\n                <a className=\"navigation-dropdown__section-link\" href={props.url} target={props.target}>\r\n                    {props.label}\r\n                    <Icon iconId=\"icon_16_arrow-right-bold\" />\r\n                </a>\r\n            </div>\r\n            {props.children}\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default NavigationDropdownSection;\r\n","import * as React from \"react\";\r\nimport ResponsiveImage from \"~/components/responsive-image/responsive-image\";\r\nimport { IBaseLink } from \"~/types/link\";\r\n\r\nexport interface INavigationSpotProps extends IBaseLink {\r\n    imgTitle: string;\r\n    imgAlt: string;\r\n    imgSrc: string;\r\n}\r\n\r\nconst NavigationSpot: React.SFC<INavigationSpotProps> = props => {\r\n    return (\r\n        <div className=\"navigation-spot\">\r\n            <div className=\"navigation-spot__content\">\r\n                <a href={props.url} target={props.target}>\r\n                    <ResponsiveImage\r\n                        className=\"navigation-spot__img\"\r\n                        srcUrl={props.imgSrc}\r\n                        alt={props.imgAlt}\r\n                        title={props.imgTitle}\r\n                        sizes=\"(max-width: 1366px) calc((100vw - 64px) / 2), 650px\"\r\n                        srcSetSizes={[480, 550, 600, 650]}\r\n                        defaultSize={650}\r\n                    />\r\n                </a>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default NavigationSpot;\r\n","import * as React from \"react\";\r\nimport { INavigationLink } from \"~/components/navigation/navigation-primary-links/navigation-primary-links\";\r\n\r\nexport interface INavigationListProps {\r\n    linkList: INavigationLink[];\r\n    level?: number;\r\n    target?: string;\r\n    label?: string;\r\n    type?: string;\r\n}\r\n\r\nconst NavigationList: React.SFC<INavigationListProps> = props => {\r\n    const level = props.level || 0;\r\n\r\n    const generateLinks = (links: INavigationLink[]): React.ReactNode[] => {\r\n        return links.reduce((generatedLinks: React.ReactNode[], link: INavigationLink, index: number) => {\r\n            if (link.type === \"divider\") {\r\n                generatedLinks.push(\r\n                    <li key={index} className={\"navigation-item level-\" + level}>\r\n                        <div className=\"navigation-item__divider\">\r\n                            <span>{link.label}</span>\r\n                        </div>\r\n                    </li>\r\n                );\r\n            }\r\n            if (link.type === \"link\") {\r\n                generatedLinks.push(\r\n                    <li key={index} className={\"navigation-item level-\" + level}>\r\n                        <a className=\"navigation-item__link\" href={link.url} target={link.target}>\r\n                            <span>{link.label}</span>\r\n                        </a>\r\n                    </li>\r\n                );\r\n            }\r\n            return generatedLinks;\r\n        }, []);\r\n    };\r\n\r\n    const getNavStyling = () => {\r\n        const columns = 2;\r\n        const rowHeight = 42;\r\n        const minHeight = Math.ceil(props.linkList.length / columns) * rowHeight;\r\n        const navigationListStyling: React.CSSProperties = {\r\n            minHeight: minHeight + \"px\"\r\n        };\r\n        return navigationListStyling;\r\n    };\r\n\r\n    return (\r\n        <div className=\"navigation-list-wrapper\" style={getNavStyling()}>\r\n            <ul className={\"navigation-list\"}>{generateLinks(props.linkList)}</ul>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default NavigationList;\r\n","import * as React from \"react\";\r\nimport Icon from \"~/components/icons/icon\";\r\nimport classNames from \"classnames\";\r\n\r\ntype TSearchIconVisibility = \"mobile\" | \"desktop\";\r\n\r\nexport interface INavigationSearchProps {\r\n    searchPageUrl: string;\r\n    navigationSearchLabel: string;\r\n    visibility?: TSearchIconVisibility;\r\n}\r\n\r\nconst NavigationSearch: React.SFC<INavigationSearchProps> = ({\r\n    navigationSearchLabel,\r\n    visibility\r\n}: INavigationSearchProps) => {\r\n    const baseClass = \"navigation-search\";\r\n    return (\r\n        <div\r\n            className={classNames(baseClass, {\r\n                [`${baseClass}--${visibility}`]: !!visibility\r\n            })}\r\n        >\r\n            <button\r\n                className=\"navigation-search__link\"\r\n                role=\"button\"\r\n                title={navigationSearchLabel}\r\n                tabIndex={0}\r\n                onClick={event => window.toggeNavigationSearch(event)}\r\n                style={{ cursor: \"pointer\", backgroundColor: \"transparent\", border: \"none\" }}\r\n            >\r\n                <Icon iconId=\"32_search\" />\r\n            </button>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default NavigationSearch;\r\n","import * as React from \"react\";\r\nimport { pushTrackingEvent } from \"~/utils/tracking-utils\";\r\nimport { INavigationSiteLogoProps } from \"../navigation-site-logo/navigation-site-logo\";\r\n\r\ninterface GlobalSiteProps extends INavigationSiteLogoProps {\r\n    logoLinkTarget?: string;\r\n}\r\n\r\nexport interface NavigationGlobalSitesProps extends GlobalSiteProps {\r\n    richText: string;\r\n    sites: GlobalSiteProps[];\r\n}\r\n\r\nconst NavigationGlobalSites: React.SFC<NavigationGlobalSitesProps> = props => {\r\n    const baseClass = \"navigation-global-sites\";\r\n\r\n    return (\r\n        <div className={baseClass}>\r\n            <a className={`${baseClass}__logo-link`} href={props.logoLinkUrl} target={props.logoLinkTarget}>\r\n                <img\r\n                    className={`${baseClass}__logo`}\r\n                    src={props.logoSrc}\r\n                    alt={props.logoAlt}\r\n                    loading=\"lazy\"\r\n                />\r\n            </a>\r\n            <div\r\n                className={`${baseClass}__rich-text content-rich-text`}\r\n                dangerouslySetInnerHTML={{ __html: props.richText }}\r\n            />\r\n            <div className={`${baseClass}__site-list-wrapper`}>\r\n                <div className={`${baseClass}__site-list`}>\r\n                    {props.sites.map((site, index) => (\r\n                        <div className={`${baseClass}__site-item`} key={index}>\r\n                            <a\r\n                                className={`${baseClass}__site-link`}\r\n                                href={site.logoLinkUrl}\r\n                                target={site.logoLinkTarget}\r\n                                onClick={() =>\r\n                                    pushTrackingEvent({\r\n                                        event: \"trackEvent\",\r\n                                        eventData: {\r\n                                            category: \"GLOBAL_NAVIGATION\",\r\n                                            action: \"CLICK\",\r\n                                            label: site.logoAlt\r\n                                        }\r\n                                    })\r\n                                }\r\n                            >\r\n                                <img\r\n                                    className={`${baseClass}__logo`}\r\n                                    src={site.logoSrc}\r\n                                    alt={site.logoAlt}\r\n                                    loading=\"lazy\"\r\n                                />\r\n                            </a>\r\n                        </div>\r\n                    ))}\r\n                </div>\r\n            </div>\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default NavigationGlobalSites;","import * as React from \"react\";\r\nimport NavigationSiteLogo, {\r\n    INavigationSiteLogoProps\r\n} from \"~/components/navigation/navigation-site-logo/navigation-site-logo\";\r\nimport NavigationPrimaryLinks, {\r\n    INavigationPrimaryLinksProps\r\n} from \"~/components/navigation/navigation-primary-links/navigation-primary-links\";\r\nimport classNames from \"classnames\";\r\n// import NavigationProfile, {\r\n//     INavigationProfileProps\r\n// } from \"~/components/navigation/navigation-profile/navigation-profile\";\r\n// import LoginFormContainer, { ILoginFormContainerProps } from \"../login-form-container/login-form-container\";\r\n// import NavigationMiniBasket, {\r\n//     INavigationMiniBasketProps\r\n// } from \"./navigation-mini-basket/navigation-mini-basket\";\r\n// import BasketCount, { IBasketCountProps } from \"../basket-count/basket-count\";\r\nimport NavigationSearch, { INavigationSearchProps } from \"./navigation-search/navigation-search\";\r\nimport AnimateHeight from \"react-animate-height\";\r\nimport NavigationGlobalSites, {\r\n    NavigationGlobalSitesProps\r\n} from \"./navigation-global-sites/navigation-global-sites\";\r\nimport { toggleBodyClass } from \"~/utils/body-class-util\";\r\n\r\nexport interface INavigationProps {\r\n    navigationGlobalSitesConfig?: NavigationGlobalSitesProps;\r\n    navigationSiteLogoConfig?: INavigationSiteLogoProps;\r\n    navigationPrimaryLinksConfig?: INavigationPrimaryLinksProps;\r\n    // navigationProfileConfig?: INavigationProfileProps;\r\n    navigationSearchConfig?: INavigationSearchProps;\r\n    navigationSearchOverlayConfig?: {\r\n        title: string;\r\n        inputTitle: string;\r\n        searchText: string;\r\n        suggestions: string[];\r\n    };\r\n    // navigationMiniBasketConfig?: INavigationMiniBasketProps;\r\n    // loginFormConfig?: ILoginFormContainerProps;\r\n    // basketCount: IBasketCountProps[\"count\"];\r\n    // isLoggedIn: boolean;\r\n}\r\n\r\nexport interface INavigationState {\r\n    drawerIsOpen: boolean;\r\n    globalSitesNavigationIsOpen: boolean;\r\n}\r\n\r\nclass Navigation extends React.Component<INavigationProps, INavigationState> {\r\n    private drawer: HTMLDivElement | null;\r\n    public state: INavigationState = {\r\n        drawerIsOpen: false,\r\n        globalSitesNavigationIsOpen: false\r\n    };\r\n\r\n    public componentDidMount() {\r\n        document.addEventListener(\"click\", (event: MouseEvent) => this.handleClick(event));\r\n    }\r\n\r\n    public componentWillUnmount() {\r\n        document.removeEventListener(\"click\", (event: MouseEvent) => this.handleClick(event));\r\n    }\r\n\r\n    private setBodyOverlay(toggleOn: boolean) {\r\n        toggleBodyClass(\"body--navigationOverlayOpen\", toggleOn);\r\n    }\r\n\r\n    private toggleDrawer = (setValue?: boolean) => {\r\n        const setStateToOpen = setValue !== undefined ? setValue : !this.state.drawerIsOpen;\r\n        if (this.state.globalSitesNavigationIsOpen) {\r\n            this.toggleGlobalSitesNavigation(false);\r\n        }\r\n        this.setBodyOverlay(setStateToOpen);\r\n        this.setState({ drawerIsOpen: setStateToOpen });\r\n    };\r\n    private toggleGlobalSitesNavigation = (setValue?: boolean) => {\r\n        const setStateToOpen = setValue !== undefined ? setValue : !this.state.globalSitesNavigationIsOpen;\r\n        if (this.state.drawerIsOpen) {\r\n            this.toggleDrawer(false);\r\n        }\r\n        this.setBodyOverlay(setStateToOpen);\r\n        this.setState({\r\n            globalSitesNavigationIsOpen: setStateToOpen\r\n        });\r\n    };\r\n\r\n    private handleClick(event: MouseEvent) {\r\n        if (!this.state.drawerIsOpen && !this.state.globalSitesNavigationIsOpen) {\r\n            return;\r\n        }\r\n        const drawerDomNode = this.drawer;\r\n\r\n        if (!drawerDomNode || (event.target && !drawerDomNode.contains(event.target as Node))) {\r\n            this.toggleDrawer(false);\r\n            this.toggleGlobalSitesNavigation(false);\r\n        }\r\n    }\r\n\r\n    public render() {\r\n        const {\r\n            navigationGlobalSitesConfig,\r\n            navigationSiteLogoConfig,\r\n            navigationPrimaryLinksConfig,\r\n            // navigationProfileConfig,\r\n            // navigationMiniBasketConfig,\r\n            navigationSearchConfig,\r\n            navigationSearchOverlayConfig\r\n            // loginFormConfig,\r\n            // isLoggedIn\r\n        } = this.props;\r\n\r\n        const navigationClasses = classNames(\"navigation\", {\r\n            \"navigation--site-logo-only\":\r\n                navigationSiteLogoConfig &&\r\n                !(\r\n                    navigationGlobalSitesConfig ||\r\n                    navigationPrimaryLinksConfig ||\r\n                    // navigationProfileConfig ||\r\n                    // navigationMiniBasketConfig ||\r\n                    navigationSearchConfig\r\n                )\r\n        });\r\n        const navigationLinksClasses = classNames(\"navigation-links\", {\r\n            \"navigation-links--open\": this.state.drawerIsOpen\r\n        });\r\n        const navigationButtonClasses = classNames(\"navigation-burger-button__icon\", {\r\n            \"navigation-burger-button__icon--isOpen\": this.state.drawerIsOpen\r\n        });\r\n        // const basketCountClasses = classNames(\"navigation__basket-count\", {\r\n        //     \"navigation__basket-count--drawerIsOpen\": this.state.drawerIsOpen\r\n        // });\r\n\r\n        const hasAnyNavigation = !!(\r\n            navigationPrimaryLinksConfig\r\n            // navigationProfileConfig ||\r\n            // loginFormConfig\r\n        );\r\n\r\n        return (\r\n            <div className=\"navigation-wrapper\" ref={node => (this.drawer = node)}>\r\n                {navigationGlobalSitesConfig && (\r\n                    <div className=\"navigation-global-sites-wrapper\">\r\n                        <AnimateHeight\r\n                            className=\"accordion-rah-content\"\r\n                            contentClassName=\"navigation-global-sites-rah\"\r\n                            duration={300}\r\n                            applyInlineTransitions={false}\r\n                            height={this.state.globalSitesNavigationIsOpen ? \"auto\" : 0}\r\n                        >\r\n                            <NavigationGlobalSites {...navigationGlobalSitesConfig} />\r\n                        </AnimateHeight>\r\n                    </div>\r\n                )}\r\n                <nav className={navigationClasses} role=\"navigation\" aria-label=\"navigation\">\r\n                    <div className=\"navigation__inner\">\r\n                        {hasAnyNavigation && (\r\n                            <button\r\n                                className=\"navigation-burger-button\"\r\n                                type=\"button\"\r\n                                onClick={() => this.toggleDrawer()}\r\n                            >\r\n                                <div className={navigationButtonClasses}>\r\n                                    <span />\r\n                                    <span />\r\n                                    <span />\r\n                                </div>\r\n                                {/* <BasketCount className={basketCountClasses} count={this.props.basketCount} /> */}\r\n                            </button>\r\n                        )}\r\n\r\n                        <div className=\"navigation-site-logo\">\r\n                            {navigationGlobalSitesConfig && (\r\n                                <button\r\n                                    className={classNames(\"navigation-global-sites-button reset-button\", {\r\n                                        \"navigation-global-sites-button--isOpen\": this.state\r\n                                            .globalSitesNavigationIsOpen\r\n                                    })}\r\n                                    type=\"button\"\r\n                                    onClick={() => this.toggleGlobalSitesNavigation()}\r\n                                >\r\n                                    <span />\r\n                                    <span />\r\n                                </button>\r\n                            )}\r\n\r\n                            {navigationSiteLogoConfig && <NavigationSiteLogo {...navigationSiteLogoConfig} />}\r\n                        </div>\r\n                        {navigationSearchConfig && (\r\n                            <NavigationSearch visibility=\"mobile\" {...navigationSearchConfig} />\r\n                        )}\r\n\r\n                        {hasAnyNavigation && (\r\n                            <div className={navigationLinksClasses}>\r\n                                {/* {navigationProfileConfig && (\r\n                                    <NavigationProfile {...navigationProfileConfig} isLoggedIn={isLoggedIn}>\r\n                                        {loginFormConfig && <LoginFormContainer {...loginFormConfig} />}\r\n                                    </NavigationProfile>\r\n                                )}\r\n                                {navigationMiniBasketConfig && (\r\n                                    <NavigationMiniBasket\r\n                                        {...navigationMiniBasketConfig}\r\n                                        basketCount={this.props.basketCount}\r\n                                    />\r\n                                )} */}\r\n                                {navigationSearchConfig && (\r\n                                    <NavigationSearch visibility=\"desktop\" {...navigationSearchConfig} />\r\n                                )}\r\n                                {navigationPrimaryLinksConfig && (\r\n                                    <NavigationPrimaryLinks {...navigationPrimaryLinksConfig} />\r\n                                )}\r\n                            </div>\r\n                        )}\r\n                    </div>\r\n                    <div className=\"cludo-nav-search\" id=\"cludo-nav-search\" aria-hidden=\"true\">\r\n                        <button\r\n                            className=\"cludo-nav-search__close\"\r\n                            onClick={event => window.toggeNavigationSearch(event)}\r\n                            aria-label=\"Luk overlay\"\r\n                        >\r\n                            <span></span>\r\n                            <span></span>\r\n                        </button>\r\n                        <div className=\"cludo-nav-search__inner\">\r\n                            <h2>{navigationSearchOverlayConfig?.title}</h2>\r\n                            <form\r\n                                className=\"cludo-nav-search__form\"\r\n                                role=\"search\"\r\n                                action=\"javascript:void(0)\"\r\n                            >\r\n                                <input\r\n                                    className=\"cludo-nav-search__input\"\r\n                                    title={navigationSearchOverlayConfig?.inputTitle}\r\n                                    name=\"searchrequest\"\r\n                                    type=\"search\"\r\n                                    autoComplete=\"off\"\r\n                                    placeholder={navigationSearchOverlayConfig?.inputTitle}\r\n                                    aria-autocomplete=\"list\"\r\n                                    aria-haspopup=\"true\"\r\n                                    aria-expanded=\"false\"\r\n                                />\r\n                                <button\r\n                                    type=\"submit\"\r\n                                    title={navigationSearchOverlayConfig?.searchText}\r\n                                    className=\"cludo-nav-search__button\"\r\n                                    aria-label={navigationSearchOverlayConfig?.searchText}\r\n                                ></button>\r\n                            </form>\r\n                        </div>\r\n                        <div className=\"cludo-nav-search__suggestions\">\r\n                            <div className=\"cludo-nav-search__suggestions-container\">\r\n                                {navigationSearchOverlayConfig?.suggestions.map(suggestion => {\r\n                                    return (\r\n                                        <button\r\n                                            type=\"button\"\r\n                                            key={suggestion}\r\n                                            className=\"cludo-nav-search__suggestion\"\r\n                                            onClick={event => window.searchOn(event)}\r\n                                        >\r\n                                            {suggestion}\r\n                                        </button>\r\n                                    );\r\n                                })}\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </nav>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Navigation;\r\n","import * as React from \"react\";\r\nimport Navigation, { INavigationProps } from \"~/components/navigation/navigation\";\r\n\r\nexport interface INavigationViewProps {\r\n    contextModel: INavigationProps;\r\n}\r\n\r\nclass NavigationView extends React.Component<INavigationViewProps> {\r\n    public render() {\r\n        return <Navigation {...this.props.contextModel} />;\r\n    }\r\n}\r\n\r\nexport default NavigationView;\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","const hasExistingQueryParam = (url: string) => url.indexOf(\"?\") !== -1;\r\n\r\nexport const getQueryParamDelimiter = (url: string) => (hasExistingQueryParam(url) ? \"&\" : \"?\");\r\n\r\nexport const generateSrcSet = (srcSetSizes: number[], srcUrl: string) => {\r\n    const generateSrcSetString = (srcSetSize: number) => {\r\n        const parameterDelimiter = getQueryParamDelimiter(srcUrl);\r\n        const srcSetSizeHighDensity = Math.round(srcSetSize * 1.5);\r\n\r\n        return `\r\n            ${srcUrl}${parameterDelimiter}w=${srcSetSize} ${srcSetSize}w,\r\n            ${srcUrl}${parameterDelimiter}w=${srcSetSizeHighDensity} ${srcSetSizeHighDensity}w\r\n        `;\r\n    };\r\n\r\n    return srcSetSizes.map(generateSrcSetString).join(\", \");\r\n};\r\n\r\nexport const generateColumnImageProps = (maxColumns: number, isFullWidth?: boolean) => {\r\n    // The sizes are column-widths and are not considering padding\r\n    const gridMaxWidthFactor = isFullWidth ? 1 : 0.75;\r\n    const gridMaxWidth = 1366 * gridMaxWidthFactor;\r\n    const defaultSize = gridMaxWidth / maxColumns;\r\n    let sizes;\r\n\r\n    switch (maxColumns) {\r\n        case 5:\r\n            sizes = `(max-width: 479px) 100vw, \r\n            (max-width: 639px) 75vw,\r\n            (max-width: 767px) 50vw,\r\n            (max-width: 1023px) ${100 / 3}vw,\r\n            (max-width: 1099px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n            (max-width: 1279px) ${(100 / 4) * gridMaxWidthFactor}vw,\r\n            ${defaultSize}px`;\r\n        case 4:\r\n            sizes = `(max-width: 479px) 100vw, \r\n            (max-width: 639px) 75vw,\r\n            (max-width: 767px) 50vw,\r\n            (max-width: 1023px) ${100 / 3}vw,\r\n            (max-width: 1099px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n            (max-width: 1279px) ${(100 / 4) * gridMaxWidthFactor}vw,\r\n            ${defaultSize}px`;\r\n        case 3:\r\n            sizes = `(max-width: 479px) 100vw,\r\n            (max-width: 639px) 75vw,\r\n            (max-width: 767px) 50vw,\r\n            (max-width: 1023px) ${100 / 3}vw,\r\n            (max-width: 1279px) ${(100 / 3) * gridMaxWidthFactor}vw,\r\n            ${defaultSize}px`;\r\n        case 2:\r\n            sizes = `(max-width: 479px) 100vw,\r\n            (max-width: 639px) 75vw,\r\n            (max-width: 1023px) ${100 / 2}vw,\r\n            (max-width: 1279px) ${(100 / 2) * gridMaxWidthFactor}vw, \r\n            ${defaultSize}px`;\r\n        case 1:\r\n            sizes = `(max-width: 479px) 100vw,\r\n            (max-width: 1023px) ${100 * 0.75}vw,\r\n            (max-width: 1279px) ${100 * 0.75 * gridMaxWidthFactor}vw,\r\n            ${defaultSize * 0.75}px`;\r\n    }\r\n\r\n    return {\r\n        // The sizes are column-widths and are not considering padding\r\n        defaultSize: defaultSize,\r\n        srcSetSizes: [205, 257, 274, 342, 456, 513, 683, 769, 1025],\r\n        sizes: sizes\r\n    };\r\n};\r\n","import * as React from \"react\";\r\nimport { generateSrcSet, getQueryParamDelimiter } from \"~/utils/image-utils\";\r\n\r\nexport interface IResponsiveImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\r\n    className?: string;\r\n    srcUrl: string;\r\n    defaultSize: number;\r\n    srcSetSizes?: number[];\r\n    sizes?: string;\r\n    ref?: React.Ref<HTMLImageElement>;\r\n}\r\n\r\nconst ResponsiveImage: React.FC<IResponsiveImageProps> = React.forwardRef(\r\n    ({ srcUrl, defaultSize, srcSetSizes, ...props }, ref: React.Ref<HTMLImageElement>) => {\r\n        const src = `${srcUrl}${getQueryParamDelimiter(srcUrl)}w=${defaultSize}`;\r\n        const srcSet = srcSetSizes ? generateSrcSet(srcSetSizes, srcUrl) : \"\";\r\n\r\n        return <img ref={ref} src={src} srcSet={srcSet} {...props} loading=\"lazy\" />;\r\n    }\r\n);\r\n\r\nexport default ResponsiveImage;\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 { 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"],"sourceRoot":""}