{"version":3,"file":"725.eb87430ef95353f770de.js","mappings":"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","sources":["webpack://iflyworld.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 this.setLabels = [];\r\n this.allSections = []; // used to clear all sections\r\n // store items\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 // add resize observer\r\n\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.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 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 let rect = this.items[x].sections[i].getBoundingClientRect();\r\n h.push(rect.height);\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","constructor","el","this","width","resizeRequested","resizeTimeout","setLabels","allSections","items","findItems","querySelectorAll","x","l","length","obj","sections","findSections","forEach","s","setLabel","dataset","hmSection","toLowerCase","setIndex","indexOf","push","ro","entries","entry","cr","contentRect","requestResize","observe","c","addEventListener","clearSections","style","minHeight","update","ranges","y","startIndex","endIndex","arrayFinalIndex","rect","getBoundingClientRect","t","Math","floor","top","abs","start","end","updateItems","r","i","h","height","result","ceil","max","clearTimeout","setTimeout","resize","createFrom","wrappers","node","nodeType"],"sourceRoot":""}