{"version":3,"file":"5.29751f6b3636be192e72.js","mappings":"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","sources":["webpack://iflyworld.web/./wwwroot/app/src/js/global.js","webpack://iflyworld.web/./wwwroot/app/src/js/header-search.js"],"sourcesContent":["// ***********************************\r\n// ***** global site variables *****\r\n// ***********************************\r\n\r\n// language detection\r\n\r\nconst siteLang = document.querySelector('html').getAttribute('lang').toLowerCase();\r\n\r\nconst translations = {\r\n 'en': {\r\n 'site settings': 'Site settings',\r\n 'close': 'Close',\r\n 'manage effects': 'Manage the visual effects on this site',\r\n 'snow': 'Snow'\r\n },\r\n \"fr\": {\r\n \"site settings\": \"Paramètres du site\",\r\n 'close': 'Fermer',\r\n 'manage effects': 'Gérer les effets visuels sur ce site',\r\n 'snow': 'Neige'\r\n }\r\n}\r\n\r\n// other settings\r\n\r\nconst detectReducedMotionPref = window.matchMedia('(prefers-reduced-motion: reduce)');\r\nlet settingsLinksAdded = false,\r\n settingsModalContent = null;\r\n\r\n// site settings\r\n\r\nconst addSettingsLinks = () => {\r\n // utility bar link?\r\n let utilityBar = document.body.querySelector('.header--utility-bar--links ul');\r\n if(utilityBar != null) {\r\n let li = document.createElement('li');\r\n li.classList.add('list-inline-item','ms-2');\r\n li.innerHTML = ``;\r\n utilityBar.appendChild(li);\r\n }\r\n // update state\r\n settingsLinksAdded = true;\r\n};\r\n\r\nconst refreshModalContent = () => {\r\n if(!settingsModalContent) {\r\n let settingsModal = document.createElement('div');\r\n settingsModal.setAttribute('id','site-settings');\r\n settingsModal.setAttribute('class','modal fade');\r\n settingsModal.setAttribute('data-bs-backdrop','static');\r\n settingsModal.setAttribute('data-bs-keyboard','false');\r\n settingsModal.setAttribute('tabindex','-1');\r\n settingsModal.setAttribute('aria-hidden','true');\r\n settingsModal.innerHTML = `
${translations[siteLang]['manage effects']}
`;\r\n siteSettings.fx.forEach(i => {\r\n settingsModalContent.appendChild(i.controller);\r\n });\r\n }\r\n}\r\n\r\nexport const siteSettings = {\r\n siteLang: siteLang,\r\n translate: (key) => {\r\n return translations[siteLang][key];\r\n },\r\n reducedMotionPref: detectReducedMotionPref.matches,\r\n fx: [],\r\n fxAdd: (fxType, fxEnable, fxCallback = null) => {\r\n let exists = false;\r\n siteSettings.fx.forEach(i => {\r\n if(i.type == fxType) exists = true;\r\n });\r\n if(!exists) {\r\n siteSettings.fx.push({\r\n type: fxType,\r\n enabled: fxEnable,\r\n callback: fxCallback,\r\n controller: document.createElement('div')\r\n });\r\n let thisIndex = siteSettings.fx.length - 1,\r\n thisFX = siteSettings.fx[thisIndex];\r\n thisFX.controller.setAttribute('class','form-check form-switch');\r\n let checkbox = document.createElement('input');\r\n checkbox.setAttribute('id',`site-settings--fx--${thisIndex}`);\r\n checkbox.setAttribute('class','form-check-input');\r\n checkbox.setAttribute('type','checkbox');\r\n checkbox.setAttribute('role','switch');\r\n if(fxEnable) checkbox.setAttribute('checked',true);\r\n checkbox.addEventListener('click',() => {\r\n siteSettings.fxToggle(thisFX.type,checkbox.checked);\r\n });\r\n thisFX.controller.appendChild(checkbox);\r\n let label = document.createElement('label');\r\n label.setAttribute('for',`site-settings--fx--${thisIndex}`);\r\n label.setAttribute('class','form-check-label');\r\n label.innerHTML = thisFX.type;\r\n thisFX.controller.appendChild(label);\r\n }\r\n if(fxCallback) fxCallback(fxEnable);\r\n // add settings links if not already added\r\n if(!settingsLinksAdded) addSettingsLinks();\r\n // refresh modal content\r\n refreshModalContent();\r\n },\r\n fxToggle: (fxType, mode) => {\r\n siteSettings.fx.forEach(i => {\r\n if(i.type == fxType) {\r\n i.enabled = mode;\r\n if(i.callback) i.callback(mode);\r\n }\r\n });\r\n }\r\n};\r\n\r\n// viewport size\r\n\r\nexport const viewport = {\r\n vw: 0,\r\n vh: 0,\r\n setVw: (val) => {\r\n viewport.vw = val;\r\n },\r\n setVh: (val) => {\r\n viewport.vh = val;\r\n }\r\n};\r\n\r\n// component states\r\n\r\nexport const mainNavigation = {\r\n mobileActive: false,\r\n setMobileActive: (mode) => {\r\n mainNavigation.mobileActive = mode;\r\n },\r\n desktopActive: false,\r\n setDesktopActive: (mode) => {\r\n mainNavigation.desktopActive = mode;\r\n }\r\n};\r\n\r\nexport const headerSearch = {\r\n active: false,\r\n setActive: (mode) => {\r\n headerSearch.active = mode;\r\n }\r\n};","// ***************************\r\n// ***** Header search *****\r\n// ***************************\r\n\r\nimport { headerSearch } from './global';\r\n\r\nheaderSearch.setActive(false);\r\n\r\nclass HeaderSearchSystem {\r\n\r\n constructor(showBtn, wrapper, closeBtn, searchField) {\r\n this.showBtn = showBtn;\r\n this.wrapper = wrapper;\r\n this.closeBtn = closeBtn;\r\n this.searchField = searchField;\r\n this.active = false;\r\n // remove 'hidden' attribute\r\n this.wrapper.removeAttribute('hidden');\r\n // triggers\r\n this.showBtn.onclick = () => {\r\n if(!this.active) this.show();\r\n };\r\n this.closeBtn.onclick = () => {\r\n if(this.active) this.hide();\r\n };\r\n // ESC key closes search\r\n this.wrapper.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n // ESCAPE jumps out a level\r\n case 'Escape':\r\n if(this.active) {\r\n e.preventDefault();\r\n this.hide(true);\r\n }\r\n break;\r\n }\r\n });\r\n // loop the tabbing if search area is active\r\n this.closeBtn.addEventListener('keydown', (e) => {\r\n switch (e.key) {\r\n // TAB\r\n case 'Tab':\r\n if(this.active) {\r\n e.preventDefault();\r\n this.searchField.focus();\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n\r\n show() {\r\n this.wrapper.ontransitionend = null;\r\n this.wrapper.setAttribute('aria-hidden', false);\r\n this.showBtn.setAttribute('aria-expanded', true);\r\n this.active = true;\r\n headerSearch.setActive(true);\r\n window.requestAnimationFrame(() => {\r\n this.wrapper.classList.add('search-form--active');\r\n this.searchField.focus();\r\n });\r\n }\r\n\r\n hide(doFocus = false) {\r\n this.showBtn.setAttribute('aria-expanded', false);\r\n this.active = false;\r\n headerSearch.setActive(false);\r\n this.wrapper.classList.remove('search-form--active');\r\n this.wrapper.ontransitionend = (e) => {\r\n if(e.target == this.wrapper) this.transitionEnd(doFocus);\r\n };\r\n }\r\n\r\n transitionEnd(doFocus = false) {\r\n this.wrapper.setAttribute('aria-hidden', true);\r\n this.wrapper.ontransitionend = null;\r\n if(doFocus) this.showBtn.focus();\r\n }\r\n}\r\n\r\nconst headerSearchShownBtn = document.querySelector('#header--search-show-btn'),\r\n headerSearchWrapper = document.querySelector('#header--search-wrapper'),\r\n headerSearchCloseBtn = document.querySelector('#header--search-close-btn'),\r\n headerSearchField = headerSearchWrapper !== null ? headerSearchWrapper.querySelector('input[type=\"search\"]') : null;\r\n\r\nif(headerSearchShownBtn != null && headerSearchWrapper != null && headerSearchCloseBtn != null && headerSearchField != null) {\r\n new HeaderSearchSystem(headerSearchShownBtn, headerSearchWrapper, headerSearchCloseBtn, headerSearchField);\r\n}"],"names":["siteLang","document","querySelector","getAttribute","toLowerCase","translations","detectReducedMotionPref","window","matchMedia","settingsLinksAdded","settingsModalContent","siteSettings","translate","key","reducedMotionPref","matches","fx","fxAdd","fxType","fxEnable","fxCallback","exists","forEach","i","type","push","enabled","callback","controller","createElement","thisIndex","length","thisFX","setAttribute","checkbox","addEventListener","fxToggle","checked","appendChild","label","innerHTML","utilityBar","body","li","classList","add","addSettingsLinks","settingsModal","refreshModalContent","mode","viewport","vw","vh","setVw","val","setVh","mainNavigation","mobileActive","setMobileActive","desktopActive","setDesktopActive","headerSearch","active","setActive","HeaderSearchSystem","constructor","showBtn","wrapper","closeBtn","searchField","this","removeAttribute","onclick","show","hide","e","preventDefault","focus","ontransitionend","requestAnimationFrame","doFocus","remove","target","transitionEnd","headerSearchShownBtn","headerSearchWrapper","headerSearchCloseBtn","headerSearchField"],"sourceRoot":""}