{"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]}