{"version":3,"sources":["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","webpack:///./src/Frontend/app/utils/body-class-util.ts"],"names":["NavigationLinkType","props","className","href","logoLinkUrl","src","logoSrc","alt","logoAlt","state","isOpen","offsetX","handleClickOutside","bind","keyEventHandler","open","close","componentDidMount","document","addEventListener","this","componentWillUnmount","removeEventListener","event","domNode","container","target","contains","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","searchPageUrl","navigationSearchLabel","visibility","baseClass","logoLinkTarget","loading","dangerouslySetInnerHTML","__html","richText","sites","map","site","eventData","category","action","drawerIsOpen","globalSitesNavigationIsOpen","toggleDrawer","setValue","setStateToOpen","undefined","toggleGlobalSitesNavigation","setBodyOverlay","handleClick","toggleOn","drawerDomNode","drawer","navigationGlobalSitesConfig","navigationSiteLogoConfig","navigationPrimaryLinksConfig","navigationSearchConfig","navigationClasses","navigationLinksClasses","navigationButtonClasses","hasAnyNavigation","contentClassName","applyInlineTransitions","role","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","window","dataLayer","pushEcommerenceTrackingEvent","trackingEvent","pushTrackingEvent","pushClickTrackingEvent","trackingList","trackingPosition","productId","CLICK","ecommerce","click","actionField","list","products","id","name","position","pushDetailViewTrackingEvent","DETAIL_VIEW","detail","pushImpressionViewTrackingEvent","IMPRESSION_VIEW","impressions","product","toggleBodyClass","bodyClass","hasBodyClass","body","classList","add","remove"],"mappings":"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","file":"30.8c2c56ffff70ea954ee3.js","sourcesContent":["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 = 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
  • \r\n \r\n
    \r\n {item.label}\r\n
    \r\n \r\n
  • \r\n );\r\n }\r\n\r\n if (item.type === \"submenu\") {\r\n generatedLinks.push(\r\n
  • \r\n \r\n {item.spotContent && (\r\n \r\n \r\n \r\n )}\r\n \r\n {item.links && }\r\n \r\n \r\n
  • \r\n );\r\n }\r\n return generatedLinks;\r\n }, []);\r\n };\r\n\r\n return (\r\n
    \r\n \r\n
    \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 = props => {\r\n return (\r\n \r\n {props.logoAlt}\r\n \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 {\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) {\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 (this.container = node)}\r\n onMouseLeave={debounce(() => this.handleMouseLeave(), 200)}\r\n >\r\n
    \r\n ) =>\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
    \r\n {this.props.label}\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n
    \r\n
    {this.props.children}
    \r\n
    \r\n \r\n
    \r\n \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 = props => {\r\n const rootclasses = classNames(\"navigation-dropdown__section\", props.className);\r\n\r\n return (\r\n
    \r\n \r\n {props.children}\r\n
    \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 = props => {\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \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 = 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
  • \r\n
    \r\n {link.label}\r\n
    \r\n
  • \r\n );\r\n }\r\n if (link.type === \"link\") {\r\n generatedLinks.push(\r\n
  • \r\n \r\n {link.label}\r\n \r\n
  • \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
    \r\n
      {generateLinks(props.linkList)}
    \r\n
    \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 = ({\r\n searchPageUrl,\r\n navigationSearchLabel,\r\n visibility\r\n}: INavigationSearchProps) => {\r\n const baseClass = \"navigation-search\";\r\n return (\r\n \r\n \r\n \r\n \r\n \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 = props => {\r\n const baseClass = \"navigation-global-sites\";\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n {props.sites.map((site, index) => (\r\n
    \r\n \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 \r\n \r\n
    \r\n ))}\r\n
    \r\n
    \r\n
    \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 // 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 {\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 // 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
    (this.drawer = node)}>\r\n {navigationGlobalSitesConfig && (\r\n
    \r\n \r\n \r\n \r\n
    \r\n )}\r\n \r\n
    \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 {\r\n public render() {\r\n return ;\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_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 = props => {\r\n const spriteUrl = props.spriteUrl || \"\";\r\n const viewBox = props.viewBox || \"0 0 32 32\";\r\n\r\n return (\r\n props.onClick && props.onClick()}\r\n >\r\n \r\n \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, \"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;\r\n}\r\n\r\nconst ResponsiveImage: React.FC = React.forwardRef(\r\n ({ srcUrl, defaultSize, srcSetSizes, ...props }, ref: React.Ref) => {\r\n const src = `${srcUrl}${getQueryParamDelimiter(srcUrl)}w=${defaultSize}`;\r\n const srcSet = srcSetSizes ? generateSrcSet(srcSetSizes, srcUrl) : \"\";\r\n\r\n return ;\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 {\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 {}\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 {\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> {}\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) => {\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","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"],"sourceRoot":""}