{"version":3,"file":"607.3ce215d8483f07982b2b.js","mappings":"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","sources":["webpack://Chaos Karts/./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 // check for loading images too\r\n let findImages = [...el.querySelectorAll('img')];\r\n findImages.forEach(i => {\r\n i.addEventListener('load', () => {\r\n if(!this.resizeRequested) {\r\n this.requestResize();\r\n }\r\n });\r\n });\r\n // and for listing filtering events\r\n window.addEventListener('listingUpdated', () => {\r\n this.updateItemOrder();\r\n if(!this.resizeRequested) {\r\n this.requestResize();\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 orderIndex: x,\r\n obj: findItems[x],\r\n hidden: findItems[x].hasAttribute('data-hm-hidden'),\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 updateItemOrder() {\r\n let findItems = this.el.querySelectorAll('*[data-hm-item]');\r\n findItems.forEach((f,i) => {\r\n for(let x = 0, l = this.items.length; x < l; x++) {\r\n if(this.items[x].obj == f) {\r\n this.items[x].orderIndex = i;\r\n this.items[x].hidden = this.items[x].obj.hasAttribute('data-hm-hidden');\r\n break;\r\n }\r\n }\r\n });\r\n this.items.sort((a, b) => {\r\n return (a.orderIndex - b.orderIndex);\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 if(!this.items[x].hidden) {\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 }\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 if(this.items[x].hidden) {\r\n h.push(0);\r\n } else {\r\n h.push(this.items[x].sections[i].offsetHeight);\r\n }\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","storeItems","mo","MutationObserver","mutationsList","updateNeeded","mutation","type","requestResize","ro","entries","entry","cr","contentRect","observe","attributes","childList","subtree","querySelectorAll","forEach","c","addEventListener","i","updateItemOrder","setLabels","allSections","items","findItems","x","l","length","orderIndex","obj","hidden","hasAttribute","sections","findSections","s","setLabel","dataset","hmSection","toLowerCase","setIndex","indexOf","push","clearSections","style","minHeight","f","sort","a","b","update","ranges","y","startIndex","endIndex","arrayFinalIndex","rect","getBoundingClientRect","t","Math","floor","top","abs","start","end","updateItems","r","h","offsetHeight","result","ceil","max","clearTimeout","setTimeout","resize","createFrom","wrappers","node","nodeType"],"sourceRoot":""}