{"version":3,"sources":["webpack:///./src/stories/Widgets/Headers/SiteHeader/components/SearchField/SearchField.styles.ts","webpack:///./src/helpers/fluid.ts","webpack:///./src/img/icons/search-close.svg","webpack:///./src/img/icons/search-button.svg","webpack:///./src/stories/Widgets/Headers/SiteHeader/components/SearchField/SearchField.tsx","webpack:///./src/hooks/useFocusWithin.ts","webpack:///./src/stories/Components/Containers/SiteWide/SiteWide.styles.ts","webpack:///./src/helpers/imageUrl.ts"],"names":["Container","styled","div","until","Device","DesktopSmall","active","css","from","showResults","Inner","Input","input","fonts","DaxPro","Regular","Submit","button","attrs","type","ButtonReset","ThemeSwitch","groundforceColour","groundforceColourHover","SubmitLabel","span","srOnly","SubmitIcon","SvgSearch","Close","CloseIcon","SvgSearchClose","CloseLabel","ResultsContainer","ResultItem","a","ResultItemText","Bold","DEFAULT_MIN_VALUE","TabletSmall","DEFAULT_MAX_VALUE","ActualDesktop","fluid","min","max","minWidth","maxWidth","minRem","maxRem","minWidthRem","maxWidthRem","slope","yAxisIntersection","clampMin","round","clampVal","clampMax","num","Math","_g","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","props","xmlns","viewBox","fill","stroke","strokeLinecap","strokeWidth","d","_path","SvgSearchButton","cx","cy","r","SearchField","searchResultsUrl","showSearchMobile","placeholderText","searchText","closeText","visibleCount","onClose","typeAheadPath","isTraining","React","searchTerm","setSearchTerm","items","data","setData","abortController","window","AbortController","undefined","fetchApi","signal","then","abort","useApi","refContainer","refResultsContainer","refInput","ref","focusWithin","setFocusWithin","current","addEventListener","onFocusChange","onBlur","removeEventListener","document","activeElement","isActive","contains","event","relatedTarget","useFocusWithin","useLockBodyScroll","focus","S","onKeyDown","toLowerCase","preventDefault","nextResult","nextElementSibling","firstResult","firstChild","handleArrowDown","previousResult","previousElementSibling","handleArrowUp","handleEscape","handleRedirect","placeholder","value","autoComplete","onChange","onClick","e","slice","map","item","url","href","tabIndex","startIndex","indexOf","phrase","substring","replacedText","replace","RegExp","dangerouslySetInnerHTML","__html","getItemText","location","fetch","res","ok","json","SITE_WIDTH","SITE_PADDING_MOBILE","SITE_PADDING","containerStyles","TabletLarge","imageUrl","publicId","params","transformation","width","height","aspectRatio","dpr","crop","gravity","format","createTransformation","encodedPublicId","encodeURIComponent"],"mappings":"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","file":"default~SearchHeroBanner~SiteHeader-16a0da192ef0e90cc7e2.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { fonts } from '@helpers/fonts';\r\nimport { ButtonReset } from '@helpers/global';\r\nimport { Device, from, until } from '@helpers/media';\r\nimport srOnly from '@helpers/srOnly';\r\nimport { ThemeSwitch } from '@helpers/theme';\r\nimport { ReactComponent as SvgSearch } from '@img/icons/search-button.svg';\r\nimport { ReactComponent as SvgSearchClose } from '@img/icons/search-close.svg';\r\nimport styled, { css } from 'styled-components';\r\nconst Container = styled.div `\r\n @media ${until(Device.DesktopSmall)} {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n display: none;\r\n align-items: center;\r\n background: #fff;\r\n height: 65px;\r\n padding: 0px 10px;\r\n width: 100%;\r\n /* High because the owl-carousel buttons have 8000... */\r\n z-index: 8001;\r\n\r\n ${({ active }) => active &&\r\n css `\r\n display: flex;\r\n `}\r\n }\r\n\r\n @media ${from(Device.DesktopSmall)} {\r\n position: relative;\r\n /* High because the owl-carousel buttons have 8000... */\r\n z-index: 8001;\r\n\r\n ${({ showResults }) => showResults &&\r\n css `\r\n &::after {\r\n content: '';\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n background: rgba(0, 0, 0, 0.4);\r\n height: 100%;\r\n width: 100%;\r\n z-index: 1;\r\n }\r\n `}\r\n }\r\n`;\r\nconst Inner = styled.div `\r\n display: flex;\r\n width: 100%;\r\n\r\n @media ${from(Device.DesktopSmall)} {\r\n position: relative;\r\n z-index: 2;\r\n }\r\n`;\r\nconst Input = styled.input `\r\n display: block;\r\n flex: 1 1 auto;\r\n background: #fff;\r\n border: 1px solid #b9b9b9;\r\n border-right: 0;\r\n border-radius: 0;\r\n color: #575757;\r\n ${fonts.DaxPro.Regular};\r\n font-size: 16px;\r\n height: 45px;\r\n line-height: 20px;\r\n outline: none;\r\n padding: 12px 14px;\r\n transition: border-color 0.15s ease-out;\r\n\r\n &:focus {\r\n border-color: #000;\r\n outline: none;\r\n }\r\n`;\r\nconst Submit = styled.button.attrs({ type: 'button' }) `\r\n ${ButtonReset};\r\n display: flex;\r\n align-content: center;\r\n align-items: center;\r\n ${ThemeSwitch({ groundforceColour: '#6f9d20', groundforceColourHover: '#a2b952' })}\r\n background: var(--theme);\r\n color: #fff;\r\n flex: 0 0 45px;\r\n height: 45px;\r\n padding: 10px;\r\n justify-content: center;\r\n justify-items: center;\r\n transition: background-color 0.15s ease-out, color 0.15s ease-out;\r\n width: 45px;\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n\r\n &:focus,\r\n &:hover {\r\n color: #fff;\r\n background: var(--theme-hover);\r\n }\r\n`;\r\nconst SubmitLabel = styled.span `\r\n ${srOnly}\r\n`;\r\nconst SubmitIcon = styled(SvgSearch) `\r\n display: block;\r\n color: currentColor;\r\n height: 27px;\r\n width: 27px;\r\n`;\r\nconst Close = styled.button.attrs({ type: 'button' }) `\r\n display: flex;\r\n align-content: center;\r\n align-items: center;\r\n background: none;\r\n color: #333333;\r\n flex: 0 0 45px;\r\n height: 45px;\r\n margin: 0 0 0 16px;\r\n padding: 0;\r\n justify-content: center;\r\n justify-items: center;\r\n width: 45px;\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n\r\n &:focus,\r\n &:hover {\r\n background: none;\r\n color: #333333;\r\n }\r\n\r\n @media ${from(Device.DesktopSmall)} {\r\n display: none;\r\n }\r\n`;\r\nconst CloseIcon = styled(SvgSearchClose) `\r\n display: block;\r\n color: currentColor;\r\n height: 23px;\r\n width: 23px;\r\n`;\r\nconst CloseLabel = styled.span `\r\n ${srOnly}\r\n`;\r\nconst ResultsContainer = styled.div `\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n background: #fff;\r\n border: 1px solid #b9b9b9;\r\n max-height: 410px;\r\n width: 100%;\r\n z-index: 1;\r\n\r\n @media ${until(Device.DesktopSmall)} {\r\n height: calc(100vh - 65px);\r\n max-height: none;\r\n }\r\n`;\r\nconst ResultItem = styled.a `\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n color: #333333;\r\n height: 45px;\r\n ${fonts.DaxPro.Regular};\r\n font-size: 16px;\r\n line-height: 28px;\r\n overflow: hidden;\r\n padding: 0 10px;\r\n text-decoration: none;\r\n text-indent: 4px;\r\n white-space: nowrap;\r\n\r\n &:focus,\r\n &:hover {\r\n color: #333333;\r\n text-decoration: underline;\r\n\r\n ${() => ResultItemText} {\r\n transform: translate3d(10px, 0, 0.1px);\r\n }\r\n }\r\n\r\n &::after {\r\n content: '';\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n display: block;\r\n border-bottom: 1px solid #dcdcdc;\r\n margin: 0 10px;\r\n width: calc(100% - 20px);\r\n }\r\n\r\n &:last-child::after {\r\n content: none;\r\n }\r\n`;\r\nconst ResultItemText = styled.span `\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n transform: translate3d(0, 0, 0.1px);\r\n transition: transform ease-out 0.15s;\r\n\r\n em {\r\n font-style: normal;\r\n ${fonts.DaxPro.Bold};\r\n }\r\n`;\r\nexport default {\r\n Close,\r\n CloseIcon,\r\n CloseLabel,\r\n Container,\r\n Inner,\r\n Input,\r\n ResultItem,\r\n ResultItemText,\r\n ResultsContainer,\r\n Submit,\r\n SubmitIcon,\r\n SubmitLabel,\r\n};\r\n","import { Device } from './media';\r\n/**\r\n * Base pixel value for the \"rem\" unit.\r\n */\r\nexport const PIXELS_PER_REM = 16;\r\n/**\r\n * Default pixel value for the min width.\r\n */\r\nexport const DEFAULT_MIN_VALUE = Device.TabletSmall;\r\n/**\r\n * Default pixel value for the max width.\r\n */\r\nexport const DEFAULT_MAX_VALUE = Device.ActualDesktop;\r\n/**\r\n * Define a fluid value between the min/max values at the min/max widths.\r\n */\r\nexport function fluid(min, max, minWidth = DEFAULT_MIN_VALUE, maxWidth = DEFAULT_MAX_VALUE) {\r\n const minRem = min / PIXELS_PER_REM;\r\n const maxRem = max / PIXELS_PER_REM;\r\n const minWidthRem = minWidth / PIXELS_PER_REM;\r\n const maxWidthRem = maxWidth / PIXELS_PER_REM;\r\n const slope = (maxRem - minRem) / (maxWidthRem - minWidthRem);\r\n const yAxisIntersection = -minWidthRem * slope + minRem;\r\n const clampMin = `${round(minRem)}rem`;\r\n const clampVal = `${round(yAxisIntersection)}rem + ${round(slope * 100)}vw`;\r\n const clampMax = `${round(maxRem)}rem`;\r\n return `clamp(${clampMin}, ${clampVal}, ${clampMax})`;\r\n}\r\n/**\r\n * Define a fluid value between the min/max values at the min/max widths.\r\n */\r\nexport function fluidUnit(min, max, minWidth = DEFAULT_MIN_VALUE, maxWidth = DEFAULT_MAX_VALUE, unit) {\r\n const slope = (max - min) / (maxWidth - minWidth);\r\n const yAxisIntersection = -minWidth * slope + min;\r\n const clampMin = `${round(min)}`;\r\n const clampVal = `${round(yAxisIntersection)}${unit} + ${round(slope * 100)}vw`;\r\n const clampMax = `${round(max)}`;\r\n return `clamp(${clampMin}${unit}, ${clampVal}, ${clampMax}${unit})`;\r\n}\r\n/**\r\n * Round to nearest hundredth.\r\n */\r\nfunction round(num) {\r\n return Math.round(num * 100) / 100;\r\n}\r\n","var _g;\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 SvgSearchClose(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 25.828 25.828\"\n }, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: 2\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1.414 1.414l23 23M24.414 1.414l-23 23\"\n }))));\n}\n\nexport default __webpack_public_path__ + \"4d89a35673413686a976c2faa0f6c93d.svg\";\nexport { SvgSearchClose as ReactComponent };","var _g, _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 SvgSearchButton(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 27.333 27.333\"\n }, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2\n }, /*#__PURE__*/React.createElement(\"circle\", {\n cx: 10.913,\n cy: 10.913,\n r: 10.913,\n stroke: \"none\"\n }), /*#__PURE__*/React.createElement(\"circle\", {\n cx: 10.913,\n cy: 10.913,\n r: 9.913\n }))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: 2,\n d: \"M18.643 18.643l7.275 7.275\"\n })));\n}\n\nexport default __webpack_public_path__ + \"59b9461c6c7c0d10ca810c3df0f2971c.svg\";\nexport { SvgSearchButton as ReactComponent };","import useFocusWithin from '@hooks/useFocusWithin';\r\nimport * as React from 'react';\r\nimport { useLockBodyScroll } from 'react-use';\r\nimport S from './SearchField.styles';\r\nconst SearchField = ({ searchResultsUrl, showSearchMobile, placeholderText, searchText, closeText, visibleCount = 9, onClose, typeAheadPath, isTraining = false, }) => {\r\n const [searchTerm, setSearchTerm] = React.useState('');\r\n const items = useApi(searchTerm, typeAheadPath, isTraining);\r\n const refContainer = React.useRef(null);\r\n const refResultsContainer = React.useRef(null);\r\n const refInput = React.useRef(null);\r\n const showResults = useFocusWithin(refContainer);\r\n useLockBodyScroll(showResults && !!items.length);\r\n React.useEffect(() => {\r\n if (showSearchMobile) {\r\n refInput.current?.focus();\r\n }\r\n }, [showSearchMobile]);\r\n const getItemText = (item) => {\r\n // Get the word start\r\n const startIndex = item.value.toLowerCase().indexOf(searchTerm.toLowerCase());\r\n // Return original if we can't find it\r\n if (startIndex < 0) {\r\n return item.value;\r\n }\r\n // Get the phrase out of the word so it keeps its original casing\r\n const phrase = item.value.substring(startIndex, startIndex + searchTerm.length);\r\n // Replace the phrase in the original word and wrap it in a span so we can style it\r\n const replacedText = item.value.replace(new RegExp(phrase, 'g'), `${phrase}`);\r\n return React.createElement(S.ResultItemText, { dangerouslySetInnerHTML: { __html: replacedText } });\r\n };\r\n return (React.createElement(S.Container, { ref: refContainer, active: showSearchMobile, showResults: showResults && !!items.length, onKeyDown: (event) => {\r\n if (event.key.toLowerCase() === 'arrowdown') {\r\n handleArrowDown(event);\r\n }\r\n if (event.key.toLowerCase() === 'arrowup') {\r\n handleArrowUp(event);\r\n }\r\n if (event.key.toLowerCase() === 'escape') {\r\n handleEscape(event);\r\n }\r\n if (event.key.toLowerCase() === 'enter') {\r\n handleRedirect(event, isTraining);\r\n }\r\n } },\r\n React.createElement(S.Inner, null,\r\n React.createElement(S.Input, { ref: refInput, placeholder: placeholderText, type: \"search\", value: searchTerm, autoComplete: \"off\", onChange: (event) => {\r\n setSearchTerm(event.target.value);\r\n } }),\r\n React.createElement(S.Submit, { onClick: (e) => handleRedirect(e, isTraining), \"aria-label\": \"Search\" },\r\n React.createElement(S.SubmitLabel, null, searchText),\r\n React.createElement(S.SubmitIcon, null)),\r\n onClose && (React.createElement(S.Close, { type: \"button\", onClick: (event) => {\r\n event.preventDefault();\r\n onClose();\r\n } },\r\n React.createElement(S.CloseLabel, null, closeText),\r\n React.createElement(S.CloseIcon, null))),\r\n showResults && !!items.length && (React.createElement(S.ResultsContainer, { ref: refResultsContainer }, items.slice(0, visibleCount).map((item) => (React.createElement(S.ResultItem, { key: item.url, href: item.url, tabIndex: -1 }, getItemText(item)))))))));\r\n function handleRedirect(event, isTraining) {\r\n event.preventDefault();\r\n if (!searchTerm || searchTerm.length === 0 || searchResultsUrl === null) {\r\n return;\r\n }\r\n window.location.href = `${searchResultsUrl}?searchtext=${searchTerm}${isTraining ? `&isTraining=${isTraining}` : ''}`;\r\n }\r\n function handleArrowDown(event) {\r\n event.preventDefault();\r\n if (showResults) {\r\n const resultSelected = refResultsContainer.current?.contains(document.activeElement);\r\n if (resultSelected) {\r\n const nextResult = document.activeElement?.nextElementSibling;\r\n if (nextResult) {\r\n nextResult.focus();\r\n }\r\n }\r\n else {\r\n const firstResult = refResultsContainer.current?.firstChild;\r\n if (firstResult) {\r\n firstResult.focus();\r\n }\r\n }\r\n }\r\n }\r\n function handleArrowUp(event) {\r\n event.preventDefault();\r\n if (showResults) {\r\n const resultSelected = refResultsContainer.current?.contains(document.activeElement);\r\n if (resultSelected) {\r\n const previousResult = document.activeElement?.previousElementSibling;\r\n if (previousResult) {\r\n previousResult.focus();\r\n }\r\n }\r\n }\r\n }\r\n function handleEscape(event) {\r\n event.preventDefault();\r\n if (showResults) {\r\n const resultSelected = refResultsContainer.current?.contains(document.activeElement);\r\n if (resultSelected) {\r\n refInput.current?.focus();\r\n }\r\n }\r\n }\r\n};\r\nexport default SearchField;\r\n/** Use typeahead results for search term. */\r\nfunction useApi(searchTerm, typeAheadPath, isTraining) {\r\n const [data, setData] = React.useState([]);\r\n React.useEffect(() => {\r\n if (!searchTerm || searchTerm.length < 3) {\r\n return setData([]);\r\n }\r\n // Check for AbortController support (ie11).\r\n const abortController = window.AbortController ? new AbortController() : undefined;\r\n fetchApi(searchTerm, abortController?.signal, typeAheadPath, isTraining).then((data) => setData(data));\r\n return function cancel() {\r\n abortController?.abort();\r\n };\r\n }, [searchTerm]);\r\n return data;\r\n}\r\n/** Call typeahead API endpoint. */\r\nasync function fetchApi(searchTerm, signal, typeAheadPath, isTraining) {\r\n const res = await fetch(`/api/typeahead/getsearchitems?query=${searchTerm}${typeAheadPath ? `&path=${typeAheadPath}` : ''}${isTraining ? `&isTraining=${isTraining}` : ''}`, { signal });\r\n if (!res.ok) {\r\n return [];\r\n }\r\n const data = await res.json();\r\n if (!data) {\r\n return [];\r\n }\r\n return data;\r\n}\r\n","import * as React from 'react';\r\nexport default function useFocusWithin(ref) {\r\n const [focusWithin, setFocusWithin] = React.useState(false);\r\n // Ensure typeahead results show when focus within container.\r\n React.useEffect(() => {\r\n ref.current?.addEventListener('focus', onFocusChange, true);\r\n ref.current?.addEventListener('blur', onBlur, true);\r\n return () => {\r\n ref.current?.removeEventListener('focus', onFocusChange);\r\n ref.current?.removeEventListener('blur', onBlur);\r\n };\r\n }, []);\r\n return focusWithin;\r\n function onFocusChange() {\r\n if (!ref.current) {\r\n return setFocusWithin(false);\r\n }\r\n if (!document.activeElement) {\r\n return setFocusWithin(false);\r\n }\r\n const isActive = ref.current.contains(document.activeElement);\r\n return setFocusWithin(isActive);\r\n }\r\n function onBlur(event) {\r\n if (!ref.current) {\r\n return setFocusWithin(false);\r\n }\r\n if (!event.relatedTarget) {\r\n return setFocusWithin(false);\r\n }\r\n const isActive = ref.current.contains(event.relatedTarget);\r\n return setFocusWithin(isActive);\r\n }\r\n}\r\n","import { Device, until } from '@helpers/media';\r\nimport styled, { css } from 'styled-components';\r\nexport const SITE_WIDTH = 1638;\r\nexport const SITE_PADDING_MOBILE = 10;\r\nexport const SITE_PADDING = 20;\r\nconst containerStyles = css `\r\n margin-left: auto;\r\n margin-right: auto;\r\n max-width: calc(${SITE_WIDTH}px + (${SITE_PADDING}px * 2));\r\n padding-right: ${SITE_PADDING}px;\r\n padding-left: ${SITE_PADDING}px;\r\n\r\n @media ${until(Device.TabletLarge)} {\r\n max-width: none;\r\n padding-right: ${SITE_PADDING_MOBILE}px;\r\n padding-left: ${SITE_PADDING_MOBILE}px;\r\n }\r\n`;\r\nconst Container = styled.div `\r\n ${containerStyles}\r\n`;\r\nexport default {\r\n Container,\r\n containerStyles,\r\n};\r\n","const CLOUD_NAME = 'vp-groundforce';\r\nexport function imageUrl(publicId, params) {\r\n const transformation = createTransformation(params);\r\n const encodedPublicId = encodeURIComponent(publicId);\r\n return `https://res.cloudinary.com/${CLOUD_NAME}/image/upload/${transformation}/${encodedPublicId}`;\r\n}\r\nexport function createTransformation(params) {\r\n let transformation = '';\r\n if (params.width) {\r\n transformation += `,w_${params.width}`;\r\n }\r\n if (params.height) {\r\n transformation += `,h_${params.height}`;\r\n }\r\n if (params.aspectRatio) {\r\n transformation += `,ar_${params.aspectRatio}`;\r\n }\r\n if (params.dpr) {\r\n transformation += `,dpr_${params.dpr}`;\r\n }\r\n if (params.crop) {\r\n transformation += `,c_${params.crop}`;\r\n }\r\n if (params.gravity) {\r\n transformation += `,g_${params.gravity}`;\r\n }\r\n const format = params.format ?? 'auto';\r\n transformation += `/f_${format},q_auto`;\r\n if (transformation.indexOf(',') === 0) {\r\n transformation = transformation.slice(1);\r\n }\r\n return transformation;\r\n}\r\n"],"sourceRoot":""}