{"version":3,"file":"main.BlfNKk-U.js","sources":["../../../Frontend/src/scripts/1-base/_helpers.ts","../../../Frontend/src/scripts/2-functions/_cookieBot.ts","../../../Frontend/src/scripts/2-functions/_readSpeaker.ts","../../../Frontend/src/scripts/2-functions/_live-filter.ts","../../../Frontend/src/scripts/2-functions/_page-listing-filter.ts","../../../Frontend/src/scripts/2-functions/_animateHeight.ts","../../../Frontend/src/scripts/2-functions/_getFocusableElements.ts","../../../Frontend/src/scripts/2-functions/_focusTrap.ts","../../../Frontend/src/components/HorizontalScroller/HorizontalScroller.Module.ts","../../../Frontend/src/scripts/2-functions/_statistics-content-switcher.ts","../../../Frontend/src/scripts/2-functions/_extellio.ts","../../../Frontend/src/scripts/2-functions/_sortTable.ts","../../../Frontend/src/scripts/2-functions/_showMore.ts","../../../Frontend/node_modules/lodash.debounce/index.js","../../../Frontend/src/components/Navbar/Navbar.Module.ts","../../../Frontend/src/components/Menu/Menu.Module.ts","../../../Frontend/src/components/MenuToggle/MenuToggle.Module.ts","../../../Frontend/src/components/Shortcuts/Shortcuts.Module.ts","../../../Frontend/src/components/ScrollToTop/ScrollToTop.Module.ts","../../../Frontend/src/components/Table/Table.Module.ts","../../../Frontend/src/components/AlphabetFilter/AlphabetFilter.Module.ts","../../../Frontend/src/components/Accordion/Accordion.Module.ts","../../../Frontend/src/components/DiseaseItem/DiseaseItem.Module.ts","../../../Frontend/src/components/ShowMore/ShowMore.Module.ts","../../../Frontend/src/components/Tabs/Tabs.Module.ts","../../../Frontend/src/components/index.ts","../../../Frontend/src/main.ts"],"sourcesContent":["import { Args, StoryFn } from \"@storybook/html\";\r\n\r\nexport const createComponentStory = (Template: StoryFn, args: Args) => {\r\n const templateFunc: StoryFn = Template.bind({});\r\n templateFunc.args = args;\r\n\r\n return templateFunc;\r\n};\r\n\r\nexport const fireDomReady = () => {\r\n const event = new CustomEvent(\"fireDomReady\");\r\n document.dispatchEvent(event);\r\n};\r\n\r\nexport const domReady = (cb: () => void) => {\r\n document.addEventListener(\"DOMContentLoaded\", cb);\r\n};\r\n\r\nexport const attachPrintButtonEvent = () => {\r\n const printBtn: HTMLButtonElement | null =\r\n document.querySelector(\".print-button\");\r\n\r\n if (printBtn) {\r\n printBtn.addEventListener(\"click\", () => {\r\n window.print();\r\n });\r\n }\r\n};\r\n\r\n// Generic keyboard event handler, invoking \"cb\" if e.code matches \"keyCode\"\r\nexport const useKeyHandler = (\r\n keyCode: KeyboardEvent[\"code\"],\r\n cb: () => void\r\n): void => {\r\n const handleKeydown = (e: KeyboardEvent) => {\r\n if (e.code === keyCode) {\r\n cb();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleKeydown);\r\n};\r\n\r\n// Check if JS is disabled\r\nexport const isJsDisabled = () => document.body.classList.contains(\"no-js\");\r\n\r\n// Add/update query params in URL\r\nexport const setURLSearchParams = (key: string, value: string) => {\r\n const params = new URLSearchParams(window.location.search);\r\n params.set(key, value);\r\n window.history.pushState({}, \"\", `${location.pathname}?${params}`);\r\n};\r\n\r\n// Get query string params that match `keys` and construct into object: { key: value[] }\r\nexport const getQueryStringParamsAsKeyValuePair = (keys: string[]) => {\r\n const params = new URLSearchParams(window.location.search);\r\n\r\n return keys.reduce((acc, key) => {\r\n const paramsByKey = params.getAll(key);\r\n\r\n return {\r\n ...(paramsByKey.length > 0 && { [key]: params.getAll(key) }),\r\n ...acc,\r\n };\r\n }, {}) as Record;\r\n};\r\n\r\nexport const attachHistoryBackLinkEvent = () => {\r\n const historyBackLinks = document.querySelectorAll(\".js-history-back-link\");\r\n\r\n historyBackLinks?.forEach((link) =>\r\n link.addEventListener(\"click\", (e) => {\r\n e.preventDefault();\r\n history.back();\r\n })\r\n );\r\n};\r\n\r\n// Check the screens size and return true if it is mobile\r\nexport const getDeviceInfo = () => {\r\n const mobileScreenSize = 768;\r\n const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n const isMobile = screenWidth <= mobileScreenSize; // You can adjust the threshold based on your needs\r\n\r\n return { isMobile };\r\n};","/*\r\n Scripts specific to CookieBot (https://www.cookiebot.com/) implementation. \r\n\r\n*/\r\n\r\nimport { domReady } from \"../../scripts\";\r\n\r\nexport const showCookieBanner = () => window?.Cookiebot?.show();\r\n\r\n/*\r\n Expands details view in CookieBot panel, with more information on active cookies\r\n*/\r\nexport const showCookieBannerDetails = () => {\r\n window?.Cookiebot?.renew();\r\n\r\n setTimeout(() => {\r\n const cookieBanner = document.getElementById(\"CookieBanner\");\r\n\r\n if (cookieBanner) {\r\n const detailsToggle = document.querySelector(\r\n \".cookiebanner__details-toggle\"\r\n );\r\n\r\n cookieBanner.classList.add(\"is-details-open\");\r\n\r\n if (detailsToggle) {\r\n detailsToggle.setAttribute(\"aria-expanded\", \"true\");\r\n detailsToggle.textContent = detailsToggle.getAttribute(\"data-details-close\");\r\n cookieBanner.style.overflowY = \"scroll\";\r\n }\r\n }\r\n }, 300);\r\n};\r\n\r\nexport const attachShowCookieBannerDetailsEvent = () => {\r\n const showCookieBannerBtns = document.querySelectorAll(\r\n \".js-show-cookie-banner-details\"\r\n ) as NodeListOf;\r\n\r\n if (showCookieBannerBtns.length > 0) {\r\n showCookieBannerBtns.forEach((btn) =>\r\n btn.addEventListener(\"click\", () => {\r\n if (window.Cookiebot) {\r\n showCookieBannerDetails();\r\n }\r\n })\r\n );\r\n }\r\n};\r\n\r\nexport type CookieConsentCategories =\r\n | \"necessary\"\r\n | \"preferences\"\r\n | \"statistics\";\r\n\r\n// Utility function for checking current consent state by category\r\nexport const getCookieConsentByCategory = (category: CookieConsentCategories) =>\r\n window?.Cookiebot?.consent[category];\r\n\r\n// Used by ReadSpeaker to highlight CookieBot preference panel\r\nexport const highlightPreferencePanel = () => {\r\n setTimeout(() => {\r\n const panel = document.getElementById(\"cookiebanner-preference-pref\");\r\n\r\n if (panel) {\r\n panel.classList.add(\"cookiebanner__preference--highlight\");\r\n }\r\n }, 200);\r\n};\r\n\r\ndomReady(() => {\r\n attachShowCookieBannerDetailsEvent();\r\n});\r\n","/*\r\n Script module for initiating and triggering ReadSpeaker\r\n*/\r\n\r\nimport {\r\n getCookieConsentByCategory,\r\n showCookieBannerDetails,\r\n highlightPreferencePanel,\r\n} from \"./_cookieBot\";\r\n\r\nconst readSpeakerConf = {\r\n general: {\r\n usePost: true,\r\n },\r\n ui: {\r\n displayDownload: false,\r\n tools: {\r\n voicesettings: false,\r\n readhover: false,\r\n enlarge: false,\r\n simpleview: false,\r\n pagemask: false,\r\n translation: false,\r\n lookup: false,\r\n help: false,\r\n },\r\n },\r\n};\r\n\r\nconst ReadSpeaker = () => {\r\n const readSpeakerBtns = document.querySelectorAll(\r\n \".read-speaker\"\r\n ) as NodeListOf;\r\n\r\n const getInitializedState = () =>\r\n typeof window.ReadSpeaker === \"object\" &&\r\n typeof window.readpage === \"function\";\r\n\r\n const getScriptSrc = () => {\r\n let scriptSrc =\r\n \"//cdn1.readspeaker.com/script/11438/webReader/webReader.js?pids=wr&jit=1\";\r\n\r\n const hasDocReaderClass = Array.from(readSpeakerBtns).some(\r\n ({ classList }) => classList.contains(\"rs_docreader\")\r\n );\r\n\r\n return hasDocReaderClass\r\n ? (scriptSrc += \"&dload=DocReader.AutoAdd\")\r\n : scriptSrc;\r\n };\r\n\r\n const checkIfScriptIsLoadedInHead = () => {\r\n const scriptSrc = getScriptSrc();\r\n const scripts = document.getElementsByTagName(\"script\");\r\n let scriptLoaded = false;\r\n\r\n Array.from(scripts).map((script) => {\r\n if (script.src === `https:${scriptSrc}`) {\r\n scriptLoaded = true;\r\n }\r\n });\r\n\r\n return scriptLoaded;\r\n };\r\n\r\n const loadReadSpeakerScript = (scriptSrc: string) => {\r\n return new Promise((resolve, reject) => {\r\n const readSpeakerScriptLoaded = checkIfScriptIsLoadedInHead();\r\n\r\n if (readSpeakerScriptLoaded) {\r\n resolve(\"ReadSpeaker script loaded\");\r\n } else {\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = scriptSrc;\r\n document.head.appendChild(script);\r\n\r\n script.addEventListener(\"load\", () => {\r\n if (\r\n typeof window.ReadSpeaker === \"object\" &&\r\n typeof window.readpage === \"function\"\r\n ) {\r\n resolve(\"ReadSpeaker script loaded\");\r\n } else {\r\n reject(new Error(\"ReadSpeaker script did not load properly\"));\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n const triggerReadPage = (btn: Element) => {\r\n const href = btn.getAttribute(\"href\") ?? \"/\";\r\n\r\n const userHasConsentedToPreferencesCookies =\r\n getCookieConsentByCategory(\"preferences\");\r\n\r\n if (!userHasConsentedToPreferencesCookies) {\r\n showCookieBannerDetails();\r\n highlightPreferencePanel();\r\n } else {\r\n if (typeof window.readpage === \"function\") {\r\n if (btn.id === \"\") {\r\n window.readpage(href, \"readspeaker\");\r\n } else {\r\n window.readpage(href, \"readspeaker__\" + btn.id);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const init = async () => {\r\n const isInitialized = getInitializedState();\r\n if (!isInitialized) {\r\n const scriptSrc = getScriptSrc();\r\n\r\n // Add ReadSpeaker settings to window\r\n window.rsConf = {\r\n params: scriptSrc,\r\n ...readSpeakerConf,\r\n };\r\n window.rsDocReaderConf = {\r\n lang: \"sv_se\",\r\n img_alt: \"Öppna detta dokument med ReadSpeaker docReader\",\r\n };\r\n\r\n try {\r\n let userHasConsentedToPreferencesCookies =\r\n getCookieConsentByCategory(\"preferences\");\r\n\r\n if (!userHasConsentedToPreferencesCookies) {\r\n // User hasn't accepted preferences cookies:\r\n // Add event listener for when consent is given and check if it includes preference cookies\r\n // If yes we add script and initialize\r\n window.addEventListener(\"CookiebotOnAccept\", async () => {\r\n userHasConsentedToPreferencesCookies =\r\n getCookieConsentByCategory(\"preferences\");\r\n\r\n if (userHasConsentedToPreferencesCookies) {\r\n await loadReadSpeakerScript(scriptSrc);\r\n window?.ReadSpeaker?.init();\r\n }\r\n });\r\n } else {\r\n await loadReadSpeakerScript(scriptSrc);\r\n window?.ReadSpeaker?.init();\r\n }\r\n\r\n readSpeakerBtns.forEach((btn) => {\r\n btn.addEventListener(\"click\", (e: Event) => {\r\n e.preventDefault();\r\n triggerReadPage(btn);\r\n });\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { ReadSpeaker };\r\n","/*\r\n Common filter logic for handling change events on filter inputs and query parameters\r\n See stories/5-filter for more documentation on this module\r\n*/\r\n\r\nconst LiveFilter = (\r\n // Query string key for filter values\r\n filterKey: string,\r\n // HTMLInput triggers (checkboxes or radios) for filter\r\n triggers: NodeListOf | HTMLInputElement[],\r\n // Btn for clearing all filter values under filterKey\r\n clearBtn?: HTMLButtonElement,\r\n // Callback to run on each filter update\r\n onUpdate?: () => void\r\n) => {\r\n /*\r\n * @param e: Event (Change event on filter HTMLInput)\r\n */\r\n const updateFilter = (e: Event) => {\r\n const currentTarget = e.currentTarget as HTMLInputElement;\r\n const { value } = currentTarget;\r\n\r\n // Add or remove filter value\r\n currentTarget.checked ? addFilterValue(value) : deleteFilterValue(value);\r\n\r\n // Trigger optional callback\r\n onUpdate && onUpdate();\r\n // Trigger custom event that other functions can hook into\r\n const event = new CustomEvent(\"livefilterUpdated\");\r\n document.dispatchEvent(event);\r\n };\r\n\r\n /*\r\n * @param value: string (Value from input that triggered change event)\r\n */\r\n const addFilterValue = (value: string) => {\r\n const params = new URLSearchParams(window.location.search);\r\n // If there's already a filter w/ this key in URL we append, except for 'sort'\r\n if (params.has(filterKey) && filterKey.indexOf(\"sort\") === -1) {\r\n // Don't add a filter that already exists\r\n if (!params.getAll(filterKey).includes(value)) {\r\n params.append(filterKey, value);\r\n }\r\n } else {\r\n // Otherwise we set filterKey and value\r\n params.set(filterKey, value);\r\n }\r\n\r\n // Update URL\r\n window.history.pushState({}, \"\", `${location.pathname}?${params}`);\r\n };\r\n\r\n /*\r\n * @param value: string (Value from input that triggered change event)\r\n */\r\n const deleteFilterValue = (value: string) => {\r\n const params = new URLSearchParams(window.location.search);\r\n const newParams = params\r\n .getAll(filterKey)\r\n .filter((param) => param !== value);\r\n\r\n params.delete(filterKey);\r\n newParams.map((param, i) => {\r\n i === 0 ? params.set(filterKey, param) : params.append(filterKey, param);\r\n });\r\n\r\n // Update URL\r\n window.history.pushState({}, \"\", `${location.pathname}?${params}`);\r\n };\r\n\r\n const deleteAllFilterValues = () => {\r\n const params = new URLSearchParams(window.location.search);\r\n\r\n params.delete(filterKey);\r\n // Update URL\r\n window.history.pushState({}, \"\", `${location.pathname}?${params}`);\r\n };\r\n\r\n const clearFilter = () => {\r\n // Reset trigger states\r\n triggers.forEach((trigger) => {\r\n if (trigger.checked) {\r\n trigger.checked = false;\r\n }\r\n });\r\n\r\n // Delete filter query values\r\n deleteAllFilterValues();\r\n\r\n // Dispatch event to trigger onUpdate\r\n const changeEvent = new Event(\"change\");\r\n triggers[0].dispatchEvent(changeEvent);\r\n };\r\n\r\n const init = () => {\r\n if (triggers?.length > 0) {\r\n triggers.forEach((trigger) =>\r\n trigger.addEventListener(\"change\", updateFilter)\r\n );\r\n }\r\n if (clearBtn) {\r\n clearBtn.addEventListener(\"click\", clearFilter);\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { LiveFilter };\r\n","/**\r\n Script module used for filtering page listing results\r\n See stories/5-filter for more documentation on this module\r\n */\r\n\r\nimport axios from \"axios\";\r\nimport { LiveFilter } from \"./_live-filter\";\r\nimport { FilterCheckboxProps } from \"@/components/FilterCheckbox\";\r\n\r\nimport { getQueryStringParamsAsKeyValuePair } from \"@/scripts\";\r\n\r\ninterface PageListingFilterResult {\r\n name: string;\r\n key: string;\r\n filterValues: FilterCheckboxProps[];\r\n}\r\n\r\ninterface PageListingResult {\r\n result: string;\r\n filters: PageListingFilterResult[];\r\n total: number;\r\n success: boolean;\r\n}\r\n\r\nconst PageListingFilter = (filterEl: HTMLDivElement) => {\r\n // Checkboxes that trigger filter\r\n let triggers = Array.from(\r\n filterEl.querySelectorAll(\r\n \".filter-checkbox__checkbox\"\r\n ) as NodeListOf\r\n );\r\n // Keys used in filter fetch request and as query param keys\r\n const filterKeys = filterEl\r\n .getAttribute(\"data-filter-keys\")!\r\n .split(\",\")\r\n .map((key) => key.trim());\r\n // ID of search input element\r\n const searchInputId = filterEl.getAttribute(\"data-search-input-id\") as string;\r\n\r\n // Listen for updates from LiveFilter\r\n const onUpdate = async () => {\r\n const { result, filters, total } = await getFilterUpdate();\r\n\r\n updatePageListingHTML(result);\r\n updateFilters(filters);\r\n updateSnackbarAndSerpHeader(total);\r\n };\r\n\r\n // Fetch result of filter update\r\n const getFilterUpdate = async (): Promise => {\r\n const endpoint = filterEl.getAttribute(\"data-endpoint\")!;\r\n // Get filter params\r\n const activeParams = getQueryStringParamsAsKeyValuePair(filterKeys);\r\n // Get search query param if search input element exists\r\n const searchInput: HTMLInputElement | null = document.getElementById(\r\n searchInputId\r\n ) as HTMLInputElement;\r\n\r\n const r = await axios.get(endpoint, {\r\n params: {\r\n ...activeParams,\r\n ...(searchInput && { [searchInput.name]: searchInput.value }),\r\n },\r\n });\r\n const { data } = r;\r\n\r\n return data;\r\n };\r\n\r\n // Replace page listing and pagination markup w/ updated HTML\r\n const updatePageListingHTML = (updatedListingHTML: string) => {\r\n const filterListingTargetId = filterEl.getAttribute(\r\n \"data-page-listing-id\"\r\n ) as string;\r\n const pageListingContainer = document.getElementById(\r\n filterListingTargetId\r\n ) as HTMLDivElement;\r\n\r\n pageListingContainer.innerHTML = updatedListingHTML;\r\n };\r\n\r\n // Update filters checkboxes w/ new state and filter count\r\n const updateFilters = (filters: PageListingFilterResult[]) => {\r\n // Update filter count\r\n filters.map((filter) => {\r\n filter.filterValues.map((filterValues) => {\r\n const filterCheckboxEl = document.getElementById(\r\n filterValues.id!\r\n ) as HTMLInputElement;\r\n\r\n if (filterCheckboxEl) {\r\n filterCheckboxEl.parentNode!.querySelector(\r\n \".filter-checkbox__count\"\r\n )!.innerHTML = `(${String(filterValues.filterCount)})`;\r\n }\r\n });\r\n });\r\n\r\n // Update filter state\r\n triggers.map((trigger) => {\r\n filters.map((filter) => {\r\n filter.filterValues.map((filterValue) => {\r\n if (filterValue.id === trigger.id) {\r\n if (filterValue.disabled) {\r\n trigger.disabled = true;\r\n } else {\r\n trigger.disabled = false;\r\n }\r\n }\r\n });\r\n });\r\n });\r\n };\r\n\r\n // Update content in snackbar, used for announcing changes in filter to the user\r\n const updateSnackbarAndSerpHeader = (totalHits: number) => {\r\n const snackbar = document.getElementById(\"page-listing-filter-snackbar\");\r\n\r\n // Element for result count in SERP header\r\n const serpHeaderResultCount = document.querySelector(\r\n \".serp-header__result-count\"\r\n ) as HTMLSpanElement;\r\n\r\n if (snackbar) {\r\n const message = snackbar.getAttribute(\"data-message\") as string;\r\n snackbar.innerText = message.replace(/%s/g, String(totalHits));\r\n snackbar.classList.add(\"notification--show\");\r\n\r\n setTimeout(() => {\r\n snackbar.classList.remove(\"notification--show\");\r\n }, 3000);\r\n }\r\n\r\n if (serpHeaderResultCount) {\r\n serpHeaderResultCount.innerText = String(totalHits);\r\n }\r\n };\r\n\r\n const init = () => {\r\n if (triggers?.length > 0 && filterKeys.length > 0) {\r\n // If sort controls exist on page add them to LiveFilter\r\n const sortControls = Array.from(\r\n document.querySelectorAll(\r\n \".sort-controls__control-input\"\r\n ) as NodeListOf\r\n );\r\n triggers =\r\n sortControls.length > 0 ? [...triggers, ...sortControls] : triggers;\r\n\r\n // Initiate a LiveFilter instance for each filterKey\r\n filterKeys.map((filterKey) => {\r\n const filterKeyTriggers = triggers.filter(\r\n (trigger) => trigger.getAttribute(\"name\") === filterKey\r\n );\r\n const filterClearBtn = document.getElementById(\r\n `filter-clear-btn-${filterKey}`\r\n ) as HTMLButtonElement;\r\n\r\n LiveFilter(\r\n filterKey,\r\n filterKeyTriggers,\r\n filterClearBtn,\r\n onUpdate\r\n ).init();\r\n });\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { PageListingFilter };\r\n","/*\r\n Script module with methods for animating height of containers from zero to auto and vice versa.\r\n*/\r\n\r\ninterface Options {\r\n duration?: number; // Transition duration in ms\r\n timing?: string; // Transition timing\r\n}\r\n\r\nenum AnimationState {\r\n None,\r\n Auto,\r\n Zero,\r\n}\r\n\r\nconst AnimateHeight = (el: HTMLElement) => {\r\n const defaultOptions = {\r\n duration: 250,\r\n timing: \"cubic-bezier(.91, .06, .08, .93)\",\r\n };\r\n let orgTransition = \"\";\r\n let state: AnimationState = AnimationState.None;\r\n\r\n const toAutoHeight = ({ duration, timing }: Options = defaultOptions) => {\r\n const style = getComputedStyle(el);\r\n\r\n duration = duration || defaultOptions.duration;\r\n\r\n orgTransition = style.transition;\r\n\r\n const transition = [\r\n orgTransition,\r\n `height ${duration}ms ${timing || defaultOptions.timing}`.trim(),\r\n ]\r\n .filter((t) => t)\r\n .join(\", \");\r\n\r\n state = AnimationState.Auto;\r\n el.style.transition = transition;\r\n el.style.height = style.height;\r\n\r\n const scrollHeight = `${el.scrollHeight}px`;\r\n\r\n requestAnimationFrame(() => (el.style.height = scrollHeight));\r\n\r\n const start = performance.now();\r\n\r\n requestAnimationFrame(function awaitCompletion() {\r\n const height = getComputedStyle(el).height;\r\n\r\n if (performance.now() - start < duration! && height !== scrollHeight) {\r\n requestAnimationFrame(awaitCompletion);\r\n return;\r\n }\r\n });\r\n };\r\n\r\n const toZeroHeight = ({ duration, timing }: Options = defaultOptions) => {\r\n const style = getComputedStyle(el);\r\n\r\n orgTransition = style.transition;\r\n const transition = [\r\n orgTransition,\r\n `height ${duration || defaultOptions.duration}ms ${\r\n timing || defaultOptions.timing\r\n }`.trim(),\r\n ]\r\n .filter((t) => t)\r\n .join(\", \");\r\n\r\n state = AnimationState.Zero;\r\n el.style.transition = transition;\r\n el.style.height = style.height;\r\n\r\n requestAnimationFrame(() => (el.style.height = \"0\"));\r\n };\r\n\r\n const onTransitionEnd = () => {\r\n if (state === AnimationState.Auto) {\r\n el.style.height = \"auto\";\r\n }\r\n\r\n if (state === AnimationState.Zero) {\r\n el.style.height = \"0\";\r\n }\r\n\r\n el.style.transition = orgTransition;\r\n orgTransition = \"\";\r\n state = AnimationState.None;\r\n };\r\n\r\n el.addEventListener(\"transitionend\", onTransitionEnd);\r\n\r\n return {\r\n toAutoHeight,\r\n toZeroHeight,\r\n };\r\n};\r\n\r\nexport { AnimateHeight };\r\n","/*\r\n Utility script used by _focusTrap.ts to get focusable elements\r\n*/\r\n\r\nconst getFocusableElements = (containerElement: HTMLElement) => {\r\n const focusableElementSelectors =\r\n \"input:enabled:not([type='hidden']), select:enabled, a[href], textarea:enabled, button:enabled, [tabindex]\";\r\n const nodeList: NodeListOf = containerElement.querySelectorAll(\r\n focusableElementSelectors\r\n );\r\n const focusableElements: HTMLElement[] = [];\r\n\r\n for (let i = 0; i < nodeList.length; i++) {\r\n focusableElements.push(nodeList[i] as HTMLElement);\r\n }\r\n\r\n return focusableElements;\r\n};\r\n\r\nexport default getFocusableElements;\r\n","/*\r\n Script used to trap focus inside a container\r\n*/\r\n\r\nimport getFocusableElements from \"./_getFocusableElements\";\r\n\r\nconst focusTrap = (containerElement: HTMLElement, setFocusOnFirst = true) => {\r\n const focusableElements = getFocusableElements(containerElement);\r\n const firstFocusableEl = focusableElements[0];\r\n const lastFocusableEl = focusableElements[focusableElements.length - 1];\r\n\r\n const self = {\r\n activate() {\r\n if (setFocusOnFirst && firstFocusableEl) {\r\n firstFocusableEl.focus();\r\n }\r\n containerElement.addEventListener(\"keydown\", self.onKeyDown);\r\n },\r\n deactivate() {\r\n containerElement.removeEventListener(\"keydown\", self.onKeyDown);\r\n containerElement.classList.remove(\"js-focus-visible\");\r\n },\r\n onKeyDown(e: KeyboardEvent) {\r\n const isTabPressed = e.key === \"Tab\";\r\n\r\n if (!isTabPressed && !e.shiftKey) {\r\n containerElement.classList.remove(\"js-focus-visible\");\r\n return;\r\n } else {\r\n containerElement.classList.add(\"js-focus-visible\");\r\n }\r\n\r\n if (!isTabPressed) return;\r\n\r\n if (e.shiftKey) {\r\n /* shift + tab */ if (document.activeElement === firstFocusableEl) {\r\n lastFocusableEl.focus();\r\n e.preventDefault();\r\n }\r\n } /* tab */ else {\r\n if (document.activeElement === lastFocusableEl) {\r\n firstFocusableEl.focus();\r\n e.preventDefault();\r\n }\r\n }\r\n },\r\n };\r\n\r\n return self;\r\n};\r\n\r\nexport { focusTrap };\r\n","import throttle from \"lodash.throttle\";\r\n\r\nconst HorizontalScrollerModule = (el: HTMLElement) => {\r\n const scrollerEl = el.querySelector(\r\n \".horizontal-scroller__scroller\"\r\n ) as HTMLDivElement;\r\n const contentContainer = scrollerEl?.children[0] as HTMLElement;\r\n\r\n // Default values\r\n let scrollPos = 0;\r\n let contentWidth = 0;\r\n let settings = {\r\n scrollPosStart: true,\r\n scrollPosEnd: false,\r\n hasOverflowX: false,\r\n withSwipeIcon: el.getAttribute(\"data-with-swipe-icon\") === \"true\",\r\n };\r\n\r\n const checkScrollPosition = () => {\r\n (scrollPos = Math.ceil(\r\n scrollerEl.scrollLeft + scrollerEl.getBoundingClientRect().width\r\n )),\r\n (contentWidth = contentContainer.scrollWidth);\r\n\r\n settings = {\r\n ...settings,\r\n scrollPosStart: scrollerEl.scrollLeft === 0,\r\n scrollPosEnd: scrollPos >= contentWidth,\r\n hasOverflowX: scrollerEl.getBoundingClientRect().width < contentWidth,\r\n };\r\n };\r\n\r\n const checkOverflow = () => {\r\n settings.hasOverflowX = el.offsetWidth < contentContainer?.scrollWidth;\r\n checkScrollPosition();\r\n\r\n if (settings.hasOverflowX) {\r\n toggleOverflowIndicatorsVisibility();\r\n }\r\n\r\n if (settings.withSwipeIcon) {\r\n toggleSwipeIconVisibility(settings.hasOverflowX);\r\n }\r\n };\r\n\r\n const toggleSwipeIconVisibility = (visible: boolean) => {\r\n el.classList.toggle(\"horizontal-scroller--with-swipe-icon\", visible);\r\n };\r\n\r\n const toggleOverflowIndicatorsVisibility = () => {\r\n el.classList.toggle(\r\n \"horizontal-scroller--overflow-right\",\r\n !settings.scrollPosEnd && settings.hasOverflowX\r\n );\r\n el.classList.toggle(\r\n \"horizontal-scroller--overflow-left\",\r\n !settings.scrollPosStart\r\n );\r\n };\r\n\r\n const handleScroll = () => {\r\n checkScrollPosition();\r\n toggleSwipeIconVisibility(false);\r\n\r\n toggleOverflowIndicatorsVisibility();\r\n };\r\n\r\n const handleResize = () => {\r\n checkOverflow();\r\n checkScrollPosition();\r\n toggleOverflowIndicatorsVisibility();\r\n };\r\n\r\n const init = () => {\r\n checkOverflow();\r\n\r\n window.addEventListener(\"resize\", throttle(handleResize, 100));\r\n scrollerEl.addEventListener(\"scroll\", throttle(handleScroll, 100));\r\n\r\n // Used to determine placement of swipe icon\r\n if (el.clientHeight > 1400) {\r\n el.classList.add(\"horizontal-scroller--tall\");\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nconst initiateHorizontalScrollers = (container: HTMLElement | Document) => {\r\n const horizontalScrollerEls = container.querySelectorAll(\r\n \".horizontal-scroller\"\r\n );\r\n\r\n horizontalScrollerEls?.forEach((el) =>\r\n HorizontalScrollerModule(el as HTMLElement).init()\r\n );\r\n};\r\n\r\nexport { HorizontalScrollerModule, initiateHorizontalScrollers };\r\n","/**\r\n Script module used for fetching HTML content based on filter choice, inside tabs on statistics pages\r\n */\r\n\r\nimport axios from \"axios\";\r\n\r\nimport {\r\n setURLSearchParams,\r\n getQueryStringParamsAsKeyValuePair,\r\n} from \"@/scripts\";\r\nimport { HorizontalScrollerModule } from \"@/components/HorizontalScroller/HorizontalScroller.Module\";\r\n\r\ninterface StatisticsContentResult {\r\n result: string;\r\n success: boolean;\r\n}\r\n\r\nconst StatisticsContentSwitcher = (el: HTMLDivElement) => {\r\n // Collection of Select elements that trigger fetch of content\r\n const selects = Array.from(el.getElementsByTagName(\"select\"));\r\n // Query keys used in request for content\r\n const queryKeys = el\r\n .getAttribute(\"data-query-key\")!\r\n .split(\",\")\r\n .map((key) => key.trim());\r\n\r\n /*\r\n * @param value: string (Value from select option that triggered change event)\r\n */\r\n const getContent = async (): Promise => {\r\n const endpoint = el.getAttribute(\"data-endpoint\")!;\r\n const params = new URLSearchParams(window.location.search);\r\n const activeQsParams = getQueryStringParamsAsKeyValuePair(queryKeys);\r\n const activeTab = params.get(\"tab\");\r\n\r\n const r = await axios.get(endpoint, {\r\n params: {\r\n ...activeQsParams,\r\n ...(activeTab && { tab: activeTab }),\r\n },\r\n });\r\n const { data } = r;\r\n\r\n return data;\r\n };\r\n\r\n /*\r\n * @param contentHTML: string (fetched content HTML as string)\r\n */\r\n const updateContentHTML = (contentHTML: string) => {\r\n const contentContainerId = el.getAttribute(\r\n \"data-content-container-id\"\r\n ) as string;\r\n const contentContainer = document.getElementById(\r\n contentContainerId\r\n ) as HTMLDivElement;\r\n\r\n contentContainer.innerHTML = contentHTML;\r\n\r\n // If updated content uses horizontal scroller, we reinitialize the JS for it\r\n const horizontalScrollerEl = contentContainer.querySelector(\r\n \".horizontal-scroller\"\r\n );\r\n if (horizontalScrollerEl) {\r\n HorizontalScrollerModule(horizontalScrollerEl as HTMLElement).init();\r\n }\r\n };\r\n\r\n const onChange = async (e: Event) => {\r\n const currentTarget = e.currentTarget as HTMLSelectElement;\r\n // Selected query value\r\n const { value } = currentTarget;\r\n const queryKey = currentTarget.getAttribute(\"id\")!;\r\n // Add/update query params in URL\r\n setURLSearchParams(queryKey, value);\r\n\r\n const { result, success } = await getContent();\r\n\r\n if (success) {\r\n updateContentHTML(result);\r\n }\r\n };\r\n\r\n const init = () => {\r\n if (selects?.length > 0) {\r\n selects.forEach((select) => select.addEventListener(\"change\", onChange));\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { StatisticsContentSwitcher };\r\n","import { getCookieConsentByCategory } from \"./_cookieBot\";\r\nlet extellioScriptLoaded = false;\r\n\r\nconst getScript = (scriptSrc: string, cb: () => void) => {\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = scriptSrc;\r\n script.onload = cb;\r\n document.body.appendChild(script);\r\n extellioScriptLoaded = true;\r\n};\r\n\r\nexport const initExtellioByConsent = () => {\r\n const scriptSrc = window.extellioConf?.scriptSrc;\r\n \r\n if (!scriptSrc) return;\r\n\r\n let userHasConsentedToStatisticsCookies =\r\n getCookieConsentByCategory(\"statistics\");\r\n\r\n if (userHasConsentedToStatisticsCookies && extellioScriptLoaded == false) {\r\n getScript(scriptSrc, () => console.log(\"Extellio script loaded\"));\r\n }\r\n\r\n // Listen for cookie consent\r\n // If statistics cookies were accepted initate Extellio\r\n window.addEventListener(\"CookiebotOnAccept\", () => {\r\n userHasConsentedToStatisticsCookies =\r\n getCookieConsentByCategory(\"statistics\");\r\n\r\n if (userHasConsentedToStatisticsCookies && extellioScriptLoaded == false) {\r\n getScript(scriptSrc, () => {\r\n console.log(\"Extellio script loaded\")\r\n if (window?.extellio_actions) {\r\n window.extellio_actions.push(['rememberCookieConsentGiven']);\r\n console.log(\"Extellio consent given\");\r\n }\r\n });\r\n }\r\n }); \r\n\r\n // If statistics cookies were declined tell extellio to remove cookie and stop extellio\r\n window.addEventListener(\"CookiebotOnDecline\", () => {\r\n userHasConsentedToStatisticsCookies =\r\n getCookieConsentByCategory(\"statistics\");\r\n if (userHasConsentedToStatisticsCookies == false) {\r\n if (window?.extellio_actions) {\r\n window?.extellio_actions.push(['forgetCookieConsentGiven']);\r\n console.log(\"Extellio consent removed\");\r\n }\r\n if (window?.extellio) {\r\n window.extellio.stop();\r\n }\r\n }\r\n });\r\n};\r\n","const SortTable = (table: HTMLTableElement) => {\r\n const makeSortable = (hCell: HTMLTableCellElement) => {\r\n const hCellContent = hCell.textContent!;\r\n const btn = document.createElement(\"button\");\r\n btn.classList.add(\"table-sortable__btn\");\r\n btn.innerText = hCellContent;\r\n hCell.innerHTML = \"\";\r\n hCell.appendChild(btn);\r\n\r\n btn.addEventListener(\"click\", () => sort(hCell));\r\n };\r\n\r\n const sort = (hCell: HTMLTableCellElement) => {\r\n const descendingThClass = \"dir-desc\";\r\n const ascendingThClass = \"dir-asc\";\r\n const nodes = hCell.closest(\"tr\")!.cells;\r\n let columnIndex = 0; // Index of column to be sorted\r\n\r\n let dir: \"dir-desc\" | \"dir-asc\" = descendingThClass;\r\n\r\n // Set sort direction classes (or reset if dir === '')\r\n const setSortDirClasses = (element: HTMLElement, dir: string) => {\r\n element.classList.remove(descendingThClass);\r\n element.classList.remove(ascendingThClass);\r\n element.removeAttribute(\"aria-sort\");\r\n if (dir) {\r\n element.classList.add(dir);\r\n\r\n if (dir === \"dir-desc\") {\r\n element.setAttribute(\"aria-sort\", \"descending\");\r\n } else {\r\n element.setAttribute(\"aria-sort\", \"ascending\");\r\n }\r\n }\r\n };\r\n\r\n // Change sorting direction if previously sorted\r\n if (hCell.classList.contains(descendingThClass)) {\r\n dir = ascendingThClass;\r\n }\r\n setSortDirClasses(hCell, dir);\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n if (nodes[i] === hCell) {\r\n columnIndex = i;\r\n } else {\r\n setSortDirClasses(nodes[i], \"\");\r\n }\r\n }\r\n\r\n // Get text value of table cell\r\n const getValue = (element: HTMLTableCellElement) => {\r\n return element.textContent;\r\n };\r\n\r\n // Defines the sort order. The return value is a number whose positivity indicates the relative order of the two elements.\r\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\r\n const compare = (\r\n a: HTMLTableRowElement,\r\n b: HTMLTableRowElement,\r\n index: number\r\n ) => {\r\n const reverse = dir === ascendingThClass;\r\n const x = getValue((reverse ? a : b).cells[index])!;\r\n const y = getValue((reverse ? b : a).cells[index])!;\r\n const value = parseFloat(x) - parseFloat(y);\r\n const bool = isNaN(value) ? x.localeCompare(y) : value;\r\n return bool;\r\n };\r\n\r\n const orgTbody: HTMLTableSectionElement = table.tBodies[0];\r\n\r\n // Rows to array so they can be sorted\r\n const rows: HTMLTableRowElement[] = Array.from(orgTbody.rows);\r\n\r\n rows.sort((a: HTMLTableRowElement, b: HTMLTableRowElement) =>\r\n compare(a, b, columnIndex)\r\n );\r\n\r\n const cloneTBody = orgTbody.cloneNode() as HTMLTableSectionElement;\r\n cloneTBody.append(...rows);\r\n table.replaceChild(cloneTBody, orgTbody);\r\n };\r\n\r\n const init = () => {\r\n const headingCells = table.querySelectorAll(\r\n \"thead th\"\r\n ) as NodeListOf;\r\n\r\n if (headingCells?.length > 0) {\r\n headingCells.forEach((hCell) => makeSortable(hCell));\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { SortTable };\r\n","/*\r\n Simple JS function for revealing hidden markup.\r\n Looks for a button with the class \"show-more-trigger\" and a container \r\n holding the hidden items, specific in the \"data-show-more-container-class\" data attribute. \r\n\r\n On trigger all \"h-hidden\" classes inside the container will be removed.\r\n*/\r\n\r\nconst ShowMore = (trigger: HTMLButtonElement) => {\r\n const containerClass = trigger.getAttribute(\r\n \"data-show-more-container-class\"\r\n ) as string;\r\n const container = document.querySelector(`.${containerClass}`);\r\n\r\n const removeHiddenClass = () => {\r\n container!.querySelectorAll(\".h-hidden\").forEach((item) => {\r\n item.classList.remove(\"h-hidden\");\r\n });\r\n\r\n trigger.classList.add(\"h-hidden\");\r\n };\r\n\r\n const init = () => {\r\n if (trigger && container) {\r\n trigger.addEventListener(\"click\", removeHiddenClass);\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { ShowMore };\r\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","import debounce from \"lodash.debounce\";\r\n\r\nconst NavbarModule = () => {\r\n const navbarEl: HTMLElement | null = document.querySelector(\".navbar\");\r\n const stickyNavbarRoot: HTMLElement | null = document.querySelector(\r\n \"[data-sticky-navbar-root]\"\r\n );\r\n const mediaQuery = window.matchMedia(\"screen and (max-width: 968px)\");\r\n\r\n let previousScrollPos = 0;\r\n\r\n const scrollHandler = debounce(() => {\r\n if (stickyNavbarRoot) {\r\n const scrollY =\r\n document.documentElement.scrollTop || document.body.scrollTop || 0;\r\n const stickNavbarRootRectTop =\r\n stickyNavbarRoot.getBoundingClientRect().top;\r\n\r\n // Set class to allow scroll reveal animation\r\n if (scrollY > stickNavbarRootRectTop) {\r\n navbarEl?.classList.add(\"navbar--with-scroll-animation\");\r\n } else {\r\n navbarEl?.classList.remove(\"navbar--with-scroll-animation\");\r\n }\r\n\r\n // Show navbar if scroll direction is UP and scrollY is below stickNavbarRootRect\r\n if (scrollY < previousScrollPos && scrollY > stickNavbarRootRectTop) {\r\n show();\r\n } else if (\r\n scrollY > previousScrollPos + 20 ||\r\n scrollY < stickNavbarRootRectTop\r\n ) {\r\n hide();\r\n }\r\n previousScrollPos = scrollY;\r\n }\r\n }, 10);\r\n\r\n const hide = () => {\r\n if (navbarEl?.classList.contains(\"navbar--reveal\")) {\r\n navbarEl.classList.remove(\"navbar--reveal\");\r\n }\r\n };\r\n\r\n const show = () => {\r\n if (!navbarEl?.classList.contains(\"navbar--reveal\")) {\r\n navbarEl?.classList.add(\"navbar--reveal\");\r\n }\r\n };\r\n\r\n const init = () => {\r\n if (navbarEl) {\r\n if (mediaQuery.matches) {\r\n window.addEventListener(\"scroll\", scrollHandler);\r\n }\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { NavbarModule };\r\n","import axios from \"axios\";\r\nimport { AnimateHeight } from \"@/scripts\";\r\n\r\nconst MenuModule = () => {\r\n const menuToggleSelector = \".menu__item-toggle\";\r\n const menuItemContentSelector = \".menu__item-content\";\r\n const submenuWrapperClass = \"menu__list-wrapper\";\r\n const menuToggles: NodeListOf =\r\n document.querySelectorAll(menuToggleSelector);\r\n\r\n /*\r\n * Determine if submenu should open or close\r\n */\r\n const toggleSubmenu = (e: Event) => {\r\n e.preventDefault();\r\n const toggle = e.target as HTMLButtonElement;\r\n\r\n if (toggle && toggle.getAttribute(\"aria-expanded\") === \"false\") {\r\n open(toggle);\r\n } else {\r\n close(toggle);\r\n }\r\n };\r\n\r\n /*\r\n * Fetch data for submenu and set to HTML element\r\n */\r\n const getSubmenuAsElement = async (\r\n endpoint: string,\r\n submenuId: string\r\n ): Promise => {\r\n const r = await axios.get(endpoint);\r\n const { data } = r;\r\n\r\n const submenuEl = document.createElement(\"div\");\r\n submenuEl.classList.add(submenuWrapperClass);\r\n submenuEl.setAttribute(\"id\", submenuId);\r\n submenuEl.innerHTML = data;\r\n\r\n return submenuEl;\r\n };\r\n\r\n /*\r\n * Add toggle event to submenu toggle buttons\r\n */\r\n const addClickHandler = (toggle: Element) => {\r\n toggle.addEventListener(\"click\", toggleSubmenu);\r\n };\r\n\r\n /*\r\n * Open submenu and attach click handlers to new submenu toggles\r\n */\r\n const open = async (toggle: HTMLButtonElement) => {\r\n // Endpoint and submenu ID for fetching menu\r\n const endpoint = toggle.getAttribute(\"data-submenu-endpoint\");\r\n const submenuId = toggle.getAttribute(\"data-aria-controls\")!;\r\n // Main wrapper element for menu item\r\n const menuItem = toggle.closest(\".menu__item\");\r\n // Submenu element\r\n const submenu = document.getElementById(submenuId);\r\n\r\n // If we've already fetched submenu - just expand\r\n if (submenu) {\r\n AnimateHeight(submenu).toAutoHeight();\r\n submenu.classList.add(`${submenuWrapperClass}--visible`);\r\n } else {\r\n // Else we fetch submenu from \"endpoint\" and append to markup\r\n if (endpoint) {\r\n const submenuEl = await getSubmenuAsElement(endpoint, submenuId);\r\n const parent = toggle.closest(menuItemContentSelector);\r\n\r\n if (parent) {\r\n // Append submenu to DOM\r\n parent.after(submenuEl);\r\n\r\n AnimateHeight(submenuEl).toAutoHeight();\r\n submenuEl.classList.add(`${submenuWrapperClass}--visible`);\r\n\r\n // Add click handler to new toggles inside submenu\r\n const submenuToggles = submenuEl.querySelectorAll(menuToggleSelector);\r\n submenuToggles.forEach((submenuToggle) =>\r\n addClickHandler(submenuToggle)\r\n );\r\n }\r\n }\r\n }\r\n\r\n toggle.setAttribute(\"aria-expanded\", \"true\");\r\n menuItem?.classList.add(\"menu__item--expanded\");\r\n updateDescriptiveExpandedLabel(toggle, true);\r\n };\r\n\r\n const close = (toggle: HTMLButtonElement) => {\r\n const submenuId = toggle.getAttribute(\"data-aria-controls\")!;\r\n const submenu = document.getElementById(submenuId) as HTMLDivElement;\r\n const menuItem = toggle.closest(\".menu__item\") as HTMLLIElement;\r\n\r\n toggle.setAttribute(\"aria-expanded\", \"false\");\r\n AnimateHeight(submenu).toZeroHeight();\r\n submenu.classList.remove(`${submenuWrapperClass}--visible`);\r\n menuItem.classList.remove(\"menu__item--expanded\");\r\n\r\n const submenuChildren = submenu.querySelectorAll(\r\n `.${submenuWrapperClass}`\r\n ) as NodeListOf;\r\n\r\n submenuChildren.forEach((submenuChild) => {\r\n submenu\r\n .querySelectorAll(menuToggleSelector)\r\n .forEach((menuToggleChild) => {\r\n const menuItem = menuToggleChild.closest(\r\n \".menu__item\"\r\n ) as HTMLLIElement;\r\n\r\n menuItem.classList.remove(\"menu__item--expanded\");\r\n menuToggleChild.setAttribute(\"aria-expanded\", \"false\");\r\n });\r\n submenuChild.classList.remove(`${submenuWrapperClass}--visible`);\r\n AnimateHeight(submenuChild).toZeroHeight({ duration: 0 });\r\n });\r\n\r\n updateDescriptiveExpandedLabel(toggle, false);\r\n };\r\n\r\n /*\r\n * Change descriptive expanded label for screen readers\r\n */\r\n const updateDescriptiveExpandedLabel = (\r\n toggle: HTMLButtonElement,\r\n expanded: boolean\r\n ) => {\r\n const expandedLabelEl = toggle.querySelector(\r\n \".menu__item-toggle-expanded-label\"\r\n ) as HTMLSpanElement;\r\n expandedLabelEl.innerText = toggle.getAttribute(\r\n `data-expanded-${expanded}-label`\r\n ) as string;\r\n };\r\n\r\n const init = () => {\r\n menuToggles.forEach((menuToggle) => {\r\n addClickHandler(menuToggle);\r\n });\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { MenuModule };\r\n","import { useKeyHandler, focusTrap } from \"@/scripts\";\r\n\r\nconst MenuToggleModule = (menuToggle: HTMLButtonElement) => {\r\n const mediaLargeScreen = window.matchMedia(\"screen and (min-width: 2300px)\");\r\n const navbar = document.querySelector(\".navbar\") as HTMLElement;\r\n const navbarFlyout = document.getElementById(\r\n \"navbar-flyout\"\r\n ) as HTMLDivElement;\r\n const headerMenuToggle = document.getElementById(\r\n \"header-menu-toggle\"\r\n ) as HTMLButtonElement;\r\n const navbarMenuToggle = document.getElementById(\r\n \"navbar-menu-toggle\"\r\n ) as HTMLButtonElement;\r\n const menuTabloopCloseBtn = document.querySelector(\r\n \".menu-toggle-tabloop\"\r\n ) as HTMLButtonElement;\r\n\r\n // Handler for focus trap\r\n const handleFocusTrap = focusTrap(navbarFlyout);\r\n\r\n // Toggle open/closed state\r\n const toggle = (e: Event) => {\r\n const menuToggle = e.target as HTMLButtonElement;\r\n\r\n if (menuToggle.getAttribute(\"aria-expanded\") === \"false\") {\r\n open();\r\n } else {\r\n close();\r\n }\r\n };\r\n\r\n // Close menu when click is outside of navbar and menuToggle\r\n const handleClickoutside = (e: Event) => {\r\n !navbarFlyout.contains(e.target as Node) &&\r\n e.target !== menuToggle &&\r\n close();\r\n }\r\n\r\n const open = () => {\r\n if (navbarFlyout) {\r\n if(!mediaLargeScreen.matches)\r\n document.body.style.overflow = \"hidden\"; // Prevent body scroll\r\n\r\n document.body.classList.add(\"fade-overlay\");\r\n\r\n menuToggle.setAttribute(\"aria-expanded\", \"true\");\r\n\r\n if(!mediaLargeScreen.matches)\r\n {\r\n menuToggle.focus();\r\n }\r\n \r\n navbarFlyout.classList.add(\"flyout--visible\");\r\n navbarFlyout.classList.remove(\"flyout--hidden-xxl\");\r\n navbar.classList.add(\"navbar--reveal\", \"navbar--visible\");\r\n\r\n scrollToActiveMenuItem();\r\n\r\n if(!mediaLargeScreen.matches)\r\n {\r\n handleFocusTrap.activate();\r\n // Close when user clicks outside of menu element\r\n window.addEventListener(\"click\", handleClickoutside);\r\n \r\n // Close menu when user hits Escape key\r\n useKeyHandler(\"Escape\", close);\r\n }\r\n }\r\n };\r\n\r\n const close = () => {\r\n if (navbarFlyout) {\r\n if(!mediaLargeScreen.matches)\r\n document.body.style.overflow = \"auto\"; // Allow body scroll\r\n\r\n document.body.classList.remove(\"fade-overlay\");\r\n\r\n menuToggle.setAttribute(\"aria-expanded\", \"false\");\r\n \r\n navbarFlyout.classList.remove(\"flyout--visible\");\r\n navbarFlyout.classList.add(\"flyout--hidden-xxl\");\r\n\r\n navbar.classList.remove(\"navbar--visible\");\r\n\r\n if (document.documentElement.scrollTop === 0) {\r\n navbar.classList.remove(\"navbar--reveal\");\r\n }\r\n }\r\n\r\n window.removeEventListener(\"click\", handleClickoutside);\r\n\r\n handleFocusTrap.deactivate();\r\n };\r\n\r\n const scrollToActiveMenuItem = () => {\r\n const activeMenuItem = document.querySelector(\".menu__item--active\");\r\n const mq = window.matchMedia(\"(max-width: 1024px)\");\r\n const navbarOffset = mq.matches ? navbar.offsetHeight : 0;\r\n\r\n if (activeMenuItem) {\r\n setTimeout(() => {\r\n const offsetTop = activeMenuItem.getBoundingClientRect().top;\r\n navbarFlyout.scrollTo(0, offsetTop - navbarOffset);\r\n }, 10);\r\n }\r\n };\r\n\r\n const init = () => {\r\n menuToggle.addEventListener(\"click\", toggle);\r\n headerMenuToggle.addEventListener(\"click\", (e) => {\r\n e.stopPropagation();\r\n navbarMenuToggle.click();\r\n });\r\n\r\n if (menuTabloopCloseBtn) {\r\n menuTabloopCloseBtn.addEventListener(\"click\", (e) => {\r\n e.stopPropagation();\r\n navbarMenuToggle.click();\r\n });\r\n\r\n if (mediaLargeScreen.matches) {\r\n menuToggle.setAttribute(\"aria-expanded\", \"true\");\r\n scrollToActiveMenuItem()\r\n } \r\n }\r\n };\r\n\r\n return {\r\n init,\r\n open,\r\n };\r\n};\r\n\r\nconst initiateMenuToggles = () => {\r\n document.querySelectorAll(\".menu-toggle\").forEach((menuToggle) => {\r\n if (menuToggle.getAttribute(\"aria-controls\") !== \"navbar-menu-toggle\") {\r\n MenuToggleModule(menuToggle as HTMLButtonElement).init();\r\n }\r\n });\r\n};\r\n\r\nexport { MenuToggleModule, initiateMenuToggles };\r\n","const ShortcutsModule = () => {\r\n const shortcutsBlocks = document.querySelectorAll(\".shortcuts\");\r\n\r\n const reveal = (\r\n showAllBtn: HTMLButtonElement,\r\n shortcutsBlock: HTMLElement\r\n ) => {\r\n shortcutsBlock.className = \"shortcuts\"; // Removes limit modifier class\r\n showAllBtn.remove();\r\n };\r\n\r\n const init = () => {\r\n if (shortcutsBlocks.length > 0) {\r\n for (let i = 0; i < shortcutsBlocks.length; i++) {\r\n const shortcutsBlock = shortcutsBlocks[i] as HTMLElement;\r\n const showAllBtn = shortcutsBlocks[i].querySelector(\r\n \".shortcuts__show-all-btn\"\r\n ) as HTMLButtonElement;\r\n\r\n showAllBtn?.addEventListener(\"click\", () =>\r\n reveal(showAllBtn, shortcutsBlock)\r\n );\r\n }\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { ShortcutsModule };\r\n","import debounce from \"lodash.debounce\";\r\n\r\nconst ScrollToTopModule = () => {\r\n const scrollTopEl: HTMLElement | null =\r\n document.querySelector(\".scroll-to-top\");\r\n const mediaQuery = window.matchMedia(\"screen and (max-width: 968px)\");\r\n\r\n const scrollHandler = debounce(() => {\r\n if (scrollTopEl && mediaQuery.matches) {\r\n const scrollY = document.documentElement.scrollTop;\r\n // Set class to reveal ScrollToTop component\r\n if (scrollY > 100) {\r\n scrollTopEl.classList.add(\"scroll-to-top--visible\");\r\n } else {\r\n scrollTopEl.classList.remove(\"scroll-to-top--visible\");\r\n }\r\n }\r\n }, 10);\r\n\r\n const scrollTop = () => {\r\n window.scroll({\r\n top: 0,\r\n left: 0,\r\n behavior: \"smooth\",\r\n });\r\n scrollTopEl?.blur();\r\n };\r\n\r\n const init = () => {\r\n if (scrollTopEl) {\r\n window.addEventListener(\"scroll\", scrollHandler);\r\n scrollTopEl.addEventListener(\"click\", scrollTop);\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { ScrollToTopModule };\r\n","const TableModule = () => {\r\n const rteTables = document.querySelectorAll(\r\n \".rte table\"\r\n ) as NodeListOf;\r\n\r\n const checkOverflow = (table: HTMLTableElement) => {\r\n const parentRte = table.closest(\".rte\") as HTMLDivElement;\r\n\r\n if (table.scrollWidth > parentRte.offsetWidth) {\r\n wrapWithHorizontalScroller(table);\r\n }\r\n };\r\n\r\n const wrapWithHorizontalScroller = (table: HTMLTableElement) => {\r\n const horizontalScrollerMain = document.createElement(\"div\");\r\n horizontalScrollerMain.classList.add(\r\n \"horizontal-scroller\",\r\n \"horizontal-scroller--with-swipe-icon\"\r\n );\r\n const horizontalScrollerInner = document.createElement(\"div\");\r\n horizontalScrollerInner.classList.add(\"horizontal-scroller__scroller\");\r\n\r\n // Add inner scroller element to main wrapper\r\n horizontalScrollerMain.appendChild(horizontalScrollerInner);\r\n // Replace current table element with horisontal scroller el\r\n table.replaceWith(horizontalScrollerMain);\r\n // Add table inside inner scroller element\r\n horizontalScrollerInner.appendChild(table);\r\n };\r\n\r\n const init = () => {\r\n rteTables.forEach((table) => {\r\n checkOverflow(table);\r\n });\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { TableModule };\r\n","import { LiveFilter } from \"@/scripts/2-functions/_live-filter\";\r\n\r\nconst AlphabetFilterModule = (filter: HTMLFieldSetElement) => {\r\n // Filter checkboxes\r\n const triggers = filter.querySelectorAll(\r\n \".alphabet-filter__checkbox-input\"\r\n ) as NodeListOf;\r\n // Clear button\r\n const clearBtn = document.querySelector(\r\n \".alphabet-filter__clear-btn\"\r\n ) as HTMLButtonElement;\r\n\r\n // Filter key for URL query string\r\n const filterKey = \"filter-char\";\r\n\r\n // Live region variables for announcing updates to screen readers\r\n const liveRegion = document.getElementById(\r\n \"alphabet-filter-live-region\"\r\n ) as HTMLDivElement;\r\n const liveRegionTextAll = liveRegion.getAttribute(\r\n \"data-live-region-text-all\"\r\n );\r\n const liveRegionTextFiltered = liveRegion.getAttribute(\r\n \"data-live-region-text-filtered\"\r\n );\r\n\r\n // Container for items to be filtered\r\n const filterTargetId = filter.getAttribute(\"data-alphabet-filter-target-id\")!;\r\n const filterTarget = document.getElementById(filterTargetId);\r\n\r\n const onUpdate = () => {\r\n // Update text in live region\r\n updateLiveRegion();\r\n\r\n toggleFilterItemsVisibilty();\r\n };\r\n\r\n const updateLiveRegion = () => {\r\n const params = new URLSearchParams(window.location.search);\r\n\r\n const activeFilters = params.getAll(filterKey);\r\n\r\n if (activeFilters.length > 0) {\r\n liveRegion.innerText = `${liveRegionTextFiltered}: ${params\r\n .getAll(filterKey)\r\n .toString()}`;\r\n } else {\r\n liveRegion.innerText = liveRegionTextAll || \"\";\r\n }\r\n };\r\n\r\n const toggleFilterItemsVisibilty = () => {\r\n if (\r\n filterTarget?.children !== undefined &&\r\n filterTarget.children.length > 0\r\n ) {\r\n const params = new URLSearchParams(window.location.search);\r\n const { children } = filterTarget;\r\n\r\n for (let i = 0; i < children.length; i++) {\r\n const el = children[i] as HTMLUListElement;\r\n const activeParams = params.getAll(filterKey);\r\n\r\n // ID from element (eg \"alphabet-filter-target-A\")\r\n const elId = el.getAttribute(\"id\")!;\r\n\r\n // Element ID transformed to match param ID (eg \"A\")\r\n const elParamId = elId.substring(\r\n filterTargetId.length + 1,\r\n elId.length\r\n );\r\n\r\n // No active filters -> display all\r\n if (activeParams.length === 0) {\r\n el.style.display = \"block\";\r\n } else {\r\n // Active filters -> display only filtered items\r\n if (activeParams.includes(elParamId)) {\r\n el.style.display = \"block\";\r\n } else {\r\n el.style.display = \"none\";\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const init = () => {\r\n if (triggers?.length > 0) {\r\n // Initiate live filter\r\n LiveFilter(filterKey, triggers, clearBtn, onUpdate).init();\r\n }\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nconst initiateAlphabetFilter = () => {\r\n const alphabetFilter = document.querySelector(\r\n \".alphabet-filter\"\r\n ) as HTMLFieldSetElement;\r\n if (alphabetFilter) {\r\n AlphabetFilterModule(alphabetFilter).init();\r\n }\r\n};\r\n\r\nexport { AlphabetFilterModule, initiateAlphabetFilter };\r\n","import { AnimateHeight } from \"@/scripts\";\r\n\r\nconst AccordionModule = (accordion: HTMLDivElement) => {\r\n const toggle = (e: Event) => {\r\n const target = e.currentTarget as HTMLButtonElement;\r\n\r\n if (target.getAttribute(\"aria-expanded\") === \"false\") {\r\n open(target);\r\n } else {\r\n close(target);\r\n }\r\n };\r\n\r\n const open = (target: HTMLButtonElement) => {\r\n const content = document.getElementById(\r\n target.getAttribute(\"aria-controls\")!\r\n ) as HTMLDivElement;\r\n\r\n target.setAttribute(\"aria-expanded\", \"true\");\r\n AnimateHeight(content).toAutoHeight();\r\n content.classList.add(\"accordion__content--visible\");\r\n };\r\n\r\n const close = (target: HTMLButtonElement) => {\r\n const content = document.getElementById(\r\n target.getAttribute(\"aria-controls\")!\r\n ) as HTMLDivElement;\r\n\r\n target.setAttribute(\"aria-expanded\", \"false\");\r\n AnimateHeight(content).toZeroHeight();\r\n content.classList.remove(\"accordion__content--visible\");\r\n };\r\n\r\n const init = () => {\r\n const triggers = accordion.querySelectorAll(\r\n \".accordion__trigger\"\r\n ) as NodeListOf;\r\n\r\n triggers.forEach((trigger) => trigger?.addEventListener(\"click\", toggle));\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nconst initiateAccordions = () => {\r\n document\r\n .querySelectorAll(\".accordion\")\r\n ?.forEach((accordion) =>\r\n AccordionModule(accordion as HTMLDivElement).init()\r\n );\r\n};\r\n\r\nexport { AccordionModule, initiateAccordions };\r\n","import { getDeviceInfo } from \"@/scripts\";\r\n\r\nconst DiseaseItemModule = (diseaseItem: HTMLDivElement) => {\r\n const open = (target: HTMLButtonElement) => {\r\n const content = document.getElementById(\r\n target.getAttribute(\"aria-controls\")!\r\n ) as HTMLDivElement;\r\n\r\n target.setAttribute(\"aria-expanded\", \"true\");\r\n content.classList.remove(\"h-hidden\");\r\n content.setAttribute(\"aria-hidden\", \"false\")\r\n \r\n const deviceInfo = getDeviceInfo(); \r\n if(deviceInfo.isMobile)\r\n {\r\n content.scrollIntoView({ behavior: \"smooth\" }); \r\n }\r\n };\r\n\r\n const toggle = (e: Event) => {\r\n const target = e.currentTarget as HTMLButtonElement;\r\n\r\n const laboratoryList = diseaseItem.querySelectorAll(\r\n \".laboratory-list\"\r\n ) as NodeListOf;\r\n \r\n laboratoryList.forEach(labList => { \r\n labList.classList.add(\"h-hidden\");\r\n labList.setAttribute(\"aria-hidden\", \"true\")\r\n })\r\n \r\n const laboratoryListHelpText = diseaseItem.querySelector(\r\n \".laboratory-list-help-text\"\r\n ) as HTMLParagraphElement;\r\n \r\n laboratoryListHelpText.classList.add('h-hidden')\r\n setOtherRadiosUnselected()\r\n open(target)\r\n }\r\n\r\n const setOtherRadiosUnselected = () => { \r\n const triggers = diseaseItem.querySelectorAll(\r\n \".disease-item-radio\"\r\n ) as NodeListOf;\r\n\r\n triggers.forEach((trigger) => trigger?.setAttribute(\"aria-expanded\", \"false\")); \r\n }\r\n\r\n const init = () => {\r\n const triggers = diseaseItem.querySelectorAll(\r\n \".disease-item-radio\"\r\n ) as NodeListOf;\r\n\r\n triggers.forEach((trigger) => trigger?.addEventListener(\"click\", toggle));\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n };\r\n\r\nconst initiateDiseaseItem = () => {\r\n document\r\n .querySelectorAll(\".disease-item\")\r\n ?.forEach((diseaseItem) =>\r\n DiseaseItemModule(diseaseItem as HTMLDivElement).init()\r\n );\r\n};\r\n\r\nexport { DiseaseItemModule, initiateDiseaseItem };\r\n","import { AnimateHeight } from \"@/scripts\";\r\n\r\nconst ShowMoreModule = (showMoreContainer: HTMLDivElement) => {\r\n const toggle = showMoreContainer.querySelector(\r\n \".show-more__toggle\"\r\n ) as HTMLButtonElement;\r\n const contentContainer = showMoreContainer.querySelector(\r\n \".show-more__content\"\r\n ) as HTMLDivElement;\r\n\r\n const showMore = () => {\r\n AnimateHeight(contentContainer).toAutoHeight();\r\n showMoreContainer.classList.add(\"show-more--expanded\");\r\n\r\n toggle.setAttribute(\"aria-expanded\", \"true\");\r\n toggle.removeEventListener(\"click\", showMore);\r\n };\r\n\r\n const expandOnTab = (e: KeyboardEvent) => {\r\n const { key } = e;\r\n\r\n if (key === \"Tab\") {\r\n const activeElement = document.activeElement as HTMLElement;\r\n const contentContainerHeight = contentContainer.clientHeight;\r\n\r\n if (\r\n activeElement.offsetTop + activeElement.offsetHeight + 20 >=\r\n contentContainerHeight\r\n ) {\r\n showMore();\r\n }\r\n }\r\n };\r\n\r\n const init = () => {\r\n toggle.addEventListener(\"click\", showMore);\r\n contentContainer.addEventListener(\"keyup\", expandOnTab);\r\n\r\n setTimeout(() => {\r\n // If content height is lower than the container we disable the show more logic\r\n const contentHeight = contentContainer.firstElementChild!.clientHeight;\r\n const contentContainerHeight = contentContainer.clientHeight;\r\n if (contentContainerHeight > contentHeight) {\r\n showMore();\r\n }\r\n }, 100);\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nexport { ShowMoreModule };\r\n","import { setURLSearchParams } from \"@/scripts\";\r\n\r\nimport { initiateHorizontalScrollers } from \"../HorizontalScroller/HorizontalScroller.Module\";\r\n\r\nconst TabsModule = (tabsDiv: HTMLDivElement) => {\r\n const tabs = Array.from(\r\n tabsDiv.querySelectorAll(\r\n \"button[role=tab]\"\r\n ) as NodeListOf\r\n );\r\n const firstTab = tabs[0];\r\n const lastTab = tabs[tabs.length - 1];\r\n\r\n const toggle = (tab: HTMLButtonElement) => {\r\n const tabId = tab.getAttribute(\"id\");\r\n\r\n if (tab.getAttribute(\"aria-selected\") === \"false\") {\r\n open(tab);\r\n }\r\n\r\n tabs.forEach((tab) => tab.id !== tabId && close(tab));\r\n };\r\n\r\n const setPreviousTab = (tab: HTMLButtonElement) => {\r\n const indexOfTab = tabs.indexOf(tab);\r\n\r\n if (tab === firstTab) {\r\n toggle(lastTab);\r\n } else {\r\n toggle(tabs[indexOfTab - 1]);\r\n }\r\n };\r\n\r\n const setNextTab = (tab: HTMLButtonElement) => {\r\n const indexOfTab = tabs.indexOf(tab);\r\n\r\n if (tab === lastTab) {\r\n toggle(firstTab);\r\n } else {\r\n toggle(tabs[indexOfTab + 1]);\r\n }\r\n };\r\n\r\n const onKeydown = (e: KeyboardEvent) => {\r\n const { key } = e;\r\n const target = e.currentTarget as HTMLButtonElement;\r\n let toggled = false;\r\n\r\n switch (key) {\r\n case \"ArrowLeft\":\r\n setPreviousTab(target);\r\n toggled = true;\r\n break;\r\n\r\n case \"ArrowRight\":\r\n setNextTab(target);\r\n toggled = true;\r\n break;\r\n\r\n case \"Home\":\r\n toggle(firstTab);\r\n toggled = true;\r\n break;\r\n\r\n case \"End\":\r\n toggle(lastTab);\r\n toggled = true;\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n if (toggled) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const open = (tab: HTMLButtonElement) => {\r\n const panel = document.getElementById(\r\n tab.getAttribute(\"aria-controls\")!\r\n ) as HTMLDivElement;\r\n\r\n tab.setAttribute(\"aria-selected\", \"true\");\r\n tab.setAttribute(\"tabindex\", \"0\");\r\n tab.focus();\r\n\r\n if (panel) {\r\n panel.classList.remove(\"tabs__panel--hidden\");\r\n }\r\n\r\n // BE can set `tabs--disable-qs` to disable the updating of query strings\r\n if (!tabsDiv.classList.contains(\"tabs--disable-qs\")) {\r\n setURLSearchParams(\"tab\", tab.getAttribute(\"id\")!);\r\n }\r\n\r\n // If there's a horizontal scroller element inside a tab we need to reinitalize it\r\n initiateHorizontalScrollers(panel);\r\n };\r\n\r\n const close = (tab: HTMLButtonElement) => {\r\n const panel = document.getElementById(\r\n tab.getAttribute(\"aria-controls\")!\r\n ) as HTMLDivElement;\r\n\r\n tab.setAttribute(\"aria-selected\", \"false\");\r\n tab.setAttribute(\"tabindex\", \"-1\");\r\n\r\n if (panel) {\r\n panel.classList.add(\"tabs__panel--hidden\");\r\n }\r\n };\r\n\r\n const init = () => {\r\n tabs.forEach((tab) => {\r\n tab?.addEventListener(\"click\", (e: MouseEvent) => {\r\n const target = e.currentTarget as HTMLButtonElement;\r\n toggle(target);\r\n });\r\n tab?.addEventListener(\"keydown\", onKeydown);\r\n });\r\n };\r\n\r\n return {\r\n init,\r\n };\r\n};\r\n\r\nconst initiateTabs = () => {\r\n document\r\n .querySelectorAll(\".tabs\")\r\n ?.forEach((tabsDiv) => TabsModule(tabsDiv as HTMLDivElement).init());\r\n};\r\n\r\nexport { TabsModule, initiateTabs };\r\n","// -----------------------------------------------------------------------------\r\n// This file is for loading any component scripts.\r\n// Use name rule *.Module.ts in component folder.\r\n// Use Revealing Module Pattern to structure your script: http://jargon.js.org/_glossary/REVEALING_MODULE_PATTERN.md\r\n// -----------------------------------------------------------------------------\r\n\r\nimport { domReady } from \"@/scripts\";\r\nimport { NavbarModule } from \"@/components/Navbar/Navbar.Module\";\r\nimport { MenuModule } from \"@/components/Menu/Menu.Module\";\r\nimport { initiateMenuToggles } from \"@/components/MenuToggle/MenuToggle.Module\";\r\nimport { ShortcutsModule } from \"@/components/Shortcuts/Shortcuts.Module\";\r\nimport { ScrollToTopModule } from \"@/components/ScrollToTop/ScrollToTop.Module\";\r\nimport { initiateHorizontalScrollers } from \"@/components/HorizontalScroller/HorizontalScroller.Module\";\r\nimport { TableModule } from \"@/components/Table/Table.Module\";\r\nimport { initiateAlphabetFilter } from \"@/components/AlphabetFilter/AlphabetFilter.Module\";\r\nimport { initiateAccordions } from \"@/components/Accordion/Accordion.Module\";\r\nimport { initiateDiseaseItem } from \"@/components/DiseaseItem/DiseaseItem.Module\";\r\nimport { ShowMoreModule } from \"./ShowMore/ShowMore.Module\";\r\nimport { initiateTabs } from \"./Tabs/Tabs.Module\";\r\n\r\ndomReady(() => {\r\n NavbarModule().init();\r\n MenuModule().init();\r\n ShortcutsModule().init();\r\n ScrollToTopModule().init();\r\n TableModule().init();\r\n\r\n // Accordions\r\n initiateAccordions();\r\n\r\n // Tabs\r\n initiateTabs();\r\n\r\n // Alphabet filter\r\n initiateAlphabetFilter();\r\n\r\n // Disease items\r\n initiateDiseaseItem();\r\n\r\n // Add horizontal scroll logic to all elements with .horizontal-scroller\r\n initiateHorizontalScrollers(document);\r\n\r\n // Add click listeners on all main menu toggles\r\n initiateMenuToggles();\r\n\r\n // Show more containers\r\n document\r\n .querySelectorAll(\".show-more\")\r\n .forEach((el) => ShowMoreModule(el as HTMLDivElement).init());\r\n});\r\n","// Styles & Icons\r\nimport \"normalize.css\";\r\nimport \"@/icons/sprite.symbol.svg\";\r\nimport \"@/styles/main.scss\";\r\n\r\n// Component scripts\r\nimport \"@/components/index\";\r\n\r\n// Helper scripts\r\nimport {\r\n domReady,\r\n attachPrintButtonEvent,\r\n attachHistoryBackLinkEvent,\r\n PageListingFilter,\r\n StatisticsContentSwitcher,\r\n SortTable,\r\n ShowMore,\r\n ReadSpeaker,\r\n initExtellioByConsent,\r\n} from \"./scripts\";\r\n\r\n// Initialize scripts after DOMContentLoaded event\r\ndomReady(() => {\r\n // Enable check for Javascript\r\n document.body.classList.remove(\"no-js\");\r\n\r\n // Initiate Extellio based on cookie consent\r\n initExtellioByConsent();\r\n\r\n // Listener for print button action\r\n attachPrintButtonEvent();\r\n\r\n // Listener for custom history back links\r\n attachHistoryBackLinkEvent();\r\n\r\n // Initiate ReadSpeaker\r\n ReadSpeaker().init();\r\n\r\n // Initiate page listing filter\r\n const pageListingFilter = document.querySelector(\r\n \".page-listing-filter\",\r\n ) as HTMLDivElement;\r\n\r\n if (pageListingFilter) {\r\n PageListingFilter(pageListingFilter).init();\r\n }\r\n\r\n // Initiate statistics content switcher on Statistics pages\r\n document.querySelectorAll(\".statistics-content-switcher\").forEach((el) => {\r\n StatisticsContentSwitcher(el as HTMLDivElement).init();\r\n });\r\n\r\n // Add sorting feature to tables with class \"table-sortable\"\r\n document.querySelectorAll(\".table-sortable\").forEach((table) => {\r\n SortTable(table as HTMLTableElement).init();\r\n });\r\n\r\n // Initiate show more helper\r\n document.querySelectorAll(\".show-more-trigger\").forEach((trigger) => {\r\n ShowMore(trigger as HTMLButtonElement).init();\r\n });\r\n});\r\n"],"names":["domReady","cb","attachPrintButtonEvent","printBtn","useKeyHandler","keyCode","handleKeydown","e","setURLSearchParams","key","value","params","getQueryStringParamsAsKeyValuePair","keys","acc","attachHistoryBackLinkEvent","historyBackLinks","link","getDeviceInfo","showCookieBannerDetails","_a","cookieBanner","detailsToggle","attachShowCookieBannerDetailsEvent","showCookieBannerBtns","btn","getCookieConsentByCategory","category","highlightPreferencePanel","panel","readSpeakerConf","ReadSpeaker","readSpeakerBtns","getInitializedState","getScriptSrc","scriptSrc","classList","checkIfScriptIsLoadedInHead","scripts","scriptLoaded","script","loadReadSpeakerScript","resolve","reject","triggerReadPage","href","userHasConsentedToPreferencesCookies","error","LiveFilter","filterKey","triggers","clearBtn","onUpdate","updateFilter","currentTarget","addFilterValue","deleteFilterValue","event","newParams","param","i","deleteAllFilterValues","clearFilter","trigger","changeEvent","PageListingFilter","filterEl","filterKeys","searchInputId","result","filters","total","getFilterUpdate","updatePageListingHTML","updateFilters","updateSnackbarAndSerpHeader","endpoint","activeParams","searchInput","r","axios","data","updatedListingHTML","filterListingTargetId","pageListingContainer","filter","filterValues","filterCheckboxEl","filterValue","totalHits","snackbar","serpHeaderResultCount","message","sortControls","filterKeyTriggers","filterClearBtn","AnimateHeight","el","defaultOptions","orgTransition","state","toAutoHeight","duration","timing","style","transition","t","scrollHeight","start","awaitCompletion","height","toZeroHeight","onTransitionEnd","getFocusableElements","containerElement","nodeList","focusableElements","focusTrap","setFocusOnFirst","firstFocusableEl","lastFocusableEl","self","isTabPressed","HorizontalScrollerModule","scrollerEl","contentContainer","scrollPos","contentWidth","settings","checkScrollPosition","checkOverflow","toggleOverflowIndicatorsVisibility","toggleSwipeIconVisibility","visible","handleScroll","handleResize","throttle","initiateHorizontalScrollers","container","horizontalScrollerEls","StatisticsContentSwitcher","selects","queryKeys","getContent","activeQsParams","activeTab","updateContentHTML","contentHTML","contentContainerId","horizontalScrollerEl","onChange","queryKey","success","select","extellioScriptLoaded","getScript","initExtellioByConsent","userHasConsentedToStatisticsCookies","SortTable","table","makeSortable","hCell","hCellContent","sort","descendingThClass","ascendingThClass","nodes","columnIndex","dir","setSortDirClasses","element","getValue","compare","a","b","index","reverse","y","orgTbody","rows","cloneTBody","headingCells","ShowMore","containerClass","removeHiddenClass","item","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","global","freeSelf","root","objectProto","objectToString","nativeMax","nativeMin","now","debounce","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","toNumber","isObject","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","type","isObjectLike","isSymbol","other","isBinary","lodash_debounce","NavbarModule","navbarEl","stickyNavbarRoot","mediaQuery","previousScrollPos","scrollHandler","scrollY","stickNavbarRootRectTop","show","hide","MenuModule","menuToggleSelector","menuItemContentSelector","submenuWrapperClass","menuToggles","toggleSubmenu","toggle","open","close","getSubmenuAsElement","submenuId","submenuEl","addClickHandler","menuItem","submenu","parent","submenuToggle","updateDescriptiveExpandedLabel","submenuChild","menuToggleChild","expanded","expandedLabelEl","menuToggle","MenuToggleModule","mediaLargeScreen","navbar","navbarFlyout","headerMenuToggle","navbarMenuToggle","menuTabloopCloseBtn","handleFocusTrap","handleClickoutside","scrollToActiveMenuItem","activeMenuItem","navbarOffset","offsetTop","initiateMenuToggles","ShortcutsModule","shortcutsBlocks","reveal","showAllBtn","shortcutsBlock","ScrollToTopModule","scrollTopEl","scrollTop","TableModule","rteTables","parentRte","wrapWithHorizontalScroller","horizontalScrollerMain","horizontalScrollerInner","AlphabetFilterModule","liveRegion","liveRegionTextAll","liveRegionTextFiltered","filterTargetId","filterTarget","updateLiveRegion","toggleFilterItemsVisibilty","children","elId","elParamId","initiateAlphabetFilter","alphabetFilter","AccordionModule","accordion","target","content","initiateAccordions","DiseaseItemModule","diseaseItem","labList","setOtherRadiosUnselected","initiateDiseaseItem","ShowMoreModule","showMoreContainer","showMore","expandOnTab","activeElement","contentContainerHeight","contentHeight","TabsModule","tabsDiv","tabs","firstTab","lastTab","tab","tabId","setPreviousTab","indexOfTab","setNextTab","onKeydown","toggled","initiateTabs","pageListingFilter"],"mappings":"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","x_google_ignoreList":[13]}