UNPKG

hexo-theme-redefine

Version:

Redefine your writing with Hexo Theme Redefine.

2 lines 4.35 kB
const e=new WeakSet,getBaseWidth=()=>window.innerWidth>=768?255:150,ensureImageLoaded=e=>{if(!e||!e.hasAttribute("lazyload"))return;const t=e.getAttribute("data-src");t&&(e.src=t),e.removeAttribute("lazyload"),delete e.dataset.redefineLazyloadObserved};export default function initMasonry({signal:t}={}){const n=document.querySelector("#masonry-container");if(!n)return;if(e.has(n))return;if(e.add(n),"undefined"==typeof MiniMasonry)return void console.error("MiniMasonry is not available.");const r=document.querySelector("#masonry-loadmore"),i=document.querySelector("#masonry-sentinel"),a=n.dataset.masonryDataUrl||`${(()=>{if("undefined"==typeof window)return"/";const e=window.config?.root||"/";return e.endsWith("/")?e:`${e}/`})()}masonry/data.json`,s=Number.parseInt(window.theme?.page_templates?.masonry?.batch_size,10),o=Number.parseInt(window.theme?.page_templates?.masonry?.initial_batch_size,10);if(Number.isFinite(s)||console.warn("[redefine] page_templates.masonry.batch_size is missing."),Number.isFinite(o)||console.warn("[redefine] page_templates.masonry.initial_batch_size is missing."),!a)return void console.warn("Masonry data url is missing.");const d=new MiniMasonry({baseWidth:getBaseWidth(),container:n,gutterX:10,gutterY:10,surroundingGutter:!1}),l=(e=>{let t=null;return()=>{null===t&&(t=window.requestAnimationFrame((()=>{t=null,e()})))}})((()=>{d.layout()}));let c=[],m=0,u=!1;const h=Number.isFinite(o)?Math.max(1,o):24,g=Number.isFinite(s)?Math.max(1,s):12,f="undefined"!=typeof IntersectionObserver,y=f?new IntersectionObserver((e=>{e.forEach((e=>{if(!e.isIntersecting)return;const t=e.target;y.unobserve(t),ensureImageLoaded(t)}))}),{rootMargin:"200px 0px",threshold:.1}):null,toggleLoading=e=>{r&&r.classList.toggle("is-hidden",!e)},appendBatch=e=>{if(t?.aborted||!n.isConnected)return!1;const r=c.slice(m,m+e);if(0===r.length)return!1;const i=document.createDocumentFragment();return r.forEach((e=>{i.appendChild((e=>{const n=document.createElement("div");n.className="masonry-item";const r=document.createElement("div");r.className="image-container";const i=Number.parseInt(e.width,10),a=Number.parseInt(e.height,10),s=Number.isFinite(i)&&Number.isFinite(a)&&i>0&&a>0;s&&(r.classList.add("has-ratio"),r.style.setProperty("--masonry-aspect-ratio",`${i} / ${a}`));const o=document.createElement("img");o.className="masonry-img is-loading",o.alt=e.title||"",s&&(o.width=i,o.height=a),o.decoding="async",o.loading="lazy",o.setAttribute("lazyload",""),o.setAttribute("data-src",e.image),o.src="data:image/gif;base64,R0lGODlhAQABAAAAACw=",o.dataset.exif=e?.exif?"true":"false";const handleImageLoaded=()=>{o.hasAttribute("lazyload")||(o.classList.remove("is-loading"),s||l())};if(t?(o.addEventListener("load",handleImageLoaded,{signal:t}),o.addEventListener("error",handleImageLoaded,{signal:t})):(o.addEventListener("load",handleImageLoaded),o.addEventListener("error",handleImageLoaded)),y?y.observe(o):ensureImageLoaded(o),r.appendChild(o),e.title){const t=document.createElement("div");t.className="image-title",t.textContent=e.title,r.appendChild(t)}if(e.description){const t=document.createElement("div");t.className="image-description",t.textContent=e.description,r.appendChild(t)}return n.appendChild(r),n})(e))})),n.appendChild(i),m+=r.length,l(),m<c.length},b=i&&f?new IntersectionObserver((e=>{e.some((e=>e.isIntersecting))&&(()=>{if(u)return;if(t?.aborted||!n.isConnected)return;u=!0,toggleLoading(!0);const e=appendBatch(g);u=!1,toggleLoading(!1),!e&&i&&b&&(b.disconnect(),i.remove())})()}),{rootMargin:"200px 0px",threshold:.1}):null,handleResize=()=>{d.conf.baseWidth=getBaseWidth(),l()};t?(window.addEventListener("resize",handleResize,{signal:t}),t.addEventListener("abort",(()=>{y?.disconnect(),b?.disconnect()}))):window.addEventListener("resize",handleResize);(async()=>{try{const e=await fetch(a,t?{signal:t}:void 0);if(!e.ok)throw new Error(`Request failed with status ${e.status}`);c=await e.json()}catch(e){if(t?.aborted||"AbortError"===e?.name)return;return console.error("Failed to load masonry data:",e),void(i&&i.remove())}if(Array.isArray(c)&&0!==c.length){if(!t?.aborted&&n.isConnected)if(appendBatch(h),n.classList.remove("min-h-screen!"),m<c.length)if(i&&b)b.observe(i);else for(;m<c.length;)appendBatch(g);else i&&i.remove()}else i&&i.remove()})()} //# sourceMappingURL=masonry.js.map