{"version":3,"file":"runtime.js","sources":["../src/components/secondary-nav.ts","../src/components/accordion.ts","../src/components/dropdown.ts","../src/components/validated-form.ts","../src/components/product-module.ts","../src/components/slider.ts","../src/runtime.ts"],"sourcesContent":["export class SecondaryNav {\r\n\troot: HTMLFormElement;\r\n\r\n\tconstructor(root: HTMLFormElement) {\r\n\t\tthis.root = root;\r\n\t\tthis.root.dataset.secondaryNav = '';\r\n\t\tthis.bindEvents();\r\n\t}\r\n\r\n\tbindEvents = () => {\r\n\t\tconst navMenu = this.root.querySelector<HTMLElement>('ul.nav-menu');\r\n\t\tif (!navMenu) return;\r\n\r\n\t\tconst openMobileMenu = () => {\r\n\t\t\tthis.root.scrollIntoView({\r\n\t\t\t\tbehavior: 'smooth',\r\n\t\t\t\tblock: 'start'\r\n\t\t\t});\r\n\t\t\tthis.root.dataset.mobileMenuActive = 'true';\r\n\t\t\tnavMenu.dataset.menuActive = 'true';\r\n\t\t};\r\n\r\n\t\tconst closeMobileMenu = () => {\r\n\t\t\tdelete this.root.dataset.mobileMenuActive;\r\n\t\t\tdelete navMenu.dataset.menuActive;\r\n\t\t};\r\n\r\n\t\tlet mobileMenuDisabled = false;\r\n\t\tconst updateMobileMenuDisabledState = () => {\r\n\t\t\tmobileMenuDisabled = document.body.clientWidth >= 1280;\r\n\t\t\tif (mobileMenuDisabled && !this.root.hasAttribute('data-accordion-disabled')) {\r\n\t\t\t\tthis.root.dataset.accordionDisabled = '';\r\n\t\t\t} else if (!mobileMenuDisabled && this.root.hasAttribute('data-accordion-disabled')) {\r\n\t\t\t\tdelete this.root.dataset.accordionDisabled;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.root.querySelectorAll('.page-container > [data-accordion-toggle]').forEach(toggle => {\r\n\t\t\ttoggle.addEventListener('click', () => {\r\n\t\t\t\tif (mobileMenuDisabled) return;\r\n\t\t\t\tif (navMenu.dataset.menuActive) closeMobileMenu();\r\n\t\t\t\telse openMobileMenu();\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\twindow.addEventListener('resize', updateMobileMenuDisabledState);\r\n\t\tupdateMobileMenuDisabledState();\r\n\t};\r\n}\r\n\r\nconst _instances: SecondaryNav[] = [];\r\n\r\nexport const init = () => {\r\n\tconst navs = Array.from(document.querySelectorAll<HTMLFormElement>('header.secondary-nav'));\r\n\r\n\tfor (const root of navs) {\r\n\t\tif (!('secondaryNav' in root.dataset) && !_instances.find(nav => nav.root === root)) _instances.push(new SecondaryNav(root));\r\n\t}\r\n};\r\n\r\nexport default {\r\n\tinit\r\n};\r\n","import { generateId } from '../helpers/index.js';\r\n\r\nexport class Accordion {\r\n\troot: HTMLElement;\r\n\ttoggles: HTMLElement[];\r\n\tcontent: HTMLElement | null;\r\n\tcontentObserver: ResizeObserver;\r\n\tcontentHeight = 'auto';\r\n\r\n\tid: string;\r\n\tgroup: string | null;\r\n\tisOpen: boolean;\r\n\r\n\tconstructor(root: HTMLElement) {\r\n\t\tthis.root = root;\r\n\t\tthis.content = root.querySelector<HTMLElement>('[data-accordion-content]');\r\n\t\tif (this.content == null) console.warn('[ui:accordion] No content element found.');\r\n\r\n\t\tthis.id = root.dataset.accordion || generateId('accordion');\r\n\t\tthis.group = root.dataset.accordionGroup || null;\r\n\t\tif (root.dataset.accordion !== this.id) root.dataset.accordion = this.id;\r\n\r\n\t\t// add all id-irrelevant toggles inside this accordion\r\n\t\tthis.toggles = Array.from(root.querySelectorAll<HTMLElement>('[data-accordion-toggle=\"\"]'));\r\n\r\n\t\t// add all toggles elsewhere in the document that point specifically to this accordion's id\r\n\t\tdocument.querySelectorAll<HTMLElement>(`[data-accordion-toggle=\"${this.id}\"]`).forEach(toggle => {\r\n\t\t\tthis.toggles.push(toggle);\r\n\t\t});\r\n\r\n\t\tthis.contentObserver = new ResizeObserver(this.updateHeight);\r\n\r\n\t\tthis.isOpen = root.dataset.accordionOpen == 'true' || false;\r\n\t}\r\n\r\n\topen = () => {\r\n\t\tif (this.root.hasAttribute('data-accordion-disabled')) return;\r\n\r\n\t\tthis.root.dataset.accordionOpen = 'true';\r\n\t\tthis.content?.classList.add('accordion-open');\r\n\t\tthis.isOpen = true;\r\n\t\tthis.updateHeight();\r\n\r\n\t\t// close all other accordions from the same group\r\n\t\tif (this.group && window.StandardUI.accordion) {\r\n\t\t\tconst targets = window.StandardUI.accordion.instances.filter(acc => acc.group === this.group && acc.id !== this.id);\r\n\t\t\tfor (const accordion of targets) accordion.close();\r\n\t\t}\r\n\t};\r\n\r\n\tclose = () => {\r\n\t\tif (this.root.hasAttribute('data-accordion-disabled')) return;\r\n\r\n\t\tdelete this.root.dataset.accordionOpen;\r\n\t\tthis.content?.classList.remove('accordion-open');\r\n\t\tthis.isOpen = false;\r\n\t\tif (this.content) this.content.style.maxHeight = this.content.scrollHeight + 'px';\r\n\t\tthis.updateHeight();\r\n\t};\r\n\r\n\ttoggle = (evt?: MouseEvent) => {\r\n\t\tif (this.root.dataset.accordionOpen) this.close();\r\n\t\telse this.open();\r\n\r\n\t\tif (evt) evt.preventDefault();\r\n\t};\r\n\r\n\tinit = () => {\r\n\t\tfor (const t of this.toggles) {\r\n\t\t\tt.addEventListener('click', this.toggle);\r\n\t\t}\r\n\r\n\t\tif (this.content) this.contentObserver.observe(this.content);\r\n\t\twindow.addEventListener('resize', this.updateHeight);\r\n\t\tthis.updateHeight();\r\n\t};\r\n\r\n\tdestroy = () => {\r\n\t\tfor (const t of this.toggles) {\r\n\t\t\tt.removeEventListener('click', this.toggle);\r\n\t\t}\r\n\r\n\t\tif (this.content) this.contentObserver.disconnect();\r\n\r\n\t\twindow.removeEventListener('resize', this.updateHeight);\r\n\t};\r\n\r\n\tupdateHeight = () => {\r\n\t\tif (!this.content) return;\r\n\t\tthis.contentHeight = this.content.scrollHeight + 'px';\r\n\t\tthis.content.dataset.height = this.contentHeight;\r\n\r\n\t\tif (this.isOpen && this.content.clientHeight === this.content.scrollHeight) {\r\n\t\t\t// when the accordion is opening and it has reached its target height, we set the max-height to auto\r\n\t\t\tthis.content.style.maxHeight = 'none';\r\n\t\t} else {\r\n\t\t\t// for all other cases, we wait for the transition to naturally happen\r\n\t\t\tthis.content.style.maxHeight = this.isOpen ? this.contentHeight : '0px';\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport const init = () => {\r\n\tconst accordions = Array.from(document.querySelectorAll<HTMLElement>('[data-accordion]'));\r\n\tif (!window.StandardUI.accordion) window.StandardUI.accordion = { init, instances: [] };\r\n\r\n\tfor (const root of accordions) {\r\n\t\tif (!window.StandardUI.accordion.instances.find(x => x.root === root)) {\r\n\t\t\tconst accordion = new Accordion(root);\r\n\t\t\taccordion.init();\r\n\t\t\twindow.StandardUI.accordion.instances.push(accordion);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport default {\r\n\tinit,\r\n};\r\n","import { Instance as PopperInstance, createPopper, preventOverflow, flip } from '@popperjs/core';\r\n\r\nexport type DropdownOption = {\r\n\ttext: string;\r\n\tvalue: string;\r\n\tcontent: string;\r\n\tdisabled: boolean;\r\n};\r\n\r\nexport type DropdownOptionGroup = {\r\n\tlabel: string;\r\n\toptions: DropdownOption[];\r\n};\r\n\r\nexport class Dropdown {\r\n\troot: HTMLElement;\r\n\tselect: HTMLSelectElement;\r\n\tmultiple: boolean;\r\n\tsearchInput: HTMLInputElement;\r\n\toptions: (DropdownOption | DropdownOptionGroup)[] = [];\r\n\tdropdown: HTMLElement;\r\n\tdropdownOptions: HTMLElement;\r\n\tpopper: PopperInstance;\r\n\r\n\tkeyboardFocus = -1;\r\n\r\n\tconstructor(root: HTMLElement) {\r\n\t\tthis.root = root;\r\n\r\n\t\tconst select = root.querySelector('select');\r\n\t\tif (!select) throw new Error('[ui:dropdown] Dropdown element has no <select> tag.');\r\n\t\tthis.select = select;\r\n\t\tthis.select.tabIndex = -1;\r\n\t\tthis.multiple = select.multiple;\r\n\r\n\t\t// visible input for searching options\r\n\t\tthis.searchInput = document.createElement('input');\r\n\t\tthis.searchInput.type = 'text';\r\n\t\tthis.searchInput.name = select.name.replace(/[[\\]]/g, '-') + '--q';\r\n\t\tthis.searchInput.placeholder = root.dataset.dropdownPlaceholder || '';\r\n\r\n\t\t// parse <option> tags from select\r\n\t\tthis.parseOptions();\r\n\r\n\t\t// build schema for popup with options\r\n\t\tthis.dropdown = document.createElement('div');\r\n\t\tthis.dropdown.className = 'dropdown-popup';\r\n\t\tthis.dropdown.tabIndex = -1;\r\n\t\tthis.dropdown.setAttribute('data-hide', '');\r\n\r\n\t\tthis.dropdownOptions = document.createElement('div');\r\n\t\tthis.dropdownOptions.className = 'dropdown-options';\r\n\t\tthis.dropdown.appendChild(this.dropdownOptions);\r\n\r\n\t\tthis.updateOptions();\r\n\t\tthis.updateState();\r\n\r\n\t\t// set up a mutation observer on the original select box to keep track of external option changes\r\n\t\tconst observer = new MutationObserver(() => {\r\n\t\t\tthis.parseOptions();\r\n\t\t\tthis.updateOptions();\r\n\t\t\tthis.updateState();\r\n\t\t});\r\n\t\tobserver.observe(this.select, { childList: true, subtree: true, attributes: true, characterData: true });\r\n\r\n\t\t// switch select with input set and wrap input controls into a caret helper\r\n\t\tconst wrapper = document.createElement('div');\r\n\t\twrapper.className = 'dropdown-field-wrapper';\r\n\t\tthis.select.insertAdjacentElement('afterend', wrapper);\r\n\t\twrapper.appendChild(this.select);\r\n\t\twrapper.appendChild(this.searchInput);\r\n\t\twrapper.appendChild(this.dropdown);\r\n\r\n\t\t// register popup & related events\r\n\t\tthis.popper = createPopper(this.searchInput, this.dropdown, {\r\n\t\t\tmodifiers: [\r\n\t\t\t\tpreventOverflow,\r\n\t\t\t\tflip,\r\n\t\t\t\t{ name: 'offset', options: { offset: [0, 5] } }\r\n\t\t\t]\r\n\t\t});\r\n\r\n\t\tthis.root.addEventListener('focusin', this.show);\r\n\t\tthis.root.addEventListener('focusout', this.hide);\r\n\t\tthis.select.addEventListener('focus', () => {\r\n\t\t\t// when the focus is set by the browser's validator on the select box directly,\r\n\t\t\t// we pass it back onto the search input\r\n\t\t\tthis.searchInput.focus();\r\n\t\t});\r\n\t\tthis.select.addEventListener('change', () => {\r\n\t\t\tthis.updateState();\r\n\t\t\tthis.updateOptions();\r\n\t\t});\r\n\t\tthis.searchInput.addEventListener('click', this.show);\r\n\t\tthis.searchInput.addEventListener('input', this.updateOptions);\r\n\t\tthis.searchInput.addEventListener('keydown', this.onInputKeydown);\r\n\t\tthis.searchInput.addEventListener('blur', this.onInputBlur);\r\n\t\tthis.dropdown.addEventListener('mousedown', this.onDropdownClick);\r\n\t}\r\n\r\n\tshow = () => {\r\n\t\tthis.dropdown.removeAttribute('data-hide');\r\n\t\tthis.popper.update();\r\n\t};\r\n\r\n\thide = () => {\r\n\t\tthis.dropdown.setAttribute('data-hide', '');\r\n\t};\r\n\r\n\tparseOptions = () => {\r\n\t\tthis.options = [];\r\n\t\tfor (const child of Array.from(this.select.children)) {\r\n\t\t\tif (child.tagName.toLocaleLowerCase() === 'option') {\r\n\t\t\t\tconst opt = child as HTMLOptionElement;\r\n\t\t\t\tthis.options.push({\r\n\t\t\t\t\ttext: opt.innerText.trim(),\r\n\t\t\t\t\tvalue: opt.value,\r\n\t\t\t\t\tcontent: opt.dataset.content || opt.innerText.trim(),\r\n\t\t\t\t\tdisabled: opt.disabled\r\n\t\t\t\t});\r\n\t\t\t} else if (child.tagName.toLocaleLowerCase() === 'optgroup') {\r\n\t\t\t\tconst optgroup = child as HTMLOptGroupElement;\r\n\t\t\t\tconst group: DropdownOptionGroup = { label: optgroup.label, options: [] };\r\n\t\t\t\toptgroup.querySelectorAll('option').forEach(opt => {\r\n\t\t\t\t\tgroup.options.push({\r\n\t\t\t\t\t\ttext: opt.innerText.trim(),\r\n\t\t\t\t\t\tvalue: opt.value,\r\n\t\t\t\t\t\tcontent: opt.dataset.content || opt.innerText.trim(),\r\n\t\t\t\t\t\tdisabled: opt.disabled\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t\tthis.options.push(group);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tupdateOptions = () => {\r\n\t\tconst query = this.searchInput.value.toLocaleLowerCase();\r\n\t\tconst filteredOptions = query ? [] : this.options;\r\n\r\n\t\tif (query) {\r\n\t\t\t// comparison helper\r\n\t\t\tconst compare = (opt: DropdownOption) => {\r\n\t\t\t\treturn opt.text.toLocaleLowerCase().includes(query);\r\n\t\t\t};\r\n\r\n\t\t\t// filter nested options\r\n\t\t\tfor (const opt of this.options) {\r\n\t\t\t\tif ('options' in opt) {\r\n\t\t\t\t\tconst group: DropdownOptionGroup = { label: opt.label, options: [] };\r\n\t\t\t\t\tfor (const o of opt.options) {\r\n\t\t\t\t\t\tif (compare(o)) group.options.push(o);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (group.options.length > 0) filteredOptions.push(group);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (compare(opt)) filteredOptions.push(opt);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\twhile (this.dropdownOptions.lastChild) this.dropdownOptions.removeChild(this.dropdownOptions.lastChild);\r\n\r\n\t\tfor (const opt of filteredOptions) {\r\n\t\t\tif ('options' in opt) {\r\n\t\t\t\tconst label = document.createElement('div');\r\n\t\t\t\tlabel.className = 'optgroup-label';\r\n\t\t\t\tlabel.innerText = opt.label;\r\n\t\t\t\tthis.dropdownOptions.appendChild(label);\r\n\r\n\t\t\t\tfor (const o of opt.options) {\r\n\t\t\t\t\tthis.dropdownOptions.appendChild(this.createOption(o));\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthis.dropdownOptions.appendChild(this.createOption(opt));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// append empty-state placeholder\r\n\t\tif (this.dropdownOptions.children.length === 0) {\r\n\t\t\tconst empty = document.createElement('div');\r\n\t\t\tempty.className = 'dropdown-options-empty';\r\n\t\t\tempty.innerText = this.root.dataset.dropdownEmptyText || 'No options found.';\r\n\t\t\tthis.dropdownOptions.appendChild(empty);\r\n\t\t}\r\n\r\n\t\tif (this.popper) this.popper.update();\r\n\t};\r\n\r\n\tcreateOption = (opt: DropdownOption) => {\r\n\t\tconst option = document.createElement('button');\r\n\t\toption.className = 'dropdown-option';\r\n\r\n\t\tif (this.multiple) {\r\n\t\t\tconst activeOpt = this.select.querySelector<HTMLOptionElement>(`option[value=\"${opt.value}\"]`);\r\n\t\t\tif (activeOpt?.selected) option.classList.add('selected');\r\n\t\t} else {\r\n\t\t\tif (opt.value && opt.value === this.select.value) option.classList.add('selected');\r\n\t\t}\r\n\r\n\t\toption.value = opt.value;\r\n\t\tif (opt.disabled) option.disabled = true;\r\n\t\toption.innerHTML = opt.content;\r\n\t\toption.tabIndex = -1;\r\n\t\treturn option;\r\n\t};\r\n\r\n\tonInputKeydown = (evt: KeyboardEvent) => {\r\n\t\tconst opts = Array.from(this.dropdownOptions.querySelectorAll<HTMLButtonElement>('button:not(:disabled)'));\r\n\t\tif (evt.key === 'ArrowDown') {\r\n\t\t\tthis.show();\r\n\t\t\tthis.keyboardFocus++;\r\n\t\t\tif (this.keyboardFocus >= opts.length) this.keyboardFocus = 0;\r\n\t\t}\r\n\t\telse if (evt.key === 'ArrowUp') {\r\n\t\t\tthis.show();\r\n\t\t\tthis.keyboardFocus--;\r\n\t\t\tif (this.keyboardFocus < 0) this.keyboardFocus = opts.length - 1;\r\n\t\t}\r\n\t\telse if (evt.key === 'Enter') {\r\n\t\t\tif (!this.multiple) this.keyboardFocus = -1;\r\n\t\t\tconst currentFocus = this.dropdownOptions.querySelector<HTMLButtonElement>('button.keyboard-focused');\r\n\t\t\tconst target = currentFocus || (opts.length === 1 ? opts[0] : null);\r\n\t\t\tif (target && !target.disabled) this.setValue(target.value);\r\n\t\t}\r\n\t\telse if (evt.key === 'Escape') {\r\n\t\t\tthis.keyboardFocus = -1;\r\n\t\t\tthis.hide();\r\n\t\t}\r\n\r\n\t\tconst currentFocus = this.dropdownOptions.querySelector('button.keyboard-focused');\r\n\t\tif (currentFocus) currentFocus.classList.remove('keyboard-focused');\r\n\r\n\t\t// scroll dropdown item into view\r\n\t\tif (this.keyboardFocus >= 0 && this.keyboardFocus < opts.length) {\r\n\t\t\topts[this.keyboardFocus].classList.add('keyboard-focused');\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\topts[this.keyboardFocus].scrollIntoView({ block: 'nearest' });\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tonInputBlur = () => {\r\n\t\tthis.searchInput.value = '';\r\n\t\tthis.updateOptions();\r\n\t\tthis.hide();\r\n\t};\r\n\r\n\tonDropdownClick = (evt: MouseEvent) => {\r\n\t\tconst button = evt.target as HTMLButtonElement;\r\n\t\tif (button.classList.contains('dropdown-option') && !button.disabled) {\r\n\t\t\tthis.setValue(button.value);\r\n\t\t\tevt.preventDefault();\r\n\t\t}\r\n\t};\r\n\r\n\tsetValue = (value: string) => {\r\n\t\tthis.select.click();\r\n\r\n\t\tif (this.multiple) {\r\n\t\t\tconst opt = this.select.querySelector<HTMLOptionElement>(`option[value=\"${value}\"]`);\r\n\t\t\tif (opt) opt.selected = !opt.selected;\r\n\t\t} else {\r\n\t\t\tthis.select.value = value;\r\n\t\t}\r\n\r\n\t\tthis.select.dispatchEvent(new Event('change'));\r\n\t\tthis.updateState();\r\n\r\n\t\tif (!this.multiple) {\r\n\t\t\tthis.searchInput.value = '';\r\n\t\t\tthis.updateOptions();\r\n\t\t\tthis.hide();\r\n\t\t}\r\n\t};\r\n\r\n\tgetOptionText = (value: string) => {\r\n\t\tfor (const x of this.options) {\r\n\t\t\tif ('options' in x) {\r\n\t\t\t\tfor (const y of x.options) {\r\n\t\t\t\t\tif (y.value === value) return y.text;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (x.value === value) return x.text;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t};\r\n\r\n\tupdateState = () => {\r\n\t\tif (this.select.value) this.root.setAttribute('data-dropdown-filled', '');\r\n\t\telse this.root.removeAttribute('data-dropdown-filled');\r\n\r\n\t\t// set placeholder text\r\n\t\tif (this.multiple && this.select.selectedOptions.length > 0) {\r\n\t\t\tconst optTexts = Array.from(this.select.selectedOptions).map(opt => this.getOptionText(opt.value));\r\n\t\t\tthis.searchInput.placeholder = optTexts.join(', ');\r\n\t\t} else if (!this.multiple && this.select.value) {\r\n\t\t\tconst text = this.getOptionText(this.select.value);\r\n\t\t\tthis.searchInput.placeholder = text || this.select.value;\r\n\t\t} else {\r\n\t\t\tthis.searchInput.placeholder = this.root.dataset.dropdownPlaceholder || '';\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport const init = () => {\r\n\tconst dropdowns = Array.from(document.querySelectorAll<HTMLElement>('[data-dropdown]'));\r\n\tif (!window.StandardUI.dropdown) window.StandardUI.dropdown = { init, instances: [] };\r\n\r\n\tfor (const root of dropdowns) {\r\n\t\tif (!window.StandardUI.dropdown.instances.find(x => x.root === root)) {\r\n\t\t\tconst dropdown = new Dropdown(root);\r\n\t\t\twindow.StandardUI.dropdown.instances.push(dropdown);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport default {\r\n\tinit\r\n};\r\n","/**\r\n * This script handles a very simplistic validation logic that augments the HTML5 native validation scheme.\r\n * When the [data-validate] attribute is set on a form, the submit button click event is hijacked and failed submissions\r\n * will add the [data-validattion-dirty] to the form root (which in turn triggers some :invalid css styles to be applied).\r\n */\r\n\r\nexport class ValidatedForm {\r\n\troot: HTMLFormElement;\r\n\r\n\tconstructor(root: HTMLFormElement) {\r\n\t\tthis.root = root;\r\n\t\tthis.root.removeAttribute('data-validate');\r\n\t\tthis.root.dataset.validationActive = '';\r\n\t\tthis.bindEvents();\r\n\t}\r\n\r\n\tbindEvents = () => {\r\n\t\t// find and hijack submit buttons\r\n\t\tthis.root.querySelectorAll('[type=\"submit\"]').forEach((button) => {\r\n\t\t\tbutton.addEventListener('click', () => {\r\n\t\t\t\tthis.root.setAttribute('data-validation-dirty', '');\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// reset state on successful submit\r\n\t\tthis.root.addEventListener('submit', () => {\r\n\t\t\tthis.root.removeAttribute('data-validation-dirty');\r\n\t\t});\r\n\t};\r\n}\r\n\r\nexport const init = () => {\r\n\tconst forms = Array.from(document.querySelectorAll<HTMLFormElement>('form[data-validate]'));\r\n\tconst instances: ValidatedForm[] = [];\r\n\r\n\tfor (const root of forms) {\r\n\t\tinstances.push(new ValidatedForm(root));\r\n\t}\r\n\r\n\treturn instances;\r\n};\r\n\r\nexport default {\r\n\tinit\r\n};\r\n","export class ProductModule {\r\n\troot: HTMLElement;\r\n\tcards: HTMLElement[];\r\n\texpandButton: HTMLButtonElement;\r\n\r\n\tmaxRows: number;\r\n\tcolumns: number;\r\n\r\n\tcollapsible = false;\r\n\tcollapsed = true;\r\n\r\n\tconstructor(root: HTMLElement) {\r\n\t\tthis.root = root;\r\n\t\tthis.root.dataset.autocollapse = '';\r\n\t\tif (this.collapsed) this.root.dataset.collapsed = '';\r\n\r\n\t\tthis.cards = Array.from(this.root.querySelectorAll('.product-module-card'));\r\n\t\tthis.columns = 0;\r\n\r\n\t\tlet rows = parseInt(this.root.dataset.productModuleGridAutocollapse || '');\r\n\t\tif (isNaN(rows)) rows = 2;\r\n\t\tthis.maxRows = rows;\r\n\r\n\t\t// insert button for expanding the list\r\n\t\tconst buttonGroup = document.createElement('div');\r\n\t\tbuttonGroup.className = 'collapse-toggle';\r\n\r\n\t\tthis.expandButton = document.createElement('button');\r\n\t\tthis.expandButton.innerHTML = this.root.dataset.autocollapseText || 'Show More';\r\n\t\tthis.expandButton.className = 'button';\r\n\r\n\t\tbuttonGroup.appendChild(this.expandButton);\r\n\t\tthis.root.insertAdjacentElement('afterend', buttonGroup);\r\n\r\n\t\tthis.setupAutocollapse();\r\n\t}\r\n\r\n\tsetupAutocollapse = () => {\r\n\t\t// watch for global grid resize events\r\n\t\tconst resizeObserver = new ResizeObserver(this.recalculateSizes);\r\n\t\tresizeObserver.observe(this.root);\r\n\r\n\t\t// watch the first few cards for resize\r\n\t\tconst cardsToWatch = this.cards.slice(0, this.maxRows * 3);\r\n\t\tfor (const card of cardsToWatch) {\r\n\t\t\tresizeObserver.observe(card);\r\n\t\t}\r\n\r\n\t\t// initialize state\r\n\t\tthis.updateColumnCount();\r\n\t\tthis.recalculateSizes();\r\n\r\n\t\t// bind events\r\n\t\twindow.addEventListener('resize', () => {\r\n\t\t\tthis.updateColumnCount();\r\n\t\t\tthis.recalculateSizes();\r\n\t\t});\r\n\t\tthis.expandButton.addEventListener('click', this.toggleCollapseState);\r\n\t};\r\n\r\n\tupdate = () => {\r\n\t\tthis.updateColumnCount();\r\n\t\tthis.recalculateSizes();\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the computed grid template sizes & check the number of rows.\r\n\t */\r\n\tupdateColumnCount = () => {\r\n\t\tconst gridTemplateColumns = getComputedStyle(this.root).gridTemplateColumns;\r\n\t\tthis.columns = gridTemplateColumns.split(' ').length;\r\n\t};\r\n\r\n\t/**\r\n\t * Updates the size of the sizer overlay based on max rows & current column count and content.\r\n\t * This function also determines whether the current state should be collapsible or not, and\r\n\t * updates the DOM with that state if necessary.\r\n\t */\r\n\trecalculateSizes = () => {\r\n\t\tconst lastIndex = (this.maxRows * this.columns) - 1;\r\n\r\n\t\tconst hasEnoughCards = this.cards.length > lastIndex + 1;\r\n\r\n\t\t// update collapsible state\r\n\t\tif (!hasEnoughCards && this.collapsible) {\r\n\t\t\tdelete this.root.dataset.collapsible;\r\n\t\t\tthis.collapsible = false;\r\n\t\t} else if (hasEnoughCards && !this.collapsible) {\r\n\t\t\tthis.root.dataset.collapsible = '';\r\n\t\t\tthis.collapsible = true;\r\n\t\t}\r\n\r\n\t\t// update max height\r\n\t\tif (hasEnoughCards) {\r\n\t\t\tconst lastBoundaryCard = this.cards[lastIndex];\r\n\t\t\tconst lastCard = this.cards[this.cards.length - 1];\r\n\r\n\t\t\tconst referenceBox = this.root.getBoundingClientRect();\r\n\t\t\tconst box = (this.collapsed ? lastBoundaryCard : lastCard).getBoundingClientRect();\r\n\t\t\tconst newHeight = box.top - referenceBox.top + box.height + 1;\r\n\t\t\tthis.root.dataset.maxHeight = newHeight + 'px';\r\n\t\t\tthis.root.style.maxHeight = newHeight + 'px';\r\n\t\t} else {\r\n\t\t\tdelete this.root.dataset.maxHeight;\r\n\t\t\tthis.root.style.maxHeight = 'none';\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Toggles the collapse state and updates size calculations.\r\n\t */\r\n\ttoggleCollapseState = () => {\r\n\t\tthis.collapsed = !this.collapsed;\r\n\t\tthis.update();\r\n\t\tif (this.collapsed) {\r\n\t\t\tthis.expandButton.innerHTML = this.root.dataset.autocollapseText || 'Show More';\r\n\t\t\tthis.expandButton.className = 'button';\r\n\t\t} else {\r\n\t\t\tthis.expandButton.innerHTML = this.root.dataset.autocollapseTextHide || '<span data-icon=\"arrow_up\"></span>';\r\n\t\t\tthis.expandButton.className = 'button button-bordered';\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport const init = () => {\r\n\tconst productModuleGrids = Array.from(document.querySelectorAll<HTMLElement>('.product-module-grid[data-product-module-grid-autocollapse]'));\r\n\tconst instances: ProductModule[] = [];\r\n\r\n\tfor (const root of productModuleGrids) {\r\n\t\tif (!('autocollapse' in root.dataset)) instances.push(new ProductModule(root));\r\n\t}\r\n\r\n\treturn instances;\r\n};\r\n\r\nexport default {\r\n\tinit\r\n};\r\n","/*\r\n * Note: We can't import swiper typings cleanly yet because the upstream package doesn't properly link the .d.ts\r\n * declaration file with the ESM export.\r\n * See: https://github.com/nolimits4web/swiper/issues/5999\r\n */\r\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n// @ts-ignore\r\nimport Swiper, { Navigation, Pagination, SwiperOptions } from 'swiper';\r\n\r\nexport class Slider {\r\n\troot: HTMLElement;\r\n\tswiper: Swiper;\r\n\r\n\tconstructor(root: HTMLElement, opts?: SwiperOptions) {\r\n\t\tthis.root = root;\r\n\t\tthis.swiper = new Swiper(root, {\r\n\t\t\tmodules: [Navigation, Pagination],\r\n\t\t\tslidesPerView: 1,\r\n\t\t\tspaceBetween: 0,\r\n\t\t\twatchSlidesProgress: true,\r\n\t\t\tbreakpoints: {\r\n\t\t\t\t720: {\r\n\t\t\t\t\tslidesPerView: 2\r\n\t\t\t\t},\r\n\t\t\t\t1280: {\r\n\t\t\t\t\tslidesPerView: 3\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tnavigation: {\r\n\t\t\t\tnextEl: '.slider-next',\r\n\t\t\t\tprevEl: '.slider-prev',\r\n\t\t\t},\r\n\t\t\tpagination: {\r\n\t\t\t\tel: '.swiper-pagination',\r\n\t\t\t\ttype: 'bullets',\r\n\t\t\t},\r\n\t\t\t...(opts ?? {})\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport const init = () => {\r\n\tconst sliders = Array.from(document.querySelectorAll<HTMLElement>('[data-slider]'));\r\n\tif (!window.StandardUI.slider) window.StandardUI.slider = { init, instances: [] };\r\n\r\n\tfor (const root of sliders) {\r\n\t\tif (!window.StandardUI.slider.instances.find(x => x.root === root)) {\r\n\t\t\tconst opts: SwiperOptions = {};\r\n\r\n\t\t\tif (root.dataset.fullWidth || root.dataset.fullWidth === '') {\r\n\t\t\t\topts.breakpoints = {};\r\n\t\t\t}\r\n\r\n\t\t\tif (root.dataset.autoHeight || root.dataset.autoHeight === '') {\r\n\t\t\t\topts.autoHeight = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (root.dataset.loop || root.dataset.loop === '') {\r\n\t\t\t\topts.loop = true;\r\n\t\t\t}\r\n\r\n\t\t\tconst slider = new Slider(root, opts);\r\n\t\t\twindow.StandardUI.slider.instances.push(slider);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport default {\r\n\tinit\r\n};\r\n","import { onPageLoad } from './helpers/index.js';\r\n\r\nimport icon from './components/icon.js';\r\n\r\nimport secondaryNav from './components/secondary-nav.js';\r\nimport accordion from './components/accordion.js';\r\nimport dropdown from './components/dropdown.js';\r\nimport validatedForm from './components/validated-form.js';\r\nimport ProductModule from './components/product-module.js';\r\nimport Slider from './components/slider.js';\r\n\r\nonPageLoad(async () => {\r\n\twindow.StandardUI = {};\r\n\r\n\t// single-init components\r\n\ticon.init();\r\n\r\n\t// dynamic components\r\n\tconst init = () => {\r\n\t\tsecondaryNav.init();\r\n\t\taccordion.init();\r\n\t\tdropdown.init();\r\n\t\tvalidatedForm.init();\r\n\t\tProductModule.init();\r\n\t\tSlider.init();\r\n\t};\r\n\r\n\t// watch document for changes\r\n\tconst observer = new MutationObserver(init);\r\n\tobserver.observe(document, {\r\n\t\tchildList: true,\r\n\t\tsubtree: true\r\n\t});\r\n});\r\n"],"names":["SecondaryNav","root","navMenu","openMobileMenu","closeMobileMenu","mobileMenuDisabled","updateMobileMenuDisabledState","toggle","_instances","init","navs","nav","secondaryNav","Accordion","generateId","targets","acc","accordion","evt","accordions","x","Dropdown","select","wrapper","createPopper","preventOverflow","flip","child","opt","optgroup","group","query","filteredOptions","compare","o","label","empty","option","opts","target","currentFocus","button","value","y","optTexts","text","dropdowns","dropdown","ValidatedForm","forms","instances","validatedForm","ProductModule","rows","buttonGroup","resizeObserver","cardsToWatch","card","gridTemplateColumns","lastIndex","hasEnoughCards","lastBoundaryCard","lastCard","referenceBox","box","newHeight","productModuleGrids","ProductModule$1","Slider","Swiper","Navigation","Pagination","sliders","slider","Slider$1","onPageLoad","icon"],"mappings":"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"}