{"version":3,"sources":["webpack:///./src/stories/Widgets/Headers/SiteHeader/components/SearchField/SearchField.styles.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","SubmitLabel","span","srOnly","SubmitIcon","SvgSearch","Close","CloseIcon","SvgSearchClose","CloseLabel","ResultsContainer","ResultItem","a","ResultItemText","Bold","_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","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","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-e50b372c311793d81a9a.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 { 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 background: #6f9d20;\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: #a2b952;\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","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, }) => {\r\n const [searchTerm, setSearchTerm] = React.useState('');\r\n const items = useApi(searchTerm, typeAheadPath);\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);\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: handleRedirect, \"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) {\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}`;\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) {\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).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) {\r\n const res = await fetch(`/api/typeahead/getsearchitems?query=${searchTerm}${typeAheadPath ? `&path=${typeAheadPath}` : \"\"}`, { 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":""}