{"version":3,"file":"y-lazyload-controller-Bq5kuVDc.js","sources":["../../../node_modules/yall-js/src/yall.mjs","../../../app/frontend/src/yobbers/js/controllers/y-lazyload-controller.js"],"sourcesContent":["export default function (options) {\n options = options || {};\n\n // Options\n const lazyClass = options.lazyClass || \"lazy\";\n const lazyBackgroundClass = options.lazyBackgroundClass || \"lazy-bg\";\n const idleLoadTimeout = \"idleLoadTimeout\" in options ? options.idleLoadTimeout : 200;\n const observeChanges = options.observeChanges || false;\n const events = options.events || {};\n const noPolyfill = options.noPolyfill || false;\n\n // Shorthands (saves more than a few bytes!)\n const win = window;\n const ric = \"requestIdleCallback\";\n const io = \"IntersectionObserver\";\n const ioSupport = io in win && `${io}Entry` in win;\n\n // App stuff\n const crawler = /baidu|(?:google|bing|yandex|duckduck)bot/i.test(navigator.userAgent);\n const dataAttrs = [\"srcset\", \"src\", \"poster\"];\n const arr = [];\n const queryDOM = (selector, root) => arr.slice.call((root || document).querySelectorAll(selector || `img.${lazyClass},video.${lazyClass},iframe.${lazyClass},.${lazyBackgroundClass}`));\n\n // This function handles lazy loading of elements.\n const yallLoad = element => {\n const parentNode = element.parentNode;\n\n if (parentNode.nodeName == \"PICTURE\") {\n yallApplyFn(queryDOM(\"source\", parentNode), yallFlipDataAttrs);\n }\n\n if (element.nodeName == \"VIDEO\") {\n yallApplyFn(queryDOM(\"source\", element), yallFlipDataAttrs);\n }\n\n yallFlipDataAttrs(element);\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(options.lazyBackgroundLoaded || \"lazy-bg-loaded\");\n }\n };\n\n const yallBindEvents = element => {\n for (let eventIndex in events) {\n element.addEventListener(eventIndex, events[eventIndex].listener || events[eventIndex], events[eventIndex].options || undefined);\n }\n };\n\n // Added because there was a number of patterns like this peppered throughout\n // the code. This flips necessary data- attrs on an element and prompts video\n // elements to begin playback automatically if they have autoplay specified.\n const yallFlipDataAttrs = element => {\n for (let dataAttrIndex in dataAttrs) {\n if (dataAttrs[dataAttrIndex] in element.dataset) {\n element.setAttribute(dataAttrs[dataAttrIndex], element.dataset[dataAttrs[dataAttrIndex]]);\n const parentNode = element.parentNode;\n\n if (element.nodeName === \"SOURCE\" && parentNode.autoplay) {\n parentNode.load();\n\n // For some reason, IE11 needs to have this method invoked in order\n // for autoplay to start. So we do a yucky user agent check.\n if (/Trident/.test(navigator.userAgent)) {\n parentNode.play();\n }\n\n parentNode.classList.remove(lazyClass);\n }\n\n element.classList.remove(lazyClass);\n }\n }\n };\n\n // Noticed lots of loops where a function simply gets executed on every\n // member of an array. This abstraction eliminates that repetitive code.\n const yallApplyFn = (items, fn) => {\n for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {\n win[io] && fn instanceof win[io] ? fn.observe(items[itemIndex]) : fn(items[itemIndex]);\n }\n };\n\n const yallCreateMutationObserver = entry => {\n new MutationObserver(() => {\n yallApplyFn(queryDOM(), newElement => {\n if (lazyElements.indexOf(newElement) < 0) {\n lazyElements.push(newElement);\n yallBindEvents(newElement);\n\n if (ioSupport && !crawler) {\n intersectionListener.observe(newElement);\n } else if (noPolyfill || crawler) {\n yallApplyFn(lazyElements, yallLoad);\n }\n }\n });\n }).observe(entry, options.mutationObserverOptions || {\n childList: true,\n subtree: true\n });\n };\n\n let lazyElements = queryDOM();\n\n yallApplyFn(lazyElements, yallBindEvents);\n\n // First we check if IntersectionObserver is supported. If not, we check to\n // see if the `noPolyfill` option is set. If so, we load everything. If the\n // current user agent is a known crawler, again, we load everything.\n if (ioSupport && !crawler) {\n var intersectionListener = new win[io](entries => {\n yallApplyFn(entries, entry => {\n if (entry.isIntersecting || entry.intersectionRatio) {\n const element = entry.target;\n\n if (ric in win && idleLoadTimeout) {\n win[ric](() => {\n yallLoad(element);\n }, {\n timeout: idleLoadTimeout\n });\n } else {\n yallLoad(element);\n }\n\n intersectionListener.unobserve(element);\n lazyElements = lazyElements.filter(lazyElement => lazyElement != element);\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 && !observeChanges) {\n intersectionListener.disconnect();\n }\n }\n });\n }, {\n rootMargin: `${\"threshold\" in options ? options.threshold : 200}px 0%`\n });\n\n yallApplyFn(lazyElements, intersectionListener);\n\n if (observeChanges) {\n yallApplyFn(queryDOM(options.observeRootSelector || \"body\"), yallCreateMutationObserver);\n }\n } else if (noPolyfill || crawler) {\n yallApplyFn(lazyElements, yallLoad);\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport yall from 'yall-js';\n\nexport default class extends Controller {\n connect() {\n this.instance = yall({\n lazyClass: 'js-lazy',\n lazyBackgroundClass: 'js-lazy-bg',\n lazyBackgroundLoaded: '-is-loaded',\n observeChanges: true,\n idleLoadTimeout: 0,\n threshold: 200,\n noPolyfill: true,\n events: {\n load: (event) => {\n if (\n !event.target.classList.contains('lazy') &&\n event.target.nodeName === 'IMG'\n ) {\n const el = event.target.parentElement;\n el.classList.add('-is-loaded');\n }\n },\n error: {\n listener: (event) => {\n if (\n !event.target.classList.contains('lazy') &&\n event.target.nodeName === 'IMG'\n ) {\n event.target.classList.add('yall-error');\n }\n },\n options: {\n once: true\n }\n }\n }\n });\n }\n}\n"],"names":["yall","options","lazyClass","lazyBackgroundClass","idleLoadTimeout","observeChanges","events","noPolyfill","win","ric","io","ioSupport","crawler","dataAttrs","arr","queryDOM","selector","root","yallLoad","element","parentNode","yallApplyFn","yallFlipDataAttrs","classList","yallBindEvents","eventIndex","dataAttrIndex","items","fn","itemIndex","yallCreateMutationObserver","entry","newElement","lazyElements","intersectionListener","entries","lazyElement","YLazyloadController","Controller","event"],"mappings":"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","x_google_ignoreList":[0]}