{"version":3,"file":"8607.a680810b7604e534d8d2.js","mappings":"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","sources":["webpack://nationalspacecentre.web/./wwwroot/app/src/js/height-match.js"],"sourcesContent":["import { ResizeObserver as Polyfill } from '@juggle/resize-observer';\r\nconst ResizeObserver = window.ResizeObserver || Polyfill;\r\n\r\n// HEIGHT MATCHING\r\n// data-hm-group = wrapper for all the items to have their sections height-matched\r\n// data-hm-item = the items to have their sections height-matched. We match based on the y-position of this element.\r\n// data-hm-section = part(s) of the item to be height-matched, eg. data-hm-section=\"title\"\r\n\r\nclass HeightMatchGroup {\r\n\r\n constructor(el) {\r\n // store wrapper\r\n this.el = el;\r\n this.width = 0;\r\n this.resizeRequested = false;\r\n this.resizeTimeout = null;\r\n // store items\r\n this.storeItems();\r\n // add mutation observer to add any dynamically created content\r\n this.mo = new MutationObserver(mutationsList => {\r\n let updateNeeded = false;\r\n for(const mutation of mutationsList) {\r\n if (mutation.type === 'childList') {\r\n updateNeeded = true;\r\n }\r\n }\r\n if(updateNeeded) {\r\n this.storeItems();\r\n this.requestResize();\r\n }\r\n });\r\n // add resize observer\r\n this.ro = new ResizeObserver(entries => {\r\n for (let entry of entries) {\r\n const cr = entry.contentRect;\r\n if(cr.width != this.width) {\r\n this.width = cr.width;\r\n if(!this.resizeRequested) {\r\n this.requestResize();\r\n }\r\n }\r\n }\r\n });\r\n this.mo.observe(this.el, { attributes: false, childList: true, subtree: true });\r\n this.ro.observe(this.el); // Watch dimension changes wrapping element\r\n // add bootstrap collapse listener\r\n let findCollapses = [...el.querySelectorAll('.collapse')];\r\n findCollapses.forEach(c => {\r\n c.addEventListener('hidden.bs.collapse', () => {\r\n if(!this.resizeRequested) {\r\n this.requestResize();\r\n }\r\n });\r\n c.addEventListener('shown.bs.collapse', () => {\r\n if(!this.resizeRequested) {\r\n this.requestResize();\r\n }\r\n });\r\n });\r\n }\r\n\r\n storeItems() {\r\n this.setLabels = [];\r\n this.allSections = [];\r\n this.items = [];\r\n let findItems = this.el.querySelectorAll('*[data-hm-item]');\r\n if(findItems != null) {\r\n // loop through items adding all sections\r\n for(let x = 0, l = findItems.length; x < l; x++) {\r\n // store item\r\n this.items[x] = {\r\n obj : findItems[x],\r\n sections : []\r\n };\r\n // find sections\r\n let findSections = findItems[x].querySelectorAll('*[data-hm-section]');\r\n if(findSections != null) {\r\n findSections.forEach(s => {\r\n let setLabel = (s.dataset.hmSection + '').toLowerCase();\r\n // find set or create it\r\n let setIndex = this.setLabels.indexOf(setLabel);\r\n if (setIndex < 0) {\r\n this.setLabels.push(setLabel); // store label\r\n setIndex = this.setLabels.length - 1;\r\n }\r\n // store section element in item array\r\n this.items[x].sections[setIndex] = s; // create new set array to store element\r\n // also store in allSections array (for fast clearing)\r\n this.allSections.push(s);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n clearSections() {\r\n for(let x = 0, l = this.allSections.length; x < l; x++) {\r\n this.allSections[x].style.minHeight = 'unset';\r\n }\r\n }\r\n\r\n update() {\r\n let ranges = [],\r\n y = 0,\r\n startIndex = 0,\r\n endIndex = 0,\r\n arrayFinalIndex = this.items.length - 1;\r\n for(let x = 0; x <= arrayFinalIndex; x++) {\r\n // get offsset top of item\r\n let rect = this.items[x].obj.getBoundingClientRect(),\r\n t = Math.floor(rect.top);\r\n // compare y\r\n if(x > 0) {\r\n if(Math.abs(t - y) > 2) { // t is not within 2 pixels of y\r\n // finish this row\r\n endIndex = x - 1;\r\n ranges.push({\r\n start : startIndex,\r\n end : endIndex\r\n });\r\n startIndex = x;\r\n }\r\n }\r\n // update y value for new row\r\n y = t;\r\n }\r\n // check for last set of items that have not been updated\r\n if(startIndex < arrayFinalIndex) ranges.push({\r\n start : startIndex,\r\n end : arrayFinalIndex\r\n });\r\n // do all updates in ranges\r\n this.updateItems(ranges);\r\n // reset resizeRequested\r\n this.resizeRequested = false;\r\n }\r\n\r\n updateItems(ranges) {\r\n // loop through ranges\r\n for(let r = 0; r < ranges.length; r++) {\r\n // loop through sectionLabels array\r\n for(let i = 0; i < this.setLabels.length; i++) {\r\n let h = [];\r\n // loop through range of sections\r\n for(let x = ranges[r].start; x <= ranges[r].end; x++) {\r\n // store native section height\r\n h.push(this.items[x].sections[i].offsetHeight);\r\n }\r\n // get largest height value\r\n let result = Math.ceil(Math.max(...h));\r\n // set all to min-height = largest height\r\n for(let x = ranges[r].start; x <= ranges[r].end; x++) {\r\n this.items[x].sections[i].style.minHeight = result + 'px';\r\n }\r\n }\r\n }\r\n }\r\n\r\n requestResize() {\r\n clearTimeout(this.resizeTimeout);\r\n this.resizeRequested = true;\r\n this.resizeTimeout = setTimeout(() => {\r\n this.resize();\r\n }, 200);\r\n }\r\n\r\n resize() {\r\n this.clearSections();\r\n this.update();\r\n }\r\n\r\n}\r\n\r\n// export the default function to create\r\nexport function createFrom(wrappers) {\r\n wrappers.forEach((node) => {\r\n // if node is an element\r\n if (node.nodeType === 1) {\r\n new HeightMatchGroup(node);\r\n }\r\n });\r\n}"],"names":["ResizeObserver","window","Polyfill","HeightMatchGroup","el","this","width","resizeRequested","resizeTimeout","storeItems","mo","MutationObserver","mutationsList","updateNeeded","type","requestResize","ro","entries","cr","contentRect","observe","attributes","childList","subtree","querySelectorAll","forEach","c","addEventListener","setLabels","allSections","items","findItems","x","l","obj","sections","findSections","s","setLabel","dataset","hmSection","toLowerCase","setIndex","indexOf","push","length","style","minHeight","ranges","y","startIndex","endIndex","arrayFinalIndex","rect","getBoundingClientRect","t","Math","floor","top","abs","start","end","updateItems","r","i","h","offsetHeight","result","ceil","max","clearTimeout","setTimeout","resize","clearSections","update","createFrom","wrappers","node","nodeType"],"sourceRoot":""}