{"version":3,"file":"index-Cyx6ANiO.js","sources":["../../src/scripts/modules/tabs/generalTab.ts","../../src/scripts/modules/tabs/index.ts"],"sourcesContent":["import { Component } from '@verndale/core';\nimport { TabItem } from './index';\n// import { loadDeferredModules } from '../../helpers';\n\nclass GeneralTab extends Component implements TabItem {\n id: string;\n reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n constructor(\n el: HTMLElement,\n public isActive = false,\n public anchor?: string\n ) {\n super(el);\n this.id = el.id;\n this.el.classList.add('tabs__item--hidden');\n }\n\n setupDefaults() {\n this.dom = {\n el: this.el\n };\n }\n\n setActive(isActive: boolean) {\n this.isActive = isActive;\n\n if (isActive) {\n //loadDeferredModules(this.el);\n this.el.classList.remove('tabs__item--hidden');\n } else {\n this.el.classList.add('tabs__item--hidden');\n }\n\n return;\n }\n}\n\nexport default GeneralTab;\n","import { Component } from '@verndale/core';\nimport GeneralTab from './generalTab';\nimport { animate, AnimationPlaybackControls, AnimationSequence } from 'framer-motion';\nimport { breakpoints } from '../../helpers/variables';\n\nexport interface TabItem {\n id: string;\n anchor?: string;\n isActive: boolean;\n setActive(isActive: boolean, force?: boolean): Promise | void;\n}\n\nclass Tabs extends Component {\n panels: TabItem[] = [];\n imagePanels: TabItem[] = [];\n prefix: string | undefined;\n isVertical: boolean = false;\n viewingText: string | undefined;\n\n constructor(el: HTMLElement) {\n super(el);\n this.isVertical = (this.dom.tabsContainer as HTMLElement).classList.contains('tabs--vertical');\n if (this.el.dataset.viewingText) this.viewingText = this.el.dataset.viewingText;\n this.buildTabs();\n this.addTabListeners();\n }\n\n setupDefaults() {\n if (this.el.dataset.prefix) this.prefix = this.el.dataset.prefix;\n\n this.dom = {\n tabsContainer: this.el.querySelector('.tabs'),\n panels: this.prefix\n ? this.el.querySelectorAll(`.tabs__${this.prefix}-panel`)\n : this.el.querySelectorAll('.tabs__panel'),\n imagePanels: this.prefix\n ? this.el.querySelectorAll(`.tabs__${this.prefix}-panel-image`)\n : this.el.querySelectorAll('.tabs__panel-image')\n };\n }\n\n buildTabs() {\n const panels = this.dom.panels as NodeListOf;\n const imagePanels = this.dom.imagePanels as NodeListOf;\n const tabsContainer = this.dom.tabsContainer as HTMLDivElement;\n tabsContainer.innerHTML = '';\n const mobileTabs = document.createElement('div');\n mobileTabs.classList.add('tabs__mobile');\n const desktopTabs = document.createElement('div');\n desktopTabs.classList.add('tabs__desktop');\n\n let tabsContent = '';\n let dropdownContent = '';\n\n panels.forEach((item, index) => {\n const uuid = item.id;\n\n item.setAttribute('aria-labelledby', `tab-${uuid}`);\n if (index) {\n item.classList.add('tabs__item--hidden');\n }\n\n tabsContent += `\n \n `;\n\n dropdownContent += ``;\n this.panels.push(new GeneralTab(item, !index));\n if (imagePanels[index]) this.imagePanels.push(new GeneralTab(imagePanels[index], !index));\n });\n\n desktopTabs.innerHTML = tabsContent;\n this.dom.tabs = desktopTabs.querySelectorAll('button');\n\n this.dom.dropdown = document.createElement('select');\n this.dom.dropdown.classList.add('tabs__dropdown');\n this.dom.dropdown.classList.add('dropdown');\n this.dom.dropdown.innerHTML = dropdownContent;\n\n mobileTabs.append(this.dom.dropdown);\n tabsContainer.append(desktopTabs);\n tabsContainer.append(mobileTabs);\n\n // check if there is a hash in the url and set the active panel\n const hash = window.location.hash;\n let activeId;\n if (hash) {\n activeId = this.panels.find(panel => panel.anchor === hash.replace('#', ''))?.id;\n this.el.scrollIntoView({ behavior: 'smooth' });\n }\n\n this.setSelectedPanel(activeId || this.panels[0].id, true);\n }\n\n addTabListeners() {\n (this.dom.tabs as NodeList).forEach(tab => {\n tab.addEventListener('click', this.handleTabClick.bind(this));\n tab.addEventListener('keydown', this.handleTabKeyDown.bind(this));\n });\n (this.dom.dropdown as HTMLSelectElement).addEventListener(\n 'change',\n this.handleDropdownChange.bind(this)\n );\n\n window.addEventListener('hashchange', this.handleHashChange.bind(this));\n }\n\n handleTabClick(e: Event) {\n const target = e.currentTarget as HTMLButtonElement;\n const activeId = target.getAttribute('aria-controls');\n (this.dom.tabsContainer as HTMLElement).scrollTo({\n left: target.offsetLeft,\n behavior: 'smooth'\n });\n\n this.setSelectedPanel(`${activeId}`);\n }\n\n handleTabKeyDown(e: Event) {\n if (!(e instanceof KeyboardEvent)) return;\n\n const target = e.currentTarget as HTMLButtonElement;\n const tabs = this.dom.tabs as NodeListOf;\n let flag = false;\n\n switch (e.key) {\n case 'ArrowLeft':\n if (target.previousElementSibling) {\n (target.previousElementSibling as HTMLButtonElement).focus();\n } else {\n (tabs[tabs.length - 1] as HTMLButtonElement).focus();\n }\n flag = true;\n break;\n\n case 'ArrowRight':\n if (target.nextElementSibling) {\n (target.nextElementSibling as HTMLButtonElement).focus();\n } else {\n (tabs[0] as HTMLButtonElement).focus();\n }\n flag = true;\n break;\n\n case 'Home':\n (tabs[0] as HTMLButtonElement).focus();\n flag = true;\n break;\n\n case 'End':\n (tabs[tabs.length - 1] as HTMLButtonElement).focus();\n flag = true;\n break;\n\n default:\n break;\n }\n\n if (flag) {\n e.stopPropagation();\n e.preventDefault();\n }\n }\n\n handleHashChange() {\n const hash = window.location.hash;\n const activeId = this.panels.find(panel => panel.anchor === hash.replace('#', ''))?.id;\n\n if (activeId) {\n this.setSelectedPanel(activeId, false);\n this.el.scrollIntoView({ behavior: 'smooth' });\n }\n }\n\n handleDropdownChange(e: Event) {\n const target = e.target as HTMLSelectElement;\n const activeId = target.value;\n\n this.setSelectedPanel(activeId);\n }\n\n async setSelectedPanel(id: string, setUrl = true) {\n const tabs = [...(this.dom.tabs as NodeListOf)];\n\n const currentPanel = this.panels.find(panel => panel.isActive) as GeneralTab;\n const selectedPanel = this.panels.find(panel => panel.id === id) as GeneralTab;\n const currentImagePanel = this.imagePanels.find(panel => panel.isActive) as GeneralTab;\n const selectedImagePanel = this.imagePanels.find(\n panel => panel.id === `${id}--image`\n ) as GeneralTab;\n\n // Deselect active tab\n const currentTab = tabs.find(tab => tab.getAttribute('aria-selected') === 'true');\n currentTab?.setAttribute('aria-selected', 'false');\n currentTab?.setAttribute('tabindex', '-1');\n\n // Select new tab\n const selectedTab = tabs.find(tab => tab.id === `tab-${id}`);\n selectedTab?.setAttribute('aria-selected', 'true');\n selectedTab?.removeAttribute('tabindex');\n\n // Update the url with the fata-anchor value\n if (setUrl) {\n const newUrl = new URL(window.location.href);\n newUrl.hash = selectedPanel?.anchor || '';\n window.history.pushState({}, '', newUrl.toString());\n }\n\n if (this.isVertical) {\n (this.el.querySelector('.tabs__desktop') as HTMLElement).style.setProperty(\n '--inset-block-start',\n `${(selectedTab as HTMLElement).offsetTop}px`\n );\n (this.el.querySelector('.tabs__desktop') as HTMLElement).style.setProperty(\n '--block-size',\n `${(selectedTab as HTMLElement).offsetHeight}px`\n );\n } else {\n (this.el.querySelector('.tabs__desktop') as HTMLElement).style.setProperty(\n '--inset-inline-start',\n `${(selectedTab as HTMLElement).offsetLeft}px`\n );\n (this.el.querySelector('.tabs__desktop') as HTMLElement).style.setProperty(\n '--inline-size',\n `${(selectedTab as HTMLElement).offsetWidth}px`\n );\n }\n\n // if (this.panelInTransition) {\n // // Check if previous panel in transition\n // await this.panelInTransition?.setActive(false);\n // }\n\n const carouselSlides = document\n .getElementById(currentPanel.id)\n ?.querySelectorAll('.swiper-slide');\n\n if (carouselSlides) {\n if (currentPanel === selectedPanel) {\n this.updatePanelStatus(currentPanel, currentImagePanel, selectedPanel, selectedImagePanel);\n this.animateCarouselSlides(carouselSlides);\n } else {\n const selectedCarouselSlides = document\n .getElementById(selectedPanel.id)\n ?.querySelectorAll('.swiper-slide');\n\n if (selectedCarouselSlides) {\n this.animateCarouselSlides(carouselSlides, 'out').then(() => {\n this.updatePanelStatus(\n currentPanel,\n currentImagePanel,\n selectedPanel,\n selectedImagePanel\n );\n this.animateCarouselSlides(selectedCarouselSlides);\n });\n }\n }\n } else {\n this.updatePanelStatus(currentPanel, currentImagePanel, selectedPanel, selectedImagePanel);\n }\n }\n\n updatePanelStatus(\n currentPanel: GeneralTab,\n currentImagePanel: GeneralTab,\n selectedPanel: GeneralTab,\n selectedImagePanel: GeneralTab\n ) {\n currentPanel?.setActive(false);\n currentImagePanel?.setActive(false);\n selectedPanel?.setActive(true);\n selectedImagePanel?.setActive(true);\n }\n\n animateCarouselSlides(\n carouselSlides: NodeListOf,\n direction: string = 'in'\n ): AnimationPlaybackControls {\n const sequence: AnimationSequence = [];\n const tabletMQ = window.matchMedia(`(max-width:${breakpoints.tabletLandscape - 1}px)`);\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n const maxVisibleSlides = tabletMQ.matches ? 1 : 4;\n\n carouselSlides.forEach((slide, idx) => {\n const yDuration = idx < maxVisibleSlides && !reducedMotion.matches ? 0.8 : 0;\n const opDuration = idx < maxVisibleSlides && !reducedMotion.matches ? 0.4 : 0;\n\n sequence.push([\n slide,\n {\n y: direction === 'in' ? [-50, 0] : [0, 50],\n opacity: direction === 'in' ? [0, 1] : [1, 0]\n },\n {\n ease: direction === 'in' ? 'easeOut' : 'easeIn',\n duration: yDuration,\n opacity: { duration: opDuration },\n at: '-0.7'\n }\n ]);\n });\n\n const animation: AnimationPlaybackControls = animate(sequence);\n\n return animation;\n }\n}\n\nexport default Tabs;\n"],"names":["GeneralTab","Component","el","isActive","anchor","__publicField","Tabs","panels","imagePanels","tabsContainer","mobileTabs","desktopTabs","tabsContent","dropdownContent","item","index","uuid","hash","activeId","_a","panel","tab","e","target","tabs","flag","id","setUrl","currentPanel","selectedPanel","currentImagePanel","selectedImagePanel","currentTab","selectedTab","newUrl","carouselSlides","selectedCarouselSlides","_b","direction","sequence","tabletMQ","breakpoints","reducedMotion","maxVisibleSlides","slide","idx","yDuration","opDuration","animate"],"mappings":"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"}