{"version":3,"file":"TechnicalDownloadSearch-Chunk-06fd6d407e61b5a7bb5d.js","mappings":"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","sources":["webpack://react-app/./node_modules/.pnpm/decode-uri-component@0.4.1/node_modules/decode-uri-component/index.js","webpack://react-app/./node_modules/.pnpm/split-on-first@3.0.0/node_modules/split-on-first/index.js","webpack://react-app/./node_modules/.pnpm/filter-obj@5.1.0/node_modules/filter-obj/index.js","webpack://react-app/./node_modules/.pnpm/query-string@8.2.0/node_modules/query-string/base.js","webpack://react-app/./node_modules/.pnpm/query-string@8.2.0/node_modules/query-string/index.js","webpack://react-app/./components/Shared/src/utility/hooks/useModal.ts","webpack://react-app/./components/Shared/src/utility/config/animations.ts","webpack://react-app/./components/Shared/src/components/atoms/Modal/Portal.tsx","webpack://react-app/./components/Shared/src/utility/helpers/bodyScrollLock.ts","webpack://react-app/./components/Shared/src/utility/hooks/useListingComponentData.ts","webpack://react-app/./components/Shared/src/utility/helpers/throttle.ts","webpack://react-app/./components/Shared/src/components/atoms/Checkbox/Checkbox.tsx","webpack://react-app/./components/Shared/src/components/atoms/IconButton/IconButton.tsx","webpack://react-app/./components/Shared/src/components/atoms/Modal/FullScreenModal.tsx","webpack://react-app/./components/Shared/src/components/atoms/Rows/Rows.tsx","webpack://react-app/./components/Shared/src/components/molecules/ExpandableBanner/ExpandableBanner.tsx","webpack://react-app/./components/Shared/src/utility/helpers/ensureArray.ts","webpack://react-app/./components/Shared/src/utility/helpers/extractDocumentsFromProductsArray.ts","webpack://react-app/./components/Shared/src/utility/helpers/removeObjectKeys.ts","webpack://react-app/./components/Shared/src/components/organisms/TechnicalDownloadSearch/components/DownloadItemRow.tsx","webpack://react-app/./components/Shared/src/components/organisms/TechnicalDownloadSearch/components/FilterSection.tsx","webpack://react-app/./components/Shared/src/components/organisms/TechnicalDownloadSearch/TechnicalDownloadSearch.tsx","webpack://react-app/./components/organisms/TechnicalDownloadSearch/TechnicalDownloadSearchWrapper.tsx","webpack://react-app/./components/Shared/src/components/atoms/Search/HighlightedResult.tsx","webpack://react-app/./components/Shared/src/components/atoms/Search/Search.tsx"],"sourcesContent":["const token = '%[a-f0-9]{2}';\nconst singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi');\nconst multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn [decodeURIComponent(components.join(''))];\n\t} catch {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tconst left = components.slice(0, split);\n\tconst right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch {\n\t\tlet tokens = input.match(singleMatcher) || [];\n\n\t\tfor (let i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher) || [];\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tconst replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD',\n\t};\n\n\tlet match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch {\n\t\t\tconst result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tconst entries = Object.keys(replaceMap);\n\n\tfor (const key of entries) {\n\t\t// Replace all decoded components\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nexport default function decodeUriComponent(encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n}\n","export default function splitOnFirst(string, separator) {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (string === '' || separator === '') {\n\t\treturn [];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n}\n","export function includeKeys(object, predicate) {\n\tconst result = {};\n\n\tif (Array.isArray(predicate)) {\n\t\tfor (const key of predicate) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\t\t\tif (descriptor?.enumerable) {\n\t\t\t\tObject.defineProperty(result, key, descriptor);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// `Reflect.ownKeys()` is required to retrieve symbol properties\n\t\tfor (const key of Reflect.ownKeys(object)) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\t\t\tif (descriptor.enumerable) {\n\t\t\t\tconst value = object[key];\n\t\t\t\tif (predicate(key, value, object)) {\n\t\t\t\t\tObject.defineProperty(result, key, descriptor);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function excludeKeys(object, predicate) {\n\tif (Array.isArray(predicate)) {\n\t\tconst set = new Set(predicate);\n\t\treturn includeKeys(object, key => !set.has(key));\n\t}\n\n\treturn includeKeys(object, (key, value, object) => !predicate(key, value, object));\n}\n","import decodeComponent from 'decode-uri-component';\nimport splitOnFirst from 'split-on-first';\nimport {includeKeys} from 'filter-obj';\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\n// eslint-disable-next-line unicorn/prefer-code-point\nconst strictUriEncode = string => encodeURIComponent(string).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n\nconst encodeFragmentIdentifier = Symbol('encodeFragmentIdentifier');\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index': {\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined\n\t\t\t\t\t|| (options.skipNull && value === null)\n\t\t\t\t\t|| (options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...result, [encode(key, options), '[', index, ']'].join(''),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join(''),\n\t\t\t\t];\n\t\t\t};\n\t\t}\n\n\t\tcase 'bracket': {\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined\n\t\t\t\t\t|| (options.skipNull && value === null)\n\t\t\t\t\t|| (options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...result,\n\t\t\t\t\t\t[encode(key, options), '[]'].join(''),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[]=', encode(value, options)].join(''),\n\t\t\t\t];\n\t\t\t};\n\t\t}\n\n\t\tcase 'colon-list-separator': {\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined\n\t\t\t\t\t|| (options.skipNull && value === null)\n\t\t\t\t\t|| (options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...result,\n\t\t\t\t\t\t[encode(key, options), ':list='].join(''),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), ':list=', encode(value, options)].join(''),\n\t\t\t\t];\n\t\t\t};\n\t\t}\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\tcase 'bracket-separator': {\n\t\t\tconst keyValueSep = options.arrayFormat === 'bracket-separator'\n\t\t\t\t? '[]='\n\t\t\t\t: '=';\n\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined\n\t\t\t\t\t|| (options.skipNull && value === null)\n\t\t\t\t\t|| (options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\t// Translate null to an empty string so that it doesn't serialize as 'null'\n\t\t\t\tvalue = value === null ? '' : value;\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), keyValueSep, encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\t\t}\n\n\t\tdefault: {\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined\n\t\t\t\t\t|| (options.skipNull && value === null)\n\t\t\t\t\t|| (options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...result,\n\t\t\t\t\t\tencode(key, options),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '=', encode(value, options)].join(''),\n\t\t\t\t];\n\t\t\t};\n\t\t}\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index': {\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\t\t}\n\n\t\tcase 'bracket': {\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [...accumulator[key], value];\n\t\t\t};\n\t\t}\n\n\t\tcase 'colon-list-separator': {\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(:list)$/.exec(key);\n\t\t\t\tkey = key.replace(/:list$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [...accumulator[key], value];\n\t\t\t};\n\t\t}\n\n\t\tcase 'comma':\n\t\tcase 'separator': {\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n\t\t\t\tconst isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));\n\t\t\t\tvalue = isEncodedArray ? decode(value, options) : value;\n\t\t\t\tconst newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : (value === null ? value : decode(value, options));\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\t\t}\n\n\t\tcase 'bracket-separator': {\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = /(\\[])$/.test(key);\n\t\t\t\tkey = key.replace(/\\[]$/, '');\n\n\t\t\t\tif (!isArray) {\n\t\t\t\t\taccumulator[key] = value ? decode(value, options) : value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst arrayValue = value === null\n\t\t\t\t\t? []\n\t\t\t\t\t: value.split(options.arrayFormatSeparator).map(item => decode(item, options));\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = arrayValue;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [...accumulator[key], ...arrayValue];\n\t\t\t};\n\t\t}\n\n\t\tdefault: {\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [...[accumulator[key]].flat(), value];\n\t\t\t};\n\t\t}\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nexport function extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nexport function parse(query, options) {\n\toptions = {\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false,\n\t\t...options,\n\t};\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst returnValue = Object.create(null);\n\n\tif (typeof query !== 'string') {\n\t\treturn returnValue;\n\t}\n\n\tquery = query.trim().replace(/^[?#&]/, '');\n\n\tif (!query) {\n\t\treturn returnValue;\n\t}\n\n\tfor (const parameter of query.split('&')) {\n\t\tif (parameter === '') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst parameter_ = options.decode ? parameter.replace(/\\+/g, ' ') : parameter;\n\n\t\tlet [key, value] = splitOnFirst(parameter_, '=');\n\n\t\tif (key === undefined) {\n\t\t\tkey = parameter_;\n\t\t}\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : (['comma', 'separator', 'bracket-separator'].includes(options.arrayFormat) ? value : decode(value, options));\n\t\tformatter(decode(key, options), value, returnValue);\n\t}\n\n\tfor (const [key, value] of Object.entries(returnValue)) {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const [key2, value2] of Object.entries(value)) {\n\t\t\t\tvalue[key2] = parseValue(value2, options);\n\t\t\t}\n\t\t} else {\n\t\t\treturnValue[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn returnValue;\n\t}\n\n\t// TODO: Remove the use of `reduce`.\n\t// eslint-disable-next-line unicorn/no-array-reduce\n\treturn (options.sort === true ? Object.keys(returnValue).sort() : Object.keys(returnValue).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = returnValue[key];\n\t\tresult[key] = Boolean(value) && typeof value === 'object' && !Array.isArray(value) ? keysSorter(value) : value;\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexport function stringify(object, options) {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = {encode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',', ...options};\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst shouldFilter = key => (\n\t\t(options.skipNull && isNullOrUndefined(object[key]))\n\t\t|| (options.skipEmptyString && object[key] === '')\n\t);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = {};\n\n\tfor (const [key, value] of Object.entries(object)) {\n\t\tif (!shouldFilter(key)) {\n\t\t\tobjectCopy[key] = value;\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\tif (value.length === 0 && options.arrayFormat === 'bracket-separator') {\n\t\t\t\treturn encode(key, options) + '[]';\n\t\t\t}\n\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n}\n\nexport function parseUrl(url, options) {\n\toptions = {\n\t\tdecode: true,\n\t\t...options,\n\t};\n\n\tlet [url_, hash] = splitOnFirst(url, '#');\n\n\tif (url_ === undefined) {\n\t\turl_ = url;\n\t}\n\n\treturn {\n\t\turl: url_?.split('?')?.[0] ?? '',\n\t\tquery: parse(extract(url), options),\n\t\t...(options && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}),\n\t};\n}\n\nexport function stringifyUrl(object, options) {\n\toptions = {\n\t\tencode: true,\n\t\tstrict: true,\n\t\t[encodeFragmentIdentifier]: true,\n\t\t...options,\n\t};\n\n\tconst url = removeHash(object.url).split('?')[0] || '';\n\tconst queryFromUrl = extract(object.url);\n\n\tconst query = {\n\t\t...parse(queryFromUrl, {sort: false}),\n\t\t...object.query,\n\t};\n\n\tlet queryString = stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\tlet hash = getHash(object.url);\n\tif (object.fragmentIdentifier) {\n\t\tconst urlObjectForFragmentEncode = new URL(url);\n\t\turlObjectForFragmentEncode.hash = object.fragmentIdentifier;\n\t\thash = options[encodeFragmentIdentifier] ? urlObjectForFragmentEncode.hash : `#${object.fragmentIdentifier}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n}\n\nexport function pick(input, filter, options) {\n\toptions = {\n\t\tparseFragmentIdentifier: true,\n\t\t[encodeFragmentIdentifier]: false,\n\t\t...options,\n\t};\n\n\tconst {url, query, fragmentIdentifier} = parseUrl(input, options);\n\n\treturn stringifyUrl({\n\t\turl,\n\t\tquery: includeKeys(query, filter),\n\t\tfragmentIdentifier,\n\t}, options);\n}\n\nexport function exclude(input, filter, options) {\n\tconst exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);\n\n\treturn pick(input, exclusionFilter, options);\n}\n","import * as queryString from './base.js';\n\nexport default queryString;\n","import { RefObject, useEffect } from 'react';\nimport { usePreventScroll } from 'react-aria';\n\n// A useful hook to lock the scroll position of the rest of a page when a modal is open and provide a focus trap\nconst useModal = (\n  isOpen: boolean,\n  setIsOpen: (isOpen: boolean) => void,\n  targetRef: RefObject<HTMLDivElement | null>\n) => {\n  usePreventScroll({ isDisabled: !isOpen });\n\n  useEffect(() => {\n    if (typeof window === 'undefined' || !targetRef.current) {\n      return;\n    }\n\n    // Retain which element activated the modal\n    const activeElement = (document.activeElement ||\n      document.body) as HTMLElement;\n    const modalElement = targetRef.current;\n\n    if (isOpen && modalElement) {\n      const focusableElements = modalElement.querySelectorAll(\n        'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n      );\n      const firstElement = focusableElements[0] as HTMLElement;\n      const lastElement = focusableElements[\n        focusableElements.length - 1\n      ] as HTMLElement;\n\n      const handleTabKeyPress = (event: KeyboardEvent) => {\n        if (event.key === 'Tab') {\n          if (event.shiftKey && document.activeElement === firstElement) {\n            event.preventDefault();\n            lastElement?.focus();\n          } else if (\n            !event.shiftKey &&\n            document.activeElement === lastElement\n          ) {\n            event.preventDefault();\n            firstElement?.focus();\n          }\n        }\n      };\n\n      const handleEscapeKeyPress = (event: KeyboardEvent) => {\n        if (event.key === 'Escape') {\n          setIsOpen(false);\n          // Set focus back to the element which activated the modal\n          activeElement?.focus();\n        }\n      };\n\n      modalElement.addEventListener('keydown', handleTabKeyPress);\n      modalElement.addEventListener('keydown', handleEscapeKeyPress);\n\n      modalElement.focus();\n\n      return () => {\n        modalElement.removeEventListener('keydown', handleTabKeyPress);\n        modalElement.removeEventListener('keydown', handleEscapeKeyPress);\n      };\n    }\n  }, [isOpen, setIsOpen, targetRef]);\n};\n\nexport default useModal;\n","export const slideTransition = {\n  duration: 0.8,\n  ease: [0.74, 0, 0.19, 1.02],\n};\n\nexport const fadeTransition = {\n  delay: 0.15,\n  duration: 0.3,\n  ease: 'easeIn',\n};\n\nexport const fadeInUp = {\n  hidden: {\n    opacity: 0,\n    y: 50,\n    transition: {\n      duration: 1,\n      ease: [0.22, 1, 0.36, 1],\n    },\n  },\n  visible: {\n    opacity: 1,\n    y: 0,\n    transition: {\n      duration: 1,\n      ease: [0.22, 1, 0.36, 1],\n      type: 'spring',\n      stiffness: 50,\n      damping: 14,\n    },\n  },\n};\n\nexport const fadeInUpSlow = {\n  hidden: {\n    opacity: 0,\n    y: 50,\n    transition: {\n      duration: 1,\n      ease: [0.4, 0, 0.2, 1],\n    },\n  },\n  visible: {\n    opacity: 1,\n    y: 0,\n    transition: {\n      duration: 1,\n      ease: [0.4, 0, 0.2, 1],\n      type: 'spring',\n      stiffness: 50,\n      damping: 14,\n    },\n  },\n};\n\nexport const fadeIn = {\n  hidden: {\n    opacity: 0,\n    transition: {\n      duration: 0.5,\n      ease: 'easeInOut',\n    },\n  },\n  visible: {\n    opacity: 1,\n    transition: {\n      duration: 0.5,\n      ease: 'easeInOut',\n    },\n  },\n};\n","import { PropsWithChildren, useEffect, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface Props {\n  readonly mountId: string;\n}\n\nconst Portal = ({ mountId, children }: PropsWithChildren<Props>) => {\n  const containerElement = useMemo(() => document.createElement('div'), []);\n\n  useEffect(() => {\n    document.getElementById(mountId)?.appendChild(containerElement);\n\n    return () => {\n      document.getElementById(mountId)?.removeChild(containerElement);\n    };\n  }, [mountId, containerElement]);\n\n  return createPortal(children, containerElement);\n};\n\nexport default Portal;\n","import throttle from './throttle';\n\nconst bodyScrollLock = (isScrollLocked: boolean) => {\n  const documentElementScroll =\n    document.documentElement.style.getPropertyValue('--scroll-y');\n  const cacheLocator = documentElementScroll || `${window.scrollY}px`;\n\n  const throttledSetScrollY = throttle(\n    () =>\n      document.documentElement.style.setProperty(\n        '--scroll-y',\n        `${window.scrollY}px`\n      ),\n    200\n  );\n\n  if (!documentElementScroll) {\n    window.addEventListener('scroll', throttledSetScrollY);\n  }\n\n  const { body } = document;\n\n  if (isScrollLocked) {\n    const scrollY = cacheLocator;\n    body.style.scrollbarGutter = 'stable';\n    body.style.overflowY = 'hidden';\n    body.style.position = 'fixed';\n    body.style.top = `-${scrollY}`;\n    body.style.left = '0px';\n    body.style.right = '0px';\n  } else {\n    body.style.position = '';\n    body.style.overflowY = 'auto';\n    const scrollY = body.style.top || cacheLocator;\n    body.style.top = '';\n    window.scrollTo(0, Math.abs(parseInt(scrollY || '0', 10)));\n  }\n};\n\nexport default bodyScrollLock;\n","import queryString from 'query-string';\nimport { useState } from 'react';\n\ninterface IListingComponentState<TData> {\n  readonly data: TData;\n  readonly loading: boolean;\n  readonly error: string;\n  readonly isInitialData: boolean;\n  readonly pushToUrl?: boolean;\n}\n\n// Extend the hook definition with TData for the data structure\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst useListingComponentData = <TFormData extends Record<string, any>, TData>(\n  apiEndpoint: string,\n  initialData: TData,\n  skipEmptyString = true,\n  pushToUrl = true\n) => {\n  const [state, setState] = useState<IListingComponentState<TData>>({\n    data: initialData,\n    loading: false,\n    error: '',\n    isInitialData: true,\n  });\n\n  const fetchData = async (formData: TFormData) => {\n    try {\n      setState({ ...state, loading: true, error: '' });\n      const requestQueryString = `?${queryString.stringify(formData, {\n        skipEmptyString: skipEmptyString,\n        arrayFormat: 'comma',\n      })}`;\n\n      const response = await fetch(`${apiEndpoint}${requestQueryString}`);\n\n      if (!response.ok) {\n        throw new Error(`Request failed with status ${response.status}`);\n      }\n\n      const data = await response.json();\n\n      if (pushToUrl) {\n        const currentUrl = new URL(window.location.href);\n        const searchParams = currentUrl.searchParams;\n\n        (Object.keys(formData) as Array<keyof TFormData>).forEach((key) => {\n          const value = formData[key];\n          searchParams.set(key?.toString(), value?.toString());\n        });\n\n        window.history.pushState({}, '', currentUrl.href);\n      }\n\n      setState({ ...state, data, loading: false, isInitialData: false });\n    } catch (error) {\n      setState({ ...state, loading: false, error: 'Error fetching data' });\n    }\n  };\n\n  return { fetchData, state };\n};\n\nexport default useListingComponentData;\n","function throttle<T extends (...args: any[]) => any>(\n  func: T,\n  limit: number\n): (...args: Parameters<T>) => void {\n  let lastFunc: NodeJS.Timeout | undefined;\n  let lastRan: number | undefined;\n\n  return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n    const context = this;\n\n    if (!lastRan) {\n      func.apply(context, args);\n      lastRan = Date.now();\n    } else {\n      if (lastFunc) clearTimeout(lastFunc);\n\n      lastFunc = setTimeout(function () {\n        if (Date.now() - (lastRan ?? 0) >= limit) {\n          func.apply(context, args);\n          lastRan = Date.now();\n        }\n      }, limit - (Date.now() - (lastRan ?? 0)));\n    }\n  };\n}\n\nexport default throttle;\n","import Text from '@atoms/Text/Text';\nimport { ICheckbox } from '@models/ICheckbox';\nimport classNames from 'classnames';\n\nconst Checkbox = ({\n  checked,\n  dataTestId,\n  hideLabelOnMobile,\n  indeterminate = false,\n  label,\n  labelClasses,\n  onChange,\n  register,\n  richTextLabel = false,\n  ...props\n}: ICheckbox) => (\n  <label\n    className={classNames(\n      'tw-item tw-flex tw-cursor-pointer tw-items-start tw-justify-start tw-gap-2 tw-text-[14px] disabled:tw-cursor-default',\n      labelClasses\n    )}\n  >\n    <input\n      className=\"tw-peer tw-sr-only tw-order-last tw-appearance-none\"\n      data-testid={dataTestId}\n      type=\"checkbox\"\n      checked={checked}\n      {...props}\n      {...register?.(`${props.name}`, {\n        onChange: (e) => onChange?.(e),\n      })}\n    />\n    <svg\n      viewBox=\"0 0 18 18\"\n      aria-hidden=\"true\"\n      className=\"tw-h-xs tw-w-xs tw-shrink-0 tw-translate-y-[3px] tw-rounded tw-border tw-border-grey-80 tw-fill-none tw-stroke-white tw-stroke-2 tw-ring-black tw-transition-all tw-duration-300 tw-ease-in-out peer-checked:tw-bg-grey-80 peer-focus-visible:tw-ring-2 peer-focus-visible:tw-ring-offset-2 peer-disabled:tw-border-grey-40 peer-disabled:peer-checked:tw-bg-grey-40\"\n    >\n      <polyline points={indeterminate ? '3 9 15 9' : '3 8 7 13 15 4'} />\n    </svg>\n    {richTextLabel ? (\n      <Text\n        className=\" tw-rich-text peer-disabled:tw-text-grey-40\"\n        variant=\"body-small\"\n        dangerouslySetInnerHTML={{ __html: label }}\n      />\n    ) : (\n      <p\n        className={classNames(\n          { 'tw-sr-only md:tw-not-sr-only': hideLabelOnMobile },\n          'peer-disabled:tw-text-grey-40'\n        )}\n      >\n        {label}\n      </p>\n    )}\n  </label>\n);\n\nexport default Checkbox;\n","import Icon from '@atoms/Icon/Icon';\nimport Text from '@atoms/Text/Text';\nimport { IIconButton } from '@models/IIconButton';\nimport classNames from 'classnames';\n\nconst IconButton = ({\n  className,\n  dataTestId,\n  href,\n  label,\n  icon,\n  onClick,\n}: IIconButton) => {\n  const Component = href ? 'a' : 'button';\n\n  return (\n    <Component\n      data-testid={dataTestId}\n      href={href}\n      type={href ? undefined : 'button'}\n      onClick={() => onClick()}\n      className={classNames(className, 'tw-flex tw-items-center tw-gap-3')}\n    >\n      <Icon name={icon} />\n      <Text variant=\"body-small\">{label}</Text>\n    </Component>\n  );\n};\n\nexport default IconButton;\n","import Icon from '@atoms/Icon/Icon';\nimport Text from '@atoms/Text/Text';\nimport SiteEnum from '@models/enums/SiteEnum';\nimport { slideTransition } from '@utility/config/animations';\nimport useModal from '@utility/hooks/useModal';\nimport classNames from 'classnames';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { PropsWithChildren, useRef } from 'react';\nimport Portal from './Portal';\n\nexport interface IFullScreenModal {\n  readonly closeLabel?: string;\n  readonly isOpen: boolean;\n  readonly setIsOpen: (state: boolean) => void;\n  readonly site?: SiteEnum;\n  readonly title: string;\n}\n\nconst FullScreenModal = ({\n  children,\n  closeLabel = 'close',\n  isOpen,\n  setIsOpen,\n  site = SiteEnum.B2B,\n  title,\n}: PropsWithChildren<IFullScreenModal>) => {\n  const targetRef = useRef<HTMLDivElement>(null);\n\n  useModal(isOpen, setIsOpen, targetRef);\n\n  return (\n    <AnimatePresence>\n      {isOpen && (\n        <Portal key=\"portal\" mountId=\"portal-mount\">\n          <motion.div\n            initial={{ y: '100%' }}\n            animate={{ y: 0 }}\n            exit={{ y: '100%' }}\n            transition={slideTransition}\n            key=\"drawer\"\n            role=\"complementary\"\n            ref={targetRef}\n            tabIndex={0}\n            className={classNames(\n              'tw-fixed tw-inset-0 tw-z-max tw-outline-none',\n              site === SiteEnum.B2B\n                ? 'tw-bg-grey-10'\n                : 'tw-top-[56px] tw-h-[calc(100vh-56px)] tw-bg-white'\n            )}\n            id=\"filters-modal\"\n          >\n            <div className=\"tw-relative tw-flex tw-h-full tw-w-full tw-flex-col\">\n              <div\n                className={classNames(\n                  'tw-flex tw-w-full tw-items-center tw-justify-between tw-bg-grey-10 tw-outline-none xl:tw-hidden',\n                  site === SiteEnum.B2B\n                    ? 'tw-border-b tw-border-grey-20 tw-p-xs'\n                    : 'tw-bg-grey-10 tw-p-md tw-pb-xs'\n                )}\n              >\n                {/* <Text variant=\"body-14-semibold\">{title}</Text> */}\n                <Text variant=\"heading-28\">{title}</Text>\n                <button\n                  type=\"button\"\n                  aria-label={closeLabel}\n                  onClick={() => setIsOpen(false)}\n                >\n                  <Icon\n                    name=\"cross\"\n                    size={site === SiteEnum.B2B ? '1rem' : '1.5rem'}\n                  />\n                </button>\n              </div>\n              {children}\n            </div>\n          </motion.div>\n        </Portal>\n      )}\n    </AnimatePresence>\n  );\n};\n\nexport default FullScreenModal;\n","import classNames from 'classnames';\nimport { PropsWithChildren } from 'react';\n\ninterface IRows {\n  borderTop?: boolean;\n  borderBottom?: boolean;\n  className?: string;\n}\n\nconst Rows = ({\n  children,\n  borderTop,\n  borderBottom = true,\n  className = '',\n}: PropsWithChildren<IRows>) => {\n  const containerClasses = classNames(\n    'tw-divide-y tw-divide-grey-20',\n    className,\n    {\n      'tw-border-t tw-border-grey-20': borderTop,\n      'tw-border-b tw-border-grey-20': borderBottom,\n    }\n  );\n\n  return <div className={containerClasses}>{children}</div>;\n};\n\nexport default Rows;\n","import Icon from '@atoms/Icon/Icon';\nimport Portal from '@atoms/Modal/Portal';\nimport { IExpandableBanner } from '@models/IExpandableBanner';\nimport { slideTransition } from '@utility/config/animations';\nimport bodyScrollLock from '@utility/helpers/bodyScrollLock';\nimport FocusTrap from 'focus-trap-react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { PropsWithChildren, useEffect, useRef, useState } from 'react';\nconst ExpandableBanner = ({\n  dataTestId,\n  children,\n  text,\n}: PropsWithChildren<IExpandableBanner>) => {\n  const [isOpen, setOpen] = useState(false);\n\n  const targetRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (isOpen && targetRef.current) {\n      bodyScrollLock(true);\n    }\n\n    return () => {\n      bodyScrollLock(false);\n    };\n  }, [isOpen]);\n\n  return (\n    <Portal mountId=\"portal-mount\">\n      <div\n        ref={targetRef}\n        className=\"tw-pointer-events-none tw-fixed tw-bottom-0 tw-left-0 tw-right-0 tw-top-14 tw-z-max md:tw-top-16\"\n      >\n        <div className=\"tw-relative tw-h-full tw-w-full\">\n          <motion.div\n            id=\"expandable-banner\"\n            className=\"tw-pointer-events-auto tw-absolute tw-bottom-0 tw-left-0 tw-right-0 tw-flex tw-flex-col tw-bg-white\"\n            initial={{ height: 'auto' }}\n            animate={{ height: isOpen ? '100%' : 'auto' }}\n            transition={slideTransition}\n            exit={{ height: 'auto' }}\n          >\n            <button\n              onClick={() => {\n                setOpen(!isOpen);\n              }}\n              className=\"tw-w-full tw-cursor-pointer tw-bg-grey-30 tw-py-xs tw-text-sm tw-outline-none focus-visible:tw-ring-2 focus-visible:tw-ring-black\"\n              aria-expanded={isOpen}\n              aria-controls=\"expandable-banner\"\n              data-testid={`${dataTestId}-Expandable-Banner-Button`}\n            >\n              <div className=\"tw-container tw-flex tw-justify-between\">\n                {text}\n                <motion.div\n                  animate={{ rotate: isOpen ? 0 : 180 }}\n                  transition={{ duration: 0.3 }}\n                  className=\"tw-flex tw-items-center tw-justify-center\"\n                >\n                  <Icon name=\"chevron-down\" />\n                </motion.div>\n              </div>\n            </button>\n            <div className=\"tw-relative tw-grow\">\n              <AnimatePresence mode=\"wait\">\n                {isOpen && (\n                  <FocusTrap\n                    focusTrapOptions={{\n                      preventScroll: true,\n                      allowOutsideClick: true,\n                    }}\n                  >\n                    <motion.div\n                      aria-label=\"banner container\"\n                      tabIndex={0}\n                      className=\"tw-absolute tw-inset-0 tw-overflow-y-auto\"\n                      initial={{ opacity: 0 }}\n                      animate={{ opacity: 100 }}\n                      exit={{ opacity: 0 }}\n                      transition={{ duration: 1 }}\n                    >\n                      {children}\n                    </motion.div>\n                  </FocusTrap>\n                )}\n              </AnimatePresence>\n            </div>\n          </motion.div>\n        </div>\n      </div>\n    </Portal>\n  );\n};\n\nexport default ExpandableBanner;\n","const ensureArray = (value: string | string[]): string[] => {\n  if (typeof value === 'string') {\n    return [value];\n  }\n  return value;\n};\n\nexport default ensureArray;\n","import IProductDatasheets, {\n  IProductDatasheet,\n} from '@models/IProductDatasheets';\n\n// The JSON structure for datasheets contains quite a complex structure, hence the need for this function\n// see: productDatasheets.mocks.ts\nconst extractDocumentsFromProductsArray = (products: IProductDatasheets[]) => {\n  const extractedDatasheetsArray: IProductDatasheet[] = [];\n\n  const extractDatasheetsFromValueArray = (filesArray: IProductDatasheet[]) => {\n    filesArray.forEach((item) => {\n      extractedDatasheetsArray.push(item);\n    });\n  };\n\n  products.forEach((product) => {\n    product.value.forEach((datasheetsTypeSet) => {\n      extractDatasheetsFromValueArray(datasheetsTypeSet.value);\n\n      if (datasheetsTypeSet.children && datasheetsTypeSet.children.length > 0) {\n        datasheetsTypeSet.children.forEach((datasheetChildset) => {\n          extractDatasheetsFromValueArray(datasheetChildset.value);\n        });\n      }\n    });\n  });\n\n  return extractedDatasheetsArray;\n};\n\nexport default extractDocumentsFromProductsArray;\n","const removeObjectKeys = (\n  object: Record<string, any>,\n  excludedKeys: string[]\n) => {\n  const objectWithKeysRemoved = { ...object }; // Create a copy of the original object\n\n  excludedKeys.forEach((key) => {\n    if (objectWithKeysRemoved.hasOwnProperty(key)) {\n      delete objectWithKeysRemoved[key]; // Delete the property if it exists\n    }\n  });\n\n  return objectWithKeysRemoved;\n};\n\nexport default removeObjectKeys;\n","import Checkbox from '@atoms/Checkbox/Checkbox';\nimport Icon from '@atoms/Icon/Icon';\nimport Text from '@atoms/Text/Text';\nimport IFormComponent from '@models/IFormComponent';\nimport { IProductDatasheet } from '@models/IProductDatasheets';\nimport { ChangeEvent } from 'react';\n\ninterface IDownloadItemRow extends IFormComponent {\n  readonly dataTestId: string;\n  readonly selectedDocuments: IProductDatasheet[];\n  readonly setSelectedDocuments: (newSelectedIds: IProductDatasheet[]) => void;\n  readonly removeDocument: (id: number) => void;\n  readonly value: IProductDatasheet;\n  readonly label: string;\n  readonly fileName: string;\n  readonly name: string;\n  readonly downloadLabel: string;\n  readonly addLabel: string;\n  readonly fileUrl: string;\n  readonly cultureCode: string;\n  readonly category: string;\n  readonly customerInfo: {\n    readonly industryNameForPageLoadTracking: string;\n    readonly subIndustryNameForPageLoadTracking: string;\n    readonly targetAudienceForPageLoadTracking: string;\n    readonly regionForPageLoadTracking: string;\n  };\n}\n\nconst DownloadItemRow = ({\n  dataTestId,\n  selectedDocuments,\n  setSelectedDocuments,\n  removeDocument,\n  value,\n  name,\n  addLabel,\n  fileName,\n  fileUrl,\n  cultureCode,\n  downloadLabel,\n  category,\n  register,\n  customerInfo,\n}: IDownloadItemRow) => {\n  const onCheckboxChange = (e: ChangeEvent<HTMLInputElement>) => {\n    const isChecked = e.target?.checked;\n    const document = JSON.parse(e.target.value);\n\n    if (isChecked) {\n      setSelectedDocuments([...selectedDocuments, document]);\n    } else {\n      removeDocument(document.id);\n    }\n  };\n\n  return (\n    <div className=\"tw-grid tw-grid-cols-4 tw-py-xs xl:tw-grid-cols-9 xl:tw-gap-md\">\n      <Text\n        variant=\"body-small\"\n        className=\"tw-col-span-3 tw-pr-4 xl:tw-col-span-6\"\n      >\n        {name}\n      </Text>\n      <div className=\"tw-col-span-1 tw-col-start-4 tw-flex tw-items-center tw-justify-between xl:tw-col-span-3 xl:tw-col-start-7\">\n        <a\n          href={fileUrl}\n          className=\"tw-flex tw-items-center tw-gap-2\"\n          target=\"_blank\"\n          rel=\"noreferrer\"\n          onClick={() => {\n            window.dataLayer.push({\n              event: 'trackingEvent_file_download',\n              event_name_variable: 'file_download',\n              trackingEvent_file_download: {\n                document_name: fileName,\n                language_for_document: cultureCode,\n                document_type: category,\n              },\n              customer_info: {\n                user_industry: customerInfo.industryNameForPageLoadTracking,\n                user_sub_industry:\n                  customerInfo.subIndustryNameForPageLoadTracking,\n                user_region: customerInfo.regionForPageLoadTracking,\n                target_audience: customerInfo.targetAudienceForPageLoadTracking,\n              },\n            });\n          }}\n          data-testid={`${dataTestId}-Download-Item-Button`}\n        >\n          <Icon name=\"download\" />\n          <Text variant=\"body-small\" className=\"tw-hidden xl:tw-block\">\n            {downloadLabel}\n          </Text>\n        </a>\n        <Checkbox\n          checked={selectedDocuments\n            .map((document) => document.id)\n            .includes(value.id)}\n          dataTestId={`${dataTestId}-Add-Item-Button`}\n          onChange={onCheckboxChange}\n          name=\"documents\"\n          value={JSON.stringify(value)}\n          label={addLabel}\n          register={register}\n          hideLabelOnMobile\n        />\n      </div>\n    </div>\n  );\n};\n\nexport default DownloadItemRow;\n","import Checkbox from '@atoms/Checkbox/Checkbox';\nimport Select from '@atoms/Select/Select';\nimport Text from '@atoms/Text/Text';\nimport VariantTypeEnum from '@models/enums/VariantTypeEnum';\nimport { IFilter, IFilterGroup } from '@models/IFilterGroup';\nimport IFormComponent from '@models/IFormComponent';\nimport { ChangeEvent } from 'react';\n\ninterface IFilterSection extends IFormComponent {\n  readonly countries: (IFilter & { readonly languages?: IFilter[] })[];\n  readonly countryPlaceholder: string;\n  readonly dataTestId: string;\n  readonly disableLanguageSelection: boolean;\n  readonly filters: IFilterGroup;\n  readonly onCountryChange: (countryItem: IFilter, reset: boolean) => void;\n  readonly languagePlaceholder: string;\n  readonly languages: IFilter[];\n  readonly selectedLanguage: IFilter | null;\n  readonly setSelectedLanguage: (newSelectedItem: IFilter | null) => void;\n  readonly selectedCountry: IFilter | null;\n  readonly setSelectedCountry: (newSelectedItem: IFilter | null) => void;\n  readonly selectedFileTypes: string[];\n  readonly setSelectedFileTypes: (newSelectedItem: string[]) => void;\n}\n\nconst FilterSection = ({\n  countries,\n  countryPlaceholder,\n  dataTestId,\n  disableLanguageSelection,\n  filters,\n  onCountryChange,\n  languagePlaceholder,\n  languages,\n  register,\n  selectedLanguage,\n  setSelectedLanguage,\n  selectedCountry,\n  setSelectedCountry,\n  selectedFileTypes,\n  setSelectedFileTypes,\n  setValue,\n}: IFilterSection) => {\n  const onCheckboxChange = (\n    e: ChangeEvent<HTMLInputElement>,\n    filterId: string\n  ) => {\n    const isChecked = e.target?.checked;\n    const prevFileTypes = [...selectedFileTypes];\n    const parsedFilterId = String(filters.id);\n    if (isChecked) {\n      setSelectedFileTypes([...prevFileTypes, filterId]);\n      setValue?.(parsedFilterId, [...selectedFileTypes, filterId]);\n    } else {\n      setSelectedFileTypes(prevFileTypes?.filter((id) => id !== filterId));\n      setValue?.(\n        parsedFilterId,\n        selectedFileTypes.filter((id) => id !== filterId)\n      );\n    }\n  };\n\n  return (\n    <div className=\"tw-flex tw-flex-col tw-gap-xs xl:tw-gap-sm\">\n      <Select\n        dataTestId={`${dataTestId}-Country`}\n        displayLabel={false}\n        name=\"location\"\n        onSelectedItemChange={(item) => {\n          setValue?.('language', '');\n          if (item) {\n            setSelectedCountry(item);\n            onCountryChange(item, true);\n          }\n        }}\n        options={countries}\n        placeholder={countryPlaceholder}\n        register={register}\n        selectedItem={selectedCountry}\n        setValue={setValue}\n        variant={VariantTypeEnum.Primary}\n      />\n      <Select\n        dataTestId={`${dataTestId}-Language`}\n        disabled={disableLanguageSelection}\n        displayLabel={false}\n        name=\"language\"\n        onSelectedItemChange={setSelectedLanguage}\n        options={languages}\n        placeholder={languagePlaceholder}\n        register={register}\n        selectedItem={selectedLanguage}\n        setValue={setValue}\n        variant={VariantTypeEnum.Primary}\n      />\n      <div>\n        <Text\n          className=\"tw-inline-block tw-pb-xs tw-text-grey-70\"\n          variant=\"label-12\"\n        >\n          {filters.label}\n        </Text>\n        <div className=\"tw-flex tw-flex-col tw-items-start tw-justify-between tw-gap-sm xl:tw-flex-row\">\n          {filters.options.map((filter, index) => {\n            const filterId = String(filter.id);\n            return (\n              <Checkbox\n                checked={selectedFileTypes.includes(filterId)}\n                dataTestId={`${dataTestId}-Filter-Item-${index}`}\n                onChange={(e) => onCheckboxChange(e, filterId)}\n                key={filter.id}\n                label={filter.label}\n                name={filterId}\n                register={register}\n                value={filter.id}\n              />\n            );\n          })}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default FilterSection;\n","import AccordionItem from '@atoms/AccordionItem/AccordionItem';\nimport Button from '@atoms/Button/Button';\nimport Checkbox from '@atoms/Checkbox/Checkbox';\nimport Icon from '@atoms/Icon/Icon';\nimport IconButton from '@atoms/IconButton/IconButton';\nimport LoadingSpinner from '@atoms/LoadingSpinner/LoadingSpinner';\nimport FullScreenModal from '@atoms/Modal/FullScreenModal';\nimport Rows from '@atoms/Rows/Rows';\nimport Search from '@atoms/Search/Search';\nimport Text from '@atoms/Text/Text';\nimport { IFilter } from '@models/IFilterGroup';\nimport IFormValues from '@models/IFormValues';\nimport IProductDatasheets, {\n  IDatasheetTypeSetChildren,\n  IProductDatasheet,\n} from '@models/IProductDatasheets';\nimport {\n  IProductDatasheetsResponse,\n  ITechnicalDownloadSearch,\n  ITechnicalDownloadSearchFormData,\n} from '@models/ITechnicalDownloadSearch';\nimport BreakpointEnum from '@models/enums/BreakpointEnum';\nimport SizeEnum from '@models/enums/SizeEnum';\nimport Accordion from '@molecules/Accordion/Accordion';\nimport ExpandableBanner from '@molecules/ExpandableBanner/ExpandableBanner';\nimport ListingPlaceholder from '@molecules/ListingPlaceholder/ListingPlaceholder';\nimport { breakpointsAbove } from '@utility/config/breakpoints';\nimport ensureArray from '@utility/helpers/ensureArray';\nimport extractDocumentsFromProductsArray from '@utility/helpers/extractDocumentsFromProductsArray';\nimport removeObjectKeys from '@utility/helpers/removeObjectKeys';\nimport replaceValuesInLabel from '@utility/helpers/replaceValuesInLabel';\nimport useBreakpoint from '@utility/hooks/useBreakpoint';\nimport useListingComponentData from '@utility/hooks/useListingComponentData';\nimport classNames from 'classnames';\nimport queryString from 'query-string';\nimport { useEffect, useState } from 'react';\nimport { SubmitHandler, useForm } from 'react-hook-form';\nimport DownloadItemRow from './components/DownloadItemRow';\nimport FilterSection from './components/FilterSection';\n\nconst TechnicalDownloadSearchPage = ({\n  addAllLabel,\n  addLabel,\n  apiEndpoint,\n  applyLabel,\n  closeLabel,\n  collapseLabel,\n  countries,\n  countryPlaceholder,\n  currentCulture,\n  defaultCountryCode,\n  documentsAddedLabel,\n  documentsLabel,\n  documentsShownLabel,\n  downloadAsMultipleLabel,\n  downloadAsSingleLabel,\n  downloadLabel,\n  expandLabel,\n  filterLabel,\n  filters,\n  header,\n  industryNameForPageLoadTracking,\n  languagePlaceholder,\n  loadingLabel,\n  noResultsHeader,\n  noResultsLabel,\n  noResultsText,\n  noSearchTermHeader,\n  noSearchTermText,\n  openLabel,\n  regionForPageLoadTracking,\n  removeAllLabel,\n  removeLabel,\n  requiredErrorMessage,\n  searchLabel,\n  site,\n  subIndustryNameForPageLoadTracking,\n  subText,\n  targetAudienceForPageLoadTracking,\n}: ITechnicalDownloadSearch) => {\n  const [expandAll, setExpandAll] = useState(false);\n  const [submittedText, setSubmittedText] = useState('');\n  const [isMobileFiltersOpen, setIsMobileFiltersOpen] = useState(false);\n  const [selectedLanguage, setSelectedLanguage] = useState<IFilter | null>(\n    null\n  );\n  const [selectedCountry, setSelectedCountry] = useState<IFilter | null>({\n    label: countryPlaceholder,\n    id: '',\n  });\n  const [selectedFileTypes, setSelectedFileTypes] = useState<string[]>([]);\n  const [selectedDocuments, setSelectedDocuments] = useState<\n    IProductDatasheet[]\n  >([]);\n  const [languageOptions, setLanguageOptions] = useState<IFilter[]>([]);\n  const [languagesLoading, setLanguagesLoading] = useState(false);\n\n  const breakpoint = useBreakpoint();\n\n  const searchEndpoint = `${apiEndpoint}/search`;\n\n  const downloadEndpoint = `${apiEndpoint}/download/`;\n\n  const dataTestIdPrefix = 'C26-TDS';\n\n  // Get params from the current address in the client, but whitelisted by filters to ensure any other values are not converted\n  const parsedUrlParams =\n    typeof window !== 'undefined' &&\n    queryString.parse(\n      queryString.pick(window?.location?.search, [\n        'freetext',\n        'location',\n        'language',\n        filters.id as string,\n      ]),\n      { arrayFormat: 'comma' }\n    );\n\n  const initialSearchText = parsedUrlParams ? parsedUrlParams?.freetext : '';\n\n  // Initialise listing component data\n  const { fetchData, state } = useListingComponentData<\n    ITechnicalDownloadSearchFormData,\n    IProductDatasheetsResponse\n  >(searchEndpoint, { products: [] });\n\n  // Initialise react-hook-form\n  const {\n    register,\n    handleSubmit,\n    formState: { errors, isSubmitSuccessful },\n    watch,\n    setValue,\n    getValues,\n  } = useForm({\n    defaultValues: {\n      documents: [] as string[],\n      ...parsedUrlParams,\n    } as IFormValues,\n  });\n\n  // is add all checkbox checked\n  const addAllChecked = watch('addAll');\n\n  // country\n  const country = watch('location') as string;\n\n  // create an array of only documents from products data - they come from the api in a complex nested structure\n  const allDocuments = extractDocumentsFromProductsArray(state.data.products);\n\n  // create an array of all unique documents - the same documents can be listed in the 'children' for multiple top-level documents\n  const allUniqueDocuments: IProductDatasheet[] = allDocuments.filter(\n    (value, index, self) =>\n      self.findIndex((obj) => obj.id === value.id) === index\n  );\n\n  // select all documents\n  const selectAllDocuments = () => setSelectedDocuments(allDocuments);\n\n  // remove a document\n  const removeDocument = (documentId: number) =>\n    setSelectedDocuments(\n      selectedDocuments?.filter((document) => document.id !== documentId)\n    );\n\n  // remove all documents\n  const removeAllDocuments = () => setSelectedDocuments([]);\n\n  // Submit handler\n  const onSubmit: SubmitHandler<IFormValues> = async (data, e) => {\n    e?.preventDefault();\n\n    await fetchData(\n      removeObjectKeys(data, [\n        'addAll',\n        ...filters.options.map((filter) => filter.id as string),\n      ])\n    );\n    setSubmittedText(`${data.freetext ?? ''}`);\n    setValue('addAll', null);\n  };\n\n  // A shared function which will get languages and populate the language dropdown accordingly\n  const setLanguages = async (countryItem: IFilter, reset: boolean = true) => {\n    setSelectedLanguage(null);\n    setLanguagesLoading(true);\n    const response = await fetch(\n      `${apiEndpoint}/country/languages/?countryCode=${countryItem.id}&siteCulture=${currentCulture}`\n    );\n    const data = (await response.json()) as IFilter[];\n\n    setLanguageOptions(data?.length ? data : []);\n    setLanguagesLoading(false);\n    // This if statement is used for when this function is called in useEffect() to get languages first time around\n    if (\n      parsedUrlParams &&\n      parsedUrlParams.language &&\n      parsedUrlParams.location &&\n      !reset\n    ) {\n      const language = data.find(\n        (language) => language.id === parsedUrlParams.language\n      );\n      if (language) {\n        setSelectedLanguage(language);\n        setValue('language', language.id as string);\n      }\n    }\n  };\n\n  // user's default country takes precedence, but if that is not being passed then it will use whatever is in the query param\n  useEffect(() => {\n    const initialCountryCode =\n      (parsedUrlParams && parsedUrlParams.location) || defaultCountryCode;\n\n    const initialCountry = countries.find(\n      (country) => country.id === initialCountryCode\n    );\n\n    if (initialCountry) {\n      setSelectedCountry(initialCountry);\n      setValue('location', initialCountry.id as string);\n      setLanguages(initialCountry, false);\n    }\n\n    // Initial state for file categories\n    const initialFileTypes =\n      (parsedUrlParams as ITechnicalDownloadSearchFormData)[\n        filters.id as string\n      ] ?? filters.options.map((option) => option.id as string);\n\n    setValue(filters.id as string, ensureArray(initialFileTypes));\n    setSelectedFileTypes(ensureArray(initialFileTypes));\n\n    // Only do an initial fetch if there is parameters in the query string\n    if (\n      parsedUrlParams &&\n      (parsedUrlParams.freetext || (parsedUrlParams.freetext && initialCountry))\n    ) {\n      fetchData({\n        ...parsedUrlParams,\n        location: initialCountry?.id as string,\n      });\n    }\n  }, []);\n\n  useEffect(() => {\n    document.documentElement.style.overflowY = 'auto';\n  }, []);\n\n  useEffect(() => {\n    if (state.data.products.length) {\n      window.dataLayer.push({\n        event: 'trackingEvent_search_results',\n        event_name_variable: 'search_results',\n        trackingEvent_search_results: {\n          search_type: 'datasheet',\n          search_count: state.data.products.length,\n          search_term: getValues('freetext'),\n          document_type: selectedFileTypes\n            .map((value) => value.toLocaleUpperCase())\n            .sort(),\n          document_language: selectedLanguage?.label ?? languagePlaceholder,\n          document_country: selectedCountry?.label ?? countryPlaceholder,\n        },\n      });\n    }\n  }, [state.data.products]);\n\n  const filterSectionProps = {\n    countries: [{ label: countryPlaceholder, id: '' }, ...countries],\n    countryPlaceholder,\n    filters,\n    onCountryChange: setLanguages,\n    languagePlaceholder,\n    languages: languageOptions,\n    register,\n    selectedLanguage,\n    setSelectedLanguage,\n    selectedCountry,\n    setSelectedCountry,\n    selectedFileTypes,\n    setSelectedFileTypes,\n    setValue,\n    disableLanguageSelection: !country || languagesLoading,\n  };\n\n  return (\n    <section className=\"tw-relative\">\n      <form\n        onSubmit={handleSubmit(onSubmit)}\n        className=\"tw-container tw-grid tw-grid-cols-4 tw-gap-x-xs tw-gap-y-2xl tw-pt-4xl tw-text-black md:tw-grid-cols-6 md:tw-gap-x-md lg:tw-grid-cols-12 lg:tw-pt-5xl\"\n      >\n        <div className=\"tw-col-span-full tw-flex tw-flex-col tw-items-center tw-text-center md:tw-col-span-4 md:tw-col-start-2 lg:tw-col-span-8 xl:tw-col-span-6 xl:tw-col-start-4\">\n          <Text variant=\"hero-headline\">{header}</Text>\n          <Text variant=\"body\" className=\"tw-mt-lg tw-text-grey-80\">\n            {subText}\n          </Text>\n        </div>\n        <div className=\"tw-col-span-full tw-flex tw-flex-col tw-gap-xs\">\n          <Search\n            autoCompleteEndpoint={`${searchEndpoint}/autocomplete?freetext`}\n            dataTestId={`${dataTestIdPrefix}-Search-Input`}\n            setValue={setValue}\n            errors={errors}\n            label={'Search'}\n            name={'freetext'}\n            requiredErrorMessage={requiredErrorMessage}\n            initialValue={\n              Array.isArray(initialSearchText) ? '' : initialSearchText ?? ''\n            }\n            register={register}\n            placeholder={searchLabel}\n          />\n          {/*\n          ---------------------------------------\n          FILTERS MODAL / ACCORDION - MOBILE ONLY\n          ---------------------------------------\n          */}\n          <button\n            aria-label={openLabel}\n            aria-controls=\"filters-modal\"\n            aria-expanded={isMobileFiltersOpen}\n            onClick={() => setIsMobileFiltersOpen(true)}\n            type=\"button\"\n            className=\"tw-flex tw-w-full tw-items-center tw-justify-between tw-rounded-[4px] tw-bg-grey-10 tw-p-xs tw-outline-none xl:tw-hidden\"\n            data-testid={`${dataTestIdPrefix}-Mobile-Filter-Button`}\n          >\n            {filterLabel}\n            <Icon name=\"filter\" />\n          </button>\n          <FullScreenModal\n            closeLabel={closeLabel}\n            title={filterLabel}\n            isOpen={isMobileFiltersOpen}\n            setIsOpen={setIsMobileFiltersOpen}\n          >\n            <div className=\"tw-flex-tw-flex-col tw-p-xs tw-pt-sm\">\n              <FilterSection\n                {...filterSectionProps}\n                dataTestId={dataTestIdPrefix}\n              />\n            </div>\n            <div className=\"tw-mt-auto tw-p-xs\">\n              <Button\n                site={site}\n                buttonClasses=\"tw-w-full\"\n                onClick={(e) => {\n                  e.preventDefault();\n                  const submitHandler = handleSubmit(onSubmit);\n                  submitHandler(e);\n                  setIsMobileFiltersOpen(false);\n                }}\n                label={applyLabel}\n                dataTestId={`${dataTestIdPrefix}-Mobile-Apply-Filter-Button`}\n              />\n            </div>\n          </FullScreenModal>\n          <Text variant=\"body-small\" className=\"tw-block tw-pt-1 xl:tw-hidden\">\n            {allDocuments.length === 0\n              ? noResultsLabel\n              : replaceValuesInLabel(documentsShownLabel, [\n                  allDocuments.length,\n                ])}\n          </Text>\n        </div>\n        {/*\n        -------------------------------------\n        DESKTOP FILTERS / PRODUCT COUNT LABEL\n        -------------------------------------\n        */}\n        {breakpoint &&\n          breakpointsAbove(BreakpointEnum.Large).includes(breakpoint) && (\n            <div className=\"tw-hidden tw-flex-col xl:tw-col-span-3 xl:tw-flex\">\n              <Text variant=\"body-small\" className=\"tw-pb-xs\">\n                {allDocuments.length === 0\n                  ? noResultsLabel\n                  : replaceValuesInLabel(documentsShownLabel, [\n                      allUniqueDocuments.length,\n                    ])}\n              </Text>\n              <div className=\"tw-mb-lg\">\n                <FilterSection\n                  {...filterSectionProps}\n                  dataTestId={dataTestIdPrefix}\n                />\n              </div>\n              <Button\n                site={site}\n                onClick={(e) => {\n                  e.preventDefault();\n                  const submitHandler = handleSubmit(onSubmit);\n                  submitHandler(e);\n                }}\n                variant=\"yellow\"\n                label={applyLabel}\n                dataTestId={`${dataTestIdPrefix}-Desktop-Apply-Filter-Button`}\n              />\n            </div>\n          )}\n        {/*\n        -----------------------------------------------------\n        MAIN TABLE AREA - INCLUDING SECTIONS FOR ERROR STATES\n        -----------------------------------------------------\n        */}\n        <div className=\"tw-col-span-full xl:tw-col-span-9\">\n          {state.loading && (\n            <div className=\"tw-flex tw-w-full tw-justify-center tw-pt-9\">\n              <LoadingSpinner\n                size={SizeEnum.Large}\n                loadingLabel={loadingLabel}\n              />\n            </div>\n          )}\n          {/* USER HAS NOT ENTERED A SEARCH TERM */}\n          {!state.loading &&\n            !state.data.products.length &&\n            !isSubmitSuccessful && (\n              <ListingPlaceholder\n                dataTestId={`${dataTestIdPrefix}-No-Search-Results`}\n                iconName=\"find\"\n                title={noSearchTermHeader}\n                message={noSearchTermText}\n              />\n            )}\n          {/* NO PRODUCT FOUND FOR APPLIED FILTERS / TEXT */}\n          {!state.loading &&\n            isSubmitSuccessful &&\n            state.data.products.length === 0 && (\n              <ListingPlaceholder\n                dataTestId={`${dataTestIdPrefix}-No-Filtered-Results`}\n                title={replaceValuesInLabel(noResultsHeader, [submittedText])}\n                message={noResultsText}\n              />\n            )}\n          {/*\n          --------------------------------\n          MAIN DOCUMENTS TABLE / ACCORDION\n          --------------------------------\n          */}\n          {!state.loading && !!state.data.products.length && (\n            <>\n              <div className=\"tw-flex tw-w-full tw-justify-between tw-pb-xs\">\n                <IconButton\n                  icon={expandAll ? 'decrease' : 'expand'}\n                  onClick={() => setExpandAll(!expandAll)}\n                  label={expandAll ? collapseLabel : expandLabel}\n                  dataTestId={`${dataTestIdPrefix}-${\n                    expandAll ? 'Collapse-All-Button' : 'Expand-All-Button'\n                  }`}\n                />\n                <Checkbox\n                  name=\"addAll\"\n                  onClick={() =>\n                    addAllChecked ? removeAllDocuments() : selectAllDocuments()\n                  }\n                  label={addAllChecked ? removeAllLabel : addAllLabel}\n                  register={register}\n                  dataTestId={`${dataTestIdPrefix}-Add-All-Button`}\n                />\n              </div>\n              <Accordion variant=\"tableItem\">\n                {state.data.products.map(\n                  (product: IProductDatasheets, index: number) => (\n                    <AccordionItem\n                      dataTestId={`${dataTestIdPrefix}-Accordion-Header-${index}`}\n                      key={`${product.name} ${product.productId}`}\n                      buttonClasses={classNames({\n                        'tw-border-t tw-border-grey-20': index === 0,\n                      })}\n                      isOpen={expandAll}\n                      variant=\"tableItem\"\n                      title={product.name}\n                    >\n                      {product.value.map((datasheetsSet, setIndex: number) => (\n                        <div\n                          key={datasheetsSet.name}\n                          className={classNames(\n                            setIndex > 0\n                              ? 'tw-ml-xs lg:tw-ml-sm'\n                              : 'tw-pl-xs lg:tw-pl-sm'\n                          )}\n                        >\n                          <Rows\n                            borderBottom={false}\n                            borderTop={\n                              !product.value[setIndex - 1]?.children.length\n                            }\n                          >\n                            <Text\n                              variant=\"body-14-semibold\"\n                              className=\"tw-py-xs\"\n                            >\n                              {datasheetsSet.name}\n                            </Text>\n                            {datasheetsSet.value.map((datasheet) => (\n                              <DownloadItemRow\n                                dataTestId={dataTestIdPrefix}\n                                selectedDocuments={selectedDocuments}\n                                setSelectedDocuments={setSelectedDocuments}\n                                removeDocument={removeDocument}\n                                key={datasheet.id}\n                                value={datasheet}\n                                label={addLabel}\n                                name={`${datasheet.name} (${datasheet.location} - ${datasheet.language})`}\n                                addLabel={addLabel}\n                                fileUrl={`${downloadEndpoint}merged?selectedFiles=${datasheet.id}`}\n                                cultureCode={datasheet.cultureCode}\n                                fileName={datasheet.fileName}\n                                downloadLabel={downloadLabel}\n                                category={datasheetsSet.name}\n                                register={register}\n                                customerInfo={{\n                                  industryNameForPageLoadTracking,\n                                  regionForPageLoadTracking,\n                                  subIndustryNameForPageLoadTracking,\n                                  targetAudienceForPageLoadTracking,\n                                }}\n                              />\n                            ))}\n                          </Rows>\n                          {!!datasheetsSet.children.length && (\n                            <Accordion variant=\"tableItem\">\n                              {datasheetsSet.children.map(\n                                (\n                                  childSet: IDatasheetTypeSetChildren,\n                                  index\n                                ) => (\n                                  <AccordionItem\n                                    dataTestId={`${dataTestIdPrefix}-Accordion-Content-${index}`}\n                                    key={childSet.name}\n                                    buttonClasses={classNames({\n                                      'tw-border-t tw-border-grey-20':\n                                        index === 0,\n                                    })}\n                                    isOpen={expandAll}\n                                    variant=\"tableItem\"\n                                    title={childSet.name}\n                                  >\n                                    <Rows\n                                      className=\"tw-pl-xs lg:tw-pl-sm\"\n                                      borderTop\n                                      borderBottom={false}\n                                    >\n                                      {childSet.value.map((childDatasheet) => (\n                                        <DownloadItemRow\n                                          dataTestId={`${dataTestIdPrefix}-Datasheet-Item`}\n                                          selectedDocuments={selectedDocuments}\n                                          setSelectedDocuments={\n                                            setSelectedDocuments\n                                          }\n                                          removeDocument={removeDocument}\n                                          key={childDatasheet.id}\n                                          value={childDatasheet}\n                                          label={addLabel}\n                                          name={`${childDatasheet.name} (${childDatasheet.location} - ${childDatasheet.language})`}\n                                          addLabel={addLabel}\n                                          fileUrl={`${downloadEndpoint}merged?selectedFiles=${childDatasheet.id}`}\n                                          cultureCode={\n                                            childDatasheet.cultureCode\n                                          }\n                                          fileName={childDatasheet.fileName}\n                                          downloadLabel={downloadLabel}\n                                          category={datasheetsSet.name}\n                                          register={register}\n                                          customerInfo={{\n                                            industryNameForPageLoadTracking,\n                                            regionForPageLoadTracking,\n                                            subIndustryNameForPageLoadTracking,\n                                            targetAudienceForPageLoadTracking,\n                                          }}\n                                        />\n                                      ))}\n                                    </Rows>\n                                  </AccordionItem>\n                                )\n                              )}\n                            </Accordion>\n                          )}\n                        </div>\n                      ))}\n                    </AccordionItem>\n                  )\n                )}\n              </Accordion>\n            </>\n          )}\n        </div>\n      </form>\n      {/*\n      -----------------\n      EXPANDABLE BANNER\n      -----------------\n      */}\n      {selectedDocuments.length > 0 && (\n        <ExpandableBanner\n          text={replaceValuesInLabel(documentsAddedLabel, [\n            `${selectedDocuments?.length ?? 0}`,\n          ])}\n          dataTestId={dataTestIdPrefix}\n        >\n          <div\n            tabIndex={0}\n            className=\"tw-flex tw-h-full tw-flex-col xl:tw-container xl:tw-grid xl:tw-grid-cols-12 xl:tw-gap-md xl:tw-pt-24\"\n          >\n            <div className=\"tw-order-2 tw-col-span-full xl:tw-order-1 xl:tw-col-span-3\">\n              <div className=\"tw-flex tw-flex-col tw-gap-xs tw-bg-white tw-p-xs md:tw-p-md lg:tw-p-xl xl:tw-p-0\">\n                <Button\n                  site={site}\n                  as=\"link\"\n                  href={`${downloadEndpoint}merged?selectedFiles=${selectedDocuments.map(\n                    (doc) => doc.id\n                  )}`}\n                  download\n                  label={downloadAsSingleLabel}\n                  dataTestId={`${dataTestIdPrefix}-Expandable-Banner-Download-Single-Button`}\n                />\n                <Button\n                  as=\"link\"\n                  href={`${downloadEndpoint}compressed?selectedFiles=${selectedDocuments.map(\n                    (doc) => doc.id\n                  )}`}\n                  download\n                  modifier=\"outline\"\n                  variant=\"grey80\"\n                  label={downloadAsMultipleLabel}\n                  dataTestId={`${dataTestIdPrefix}-Expandable-Banner-Download-Multiple-Button`}\n                />\n              </div>\n            </div>\n            <div className=\"tw-col-span-full tw-grow tw-overflow-y-auto tw-px-xs tw-pt-16 md:tw-px-md lg:tw-px-xl xl:tw-order-2 xl:tw-col-span-9 xl:tw-overflow-visible xl:tw-px-0 xl:tw-pb-24 xl:tw-pt-0\">\n              <Rows borderTop>\n                <div className=\"tw-flex tw-justify-between tw-py-xs\">\n                  <Text variant=\"body-14-semibold\">{documentsLabel}</Text>\n                  <button\n                    onClick={() => removeAllDocuments()}\n                    data-testid={`${dataTestIdPrefix}-Expandable-Banner-Remove-All-Button`}\n                  >\n                    <Text\n                      variant=\"body-14-semibold\"\n                      className=\"tw-underline-offset-2 hover:tw-underline\"\n                    >\n                      {removeAllLabel}\n                    </Text>\n                  </button>\n                </div>\n                {selectedDocuments.map((document, index) => (\n                  <div\n                    key={document.id}\n                    className=\"tw-flex tw-justify-between tw-py-xs tw-text-sm\"\n                  >\n                    <Text variant=\"body-small\" className=\"text-grey-80\">\n                      {`${document.name} (${document.location} - ${document.language})`}\n                    </Text>\n                    <button\n                      type=\"button\"\n                      onClick={() => removeDocument(document.id)}\n                      data-testid={`${dataTestIdPrefix}-Expandable-Banner-Document-Remove-Button-${index}`}\n                    >\n                      <Text\n                        variant=\"body-small\"\n                        className=\"tw-underline-offset-2 hover:tw-underline\"\n                      >\n                        {removeLabel}\n                      </Text>\n                    </button>\n                  </div>\n                ))}\n              </Rows>\n            </div>\n          </div>\n        </ExpandableBanner>\n      )}\n    </section>\n  );\n};\n\nexport default TechnicalDownloadSearchPage;\n","import { ITechnicalDownloadSearch } from '@models/ITechnicalDownloadSearch';\nimport SiteEnum from '@models/enums/SiteEnum';\nimport SharedTechnicalDownloadSearch from '@organisms/TechnicalDownloadSearch/TechnicalDownloadSearch';\n\nconst TechnicalDownloadSearch = (props: ITechnicalDownloadSearch) => (\n  <SharedTechnicalDownloadSearch {...props} site={SiteEnum.B2B} />\n);\n\nexport default TechnicalDownloadSearch;\n","interface IHighlightedResult {\n  readonly result: string;\n  readonly match: string;\n}\n\nconst HighlightedResult = ({ result, match }: IHighlightedResult) => {\n  const matchIndex = result.toLowerCase().indexOf(match.toLowerCase());\n\n  const startString = result.substring(0, matchIndex);\n  const matchString = result.substring(matchIndex, matchIndex + match.length);\n  const endString = result.substring(matchIndex + match.length, result.length);\n\n  return (\n    <>\n      {startString && <span className=\"tw-text-grey-70\">{startString}</span>}\n      <span>{matchString}</span>\n      {endString && <span className=\"tw-text-grey-70\">{endString}</span>}\n    </>\n  );\n};\n\nexport default HighlightedResult;\n","import Icon from '@atoms/Icon/Icon';\nimport LoadingSpinner from '@atoms/LoadingSpinner/LoadingSpinner';\nimport Text from '@atoms/Text/Text';\nimport { ErrorMessage } from '@hookform/error-message';\nimport { ISearch } from '@models/ISearch';\nimport SizeEnum from '@models/enums/SizeEnum';\nimport classNames from 'classnames';\nimport { useCombobox } from 'downshift';\nimport { debounce } from 'lodash';\nimport { useEffect, useRef, useState } from 'react';\nimport { useAsyncList } from 'react-stately';\nimport HighlightedResult from './HighlightedResult';\n\nconst Search = ({\n  autoCompleteEndpoint,\n  autoFocus = false,\n  backgroundColor = 'tw-bg-white dark:tw-bg-grey-10',\n  dataTestId,\n  errors,\n  initialValue,\n  label,\n  large = false,\n  list,\n  name = '',\n  predictiveCharacterLength = 3,\n  register,\n  requiredErrorMessage,\n  searchClasses,\n  setValue,\n  darkMode = false,\n  onAutoCompleteSelect,\n  clearSearch,\n  ...rest\n}: ISearch) => {\n  const [inputValue, setInputValue] = useState<string>('');\n\n  const suggestions = useAsyncList<string, string>({\n    async load({ signal, filterText }) {\n      if (list) {\n        return {\n          items: list,\n        };\n      } else if (filterText && filterText.length >= predictiveCharacterLength) {\n        const res = await fetch(`${autoCompleteEndpoint}=${filterText}`, {\n          signal,\n        });\n\n        const json = await res.json();\n\n        return {\n          items: json,\n        };\n      }\n\n      return {\n        items: [],\n      };\n    },\n  });\n\n  const { items, isLoading } = suggestions;\n\n  const debouncedValueChange = useRef(\n    debounce(async ({ inputValue }) => {\n      suggestions.setFilterText(inputValue ?? '');\n      setValue?.(name ?? '', inputValue ?? '', { shouldValidate: true });\n      setInputValue(inputValue ?? '');\n    }, 500)\n  ).current;\n\n  const {\n    isOpen,\n    getLabelProps,\n    getMenuProps,\n    getToggleButtonProps,\n    getInputProps,\n    highlightedIndex,\n    getItemProps,\n    selectedItem,\n    reset,\n  } = useCombobox({\n    onInputValueChange: debouncedValueChange,\n    initialInputValue: initialValue ?? '',\n    items,\n  });\n\n  useEffect(() => {\n    selectedItem && onAutoCompleteSelect?.(selectedItem);\n  }, [selectedItem]);\n\n  const showDropdown =\n    isOpen && inputValue.length >= predictiveCharacterLength && !!items.length;\n\n  const hasErrors = errors && name in errors;\n\n  useEffect(() => {\n    if (clearSearch && clearSearch > 0) reset();\n  }, [clearSearch]);\n\n  return (\n    <div className=\"tw-relative\">\n      <div\n        className={classNames(\n          'tw-group tw-flex tw-w-full tw-flex-col tw-rounded tw-border tw-bg-transparent tw-px-xs tw-py-4',\n          large ? 'tw-text-xl tw-font-light' : 'tw-text-base',\n          {\n            'tw-border-red': errors && name in errors,\n            'tw-border-grey-60 focus-within:tw-border-black':\n              !hasErrors && !darkMode,\n            'tw-border-grey-30  focus-within:tw-border-white':\n              !hasErrors && darkMode,\n          },\n          backgroundColor,\n          searchClasses\n        )}\n      >\n        <label htmlFor={name} className=\"tw-sr-only\" {...getLabelProps()}>\n          {label}\n        </label>\n        <div className=\"tw-flex tw-gap-0.5\">\n          <input\n            value=\"initial\"\n            type=\"text\"\n            autoFocus={autoFocus}\n            className={classNames(\n              'tw-w-full tw-grow tw-bg-transparent tw-outline-none',\n              darkMode && 'placeholder:tw-text-grey-30'\n            )}\n            {...rest}\n            {...getInputProps()}\n            onKeyDown={(e) => {\n              // Workaround to allow form submission when nothing in dropdown is selected\n              if (\n                e.key !== 'Enter' ||\n                highlightedIndex > -1 ||\n                !onAutoCompleteSelect\n              ) {\n                getInputProps()?.onKeyDown?.(e);\n              }\n            }}\n            data-testid={dataTestId}\n          />\n          {/* tw-hidden input - the input above cannot accept both register() and getInputProps(),\n              so we have another input registered and we set its value on line 48 when the shown one changes\n              this ensures correct form integration with react-hook-form */}\n          <input\n            className=\"tw-hidden\"\n            {...register?.(name, { required: requiredErrorMessage })}\n          />\n          <button\n            aria-label=\"search\"\n            type=\"submit\"\n            className={classNames(\n              inputValue ? 'tw-text-black' : 'tw-text-grey-70',\n              'tw-ml-4'\n            )}\n            {...getToggleButtonProps()}\n            data-testid={dataTestId ? `${dataTestId}-Search-Button` : undefined}\n          >\n            <Icon\n              name=\"magnifier\"\n              size={large ? '1.5rem' : '1.125rem'}\n              className={darkMode ? 'tw-fill-white' : 'tw-fill-grey-70'}\n            />\n          </button>\n        </div>\n      </div>\n      <ul\n        className={classNames(\n          { 'tw-hidden': !((showDropdown || isLoading) && isOpen) },\n          'tw-absolute tw-z-40 tw-mt-2 tw-w-full tw-overflow-y-auto tw-rounded tw-border tw-border-grey-30 tw-bg-white tw-p-0 tw-shadow-md tw-transition-all',\n          darkMode && 'tw-text-black',\n          large ? 'tw-max-h-40' : 'tw-max-h-80'\n        )}\n        {...getMenuProps()}\n      >\n        {isLoading ? (\n          <div className=\"tw-flex tw-h-36 tw-w-full tw-items-center tw-justify-center\">\n            <LoadingSpinner loadingLabel=\"loading\" size={SizeEnum.Medium} />\n          </div>\n        ) : (\n          showDropdown &&\n          items.map((item, index) => {\n            return (\n              <li\n                className={classNames(\n                  highlightedIndex === index && 'tw-bg-grey-10',\n                  'tw-px-xs tw-py-[14px]'\n                )}\n                key={`${item}-list-item`}\n                {...getItemProps({ item, index })}\n                data-testid={\n                  dataTestId\n                    ? `${dataTestId}-Search-Result-Item-${index}`\n                    : undefined\n                }\n              >\n                <HighlightedResult result={item} match={inputValue} />\n              </li>\n            );\n          })\n        )}\n      </ul>\n      {requiredErrorMessage && errors && (\n        <ErrorMessage\n          errors={errors}\n          name=\"freetext\"\n          render={({ message }) => (\n            <Text variant=\"label-12\" className=\"tw-text-red\">\n              {message}\n            </Text>\n          )}\n        />\n      )}\n    </div>\n  );\n};\n\nexport default Search;\n"],"names":["token","singleMatcher","RegExp","multiMatcher","decodeComponents","components","split","decodeURIComponent","join","length","left","slice","right","Array","prototype","concat","call","decode","input","tokens","match","i","decodeUriComponent","encodedURI","TypeError","replaceMap","exec","result","entries","Object","keys","key","replace","customDecodeURIComponent","splitOnFirst","string","separator","separatorIndex","indexOf","includeKeys","object","predicate","isArray","descriptor","getOwnPropertyDescriptor","enumerable","defineProperty","Reflect","ownKeys","isNullOrUndefined","value","strictUriEncode","encodeURIComponent","x","charCodeAt","toString","toUpperCase","encodeFragmentIdentifier","Symbol","validateArrayFormatSeparator","encode","options","strict","keysSorter","sort","a","b","Number","map","removeHash","hashStart","parseValue","parseNumbers","isNaN","trim","parseBooleans","toLowerCase","extract","queryStart","parse","query","arrayFormat","arrayFormatSeparator","formatter","accumulator","undefined","includes","isEncodedArray","newValue","item","test","arrayValue","flat","parserForArrayFormat","returnValue","create","parameter","parameter_","key2","value2","reduce","Boolean","stringify","shouldFilter","skipNull","skipEmptyString","index","keyValueSep","encoderForArrayFormat","objectCopy","filter","parseUrl","url","url_","hash","parseFragmentIdentifier","fragmentIdentifier","stringifyUrl","queryString","getHash","urlObjectForFragmentEncode","URL","pick","exclude","useModal","isOpen","setIsOpen","targetRef","usePreventScroll","isDisabled","useEffect","window","current","activeElement","document","body","modalElement","focusableElements","querySelectorAll","firstElement","lastElement","handleTabKeyPress","event","shiftKey","preventDefault","focus","handleEscapeKeyPress","addEventListener","removeEventListener","slideTransition","duration","ease","fadeTransition","delay","fadeInUp","hidden","opacity","y","transition","visible","type","stiffness","damping","fadeInUpSlow","fadeIn","_ref","mountId","children","containerElement","useMemo","createElement","getElementById","appendChild","removeChild","createPortal","isScrollLocked","documentElementScroll","documentElement","style","getPropertyValue","cacheLocator","scrollY","throttledSetScrollY","throttle","setProperty","scrollbarGutter","overflowY","position","top","scrollTo","Math","abs","parseInt","apiEndpoint","initialData","arguments","pushToUrl","state","setState","useState","data","loading","error","isInitialData","fetchData","async","requestQueryString","formData","response","fetch","ok","Error","status","json","currentUrl","location","href","searchParams","forEach","set","history","pushState","func","limit","lastFunc","lastRan","_len","args","_key","context","this","clearTimeout","setTimeout","Date","now","apply","checked","dataTestId","hideLabelOnMobile","indeterminate","label","labelClasses","onChange","register","richTextLabel","props","React","className","classNames","_extends","name","e","viewBox","points","Text","variant","dangerouslySetInnerHTML","__html","icon","onClick","Component","Icon","closeLabel","site","SiteEnum","B2B","title","useRef","AnimatePresence","Portal","motion","div","initial","animate","exit","role","ref","tabIndex","id","size","borderTop","borderBottom","containerClasses","text","setOpen","bodyScrollLock","height","rotate","mode","FocusTrap","focusTrapOptions","preventScroll","allowOutsideClick","products","extractedDatasheetsArray","extractDatasheetsFromValueArray","filesArray","push","product","datasheetsTypeSet","datasheetChildset","removeObjectKeys","excludedKeys","objectWithKeysRemoved","hasOwnProperty","selectedDocuments","setSelectedDocuments","removeDocument","addLabel","fileName","fileUrl","cultureCode","downloadLabel","category","customerInfo","target","rel","dataLayer","event_name_variable","trackingEvent_file_download","document_name","language_for_document","document_type","customer_info","user_industry","industryNameForPageLoadTracking","user_sub_industry","subIndustryNameForPageLoadTracking","user_region","regionForPageLoadTracking","target_audience","targetAudienceForPageLoadTracking","Checkbox","isChecked","JSON","countries","countryPlaceholder","disableLanguageSelection","filters","onCountryChange","languagePlaceholder","languages","selectedLanguage","setSelectedLanguage","selectedCountry","setSelectedCountry","selectedFileTypes","setSelectedFileTypes","setValue","Select","displayLabel","onSelectedItemChange","placeholder","selectedItem","VariantTypeEnum","Primary","disabled","filterId","String","onCheckboxChange","prevFileTypes","parsedFilterId","addAllLabel","applyLabel","collapseLabel","currentCulture","defaultCountryCode","documentsAddedLabel","documentsLabel","documentsShownLabel","downloadAsMultipleLabel","downloadAsSingleLabel","expandLabel","filterLabel","header","loadingLabel","noResultsHeader","noResultsLabel","noResultsText","noSearchTermHeader","noSearchTermText","openLabel","removeAllLabel","removeLabel","requiredErrorMessage","searchLabel","subText","expandAll","setExpandAll","submittedText","setSubmittedText","isMobileFiltersOpen","setIsMobileFiltersOpen","languageOptions","setLanguageOptions","languagesLoading","setLanguagesLoading","breakpoint","useBreakpoint","searchEndpoint","downloadEndpoint","dataTestIdPrefix","parsedUrlParams","search","initialSearchText","freetext","useListingComponentData","handleSubmit","formState","errors","isSubmitSuccessful","watch","getValues","useForm","defaultValues","documents","addAllChecked","country","allDocuments","extractDocumentsFromProductsArray","allUniqueDocuments","self","findIndex","obj","documentId","removeAllDocuments","onSubmit","setLanguages","countryItem","reset","language","find","initialCountryCode","initialCountry","initialFileTypes","option","ensureArray","trackingEvent_search_results","search_type","search_count","search_term","toLocaleUpperCase","document_language","document_country","filterSectionProps","Search","autoCompleteEndpoint","initialValue","FullScreenModal","FilterSection","Button","buttonClasses","submitHandler","replaceValuesInLabel","breakpointsAbove","BreakpointEnum","Large","LoadingSpinner","SizeEnum","ListingPlaceholder","iconName","message","Fragment","IconButton","Accordion","AccordionItem","productId","datasheetsSet","setIndex","Rows","datasheet","DownloadItemRow","childSet","childDatasheet","ExpandableBanner","as","doc","download","modifier","SharedTechnicalDownloadSearch","matchIndex","startString","substring","matchString","endString","autoFocus","backgroundColor","large","list","predictiveCharacterLength","searchClasses","darkMode","onAutoCompleteSelect","clearSearch","rest","inputValue","setInputValue","suggestions","useAsyncList","load","_ref2","signal","filterText","items","res","isLoading","debouncedValueChange","debounce","_ref3","setFilterText","shouldValidate","getLabelProps","getMenuProps","getToggleButtonProps","getInputProps","highlightedIndex","getItemProps","useCombobox","onInputValueChange","initialInputValue","showDropdown","hasErrors","htmlFor","onKeyDown","required","Medium","HighlightedResult","ErrorMessage","render","_ref4"],"sourceRoot":""}