{"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","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","toggleOn","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","toggleBodyClass","bodyClass","hasBodyClass","body","classList","add","remove"],"mappings":"wGAUYA,E,OCMG,EARiD,SAAAC,GAC5D,OACI,qBAAGC,UAAU,6BAA6BC,KAAMF,EAAMG,aAClD,uBAAKF,UAAU,4BAA4BG,IAAKJ,EAAMK,QAASC,IAAKN,EAAMO,Y,oaCwIvE,EApIf,YAOI,WAAYP,GAAZ,MACI,YAAMA,IAAM,K,OANT,EAAAQ,MAAkC,CACrCC,QAAQ,EACRC,QAAS,GAMT,EAAKC,mBAAqB,EAAKA,mBAAmBC,KAAK,GACvD,EAAKC,gBAAkB,EAAKA,gBAAgBD,KAAK,GACjD,EAAKE,KAAO,EAAKA,KAAKF,KAAK,GAC3B,EAAKG,MAAQ,EAAKA,MAAMH,KAAK,G,EAqHrC,OAlIiC,OAgBtB,YAAAI,kBAAP,WACIC,SAASC,iBAAiB,QAASC,KAAKR,oBACxCM,SAASC,iBAAiB,QAASC,KAAKN,kBAGrC,YAAAO,qBAAP,WACIH,SAASI,oBAAoB,QAASF,KAAKR,oBAC3CM,SAASI,oBAAoB,QAASF,KAAKN,kBAGvC,YAAAF,mBAAR,SAA2BW,GACvB,IAAMC,EAAUJ,KAAKK,YAChBD,GAAYD,EAAMG,SAAWF,EAAQG,SAASJ,EAAMG,UACrDN,KAAKJ,SAIL,YAAAF,gBAAR,SAAwBS,GACF,WAAdA,EAAMK,KACNR,KAAKJ,SAIL,YAAAa,oBAAR,SAA4BN,ICnDO,UAA5B,IAAUO,IAAI,WDoDK,IAAoBC,WACtCR,EAAMS,iBACNT,EAAMU,kBACNb,KAAKc,WAIL,YAAAC,gBAAR,WACQ,IAAoBJ,SAGxBX,KAAKL,QAGD,YAAAqB,iBAAR,WACQ,IAAoBL,SAGxBX,KAAKJ,SAGD,YAAAD,KAAR,WACIK,KAAKiB,SAAS,CACV3B,QAAQ,KAIR,YAAAM,MAAR,WACII,KAAKiB,SAAS,CACV3B,QAAQ,KAIR,YAAAwB,OAAR,WACId,KAAKiB,SAAS,CACV3B,QAASU,KAAKX,MAAMC,UAIrB,YAAA4B,OAAP,sBACUC,EAAc,IAAW,sBAAuB,CAClD,8BAA+BnB,KAAKX,MAAMC,SAG9C,OACI,uBACIR,UAAWqC,EACXC,IAAK,SAAAC,GAAQ,OAAC,EAAKhB,UAAN,GACbiB,aAAc,aAAS,WAAM,8BAAyB,MAEtD,uBAAKxC,UAAU,mCACX,qBACIC,KAAMiB,KAAKnB,MAAM0C,IACjBzC,UAAU,mEACVwB,OAAQN,KAAKnB,MAAMyB,OACnBkB,QAAS,SAACrB,GACN,SAAKM,oBAAoBN,IAE7BsB,aAAc,aAAS,WAAM,6BAAwB,KACrDC,WAAY,SAAAC,GACM,MAAVA,EAAEnB,MACFmB,EAAEf,iBACF,EAAKE,YAIb,uBAAKhC,UAAU,wCACX,4BAAOkB,KAAKnB,MAAM+C,OAClB,uBAAK9C,UAAU,kCACX,gBAAC,IAAI,CACD+C,OAAQ7B,KAAKX,MAAMC,OAAS,mBAAqB,2BAMrE,gBAAC,IAAa,CAACwC,OAAQ9B,KAAKX,MAAMC,OAAS,OAAS,EAAGyC,SAAU,KAC7D,gBAACC,EAAA,EAAa,CACVC,GAAIjC,KAAKX,MAAMC,OACf4C,QAAS,IACTC,WAAW,yCAEX,uBAAKrD,UAAU,yCACX,uBAAKA,UAAU,iCAAiCkB,KAAKnB,MAAMuD,eAOvF,EAlIA,CAAiC,aEUlB,EAhB+D,SAAAvD,GAC1E,IAAMwD,EAAc,IAAW,+BAAgCxD,EAAMC,WAErE,OACI,uBAAKA,UAAWuD,GACZ,uBAAKvD,UAAU,uCACX,qBAAGA,UAAU,oCAAoCC,KAAMF,EAAM0C,IAAKjB,OAAQzB,EAAMyB,QAC3EzB,EAAM+C,MACP,gBAAC,IAAI,CAACC,OAAO,+BAGpBhD,EAAMuD,W,SCUJ,EApByC,SAAAvD,GACpD,OACI,uBAAKC,UAAU,mBACX,uBAAKA,UAAU,4BACX,qBAAGC,KAAMF,EAAM0C,IAAKjB,OAAQzB,EAAMyB,QAC9B,gBAAC,IAAe,CACZxB,UAAU,uBACVwD,OAAQzD,EAAM0D,OACdpD,IAAKN,EAAM2D,OACXC,MAAO5D,EAAM6D,SACbC,MAAM,sDACNC,YAAa,CAAC,IAAK,IAAK,IAAK,KAC7BC,YAAa,UCiCtB,EA5CyC,SAAAhE,GACpD,IAAMiE,EAAQjE,EAAMiE,OAAS,EAoC7B,OACI,uBAAKhE,UAAU,0BAA0BiE,MAPU,CAC/CC,UAHc,GACAC,KAAKC,KAAKrE,EAAMsE,SAASC,OAF3B,GAIW,OAOvB,sBAAItE,UAAW,mBAAkCD,EAAMsE,SAnC9CE,QAAO,SAACC,EAAmCC,EAAuBC,GAmB3E,MAlBkB,YAAdD,EAAKE,MACLH,EAAeI,KACX,sBAAIlD,IAAKgD,EAAO1E,UAAW,yBAA2BgE,GAClD,uBAAKhE,UAAU,4BACX,4BAAOyE,EAAK3B,UAKV,SAAd2B,EAAKE,MACLH,EAAeI,KACX,sBAAIlD,IAAKgD,EAAO1E,UAAW,yBAA2BgE,GAClD,qBAAGhE,UAAU,wBAAwBC,KAAMwE,EAAKhC,IAAKjB,OAAQiD,EAAKjD,QAC9D,4BAAOiD,EAAK3B,UAKrB0B,IACR,O,gNNzBX,SAAY1E,GACR,oBACA,cACA,oBAHJ,CAAYA,MAAkB,KAgB9B,IAmDe,EAnDyD,SAAAC,GACpE,IACM8E,EAAc,sCA0CpB,OACI,uBAAK7E,UAAU,oCACX,sBAAIA,UA7CW,4BA6C+BD,EAAM+E,MA1C3CP,QAAO,SAACC,EAAmCO,EAAuBL,GAoC3E,MAnCkB,SAAdK,EAAKJ,MACLH,EAAeI,KACX,sBAAIlD,IAAKgD,EAAO1E,UAAW6E,GACvB,qBACI7E,UAAU,yCACVC,KAAM8E,EAAKtC,IACXjB,OAAQuD,EAAKvD,QAEb,uBAAKxB,UAAU,wCACX,4BAAO+E,EAAKjC,WAOd,YAAdiC,EAAKJ,MACLH,EAAeI,KACX,sBAAIlD,IAAKgD,EAAO1E,UAAW6E,GACvB,gBAAC,EAAkB,KAAKE,GACnBA,EAAKC,aACF,gBAAC,EAAyB,GACtBhF,UAAU,sCACN+E,EAAKC,aAET,gBAAC,EAAc,KAAKD,EAAKC,eAGjC,gBAAC,EAAyB,KAAKD,GAC1BA,EAAKD,OAAS,gBAAC,EAAc,CAACT,SAAUU,EAAKD,YAM3DN,IACR,OO9BI,EAzB6C,SAAC,G,MACzDS,EAAqB,wBACrBC,EAAU,aAGV,OACI,uBACIlF,UAAW,IAHD,qBAGqB,KAC3B,EAAImF,sBAAcD,KAAiBA,EACrC,KAEF,0BACIlF,UAAU,0BACVoF,KAAK,SACLzB,MAAOsB,EACPI,SAAU,EACV3C,QAAS,SAAArB,GAAS,OAAAiE,OAAOC,sBAAP,IAClBtB,MAAO,CAAEuB,OAAQ,UAAWC,gBAAiB,cAAeC,OAAQ,SAEpE,gBAAC,IAAI,CAAC3C,OAAO,iB,SCiCd,EAnDsD,SAAAhD,GACjE,IAAMoF,EAAY,0BAElB,OACI,uBAAKnF,UAAWmF,GACZ,qBAAGnF,UAAcmF,EAAS,cAAelF,KAAMF,EAAMG,YAAasB,OAAQzB,EAAM4F,gBAC5E,uBACI3F,UAAcmF,EAAS,SACvBhF,IAAKJ,EAAMK,QACXC,IAAKN,EAAMO,QACXsF,QAAQ,UAGhB,uBACI5F,UAAcmF,EAAS,gCACvBU,wBAAyB,CAAEC,OAAQ/F,EAAMgG,YAE7C,uBAAK/F,UAAcmF,EAAS,uBACxB,uBAAKnF,UAAcmF,EAAS,eACvBpF,EAAMiG,MAAMC,KAAI,SAACC,EAAMxB,GAAU,OAC9B,uBAAK1E,UAAcmF,EAAS,cAAezD,IAAKgD,GAC5C,qBACI1E,UAAcmF,EAAS,cACvBlF,KAAMiG,EAAKhG,YACXsB,OAAQ0E,EAAKP,eACbjD,QAAS,WACL,mBAAkB,CACdrB,MAAO,aACP8E,UAAW,CACPC,SAAU,oBACVC,OAAQ,QACRvD,MAAOoD,EAAK5F,aAKxB,uBACIN,UAAcmF,EAAS,SACvBhF,IAAK+F,EAAK9F,QACVC,IAAK6F,EAAK5F,QACVsF,QArBkB,kB,yjBC6OvC,EA/Nf,uE,OAEW,EAAArF,MAA0B,CAC7B+F,cAAc,EACdC,6BAA6B,GAezB,EAAAC,aAAe,SAACC,GACpB,IAAMC,OAA8BC,IAAbF,EAAyBA,GAAY,EAAKlG,MAAM+F,aACnE,EAAK/F,MAAMgG,6BACX,EAAKK,6BAA4B,GAErC,EAAKC,eAAeH,GACpB,EAAKvE,SAAS,CAAEmE,aAAcI,KAE1B,EAAAE,4BAA8B,SAACH,GACnC,IAAMC,OAA8BC,IAAbF,EAAyBA,GAAY,EAAKlG,MAAMgG,4BACnE,EAAKhG,MAAM+F,cACX,EAAKE,cAAa,GAEtB,EAAKK,eAAeH,GACpB,EAAKvE,SAAS,CACVoE,4BAA6BG,K,EA2LzC,OA7NyB,OAOd,YAAA3F,kBAAP,sBACIC,SAASC,iBAAiB,SAAS,SAACI,GAAsB,SAAKyF,YAAL,OAGvD,YAAA3F,qBAAP,sBACIH,SAASI,oBAAoB,SAAS,SAACC,GAAsB,SAAKyF,YAAL,OAGzD,YAAAD,eAAR,SAAuBE,GACnB,YAAgB,8BAA+BA,IAsB3C,YAAAD,YAAR,SAAoBzF,GAChB,GAAKH,KAAKX,MAAM+F,cAAiBpF,KAAKX,MAAMgG,4BAA5C,CAGA,IAAMS,EAAgB9F,KAAK+F,SAEtBD,GAAkB3F,EAAMG,SAAWwF,EAAcvF,SAASJ,EAAMG,WACjEN,KAAKsF,cAAa,GAClBtF,KAAK0F,6BAA4B,MAIlC,YAAAxE,OAAP,sBACU,EAUFlB,KAAKnB,MATLmH,EAA2B,8BAC3BC,EAAwB,2BACxBC,EAA4B,+BAG5BC,EAAsB,yBACtBC,EAA6B,gCAK3BC,EAAoB,IAAW,aAAc,CAC/C,6BACIJ,KAEID,GACAE,GAGAC,KAGNG,EAAyB,IAAW,mBAAoB,CAC1D,yBAA0BtG,KAAKX,MAAM+F,eAEnCmB,EAA0B,IAAW,iCAAkC,CACzE,yCAA0CvG,KAAKX,MAAM+F,eAMnDoB,IACFN,EAKJ,OACI,uBAAKpH,UAAU,qBAAqBsC,IAAK,SAAAC,GAAQ,OAAC,EAAK0E,OAAN,IAC5CC,GACG,uBAAKlH,UAAU,mCACX,gBAAC,IAAa,CACVA,UAAU,wBACV2H,iBAAiB,8BACjB1E,SAAU,IACV2E,wBAAwB,EACxB5E,OAAQ9B,KAAKX,MAAMgG,4BAA8B,OAAS,GAE1D,gBAAC,EAAqB,KAAKW,MAIvC,uBAAKlH,UAAWuH,EAAmBnC,KAAK,aAAY,aAAY,cAC5D,uBAAKpF,UAAU,qBACV0H,GACG,0BACI1H,UAAU,2BACV2E,KAAK,SACLjC,QAAS,WAAM,0BAEf,uBAAK1C,UAAWyH,GACZ,6BACA,6BACA,+BAMZ,uBAAKzH,UAAU,wBACVkH,GACG,0BACIlH,UAAW,IAAW,8CAA+C,CACjE,yCAA0CkB,KAAKX,MAC1CgG,8BAET5B,KAAK,SACLjC,QAAS,WAAM,yCAEf,6BACA,8BAIPyE,GAA4B,gBAAC,EAAkB,KAAKA,KAExDE,GACG,gBAAC,EAAgB,GAACnC,WAAW,UAAamC,IAG7CK,GACG,uBAAK1H,UAAWwH,GAYXH,GACG,gBAAC,EAAgB,GAACnC,WAAW,WAAcmC,IAE9CD,GACG,gBAAC,EAAsB,KAAKA,MAK5C,uBAAKpH,UAAU,mBAAmB6H,GAAG,mBAAkB,cAAa,QAChE,0BACI7H,UAAU,0BACV0C,QAAS,SAAArB,GAAS,OAAAiE,OAAOC,sBAAP,IAAmC,aAC1C,eAEX,6BACA,8BAEJ,uBAAKvF,UAAU,2BACX,0BAAKsH,aAA6B,EAA7BA,EAA+B3D,OACpC,wBACI3D,UAAU,yBACVoF,KAAK,SACLiB,OAAO,sBAEP,yBACIrG,UAAU,0BACV2D,MAAO2D,aAA6B,EAA7BA,EAA+BQ,WACtCC,KAAK,gBACLpD,KAAK,SACLqD,aAAa,MACbC,YAAaX,aAA6B,EAA7BA,EAA+BQ,WAAU,oBACpC,OAAM,gBACV,OAAM,gBACN,UAElB,0BACInD,KAAK,SACLhB,MAAO2D,aAA6B,EAA7BA,EAA+BY,WACtClI,UAAU,2BAA0B,aACxBsH,aAA6B,EAA7BA,EAA+BY,eAIvD,uBAAKlI,UAAU,iCACX,uBAAKA,UAAU,2CACVsH,aAA6B,EAA7BA,EAA+Ba,YAAYlC,KAAI,SAAAmC,GAC5C,OACI,0BACIzD,KAAK,SACLjD,IAAK0G,EACLpI,UAAU,+BACV0C,QAAS,SAAArB,GAAS,OAAAiE,OAAO+C,SAAP,KAEjBD,YAW7C,EA7NA,CAAyB,a,gjBCvCzB,2B,+CAIA,OAJ6B,OAClB,YAAAhG,OAAP,WACI,OAAO,gBAAC,EAAU,KAAKlB,KAAKnB,MAAMuI,gBAE1C,EAJA,CAA6B,aAMd,a,iCCbf,6BAyEe,IAhBoB,SAAAvI,GAC/B,IAAMwI,EAAYxI,EAAMwI,WAAa,GAC/BC,EAAUzI,EAAMyI,SAAW,YAEjC,OACI,uBACIA,QAASA,EACTxI,UAAW,IAAWD,EAAMC,UAAW,OAAQ,QAAQD,EAAMgD,QAC7D0F,oBAAoB,WACpB/F,QAAS,WAAM,OAAA3C,EAAM2C,SAAW3C,EAAjB,YAEf,uBAAK2I,WAAW,+BAA+BC,UAAcJ,EAAS,IAAIxI,EAAMgD,Y,iCCpE5F,0GAEa6F,EAAyB,SAACnG,GAAgB,OAFzB,SAACA,GAAgB,WAAAA,EAAIoG,QAAQ,KAEHC,CAAsBrG,GAAO,IAA9B,KAE1CsG,EAAiB,SAACjF,EAAuBN,GAWlD,OAAOM,EAAYmC,KAVU,SAAC+C,GAC1B,IAAMC,EAAqBL,EAAuBpF,GAC5C0F,EAAwB/E,KAAKgF,MAAmB,IAAbH,GAEzC,MAAO,iBACDxF,EAASyF,EAAkB,KAAKD,EAAU,IAAIA,EAAU,mBACxDxF,EAASyF,EAAkB,KAAKC,EAAqB,IAAIA,EAAqB,iBAI3CE,KAAK,OAGzCC,EAA2B,SAACC,EAAoBC,GAEzD,IAGI1F,EAHE2F,EAAqBD,EAAc,EAAI,IAEvCxF,EADe,KAAOyF,EACOF,EAGnC,OAAQA,GACJ,KAAK,EACDzF,EAAQ,2IAGc,IAAM,EAAC,wCACN,IAAM,EAAK2F,EAAkB,wCAC7B,GAAWA,EAAkB,oBAClDzF,EAAW,KACjB,KAAK,EACDF,EAAQ,2IAGc,IAAM,EAAC,wCACN,IAAM,EAAK2F,EAAkB,wCAC7B,GAAWA,EAAkB,oBAClDzF,EAAW,KACjB,KAAK,EACDF,EAAQ,0IAGc,IAAM,EAAC,wCACN,IAAM,EAAK2F,EAAkB,oBAClDzF,EAAW,KACjB,KAAK,EACDF,EAAQ,2IAGe,GAAW2F,EAAkB,qBAClDzF,EAAW,KACjB,KAAK,EACDF,EAAQ,qGAEc,GAAa2F,EAAkB,oBACrC,IAAdzF,EAAkB,KAG5B,MAAO,CAEHA,YAAaA,EACbD,YAAa,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MACtDD,MAAOA,K,glBCtDT4F,EAAmD,cACrD,SAAC,EAAgDnH,GAA9C,IAAAkB,EAAM,SAAEO,EAAW,cAAED,EAAW,cAAK/D,EAAK,IAA5C,wCACSI,EAAM,GAAGqD,EAAS,YAAuBA,GAAO,KAAKO,EACrD2F,EAAS5F,EAAc,YAAeA,EAAaN,GAAU,GAEnE,OAAO,yBAAKlB,IAAKA,EAAKnC,IAAKA,EAAKuJ,OAAQA,GAAY3J,EAAK,CAAE6F,QAAQ,aAI5D,O,iCCQf,oEAAO,IAAM+D,EAA4B,CACrCC,IAAK,IACLC,OAAQ,IACRC,IAAK,IACLC,IAAK,IACLC,KAAM,KACNC,KAAM,KACNC,MAAO,KACPC,MAAO,KACPC,SAAU,MAGRC,EAAmCC,OAAOC,KAAKZ,GAAapF,QAC9D,SAACiG,EAAkC9I,GAG/B,OAFA8I,EAAgB9I,EAAG,OAAS,eAAeiI,EAAYjI,GAAI,MAC3D8I,EAAgB9I,EAAG,OAAS,gBAAeiI,EAAYjI,GAAO,GAAC,MACxD8I,IAEX,IAYEC,EAAwC,GACxCC,EAAmB,SAACC,EAAqBjJ,GAAqB,OAAC+I,EAAoB/I,GAArB,GAThE4I,OAAOC,KAAKF,GAAcO,SAAQ,SAAClJ,GAC/B,IAAMmJ,EAAaC,WAAWT,EAAa3I,IAE3CgJ,EAAiBG,EAAWE,QAASrJ,GACrCmJ,EAAWG,aAAY,SAAA3J,GAAS,OAAAqJ,EAAiBrJ,EAAM0J,QAAvB,U,iCClDxC,IAAKE,EAcAC,EAIAC,EAlBL,iJAAKF,GACD,sBACA,0BACA,0BACA,0BACA,kCACA,8BACA,2BACA,uCACA,iCACA,mCACA,wBAXJ,CAAKA,MAAU,KAcf,SAAKC,GACD,YADJ,CAAKA,MAAa,KAIlB,SAAKC,GACD,2BACA,+BACA,8BACA,+BAJJ,CAAKA,MAAkB,KA2CvB,IAyaMC,EAAkB,WACpB,MAAsB,oBAAX9F,SAIXA,OAAO+F,UAAY/F,OAAO+F,WAAa,IAChC,IAGLC,EAA+B,SAACC,GAC9BH,KAAmB9F,OAAO+F,UAAUzG,KAAK2G,IAGpCC,EAAoB,SAACD,GAC1BH,KAAmB9F,OAAO+F,UAAUzG,KAAK2G,IAkBpCE,EAAyB,SAAC1L,GACnC,OAAAuL,GApQAI,GADgC,EAqQwB3L,GApQ5C,aACZ4L,EAAgB,mBAChBC,EAAS,YACTjI,EAAK,QAEE,CACHtC,MAAO4J,EAAWY,MAClBC,UAAW,CACPC,MAAO,CACHC,YAAa,CACTC,KAAMP,GAEVQ,SAAU,CACN,CACIrE,GAAI+D,EACJ7D,KAAMpE,EACNwI,SAAUR,SAjBC,IAAC,EAChCD,EACAC,EACAC,EACAjI,GAmQSyI,EAA8B,SAACrM,GACxC,OAAAuL,GA9NA3H,GADqC,EA+NwB5D,GA9NxD,MACL6L,EAAS,YACTF,EAAY,eAEL,CACHrK,MAAO4J,EAAWoB,YAClBP,UAAW,CACPQ,OAAQ,CACJN,YAAa,CACTC,KAAMP,GAEVQ,SAAU,CACN,CACIrE,GAAI+D,EACJ7D,KAAMpE,SAfU,IAAC,EACrCA,EACAiI,EACAF,GA8NSa,EAAkC,SAACxM,GAC5C,OAAAuL,GApHAY,EAoHiEnM,EAlH1D,CACHsB,MAAO4J,EAAWuB,gBAClBV,UAAW,CACPW,YAAaP,EAASjG,KAAI,SAAAyG,GACtB,MAAO,CACHT,KAAMS,EAAQhB,aACdS,SAAUO,EAAQf,iBAClB9D,GAAI6E,EAAQd,UACZ7D,KAAM2E,EAAQ/I,cAXU,IACxCuI,I,iCC9ZE,SAAUS,EAAgBC,EAAmB7F,GAC/C,IAAM8F,EAAe7L,SAAS8L,KAAKC,UAAUtL,SAASmL,GAElD7F,GAAY8F,IAIZ9F,IAAa8F,EACb7L,SAAS8L,KAAKC,UAAUC,IAAIJ,GAE5B5L,SAAS8L,KAAKC,UAAUE,OAAOL,IAVvC","file":"30.dc9328a2668844e64611.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 navigationSearchLabel,\r\n visibility\r\n}: INavigationSearchProps) => {\r\n const baseClass = \"navigation-search\";\r\n return (\r\n \r\n window.toggeNavigationSearch(event)}\r\n style={{ cursor: \"pointer\", backgroundColor: \"transparent\", border: \"none\" }}\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 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 {\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
    (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":""}