{"version":3,"sources":["webpack:///./src/components/helpers/Container/index.tsx","webpack:///./src/configs.ts","webpack:///./src/utilities/objects.ts","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/components/common/SvgImage/index.tsx","webpack:///./src/components/common/Button/index.tsx","webpack:///./src/components/common/Hero/index.tsx","webpack:///./src/components/common/ImageWithFocalPoint/index.tsx","webpack:///./src/components/common/Link/index.tsx","webpack:///./src/components/common/Overlay/index.tsx","webpack:///./src/components/common/Stats/index.tsx","webpack:///./src/core/config/index.ts","webpack:///./src/contexts/Localizations/index.tsx","webpack:///./src/contexts/Localizations/defaultLocalizations.ts","webpack:///./src/components/common/Tag/index.tsx","webpack:///./src/components/common/Image/index.tsx","webpack:///./src/components/common/ImageObject/index.tsx","webpack:///./src/components/common/UnderlineTitle/index.tsx","webpack:///./src/components/common/Content/index.tsx","webpack:///./src/components/common/Contact/index.tsx","webpack:///./src/components/common/RichText/index.tsx","webpack:///./src/hooks/useHabitat.tsx","webpack:///./src/utilities/browser.ts","webpack:///./src/components/common/JumpList/index.tsx","webpack:///./src/breakpoints.ts","webpack:///./src/components/common/ResponsiveTable/index.tsx","webpack:///./src/components/common/DateCategory/index.tsx","webpack:///./src/components/common/Accordion/index.tsx","webpack:///./src/components/common/ImageBasic/index.tsx","webpack:///./src/components/common/Loader/index.tsx","webpack:///./src/components/common/SocialLinks/index.tsx","webpack:///./src/components/common/TagList/index.tsx","webpack:///./src/components/common/Paginaton/index.tsx","webpack:///./src/hooks/UseOutsideAlerter.ts","webpack:///./src/components/InlineGallery/InlineGalleryItem.tsx","webpack:///./src/components/InlineGallery/index.tsx"],"names":["children","className","CSS_CLASSES","isActive","isOpen","isShowing","navIsShowing","overlayIsShowing","DISCIPLINE","gravel","indoor","para","road","track","trials","other","isIdenticalObject","objectA","objectB","aProps","Object","getOwnPropertyNames","bProps","length","i","propName","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","resolve","module","exports","title","reference","ariaHidden","aria-hidden","xlinkHref","type","style","text","icon","ariaLabel","disabled","showLoader","iconOnly","fullWidth","isProcessing","handleClick","buttonClass","onClick","aria-label","SvgImage","Hero","backLink","colorTheme","image","imageSize","isDarkened","isLanding","isForPage","root","classes","push","join","Container","href","url","ImageObject","fitType","useFocalPoint","aspectRatio","aspectRatioMobile","mobileImageTriggerWidth","widthSizes","isLoaded","hasTransparentBackground","focalPoint","setFocalPoint","file","details","xPercentile","x","width","yPercentile","y","height","Image","alt","cropTo","xQuadrant","yQuadrant","setFocalArea","isExternal","isButton","iconAfter","buttonType","buttonColour","target","rel","bodyElm","document","body","handleClose","hasCloseRedirect","containerLess","closeOverlay","classList","remove","setTimeout","handleKeyUp","event","keyCode","add","window","addEventListener","removeEventListener","stats","discipline","head","slice","label","value","stat","key","config","env","apiUrl","webSettings","baseUrl","webUrl","storybookApi","localizations","shareConfig","shareUrl","mobileOnly","cookieConfig","cookiePolicy","cookiePolicyExpirationDays","xsrfRequestToken","translationsNotation","assign","LocalizationContext","locale","documentElement","lang","translations","expand","mobileImageTriggerWidthDefault","md","aspectRatioMap","undefined","lowQualityWidth","media","data-sizes","data-srcset","widthSize","Math","ceil","parseInt","onLoad","objectPosition","data-src","innerWidth","defaultWidths","noAnimate","srcset","setSrcset","src","size","index","Number","containerTheme","disableUppercase","intro","contact","content","link","secondaryLink","downloads","isTitleFloating","Boolean","download","toReadable","phoneNumber","split","replace","addr","tel","fax","email","website","facebook","instagram","twitter","dangerouslySetInnerHTML","__html","updateHabitat","insertUrlParam","includeHash","history","pushState","searchParams","URLSearchParams","location","search","set","newurl","protocol","host","pathname","toString","hash","path","getUrlParamValue","entries","hashes","indexOf","params","val","decodeURIComponent","getAllUrlParams","filter","param","isMobile","test","navigator","scrollIntoView","elemToScrollTo","behaviour","MSInputMethodContext","behavior","isPortrait","items","action","selectedValue","theme","useScroller","useSearch","name","disableFirst","withDatePicker","defaultDatePickerValue","onDateChange","includeDates","datePickerLocale","wrapperRef","setValue","setIsOpen","options","setOptions","isClosing","setIsClosing","searchValue","setSearchValue","close","mapSelection","item","visible","handleChange","optionIndex","preventDefault","optionsSelection","selected","filteredOptions","option","displayText","toLowerCase","includes","createOption","role","createSearch","placeholder","calendar","searchLabel","onChange","currentTarget","ref","toggle","date","dateIndex","findIndex","format","inline","xxs","xs","sm","ml","lg","xl","xxl","xxxl","xxxxl","headers","rows","stickyCol","moreClassName","headerClassName","rowClassName","cellClassName","nested","isExpanded","setExpanded","rowExpandedStates","setRowExpandedStates","some","row","fromEntries","aria-expanded","header","alwaysVisible","hiddenOnMobile","trim","scope","rowIndex","Table","colIndex","Fragment","toggleExpandRow","colSpan","category","dateFormat","dateTime","AccordionPanel","activeTab","toggleTab","themeColor","isAsync","isResults","setHeight","asyncContentLoaded","setAsyncContentLoaded","wrapper","calculatePanelHeight","panelElement","current","ontransitionend","scrollHeight","requestAnimationFrame","props","onBeforeLoad","panels","panelsInState","setPanelsInState","mappedPanels","panel","useIntrinsicHeight","setIsLoaded","list","tags","tag","defaultProps","pageQueryKey","state","pages","firstPageIndex","lastPageIndex","previousPageIndex","nextPageIndex","currentPage","isFirstPageDisabled","isLastPageDisabled","totalAmountOfPages","isPreviousDisabled","isNextDisabled","maxVisiblePagesMobile","maxVisiblePagesDesktop","maxVisiblePages","componentDidMount","this","handdleMaxVisiblePages","stopPropagation","getPager","componentDidUpdate","prevProps","totalItems","itemsPerPage","setState","generateVisablePages","maxVisibleOffset","startPage","endPage","Array","from","s","l","viewportWidth","changePage","page","retainRoute","String","generateButton","isDisabled","rootLocation","render","handler","handleClickOutside","contains","tabIndex","data-width","ImageBasic","defaultSliderSettings","dots","arrows","fade","infinite","speed","slidesToShow","slidesToScroll","accessibility","centerMode","variableWidth","onInit","beforeChange","images","slider","showPrevious","setShowPrevious","showNext","setShowNext","currentSlide","setCurrentSlide","isFullScreen","setIsFullScreen","setisLoaded","onSliderInit","oldIndex","newIndex","onSliderBeforeChange","sliderSettings","setSliderSettings","setMaxSlideWidth","slides","querySelectorAll","containerWidth","clientWidth","forEach","call","slide","slideImage","querySelector","imageWidth","offsetWidth","parentNode","maxWidth","overflow","checkIfSlickIsLoaded","setInterval","clearInterval","resetMaxSlideWidth","opacity","slickPrev","previous","slickNext","next","slickGoTo","changeSlide"],"mappings":"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","file":"habitat.28.component.js","sourcesContent":["import * as React from 'react';\r\nimport './styles.scss';\r\n\r\ninterface ContainerProps {\r\n children: JSX.Element | JSX.Element[];\r\n}\r\n\r\nconst Container = ({ children }: ContainerProps) => (\r\n
\r\n {children}\r\n
\r\n);\r\n\r\nexport default Container;\r\n","import { Discipline, DisciplineCodes } from 'core/typings';\r\n\r\nimport {\r\n CookieConfig,\r\n SharePlatformDetail,\r\n} from './typings/configs';\r\n\r\nexport const COOKIE_CONFIG: CookieConfig = {\r\n cookiePolicy: 'c_policy',\r\n cookiePolicyExpirationDays: 60,\r\n xsrfRequestToken: 'XSRF-REQUEST-TOKEN',\r\n};\r\n\r\nexport const CSS_CLASSES = {\r\n isActive: 'is-open',\r\n isOpen: 'is-open',\r\n isShowing: 'is-showing',\r\n navIsShowing: 'nav-is-showing',\r\n overlayIsShowing: 'overlay-is-showing',\r\n};\r\n\r\nexport const SHARE_PLATFORM_DETAILS: SharePlatformDetail[] = [\r\n {\r\n id: 'facebook',\r\n shareUrl: 'https://www.facebook.com/sharer/sharer.php?u=',\r\n },\r\n {\r\n id: 'twitter',\r\n shareUrl: 'https://twitter.com/intent/tweet?url=',\r\n },\r\n {\r\n id: 'whatsapp',\r\n shareUrl: 'whatsapp://send?text=',\r\n },\r\n {\r\n id: 'copylink',\r\n shareUrl: null,\r\n },\r\n];\r\n\r\nexport const DISCIPLINE: Record = {\r\n 'bmx-freestyle': 'bfr',\r\n 'bmx-racing': 'bmx',\r\n 'cycling-esport': 'ces',\r\n 'cyclo-cross': 'cro',\r\n gravel: 'gra',\r\n indoor: 'ind',\r\n 'mountain-bike': 'mtb',\r\n para: 'par',\r\n road: 'roa',\r\n track: 'pis',\r\n trials: 'tri',\r\n other: 'cpt',\r\n};\r\n","/**\r\n * Checks if two objects are identical\r\n * This is a good method for prop checking in componentDidUpdate\r\n */\r\nconst isIdenticalObject = (objectA: any, objectB: any) => {\r\n const aProps = Object.getOwnPropertyNames(objectA);\r\n const bProps = Object.getOwnPropertyNames(objectB);\r\n\r\n if (aProps.length !== bProps.length) {\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line no-plusplus\r\n for (let i = 0; i < aProps.length; i++) {\r\n const propName = aProps[i];\r\n if (objectA[propName] !== objectB[propName]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Breaks arrar into chunks based on a specified size\r\n */\r\nconst arrChunks = (arr: any[], size: number) => {\r\n if (!Array.isArray(arr)) {\r\n throw new Error('Chunk expects argument one to be type of array.');\r\n }\r\n\r\n const len = {\r\n length: Math.ceil(arr.length / size),\r\n };\r\n\r\n return Array.from(len).map((value, index) => (\r\n arr.slice(index * size, (index * size) + size)\r\n ));\r\n};\r\n\r\n// Put asyncForEach into a module\r\nconst asyncForEach = async (array: any[], callback: Function) => {\r\n // eslint-disable-next-line no-plusplus\r\n for (let index = 0; index < array.length; index++) {\r\n // eslint-disable-next-line no-await-in-loop\r\n await callback(array[index], index, array);\r\n }\r\n};\r\n\r\nexport {\r\n isIdenticalObject,\r\n arrChunks,\r\n asyncForEach,\r\n};\r\n","var map = {\n\t\"./af\": 58,\n\t\"./af.js\": 58,\n\t\"./ar\": 59,\n\t\"./ar-dz\": 60,\n\t\"./ar-dz.js\": 60,\n\t\"./ar-kw\": 61,\n\t\"./ar-kw.js\": 61,\n\t\"./ar-ly\": 62,\n\t\"./ar-ly.js\": 62,\n\t\"./ar-ma\": 63,\n\t\"./ar-ma.js\": 63,\n\t\"./ar-sa\": 64,\n\t\"./ar-sa.js\": 64,\n\t\"./ar-tn\": 65,\n\t\"./ar-tn.js\": 65,\n\t\"./ar.js\": 59,\n\t\"./az\": 66,\n\t\"./az.js\": 66,\n\t\"./be\": 67,\n\t\"./be.js\": 67,\n\t\"./bg\": 68,\n\t\"./bg.js\": 68,\n\t\"./bm\": 69,\n\t\"./bm.js\": 69,\n\t\"./bn\": 70,\n\t\"./bn-bd\": 71,\n\t\"./bn-bd.js\": 71,\n\t\"./bn.js\": 70,\n\t\"./bo\": 72,\n\t\"./bo.js\": 72,\n\t\"./br\": 73,\n\t\"./br.js\": 73,\n\t\"./bs\": 74,\n\t\"./bs.js\": 74,\n\t\"./ca\": 75,\n\t\"./ca.js\": 75,\n\t\"./cs\": 76,\n\t\"./cs.js\": 76,\n\t\"./cv\": 77,\n\t\"./cv.js\": 77,\n\t\"./cy\": 78,\n\t\"./cy.js\": 78,\n\t\"./da\": 79,\n\t\"./da.js\": 79,\n\t\"./de\": 80,\n\t\"./de-at\": 81,\n\t\"./de-at.js\": 81,\n\t\"./de-ch\": 82,\n\t\"./de-ch.js\": 82,\n\t\"./de.js\": 80,\n\t\"./dv\": 83,\n\t\"./dv.js\": 83,\n\t\"./el\": 84,\n\t\"./el.js\": 84,\n\t\"./en-au\": 85,\n\t\"./en-au.js\": 85,\n\t\"./en-ca\": 86,\n\t\"./en-ca.js\": 86,\n\t\"./en-gb\": 87,\n\t\"./en-gb.js\": 87,\n\t\"./en-ie\": 88,\n\t\"./en-ie.js\": 88,\n\t\"./en-il\": 89,\n\t\"./en-il.js\": 89,\n\t\"./en-in\": 90,\n\t\"./en-in.js\": 90,\n\t\"./en-nz\": 91,\n\t\"./en-nz.js\": 91,\n\t\"./en-sg\": 92,\n\t\"./en-sg.js\": 92,\n\t\"./eo\": 93,\n\t\"./eo.js\": 93,\n\t\"./es\": 94,\n\t\"./es-do\": 95,\n\t\"./es-do.js\": 95,\n\t\"./es-mx\": 96,\n\t\"./es-mx.js\": 96,\n\t\"./es-us\": 97,\n\t\"./es-us.js\": 97,\n\t\"./es.js\": 94,\n\t\"./et\": 98,\n\t\"./et.js\": 98,\n\t\"./eu\": 99,\n\t\"./eu.js\": 99,\n\t\"./fa\": 100,\n\t\"./fa.js\": 100,\n\t\"./fi\": 101,\n\t\"./fi.js\": 101,\n\t\"./fil\": 102,\n\t\"./fil.js\": 102,\n\t\"./fo\": 103,\n\t\"./fo.js\": 103,\n\t\"./fr\": 40,\n\t\"./fr-ca\": 104,\n\t\"./fr-ca.js\": 104,\n\t\"./fr-ch\": 105,\n\t\"./fr-ch.js\": 105,\n\t\"./fr.js\": 40,\n\t\"./fy\": 106,\n\t\"./fy.js\": 106,\n\t\"./ga\": 107,\n\t\"./ga.js\": 107,\n\t\"./gd\": 108,\n\t\"./gd.js\": 108,\n\t\"./gl\": 109,\n\t\"./gl.js\": 109,\n\t\"./gom-deva\": 110,\n\t\"./gom-deva.js\": 110,\n\t\"./gom-latn\": 111,\n\t\"./gom-latn.js\": 111,\n\t\"./gu\": 112,\n\t\"./gu.js\": 112,\n\t\"./he\": 113,\n\t\"./he.js\": 113,\n\t\"./hi\": 114,\n\t\"./hi.js\": 114,\n\t\"./hr\": 115,\n\t\"./hr.js\": 115,\n\t\"./hu\": 116,\n\t\"./hu.js\": 116,\n\t\"./hy-am\": 117,\n\t\"./hy-am.js\": 117,\n\t\"./id\": 118,\n\t\"./id.js\": 118,\n\t\"./is\": 119,\n\t\"./is.js\": 119,\n\t\"./it\": 120,\n\t\"./it-ch\": 121,\n\t\"./it-ch.js\": 121,\n\t\"./it.js\": 120,\n\t\"./ja\": 122,\n\t\"./ja.js\": 122,\n\t\"./jv\": 123,\n\t\"./jv.js\": 123,\n\t\"./ka\": 124,\n\t\"./ka.js\": 124,\n\t\"./kk\": 125,\n\t\"./kk.js\": 125,\n\t\"./km\": 126,\n\t\"./km.js\": 126,\n\t\"./kn\": 127,\n\t\"./kn.js\": 127,\n\t\"./ko\": 128,\n\t\"./ko.js\": 128,\n\t\"./ku\": 129,\n\t\"./ku.js\": 129,\n\t\"./ky\": 130,\n\t\"./ky.js\": 130,\n\t\"./lb\": 131,\n\t\"./lb.js\": 131,\n\t\"./lo\": 132,\n\t\"./lo.js\": 132,\n\t\"./lt\": 133,\n\t\"./lt.js\": 133,\n\t\"./lv\": 134,\n\t\"./lv.js\": 134,\n\t\"./me\": 135,\n\t\"./me.js\": 135,\n\t\"./mi\": 136,\n\t\"./mi.js\": 136,\n\t\"./mk\": 137,\n\t\"./mk.js\": 137,\n\t\"./ml\": 138,\n\t\"./ml.js\": 138,\n\t\"./mn\": 139,\n\t\"./mn.js\": 139,\n\t\"./mr\": 140,\n\t\"./mr.js\": 140,\n\t\"./ms\": 141,\n\t\"./ms-my\": 142,\n\t\"./ms-my.js\": 142,\n\t\"./ms.js\": 141,\n\t\"./mt\": 143,\n\t\"./mt.js\": 143,\n\t\"./my\": 144,\n\t\"./my.js\": 144,\n\t\"./nb\": 145,\n\t\"./nb.js\": 145,\n\t\"./ne\": 146,\n\t\"./ne.js\": 146,\n\t\"./nl\": 147,\n\t\"./nl-be\": 148,\n\t\"./nl-be.js\": 148,\n\t\"./nl.js\": 147,\n\t\"./nn\": 149,\n\t\"./nn.js\": 149,\n\t\"./oc-lnc\": 150,\n\t\"./oc-lnc.js\": 150,\n\t\"./pa-in\": 151,\n\t\"./pa-in.js\": 151,\n\t\"./pl\": 152,\n\t\"./pl.js\": 152,\n\t\"./pt\": 153,\n\t\"./pt-br\": 154,\n\t\"./pt-br.js\": 154,\n\t\"./pt.js\": 153,\n\t\"./ro\": 155,\n\t\"./ro.js\": 155,\n\t\"./ru\": 156,\n\t\"./ru.js\": 156,\n\t\"./sd\": 157,\n\t\"./sd.js\": 157,\n\t\"./se\": 158,\n\t\"./se.js\": 158,\n\t\"./si\": 159,\n\t\"./si.js\": 159,\n\t\"./sk\": 160,\n\t\"./sk.js\": 160,\n\t\"./sl\": 161,\n\t\"./sl.js\": 161,\n\t\"./sq\": 162,\n\t\"./sq.js\": 162,\n\t\"./sr\": 163,\n\t\"./sr-cyrl\": 164,\n\t\"./sr-cyrl.js\": 164,\n\t\"./sr.js\": 163,\n\t\"./ss\": 165,\n\t\"./ss.js\": 165,\n\t\"./sv\": 166,\n\t\"./sv.js\": 166,\n\t\"./sw\": 167,\n\t\"./sw.js\": 167,\n\t\"./ta\": 168,\n\t\"./ta.js\": 168,\n\t\"./te\": 169,\n\t\"./te.js\": 169,\n\t\"./tet\": 170,\n\t\"./tet.js\": 170,\n\t\"./tg\": 171,\n\t\"./tg.js\": 171,\n\t\"./th\": 172,\n\t\"./th.js\": 172,\n\t\"./tk\": 173,\n\t\"./tk.js\": 173,\n\t\"./tl-ph\": 174,\n\t\"./tl-ph.js\": 174,\n\t\"./tlh\": 175,\n\t\"./tlh.js\": 175,\n\t\"./tr\": 176,\n\t\"./tr.js\": 176,\n\t\"./tzl\": 177,\n\t\"./tzl.js\": 177,\n\t\"./tzm\": 178,\n\t\"./tzm-latn\": 179,\n\t\"./tzm-latn.js\": 179,\n\t\"./tzm.js\": 178,\n\t\"./ug-cn\": 180,\n\t\"./ug-cn.js\": 180,\n\t\"./uk\": 181,\n\t\"./uk.js\": 181,\n\t\"./ur\": 182,\n\t\"./ur.js\": 182,\n\t\"./uz\": 183,\n\t\"./uz-latn\": 184,\n\t\"./uz-latn.js\": 184,\n\t\"./uz.js\": 183,\n\t\"./vi\": 185,\n\t\"./vi.js\": 185,\n\t\"./x-pseudo\": 186,\n\t\"./x-pseudo.js\": 186,\n\t\"./yo\": 187,\n\t\"./yo.js\": 187,\n\t\"./zh-cn\": 188,\n\t\"./zh-cn.js\": 188,\n\t\"./zh-hk\": 189,\n\t\"./zh-hk.js\": 189,\n\t\"./zh-mo\": 190,\n\t\"./zh-mo.js\": 190,\n\t\"./zh-tw\": 191,\n\t\"./zh-tw.js\": 191\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 229;","import * as React from 'react';\r\n\r\ninterface SvgImageProps {\r\n title?: string;\r\n reference: string;\r\n ariaHidden?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst SvgImage = ({\r\n title,\r\n reference,\r\n ariaHidden,\r\n className,\r\n}: SvgImageProps) => (\r\n \r\n {title && (\r\n {title}\r\n )}\r\n \r\n \r\n);\r\n\r\nexport default SvgImage;\r\n","import * as React from 'react';\r\nimport SvgImage from '../SvgImage';\r\nimport './styles.scss';\r\n\r\ninterface ButtonProps {\r\n type: 'button' | 'submit' | 'reset';\r\n style?: 'default' | 'secondary' | 'transparent' | 'uci';\r\n text?: string;\r\n icon?: {\r\n reference: string;\r\n title: string;\r\n } | undefined;\r\n role?: 'button';\r\n ariaLabel?: string;\r\n disabled?: boolean;\r\n showLoader?: boolean;\r\n iconOnly?: boolean;\r\n fullWidth?: boolean;\r\n isProcessing?: boolean;\r\n handleClick?: (event: React.MouseEvent) => void | undefined;\r\n}\r\n\r\nconst Button = ({\r\n type = 'button',\r\n style = 'default',\r\n text,\r\n icon,\r\n ariaLabel,\r\n disabled = false,\r\n showLoader = false,\r\n iconOnly = false,\r\n fullWidth = false,\r\n isProcessing = false,\r\n handleClick,\r\n}: ButtonProps) => {\r\n const buttonClass = `\r\n button\r\n button--${style}\r\n ${text && 'button--has-label'}\r\n ${icon && 'button--has-icon'}\r\n ${iconOnly && 'button--icon-only'}\r\n ${fullWidth && 'button--full-width'}\r\n ${showLoader && 'button--updating'}\r\n ${disabled && 'button--disabled'}\r\n ${isProcessing && 'button--processing'}\r\n `;\r\n\r\n return (\r\n \r\n {icon && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n {text && (\r\n
\r\n {text}\r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Button;\r\n","import * as React from 'react';\r\n\r\nimport Container from '../../helpers/Container';\r\nimport ImageObject from '../ImageObject';\r\nimport SvgImage from '../SvgImage';\r\nimport { HeroBannerProps } from './type';\r\nimport './styles.scss';\r\n\r\nconst HeroBanner = ({\r\n ariaHidden,\r\n backLink,\r\n children,\r\n colorTheme = 'blue',\r\n image,\r\n imageSize = 'half',\r\n isDarkened,\r\n isLanding,\r\n isForPage,\r\n}: HeroBannerProps) => {\r\n const root = 'hero-banner';\r\n const classes = [\r\n root,\r\n `${root}--theme-${colorTheme}`,\r\n ];\r\n if (isDarkened) {\r\n classes.push(`${root}--darkened`);\r\n }\r\n if (image) {\r\n classes.push(`${root}--${imageSize}`);\r\n }\r\n if (!image) {\r\n classes.push(`${root}--no-image`);\r\n }\r\n if (isLanding) {\r\n classes.push(`${root}--landing`);\r\n }\r\n if (isForPage) {\r\n classes.push(`${root}--for-page`);\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n {backLink ? (\r\n \r\n \r\n {backLink?.title}\r\n \r\n ) : }\r\n
\r\n\r\n
\r\n {children}\r\n
\r\n
\r\n
\r\n
\r\n\r\n {!isLanding && (\r\n
\r\n {image && (\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 HeroBanner;\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { Image as ImageType } from '../../../typings';\r\nimport Image from '../Image';\r\n\r\ninterface ImageWithFocalPointProps {\r\n image: ImageType;\r\n aspectRatio: '2x1' | '16x9' | '3x2' | '4x3' | '1x1' | '4x5' | '2x3' | '6x1' | '6x7-promo';\r\n widthSizes?: string[];\r\n aspectRatioMobile?: '2x1' | '16x9' | '3x2' | '4x3' | '1x1' | '4x5' | '2x3' | '6x1' | '6x7-promo';\r\n mobileImageTriggerWidth?: number;\r\n isLoaded?: Function;\r\n hasTransparentBackground?: boolean;\r\n isDarkened?: boolean;\r\n}\r\n\r\nconst ImageWithFocalPoint = ({\r\n image,\r\n aspectRatio,\r\n aspectRatioMobile,\r\n mobileImageTriggerWidth,\r\n widthSizes,\r\n isLoaded,\r\n hasTransparentBackground = false,\r\n isDarkened = false, // passed as percentage 80 etc.\r\n}: ImageWithFocalPointProps) => {\r\n const [focalPoint, setFocalPoint] = useState(null);\r\n /*\r\n Set crop quadrant area as:\r\n 'center' | 'top' | 'right' | 'left' | 'bottom' | 'top_right' |\r\n 'top_left' | 'bottom_right' | 'bottom_left';\r\n Docs: https://www.contentful.com/developers/docs/references/images-api/#/reference/resizing-&-cropping/specify-focus-area\r\n We get x / y coords in pixels so we calculate percentage and\r\n then which area it falls into from there.\r\n */\r\n const setFocalArea = () => {\r\n if (!image.focalPoint) return 'center';\r\n if (!image.file || !image.file.details) return 'center';\r\n\r\n const xPercentile = (image.focalPoint.x / image.file.details.image.width) * 100;\r\n const yPercentile = (image.focalPoint.y / image.file.details.image.height) * 100;\r\n // eslint-disable-next-line no-nested-ternary\r\n const xQuadrant = xPercentile < 33 ? 'left' : xPercentile > 66 ? 'right' : 'center';\r\n // eslint-disable-next-line no-nested-ternary\r\n const yQuadrant = yPercentile < 33 ? 'top' : xPercentile > 66 ? 'bottom' : 'center';\r\n\r\n if (xQuadrant === 'center') {\r\n return yQuadrant;\r\n }\r\n if (yQuadrant === 'center') {\r\n return xQuadrant;\r\n }\r\n\r\n return `${yQuadrant}_${xQuadrant}`;\r\n };\r\n\r\n useEffect(() => {\r\n if (image.focalPoint && image.file.details) {\r\n const xPercentile = (image.focalPoint.x / image.file.details.image.width) * 100;\r\n const yPercentile = (image.focalPoint.y / image.file.details.image.height) * 100;\r\n setFocalPoint(`${xPercentile}% ${yPercentile}%`);\r\n }\r\n }, [image]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default ImageWithFocalPoint;\r\n","import * as React from 'react';\r\nimport SvgImage from '../SvgImage';\r\nimport { Link as LinkType } from '../../../typings';\r\nimport './styles.scss';\r\n\r\nconst Link = ({\r\n title,\r\n url,\r\n isExternal = false,\r\n isButton = false,\r\n icon,\r\n iconAfter,\r\n className = '',\r\n ariaLabel,\r\n buttonType = 'text-link',\r\n buttonColour = 'white',\r\n}: LinkType) => {\r\n const isDisabled = () => (\r\n url === null || url === ''\r\n );\r\n\r\n const root = 'link';\r\n const classes = [root, className];\r\n\r\n if (icon || iconAfter) {\r\n classes.push(`${root}--has-icon`);\r\n }\r\n\r\n if (isButton) {\r\n classes.push('button');\r\n }\r\n\r\n if (isDisabled()) {\r\n classes.push(`${root}--disabled`);\r\n }\r\n\r\n if (buttonType) {\r\n classes.push(buttonType);\r\n }\r\n\r\n if (buttonColour) {\r\n classes.push(`${root}--${buttonColour}`);\r\n }\r\n\r\n return (\r\n \r\n {icon && (\r\n
\r\n \r\n
\r\n )}\r\n {title}\r\n {iconAfter && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Link;\r\n","import * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport SvgImage from '../SvgImage';\r\nimport { CSS_CLASSES } from '../../../configs';\r\nimport './styles.scss';\r\n\r\nconst bodyElm = document.body;\r\n\r\ninterface OverlayProps {\r\n children: JSX.Element | JSX.Element[];\r\n handleClose: Function;\r\n style?: string;\r\n id?: string;\r\n hasCloseRedirect?: boolean;\r\n containerLess?: boolean;\r\n}\r\n\r\nconst Overlay = ({\r\n children,\r\n handleClose,\r\n style,\r\n id,\r\n hasCloseRedirect,\r\n containerLess,\r\n}: OverlayProps) => {\r\n const closeOverlay = () => {\r\n bodyElm.classList.remove(CSS_CLASSES.overlayIsShowing);\r\n /* timeout to allow animations to complete. */\r\n if (hasCloseRedirect) {\r\n handleClose();\r\n return;\r\n }\r\n setTimeout(() => {\r\n handleClose();\r\n }, 100);\r\n };\r\n\r\n const handleKeyUp = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === 27) {\r\n closeOverlay();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n bodyElm.classList.add(CSS_CLASSES.overlayIsShowing);\r\n /**\r\n * This needs some rework - note quite sure why it's built this way tbh\r\n */\r\n // @ts-ignore\r\n window.addEventListener('keyup', handleKeyUp);\r\n // @ts-ignore\r\n return () => window.removeEventListener('keyup', handleKeyUp);\r\n }, []);\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {children}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Overlay;\r\n","import * as React from 'react';\r\nimport { Discipline } from '../../../core/typings';\r\nimport './styles.scss';\r\n\r\ntype Stat = {\r\n label: string;\r\n value: string;\r\n};\r\n\r\ninterface StatsProps {\r\n stats: Stat[];\r\n text?: string;\r\n discipline?: Discipline;\r\n}\r\n\r\nconst Stats = ({\r\n stats,\r\n text,\r\n discipline,\r\n}: StatsProps) => {\r\n const head = stats[0];\r\n const body = stats.slice(1);\r\n\r\n return (\r\n
\r\n
\r\n {text && (\r\n
{text}
\r\n )}\r\n\r\n
{head.label}
\r\n
{head.value}
\r\n\r\n {text && (\r\n
{text}
\r\n )}\r\n
\r\n
    \r\n {body.map((stat: Stat) => (\r\n \r\n
  • \r\n
    {stat.label}
    \r\n
    {stat.value}
    \r\n
  • \r\n
    \r\n ))}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Stats;\r\n","import LocalizationsState from '../typings/localization';\r\n\r\ndeclare const Config: AppConfiguration;\r\n\r\ndeclare const webSettings: {\r\n baseUrl: string;\r\n localizations: LocalizationsState;\r\n};\r\nexport interface AppConfiguration {\r\n env: string;\r\n apiUrl: string;\r\n webUrl: string;\r\n storybookApi?: string;\r\n localizations: LocalizationsState;\r\n}\r\n\r\nexport interface SharePlatformDetail {\r\n key: number;\r\n id: string;\r\n shareUrl: string | null;\r\n mobileOnly: boolean;\r\n}\r\n\r\nexport const config: AppConfiguration = {\r\n env: Config.env,\r\n apiUrl: `${webSettings.baseUrl}${Config.apiUrl}`,\r\n webUrl: webSettings.baseUrl,\r\n storybookApi: Config.storybookApi ? Config.storybookApi : undefined,\r\n localizations: webSettings.localizations,\r\n};\r\n\r\nexport interface CookieConfig {\r\n cookiePolicy: string;\r\n cookiePolicyExpirationDays: number;\r\n xsrfRequestToken: string;\r\n}\r\n\r\nexport const shareConfig: SharePlatformDetail[] = [\r\n {\r\n key: 1,\r\n id: 'facebook',\r\n shareUrl: 'https://www.facebook.com/sharer/sharer.php?u=',\r\n mobileOnly: false,\r\n },\r\n {\r\n key: 2,\r\n id: 'twitter',\r\n shareUrl: 'https://twitter.com/intent/tweet?url=',\r\n mobileOnly: false,\r\n },\r\n {\r\n key: 3,\r\n id: 'whatsapp',\r\n shareUrl: 'whatsapp://send?text=',\r\n mobileOnly: true,\r\n },\r\n {\r\n key: 4,\r\n id: 'copylink',\r\n shareUrl: null,\r\n mobileOnly: false,\r\n },\r\n];\r\n\r\nexport const cookieConfig: CookieConfig = {\r\n cookiePolicy: 'c_policy',\r\n cookiePolicyExpirationDays: 60,\r\n xsrfRequestToken: 'XSRF-REQUEST-TOKEN',\r\n};\r\n","import 'moment/locale/fr';\r\nimport { Notation } from 'notation';\r\nimport { createContext } from 'react';\r\nimport { config } from '../../core/config';\r\nimport LocalizationsState from '../../core/typings/localization';\r\nimport defaultLocalizations from './defaultLocalizations';\r\n\r\ninterface LocalizationsContextType {\r\n locale: string;\r\n translations: LocalizationsState;\r\n setTranslations: (TranslationsState: LocalizationsState) => void;\r\n}\r\n\r\n/**\r\n * Create a notation instance in order to use the notation\r\n * exapand method to mutate the translations to a nested\r\n * object rather than using the dot notation in the keys\r\n * set by the backend. Merge config.localizations with\r\n * defaultLocalizations to avoid missing labels\r\n */\r\nconst translationsNotation = new Notation(\r\n Object.assign(defaultLocalizations, config.localizations),\r\n);\r\n\r\nconst LocalizationContext = createContext(\r\n {\r\n locale: document.documentElement.lang,\r\n translations: translationsNotation.expand().value,\r\n } as LocalizationsContextType,\r\n);\r\n\r\nexport default LocalizationContext;\r\n","export default {\r\n 'cookieBanner.title': 'cookieBanner.title',\r\n 'cookieBanner.acceptText': 'cookieBanner.acceptText',\r\n 'header.forLabel': 'header.forLabel',\r\n 'header.usefulLinksLabel': 'header.usefulLinksLabel',\r\n 'footer.partnersLabel': 'footer.partnersLabel',\r\n 'footer.worldCyclingPartnersLabel': 'footer.worldCyclingPartnersLabel',\r\n 'footer.officialSupplierLabel': 'footer.officialSupplierLabel',\r\n 'relatedContent.title': 'relatedContent.title',\r\n 'competition.racesLabel': 'competition.racesLabel',\r\n 'competition.classLabel': 'competition.classLabel',\r\n 'competition.websiteLabel': 'competition.websiteLabel',\r\n 'competition.emailLabel': 'competition.emailLabel',\r\n 'competition.addressLabel': 'competition.addressLabel',\r\n 'competition.assignmentsLabel': 'competition.assignmentsLabel',\r\n 'competition.appointedByLabel': 'competition.appointedByLabel',\r\n 'calendar.latestLabel': 'calendar.latestLabel',\r\n 'calendar.upcomingLabel': 'calendar.upcomingLabel',\r\n 'calendar.pastLabel': 'calendar.pastLabel',\r\n 'calendar.raceHubLinkLabel': 'calendar.raceHubLinkLabel',\r\n 'calendar.raceCategoryLabel': 'calendar.raceCategoryLabel',\r\n 'calendar.raceTypeLabel': 'calendar.raceTypeLabel',\r\n 'calendar.raceClassLabel': 'calendar.raceClassLabel',\r\n 'calendar.eventTypeLabel': 'calendar.eventTypeLabel',\r\n 'calendar.disciplineLabel': 'calendar.disciplineLabel',\r\n 'calendar.raceYearLabel': 'calendar.raceYearLabel',\r\n 'calendar.searchLabel': 'calendar.searchLabel',\r\n 'calendar.searchText': 'calendar.searchText',\r\n 'calendar.noResults': 'calendar.noResults',\r\n 'calendar.viewMoreLabel': 'calendar.viewMoreLabel',\r\n 'calendar.moreFiltersLabel': 'calendar.moreFiltersLabel',\r\n 'calendar.noSearchResults': 'calendar.noSearchResults',\r\n 'calendar.applyFiltersLabel': 'calendar.applyFiltersLabel',\r\n 'calendar.downloadLabel': 'calendar.downloadLabel',\r\n 'calendar.downloadSelectionLabel': 'calendar.downloadSelectionLabel',\r\n 'calendar.downloadSeasonLabel': 'calendar.downloadSeasonLabel',\r\n 'calendar.downloadHelpText': 'calendar.downloadHelpText',\r\n 'competitionDetails.classLabel': 'competitionDetails.classLabel',\r\n 'competitionDetails.websiteLabel': 'competitionDetails.websiteLabel',\r\n 'competitionDetails.emailLabel': 'competitionDetails.emailLabel',\r\n 'competitionDetails.scheduleTitle': 'competitionDetails.scheduleTitle',\r\n 'competitionDetails.commissiaryTitle': 'competitionDetails.commissiaryTitle',\r\n 'competitionDetails.commissiaryAppointedBy': 'competitionDetails.commissiaryAppointedBy',\r\n 'filters.allFilterText': 'filters.allFilterText',\r\n 'filters.allDisciplinesText': 'filters.allDisciplinesText',\r\n 'filters.allSeasonsText': 'filters.allSeasonsText',\r\n 'filters.allCountriesText': 'filters.allCountriesText',\r\n 'filters.countryLabel': 'filters.countryLabel',\r\n 'filters.seasonLabel': 'filters.seasonLabel',\r\n 'filters.disciplineLabel': 'filters.disciplineLabel',\r\n 'discipline.bmx': 'discipline.bmx',\r\n 'discipline.cpt': 'discipline.cpt',\r\n 'discipline.cro': 'discipline.cro',\r\n 'discipline.ind': 'discipline.ind',\r\n 'discipline.mtb': 'discipline.mtb',\r\n 'discipline.par': 'discipline.par',\r\n 'discipline.pis': 'discipline.pis',\r\n 'discipline.roa': 'discipline.roa',\r\n 'discipline.tri': 'discipline.tri',\r\n 'discipline.gra': 'discipline.gra',\r\n 'discipline.bfr': 'discipline.bfr',\r\n 'discipline.ces': 'discipline.ces',\r\n 'event.dayLabel': 'event.dayLabel',\r\n 'event.liveNowLabel': 'event.liveNowLabel',\r\n 'event.fromLabel': 'event.fromLabel',\r\n 'event.upcomingLabel': 'event.upcomingLabel',\r\n 'event.liveStreamLabel': 'event.liveStreamLabel',\r\n 'event.liveScheduleLabel': 'event.liveScheduleLabel',\r\n 'event.todaysEventsLabel': 'event.todaysEventsLabel',\r\n 'event.watchPlaylistTitle': 'event.watchPlaylistTitle',\r\n 'homepage.liveEventLabel': 'homepage.liveEventLabel',\r\n 'riders.teamCategory': 'riders.teamCategory',\r\n 'riders.searchText': 'riders.searchText',\r\n 'riders.resultsLabel': 'riders.resultsLabel',\r\n 'riders.teamsLabel': 'riders.teamsLabel',\r\n 'riders.ridersLabel': 'riders.ridersLabel',\r\n 'riders.dobLabel': 'riders.dobLabel',\r\n 'riders.nationalityLabel': 'riders.nationalityLabel',\r\n 'riders.sanctionsLabel': 'riders.sanctionsLabel',\r\n 'regulations.overviewLabel': 'regulations.overviewLabel',\r\n 'regulations.rulesInForceLabel': 'regulations.rulesInForceLabel',\r\n 'regulations.upcomingAmendmentsLabel': 'regulations.upcomingAmendmentsLabel',\r\n 'regulations.versionOnLabel': 'regulations.versionOnLabel',\r\n 'regulations.inForceFromLabel': 'regulations.inForceFromLabel',\r\n 'news.latest': 'news.latest',\r\n 'news.noResultsText': 'news.noResultsText',\r\n 'raceHub.commentaryViewMore': 'raceHub.commentaryViewMore',\r\n 'search.searchLabel': 'search.searchLabel',\r\n 'contact.title': 'contact.title',\r\n 'contact.addr': 'contact.addr',\r\n 'contact.tel': 'contact.tel',\r\n 'contact.fax': 'contact.fax',\r\n 'contact.email': 'contact.email',\r\n 'contact.website': 'contact.website',\r\n 'contact.twitter': 'contact.twitter',\r\n 'rankingWidget.title': 'rankingWidget.title',\r\n 'rankingWidget.pointsLabel': 'rankingWidget.pointsLabel',\r\n 'rankingWidget.menLabel': 'rankingWidget.menLabel',\r\n 'rankingWidget.womenLabel': 'rankingWidget.womenLabel',\r\n 'rankingWidget.lastUpdatedLabel': 'rankingWidget.lastUpdatedLabel',\r\n 'rankingWidget.noRankingsLabel': 'rankingWidget.noRankingsLabel',\r\n 'technicalRankings.refineResultsLabel': 'technicalRankings.refineResultsLabel',\r\n 'technicalRankings.searchTeamLabel': 'technicalRankings.searchTeamLabel',\r\n 'technicalRankings.notesLabel': 'technicalRankings.notesLabel',\r\n 'technicalRankings.notesMenDisclaimer': 'technicalRankings.notesMenDisclaimer',\r\n 'technicalRankings.notesWomenDisclaimer': 'technicalRankings.notesWomenDisclaimer',\r\n 'technicalRankings.title': 'technicalRankings.title',\r\n 'technicalRankings.tableTotalLabel': 'technicalRankings.tableTotalLabel',\r\n 'technicalRankings.tableTypeLabel': 'technicalRankings.tableTypeLabel',\r\n};\r\n","import * as React from 'react';\r\nimport './styles.scss';\r\n\r\ninterface TagProps {\r\n text: string;\r\n url: string;\r\n}\r\n\r\nconst Tag = ({ text, url }: TagProps) => (\r\n {text}\r\n);\r\n\r\nexport default Tag;\r\n","/*\r\n Responsive image component.\r\n Details in /README.md\r\n */\r\n\r\nimport * as React from 'react';\r\nimport breakpoints from '../../../breakpoints';\r\nimport 'lazysizes';\r\nimport 'lazysizes/plugins/attrchange/ls.attrchange';\r\nimport './styles.scss';\r\n\r\nconst defaultWidth = '1000';\r\nconst defaultLowQualityWidth = '20';\r\nconst defaultAspectRatio = '16x9';\r\nconst mobileImageTriggerWidthDefault = breakpoints.md;\r\nconst imageQuality = 80;\r\n\r\nconst aspectRatioMap = {\r\n '2x1': 0.5,\r\n '16x9': 0.5625,\r\n '3x2': 0.667,\r\n '4x3': 0.75,\r\n '1x1': 1,\r\n '4x5': 1.2,\r\n '2x3': 1.5,\r\n '6x1': 0.59,\r\n '6x7-promo': 1.16,\r\n};\r\n\r\ninterface ImageProps {\r\n url: string;\r\n alt: string;\r\n aspectRatio?: '2x1' | '16x9' | '3x2' | '4x3' | '1x1' | '4x5' | '2x3' | '6x1' | '6x7-promo';\r\n focalPoint?: string | null;\r\n cropTo?: string | undefined;\r\n lowQualityWidth?: string;\r\n widthSizes?: string[];\r\n aspectRatioMobile?: '2x1' | '16x9' | '3x2' | '4x3' | '1x1' | '4x5' | '2x3' | '6x1' | '6x7-promo';\r\n mobileImageTriggerWidth?: number;\r\n isLoaded?: Function;\r\n hasTransparentBackground?: boolean;\r\n isDarkened?: boolean;\r\n}\r\n\r\nconst Image = ({\r\n url,\r\n alt,\r\n aspectRatio = defaultAspectRatio,\r\n aspectRatioMobile,\r\n mobileImageTriggerWidth = mobileImageTriggerWidthDefault,\r\n cropTo = undefined,\r\n widthSizes = [defaultWidth],\r\n lowQualityWidth = defaultLowQualityWidth,\r\n isLoaded,\r\n hasTransparentBackground = false,\r\n focalPoint,\r\n isDarkened = false, // passed as percentage 80 etc.\r\n}: ImageProps) => {\r\n const setAspectRatio = () => {\r\n if (!aspectRatioMobile) return aspectRatio;\r\n return window.innerWidth < mobileImageTriggerWidth ? aspectRatioMobile : aspectRatio;\r\n };\r\n\r\n return (\r\n \r\n {aspectRatioMobile && (\r\n (\r\n // @ts-ignore\r\n `${url}?fit=thumb&q=${imageQuality}&f=${cropTo || ''}&fl=progressive&w=${widthSize}&h=${Math.ceil(parseInt(widthSize, 10) * aspectRatioMap[aspectRatioMobile])} ${widthSize}w`\r\n ))\r\n }\r\n />\r\n )}\r\n\r\n {\r\n if (isLoaded) {\r\n isLoaded();\r\n }\r\n }}\r\n data-sizes=\"auto\"\r\n style={{ objectPosition: focalPoint || 'initial' }}\r\n // @ts-ignore\r\n data-src={`${url}?fit=thumb&w=${lowQualityWidth}&f=${cropTo || ''}&h=${Math.ceil(parseInt(lowQualityWidth, 10) * aspectRatioMap[setAspectRatio()])}`}\r\n data-srcset={\r\n widthSizes.map((widthSize) => (\r\n // @ts-ignore\r\n `${url}?fit=thumb&q=${imageQuality}&f=${cropTo || ''}&fl=progressive&w=${widthSize}&h=${Math.ceil(parseInt(widthSize, 10) * aspectRatioMap[aspectRatio])} ${widthSize}w`\r\n ))\r\n }\r\n className={`lazyload blur-up ${isDarkened ? 'has-opacity' : ''}`}\r\n alt={alt || 'image with no description'}\r\n />\r\n \r\n );\r\n};\r\n\r\nexport default Image;\r\n","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport { Image as ImageType } from '../../../typings';\r\nimport 'lazysizes';\r\nimport 'lazysizes/plugins/attrchange/ls.attrchange';\r\nimport './styles.scss';\r\n\r\nconst defaultWidths = ['400', '800', '1200', '2400', '4000'];\r\n\r\nconst aspectRatioMap: Record = {\r\n '2x1': 0.5,\r\n '16x9': 0.5625,\r\n '3x2': 0.667,\r\n '4x3': 0.75,\r\n '1x1': 1,\r\n '4x5': 1.2,\r\n '2x3': 1.5,\r\n};\r\n\r\ninterface ImageObjectProps {\r\n image: ImageType;\r\n widthSizes?: string[];\r\n isDarkened?: boolean;\r\n useFocalPoint?: boolean;\r\n fitType?: 'contain' | 'cover'\r\n isLoaded?: () => void;\r\n noAnimate?: boolean;\r\n aspectRatio?: string;\r\n}\r\n\r\ninterface FocalStyle {\r\n objectPosition: string;\r\n}\r\n\r\nconst ImageObject = ({\r\n image,\r\n widthSizes = defaultWidths,\r\n aspectRatio,\r\n isDarkened = false,\r\n useFocalPoint = true,\r\n fitType = 'cover',\r\n isLoaded,\r\n noAnimate,\r\n}: ImageObjectProps) => {\r\n const [focalPoint, setFocalPoint] = useState();\r\n const [srcset, setSrcset] = useState();\r\n\r\n useEffect(() => {\r\n if (image.focalPoint) {\r\n // @ts-ignore\r\n const xPercentile = (image.focalPoint.x / image.file.details?.image?.width) * 100;\r\n // @ts-ignore\r\n const yPercentile = (image.focalPoint.y / image.file.details?.image?.height) * 100;\r\n setFocalPoint({\r\n objectPosition: `${xPercentile}% ${yPercentile}%`,\r\n });\r\n }\r\n\r\n const src = widthSizes\r\n .map((size: string, index: number) => `${image.file.url}?fit=thumb&fl=progressive&w=${size}&h=${aspectRatio ? Math.ceil(Number(widthSizes[index]) * aspectRatioMap[aspectRatio]) : ''} ${size}w`);\r\n\r\n setSrcset(src.join(','));\r\n }, [image]);\r\n\r\n const classes = [\r\n 'image-object',\r\n `image-object--${fitType}`,\r\n 'lazyload',\r\n ];\r\n if (isDarkened) {\r\n classes.push('has-opacity');\r\n }\r\n if (noAnimate) {\r\n classes.push('image-object--no-animate');\r\n }\r\n\r\n return (\r\n isLoaded?.()}\r\n data-sizes=\"auto\"\r\n data-srcset={srcset}\r\n data-src={`${image.file.url}?fit=thumb&fl=progressive&w=${widthSizes[0]}&h=${aspectRatio ? Math.ceil(Number(widthSizes[0]) * aspectRatioMap[aspectRatio]) : ''}`}\r\n className={classes.join(' ')}\r\n alt={image.title ? image.title : 'image with no description'}\r\n style={useFocalPoint ? focalPoint : undefined}\r\n />\r\n );\r\n};\r\n\r\nexport default ImageObject;\r\n","import * as React from 'react';\r\nimport './styles.scss';\r\n\r\ninterface UnderlineTitleProps {\r\n title: string;\r\n containerTheme: string;\r\n className?: string;\r\n disableUppercase?: boolean;\r\n}\r\n\r\nconst UnderlineTitle = ({\r\n title,\r\n containerTheme,\r\n className,\r\n disableUppercase,\r\n}: UnderlineTitleProps) => (\r\n

\r\n {title}\r\n

\r\n);\r\n\r\nexport default UnderlineTitle;\r\n","import * as React from 'react';\r\nimport { isEmpty } from 'lodash';\r\nimport useHabitat from '../../../hooks/useHabitat';\r\nimport './styles.scss';\r\nimport SvgImage from '../SvgImage';\r\nimport Contact from '../Contact';\r\nimport RichText from '../RichText';\r\nimport UnderlineTitle from '../UnderlineTitle';\r\nimport { Link, Contacts } from '../../../typings';\r\n\r\ninterface ContentProps {\r\n title?: string;\r\n intro?: string;\r\n contact?: Contacts;\r\n content?: string;\r\n link?: Link;\r\n secondaryLink?: Link;\r\n downloads?: Link[];\r\n containerTheme?: string;\r\n isTitleFloating?: boolean;\r\n disableUppercase?: boolean;\r\n}\r\n\r\nconst Content = ({\r\n title,\r\n intro,\r\n contact,\r\n content,\r\n link,\r\n secondaryLink,\r\n downloads,\r\n containerTheme = 'white',\r\n isTitleFloating,\r\n disableUppercase,\r\n}: ContentProps) => {\r\n useHabitat();\r\n\r\n return (\r\n
\r\n {Boolean(title || contact) && (\r\n
\r\n {title && (\r\n \r\n )}\r\n\r\n {(contact && !isEmpty(contact)) && (\r\n \r\n )}\r\n
\r\n )}\r\n\r\n {!title && (\r\n <>\r\n {intro && (!contact || isEmpty(contact)) && (!title\r\n ?

{intro}

\r\n :

{intro}

)}\r\n \r\n )}\r\n
\r\n {title && (\r\n <>\r\n {intro && (contact || !isEmpty(contact)) && (title\r\n ?

{intro}

\r\n :

{intro}

)}\r\n \r\n )}\r\n\r\n {content && (\r\n \r\n )}\r\n\r\n {downloads && (\r\n
    \r\n {downloads.map((download) => (\r\n
  • \r\n \r\n {download.title}\r\n \r\n \r\n
  • \r\n ))}\r\n
\r\n )}\r\n\r\n {link && (\r\n /* eslint-disable-next-line react/jsx-no-target-blank */\r\n \r\n {link.title}\r\n \r\n \r\n )}\r\n {secondaryLink && (\r\n /* eslint-disable-next-line react/jsx-no-target-blank */\r\n \r\n {secondaryLink.title}\r\n \r\n \r\n )}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Content;\r\n","import * as React from 'react';\r\nimport { useContext } from 'react';\r\nimport SvgImage from '../SvgImage';\r\nimport { Contacts } from '../../../typings';\r\nimport LocalizationContext from '../../../contexts/Localizations';\r\nimport './styles.scss';\r\n\r\ninterface ContactProps {\r\n contact: Contacts;\r\n containerTheme: string;\r\n}\r\n\r\nconst Contact = ({\r\n contact,\r\n containerTheme,\r\n}: ContactProps) => {\r\n const { translations } = useContext(LocalizationContext);\r\n // Adds space between every characters apart from (0)\r\n // Required for screen readers to read phone numbers properly and include all character\r\n const toReadable = (phoneNumber: string): string => phoneNumber\r\n .split(' ')\r\n .join('')\r\n .split('')\r\n .join(' ')\r\n .replace('( 0 )', '(0)');\r\n\r\n return (\r\n
\r\n

\r\n {translations.contact.title}\r\n

\r\n\r\n
    \r\n {(contact.addr && contact.addr.length) && (\r\n
  • \r\n \r\n {`${translations.contact.addr}:`}\r\n \r\n {contact.addr}\r\n
  • \r\n )}\r\n {(contact.tel && contact.tel.length) && (\r\n
  • \r\n \r\n {`${translations.contact.tel}:`}\r\n \r\n \r\n {contact.tel}\r\n \r\n
  • \r\n )}\r\n {(contact.fax && contact.fax.length) && (\r\n
  • \r\n \r\n {`${translations.contact.fax}:`}\r\n \r\n \r\n {contact.fax}\r\n \r\n
  • \r\n )}\r\n {(contact.email && contact.email.length) && (\r\n
  • \r\n \r\n {`${translations.contact.email}:`}\r\n \r\n \r\n {contact.email}\r\n \r\n
  • \r\n )}\r\n {(contact.website && contact.website.length) && (\r\n
  • \r\n \r\n {`${translations.contact.website}:`}\r\n \r\n \r\n {contact.website}\r\n \r\n
  • \r\n )}\r\n
  • \r\n
      \r\n {(contact.facebook && contact.facebook.length) && (\r\n
    • \r\n \r\n \r\n \r\n
    • \r\n )}\r\n {(contact.instagram && contact.instagram.length) && (\r\n
    • \r\n \r\n \r\n \r\n
    • \r\n )}\r\n {(contact.twitter && contact.twitter.length) && (\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 Contact;\r\n","import * as React from 'react';\r\nimport './styles.scss';\r\n\r\ninterface RichTextProps {\r\n content: string;\r\n containerTheme: string;\r\n}\r\n\r\nconst RichText = ({\r\n content,\r\n containerTheme,\r\n}: RichTextProps) => (\r\n
\r\n \r\n
\r\n);\r\n\r\nexport default RichText;\r\n","import { useEffect } from 'react';\r\n\r\nconst useHabitat = (): Function => {\r\n useEffect(() => {\r\n if (window.updateHabitat) {\r\n window.updateHabitat();\r\n }\r\n }, []);\r\n\r\n return window.updateHabitat as Function;\r\n};\r\n\r\nexport default useHabitat;\r\n","import { Image } from '../typings/index';\r\n\r\ndeclare global {\r\n interface Document {\r\n documentMode?: any;\r\n }\r\n}\r\n\r\nconst isIE = () => (\r\n !!window.MSInputMethodContext && !!document.documentMode\r\n);\r\n\r\n// Insert url param\r\nconst insertUrlParam = (key: string, value: string, includeHash?: boolean) => {\r\n // @ts-ignore\r\n if (history.pushState) {\r\n const searchParams = new URLSearchParams(window.location.search);\r\n searchParams.set(key, value);\r\n let newurl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${searchParams.toString()}`;\r\n if (includeHash && window.location.hash) {\r\n newurl = `${newurl}${window.location.hash}`;\r\n }\r\n window.history.pushState({ path: newurl }, '', newurl);\r\n }\r\n};\r\n\r\n// Removes all query string entires\r\nconst removeAllQueryStrings = () => {\r\n const url = window.location.href.replace(/(\\?.*)|(@.*)/g, '');\r\n window.history.pushState({ path: url }, '', url);\r\n};\r\n\r\n// Get All url params\r\nconst getAllUrlParams = (search: string) => {\r\n const hashes = search.slice(search.indexOf('?') + 1).split('&');\r\n const params: { [key: string]: string } = {};\r\n hashes.map((hash) => {\r\n const [key, val] = hash.split('=');\r\n params[key] = decodeURIComponent(val);\r\n return true;\r\n });\r\n return params;\r\n};\r\n\r\n// Get param value\r\nconst getUrlParamValue = (key: any) => {\r\n const search = Object.entries(getAllUrlParams(window.location.href)).filter((param) => (\r\n param[0] === key\r\n ));\r\n return search[0] ? search[0][1] : null;\r\n};\r\n\r\n// Script exists in head of document.\r\n// Taken from: https://github.com/kaimallea/isMobile\r\nconst isMobile = () => (\r\n /Mobi/.test(navigator.userAgent)\r\n);\r\n\r\nconst scrollIntoView = (elemToScrollTo: HTMLElement, behaviour: ScrollBehavior) => {\r\n if (!isIE()) {\r\n elemToScrollTo.scrollIntoView({\r\n behavior: behaviour,\r\n });\r\n }\r\n};\r\n\r\nconst isPortrait = (image: Image) => (\r\n // @ts-ignore\r\n (image.file.details.image.height > image.file.details.image.width)\r\n);\r\n\r\nconst elementInViewport = (el: any) => {\r\n let top = el.offsetTop;\r\n let left = el.offsetLeft;\r\n const width = el.offsetWidth;\r\n const height = el.offsetHeight;\r\n\r\n while (el.offsetParent) {\r\n // eslint-disable-next-line no-param-reassign\r\n el = el.offsetParent;\r\n top += el.offsetTop;\r\n left += el.offsetLeft;\r\n }\r\n\r\n return (\r\n top >= window.pageYOffset\r\n && left >= window.pageXOffset\r\n && (top + height) <= (window.pageYOffset + window.innerHeight)\r\n && (left + width) <= (window.pageXOffset + window.innerWidth)\r\n );\r\n};\r\n\r\nconst toDataURL = (url: string, callback: Function) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.onload = () => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n if (callback) {\r\n callback(reader.result);\r\n }\r\n };\r\n reader.readAsDataURL(xhr.response);\r\n };\r\n xhr.open('GET', url);\r\n xhr.responseType = 'blob';\r\n xhr.send();\r\n};\r\n\r\nexport {\r\n insertUrlParam,\r\n getAllUrlParams,\r\n getUrlParamValue,\r\n removeAllQueryStrings,\r\n isMobile,\r\n scrollIntoView,\r\n isPortrait,\r\n elementInViewport,\r\n toDataURL,\r\n};\r\n","import * as React from 'react';\r\nimport {\r\n useContext, useState, useEffect, useRef,\r\n} from 'react';\r\nimport moment from 'moment';\r\nimport { fr } from 'date-fns/locale/fr';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport PerfectScrollbar from 'react-perfect-scrollbar';\r\nimport DatePicker, { registerLocale } from 'react-datepicker';\r\nimport useOutsideAlerter from '../../../hooks/UseOutsideAlerter';\r\nimport LocalizationContext from '../../../contexts/Localizations';\r\nimport SvgImage from '../SvgImage';\r\nimport './styles.scss';\r\n\r\nregisterLocale('fr', fr);\r\n\r\ninterface JumpListOption {\r\n displayText: string;\r\n value: string;\r\n selectedValue?: boolean;\r\n visible?: boolean;\r\n name?: string;\r\n}\r\n\r\ninterface JumpListProps {\r\n items: JumpListOption[];\r\n selectedValue?: string;\r\n action: Function;\r\n icon?: string;\r\n theme?: string;\r\n useScroller?: boolean;\r\n useSearch?: boolean;\r\n name?: string;\r\n disableFirst?: boolean;\r\n withDatePicker?: boolean;\r\n defaultDatePickerValue?: Date;\r\n onDateChange?: Function;\r\n includeDates?: Date[];\r\n datePickerLocale?: string;\r\n}\r\n\r\nconst JumpList = ({\r\n items,\r\n action,\r\n selectedValue,\r\n icon = 'icon-arrow-down',\r\n theme = 'default',\r\n useScroller = false,\r\n useSearch = false,\r\n name,\r\n disableFirst = false,\r\n withDatePicker = false,\r\n defaultDatePickerValue,\r\n onDateChange,\r\n includeDates,\r\n datePickerLocale,\r\n}: JumpListProps) => {\r\n const wrapperRef = useRef>(null);\r\n const [value, setValue] = useState();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [options, setOptions] = useState();\r\n const [isClosing, setIsClosing] = useState(false);\r\n const [searchValue, setSearchValue] = useState(null);\r\n const { translations } = useContext(LocalizationContext);\r\n\r\n /**\r\n * Closes the open view\r\n */\r\n const close = () => {\r\n setIsClosing(true);\r\n setTimeout(() => {\r\n setIsClosing(false);\r\n setIsOpen(false);\r\n if (useSearch) {\r\n setSearchValue(null);\r\n }\r\n }, useSearch ? 0 : 300);\r\n };\r\n\r\n /**\r\n * This will tigger the close method when the user\r\n * interacts outside wrapperRef\r\n */\r\n useOutsideAlerter(wrapperRef, () => {\r\n close();\r\n });\r\n\r\n /**\r\n * Toggle open/close\r\n * @param event\r\n * @returns\r\n */\r\n const toggle = (event?: React.MouseEvent) => {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n\r\n if (disableFirst) {\r\n return null;\r\n }\r\n\r\n if (isOpen) {\r\n return close();\r\n }\r\n\r\n return setIsOpen(!isOpen);\r\n };\r\n\r\n /**\r\n * This remaps the options base of the items and selectedValue\r\n * props.\r\n * @returns\r\n */\r\n const mapSelection = () => items.map((item, index) => ({\r\n ...item,\r\n name,\r\n selectedValue: item.value === selectedValue,\r\n visible: !(withDatePicker && defaultDatePickerValue && index > 4),\r\n }));\r\n\r\n /**\r\n * This handels the change event on the drop down.\r\n * @param event\r\n * @param optionIndex\r\n */\r\n const handleChange = (event: React.MouseEvent, optionIndex: number) => {\r\n event.preventDefault();\r\n setOptions(mapSelection());\r\n setValue(options ? options[optionIndex] : undefined);\r\n close();\r\n\r\n if (action && typeof action === 'function') {\r\n action(options ? options[optionIndex] : undefined);\r\n }\r\n };\r\n\r\n /**\r\n * Component has mounted hook\r\n */\r\n useEffect(() => {\r\n if (items.length) {\r\n const optionsSelection = mapSelection();\r\n setOptions(optionsSelection);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Observe the options state to determine the selected value.\r\n * If a new value is selected with will trigger and setValue in state.\r\n */\r\n useEffect(() => {\r\n if (options) {\r\n const selected: JumpListOption = options.filter(\r\n (item: JumpListOption) => item.value === selectedValue,\r\n )[0];\r\n\r\n setValue(selected || options[0]);\r\n }\r\n }, [options, selectedValue]);\r\n\r\n /**\r\n * Observe the search value term to filter down the visible\r\n * option in the list. This is only applicable if the user\r\n * has turned on useSearch in props.\r\n */\r\n useEffect(() => {\r\n if (options) {\r\n if (searchValue === null || searchValue === '') {\r\n setOptions(mapSelection());\r\n } else {\r\n const filteredOptions: JumpListOption[] = options?.map((option) => ({\r\n ...option,\r\n visible: option.displayText.toLowerCase().includes(searchValue.toLowerCase()),\r\n }));\r\n\r\n setOptions(filteredOptions);\r\n }\r\n }\r\n }, [searchValue, selectedValue, items]);\r\n\r\n /**\r\n * Creates a list option\r\n * @param option\r\n * @param index\r\n * @returns\r\n */\r\n const createOption = (option: JumpListOption, index: number) => (\r\n
  • \r\n handleChange(event, index)}>\r\n {option.displayText}\r\n \r\n
  • \r\n );\r\n\r\n /**\r\n * Creates the search JSX controls. This is only applicable\r\n * if the user has turned on useSearch in props.\r\n * @returns\r\n */\r\n const createSearch = () => (\r\n
    \r\n (\r\n setSearchValue((event.currentTarget as HTMLInputElement).value)\r\n )}\r\n />\r\n {Boolean(!options?.filter((option) => option.visible).length) && (\r\n
    \r\n {`No selection found for ${searchValue}.`}\r\n {/* Needs Laguage label */}\r\n
    \r\n )}\r\n
    \r\n );\r\n\r\n /**\r\n * Creates the option list.\r\n * @returns\r\n */\r\n const createOptions = () => {\r\n if (useScroller) {\r\n return (\r\n
    \r\n {useSearch && createSearch()}\r\n \r\n <>\r\n {options && (\r\n
      \r\n {options?.map((option, key) => option.visible && createOption(option, key))}\r\n
    \r\n )}\r\n\r\n {withDatePicker && defaultDatePickerValue && (\r\n {\r\n if (onDateChange) {\r\n const dateIndex = options?.findIndex((option) => {\r\n const optionMoment = moment(option.value).format('DD-MM-YYYY');\r\n const selectedMoment = moment(date).format('DD-MM-YYYY');\r\n\r\n return optionMoment === selectedMoment;\r\n });\r\n\r\n if (dateIndex !== undefined && dateIndex >= 0) {\r\n onDateChange(date);\r\n\r\n handleChange(event, dateIndex);\r\n }\r\n }\r\n }}\r\n includeDates={includeDates}\r\n inline\r\n locale={datePickerLocale}\r\n />\r\n )}\r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n {useSearch && createSearch()}\r\n {options && (\r\n
      \r\n {options?.map((option, key) => option.visible && createOption(option, key))}\r\n
    \r\n )}\r\n\r\n {withDatePicker && defaultDatePickerValue && (\r\n \r\n )}\r\n
    \r\n );\r\n };\r\n\r\n return (\r\n \r\n
    \r\n {value && (\r\n \r\n )}\r\n
    \r\n
    \r\n \r\n
    \r\n {createOptions()}\r\n \r\n );\r\n};\r\n\r\nexport default JumpList;\r\n","export default {\r\n xxs: 375,\r\n xs: 450,\r\n sm: 620,\r\n md: 768,\r\n ml: 870,\r\n lg: 1024,\r\n xl: 1300,\r\n xxl: 1440,\r\n xxxl: 1740,\r\n xxxxl: 1900,\r\n};\r\n","/* eslint-disable react/no-array-index-key */\r\nimport React, { useState, useEffect, Fragment } from 'react';\r\nimport SvgImage from '../SvgImage';\r\nimport './styles.scss';\r\n\r\ninterface ResponsiveTableProps {\r\n headers: {\r\n alwaysVisible: boolean;\r\n key: string;\r\n label: string;\r\n hiddenOnMobile?: boolean;\r\n }[];\r\n rows: {\r\n row: Record;\r\n Table?: JSX.Element;\r\n }[];\r\n stickyCol?: JSX.Element[];\r\n className?: string;\r\n moreClassName?: string;\r\n headerClassName?: string;\r\n rowClassName?: string;\r\n cellClassName?: string;\r\n nested?: boolean;\r\n}\r\n\r\nconst ResponsiveTable = ({\r\n headers,\r\n rows,\r\n stickyCol,\r\n className,\r\n moreClassName,\r\n headerClassName,\r\n rowClassName,\r\n cellClassName,\r\n nested,\r\n}: ResponsiveTableProps) => {\r\n const [isExpanded, setExpanded] = useState(false);\r\n const [rowExpandedStates, setRowExpandedStates] = useState>({});\r\n\r\n const toggleExpandTable = () => {\r\n setExpanded(!isExpanded);\r\n };\r\n\r\n const toggleExpandRow = (rowIndex: number) => {\r\n setRowExpandedStates({\r\n ...rowExpandedStates,\r\n [rowIndex]: !rowExpandedStates[rowIndex],\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (rows.some((row) => row.Table)) {\r\n setRowExpandedStates(Object.fromEntries(Object.entries(rows.map(() => false))));\r\n }\r\n }, []);\r\n\r\n return (\r\n
    \r\n {!nested && (\r\n
    \r\n \r\n Show details\r\n \r\n
    \r\n )}\r\n\r\n
    \r\n \r\n \r\n \r\n {stickyCol && (\r\n \r\n )}\r\n\r\n {headers.map((header) => (\r\n \r\n {header.label}\r\n \r\n ))}\r\n\r\n {rows.some((row) => row.Table) && (\r\n \r\n
    \r\n expand\r\n
    \r\n \r\n )}\r\n \r\n \r\n \r\n {rows.map(({ row, Table }, rowIndex) => (\r\n \r\n \r\n {headers.map((header, colIndex) => (\r\n \r\n {stickyCol && colIndex === 0 && (\r\n {stickyCol[rowIndex]}\r\n )}\r\n \r\n {row[header.key]}\r\n \r\n \r\n ))}\r\n\r\n {Table && (\r\n \r\n toggleExpandRow(rowIndex)}\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n {Table && (\r\n \r\n \r\n { Table }\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 ResponsiveTable;\r\n","import * as React from 'react';\r\nimport moment from 'moment';\r\nimport { Link as LinkType } from '../../../typings';\r\nimport './styles.scss';\r\n\r\ninterface DateAndCategoryProps {\r\n date?: string;\r\n category?: LinkType;\r\n dateFormat?: string;\r\n}\r\n\r\nconst DateAndCategory = ({ date, category, dateFormat }: DateAndCategoryProps) => (\r\n
    \r\n {category && (\r\n \r\n )}\r\n {date && (\r\n \r\n )}\r\n\r\n
    \r\n);\r\n\r\nexport default DateAndCategory;\r\n","import * as React from 'react';\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport useHabitat from '../../../hooks/useHabitat';\r\nimport Content from '../Content';\r\nimport { Discipline } from '../../../core/typings';\r\nimport './styles.scss';\r\n\r\ninterface AccordionPanelProps {\r\n index: number;\r\n activeTab: boolean;\r\n toggleTab: Function;\r\n label: string | JSX.Element;\r\n content: string | JSX.Element | JSX.Element[];\r\n themeColor: string;\r\n discipline?: string;\r\n isAsync?: boolean;\r\n isResults?: boolean;\r\n}\r\n\r\nconst AccordionPanel = ({\r\n index,\r\n activeTab,\r\n toggleTab,\r\n label,\r\n content,\r\n themeColor,\r\n discipline,\r\n isAsync,\r\n isResults,\r\n}: AccordionPanelProps) => {\r\n const [height, setHeight] = useState('0px');\r\n const [asyncContentLoaded, setAsyncContentLoaded] = useState(false);\r\n const wrapper = useRef(null);\r\n\r\n const calculatePanelHeight = () => {\r\n const panelElement = wrapper.current as HTMLDivElement;\r\n\r\n if (activeTab) {\r\n panelElement.ontransitionend = () => {\r\n setHeight('auto');\r\n };\r\n\r\n setHeight(`${panelElement.scrollHeight}px`);\r\n } else {\r\n panelElement.ontransitionend = null;\r\n\r\n setHeight(`${panelElement.scrollHeight}px`);\r\n\r\n requestAnimationFrame(() => {\r\n setHeight('0px');\r\n });\r\n }\r\n };\r\n\r\n const handleLoadedContent = () => {\r\n setAsyncContentLoaded(true);\r\n calculatePanelHeight();\r\n };\r\n\r\n useEffect(() => {\r\n calculatePanelHeight();\r\n }, [activeTab]);\r\n\r\n return (\r\n
    \r\n toggleTab(index)}\r\n >\r\n {label}\r\n \r\n \r\n {typeof content === 'string' && (\r\n
    \r\n \r\n
    \r\n )}\r\n\r\n {!isAsync && React.isValidElement(content) && content}\r\n\r\n {isAsync && (activeTab || asyncContentLoaded) && React.isValidElement(content) && (\r\n \r\n )}\r\n
    \r\n \r\n );\r\n};\r\n\r\nexport interface AccordionPanelType {\r\n label: string | JSX.Element;\r\n content: string | JSX.Element | JSX.Element[];\r\n}\r\n\r\ninterface AccordionProps {\r\n panels: AccordionPanelType[];\r\n themeColor: string;\r\n discipline?: Discipline;\r\n isResults?: boolean;\r\n}\r\n\r\ninterface PanelsState {\r\n label: string | JSX.Element;\r\n content: string | JSX.Element | JSX.Element[];\r\n activeTab: boolean;\r\n}\r\n\r\nconst Accordion = ({\r\n panels,\r\n themeColor,\r\n discipline,\r\n isResults,\r\n}: AccordionProps) => {\r\n const [panelsInState, setPanelsInState] = useState([]);\r\n useHabitat();\r\n\r\n const toggleTab = (index: number) => {\r\n const current: PanelsState[] = [...panelsInState];\r\n\r\n current[index].activeTab = !panelsInState[index].activeTab;\r\n setPanelsInState(current);\r\n };\r\n\r\n useEffect(() => {\r\n if (panels) {\r\n const mappedPanels: PanelsState[] = panels.map((panel) => ({\r\n ...panel,\r\n activeTab: false,\r\n }));\r\n\r\n setPanelsInState(mappedPanels);\r\n }\r\n }, []);\r\n\r\n return (\r\n
    \r\n {panelsInState && (\r\n <>\r\n {panelsInState.map((panel, index) => (\r\n \r\n ))}\r\n \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default Accordion;\r\n","import * as React from 'react';\r\nimport { useState, useEffect } from 'react';\r\nimport { Image as ImageType } from '../../../typings';\r\nimport 'lazysizes';\r\nimport 'lazysizes/plugins/attrchange/ls.attrchange';\r\n\r\nconst defaultWidths = ['400', '800', '1200', '2400', '4000'];\r\n\r\ninterface ImageBasicProps {\r\n image: ImageType;\r\n widthSizes?: string[];\r\n isDarkened?: boolean;\r\n useIntrinsicHeight?: boolean;\r\n}\r\n\r\nconst ImageBasic = ({\r\n image,\r\n widthSizes = defaultWidths,\r\n isDarkened = false,\r\n useIntrinsicHeight,\r\n}: ImageBasicProps) => {\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [srcset, setSrcset] = useState();\r\n\r\n useEffect(() => {\r\n const src = widthSizes\r\n .map((size: string) => `${image.file.url}?fit=thumb&fl=progressive&w=${size} ${size}w`);\r\n\r\n setSrcset(src.join(','));\r\n }, [image]);\r\n\r\n return (\r\n setIsLoaded(true)}\r\n />\r\n );\r\n};\r\n\r\nexport default ImageBasic;\r\n","import * as React from 'react';\r\n\r\nimport './styles.scss';\r\n\r\nconst Loader: React.FC = () => (\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 Loader;\r\n","import * as React from 'react';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport SvgImage from '../SvgImage';\r\nimport './styles.scss';\r\n\r\ninterface SocialLinksProps {\r\n list: {\r\n name: string;\r\n url: string;\r\n type: string;\r\n }[];\r\n}\r\n\r\nconst SocialLinks = ({ list }: SocialLinksProps) => (\r\n
    \r\n \r\n
    \r\n);\r\n\r\nexport default SocialLinks;\r\n","import * as React from 'react';\r\nimport Tag from '../Tag';\r\nimport './styles.scss';\r\n\r\ninterface TagProps {\r\n tags: {\r\n text: string;\r\n url: string;\r\n }[];\r\n}\r\n\r\nconst TagList = ({ tags }: TagProps) => (\r\n
      \r\n {tags.map((tag) => (\r\n
    • \r\n \r\n
    • \r\n ))}\r\n
    \r\n);\r\n\r\nexport default TagList;\r\n","import * as React from 'react';\r\nimport { insertUrlParam } from '../../../utilities/browser';\r\nimport { isIdenticalObject } from '../../../utilities/objects';\r\nimport SvgImage from '../SvgImage';\r\nimport './styles.scss';\r\n\r\ninterface PaginationProps {\r\n totalItems: number;\r\n currentPage: number;\r\n itemsPerPage: number;\r\n handleClick?: Function;\r\n pageQueryKey?: string;\r\n retainRoute?: boolean;\r\n style?: string;\r\n}\r\n\r\ninterface PaginationState {\r\n pages: number[];\r\n firstPageIndex: number | undefined;\r\n lastPageIndex: number | undefined;\r\n previousPageIndex: number | undefined;\r\n nextPageIndex: number | undefined;\r\n totalItems?: number | undefined;\r\n currentPage: number | undefined;\r\n totalAmountOfPages: number | undefined;\r\n isFirstPageDisabled: boolean | undefined;\r\n isLastPageDisabled: boolean | undefined;\r\n isPreviousDisabled: boolean | undefined;\r\n isNextDisabled: boolean | undefined;\r\n // The below need to move to props with defaults\r\n maxVisiblePagesMobile: number;\r\n maxVisiblePagesDesktop: number;\r\n maxVisiblePages: number;\r\n}\r\n\r\n// move to prop with default value\r\nconst breakpoint = 620;\r\n\r\nconst defaultProps = {\r\n pageQueryKey: 'page',\r\n};\r\nexport default class Pagination extends React.Component {\r\n // eslint-disable-next-line react/static-property-placement\r\n static defaultProps = defaultProps;\r\n\r\n constructor(props: PaginationProps) {\r\n super(props);\r\n this.state = {\r\n pages: [],\r\n firstPageIndex: undefined,\r\n lastPageIndex: undefined,\r\n previousPageIndex: undefined,\r\n nextPageIndex: undefined,\r\n // totalItems: undefined,\r\n currentPage: undefined,\r\n isFirstPageDisabled: undefined,\r\n isLastPageDisabled: undefined,\r\n totalAmountOfPages: undefined,\r\n isPreviousDisabled: undefined,\r\n isNextDisabled: undefined,\r\n maxVisiblePagesMobile: 3,\r\n maxVisiblePagesDesktop: 5,\r\n maxVisiblePages: 5,\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n await this.handdleMaxVisiblePages(window.innerWidth);\r\n window.addEventListener('resize', async (event) => {\r\n event.stopPropagation();\r\n await this.handdleMaxVisiblePages(window.innerWidth);\r\n });\r\n\r\n this.getPager();\r\n }\r\n\r\n componentDidUpdate(prevProps: PaginationProps) {\r\n const hasPropsUpdated = isIdenticalObject(prevProps, this.props);\r\n if (!hasPropsUpdated) {\r\n this.getPager();\r\n }\r\n }\r\n\r\n /**\r\n * This handles setting the state of the pager.\r\n * Flags toggle display views on pager elements\r\n * and fetches and sets the visable page list\r\n * from generateVisablePages.\r\n */\r\n getPager() {\r\n const {\r\n totalItems,\r\n currentPage,\r\n itemsPerPage,\r\n } = this.props;\r\n\r\n const {\r\n maxVisiblePages,\r\n } = this.state;\r\n\r\n const totalAmountOfPages = Math.ceil(totalItems / itemsPerPage);\r\n const isFirstPageDisabled = (\r\n (!(currentPage > (Math.ceil(maxVisiblePages / 2)))) || totalAmountOfPages <= maxVisiblePages\r\n );\r\n const isLastPageDisabled = currentPage > totalAmountOfPages - Math.ceil(maxVisiblePages / 2)\r\n || totalAmountOfPages <= maxVisiblePages;\r\n const lastPageIndex = totalAmountOfPages;\r\n const previousPageIndex = (currentPage - 1);\r\n const isPreviousDisabled = !(currentPage - 1);\r\n const isNextDisabled = (currentPage + 1) > lastPageIndex;\r\n\r\n this.setState({\r\n pages: this.generateVisablePages(\r\n totalAmountOfPages,\r\n currentPage,\r\n ),\r\n firstPageIndex: 1,\r\n lastPageIndex,\r\n previousPageIndex,\r\n nextPageIndex: (currentPage + 1),\r\n // totalItems,\r\n currentPage,\r\n totalAmountOfPages,\r\n isFirstPageDisabled,\r\n isLastPageDisabled,\r\n isPreviousDisabled,\r\n isNextDisabled,\r\n });\r\n }\r\n\r\n /**\r\n * Generates and returns the list of visible\r\n * pages based on the current page and the\r\n * maxVisiblePages.\r\n * @param totalAmountOfPages\r\n * @param currentPage\r\n */\r\n generateVisablePages(totalAmountOfPages: number, currentPage: number) {\r\n const { maxVisiblePages } = this.state;\r\n const maxVisibleOffset = (maxVisiblePages % 2 === 0) ? 1 : 0.5;\r\n let startPage = 1;\r\n let endPage = (maxVisiblePages + 1);\r\n\r\n if (currentPage > 2) {\r\n startPage = (currentPage - (maxVisiblePages / 2 - maxVisibleOffset));\r\n endPage = (currentPage + (maxVisiblePages / 2 + maxVisibleOffset));\r\n }\r\n\r\n if (currentPage > (totalAmountOfPages - 2)) {\r\n startPage = (totalAmountOfPages - (maxVisiblePages - 1));\r\n endPage = totalAmountOfPages + 1;\r\n }\r\n\r\n if (totalAmountOfPages <= maxVisiblePages) {\r\n startPage = 1;\r\n endPage = totalAmountOfPages + 1;\r\n }\r\n\r\n return Array.from({\r\n length: (endPage - startPage),\r\n }, (s, l) => l + startPage);\r\n }\r\n\r\n /**\r\n * Checks the viewport width to determine the\r\n * maxVisiblePages based on mobile/desktop\r\n * @param viewportWidth\r\n */\r\n async handdleMaxVisiblePages(viewportWidth: number) {\r\n const {\r\n maxVisiblePagesMobile,\r\n maxVisiblePagesDesktop,\r\n totalAmountOfPages,\r\n currentPage,\r\n } = this.state;\r\n\r\n if (viewportWidth < breakpoint) {\r\n await this.setState({\r\n maxVisiblePages: maxVisiblePagesMobile,\r\n });\r\n } else {\r\n await this.setState({\r\n maxVisiblePages: maxVisiblePagesDesktop,\r\n });\r\n }\r\n\r\n this.setState({\r\n pages: this.generateVisablePages(\r\n totalAmountOfPages as number,\r\n currentPage as number,\r\n ),\r\n });\r\n }\r\n\r\n /**\r\n * Change page state handler\r\n * @param event\r\n * @param page\r\n */\r\n changePage(event: React.MouseEvent, page: number) {\r\n const {\r\n pageQueryKey,\r\n retainRoute,\r\n handleClick,\r\n } = this.props;\r\n\r\n event.preventDefault();\r\n insertUrlParam((pageQueryKey || ''), String(page), retainRoute);\r\n if (handleClick) {\r\n handleClick(page);\r\n }\r\n }\r\n\r\n /**\r\n * Generates the page buttons\r\n * @param page\r\n * @param text\r\n * @param isDisabled\r\n */\r\n generateButton(page: number, text: string, isDisabled: boolean) {\r\n const { retainRoute } = this.props;\r\n const rootLocation = retainRoute ? '' : `${window.location.pathname}?page=${page}`;\r\n return (\r\n (!isDisabled ? this.changePage(event, page) : null)}\r\n href={rootLocation}\r\n role=\"button\"\r\n >\r\n {text}\r\n \r\n );\r\n }\r\n\r\n render() {\r\n const {\r\n style,\r\n } = this.props;\r\n\r\n const {\r\n pages,\r\n firstPageIndex,\r\n lastPageIndex,\r\n previousPageIndex,\r\n nextPageIndex,\r\n currentPage,\r\n isFirstPageDisabled,\r\n isLastPageDisabled,\r\n isPreviousDisabled,\r\n isNextDisabled,\r\n totalAmountOfPages,\r\n } = this.state;\r\n\r\n return (\r\n
    \r\n
      \r\n\r\n {/* First page */}\r\n
    • \r\n {this.generateButton(firstPageIndex as number, '1', isFirstPageDisabled as boolean)}\r\n
    • \r\n\r\n {/* Page list */}\r\n {pages.map((item) => (\r\n
    • \r\n {this.generateButton(item, String(item), false)}\r\n
    • \r\n ))}\r\n\r\n {/* Last page */}\r\n
    • \r\n {this.generateButton(lastPageIndex as number, `${totalAmountOfPages}`, isLastPageDisabled as boolean)}\r\n
    • \r\n
    \r\n\r\n \r\n\r\n
    \r\n\r\n );\r\n }\r\n}\r\n","import { useEffect } from 'react';\r\n\r\nconst useOutsideAlerter = (ref: any, handler?: Function) => {\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n if (handler && typeof handler === 'function') {\r\n handler();\r\n }\r\n }\r\n };\r\n\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [ref]);\r\n};\r\n\r\nexport default useOutsideAlerter;\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events */\r\nimport * as React from 'react';\r\nimport ImageBasic from '../common/ImageBasic';\r\nimport { Image as ImageType } from '../../typings';\r\nimport { isPortrait } from '../../utilities/browser';\r\n\r\ninterface InlineGalleryItemProps {\r\n image: ImageType;\r\n handleClick: Function;\r\n}\r\n\r\nconst InlineGalleryItem = ({\r\n image,\r\n handleClick,\r\n}: InlineGalleryItemProps) => (\r\n handleClick()}\r\n tabIndex={0}\r\n data-width={image.file?.details?.image.width}\r\n >\r\n \r\n
    \r\n);\r\nexport default InlineGalleryItem;\r\n","/* eslint no-param-reassign: \"off\" */\r\nimport * as React from 'react';\r\nimport { useState, useRef, useEffect } from 'react';\r\nimport Slider from 'react-slick';\r\nimport {\r\n SvgImage,\r\n ImageObject,\r\n Loader,\r\n} from '../common';\r\nimport InlineGalleryItem from './InlineGalleryItem';\r\nimport InlineGalleryProps from './type';\r\nimport {\r\n isPortrait,\r\n} from '../../utilities/browser';\r\nimport './styles.scss';\r\n\r\nconst ESC_KEY = 27;\r\n\r\ninterface SliderSettings {\r\n dots: boolean;\r\n arrows: boolean;\r\n fade: boolean;\r\n infinite: boolean;\r\n speed: number;\r\n slidesToShow: number;\r\n slidesToScroll: number;\r\n accessibility: boolean;\r\n centerMode: boolean;\r\n variableWidth: boolean;\r\n beforeChange: Function;\r\n onInit: Function;\r\n}\r\n\r\nconst defaultSliderSettings: SliderSettings = {\r\n dots: false,\r\n arrows: false,\r\n fade: false,\r\n infinite: false,\r\n speed: 500,\r\n slidesToShow: 1,\r\n slidesToScroll: 1,\r\n accessibility: true,\r\n centerMode: false,\r\n variableWidth: true,\r\n onInit: () => {},\r\n beforeChange: () => {},\r\n};\r\n\r\nconst InlineGallery = ({\r\n images,\r\n}: InlineGalleryProps) => {\r\n const slider = useRef(null);\r\n const wrapper = useRef(null);\r\n const [showPrevious, setShowPrevious] = useState(false);\r\n const [showNext, setShowNext] = useState(images.length > 1);\r\n const [currentSlide, setCurrentSlide] = useState(0);\r\n const [isFullScreen, setIsFullScreen] = useState(false);\r\n const [isLoaded, setisLoaded] = useState(false);\r\n const [sliderSettings, setSliderSettings] = useState({\r\n ...defaultSliderSettings,\r\n // We have to assign the slider callbacks separately as they\r\n // both have have reference (useRef elements) usages\r\n /* eslint-disable */\r\n onInit: () => onSliderInit(),\r\n beforeChange: (oldIndex: number, newIndex: number) => {\r\n onSliderBeforeChange(oldIndex, newIndex);\r\n },\r\n /* eslint-enable */\r\n });\r\n\r\n /**\r\n * More Slick slider hackery. This method calculators the\r\n * over all content width of the gallery so we can set max\r\n * widths on the container and the image (slide) placeholder.\r\n */\r\n const setMaxSlideWidth = () => {\r\n const slides: NodeListOf = (\r\n wrapper.current?.querySelectorAll('.inline-gallery__item') as NodeListOf\r\n );\r\n\r\n const viewportWidth: number = window.innerWidth;\r\n const containerWidth: number = (wrapper.current?.clientWidth as number);\r\n\r\n [].forEach.call(slides, (slide: HTMLDivElement) => {\r\n const slideImage = slide.querySelector('img');\r\n const imageWidth = slideImage?.offsetWidth as number;\r\n if (imageWidth >= viewportWidth) {\r\n // @ts-ignore\r\n slide?.parentNode?.parentNode?.style.maxWidth = `${containerWidth}px`;\r\n // @ts-ignore\r\n slide?.parentNode?.parentNode?.style.overflow = 'hidden';\r\n } else {\r\n // @ts-ignore\r\n slide?.parentNode?.parentNode?.style.maxWidth = `${imageWidth}px`;\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Callback function for slick slider initaliser. It checks\r\n * the images have loaded into the dom by checking the image\r\n * is laoded flag set by the image component. This is ran in\r\n * an interval until the images have loaded then in runs\r\n * setMaxSlideWidth ands clears the interval.\r\n */\r\n const onSliderInit = () => {\r\n const checkIfSlickIsLoaded = setInterval(() => {\r\n if (wrapper.current && wrapper.current?.querySelectorAll('.image-is-loaded').length === images.length) {\r\n setMaxSlideWidth();\r\n clearInterval(checkIfSlickIsLoaded);\r\n setisLoaded(true);\r\n }\r\n }, 300);\r\n };\r\n\r\n /**\r\n * Callback function for the slick before change event. This\r\n * handles the state for previous and next controls and sets\r\n * the current slide index in state.\r\n * @param oldIndex\r\n * @param newIndex\r\n */\r\n const onSliderBeforeChange = (oldIndex: number, newIndex: number) => {\r\n setTimeout(() => {\r\n setShowPrevious(Boolean(newIndex));\r\n setShowNext(Boolean((newIndex !== (images.length - 1))));\r\n setCurrentSlide(newIndex);\r\n }, 100);\r\n };\r\n\r\n /**\r\n * SlickSlider fugly hacky crap. This unsers the crap that\r\n * setMaxSlideWidth() sets :).\r\n */\r\n const resetMaxSlideWidth = () => {\r\n const slides = wrapper.current?.querySelectorAll('.inline-gallery__item');\r\n [].forEach.call(slides, (slide: HTMLElement) => {\r\n // @ts-ignore\r\n slide.querySelector('img').style.maxWidth = null;\r\n // @ts-ignore\r\n slide.parentNode.parentNode.style.maxWidth = null;\r\n });\r\n };\r\n\r\n /**\r\n * Toggle fullscreen state and changes the slider settings\r\n * accordinly.\r\n */\r\n const toggleFullscreen = () => {\r\n setIsFullScreen(!isFullScreen);\r\n setSliderSettings({\r\n ...sliderSettings,\r\n fade: !sliderSettings.fade,\r\n });\r\n };\r\n\r\n /**\r\n * Handles the next slide\r\n * @param event\r\n */\r\n const next = (event: React.MouseEvent) => {\r\n event.stopPropagation();\r\n if (showNext) {\r\n slider.current?.slickNext();\r\n }\r\n };\r\n\r\n /**\r\n * Handles the previous slide\r\n * @param event\r\n */\r\n const previous = (event: React.MouseEvent) => {\r\n event.stopPropagation();\r\n if (showPrevious) {\r\n slider.current?.slickPrev();\r\n }\r\n };\r\n\r\n /**\r\n * Changes the slide based on the index value passed.\r\n * @param event\r\n */\r\n const changeSlide = (index: number) => {\r\n slider.current?.slickGoTo(index);\r\n };\r\n\r\n /**\r\n * Component is mounted\r\n */\r\n useEffect(() => {\r\n // Set setMaxSlideWidth on window.resize\r\n window.addEventListener('resize', () => {\r\n resetMaxSlideWidth();\r\n setMaxSlideWidth();\r\n });\r\n\r\n // Add the keyup event listener to toggle the fullscreen mode\r\n document.addEventListener('keyup', (event) => {\r\n if (isFullScreen) {\r\n const key = event.key || event.keyCode;\r\n if (key === 'Escape' || key === 'Esc' || key === ESC_KEY) {\r\n setIsFullScreen(false);\r\n setSliderSettings({\r\n ...sliderSettings,\r\n fade: !sliderSettings.fade,\r\n });\r\n }\r\n }\r\n });\r\n }, []);\r\n\r\n return (\r\n <>\r\n {images && (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {!isLoaded && (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n {/* @ts-ignore */}\r\n \r\n {images.map((image) => (\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\n
    \r\n {images[currentSlide].title && (\r\n
    \r\n {images[currentSlide].title}\r\n
    \r\n )}\r\n\r\n {isFullScreen && (\r\n <>\r\n \r\n
    \r\n
    \r\n
      \r\n {images.map((image, index) => (\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\n );\r\n};\r\n\r\nexport default InlineGallery;\r\n"],"sourceRoot":""}