diff --git a/.gitignore b/.gitignore index 1ca9571..c5ea0d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ +dist/ npm-debug.log diff --git a/dist/lazyframe.css b/dist/lazyframe.css deleted file mode 100644 index aa73ecf..0000000 --- a/dist/lazyframe.css +++ /dev/null @@ -1 +0,0 @@ -.lazyframe{position:relative;background-color:currentColor;background-repeat:no-repeat;background-size:cover;background-position:center}.lazyframe__title{position:absolute;top:0;right:0;left:0;padding:15px 17px;z-index:3}.lazyframe__title::after{z-index:-1}.lazyframe:hover{cursor:pointer}.lazyframe::before{display:block;content:"";width:100%;padding-top:100%}.lazyframe[data-ratio="16:9"]::before{padding-top:56.25%}.lazyframe[data-ratio="4:3"]::before{padding-top:75%}.lazyframe[data-ratio="1:1"]::before{padding-top:100%}.lazyframe iframe{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;width:100%;height:100%}.lazyframe[data-vendor="youtube"],.lazyframe[data-vendor="youtube_nocookie"]{background-color:#e52d27;font-family:Roboto, Arial, Helvetica, sans-serif}.lazyframe[data-vendor="youtube"] .lazyframe__title,.lazyframe[data-vendor="youtube_nocookie"] .lazyframe__title{color:#eee;font-family:Roboto, Arial, Helvetica, sans-serif;font-size:18px;text-shadow:rgba(0,0,0,0.498039) 0 0 2px;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:color 0.1s cubic-bezier(0.4, 0, 1, 1)}.lazyframe[data-vendor="youtube"] .lazyframe__title:hover,.lazyframe[data-vendor="youtube_nocookie"] .lazyframe__title:hover{color:#fff}.lazyframe[data-vendor="youtube"] .lazyframe__title::before,.lazyframe[data-vendor="youtube_nocookie"] .lazyframe__title::before{content:"";display:block;background:linear-gradient(rgba(0,0,0,0.2), transparent);height:98px;width:100%;pointer-events:none;position:absolute;top:0;left:0;right:0;z-index:-1;-webkit-tap-highlight-color:rgba(0,0,0,0)}.lazyframe[data-vendor="youtube"]::before,.lazyframe[data-vendor="youtube_nocookie"]::before{padding-top:56.25%}.lazyframe[data-vendor="youtube"]::after,.lazyframe[data-vendor="youtube_nocookie"]::after{content:"";position:absolute;left:50%;top:50%;width:68px;height:48px;margin-left:-34px;margin-top:-24px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='%231F1F1F' d='M255.7 446.3c-53.3.3-106.6-.4-159.8-3.3-17.4-1-34.7-2.5-50.4-11C35 426.3 27 418.4 22 407.2 13.2 388.6 10.5 369 9 349c-3.4-41.3-3.6-82.6-1.8-123.8 1-22 1.6-44 6.8-65.5 2-8.4 5-16.6 8.8-24.4C32 117 48 108 67.3 104c16.2-3 32.8-3 49.3-3.7 56-2.3 112-3.5 168-3 43 .6 86.2 1.7 129.3 4 13.2.6 26.6.8 39.3 5.5 17.2 6.4 30 17.2 37 34.7 6.6 16.8 9.2 34.2 10.6 52 3.8 48.7 4 97.3.7 146-1 16.3-2.2 32.7-6.5 48.8-9.7 37-32.8 51.5-66.7 53.8-36.2 2.5-72.5 3.8-108.8 4.3-21.3.2-42.7 0-64 0zM203.2 344L348 264.7l-144.8-79.3V344z'/%3E%3Cpath fill='%23FEFDFD' d='M203.2 344V185.5L348 264.8 203.2 344z'/%3E%3C/svg%3E");background-position:center center;background-size:100%;background-repeat:no-repeat;opacity:.81;border:none;z-index:4}.lazyframe[data-vendor="youtube"]:hover::after,.lazyframe[data-vendor="youtube_nocookie"]:hover::after{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='%23DD2C28' d='M255.7 446.3c-53.3.3-106.6-.4-159.8-3.3-17.4-1-34.7-2.5-50.4-11C35 426.3 27 418.4 22 407.2 13.2 388.6 10.5 369 9 349c-3.4-41.3-3.6-82.6-1.8-123.8 1-22 1.6-44 6.8-65.5 2-8.4 5-16.6 8.8-24.4C32 117 48 108 67.3 104c16.2-3 32.8-3 49.3-3.7 56-2.3 112-3.5 168-3 43 .6 86.2 1.7 129.3 4 13.2.6 26.6.8 39.3 5.5 17.2 6.4 30 17.2 37 34.7 6.6 16.8 9.2 34.2 10.6 52 3.8 48.7 4 97.3.7 146-1 16.3-2.2 32.7-6.5 48.8-9.7 37-32.8 51.5-66.7 53.8-36.2 2.5-72.5 3.8-108.8 4.3-21.3.2-42.7 0-64 0zM203.2 344L348 264.7l-144.8-79.3V344z'/%3E%3Cpath fill='%23FEFDFD' d='M203.2 344V185.5L348 264.8 203.2 344z'/%3E%3C/svg%3E");opacity:1}.lazyframe[data-vendor="vimeo"]{background-color:#00adef}.lazyframe[data-vendor="vimeo"] .lazyframe__title{font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;color:#00adef;font-size:20px;font-weight:700;text-rendering:optimizeLegibility;user-select:none;-webkit-font-smoothing:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);background-color:rgba(0,0,0,0.5)}.lazyframe[data-vendor="vimeo"]::before{padding-top:48.25%}.lazyframe[data-vendor="vimeo"]::after{content:"";height:40px;width:65px;display:block;bottom:10px;left:10px;z-index:3;background-color:rgba(0,0,0,0.5);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' baseProfile='tiny' viewBox='0 0 24 24'%3E%3Cpath fill='%23FFF' d='M7.765 16.89l8.47-4.89-8.47-4.89'/%3E%3C/svg%3E");background-position:center center;background-size:100% 100%;background-repeat:no-repeat;border-radius:5px;position:relative}.lazyframe[data-vendor="vimeo"]:hover::after{background-color:#00adef} diff --git a/dist/lazyframe.min.js b/dist/lazyframe.min.js deleted file mode 100644 index 179451b..0000000 --- a/dist/lazyframe.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lazyframe=e()}(this,(function(){"use strict";function t(){return(t=Object.assign||function(t){for(var e=1;e=200&&i.status<400){var n=JSON.parse(i.responseText);e(null,[n,t])}else e(!0)},i.onerror=function(){e(!0)},i.send()}(t,(function(n,i){if(!n){var a=i[0],r=i[1];if(r.settings.title||(r.settings.title=o.response.title(a)),!r.settings.thumbnail){var l=o.response.thumbnail(a);r.settings.thumbnail=l,t.settings.onThumbnailLoad.call(e,l)}c(r,!0)}}))}function u(){var t=this,i=window.innerHeight,o=n.length,a=function(e,n){e.settings.initialized=!0,e.el.classList.add("lazyframe--loaded"),o--,l(e),e.settings.initinview&&e.el.click(),e.settings.onLoad.call(t,e)};n.filter((function(t){return t.settings.y1)for(var l=0;l {\n\n let settings;\n\n const elements = [];\n\n const defaults = {\n vendor: undefined,\n id: undefined,\n src: undefined,\n thumbnail: undefined,\n title: undefined,\n initialized: false,\n y: undefined,\n debounce: 250,\n lazyload: true,\n autoplay: true,\n initinview: false,\n onLoad: (l) => {},\n onAppend: (l) => {},\n onThumbnailLoad: (img) => {}\n };\n\n const constants = {\n regex: {\n youtube_nocookie: /(?:youtube-nocookie\\.com\\/\\S*(?:(?:\\/e(?:mbed))?\\/|watch\\?(?:\\S*?&?v\\=)))([a-zA-Z0-9_-]{6,11})/,\n youtube: /(?:youtube\\.com\\/\\S*(?:(?:\\/e(?:mbed))?\\/|watch\\?(?:\\S*?&?v\\=))|youtu\\.be\\/)([a-zA-Z0-9_-]{6,11})/,\n vimeo: /vimeo\\.com\\/(?:video\\/)?([0-9]*)(?:\\?|)/,\n },\n condition: {\n youtube: (m) => (m && m[1].length == 11 ? m[1] : false),\n youtube_nocookie: (m) => (m && m[1].length == 11 ? m[1] : false),\n vimeo: (m) =>\n (m && m[1].length === 9) || m[1].length === 8 ? m[1] : false,\n },\n src: {\n youtube: (s) =>\n `https://www.youtube.com/embed/${s.id}/?autoplay=${\n s.autoplay ? \"1\" : \"0\"\n }`,\n youtube_nocookie: (s) =>\n `https://www.youtube-nocookie.com/embed/${s.id}/?autoplay=${\n s.autoplay ? \"1\" : \"0\"\n }`,\n vimeo: (s) =>\n `https://player.vimeo.com/video/${s.id}/?autoplay=${\n s.autoplay ? \"1\" : \"0\"\n }`,\n },\n endpoint: (s) => `https://noembed.com/embed?url=${s.src}`,\n response: {\n title: (r) => r.title,\n thumbnail: (r) => r.thumbnail_url,\n },\n };\n\n function init(elements, ...args) {\n settings = Object.assign({}, defaults, args[0]);\n\n if (typeof elements === 'string') {\n\n const selector = document.querySelectorAll(elements);\n for (let i = 0; i < selector.length; i++) {\n loop(selector[i]);\n }\n\n } else if (typeof elements.length === 'undefined'){\n loop(elements);\n\n } else if (elements.length > 1) {\n\n for (let i = 0; i < elements.length; i++) {\n loop(elements[i]);\n }\n\n } else {\n loop(elements[0]);\n }\n\n if (settings.lazyload) {\n scroll();\n }\n\n }\n\n function loop(el) {\n\n if(el instanceof HTMLElement === false ||\n el.classList.contains('lazyframe--loaded')) return;\n\n const lazyframe = {\n el: el,\n settings: setup(el),\n };\n\n lazyframe.el.addEventListener('click', () => {\n lazyframe.el.appendChild(lazyframe.iframe);\n\n const iframe = el.querySelectorAll('iframe');\n lazyframe.settings.onAppend.call(this, iframe[0]);\n });\n\n if (settings.lazyload) {\n build(lazyframe);\n } else {\n api(lazyframe, !!lazyframe.settings.thumbnail);\n }\n\n }\n\n function setup(el) {\n\n const attr = Array.prototype.slice.apply(el.attributes)\n .filter(att => att.value !== '')\n .reduce((obj, curr) => {\n let name = curr.name.indexOf('data-') === 0 ? curr.name.split('data-')[1] : curr.name;\n obj[name] = curr.value;\n return obj;\n }, {});\n\n const options = Object.assign({},\n settings,\n attr,\n {\n y: el.offsetTop\n }\n );\n\n if (options.vendor) {\n const match = options.src.match(constants.regex[options.vendor]);\n options.id = constants.condition[options.vendor](match);\n }\n\n return options;\n\n }\n\n function useApi(settings) {\n if (!settings.vendor) return false;\n return !settings.title || !settings.thumbnail;\n }\n\n function api(lazyframe) {\n\n if (useApi(lazyframe.settings)) {\n send(lazyframe, (err, data) => {\n if (err) return;\n\n const response = data[0];\n const _l = data[1];\n\n if (!_l.settings.title) {\n _l.settings.title = constants.response.title(response);\n }\n if (!_l.settings.thumbnail) {\n const url = constants.response.thumbnail(response);\n _l.settings.thumbnail = url;\n lazyframe.settings.onThumbnailLoad.call(this, url);\n }\n build(_l, true);\n\n });\n\n }else{\n build(lazyframe, true);\n }\n\n }\n\n function send(lazyframe, cb) {\n\n const endpoint = constants.endpoint(lazyframe.settings);\n const request = new XMLHttpRequest();\n\n request.open('GET', endpoint, true);\n\n request.onload = function() {\n if (request.status >= 200 && request.status < 400) {\n const data = JSON.parse(request.responseText);\n cb(null, [data, lazyframe]);\n } else {\n cb(true);\n }\n };\n\n request.onerror = function() {\n cb(true);\n };\n\n request.send();\n\n }\n\n function scroll() {\n\n const height = window.innerHeight;\n let count = elements.length;\n const initElement = (el, i) => {\n el.settings.initialized = true;\n el.el.classList.add('lazyframe--loaded');\n count--;\n api(el);\n\n if (el.settings.initinview) {\n el.el.click();\n }\n\n el.settings.onLoad.call(this, el);\n }\n\n elements\n .filter(el => el.settings.y < height)\n .forEach(initElement);\n\n const onScroll = debounce(() => {\n\n up = lastY < window.pageYOffset;\n lastY = window.pageYOffset;\n\n if (up) {\n elements\n .filter(el => el.settings.y < (height + lastY) && el.settings.initialized === false)\n .forEach(initElement);\n }\n\n if (count === 0) {\n window.removeEventListener('scroll', onScroll, false);\n }\n\n }, settings.debounce);\n\n let lastY = 0;\n let up = false;\n\n window.addEventListener('scroll', onScroll, false);\n\n function debounce(func, wait, immediate) {\n let timeout;\n return function() {\n let context = this, args = arguments;\n let later = function() {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n let callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n };\n\n }\n\n function build(lazyframe, loadImage) {\n\n lazyframe.iframe = getIframe(lazyframe.settings);\n\n if (lazyframe.settings.thumbnail && loadImage) {\n lazyframe.el.style.backgroundImage = `url(${lazyframe.settings.thumbnail})`;\n }\n\n if (lazyframe.settings.title && lazyframe.el.children.length === 0) {\n const docfrag = document.createDocumentFragment(),\n titleNode = document.createElement('span');\n\n titleNode.className = 'lazyframe__title';\n titleNode.innerHTML = lazyframe.settings.title;\n docfrag.appendChild(titleNode);\n\n lazyframe.el.appendChild(docfrag);\n }\n\n if (!settings.lazyload) {\n lazyframe.el.classList.add('lazyframe--loaded');\n lazyframe.settings.onLoad.call(this, lazyframe);\n elements.push(lazyframe);\n }\n\n if (!lazyframe.settings.initialized) {\n elements.push(lazyframe);\n }\n\n }\n\n function getIframe(settings) {\n\n const docfrag = document.createDocumentFragment();\n const iframeNode = document.createElement('iframe');\n\n if (settings.vendor) {\n settings.src = constants.src[settings.vendor](settings);\n }\n\n iframeNode.setAttribute('id', `lazyframe-${settings.id}`);\n iframeNode.setAttribute('src', settings.src);\n iframeNode.setAttribute('frameborder', 0);\n iframeNode.setAttribute('allowfullscreen', '');\n \n if (settings.autoplay) {\n iframeNode.allow = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture';\n }\n\n docfrag.appendChild(iframeNode);\n return docfrag;\n\n }\n\n return init;\n\n}\n\nconst lf = Lazyframe();\n\nexport default lf;\n"],"names":["settings","elements","defaults","vendor","undefined","id","src","thumbnail","title","initialized","y","debounce","lazyload","autoplay","initinview","onLoad","l","onAppend","onThumbnailLoad","img","constants","regex","youtube_nocookie","youtube","vimeo","condition","m","length","s","endpoint","response","r","thumbnail_url","loop","el","HTMLElement","classList","contains","lazyframe","setup","addEventListener","appendChild","iframe","querySelectorAll","call","_this","build","api","attr","Array","prototype","slice","apply","attributes","filter","att","value","reduce","obj","curr","name","indexOf","split","options","_extends","offsetTop","match","useApi","cb","request","XMLHttpRequest","open","onload","status","data","JSON","parse","responseText","onerror","send","err","_l","url","_this2","scroll","height","window","innerHeight","count","initElement","i","add","click","_this3","forEach","func","wait","immediate","timeout","onScroll","up","lastY","pageYOffset","removeEventListener","context","this","args","arguments","later","callNow","clearTimeout","setTimeout","loadImage","docfrag","document","createDocumentFragment","iframeNode","createElement","setAttribute","allow","getIframe","style","backgroundImage","children","titleNode","className","innerHTML","push","selector","Lazyframe"],"mappings":"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"} \ No newline at end of file