{"version":3,"file":"2933-1178313f1719e135e513.js","mappings":"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","sources":["webpack://lcci/./src/img/icons/chevron-left.svg","webpack://lcci/./src/helpers/global.ts","webpack://lcci/./src/helpers/grid.ts","webpack://lcci/./src/helpers/image.ts","webpack://lcci/./src/helpers/utils.ts","webpack://lcci/./src/hoc/withMotionMax.tsx","webpack://lcci/./src/hooks/useResize.ts","webpack://lcci/./src/stories/Components/Carousels/Carousel/CarouselProvider/CarouselProvider.tsx","webpack://lcci/./src/hooks/useCarousel.ts","webpack://lcci/./src/stories/Components/Carousels/Carousel/MotionTrack/MotionTrack.styles.ts","webpack://lcci/./src/stories/Components/Carousels/Carousel/MotionTrack/MotionTrack.tsx","webpack://lcci/./src/stories/Components/Misc/Image/Image.tsx"],"sourcesContent":["var _path;\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport * as React from \"react\";\n\nfunction SvgChevronLeft(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 6.16 10.02\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M.002 5.04a.416.416 0 00.14.274l5.041 4.55a.621.621 0 00.389.152.646.646 0 00.406-.116.429.429 0 00.186-.318.409.409 0 00-.145-.33l-4.7-4.244L6.018.764a.409.409 0 00.146-.33.429.429 0 00-.186-.317A.646.646 0 005.571 0a.621.621 0 00-.388.152L.142 4.7a.4.4 0 00-.14.34z\",\n fill: \"currentColor\"\n })));\n}\n\nexport default SvgChevronLeft;","import { css } from 'styled-components';\r\nexport default {\r\n navHeight: 107,\r\n navHeightTablet: 80,\r\n navHeightMobile: 59,\r\n};\r\nexport const ButtonReset = css `\r\n border: none;\r\n outline: none;\r\n padding: 0px;\r\n background: none;\r\n border-radius: 0px;\r\n`;\r\n","import { css } from 'styled-components';\r\nexport const SitePaddingMin = 18;\r\nexport const SitePaddingMax = 64;\r\nexport const SiteWidth = 1760;\r\nexport const SiteWidthBreakpoint = SiteWidth + SitePaddingMax * 2;\r\nexport const SiteWidthNarrow = 940;\r\nexport const siteWide = css `\r\n margin: 0 auto;\r\n max-width: var(--siteWidth);\r\n padding: 0 var(--sitePadding);\r\n width: 100%;\r\n`;\r\nexport const baseGrid = css `\r\n display: grid;\r\n column-gap: var(--gutterWidth);\r\n grid-template-columns: repeat(24, 1fr);\r\n`;\r\n","import { Cloudinary } from '@cloudinary/url-gen';\r\nimport { dpr, format, quality } from '@cloudinary/url-gen/actions/delivery';\r\nimport { crop, fill, limitFill, pad, thumbnail } from '@cloudinary/url-gen/actions/resize';\r\nimport { face } from '@cloudinary/url-gen/qualifiers/focusOn';\r\nimport { auto as autoFormat } from '@cloudinary/url-gen/qualifiers/format';\r\nimport { autoGravity, focusOn } from '@cloudinary/url-gen/qualifiers/gravity';\r\nimport { auto as autoQuality } from '@cloudinary/url-gen/qualifiers/quality';\r\nimport { css } from 'styled-components';\r\nconst cl = new Cloudinary({\r\n cloud: {\r\n cloudName: 'lcci',\r\n },\r\n url: {\r\n secure: true,\r\n },\r\n});\r\n/**\r\n * Create an image URL for ImageProcessor\r\n * @param image The image model\r\n * @param imageParams The image parameters\r\n * @returns The image URL\r\n */\r\nexport function imageUrl(image, imageParams) {\r\n if (!image?.src) {\r\n return '';\r\n }\r\n if (image.src.startsWith('http')) {\r\n return image.src;\r\n }\r\n let clImage = cl.image(image.src);\r\n const resizeAction = getResizeAction(image, imageParams);\r\n if (resizeAction) {\r\n clImage = clImage.resize(resizeAction);\r\n }\r\n clImage = clImage.delivery(getFormatAction(imageParams)).delivery(quality(autoQuality()));\r\n if (imageParams.dpr) {\r\n clImage = clImage.delivery(dpr(imageParams.dpr));\r\n }\r\n // Set version to enable mass invalidation.\r\n // clImage.setVersion(process.env.CLOUDINARY_VERSION ?? '1');\r\n return clImage.toURL();\r\n}\r\nfunction getResizeAction(image, imageParams) {\r\n if (!imageParams.width && !imageParams.height) {\r\n return undefined;\r\n }\r\n let resizeAction;\r\n switch (imageParams.crop) {\r\n case 'crop':\r\n resizeAction = crop();\r\n break;\r\n case 'fill':\r\n resizeAction = fill();\r\n break;\r\n case 'lfill':\r\n resizeAction = limitFill();\r\n break;\r\n case 'pad':\r\n resizeAction = pad();\r\n break;\r\n case 'thumb':\r\n resizeAction = thumbnail();\r\n break;\r\n default:\r\n resizeAction = fill();\r\n break;\r\n }\r\n if (imageParams.width) {\r\n resizeAction = resizeAction.width(imageParams.width);\r\n }\r\n else if (imageParams.widthratio && imageParams.crop !== 'pad') {\r\n resizeAction = resizeAction.aspectRatio(imageParams.widthratio);\r\n }\r\n if (imageParams.height) {\r\n resizeAction = resizeAction.height(imageParams.height);\r\n }\r\n else if (imageParams.heightratio && imageParams.crop !== 'pad') {\r\n resizeAction = resizeAction.aspectRatio(imageParams.heightratio);\r\n }\r\n if (imageParams.gravity === 'face') {\r\n resizeAction = resizeAction.gravity(focusOn(face()));\r\n }\r\n else if (imageParams.crop !== 'pad') {\r\n resizeAction = resizeAction.gravity(autoGravity());\r\n }\r\n // Zoom can only be applied when using crop or thumb mode.\r\n if ((imageParams.crop === 'crop' || imageParams.crop === 'thumb') && imageParams.zoom) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n resizeAction = resizeAction.zoom(imageParams.zoom);\r\n }\r\n return resizeAction;\r\n}\r\nfunction getFormatAction(imageParams) {\r\n let formatAction;\r\n if (imageParams.format) {\r\n formatAction = format(imageParams.format);\r\n }\r\n else {\r\n formatAction = format(autoFormat());\r\n }\r\n return formatAction;\r\n}\r\nexport function getSrcs(image, upper, lower, steps, ratio, otherParams = {}) {\r\n const sizes = getRange(upper, lower, steps);\r\n return sizes.map((size) => `${imageUrl(image, { width: size, heightratio: ratio, ...otherParams })} ${size}w`);\r\n}\r\nexport function getRetinaSrcs(image, width, ratio, otherParams = {}) {\r\n const dprs = [1, 1.5, 2, 2.5, 3];\r\n return dprs.map((dpr) => `${imageUrl(image, { width: width, heightratio: ratio, dpr, ...otherParams })} ${dpr}x`);\r\n}\r\nfunction getRange(upper, lower, steps) {\r\n const difference = upper - lower;\r\n const increment = difference / (steps - 1);\r\n return [\r\n lower,\r\n ...Array(steps - 2)\r\n .fill('')\r\n .map((_, index) => Math.ceil(lower + increment * (index + 1))),\r\n upper,\r\n ];\r\n}\r\n/**\r\n * Create an pdf URL\r\n * @param url The pdf url\r\n * @returns The pdf URL\r\n */\r\nexport function pdfUrl(url) {\r\n if (!url) {\r\n return '';\r\n }\r\n const clImage = cl.image(url);\r\n return clImage.toURL();\r\n}\r\n/**\r\n * Re-usable styles for image container where the\r\n * image needs to maintain it's aspect ratio\r\n *\r\n * @param width\r\n * @param height\r\n * @returns\r\n */\r\nexport function imageWrapperPreserveRatio(width, height) {\r\n if (!width && !height) {\r\n return null;\r\n }\r\n return css `\r\n position: relative;\r\n overflow: hidden;\r\n overflow: clip;\r\n width: 100%;\r\n aspect-ratio: ${width / height};\r\n `;\r\n}\r\n/**\r\n * Calculates the percentage bottom padding\r\n * required to maintain a certain ratio.\r\n *\r\n * To be used in cases where the image ratio\r\n * changes based on viewport.\r\n *\r\n * @param width\r\n * @param height\r\n * @returns padding-bottom: {ratioPercentage}%\r\n */\r\nexport function imageWrapperRatioPadding(width, height) {\r\n if (!width && !height) {\r\n return '';\r\n }\r\n const ratioPercentage = ((height / width) * 100).toFixed(2);\r\n return `padding-bottom: ${ratioPercentage}%`;\r\n}\r\n/**\r\n * Re-usable styles for an image placed within\r\n * a container maintaining aspect ratio\r\n */\r\nexport const imageCoverContainer = (relative) => css `\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n object-position: center;\r\n ${!relative && 'position: absolute; top: 0;left: 0;'}\r\n`;\r\n","export function sleep(ms) {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\nexport const highlightTitleWords = (title) => title.replaceAll(/\\*([\\w\\W]+)\\*/g, '$1');\r\n/**\r\n * Rule structure for react-hook-form\r\n */\r\nexport const EMAIL_RULE = {\r\n message: `Please enter a valid email address`,\r\n value: /^[\\w\\-_.\\d*]+@[\\w\\-\\d.]+(\\.\\w*)$/,\r\n};\r\n/**\r\n * Rule structure for react-hook-form\r\n */\r\nexport const PHONE_NUMBER_RULE = {\r\n message: `Please enter a valid phone number`,\r\n value: /^[\\d+()\\-x ]+$/,\r\n};\r\n/**\r\n * Rule structure for react-hook-form\r\n */\r\nexport const NAME_RULE = {\r\n message: `Please enter a valid name`,\r\n value: /^[A-Za-z\\u00C0-\\u1EFF'\\-,.]{2,}$/,\r\n};\r\n/**\r\n * (?=.*[a-z]) = Check for lowercase letter\r\n * (?=.*[A-Z]) = Check for uppercase letter\r\n * (?=.*[^\\da-zA-Z]) = Check for non-digit and non-letter (^ negates the [] section)\r\n * .{8,} = Make sure it is at least 8 characters, no maximum\r\n */\r\nexport const PASSWORD_RULE_REGEX = /^(?=.*[A-Z])(?=.*[\\W])(?=.*[a-z])(?=.*[^\\da-zA-Z]).{8,}$/;\r\n/**\r\n * Rule structure for react-hook-form\r\n */\r\nexport const PASSWORD_RULE = {\r\n message: `Please enter a valid password`,\r\n value: PASSWORD_RULE_REGEX,\r\n};\r\n/**\r\n * Set of rules to keep the wording consistant throughout the site.\r\n */\r\nexport const PASSWORD_RULES = [\r\n 'At least 8 characters long',\r\n 'At least one Uppercase letter A-Z',\r\n 'At least one Lowercase letter a-z',\r\n 'At least one special character (~!@#$%^&*_-+=`|(){}[]:;”’<>,.?/)',\r\n];\r\n/**\r\n * Rule structure for react-hook-form\r\n * Pattern based on https://andrewwburns.com/2018/04/10/uk-postcode-validation-regex/, but allows both lower and uppercase\r\n */\r\nexport const POSTCODE_RULE = {\r\n message: `Please enter a valid postcode`,\r\n value: /^(([A-Za-z][0-9]{1,2})|(([A-Za-z][A-HJ-Ya-hj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-HJ-Ya-hj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2}$/,\r\n};\r\n/**\r\n * Rule structure for react-hook-form\r\n * Pattern based on https://regexr.com/39nr7\r\n */\r\nexport const URL_RULE = {\r\n message: `Please enter a valid URL`,\r\n value: /[(http(s)?)://(www.)?a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_+.~#?&//=]*)$/,\r\n};\r\n/** Clamp index to be within the min/max index range. */\r\nexport function clamp(value, max) {\r\n return Math.max(Math.min(value, max), 0);\r\n}\r\n/** Ensure input value isn't just whitespace */\r\nexport const validateNotWhitespaceOnly = (value) => typeof value === 'string'\r\n ? value.trim().length > 0 || 'Inputted value cannot just be spaces'\r\n : true;\r\nexport function youTubeIdParser(url) {\r\n const regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&?]*).*/;\r\n const match = url.match(regExp);\r\n return match && match[7].length == 11 ? match[7] : '';\r\n}\r\nexport async function checkYoutubeImageExists(imageSrc) {\r\n const res = await fetch(imageSrc);\r\n if (!res.ok) {\r\n console.log('failed');\r\n }\r\n else {\r\n console.log('success');\r\n }\r\n return Promise.resolve();\r\n}\r\nexport function linkAria(linkText, linkTarget, string) {\r\n if (linkTarget !== '_blank') {\r\n return linkText;\r\n }\r\n return `(${string ?? 'Opens in a new tab'}) ${linkText}`;\r\n}\r\n","import { domMax, LazyMotion } from 'framer-motion';\r\nimport React from 'react';\r\nexport function withMotionMax(WrappedComponent) {\r\n const displayName = WrappedComponent.displayName || WrappedComponent.name || 'Component';\r\n const ComponentWithMotionMax = (props) => {\r\n return (React.createElement(LazyMotion, { features: domMax, strict: true },\r\n React.createElement(WrappedComponent, { ...props })));\r\n };\r\n ComponentWithMotionMax.displayName = `withMotionMax(${displayName})`;\r\n return ComponentWithMotionMax;\r\n}\r\n","import debounce from 'lodash/debounce';\r\nimport * as React from 'react';\r\nexport function useResize(params) {\r\n const refWindowHeight = React.useRef();\r\n const refWindowWidth = React.useRef();\r\n const onResize = React.useCallback(debounce(() => {\r\n const prevHeight = refWindowHeight.current;\r\n const prevWidth = refWindowWidth.current;\r\n const newHeight = window.innerHeight;\r\n const newWidth = window.innerWidth;\r\n const shouldTrigger = params.on === 'both' ||\r\n (params.on === 'y' && prevHeight !== newHeight) ||\r\n (params.on === 'x' && prevWidth !== newWidth);\r\n if (shouldTrigger) {\r\n params.callback();\r\n }\r\n refWindowHeight.current = newHeight;\r\n refWindowWidth.current = newWidth;\r\n }, params.debounce), [params.debounce, params.on]);\r\n React.useEffect(() => {\r\n if (!params.callback) {\r\n return;\r\n }\r\n if (params.immediate) {\r\n onResize();\r\n }\r\n window.addEventListener('resize', onResize);\r\n return () => {\r\n window.removeEventListener('resize', onResize);\r\n };\r\n }, [params.on]);\r\n}\r\n","import { useCarousel } from '@hooks/useCarousel';\r\nimport noop from 'lodash/noop';\r\nimport * as React from 'react';\r\nconst CarouselContext = React.createContext({\r\n activeIndex: 0,\r\n goToIndex: noop,\r\n goToNext: noop,\r\n goToPrev: noop,\r\n reinitialise: noop,\r\n maxIndex: 0,\r\n offset: 0,\r\n offsets: [],\r\n recalculate: noop,\r\n refContainer: null,\r\n refTrack: null,\r\n count: 0,\r\n paddingOffset: 0,\r\n});\r\nexport const useCarouselContext = () => React.useContext(CarouselContext);\r\nconst CarouselProvider = ({ children, ...otherProps }) => {\r\n const carousel = useCarousel(otherProps);\r\n React.useEffect(() => {\r\n if (carousel.paddingOffset !== otherProps.paddingOffset ||\r\n carousel.count !== otherProps.count) {\r\n carousel.reinitialise(carousel.count, otherProps.paddingOffset);\r\n }\r\n }, [otherProps.paddingOffset]);\r\n return React.createElement(CarouselContext.Provider, { value: carousel }, children);\r\n};\r\nexport default CarouselProvider;\r\n","import { clamp as doClamp } from '@helpers/utils';\r\nimport * as React from 'react';\r\nimport { useResize } from './useResize';\r\nexport function useCarousel(params) {\r\n const refContainer = React.useRef(null);\r\n const refTrack = React.useRef(null);\r\n const [carouselState, dispatch] = React.useReducer(carouselReducer, {\r\n activeIndex: 0,\r\n maxIndex: 0,\r\n offsets: [],\r\n count: 0,\r\n paddingOffset: 0,\r\n });\r\n useResize({\r\n callback: initCarousel,\r\n debounce: 100,\r\n immediate: true,\r\n on: 'x',\r\n });\r\n React.useEffect(() => {\r\n initCarousel();\r\n }, [carouselState.count, carouselState.paddingOffset]);\r\n return {\r\n ...carouselState,\r\n goToIndex,\r\n goToNext,\r\n goToPrev,\r\n reinitialise,\r\n recalculate: initCarousel,\r\n offset: carouselState.offsets[carouselState.activeIndex],\r\n refContainer,\r\n refTrack,\r\n count: carouselState.count,\r\n paddingOffset: carouselState.paddingOffset,\r\n };\r\n /**\r\n * Calculate the px offset for the track for the target item index.\r\n * @param index\r\n * @returns\r\n */\r\n function calculateOffset(index) {\r\n if (!refTrack.current) {\r\n return 0;\r\n }\r\n const items = Array.from(refTrack.current.children);\r\n const itemsUntilIndex = items.slice(0, index);\r\n const sum = itemsUntilIndex\r\n .map((el) => el.getBoundingClientRect().width)\r\n .reduce((p, c) => p + c, 0);\r\n return sum;\r\n }\r\n /**\r\n * Initialise the reducer state.\r\n */\r\n function initCarousel() {\r\n const offsets = [];\r\n // Pre-calculate the px offset for each item in the carousel.\r\n Array.from(Array(params.count)).forEach((_, index) => {\r\n offsets.push(calculateOffset(index));\r\n });\r\n // Determine what the max index value needs to be in order for the last item to be within view.\r\n const containerWidth = (refContainer.current?.getBoundingClientRect().width ?? 0) - (params.paddingOffset ?? 0);\r\n const trackWidth = offsets[offsets.length - 1];\r\n let maxIndex = 0;\r\n for (let index = 0; index < offsets.length; index++) {\r\n const offset = offsets[index];\r\n const remainder = trackWidth - offset;\r\n /**\r\n * If the remainder is less than the container width, then the last item is within view.\r\n * Floor the values to avoid any partial pixels causing issues\r\n */\r\n if (Math.floor(remainder) < Math.floor(containerWidth)) {\r\n maxIndex = index;\r\n break;\r\n }\r\n }\r\n // Remove peeking amount from end of carousel\r\n offsets[maxIndex] = offsets[maxIndex] - params.paddingOffset ?? 0;\r\n // Initialise the carousel state.\r\n dispatch({\r\n type: 'init',\r\n payload: { offsets, maxIndex, count: params.count, paddingOffset: params.paddingOffset },\r\n });\r\n }\r\n /**\r\n * Go to the next item.\r\n */\r\n function goToNext(wrap) {\r\n dispatch({ type: 'next', payload: { wrap: wrap ?? false } });\r\n }\r\n /**\r\n * Go to the previous item.\r\n */\r\n function goToPrev(wrap) {\r\n dispatch({ type: 'prev', payload: { wrap: wrap ?? false } });\r\n }\r\n /**\r\n * Go to the target index.\r\n */\r\n function goToIndex(index) {\r\n dispatch({ type: 'goto', payload: index });\r\n }\r\n /**\r\n * Go to the target index.\r\n */\r\n function reinitialise(count, paddingOffset) {\r\n dispatch({ type: 'reinitialise', payload: { count, paddingOffset } });\r\n }\r\n function carouselReducer(state, action) {\r\n switch (action.type) {\r\n case 'init':\r\n return {\r\n activeIndex: 0,\r\n maxIndex: action.payload.maxIndex,\r\n offsets: action.payload.offsets,\r\n count: action.payload.count,\r\n paddingOffset: action.payload.paddingOffset,\r\n };\r\n case 'reinitialise':\r\n return {\r\n ...state,\r\n count: action.payload.count,\r\n paddingOffset: action.payload.paddingOffset,\r\n };\r\n case 'goto':\r\n return { ...state, activeIndex: clamp(action.payload) };\r\n case 'next':\r\n if (action.payload.wrap && state.activeIndex === state.maxIndex) {\r\n return { ...state, activeIndex: 0 };\r\n }\r\n return { ...state, activeIndex: clamp(state.activeIndex + 1) };\r\n case 'prev':\r\n if (action.payload.wrap && state.activeIndex === 0) {\r\n return { ...state, activeIndex: state.maxIndex };\r\n }\r\n return { ...state, activeIndex: clamp(state.activeIndex - 1) };\r\n }\r\n /** Clamp index to be within the min/max index range. */\r\n function clamp(value) {\r\n return doClamp(value, state.maxIndex);\r\n }\r\n }\r\n}\r\n","import { m } from 'framer-motion';\r\nimport styled from 'styled-components';\r\nconst Container = styled.div ``;\r\nconst Track = styled(m.ul) `\r\n display: flex;\r\n`;\r\nconst MotionTrackStyles = {\r\n Container,\r\n Track,\r\n};\r\nexport default MotionTrackStyles;\r\n","import { useAnimation } from 'framer-motion';\r\nimport * as React from 'react';\r\nimport { useCarouselContext } from '../CarouselProvider/CarouselProvider';\r\nimport S from './MotionTrack.styles';\r\nconst MotionTrack = ({ children, enableCarousel = true, trackMutations = false, ...otherProps }) => {\r\n const animation = useAnimation();\r\n const carousel = useCarouselContext();\r\n const dragging = React.useRef(false);\r\n const xTransform = React.useRef(0);\r\n const maxOffset = carousel.offsets[carousel.maxIndex];\r\n React.useEffect(() => {\r\n const element = carousel.refTrack?.current;\r\n if (!trackMutations || !element) {\r\n return;\r\n }\r\n const observer = new MutationObserver(() => {\r\n carousel.reinitialise(element.childElementCount ?? 0, carousel.paddingOffset);\r\n });\r\n observer.observe(element, { childList: true, subtree: true });\r\n return () => {\r\n if (observer) {\r\n observer.disconnect();\r\n }\r\n };\r\n }, [carousel, trackMutations]);\r\n // Stop the drag momentum animation, and start a new animation to the correct offset.\r\n React.useEffect(() => {\r\n if (typeof carousel.offset !== 'undefined') {\r\n animation.stop();\r\n animation.start({ x: -carousel.offset });\r\n }\r\n }, [animation, carousel.activeIndex, carousel.offset]);\r\n return (React.createElement(S.Container, { ...otherProps, ref: carousel.refContainer },\r\n React.createElement(S.Track, { ref: carousel.refTrack, animate: animation, drag: enableCarousel ? 'x' : false, dragConstraints: { left: -maxOffset, right: 0 }, onClickCapture: (event) => {\r\n // Ignore click events after dragging, this prevents links being clicked when drag ends.\r\n if (dragging.current) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n dragging.current = false;\r\n }\r\n }, onDragStart: () => {\r\n dragging.current = true;\r\n }, onDragEnd: (_, info) => {\r\n // Get the absolute x value, avoiding overflow when dragging left.\r\n const absX = Math.abs(Math.min(xTransform.current, 0));\r\n // Determine the next target index.\r\n let targetIndex = carousel.offsets.findIndex((offset) => offset > absX) ?? 0;\r\n // If it is -1 then we scrolled past the max offset value.\r\n if (targetIndex === -1) {\r\n targetIndex = carousel.maxIndex;\r\n }\r\n // Ensure we take into account the drag direction.\r\n if (info.offset.x > 0) {\r\n targetIndex = Math.max(0, targetIndex - 1);\r\n }\r\n // Update the carousel state.\r\n carousel.goToIndex(targetIndex);\r\n }, onUpdate: (latest) => {\r\n // Store the current x position as the carousel is dragged.\r\n xTransform.current = typeof latest.x === 'number' ? latest.x : parseFloat(latest.x);\r\n } }, children)));\r\n};\r\nexport default MotionTrack;\r\n","import * as React from 'react';\r\nconst Image = React.forwardRef(({ alt = '', ...props }, ref) => {\r\n return React.createElement(\"img\", { ref: ref, alt: alt, role: alt ? undefined : 'presentation', ...props });\r\n});\r\nImage.displayName = 'Image';\r\nexport default Image;\r\n"],"names":["_path","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","props","xmlns","viewBox","d","fill","ButtonReset","css","SiteWidth","SiteWidthBreakpoint","SitePaddingMax","SiteWidthNarrow","siteWide","baseGrid","cl","Cloudinary","cloud","cloudName","url","secure","imageUrl","image","imageParams","src","startsWith","clImage","resizeAction","width","height","crop","limitFill","pad","thumbnail","widthratio","aspectRatio","heightratio","gravity","focusOn","face","autoGravity","zoom","getResizeAction","resize","delivery","formatAction","format","autoFormat","getFormatAction","quality","autoQuality","dpr","toURL","getSrcs","upper","lower","steps","ratio","otherParams","sizes","getRange","map","size","getRetinaSrcs","dprs","increment","Array","_","index","Math","ceil","pdfUrl","imageWrapperPreserveRatio","imageWrapperRatioPadding","toFixed","imageCoverContainer","relative","sleep","ms","Promise","resolve","setTimeout","highlightTitleWords","title","replaceAll","EMAIL_RULE","message","value","PHONE_NUMBER_RULE","NAME_RULE","PASSWORD_RULE","PASSWORD_RULES","POSTCODE_RULE","URL_RULE","clamp","max","min","validateNotWhitespaceOnly","trim","youTubeIdParser","match","linkAria","linkText","linkTarget","string","withMotionMax","WrappedComponent","displayName","name","ComponentWithMotionMax","React","LazyMotion","features","domMax","strict","useResize","params","refWindowHeight","refWindowWidth","onResize","debounce","prevHeight","current","prevWidth","newHeight","window","innerHeight","newWidth","innerWidth","on","callback","immediate","addEventListener","removeEventListener","CarouselContext","activeIndex","goToIndex","noop","goToNext","goToPrev","reinitialise","maxIndex","offset","offsets","recalculate","refContainer","refTrack","count","paddingOffset","useCarouselContext","children","otherProps","carousel","carouselState","dispatch","state","action","type","payload","wrap","doClamp","initCarousel","from","forEach","push","slice","el","getBoundingClientRect","reduce","p","c","calculateOffset","containerWidth","trackWidth","remainder","floor","useCarousel","Provider","Container","styled","Track","m","enableCarousel","trackMutations","animation","useAnimation","dragging","xTransform","maxOffset","element","observer","MutationObserver","childElementCount","observe","childList","subtree","disconnect","stop","start","x","S","ref","animate","drag","dragConstraints","left","right","onClickCapture","event","preventDefault","stopPropagation","onDragStart","onDragEnd","info","absX","abs","targetIndex","findIndex","onUpdate","latest","parseFloat","Image","alt","role","undefined"],"sourceRoot":""}