{"version":3,"file":"app.js","sources":["../Scripts/utils/dom.ts","../Scripts/utils/form.ts","../Scripts/utils/iconLoader.ts","../Scripts/utils/index.ts","../Scripts/components/accordion.ts","../Scripts/components/card.ts","../Scripts/components/nav.ts","../Scripts/blocks/accessibilityReport.ts","../Scripts/blocks/contact.ts","../Scripts/blocks/video.ts","../Scripts/pages/search.ts","../../node_modules/smoothscroll-polyfill/dist/smoothscroll.js","../../node_modules/focus-visible/dist/focus-visible.js","../Scripts/app.ts"],"sourcesContent":["/*\r\n * Helper function for toggling hidden class\r\n */\r\nexport function toggleVisibility(el: JQuery | HTMLElement, override: boolean | null = null): void {\r\n const className = 'hidden';\r\n const $el = $(el);\r\n\r\n if (typeof override != 'undefined') {\r\n $el.toggleClass(className, !override);\r\n } else {\r\n $el.toggleClass(className);\r\n }\r\n}\r\n\r\n/*\r\n * Navigation hack, borrowed from bootstrap\r\n */\r\nexport function navFullscreen(state: boolean): void {\r\n const $body = $(document.body);\r\n\r\n $body.toggleClass('nav-open', state);\r\n}\r\n\r\n/**\r\n * Helper functio nto make an anchor tag a11y compatible\r\n */\r\nexport function a11yLink(el: HTMLAnchorElement, href: string, title?: string | null, target?: string | null): HTMLElement {\r\n el.href = href;\r\n\r\n if (title) {\r\n el.title = title;\r\n el.setAttribute('aria-label', title);\r\n }\r\n\r\n if (target) {\r\n el.target = target;\r\n }\r\n\r\n return el;\r\n}\r\n\r\n/**\r\n * Parses a string to text nodes and escapes newlines to
elements\r\n */\r\nexport function escapeText(text: string | null): Node[] {\r\n if (!text) {\r\n return [];\r\n }\r\n\r\n const lines = text.split('\\n');\r\n\r\n return lines.reduce((acc, line, idx) => {\r\n acc.push(document.createTextNode(line));\r\n\r\n if (idx < (lines.length - 1)) {\r\n acc.push(document.createElement('br'));\r\n }\r\n\r\n return acc;\r\n }, [] as Node[]);\r\n}\r\n\r\n/**\r\n * Hyperscript like function for quickly creating elements, does only support className and not attributes/properties\r\n */\r\nexport function createElement(tagName: string, className?: string | null, ...children: (string | false | null | Node)[]): T {\r\n const $el = document.createElement(tagName) as T;\r\n\r\n if (className) {\r\n $el.className = className;\r\n }\r\n\r\n // Append child nodes\r\n if (children?.length) {\r\n children.forEach(child => {\r\n if (child != null && child !== false) {\r\n const node = typeof child == 'string'\r\n ? document.createTextNode(child)\r\n : child;\r\n\r\n $el.appendChild(node);\r\n }\r\n });\r\n }\r\n\r\n return $el;\r\n}","const INVALID_CLASS = 'invalid';\r\nconst CONTROL_SELECTOR = '.form-control';\r\nconst MESSAGE_SELECTOR = '.error-message';\r\nconst ICON_SELECTOR = '.error-icon';\r\n\r\n// TODO: Might be nice to add multiple different messages for different validations.\r\nexport type ValidationAction = ((value: string, formData: Record) => boolean);\r\nexport interface Validation {\r\n message: string;\r\n pattern?: RegExp;\r\n action?: ValidationAction;\r\n}\r\nexport interface Validator {\r\n required?: boolean;\r\n message?: string;\r\n validations?: Validation[];\r\n}\r\nexport type Validations = Record;\r\n\r\n/**\r\n * Clears any input, textarea and checkbox from any values\r\n */\r\nexport function clearForm(form: JQuery | HTMLFormElement): void {\r\n const $form = $(form);\r\n const $inputs = $form.find('input, textarea');\r\n const $checkboxes = $form.find('input[type=checkbox]');\r\n\r\n $inputs.val('');\r\n $checkboxes.prop('checked', false);\r\n}\r\n\r\n/**\r\n * Serializes a form input data into an object with the input names mapped to their values\r\n */\r\nexport function formData($form: JQuery | Element): Record {\r\n return $($form).serializeArray().reduce((obj, item) => {\r\n obj[item.name] = item.value;\r\n\r\n return obj;\r\n }, Object.create(null));\r\n}\r\n\r\n/**\r\n * Validates a form control\r\n */\r\nfunction validateControl(formData: Record, key: string, validator: Validator): string | null {\r\n const { required, validations, message } = validator;\r\n const value = formData[key];\r\n\r\n // if required use default message\r\n if (required && !value) {\r\n return message ?? null;\r\n }\r\n\r\n return validations?.find(validation => {\r\n const { pattern, action } = validation;\r\n\r\n // if regex use regex test\r\n // if function run function\r\n if (pattern && !pattern.test(value)) {\r\n return true;\r\n }\r\n\r\n if (typeof action == 'function' && !action(value, formData)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n })?.message ?? null;\r\n}\r\n\r\n/**\r\n * Shows/hides error on form element\r\n */\r\nfunction toggleFormElementValidation($el: (Element | RadioNodeList | JQuery), errorMessage: string | null): void {\r\n const $input = $($el);\r\n const $control = $input.closest(CONTROL_SELECTOR);\r\n const $message = $control.find(MESSAGE_SELECTOR);\r\n const $icon = $control.find(ICON_SELECTOR);\r\n const isValid = !errorMessage;\r\n\r\n // Validation error adds warning icon and warning text\r\n if (!isValid) {\r\n $message.text('' + errorMessage);\r\n\r\n const $errorId = $input.prop('name') + '-error';\r\n\r\n $message.prop('id', $errorId);\r\n $input\r\n .attr('aria-describedby', $errorId)\r\n .addClass(INVALID_CLASS);\r\n } else {\r\n $message.prop('id', false);\r\n $message.empty();\r\n $input\r\n .removeAttr('aria-describedby')\r\n .removeClass(INVALID_CLASS);\r\n }\r\n\r\n // Padding fix for icon\r\n if ($input.prop('type') == 'text' || $input.is('textarea')) {\r\n $input.toggleClass('pr-10', !isValid);\r\n }\r\n\r\n // Hide/show message on success/fail\r\n $message.toggleClass('hidden', isValid);\r\n $icon.toggleClass('hidden', isValid);\r\n}\r\n\r\n/**\r\n * Validate a form using specified validations\r\n */\r\nexport function validateForm(form: HTMLFormElement, validations: Validations, formData: Record): boolean {\r\n let success = true;\n\r\n\r\n Object.keys(validations).forEach((key) => {\r\n // No validation for this element\r\n let errorMessage: string|null = null;\r\n\r\n try {\r\n const validator = validations[key];\r\n errorMessage = validateControl(formData, key, validator);\r\n } catch (ex) {\r\n errorMessage = 'Valideringsfel i fält!';\r\n }\r\n\r\n if (errorMessage != null) {\r\n success = false;\r\n }\r\n\r\n // Show/hide error for form control\r\n toggleFormElementValidation(form.elements[key], errorMessage);\r\n });\r\n\r\n return success;\r\n}\r\n\r\n/**\r\n * Binds necessary events to form controls\r\n */\r\nexport function bindFormValidationEvents(form: HTMLFormElement, submitHandler?: (e: Event) => any) {\r\n const $inputs: JQuery[] = [];\r\n\r\n for (let i = 0; i < form.elements.length; i++) {\r\n const $input = $(form.elements[i]);\r\n const $control = $input.closest(CONTROL_SELECTOR);\r\n\r\n if ($control.length) {\r\n $inputs.push($input);\r\n const tagName = $input.prop('tagName')?.toLowerCase() ?? '';\r\n const type = $input.prop('type')?.toLowerCase() ?? '';\r\n\r\n if (tagName == 'input' && (type == 'radio' || type == 'checkbox')) {\r\n $input.on('change', () => toggleFormElementValidation($input, null));\r\n } else {\r\n $input.on('input', () => toggleFormElementValidation($input, null));\r\n }\r\n }\r\n }\r\n\r\n // Clear validations on submit\r\n form.addEventListener('submit', (e) => {\r\n e.preventDefault();\r\n\r\n // Reset validation before running submit handler\r\n $inputs.forEach(x => toggleFormElementValidation(x, null));\r\n\r\n // If custom submit handler was provided run this beforehand\r\n if (typeof submitHandler == 'function') {\r\n submitHandler(e);\r\n }\r\n }, false);\r\n}\r\n\r\n\r\nexport interface AjaxFormOptions {\r\n form: HTMLFormElement;\r\n type: string;\r\n url: string;\r\n data: any;\r\n process?(response: T): boolean;\r\n done?(response: T): void;\r\n error?(statusText: string): string;\r\n}\r\n\r\n\r\nexport function sendForm(opts: AjaxFormOptions) {\r\n const $form = opts.form;\r\n const $error = $form.querySelector('.form-error');\r\n const $success = $form.querySelector('.form-success');\r\n const defaultError = 'Formuläret kunde inte skickas, kontakta support.';\r\n\r\n // initially hide status texts\r\n $error?.classList.add('hidden');\r\n $success?.classList.add('hidden');\r\n\r\n function onSubmitSuccess(res: TRes): void {\r\n // Show success message\r\n $error?.classList.add('hidden');\r\n $success?.classList.remove('hidden');\r\n\r\n clearForm($form);\r\n\r\n if (typeof opts.done == 'function') {\r\n opts.done(res);\r\n }\r\n }\r\n\r\n function onSubmitError(status: string): void {\r\n // Show error message\r\n $success?.classList.add('hidden');\r\n\r\n if ($error != null) {\r\n let message = defaultError;\r\n\r\n if (typeof opts.error == 'function') {\r\n message = opts.error(status);\r\n }\r\n\r\n $error.classList.remove('hidden');\r\n $error.textContent = message;\r\n }\r\n }\r\n\r\n $.ajax({\r\n type: opts.type,\r\n url: opts.url,\r\n data: JSON.stringify(opts.data),\r\n headers: {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n success: (res, status) => {\r\n let failed = false;\r\n\r\n if (typeof opts.process == 'function') {\r\n failed = !opts.process(res);\r\n }\r\n\r\n if (!failed) {\r\n onSubmitSuccess(res);\r\n } else {\r\n onSubmitError(status);\r\n }\r\n },\r\n error: (_, status) => onSubmitError(status),\r\n });\r\n}\n","const icons: Record = Object.create(null);\r\n\r\n/**\r\n * Clones an icon from the collection\r\n */\r\nfunction iconLoader(id: string): SVGElement | null {\r\n const $icon = icons[id];\r\n\r\n return $icon?.cloneNode(true) as SVGElement;\r\n}\r\n\r\n/**\r\n * Stores icon in the icon collection\r\n */\r\nfunction storeIcon(id: string, $icon: SVGElement | null): void {\r\n const $parent = $icon?.parentNode;\r\n\r\n if ($icon && $parent) {\r\n // Unload icon\r\n $parent.removeChild($icon);\r\n\r\n // Clean icon\r\n $icon.id = '';\r\n $icon.classList.remove('hidden');\r\n\r\n // Save icon in memory\r\n icons[id] = $icon;\r\n }\r\n}\r\n\r\n/**\r\n * Loads all available svg icons to memory\r\n */\r\nexport function preloadIcons(): void {\r\n const $icons = document.querySelectorAll('svg[data-icon]');\r\n $icons.forEach($icon => {\r\n const id = $icon.getAttribute('data-icon')!;\r\n\r\n $icon.removeAttribute('data-icon');\r\n storeIcon(id, $icon as SVGElement);\r\n });\r\n}\r\n\r\n/**\r\n * Loads an icon from the collection or directly from the DOM\r\n */\r\nexport function loadIcon(id: string): SVGElement | null {\r\n let $icon = iconLoader(id);\r\n\r\n if ($icon == null) {\r\n const $el = document.getElementById(id) as SVGElement | null;\r\n\r\n if ($el) {\r\n storeIcon(id, $icon);\r\n\r\n $icon = iconLoader(id);\r\n }\r\n }\r\n\r\n return $icon;\r\n}","export * from './dom';\r\nexport * from './form';\r\nexport * from './iconLoader';\r\n\r\n/**\r\n * Returns true if haystack startsWith needle\r\n */\r\nexport function startsWith(haystack: string, needle: string): boolean {\r\n if (haystack.length >= needle.length) {\r\n return needle === haystack.substring(0, needle.length);\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Serializes an object into a query string\r\n */\r\nexport function querystring(params: object): string {\r\n return Object.keys(params)\r\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key as keyof typeof params])}`)\r\n .join('&');\r\n}\r\n\r\nexport function parseQuery(query: string): Record {\r\n if (!query) {\r\n return {};\r\n }\r\n\r\n if (query.startsWith('?')) {\r\n query = query.substring(1);\r\n }\r\n\r\n const data = query.replace(/&/g, '\",\"').replace(/=/g, '\":\"');\r\n\r\n return JSON.parse('{\"' + data + '\"}', (key, value) => key ? decodeURIComponent(value) : value);\r\n}","import { toggleVisibility } from '../utils';\r\n\r\nconst SELECTORS = {\r\n accordion: '.accordion',\r\n toggleIcons: '.accordion-expand, .accordion-collapse',\r\n toggle: '.accordion-toggle',\r\n button: '.accordion-button',\r\n expand: '.accordion-expand',\r\n collapse: '.accordion-collapse',\r\n};\r\n\r\nconst DATA_OPEN_ACTIVE = 'open-active';\r\nconst DATA_COLLAPSE = 'collapse';\r\nconst PRIMARY_CLASS = 'accordion-primary';\r\n\r\nfunction toggleAccordion($accordion: JQuery, $btn: JQuery, state?: boolean): void {\r\n const expanded = $btn.attr('aria-expanded') == 'true';\r\n\r\n if (typeof state !== 'boolean') {\r\n state = !expanded;\r\n } else if (expanded === state) {\r\n return;\r\n }\r\n\r\n const target = $btn.data('target');\r\n const $submenu = $accordion.find('#' + target);\r\n\r\n if ($accordion.hasClass(PRIMARY_CLASS)) {\r\n // Primary variant, used in the FAQ blocks\r\n $btn.toggleClass(['bg-primary', 'text-white', 'hover:bg-tertiary'], state);\r\n }\r\n\r\n toggleVisibility($btn.find(SELECTORS.collapse), state);\r\n toggleVisibility($btn.find(SELECTORS.expand), !state);\r\n\r\n $btn.attr('aria-expanded', String(state));\r\n $submenu.slideToggle(200).toggleClass('open');\r\n}\r\n\r\nfunction onClick(e: JQuery.ClickEvent | JQuery.KeyDownEvent): void {\r\n e.stopPropagation();\r\n const $btn = $(e.currentTarget);\r\n const $accordion = $btn.closest(SELECTORS.accordion);\r\n const expanded = $btn.attr('aria-expanded') == 'true';\r\n const collapse = $accordion.data(DATA_COLLAPSE) ?? true;\r\n\r\n toggleAccordion($accordion, $btn, !expanded);\r\n\r\n // Close sibling accordions when opening\r\n // TODO: if !expanded && closeSiblings\r\n if (!expanded && collapse) {\r\n $accordion\r\n .siblings(SELECTORS.accordion)\r\n .each((_, el) => {\r\n const $accordion = $(el);\r\n const $btn = $accordion.children('.accordion-header').find(SELECTORS.toggle);\r\n\r\n toggleAccordion($accordion, $btn, false);\r\n });\r\n }\r\n}\r\n\r\n/*\r\n * Accordion menu\r\n * Make accordion fully WCAG compatible\r\n */\r\nexport function registerAccordions(): void {\r\n const $accordion = $(SELECTORS.accordion);\r\n\r\n $accordion\r\n .find(SELECTORS.toggle)\r\n .on('click', (e) => {\r\n const $target = $(e.target);\r\n\r\n // if .accordion-toggle is a, check if in SELECTORS.button, otherwise always allow\r\n // If toggle button was clicked, prevent going to link destination, instead open the menu\r\n if (e.currentTarget.tagName == 'A' && !$target.closest(SELECTORS.button).length) {\r\n return;\r\n }\r\n\r\n onClick(e);\r\n return e.preventDefault();\r\n })\r\n .on('keydown', (e) => {\r\n if (e.key == ' ' || e.key == 'Spacebar') {\r\n onClick(e);\r\n return e.preventDefault();\r\n }\r\n });\r\n\r\n // Open active accordions on load\r\n $accordion\r\n .filter('.active')\r\n .each((_, el) => {\r\n const $el = $(el);\r\n if ($el.data(DATA_OPEN_ACTIVE)) {\r\n $el.find(SELECTORS.button).first().click();\r\n }\r\n });\r\n}","function navigate($el: Element): void {\r\n const link = $el.getAttribute('data-link');\r\n const target = $el.getAttribute('data-target');\r\n\r\n // Synthetic navigation, to allow for noreferrer and noopener\r\n if (link) {\r\n const $anchor = document.createElement('a');\r\n\r\n $anchor.href = link;\r\n $anchor.rel = 'noreferrer noopener';\r\n\r\n // External target, i.e open in another page?\r\n if (target) {\r\n $anchor.target = target;\r\n }\r\n\r\n $anchor.click();\r\n }\r\n}\r\n\r\nfunction registerEvents($card: Element): void {\r\n // If the \"card\" itself was clicked\r\n $card.addEventListener('click', (e) => {\r\n const isTextSelected = !!window.getSelection()?.toString();\r\n\r\n if (!isTextSelected && e.currentTarget) {\r\n navigate(e.currentTarget as Element);\r\n }\r\n });\r\n\n $card.addEventListener('keyup', (e) => {\r\n if (e.key == 'Enter') {\r\n e.preventDefault();\r\n navigate(e.target as Element);\r\n }\r\n });\r\n}\r\n\r\n/*\r\n * Script for accessible \"cards\"\r\n */\r\nexport function registerCards(): void {\r\n const $cards = document.querySelectorAll('[data-link]');\r\n\r\n $cards.forEach($card => registerEvents($card));\r\n}\r\n\r\n/**\r\n * Low level api to create a card dynamically\r\n */\r\nexport function registerCard($card: HTMLElement, url: string, title?: string | null, target?: string | null): HTMLElement {\r\n $card.tabIndex = 0;\r\n $card.setAttribute('data-link', url);\r\n\r\n if (title) {\r\n $card.title = title\r\n $card.setAttribute('aria-label', title);\r\n }\r\n\r\n if (target) {\r\n $card.setAttribute('data-target', target);\r\n }\r\n\n registerEvents($card);\r\n\r\n return $card;\r\n}\r\n","import { toggleVisibility, navFullscreen } from '../utils';\r\n\r\n/*\r\n * Responsive main menu\r\n */\r\nexport function registerNavMenu(): void {\r\n const SELECTORS = {\r\n nav: '#nav-menu',\r\n navToggle: '#nav-menu-toggle',\r\n navToggleExpand: '.menu-expand',\r\n navToggleCollapse: '.menu-collapse',\r\n subnav: '.accordion',\r\n subnavToggleIcons: '.accordion-expand, .accordion-collapse',\r\n subnavToggle: '.accordion-toggle',\r\n };\r\n const CLASSES = {\r\n navToggleActive: ['bg-nav', 'font-medium'],\r\n };\r\n\r\n const $nav = $(SELECTORS.nav);\r\n\r\n function toggleMenu(btn: JQuery | HTMLButtonElement, state?: boolean): void {\r\n const $btn = $(btn);\r\n state = state ?? $btn.attr('aria-expanded') != 'true';\r\n\r\n $btn.attr('aria-expanded', String(state));\r\n toggleVisibility($btn.find(SELECTORS.navToggleExpand), !state);\r\n toggleVisibility($btn.find(SELECTORS.navToggleCollapse), state);\r\n\r\n if (state) {\r\n $btn.addClass(CLASSES.navToggleActive);\r\n } else {\r\n $btn.removeClass(CLASSES.navToggleActive);\r\n }\r\n\r\n toggleVisibility($nav, state);\r\n navFullscreen(state);\r\n }\r\n\r\n // Navigation (close search menu if its open)\r\n $(SELECTORS.navToggle).on('click', (e: JQuery.ClickEvent, prevent?: boolean) => {\r\n if (!prevent) {\r\n $(e.currentTarget).siblings('button').trigger('click', [true]);\r\n toggleMenu(e.currentTarget);\r\n } else {\r\n toggleMenu(e.currentTarget, false);\r\n }\r\n });\r\n}\r\n\r\n/*\r\n * Responsive search menu\r\n */\r\nexport function registerNavSearch(): void {\r\n const SELECTORS = {\r\n search: '#nav-search',\r\n toggle: '#nav-search-toggle',\r\n field: '#search-field',\r\n expand: '.search-expand',\r\n collapse: '.search-collapse',\r\n };\r\n const CLASSES = {\r\n toggleActive: ['bg-search', 'font-medium', 'text-body'],\r\n };\r\n\r\n const $search = $(SELECTORS.search);\r\n\r\n function toggleSearch(btn: JQuery | HTMLElement, state?: boolean): void {\r\n const $btn = $(btn);\r\n state = state ?? $btn.attr('aria-expanded') != 'true';\r\n\r\n $btn.attr('aria-expanded', String(state));\r\n toggleVisibility($btn.find(SELECTORS.collapse), state);\r\n toggleVisibility($btn.find(SELECTORS.expand), !state);\r\n\r\n if (state) {\r\n $btn.addClass(CLASSES.toggleActive);\r\n } else {\r\n $btn.removeClass(CLASSES.toggleActive);\r\n }\r\n\r\n toggleVisibility($search, state);\r\n navFullscreen(state);\r\n }\r\n\r\n // Seach menu (close navigation menu if its open)\r\n $(SELECTORS.toggle).click((e, prevent?: boolean) => {\r\n if (!prevent) {\r\n $(e.currentTarget).siblings('button').trigger('click', [true]);\r\n toggleSearch(e.currentTarget);\r\n } else {\r\n toggleSearch(e.currentTarget, false);\r\n }\r\n });\r\n}","import { formData, validateForm, Validations, bindFormValidationEvents, sendForm } from '../utils';\r\n\r\nexport function registerAccessibilityBlock(): void {\r\n const FORM_ID = 'accessibility-form';\r\n const VALIDATIONS: Validations = {\r\n pagelink: {\r\n message: 'Sidolänksfältet får inte lämnas tomt.',\r\n required: true,\r\n },\r\n device: {\r\n message: 'Hjälpmedelsfältet får inte lämnas tomt.',\r\n required: true,\r\n },\r\n };\r\n\r\n const $form = document.getElementById(FORM_ID) as HTMLFormElement;\r\n\r\n function onFormSubmit(): void {\r\n // Send form\r\n const data = formData($form);\r\n\r\n if (!validateForm($form, VALIDATIONS, data)) {\r\n console.error('Validation failed for form');\r\n return;\r\n }\r\n\r\n sendForm({\r\n form: $form,\r\n type: $form.method || 'POST',\r\n url: $form.action,\r\n data,\r\n });\r\n }\n\r\n // Initialize events\r\n if ($form != null) {\r\n // Bind form validation events\r\n bindFormValidationEvents($form, onFormSubmit);\r\n }\r\n}\r\n","import { formData, validateForm, Validations, bindFormValidationEvents, sendForm } from '../utils';\r\n\r\n\r\nexport function registerContactBlock(): void {\r\n const FORM_ID = 'contact-form';\r\n const VALIDATIONS: Validations = {\n phone: {\r\n validations: [\n {\r\n message: 'Telefonnumret kan bara innehålla siffror.',\n pattern: /^[0-9]*$/\r\n },\n ],\r\n },\r\n email: {\r\n validations: [\n {\n message: 'E-postadressen måste innehålla @ och punkt före den sista delen (.se, .com etc).',\n pattern: /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\r\n },\n ],\r\n },\r\n gdpr: {\n message: 'Markera kryssrutan om du vill fortsätta.',\n required: true,\n validations: [\n {\n message: 'Markera kryssrutan om du vill fortsätta.',\n action(value) {\r\n // Should be checked\r\n return !!value;\r\n }\r\n },\n ],\r\n },\r\n };\r\n\r\n const $form = document.getElementById(FORM_ID) as HTMLFormElement;\r\n\r\n function onFormSubmit(): void {\r\n // Send form\r\n const data = formData($form);\r\n\r\n if (!validateForm($form, VALIDATIONS, data)) {\r\n console.error('Validation failed for form');\r\n return;\r\n }\n\r\n // Force gdpr input to have value when sending the request\n const $gdpr = document.querySelector('#gdpr');\n const gdpr = $gdpr?.checked ?? false;\r\n\r\n sendForm({\r\n form: $form,\r\n type: $form.method || 'POST',\r\n url: $form.action,\r\n data: {\n gdpr,\n ...data,\r\n },\r\n });\r\n }\n\r\n // Initialize events\r\n if ($form != null) {\r\n // Bind form validation events\r\n bindFormValidationEvents($form, onFormSubmit);\r\n }\r\n}\r\n","import { startsWith } from '../utils';\r\n\r\nconst BLOCK_SELECTOR = '.video';\r\nconst BLOCK_BTN_SELECTOR = '.video__action';\r\nconst DATA_ID = 'video-id';\r\nconst YT_EMBED_URL = 'https://www.youtube.com/embed/';\r\nconst YT_ID_LEN = 11;\r\n\r\nfunction swapVideo(e: JQuery.ClickEvent): void {\r\n e.preventDefault();\r\n\r\n // get current id from src\r\n // if url not starts with YT_EMBED_URL, set to first video\r\n // otherwise increment upwards and reverse back when reached the end of the ID\r\n const $target = $(e.currentTarget);\r\n const $block = $target.parent(BLOCK_SELECTOR);\r\n const $video = $block.find('iframe');\r\n\r\n const ids = $block.data(DATA_ID)?.split(',') ?? [];\r\n const videoSrc = $video.prop('src');\r\n let nextIndex = 0;\r\n\r\n if (startsWith(videoSrc, YT_EMBED_URL)) {\r\n const currentId = videoSrc.substring(YT_EMBED_URL.length, YT_EMBED_URL.length + YT_ID_LEN);\r\n\r\n // If index is not found, nextId is set to 0\r\n nextIndex = ids.indexOf(currentId) + 1;\r\n\r\n // Wrap video id, if there is only 1 index\r\n if (nextIndex >= ids.length) {\r\n nextIndex = 0;\r\n }\r\n }\r\n\r\n // Set new iframe src\r\n $video.prop('src', YT_EMBED_URL + ids[nextIndex]);\r\n}\r\n\r\n/*\r\n * Video block\r\n */\r\nexport function registerVideoBlock(): void {\r\n const $blocks = $(BLOCK_SELECTOR);\r\n\r\n $blocks\r\n .find(BLOCK_BTN_SELECTOR)\r\n .on('click', swapVideo);\r\n}","import { registerCard } from '../components/card';\r\nimport { createElement, formData, querystring, loadIcon } from '../utils';\r\n\r\nenum SearchHitType {\r\n Document = 'Document',\r\n Link = 'Link',\r\n}\r\n\r\ninterface SearchHit {\r\n title: string | null;\r\n url: string | null;\r\n excerpt: string | null;\r\n type: SearchHitType;\r\n}\r\n\r\ninterface SearchResponse {\r\n searchInFiles: boolean;\r\n pageSize: number;\r\n page: number;\r\n hasNext: boolean;\r\n hits: SearchHit[] | null;\r\n totalHits: number;\r\n}\r\n\r\ninterface SearchRequest {\r\n query: string;\r\n page: number;\r\n searchInFiles: boolean | null;\r\n}\r\n\r\n/*\r\n * Helper function for toggling hidden class\r\n */\r\nexport function registerSearchPage(): void {\r\n const FORM_SELECTOR = '#searchForm';\r\n const HITS_SELECTOR = '#searchResults';\r\n const INFO_SELECTOR = '#searchInfo';\r\n const NEXT_SELECTOR = '#showMoreResults';\r\n const SPINNER_SELECTOR = '#searchSpinner';\r\n const SEARCH_ENDPOINT = '/api/search';\r\n const DOCUMENT_ICON_ID = 'iconDocument';\r\n const LINK_ICON_ID = 'iconLink';\r\n\r\n const $info = $(INFO_SELECTOR);\r\n const $hits = $(HITS_SELECTOR);\r\n const $next = $(NEXT_SELECTOR);\r\n const $form = $(FORM_SELECTOR);\r\n const $spinner = $(SPINNER_SELECTOR);\r\n\r\n // Keep track of last reuqests state\r\n let state: SearchRequest = {\r\n query: '',\r\n page: 1,\r\n searchInFiles: false,\r\n };\r\n\r\n function createHit(hit: SearchHit): Element {\r\n let $icon: SVGElement | null = null;\r\n\r\n if (hit.type == SearchHitType.Document) {\r\n $icon = loadIcon(DOCUMENT_ICON_ID);\r\n } else {\r\n $icon = loadIcon(LINK_ICON_ID)\r\n }\r\n\r\n const $hit = createElement('div', 'group flex flex-col mb-5 cursor-pointer focus:outline-none focus-visible:outline-secondary',\r\n createElement('div', 'inline-flex',\r\n $icon,\r\n createElement('span', 'flex-1 leading-snug font-medium underline lg:no-underline group-hover:underline', hit.title),\r\n ),\r\n hit.excerpt && createElement('p', 'ml-8 leading-snug', hit.excerpt),\r\n );\r\n\r\n registerCard($hit, hit.url ?? '#', hit.title);\r\n\r\n return $hit;\r\n }\r\n\r\n function postSearch(request: SearchRequest): void {\r\n if (request.page == 1) {\r\n $hits.empty();\r\n $info.empty();\r\n\r\n if (!request.query) {\r\n const $strong = createElement('strong', 'bold', 'Sök');\r\n\r\n $info.append('Inget sökresultat visas eftersom sökrutan inte var ifylld. Fyll i sökrutan och klicka på knappen ”', $strong, '”.');\r\n $next.addClass('hidden');\r\n return;\r\n }\r\n }\r\n\r\n // Hide next button, show spinner\r\n $next.addClass('hidden');\r\n $spinner.removeClass('hidden');\r\n\r\n $.getJSON(`${SEARCH_ENDPOINT}?${querystring(request)}`)\r\n .done((res: SearchResponse) => {\r\n if (Array.isArray(res.hits)) {\r\n res.hits.forEach((hit) => {\r\n $hits.append(createHit(hit));\r\n });\r\n }\r\n\r\n // Show/hide next button\r\n $next.toggleClass('hidden', !res.hasNext);\r\n\r\n // Set info text on first fetch\r\n if (res.page == 1) {\r\n const $strong = createElement('strong', 'bold', request.query);\r\n\r\n $info.append('Din sökning på ”', $strong, `” gav ${res.totalHits ?? 0} träffar`);\r\n }\r\n\r\n request.page += 1;\r\n })\r\n .fail(() => {\r\n console.log('Request failed');\r\n })\r\n .always(() => {\r\n $spinner.addClass('hidden');\r\n state = request;\r\n });\r\n }\r\n\r\n function postForm(): void {\r\n const { query, searchInFiles } = formData($form);\r\n\r\n postSearch({\r\n query,\r\n page: 1,\r\n searchInFiles: searchInFiles == 'true',\r\n });\r\n }\r\n\r\n if ($form.length) {\r\n $next.on('click', () => postSearch(state));\r\n\r\n // Initialize\r\n $form.on('submit', (e: JQuery.SubmitEvent) => {\r\n e.preventDefault();\r\n\r\n postForm();\r\n });\r\n\r\n // Do initial search\r\n postForm();\r\n }\r\n}\r\n","/* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */\n(function () {\n 'use strict';\n\n // polyfill\n function polyfill() {\n // aliases\n var w = window;\n var d = document;\n\n // return if scroll behavior is supported and polyfill is not forced\n if (\n 'scrollBehavior' in d.documentElement.style &&\n w.__forceSmoothScrollPolyfill__ !== true\n ) {\n return;\n }\n\n // globals\n var Element = w.HTMLElement || w.Element;\n var SCROLL_TIME = 468;\n\n // object gathering original scroll methods\n var original = {\n scroll: w.scroll || w.scrollTo,\n scrollBy: w.scrollBy,\n elementScroll: Element.prototype.scroll || scrollElement,\n scrollIntoView: Element.prototype.scrollIntoView\n };\n\n // define timing method\n var now =\n w.performance && w.performance.now\n ? w.performance.now.bind(w.performance)\n : Date.now;\n\n /**\n * indicates if a the current browser is made by Microsoft\n * @method isMicrosoftBrowser\n * @param {String} userAgent\n * @returns {Boolean}\n */\n function isMicrosoftBrowser(userAgent) {\n var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];\n\n return new RegExp(userAgentPatterns.join('|')).test(userAgent);\n }\n\n /*\n * IE has rounding bug rounding down clientHeight and clientWidth and\n * rounding up scrollHeight and scrollWidth causing false positives\n * on hasScrollableSpace\n */\n var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;\n\n /**\n * changes scroll position inside an element\n * @method scrollElement\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n */\n function scrollElement(x, y) {\n this.scrollLeft = x;\n this.scrollTop = y;\n }\n\n /**\n * returns result of applying ease math function to a number\n * @method ease\n * @param {Number} k\n * @returns {Number}\n */\n function ease(k) {\n return 0.5 * (1 - Math.cos(Math.PI * k));\n }\n\n /**\n * indicates if a smooth behavior should be applied\n * @method shouldBailOut\n * @param {Number|Object} firstArg\n * @returns {Boolean}\n */\n function shouldBailOut(firstArg) {\n if (\n firstArg === null ||\n typeof firstArg !== 'object' ||\n firstArg.behavior === undefined ||\n firstArg.behavior === 'auto' ||\n firstArg.behavior === 'instant'\n ) {\n // first argument is not an object/null\n // or behavior is auto, instant or undefined\n return true;\n }\n\n if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {\n // first argument is an object and behavior is smooth\n return false;\n }\n\n // throw error when behavior is not supported\n throw new TypeError(\n 'behavior member of ScrollOptions ' +\n firstArg.behavior +\n ' is not a valid value for enumeration ScrollBehavior.'\n );\n }\n\n /**\n * indicates if an element has scrollable space in the provided axis\n * @method hasScrollableSpace\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function hasScrollableSpace(el, axis) {\n if (axis === 'Y') {\n return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n }\n\n if (axis === 'X') {\n return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n }\n }\n\n /**\n * indicates if an element has a scrollable overflow property in the axis\n * @method canOverflow\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function canOverflow(el, axis) {\n var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];\n\n return overflowValue === 'auto' || overflowValue === 'scroll';\n }\n\n /**\n * indicates if an element can be scrolled in either axis\n * @method isScrollable\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function isScrollable(el) {\n var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');\n var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');\n\n return isScrollableY || isScrollableX;\n }\n\n /**\n * finds scrollable parent of an element\n * @method findScrollableParent\n * @param {Node} el\n * @returns {Node} el\n */\n function findScrollableParent(el) {\n while (el !== d.body && isScrollable(el) === false) {\n el = el.parentNode || el.host;\n }\n\n return el;\n }\n\n /**\n * self invoked function that, given a context, steps through scrolling\n * @method step\n * @param {Object} context\n * @returns {undefined}\n */\n function step(context) {\n var time = now();\n var value;\n var currentX;\n var currentY;\n var elapsed = (time - context.startTime) / SCROLL_TIME;\n\n // avoid elapsed times higher than one\n elapsed = elapsed > 1 ? 1 : elapsed;\n\n // apply easing to elapsed time\n value = ease(elapsed);\n\n currentX = context.startX + (context.x - context.startX) * value;\n currentY = context.startY + (context.y - context.startY) * value;\n\n context.method.call(context.scrollable, currentX, currentY);\n\n // scroll more if we have not reached our destination\n if (currentX !== context.x || currentY !== context.y) {\n w.requestAnimationFrame(step.bind(w, context));\n }\n }\n\n /**\n * scrolls window or element with a smooth behavior\n * @method smoothScroll\n * @param {Object|Node} el\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n */\n function smoothScroll(el, x, y) {\n var scrollable;\n var startX;\n var startY;\n var method;\n var startTime = now();\n\n // define scroll context\n if (el === d.body) {\n scrollable = w;\n startX = w.scrollX || w.pageXOffset;\n startY = w.scrollY || w.pageYOffset;\n method = original.scroll;\n } else {\n scrollable = el;\n startX = el.scrollLeft;\n startY = el.scrollTop;\n method = scrollElement;\n }\n\n // scroll looping over a frame\n step({\n scrollable: scrollable,\n method: method,\n startTime: startTime,\n startX: startX,\n startY: startY,\n x: x,\n y: y\n });\n }\n\n // ORIGINAL METHODS OVERRIDES\n // w.scroll and w.scrollTo\n w.scroll = w.scrollTo = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scroll.call(\n w,\n arguments[0].left !== undefined\n ? arguments[0].left\n : typeof arguments[0] !== 'object'\n ? arguments[0]\n : w.scrollX || w.pageXOffset,\n // use top prop, second argument if present or fallback to scrollY\n arguments[0].top !== undefined\n ? arguments[0].top\n : arguments[1] !== undefined\n ? arguments[1]\n : w.scrollY || w.pageYOffset\n );\n\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n w,\n d.body,\n arguments[0].left !== undefined\n ? ~~arguments[0].left\n : w.scrollX || w.pageXOffset,\n arguments[0].top !== undefined\n ? ~~arguments[0].top\n : w.scrollY || w.pageYOffset\n );\n };\n\n // w.scrollBy\n w.scrollBy = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0])) {\n original.scrollBy.call(\n w,\n arguments[0].left !== undefined\n ? arguments[0].left\n : typeof arguments[0] !== 'object' ? arguments[0] : 0,\n arguments[0].top !== undefined\n ? arguments[0].top\n : arguments[1] !== undefined ? arguments[1] : 0\n );\n\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n w,\n d.body,\n ~~arguments[0].left + (w.scrollX || w.pageXOffset),\n ~~arguments[0].top + (w.scrollY || w.pageYOffset)\n );\n };\n\n // Element.prototype.scroll and Element.prototype.scrollTo\n Element.prototype.scroll = Element.prototype.scrollTo = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n // if one number is passed, throw error to match Firefox implementation\n if (typeof arguments[0] === 'number' && arguments[1] === undefined) {\n throw new SyntaxError('Value could not be converted');\n }\n\n original.elementScroll.call(\n this,\n // use left prop, first number argument or fallback to scrollLeft\n arguments[0].left !== undefined\n ? ~~arguments[0].left\n : typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,\n // use top prop, second argument or fallback to scrollTop\n arguments[0].top !== undefined\n ? ~~arguments[0].top\n : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop\n );\n\n return;\n }\n\n var left = arguments[0].left;\n var top = arguments[0].top;\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n this,\n this,\n typeof left === 'undefined' ? this.scrollLeft : ~~left,\n typeof top === 'undefined' ? this.scrollTop : ~~top\n );\n };\n\n // Element.prototype.scrollBy\n Element.prototype.scrollBy = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.elementScroll.call(\n this,\n arguments[0].left !== undefined\n ? ~~arguments[0].left + this.scrollLeft\n : ~~arguments[0] + this.scrollLeft,\n arguments[0].top !== undefined\n ? ~~arguments[0].top + this.scrollTop\n : ~~arguments[1] + this.scrollTop\n );\n\n return;\n }\n\n this.scroll({\n left: ~~arguments[0].left + this.scrollLeft,\n top: ~~arguments[0].top + this.scrollTop,\n behavior: arguments[0].behavior\n });\n };\n\n // Element.prototype.scrollIntoView\n Element.prototype.scrollIntoView = function() {\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scrollIntoView.call(\n this,\n arguments[0] === undefined ? true : arguments[0]\n );\n\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n var scrollableParent = findScrollableParent(this);\n var parentRects = scrollableParent.getBoundingClientRect();\n var clientRects = this.getBoundingClientRect();\n\n if (scrollableParent !== d.body) {\n // reveal element inside parent\n smoothScroll.call(\n this,\n scrollableParent,\n scrollableParent.scrollLeft + clientRects.left - parentRects.left,\n scrollableParent.scrollTop + clientRects.top - parentRects.top\n );\n\n // reveal parent in viewport unless is fixed\n if (w.getComputedStyle(scrollableParent).position !== 'fixed') {\n w.scrollBy({\n left: parentRects.left,\n top: parentRects.top,\n behavior: 'smooth'\n });\n }\n } else {\n // reveal element in viewport\n w.scrollBy({\n left: clientRects.left,\n top: clientRects.top,\n behavior: 'smooth'\n });\n }\n };\n }\n\n if (typeof exports === 'object' && typeof module !== 'undefined') {\n // commonjs\n module.exports = { polyfill: polyfill };\n } else {\n // global\n polyfill();\n }\n\n}());\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. ¯\\_(ツ)_/¯\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n","import { preloadIcons } from './utils';\r\n\r\n// components\r\nimport { registerAccordions } from './components/accordion';\r\nimport { registerCards } from './components/card';\r\nimport { registerNavMenu, registerNavSearch } from './components/nav';\r\n\r\n// blocks\r\nimport { registerAccessibilityBlock } from './blocks/accessibilityReport';\r\nimport { registerContactBlock } from './blocks/contact';\r\nimport { registerVideoBlock } from './blocks/video';\n\r\n// pages\r\nimport { registerSearchPage } from './pages/search';\r\n\r\n// polyfills and styles\r\nimport 'smoothscroll-polyfill';\r\nimport 'focus-visible';\r\nimport '../Styles/style.css';\r\n\r\n$(function () {\r\n // First preload all the icons and store in icon collection\r\n preloadIcons();\r\n\r\n // Register components\r\n registerAccordions();\r\n registerCards();\r\n registerNavMenu();\r\n registerNavSearch();\r\n\r\n // Blocks\n registerAccessibilityBlock();\n registerContactBlock();\r\n registerVideoBlock();\r\n\r\n // Pages\r\n registerSearchPage();\r\n\r\n /*\r\n * Scroll to top button (with IE polyfill)\r\n */\r\n $('#scroll-to-top').click((e: JQuery.ClickEvent) => {\r\n e.preventDefault();\r\n\r\n try {\r\n window.scrollTo({ top: 0, left: 0, behavior: 'smooth' });\r\n } catch (ex) {\r\n $(window).scrollTop(0);\r\n }\r\n });\r\n\r\n /*\r\n * Tab fix for annoying safari accessibility setting\r\n * Uses jQuery.tabbable to fix this, ugly hack\r\n * Could possibly look for a better fix in the future\r\n * Only use this hack for MacBooks (safari) as the issue only originates from here\r\n * As we want the browser to resolve the next tab target on it's own if it's capable to do so\r\n */\r\n function handleDocumentKeyDown(e: JQuery.KeyDownEvent): void {\r\n if (e.key == 'Tab') {\r\n e.preventDefault();\r\n\r\n if (e.shiftKey) {\r\n // @ts-ignore\r\n $.tabPrev();\r\n } else {\r\n // @ts-ignore\r\n $.tabNext();\r\n }\r\n }\r\n }\r\n\r\n const isMacLike = /^(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\r\n if (isMacLike) {\r\n $(document).on('keydown', handleDocumentKeyDown);\r\n }\r\n});\r\n\r\n"],"names":["toggleVisibility","el","override","className","$el","navFullscreen","state","createElement","tagName","children","child","node","INVALID_CLASS","CONTROL_SELECTOR","MESSAGE_SELECTOR","ICON_SELECTOR","clearForm","form","$form","$inputs","$checkboxes","formData","obj","item","validateControl","key","validator","required","validations","message","value","_b","_a","validation","pattern","action","toggleFormElementValidation","errorMessage","$input","$control","$message","$icon","isValid","$errorId","validateForm","success","bindFormValidationEvents","submitHandler","i","type","_d","_c","e","x","sendForm","opts","$error","$success","defaultError","onSubmitSuccess","res","onSubmitError","status","failed","_","icons","iconLoader","id","storeIcon","$parent","preloadIcons","loadIcon","startsWith","haystack","needle","querystring","params","SELECTORS","DATA_OPEN_ACTIVE","DATA_COLLAPSE","PRIMARY_CLASS","toggleAccordion","$accordion","$btn","expanded","target","$submenu","onClick","collapse","registerAccordions","$target","navigate","link","$anchor","registerEvents","$card","registerCards","registerCard","url","title","registerNavMenu","CLASSES","$nav","toggleMenu","btn","prevent","registerNavSearch","$search","toggleSearch","registerAccessibilityBlock","FORM_ID","VALIDATIONS","onFormSubmit","data","registerContactBlock","$gdpr","gdpr","BLOCK_SELECTOR","BLOCK_BTN_SELECTOR","DATA_ID","YT_EMBED_URL","YT_ID_LEN","swapVideo","$block","$video","ids","videoSrc","nextIndex","currentId","registerVideoBlock","registerSearchPage","FORM_SELECTOR","HITS_SELECTOR","INFO_SELECTOR","NEXT_SELECTOR","SPINNER_SELECTOR","SEARCH_ENDPOINT","DOCUMENT_ICON_ID","LINK_ICON_ID","$info","$hits","$next","$spinner","createHit","hit","$hit","postSearch","request","$strong","postForm","query","searchInFiles","polyfill","w","d","Element","SCROLL_TIME","original","scrollElement","now","isMicrosoftBrowser","userAgent","userAgentPatterns","ROUNDING_TOLERANCE","y","ease","k","shouldBailOut","firstArg","hasScrollableSpace","axis","canOverflow","overflowValue","isScrollable","isScrollableY","isScrollableX","findScrollableParent","step","context","time","currentX","currentY","elapsed","smoothScroll","scrollable","startX","startY","method","startTime","left","top","scrollableParent","parentRects","clientRects","module","global","factory","this","applyFocusVisiblePolyfill","scope","hadKeyboardEvent","hadFocusVisibleRecently","hadFocusVisibleRecentlyTimeout","inputTypesAllowlist","isValidFocusTarget","focusTriggersKeyboardModality","addFocusVisibleClass","removeFocusVisibleClass","onKeyDown","onPointerDown","onFocus","onBlur","onVisibilityChange","addInitialPointerMoveListeners","onInitialPointerMove","removeInitialPointerMoveListeners","event","handleDocumentKeyDown"],"mappings":"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"}