{"version":3,"file":"yall.js","sources":["../src/lib/yall-bind-events.js","../src/lib/constants.js","../src/lib/yall-flip-data-attrs.js","../src/lib/yall-load.js","../src/index.js"],"sourcesContent":["export function yallBindEvents (element, events) {\n for (const eventIndex in events) {\n const eventObject = events[eventIndex];\n\n element.addEventListener(eventIndex, eventObject.listener || eventObject, eventObject.options || undefined);\n }\n}\n","export const INTERSECTION_OBSERVER_SUPPORTED = \"IntersectionObserver\" in window && \"IntersectionObserverEntry\" in window && \"intersectionRatio\" in window.IntersectionObserverEntry.prototype;\nexport const CRAWLER = /baidu|(?:google|bing|yandex|duckduck)bot/i.test(navigator.userAgent);\nexport const DATA_ATTRS = [\"src\", \"poster\"];\n","// App-specific\nimport { DATA_ATTRS } from \"./constants.js\";\n\nexport function yallFlipDataAttrs (element, lazyClass) {\n for (const dataAttr of DATA_ATTRS) {\n if (dataAttr in element.dataset) {\n element.setAttribute(dataAttr, element.dataset[dataAttr]);\n\n if (element.classList.contains(lazyClass)) {\n element.classList.remove(lazyClass);\n }\n }\n }\n}\n","// App-specific\nimport { yallFlipDataAttrs } from \"./yall-flip-data-attrs.js\";\n\nexport function yallLoad (element, lazyClass, lazyBackgroundClass, lazyBackgroundLoaded) {\n if (element.nodeName == \"VIDEO\") {\n const sourceElements = Array.from(element.querySelectorAll(\"source\"));\n\n for (const sourceElement of sourceElements) {\n yallFlipDataAttrs(sourceElement, lazyClass);\n }\n\n element.load();\n }\n\n yallFlipDataAttrs(element, lazyClass);\n\n const classList = element.classList;\n\n // Lazy load CSS background images\n if (classList.contains(lazyBackgroundClass)) {\n classList.remove(lazyBackgroundClass);\n classList.add(lazyBackgroundLoaded);\n }\n}\n","// App-specific\nimport { yallBindEvents } from \"./lib/yall-bind-events.js\";\nimport { yallLoad } from \"./lib/yall-load.js\";\nimport { INTERSECTION_OBSERVER_SUPPORTED, CRAWLER } from \"./lib/constants.js\";\n\nexport function yall (options) {\n const lazyClass = options?.lazyClass || \"lazy\";\n const lazyBackgroundClass = options?.lazyBackgroundClass || \"lazy-bg\";\n const lazyBackgroundLoaded = options?.lazyBackgroundLoaded || \"lazy-bg-loaded\";\n const threshold = options?.threshold || 200;\n const events = options?.events || {};\n const observeChanges = options?.observeChanges || false;\n const observeRootSelector = options?.observeRootSelector || \"body\";\n const mutationObserverOptions = options?.mutationObserverOptions || {\n childList: true,\n subtree: true\n };\n const lazySelector = `video.${lazyClass},.${lazyBackgroundClass}`;\n let lazyElements = Array.from(document.querySelectorAll(lazySelector));\n\n for (const lazyElement of lazyElements) {\n yallBindEvents(lazyElement, events);\n }\n\n // First we check if IntersectionObserver is supported. If the\n // current user agent is a known crawler we just load everything.\n if (INTERSECTION_OBSERVER_SUPPORTED === true && CRAWLER === false) {\n var intersectionListener = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting || entry.intersectionRatio) {\n const { target } = entry;\n\n yallLoad(target, lazyClass, lazyBackgroundClass, lazyBackgroundLoaded);\n\n intersectionListener.unobserve(target);\n lazyElements = lazyElements.filter(lazyElement => lazyElement != target);\n\n // If all the elements that were detected at load time are all loaded\n // and we're not observing for changes, we're all done here.\n if (lazyElements.length === 0 && observeChanges === false) {\n intersectionListener.disconnect();\n }\n }\n }\n }, {\n rootMargin: `${threshold}px 0%`\n });\n\n for (const lazyElement of lazyElements) {\n intersectionListener.observe(lazyElement);\n }\n\n if (observeChanges) {\n new MutationObserver(() => {\n const newElements = document.querySelectorAll(lazySelector);\n\n for (const newElement of newElements) {\n if (lazyElements.includes(newElement) === false) {\n lazyElements.push(newElement);\n yallBindEvents(newElement, events);\n\n if (INTERSECTION_OBSERVER_SUPPORTED === true && CRAWLER === false) {\n intersectionListener.observe(newElement);\n }\n }\n }\n }).observe(document.querySelector(observeRootSelector), mutationObserverOptions);\n }\n } else if (CRAWLER) {\n for (const lazyElement of lazyElements) {\n yallLoad(lazyElement, lazyClass, lazyBackgroundClass, lazyBackgroundLoaded);\n }\n }\n}\n"],"names":["yallBindEvents","element","events","eventIndex","eventObject","addEventListener","listener","options","undefined","INTERSECTION_OBSERVER_SUPPORTED","window","IntersectionObserverEntry","prototype","CRAWLER","test","navigator","userAgent","yallFlipDataAttrs","lazyClass","dataAttr","DATA_ATTRS","dataset","setAttribute","classList","contains","remove","yallLoad","lazyBackgroundClass","lazyBackgroundLoaded","nodeName","sourceElements","Array","from","querySelectorAll","sourceElement","load","add","yall","threshold","observeChanges","observeRootSelector","mutationObserverOptions","childList","subtree","lazySelector","lazyElements","document","lazyElement","entries","entry","isIntersecting","intersectionRatio","target","intersectionListener","unobserve","filter","length","disconnect","rootMargin","observe","MutationObserver","newElements","includes","newElement","push","querySelector"],"mappings":"SAAOA,EAAyBC,EAASC,GACvC,IAAK,MAAMC,KAAXD,EAAiC,CAC/B,MAAME,EAAcF,EAAOC,GAE3BF,EAAQI,iBAAiBF,EAAYC,EAAYE,UAAYF,EAAaA,EAAYG,cAAWC,UCJzDC,EAAG,yBAA0BC,QAAU,8BAA+BA,QAAU,6BAA8BC,0BAA0BC,UAChKC,EAAG,4CAA4CC,KAAKC,UAAUC,aACxD,CAAC,MAAO,UCC3B,SAAAC,EAA4BhB,EAASiB,GAC1C,IAAK,MAAMC,KAAYC,EACjBD,KAAYlB,EAAQoB,UACtBpB,EAAQqB,aAAaH,EAAUlB,EAAQoB,QAAQF,IAE3ClB,EAAQsB,UAAUC,SAASN,IAC7BjB,EAAQsB,UAAUE,OAAOP,ICNjBQ,SAAAA,EAAUzB,EAASiB,EAAWS,EAAqBC,GACjE,GAAwB,SAApB3B,EAAQ4B,SAAqB,CAC/B,MAAoBC,EAAGC,MAAMC,KAAK/B,EAAQgC,iBAAiB,WAE3D,IAAK,MAAMC,KAAiBJ,EAC1Bb,EAAkBiB,EAAehB,GAGnCjB,EAAQkC,OAGVlB,EAAkBhB,EAASiB,GAE3B,MAAMK,EAAYtB,EAAQsB,UAGtBA,EAAUC,SAASG,KACrBJ,EAAUE,OAAOE,GACjBJ,EAAUa,IAAIR,aChBXS,EAAe9B,GACpB,MAAMW,EAAYX,GAASW,WAAa,OAClCS,EAAsBpB,GAASoB,qBAAuB,UACtDC,EAAuBrB,GAASqB,sBAAwB,mBAC5CrB,GAAS+B,WAAa,MACzB/B,GAASL,QAAU,GACdqC,EAAGhC,GAASgC,iBAAkB,EACzBC,EAAGjC,GAASiC,qBAAuB,OAC/BC,EAAGlC,GAASkC,yBAA2B,CAClEC,WAAW,EACXC,SAAS,GAEOC,EAAI,SAAQ1B,MAAcS,IAC5C,IAAIkB,EAAed,MAAMC,KAAKc,SAASb,iBAAiBW,IAExD,IAAK,WAAqBC,EACxB7C,EAAe+C,EAAa7C,GAK9B,IAAwC,IAApCO,IAAwD,IAAZI,EAAmB,CACjE,MAA2B,yBAA0BmC,IACnD,IAAK,MAAMC,KAAXD,EACE,GAAIC,EAAMC,gBAAkBD,EAAME,kBAAmB,CACnD,MAAMC,OAAEA,GAAWH,EAEnBvB,EAAS0B,EAAQlC,EAAWS,EAAqBC,GAEjDyB,EAAqBC,UAAUF,GAC/BP,EAAeA,EAAaU,OAAOR,GAAeA,GAAeK,GAIrC,IAAxBP,EAAaW,SAAmC,IAAnBjB,GAC/Bc,EAAqBI,eAI1B,CACDC,WAAa,GAAEpB,WAGjB,IAAK,MAALS,OACEM,EAAqBM,QAAQZ,GAG3BR,GACF,IAAAqB,iBAAqB,KACnB,QAAoBd,SAASb,iBAAiBW,GAE9C,IAAK,WAAoBiB,GACmB,IAAtChB,EAAaiB,SAASC,KACxBlB,EAAamB,KAAKD,GAClB/D,EAAe+D,EAAY7D,IAEa,IAApCO,IAAwD,IAAZI,GAC9CwC,EAAqBM,QAAQI,MAIlCJ,QAAQb,SAASmB,cAAczB,GAAsBC,QAErD,GAAI5B,EACT,IAAK,WAAqBgC,EACxBnB,EAASqB,EAAa7B,EAAWS,EAAqBC"}