@wyxos/vibe 2.1.4 → 2.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +1 -1
- package/lib/index.js +633 -579
- package/package.json +1 -1
package/lib/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),Qe={mode:"default",pageSize:20,backfillRequestDelayMs:2e3,page:1,itemWidth:300,prefetchThresholdPx:200,gapX:16,gapY:16,headerHeight:0,footerHeight:0,overscanPx:600},kt={key:0,"data-testid":"masonry-loader-spinner",class:"absolute inset-0 flex items-center justify-center"},xt={key:1,"data-testid":"masonry-loader-error",class:"absolute inset-0 flex flex-col items-center justify-center gap-2 p-3"},bt=["src","width","height","alt"],Bt=["poster"],Mt=["src"],We=e.defineComponent({__name:"MasonryLoader",props:{item:{},timeoutMs:{default:15e3}},emits:["success","error"],setup(l,{emit:g}){const u=l,s=g,c=e.ref(null),p=e.ref(!1),f=e.ref(!1),i=e.ref(!1),k=e.ref(0),x=e.computed(()=>{const E=u.item?.width,S=u.item?.height;return{aspectRatio:`${E} / ${S}`}}),B=e.computed(()=>u.item?.type==="image");let M=null,I=null;function F(){I!=null&&(window.clearTimeout(I),I=null)}function b(){F();const E=typeof u.timeoutMs=="number"&&Number.isFinite(u.timeoutMs)?u.timeoutMs:0;E<=0||(I=window.setTimeout(()=>{p.value&&(f.value||i.value||C(new Error("timeout")))},E))}function _(){p.value||(p.value=!0,f.value=!1,i.value=!1,b())}e.onMounted(()=>{if(typeof IntersectionObserver>"u"){_();return}M=new IntersectionObserver(E=>{for(const S of E)if(S.isIntersecting&&!((S.intersectionRatio??0)<.5)){_(),M?.disconnect(),M=null;return}},{threshold:[0,.5,1]}),c.value&&M.observe(c.value)}),e.onUnmounted(()=>{M?.disconnect(),M=null,F()});function N(){f.value||(f.value=!0,i.value=!1,F(),s("success",u.item))}function C(E){i.value||(f.value=!1,i.value=!0,F(),s("error",{item:u.item,error:E}))}function T(){p.value&&(f.value=!1,i.value=!1,k.value+=1,b())}return(E,S)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"rootEl",ref:c,class:"relative bg-slate-100",style:e.normalizeStyle(x.value)},[p.value&&!f.value&&!i.value?(e.openBlock(),e.createElementBlock("div",kt,S[2]||(S[2]=[e.createElementVNode("svg",{class:"h-5 w-5 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})],-1)]))):p.value&&i.value?(e.openBlock(),e.createElementBlock("div",xt,[S[3]||(S[3]=e.createElementVNode("p",{class:"text-center text-xs font-medium text-red-700"},"Failed to load",-1)),e.createElementVNode("button",{type:"button","data-testid":"masonry-loader-retry",class:"inline-flex items-center rounded-md border border-slate-200 bg-white px-2 py-1 text-xs font-medium text-slate-700",onClick:T}," Retry ")])):e.createCommentVNode("",!0),p.value&&B.value&&!i.value?(e.openBlock(),e.createElementBlock("img",{key:u.item.id+":img:"+k.value,class:e.normalizeClass(["h-full w-full object-cover transition-opacity duration-300",f.value?"opacity-100":"opacity-0"]),src:u.item.preview,width:u.item.width,height:u.item.height,loading:"lazy",alt:u.item.id,onLoad:N,onError:S[0]||(S[0]=z=>C(z))},null,42,bt)):p.value&&!i.value?(e.openBlock(),e.createElementBlock("video",{key:u.item.id+":vid:"+k.value,class:e.normalizeClass(["h-full w-full object-cover transition-opacity duration-300",f.value?"opacity-100":"opacity-0"]),poster:u.item.preview,controls:"",preload:"metadata",onLoadedmetadata:N,onError:S[1]||(S[1]=z=>C(z))},[e.createElementVNode("source",{src:u.item.original,type:"video/mp4"},null,8,Mt)],42,Bt)):e.createCommentVNode("",!0)],4))}}),Ze=Symbol("masonryItemRegistry");function St(l,g){return!l||l<=0||!g||g<=0?1:Math.max(1,Math.floor(l/g))}function It(l,g,u,s=0){if(!l||l<=0||!g||g<=0)return u;const c=typeof s=="number"&&s>0?s:0,p=Math.max(0,g-1)*c,f=l-p;return!f||f<=0?u:f/g}function Et(l,g){const u=l?.width,s=l?.height;return typeof u=="number"&&typeof s=="number"&&u>0&&s>0?s/u*g:g}function et(l){return Number.isFinite(l)&&l>0?Math.floor(l):1}function pe(l){return Number.isFinite(l)&&l>0?Math.floor(l):0}function Nt(l){async function g(s){const c=pe(s);if(c<=0)return;l.stats.value={...l.stats.value,cooldownMsTotal:c,cooldownMsRemaining:c};const p=Date.now(),f=100;await new Promise(i=>{const k=setInterval(()=>{const x=Date.now()-p,B=Math.max(0,c-x);l.stats.value={...l.stats.value,cooldownMsTotal:c,cooldownMsRemaining:B},B<=0&&(clearInterval(k),i())},f)})}async function u(s){const c=et(l.getPageSize()),p=l.isEnabled(),f=pe(l.getRequestDelayMs()),i=[];let k=0;l.buffer.value.length&&(k=l.buffer.value.length,i.push(...l.buffer.value),l.buffer.value=[]),l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,cooldownMsTotal:f,cooldownMsRemaining:0,progress:{collected:0,target:0},pageSize:c,bufferSize:0};const x=[];let B=s,M=0,I=!1;for(;i.length<c&&B!=null;){const _=B;I&&(l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,isRequestInFlight:!0,requestPage:_,progress:{collected:Math.min(i.length,c),target:c},cooldownMsTotal:f,cooldownMsRemaining:0,pageSize:c});const N=await l.getContent(_);x.push(_),I&&(l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,isRequestInFlight:!1,requestPage:null}),M+=N.items.length,l.markEnterFromLeft(N.items),i.push(...N.items),B=N.nextPage,!I&&i.length<c&&B!=null?(I=!0,l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,isRequestInFlight:!1,requestPage:null,progress:{collected:Math.min(i.length,c),target:c},cooldownMsTotal:f,cooldownMsRemaining:0,pageSize:c}):I&&(l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,progress:{collected:Math.min(i.length,c),target:c}}),I&&i.length<c&&B!=null&&await g(f)}const F=i.slice(0,c),b=i.slice(c);return l.buffer.value=b,l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsTotal:f,cooldownMsRemaining:0,pageSize:c,bufferSize:b.length,lastBatch:{startPage:s,pages:x,usedFromBuffer:k,fetchedFromNetwork:M,collectedTotal:i.length,emitted:F.length,carried:b.length},totals:{pagesFetched:l.stats.value.totals.pagesFetched+x.length,itemsFetchedFromNetwork:l.stats.value.totals.itemsFetchedFromNetwork+M}},{batchItems:F,pages:x,nextPage:B}}return{loadBackfillBatch:u}}function Ft(l){const g=l.columnCount,u=l.columnWidth,s=l.gapX,c=l.gapY,p=l.headerHeight,f=l.footerHeight,i=l.bucketPx,k=Array.from({length:g},()=>0),x=new Array(l.items.length),B=new Array(l.items.length),M=new Map,I=new Map;let F=0;for(let b=0;b<l.items.length;b+=1){const _=l.items[b];_?.id&&I.set(_.id,b);let N=0;for(let A=1;A<k.length;A+=1)k[A]<k[N]&&(N=A);const C=N*(u+s),T=k[N],E=Et(_,u)+p+f;x[b]={x:C,y:T},B[b]=E,k[N]=T+E+c,F=Math.max(F,T+E);const S=Math.floor(T/i),z=Math.floor((T+E)/i);for(let A=S;A<=z;A+=1){const K=M.get(A);K?K.push(b):M.set(A,[b])}}return{positions:x,heights:B,buckets:M,contentHeight:F,indexById:I}}function Pt(l){const g=l.itemCount;if(!g)return[];if(l.viewportHeight<=0)return Array.from({length:g},(k,x)=>x);const u=Math.max(0,l.scrollTop-l.overscanPx),s=l.scrollTop+l.viewportHeight+l.overscanPx,c=Math.floor(u/l.bucketPx),p=Math.floor(s/l.bucketPx),f=new Set;for(let k=c;k<=p;k+=1){const x=l.buckets.get(k);if(x)for(const B of x)f.add(B)}const i=Array.from(f);return i.sort((k,x)=>k-x),i}const Tt={class:"hidden"},Rt={key:0,class:"flex h-full items-center justify-center"},_t={key:1,class:"text-sm font-medium text-red-700"},Ct={class:"mt-4 pb-2 text-center text-xs text-slate-600"},At={key:0,class:"inline-flex items-center justify-center gap-2"},Vt={key:1},zt={key:2},Lt=200,Ue=600,Ge=300,Ke=600,Je=600,Ht=5,qt=1e3,tt=e.defineComponent({inheritAttrs:!1,__name:"Masonry",props:e.mergeDefaults({getContent:{},mode:{},pageSize:{},backfillRequestDelayMs:{},items:{},page:{},restoredPagesLoaded:{},itemWidth:{},prefetchThresholdPx:{},gapX:{},gapY:{},headerHeight:{},footerHeight:{},overscanPx:{}},Qe),emits:["update:items"],setup(l,{expose:g,emit:u}){const s=l,c=u,p=e.useAttrs(),f=e.defineComponent({name:"SlotRenderer",props:{slotFn:{type:Function,required:!1},slotProps:{type:Object,required:!0}},setup(t){return()=>{const o=t.slotFn;return o?o(t.slotProps):null}}}),i=e.shallowRef(null);e.provide(Ze,t=>{i.value||(i.value=t)}),e.onMounted(()=>{if(!i.value)throw new Error("[Masonry] Missing <MasonryItem> definition. Add <MasonryItem> as a child of <Masonry>.")});const k=e.computed(()=>{const{class:t,...o}=p;return o}),x=e.ref(null),B=e.ref(0),M=e.ref(0),I=e.ref(0);let F;const b=e.computed(()=>s.gapX),_=e.computed(()=>s.gapY);function N(t){if(!t)return 0;const o=Math.max(0,b.value);return Math.max(0,t.clientWidth-o)}const C=e.computed(()=>s.headerHeight),T=e.computed(()=>s.footerHeight),E=e.computed(()=>i.value?.header),S=e.computed(()=>i.value?.footer),z=e.computed(()=>i.value?.default),A=e.computed(()=>!!E.value),K=e.computed(()=>!!S.value),ye=e.computed(()=>{if(C.value>0)return{height:`${C.value}px`}}),we=e.computed(()=>{if(T.value>0)return{height:`${T.value}px`}}),J=e.ref([]),se=e.ref([]),ke=e.ref(new Map),xe=e.ref(0),oe=e.ref(new Map);function be(t){const o=typeof t=="number"&&Number.isFinite(t)?t:0;return He.value+Math.max(0,o)}const $=e.ref(new Set),Y=e.ref(new Set),le=new Set,ae=e.ref(new Map),H=e.ref(new Set),q=e.ref([]);function ot(t){const o=ae.value.get(t);return o||{dx:0,dy:0}}function lt(t){if(Y.value.has(t))return`transform ${Ke}ms ease-out`;if(H.value.has(t))return`transform ${Ge}ms ease-out`}function at(t){const n=d.value[t]?.id,a=J.value[t]??{x:0,y:0},r=se.value[t]??0,m=r>0?r:te.value,v=a.x,y=n&&$.value.has(n)?be(m):a.y,w=n?ot(n):{dx:0,dy:0};return`translate3d(${v+w.dx}px,${y+w.dy}px,0)`}function X(t){(typeof requestAnimationFrame=="function"?requestAnimationFrame:n=>setTimeout(()=>n(0),0))(()=>t())}function rt(t){X(()=>X(t))}const Be=new Set;function Me(t){return typeof t=="number"&&Number.isFinite(t)&&t>0}function ie(t){if(!Array.isArray(t)||t.length===0)return;const o=new Set($.value);let n=!1;for(const a of t){const r=a?.id;if(r){if(!Be.has(r)){const m=a?.width,v=a?.height;(!Me(m)||!Me(v))&&(Be.add(r),console.warn(`[Masonry] Item "${r}" has invalid dimensions (width=${String(m)}, height=${String(v)}); layout expects { id, width, height }.`))}o.has(r)||(o.add(r),n=!0)}}n&&($.value=o)}function Se(){const t=new Map;for(const o of he.value){const a=d.value[o]?.id;if(!a)continue;const r=J.value[o];r&&t.set(a,{x:r.x,y:r.y})}return t}function Ie(t,o){if(!t.size)return;const n=new Map,a=[];for(const[m,v]of t.entries()){if(o?.has(m))continue;const y=oe.value.get(m);if(y==null)continue;const w=J.value[y];if(!w)continue;const h=v.x-w.x,V=v.y-w.y;(h||V)&&(n.set(m,{dx:h,dy:V}),a.push(m))}if(!n.size)return;ae.value=n;const r=new Set(H.value);for(const m of a)r.delete(m);H.value=r,X(()=>{H.value=new Set([...H.value,...a]),X(()=>{ae.value=new Map})}),setTimeout(()=>{const m=new Set(H.value);for(const v of a)m.delete(v);H.value=m},Ge)}const Q=e.ref(!0),Z=e.ref(!1),j=e.ref("");let P=0;function Ee(t){return t instanceof Error&&t.name==="AbortError"}function Ne(){const t=new Error("aborted");return t.name="AbortError",t}function st(t){return new Promise(o=>setTimeout(o,t))}async function Fe(t,o){let n=0;for(;;){if(o!==P)throw Ne();try{return await s.getContent(t)}catch(a){if(o!==P)throw Ne();if(n>=Ht)throw a;n+=1,await st(n*qt)}}}const L=e.ref([]),Pe=e.ref([]),ue=e.ref([]),R=e.ref(s.page),ce=e.ref([]);let W=null,U=null,re=0;function it(t){let o=-1;for(const n of t){const a=n?.originalIndex;ee(a)&&a>o&&(o=a)}re=o+1}function G(t){for(const o of t)!o||typeof o!="object"||o.id&&o.originalIndex==null&&(o.originalIndex=re,re+=1)}const D=new Map,O=[];function ee(t){return typeof t=="number"&&Number.isFinite(t)}function ut(t,o){if(!o.length)return t;const n=new Set;for(const v of t){const y=v?.id;y&&n.add(y)}const a=[];for(const v of o){const y=v?.id;y&&(n.has(y)||(a.push(v),n.add(y)))}if(!a.length)return t;const r=a.slice().sort((v,y)=>{const w=ee(v.originalIndex)?v.originalIndex:Number.POSITIVE_INFINITY,h=ee(y.originalIndex)?y.originalIndex:Number.POSITIVE_INFINITY;return w-h}),m=t.slice();for(const v of r){const y=v.originalIndex;if(!ee(y)){m.push(v);continue}let w=0,h=m.length;for(;w<h;){const V=w+h>>1,ne=m[V]?.originalIndex;(ee(ne)?ne:Number.POSITIVE_INFINITY)<=y?w=V+1:h=V}m.splice(w,0,v)}return m}async function Te(t){if(!t.length)return;ie(t);const o=Se();d.value=ut(d.value,t),await e.nextTick(),Ie(o)}async function Re(t){const n=(Array.isArray(t)?t:[t]).map(me).filter(Boolean);if(!n.length)return;const a=[];for(const r of n){const m=D.get(r);m&&a.push(m)}if(a.length){await Te(a);for(const r of a)r?.id&&D.delete(r.id)}}async function _e(){const t=O.pop();if(!t?.length)return;const o=[];for(const n of t){const a=D.get(n);a&&o.push(a)}if(o.length){await Te(o);for(const n of o)n?.id&&D.delete(n.id)}}async function ct(t){return Re(t)}async function ft(){return _e()}function Ce(t){const n=(Array.isArray(t)?t:[t]).map(me).filter(Boolean);if(!n.length)return;const a=new Set(n);for(const r of a)D.delete(r);for(let r=O.length-1;r>=0;r-=1){const v=O[r].filter(y=>!a.has(y));v.length?O[r]=v:O.splice(r,1)}}const fe=e.shallowRef({enabled:!1,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsRemaining:0,cooldownMsTotal:2e3,pageSize:20,bufferSize:0,lastBatch:null,totals:{pagesFetched:0,itemsFetchedFromNetwork:0}}),Ae=Nt({getContent:t=>Fe(t,P),markEnterFromLeft:ie,buffer:ce,stats:fe,isEnabled:()=>s.mode==="backfill",getPageSize:()=>s.pageSize,getRequestDelayMs:()=>s.backfillRequestDelayMs}),de=e.computed(()=>s.items!==void 0);e.watch(()=>s.items,t=>{de.value&&(ue.value=Array.isArray(t)?t:[])},{immediate:!0});const d=e.computed({get(){return de.value?ue.value:Pe.value},set(t){de.value?(ue.value=t,c("update:items",t)):Pe.value=t}});async function Ve(t){const o=await Fe(t,P);return G(o.items),ie(o.items),{items:o.items,nextPage:o.nextPage}}function me(t){return t?typeof t=="string"?t:t?.id:null}async function ze(t){const n=(Array.isArray(t)?t:[t]).map(me).filter(Boolean);if(!n.length)return;const a=new Set(n),r=[];for(const w of a){const h=oe.value.get(w);if(h==null)continue;const V=d.value[h];V&&(D.set(w,V),r.push(w))}r.length&&O.push(r);const m=Se(),v=te.value,y=[];for(const w of a){const h=oe.value.get(w);if(h==null)continue;const V=d.value[h];if(!V)continue;const ne=J.value[h]??{x:0,y:0},je=se.value[h]??v;y.push({id:w,item:V,fromX:ne.x,fromY:ne.y,width:v,height:je,leaving:!0})}if(y.length&&(q.value=[...q.value,...y]),d.value=d.value.filter(w=>{const h=w?.id;return!h||!a.has(h)}),await e.nextTick(),Ie(m,a),y.length){const w=new Set(y.map(h=>h.id));X(()=>{q.value=q.value.map(h=>w.has(h.id)?{...h,leaving:!1}:h),setTimeout(()=>{q.value=q.value.filter(h=>!w.has(h.id))},Je)})}}async function ve(t){return ze(t)}g({remove:ze,restore:ct,undo:ft,forget:Ce,pagesLoaded:L,nextPage:R,restoreRemoved:Re,undoLastRemoval:_e,forgetRemoved:Ce,backfillStats:fe});function Le(){const t=Ft({items:d.value,columnCount:ge.value,columnWidth:te.value,gapX:b.value,gapY:_.value,headerHeight:C.value,footerHeight:T.value,bucketPx:Ue});J.value=t.positions,se.value=t.heights,ke.value=t.buckets,xe.value=t.contentHeight,oe.value=t.indexById}const He=e.computed(()=>Math.max(xe.value,M.value)+Lt),he=e.computed(()=>Pt({itemCount:d.value.length,viewportHeight:M.value,scrollTop:I.value,overscanPx:s.overscanPx,bucketPx:Ue,buckets:ke.value}));e.watch(he,t=>{if(!t?.length)return;const o=[];for(const n of t){const a=d.value[n]?.id;a&&$.value.has(a)&&(le.has(a)||(le.add(a),o.push(a)))}o.length&&(X(()=>{const n=new Set(Y.value);for(const a of o)n.add(a);Y.value=n}),rt(()=>{const n=new Set($.value);for(const a of o)n.delete(a);$.value=n,setTimeout(()=>{const a=new Set(Y.value);for(const r of o)a.delete(r),le.delete(r);Y.value=a},Ke)}))},{flush:"post"});async function dt(){if(W)return W;if(Q.value||Z.value||s.mode!=="backfill"&&R.value==null||s.mode==="backfill"&&R.value==null&&ce.value.length===0)return;const t=P;let o=null;return o=(async()=>{try{if(Z.value=!0,j.value="",s.mode==="backfill"){const r=await Ae.loadBackfillBatch(R.value);if(t!==P)return;r.pages.length&&(L.value=[...L.value,...r.pages]),G(r.batchItems),d.value=[...d.value,...r.batchItems],R.value=r.nextPage;return}const n=R.value;if(n==null)return;const a=await Ve(n);if(t!==P)return;L.value=[...L.value,n],G(a.items),d.value=[...d.value,...a.items],R.value=a.nextPage}catch(n){if(t!==P||Ee(n))return;j.value=n instanceof Error?n.message:String(n)}finally{t===P&&(Z.value=!1),W===o&&(W=null)}})(),W=o,o}function mt(){const t=x.value;if(!t)return;I.value=t.scrollTop,M.value=t.clientHeight,t.scrollHeight-(t.scrollTop+t.clientHeight)<=s.prefetchThresholdPx&&dt()}function qe(){return x.value}function $e(t){B.value=N(t),M.value=t.clientHeight}function vt(){typeof ResizeObserver>"u"||(F=new ResizeObserver(()=>{const t=qe();t&&$e(t)}))}function ht(){return{enabled:s.mode==="backfill",isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsRemaining:0,cooldownMsTotal:pe(s.backfillRequestDelayMs),pageSize:et(s.pageSize),bufferSize:0,lastBatch:null,totals:{pagesFetched:0,itemsFetchedFromNetwork:0}}}function De(){P+=1,W=null,U=null,re=0,D.clear(),O.length=0,$.value=new Set,Y.value=new Set,le.clear(),ae.value=new Map,H.value=new Set,q.value=[],L.value=[],R.value=null,ce.value=[],fe.value=ht(),Q.value=!0,Z.value=!1,j.value=""}function Oe(t){De(),d.value=[],R.value=t}function gt(t){const o=Array.isArray(t)?t:[t],n=[],a=new Set;for(const r of o){if(r==null)continue;const m=typeof r=="string"?`s:${r}`:`n:${String(r)}`;a.has(m)||(a.add(m),n.push(r))}return n}function pt(t){const o=[];for(const n of t){if(typeof n=="number"&&Number.isFinite(n)){o.push(n);continue}if(typeof n=="string"){const a=Number.parseInt(n,10);Number.isFinite(a)&&o.push(a)}}return o.length?Math.max(...o)+1:null}function Ye(t){De();const o=gt(t);L.value=o,R.value=pt(o),Q.value=!1,it(d.value),G(d.value)}async function Xe(t){if(U)return U;const o=P;let n=null;return n=(async()=>{try{if(s.mode==="backfill"){const a=await Ae.loadBackfillBatch(t);if(o!==P)return;L.value=a.pages.length?a.pages:[t],G(a.batchItems),d.value=a.batchItems,R.value=a.nextPage}else{const a=await Ve(t);if(o!==P)return;L.value=[t],G(a.items),d.value=a.items,R.value=a.nextPage}}catch(a){if(o!==P||Ee(a))return;j.value=a instanceof Error?a.message:String(a)}finally{o===P&&(Q.value=!1),U===n&&(U=null)}})(),U=n,n}function yt(){const t=qe();t&&($e(t),I.value=t.scrollTop,F?.observe(t))}e.onMounted(async()=>{if(vt(),yt(),s.restoredPagesLoaded!=null){Ye(s.restoredPagesLoaded);return}Oe(s.page),await Xe(s.page)}),e.onUnmounted(()=>{F?.disconnect()}),e.watch(()=>s.page,async t=>{s.restoredPagesLoaded==null&&(Oe(t),await Xe(t))}),e.watch(()=>s.restoredPagesLoaded,t=>{t&&Ye(t)}),e.watch(b,()=>{const t=x.value;t&&(B.value=N(t))},{immediate:!1});const ge=e.computed(()=>St(B.value,s.itemWidth)),te=e.computed(()=>It(B.value,ge.value,s.itemWidth,b.value));e.watch([ge,te,b,_,C,T],()=>{Le()},{immediate:!0}),e.watch(()=>[d.value,d.value.length],()=>Le(),{immediate:!0});const wt=e.computed(()=>["mt-8 flex min-h-0 flex-1 flex-col rounded-2xl border border-slate-200/70 bg-white/70 p-5 shadow-sm backdrop-blur",p.class]);return(t,o)=>(e.openBlock(),e.createElementBlock("section",e.mergeProps(k.value,{class:wt.value}),[e.createElementVNode("div",Tt,[e.renderSlot(t.$slots,"default")]),e.createElementVNode("div",{ref_key:"scrollViewportRef",ref:x,"data-testid":"items-scroll-container",class:"mt-4 min-h-0 flex-1 overflow-auto",style:e.normalizeStyle({paddingRight:b.value+"px"}),onScroll:mt},[Q.value?(e.openBlock(),e.createElementBlock("div",Rt,o[0]||(o[0]=[e.createElementVNode("div",{class:"inline-flex items-center gap-3 text-sm text-slate-600"},[e.createElementVNode("svg",{class:"h-5 w-5 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})]),e.createElementVNode("span",null,"Loading…")],-1)]))):j.value?(e.openBlock(),e.createElementBlock("p",_t,"Error: "+e.toDisplayString(j.value),1)):(e.openBlock(),e.createElementBlock("div",{key:2,class:"relative",style:e.normalizeStyle({height:He.value+"px"})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(he.value,n=>(e.openBlock(),e.createElementBlock("article",{key:d.value[n].id,"data-testid":"item-card",class:"absolute overflow-hidden rounded-xl border border-slate-200/60 bg-white shadow-sm",style:e.normalizeStyle({width:te.value+"px",transition:lt(d.value[n].id),transform:at(n)})},[A.value||C.value>0?(e.openBlock(),e.createElementBlock("div",{key:0,"data-testid":"item-header-container",class:"w-full",style:e.normalizeStyle(ye.value)},[e.createVNode(e.unref(f),{"slot-fn":E.value,"slot-props":{item:d.value[n],remove:()=>ve(d.value[n])}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0),z.value?(e.openBlock(),e.createBlock(e.unref(f),{key:1,"slot-fn":z.value,"slot-props":{item:d.value[n],remove:()=>ve(d.value[n])}},null,8,["slot-fn","slot-props"])):(e.openBlock(),e.createBlock(We,{key:2,item:d.value[n]},null,8,["item"])),K.value||T.value>0?(e.openBlock(),e.createElementBlock("div",{key:3,"data-testid":"item-footer-container",class:"w-full",style:e.normalizeStyle(we.value)},[e.createVNode(e.unref(f),{"slot-fn":S.value,"slot-props":{item:d.value[n],remove:()=>ve(d.value[n])}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0)],4))),128)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(q.value,n=>(e.openBlock(),e.createElementBlock("article",{key:n.id+":leaving","data-testid":"item-card-leaving",class:"pointer-events-none absolute overflow-hidden rounded-xl border border-slate-200/60 bg-white shadow-sm",style:e.normalizeStyle({width:n.width+"px",transition:"transform "+Je+"ms ease-out",transform:n.leaving?"translate3d("+n.fromX+"px,"+n.fromY+"px,0)":"translate3d("+n.fromX+"px,"+be(n.height)+"px,0)"})},[A.value||C.value>0?(e.openBlock(),e.createElementBlock("div",{key:0,"data-testid":"item-header-container",class:"w-full",style:e.normalizeStyle(ye.value)},[e.createVNode(e.unref(f),{"slot-fn":E.value,"slot-props":{item:n.item,remove:()=>{}}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0),z.value?(e.openBlock(),e.createBlock(e.unref(f),{key:1,"slot-fn":z.value,"slot-props":{item:n.item,remove:()=>{}}},null,8,["slot-fn","slot-props"])):(e.openBlock(),e.createBlock(We,{key:2,item:n.item},null,8,["item"])),K.value||T.value>0?(e.openBlock(),e.createElementBlock("div",{key:3,"data-testid":"item-footer-container",class:"w-full",style:e.normalizeStyle(we.value)},[e.createVNode(e.unref(f),{"slot-fn":S.value,"slot-props":{item:n.item,remove:()=>{}}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0)],4))),128))],4)),e.createElementVNode("div",Ct,[Z.value?(e.openBlock(),e.createElementBlock("span",At,o[1]||(o[1]=[e.createElementVNode("svg",{class:"h-4 w-4 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})],-1),e.createElementVNode("span",null,"Loading more…",-1)]))):R.value==null?(e.openBlock(),e.createElementBlock("span",Vt,"End of list")):(e.openBlock(),e.createElementBlock("span",zt,"Scroll to load page "+e.toDisplayString(R.value),1))])],36)],16))}}),nt=e.defineComponent({name:"MasonryItem",setup(l,{slots:g}){const u=e.inject(Ze,null);return u?(u({header:g.header,default:g.default,footer:g.footer}),()=>null):()=>null}}),$t={install(l){l.component("Masonry",tt),l.component("MasonryItem",nt)}};exports.Masonry=tt;exports.MasonryItem=nt;exports.VibePlugin=$t;exports.masonryDefaults=Qe;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),ct={mode:"default",pageSize:20,backfillRequestDelayMs:2e3,page:1,itemWidth:300,prefetchThresholdPx:200,gapX:16,gapY:16,headerHeight:0,footerHeight:0,overscanPx:600},_t={key:0,"data-testid":"masonry-loader-spinner",class:"absolute inset-0 flex items-center justify-center"},Rt={key:1,"data-testid":"masonry-loader-error",class:"absolute inset-0 flex flex-col items-center justify-center gap-2 p-3"},Vt=["src","width","height","alt"],At=["poster"],Ct=["src"],lt=e.defineComponent({__name:"MasonryLoader",props:{item:{},timeoutMs:{default:15e3}},emits:["success","error"],setup(l,{emit:p}){const c=l,r=p,u=e.ref(null),d=e.ref(!1),f=e.ref(!1),i=e.ref(!1),v=e.ref(0),h=e.computed(()=>{const M=c.item?.width,S=c.item?.height;return{aspectRatio:`${M} / ${S}`}}),b=e.computed(()=>c.item?.type==="image");let B=null,I=null;function P(){I!=null&&(window.clearTimeout(I),I=null)}function E(){P();const M=typeof c.timeoutMs=="number"&&Number.isFinite(c.timeoutMs)?c.timeoutMs:0;M<=0||(I=window.setTimeout(()=>{d.value&&(f.value||i.value||q(new Error("timeout")))},M))}function R(){d.value||(d.value=!0,f.value=!1,i.value=!1,E())}e.onMounted(()=>{if(typeof IntersectionObserver>"u"){R();return}B=new IntersectionObserver(M=>{for(const S of M)if(S.isIntersecting&&!((S.intersectionRatio??0)<.5)){R(),B?.disconnect(),B=null;return}},{threshold:[0,.5,1]}),u.value&&B.observe(u.value)}),e.onUnmounted(()=>{B?.disconnect(),B=null,P()});function F(){f.value||(f.value=!0,i.value=!1,P(),r("success",c.item))}function q(M){i.value||(f.value=!1,i.value=!0,P(),r("error",{item:c.item,error:M}))}function C(){d.value&&(f.value=!1,i.value=!1,v.value+=1,E())}return(M,S)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"rootEl",ref:u,class:"relative bg-slate-100",style:e.normalizeStyle(h.value)},[d.value&&!f.value&&!i.value?(e.openBlock(),e.createElementBlock("div",_t,S[2]||(S[2]=[e.createElementVNode("svg",{class:"h-5 w-5 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})],-1)]))):d.value&&i.value?(e.openBlock(),e.createElementBlock("div",Rt,[S[3]||(S[3]=e.createElementVNode("p",{class:"text-center text-xs font-medium text-red-700"},"Failed to load",-1)),e.createElementVNode("button",{type:"button","data-testid":"masonry-loader-retry",class:"inline-flex items-center rounded-md border border-slate-200 bg-white px-2 py-1 text-xs font-medium text-slate-700",onClick:C}," Retry ")])):e.createCommentVNode("",!0),d.value&&b.value&&!i.value?(e.openBlock(),e.createElementBlock("img",{key:c.item.id+":img:"+v.value,class:e.normalizeClass(["h-full w-full object-cover transition-opacity duration-300",f.value?"opacity-100":"opacity-0"]),src:c.item.preview,width:c.item.width,height:c.item.height,loading:"lazy",alt:c.item.id,onLoad:F,onError:S[0]||(S[0]=A=>q(A))},null,42,Vt)):d.value&&!i.value?(e.openBlock(),e.createElementBlock("video",{key:c.item.id+":vid:"+v.value,class:e.normalizeClass(["h-full w-full object-cover transition-opacity duration-300",f.value?"opacity-100":"opacity-0"]),poster:c.item.preview,controls:"",preload:"metadata",onLoadedmetadata:F,onError:S[1]||(S[1]=A=>q(A))},[e.createElementVNode("source",{src:c.item.original,type:"video/mp4"},null,8,Ct)],42,At)):e.createCommentVNode("",!0)],4))}}),ft=Symbol("masonryItemRegistry");function zt(l,p){return!l||l<=0||!p||p<=0?1:Math.max(1,Math.floor(l/p))}function Lt(l,p,c,r=0){if(!l||l<=0||!p||p<=0)return c;const u=typeof r=="number"&&r>0?r:0,d=Math.max(0,p-1)*u,f=l-d;return!f||f<=0?c:f/p}function Ht(l,p){const c=l?.width,r=l?.height;return typeof c=="number"&&typeof r=="number"&&c>0&&r>0?r/c*p:p}function dt(l){return Number.isFinite(l)&&l>0?Math.floor(l):1}function Be(l){return Number.isFinite(l)&&l>0?Math.floor(l):0}function qt(l){async function p(r){const u=Be(r);if(u<=0)return;l.stats.value={...l.stats.value,cooldownMsTotal:u,cooldownMsRemaining:u};const d=Date.now(),f=100;await new Promise(i=>{const v=setInterval(()=>{const h=Date.now()-d,b=Math.max(0,u-h);l.stats.value={...l.stats.value,cooldownMsTotal:u,cooldownMsRemaining:b},b<=0&&(clearInterval(v),i())},f)})}async function c(r){const u=dt(l.getPageSize()),d=l.isEnabled(),f=Be(l.getRequestDelayMs()),i=[];let v=0;l.buffer.value.length&&(v=l.buffer.value.length,i.push(...l.buffer.value),l.buffer.value=[]),l.stats.value={...l.stats.value,enabled:d,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,cooldownMsTotal:f,cooldownMsRemaining:0,progress:{collected:0,target:0},pageSize:u,bufferSize:0};const h=[];let b=r,B=0,I=!1;for(;i.length<u&&b!=null;){const R=b;I&&(l.stats.value={...l.stats.value,enabled:d,isBackfillActive:!0,isRequestInFlight:!0,requestPage:R,progress:{collected:Math.min(i.length,u),target:u},cooldownMsTotal:f,cooldownMsRemaining:0,pageSize:u});const F=await l.getContent(R);h.push(R),I&&(l.stats.value={...l.stats.value,enabled:d,isBackfillActive:!0,isRequestInFlight:!1,requestPage:null}),B+=F.items.length,l.markEnterFromLeft(F.items),i.push(...F.items),b=F.nextPage,!I&&i.length<u&&b!=null?(I=!0,l.stats.value={...l.stats.value,enabled:d,isBackfillActive:!0,isRequestInFlight:!1,requestPage:null,progress:{collected:Math.min(i.length,u),target:u},cooldownMsTotal:f,cooldownMsRemaining:0,pageSize:u}):I&&(l.stats.value={...l.stats.value,enabled:d,isBackfillActive:!0,progress:{collected:Math.min(i.length,u),target:u}}),I&&i.length<u&&b!=null&&await p(f)}const P=i.slice(0,u),E=i.slice(u);return l.buffer.value=E,l.stats.value={...l.stats.value,enabled:d,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsTotal:f,cooldownMsRemaining:0,pageSize:u,bufferSize:E.length,lastBatch:{startPage:r,pages:h,usedFromBuffer:v,fetchedFromNetwork:B,collectedTotal:i.length,emitted:P.length,carried:E.length},totals:{pagesFetched:l.stats.value.totals.pagesFetched+h.length,itemsFetchedFromNetwork:l.stats.value.totals.itemsFetchedFromNetwork+B}},{batchItems:P,pages:h,nextPage:b}}return{loadBackfillBatch:c}}function Ot(l){const p=l.columnCount,c=l.columnWidth,r=l.gapX,u=l.gapY,d=l.headerHeight,f=l.footerHeight,i=l.bucketPx,v=Array.from({length:p},()=>0),h=new Array(l.items.length),b=new Array(l.items.length),B=new Map,I=new Map;let P=0;for(let E=0;E<l.items.length;E+=1){const R=l.items[E];R?.id&&I.set(R.id,E);let F=0;for(let _=1;_<v.length;_+=1)v[_]<v[F]&&(F=_);const q=F*(c+r),C=v[F],M=Ht(R,c)+d+f;h[E]={x:q,y:C},b[E]=M,v[F]=C+M+u,P=Math.max(P,C+M);const S=Math.floor(C/i),A=Math.floor((C+M)/i);for(let _=S;_<=A;_+=1){const Y=B.get(_);Y?Y.push(E):B.set(_,[E])}}return{positions:h,heights:b,buckets:B,contentHeight:P,indexById:I}}function Dt(l){const p=l.itemCount;if(!p)return[];if(l.viewportHeight<=0)return Array.from({length:p},(v,h)=>h);const c=Math.max(0,l.scrollTop-l.overscanPx),r=l.scrollTop+l.viewportHeight+l.overscanPx,u=Math.floor(c/l.bucketPx),d=Math.floor(r/l.bucketPx),f=new Set;for(let v=u;v<=d;v+=1){const h=l.buckets.get(v);if(h)for(const b of h)f.add(b)}const i=Array.from(f);return i.sort((v,h)=>v-h),i}const $t={class:"hidden"},Yt={key:0,class:"flex h-full items-center justify-center"},Xt={key:1,class:"text-sm font-medium text-red-700"},jt={class:"relative"},Wt={key:0,class:"pointer-events-auto absolute inset-0"},Ut={class:"relative"},Gt={key:0,class:"pointer-events-auto absolute inset-0"},Kt={class:"mt-4 pb-2 text-center text-xs text-slate-600"},Jt={key:0,class:"inline-flex items-center justify-center gap-2"},Qt={key:1},Zt={key:2},at=100,en=200,rt=600,st=300,it=600,ut=600,tn=5,nn=1e3,mt=e.defineComponent({inheritAttrs:!1,__name:"Masonry",props:e.mergeDefaults({getContent:{},mode:{},pageSize:{},backfillRequestDelayMs:{},items:{},page:{},restoredPagesLoaded:{},itemWidth:{},prefetchThresholdPx:{},gapX:{},gapY:{},headerHeight:{},footerHeight:{},overscanPx:{}},ct),emits:["update:items","preloaded","failures"],setup(l,{expose:p,emit:c}){const r=l,u=c,d=e.useAttrs(),f=e.defineComponent({name:"SlotRenderer",props:{slotFn:{type:Function,required:!1},slotProps:{type:Object,required:!0}},setup(t){return()=>{const o=t.slotFn;return o?o(t.slotProps):null}}}),i=e.shallowRef(null);e.provide(ft,t=>{i.value||(i.value=t)});const v=[],h=[];let b=null,B=null;function I(){if(!v.length)return;const t=v.splice(0,v.length);u("preloaded",t)}function P(){if(!h.length)return;const t=h.splice(0,h.length);u("failures",t)}function E(){b||(b=setTimeout(()=>{b=null,I()},at))}function R(){B||(B=setTimeout(()=>{B=null,P()},at))}function F(t){i.value?.onPreloaded?.(t),v.push(t),E()}function q(t){i.value?.onFailed?.(t),h.push(t),R()}e.onMounted(()=>{if(!i.value)throw new Error("[Masonry] Missing <MasonryItem> definition. Add <MasonryItem> as a child of <Masonry>.")});const C=e.computed(()=>{const{class:t,...o}=d;return o}),M=e.ref(null),S=e.ref(0),A=e.ref(0),_=e.ref(0);let Y;const X=e.computed(()=>r.gapX),Se=e.computed(()=>r.gapY);function Me(t){if(!t)return 0;const o=Math.max(0,X.value);return Math.max(0,t.clientWidth-o)}const j=e.computed(()=>r.headerHeight),W=e.computed(()=>r.footerHeight),ce=e.computed(()=>i.value?.header),fe=e.computed(()=>i.value?.footer),de=e.computed(()=>i.value?.overlay),Ie=e.computed(()=>!!ce.value),Ee=e.computed(()=>!!fe.value),Fe=e.computed(()=>!!de.value),Ne=e.computed(()=>{if(j.value>0)return{height:`${j.value}px`}}),Pe=e.computed(()=>{if(W.value>0)return{height:`${W.value}px`}}),ee=e.ref([]),me=e.ref([]),Te=e.ref(new Map),_e=e.ref(0),re=e.ref(new Map);function Re(t){const o=typeof t=="number"&&Number.isFinite(t)?t:0;return Ke.value+Math.max(0,o)}const O=e.ref(new Set),U=e.ref(new Set),se=new Set,ie=e.ref(new Map),L=e.ref(new Set),H=e.ref([]);function ht(t){const o=ie.value.get(t);return o||{dx:0,dy:0}}function gt(t){if(U.value.has(t))return`transform ${it}ms ease-out`;if(L.value.has(t))return`transform ${st}ms ease-out`}function pt(t){const n=m.value[t]?.id,a=ee.value[t]??{x:0,y:0},s=me.value[t]??0,g=s>0?s:le.value,y=a.x,x=n&&O.value.has(n)?Re(g):a.y,k=n?ht(n):{dx:0,dy:0};return`translate3d(${y+k.dx}px,${x+k.dy}px,0)`}function G(t){(typeof requestAnimationFrame=="function"?requestAnimationFrame:n=>setTimeout(()=>n(0),0))(()=>t())}function yt(t){G(()=>G(t))}const Ve=new Set;function Ae(t){return typeof t=="number"&&Number.isFinite(t)&&t>0}function ve(t){if(!Array.isArray(t)||t.length===0)return;const o=new Set(O.value);let n=!1;for(const a of t){const s=a?.id;if(s){if(!Ve.has(s)){const g=a?.width,y=a?.height;(!Ae(g)||!Ae(y))&&(Ve.add(s),console.warn(`[Masonry] Item "${s}" has invalid dimensions (width=${String(g)}, height=${String(y)}); layout expects { id, width, height }.`))}o.has(s)||(o.add(s),n=!0)}}n&&(O.value=o)}function Ce(){const t=new Map;for(const o of ke.value){const a=m.value[o]?.id;if(!a)continue;const s=ee.value[o];s&&t.set(a,{x:s.x,y:s.y})}return t}function ze(t,o){if(!t.size)return;const n=new Map,a=[];for(const[g,y]of t.entries()){if(o?.has(g))continue;const x=re.value.get(g);if(x==null)continue;const k=ee.value[x];if(!k)continue;const w=y.x-k.x,V=y.y-k.y;(w||V)&&(n.set(g,{dx:w,dy:V}),a.push(g))}if(!n.size)return;ie.value=n;const s=new Set(L.value);for(const g of a)s.delete(g);L.value=s,G(()=>{L.value=new Set([...L.value,...a]),G(()=>{ie.value=new Map})}),setTimeout(()=>{const g=new Set(L.value);for(const y of a)g.delete(y);L.value=g},st)}const te=e.ref(!0),ne=e.ref(!1),K=e.ref("");let N=0;function Le(t){return t instanceof Error&&t.name==="AbortError"}function He(){const t=new Error("aborted");return t.name="AbortError",t}function wt(t){return new Promise(o=>setTimeout(o,t))}async function qe(t,o){let n=0;for(;;){if(o!==N)throw He();try{return await r.getContent(t)}catch(a){if(o!==N)throw He();if(n>=tn)throw a;n+=1,await wt(n*nn)}}}const z=e.ref([]),Oe=e.ref([]),he=e.ref([]),T=e.ref(r.page),ge=e.ref([]);let J=null,Q=null,ue=0;function xt(t){let o=-1;for(const n of t){const a=n?.originalIndex;oe(a)&&a>o&&(o=a)}ue=o+1}function Z(t){for(const o of t)!o||typeof o!="object"||o.id&&o.originalIndex==null&&(o.originalIndex=ue,ue+=1)}const D=new Map,$=[];function oe(t){return typeof t=="number"&&Number.isFinite(t)}function kt(t,o){if(!o.length)return t;const n=new Set;for(const y of t){const x=y?.id;x&&n.add(x)}const a=[];for(const y of o){const x=y?.id;x&&(n.has(x)||(a.push(y),n.add(x)))}if(!a.length)return t;const s=a.slice().sort((y,x)=>{const k=oe(y.originalIndex)?y.originalIndex:Number.POSITIVE_INFINITY,w=oe(x.originalIndex)?x.originalIndex:Number.POSITIVE_INFINITY;return k-w}),g=t.slice();for(const y of s){const x=y.originalIndex;if(!oe(x)){g.push(y);continue}let k=0,w=g.length;for(;k<w;){const V=k+w>>1,ae=g[V]?.originalIndex;(oe(ae)?ae:Number.POSITIVE_INFINITY)<=x?k=V+1:w=V}g.splice(k,0,y)}return g}async function De(t){if(!t.length)return;ve(t);const o=Ce();m.value=kt(m.value,t),await e.nextTick(),ze(o)}async function $e(t){const n=(Array.isArray(t)?t:[t]).map(we).filter(Boolean);if(!n.length)return;const a=[];for(const s of n){const g=D.get(s);g&&a.push(g)}if(a.length){await De(a);for(const s of a)s?.id&&D.delete(s.id)}}async function Ye(){const t=$.pop();if(!t?.length)return;const o=[];for(const n of t){const a=D.get(n);a&&o.push(a)}if(o.length){await De(o);for(const n of o)n?.id&&D.delete(n.id)}}async function bt(t){return $e(t)}async function Bt(){return Ye()}function Xe(t){const n=(Array.isArray(t)?t:[t]).map(we).filter(Boolean);if(!n.length)return;const a=new Set(n);for(const s of a)D.delete(s);for(let s=$.length-1;s>=0;s-=1){const y=$[s].filter(x=>!a.has(x));y.length?$[s]=y:$.splice(s,1)}}const pe=e.shallowRef({enabled:!1,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsRemaining:0,cooldownMsTotal:2e3,pageSize:20,bufferSize:0,lastBatch:null,totals:{pagesFetched:0,itemsFetchedFromNetwork:0}}),je=qt({getContent:t=>qe(t,N),markEnterFromLeft:ve,buffer:ge,stats:pe,isEnabled:()=>r.mode==="backfill",getPageSize:()=>r.pageSize,getRequestDelayMs:()=>r.backfillRequestDelayMs}),ye=e.computed(()=>r.items!==void 0);e.watch(()=>r.items,t=>{ye.value&&(he.value=Array.isArray(t)?t:[])},{immediate:!0});const m=e.computed({get(){return ye.value?he.value:Oe.value},set(t){ye.value?(he.value=t,u("update:items",t)):Oe.value=t}});async function We(t){const o=await qe(t,N);return Z(o.items),ve(o.items),{items:o.items,nextPage:o.nextPage}}function we(t){return t?typeof t=="string"?t:t?.id:null}async function Ue(t){const n=(Array.isArray(t)?t:[t]).map(we).filter(Boolean);if(!n.length)return;const a=new Set(n),s=[];for(const k of a){const w=re.value.get(k);if(w==null)continue;const V=m.value[w];V&&(D.set(k,V),s.push(k))}s.length&&$.push(s);const g=Ce(),y=le.value,x=[];for(const k of a){const w=re.value.get(k);if(w==null)continue;const V=m.value[w];if(!V)continue;const ae=ee.value[w]??{x:0,y:0},ot=me.value[w]??y;x.push({id:k,item:V,fromX:ae.x,fromY:ae.y,width:y,height:ot,leaving:!0})}if(x.length&&(H.value=[...H.value,...x]),m.value=m.value.filter(k=>{const w=k?.id;return!w||!a.has(w)}),await e.nextTick(),ze(g,a),x.length){const k=new Set(x.map(w=>w.id));G(()=>{H.value=H.value.map(w=>k.has(w.id)?{...w,leaving:!1}:w),setTimeout(()=>{H.value=H.value.filter(w=>!k.has(w.id))},ut)})}}async function xe(t){return Ue(t)}p({remove:Ue,restore:bt,undo:Bt,forget:Xe,pagesLoaded:z,nextPage:T,restoreRemoved:$e,undoLastRemoval:Ye,forgetRemoved:Xe,backfillStats:pe});function Ge(){const t=Ot({items:m.value,columnCount:be.value,columnWidth:le.value,gapX:X.value,gapY:Se.value,headerHeight:j.value,footerHeight:W.value,bucketPx:rt});ee.value=t.positions,me.value=t.heights,Te.value=t.buckets,_e.value=t.contentHeight,re.value=t.indexById}const Ke=e.computed(()=>Math.max(_e.value,A.value)+en),ke=e.computed(()=>Dt({itemCount:m.value.length,viewportHeight:A.value,scrollTop:_.value,overscanPx:r.overscanPx,bucketPx:rt,buckets:Te.value}));e.watch(ke,t=>{if(!t?.length)return;const o=[];for(const n of t){const a=m.value[n]?.id;a&&O.value.has(a)&&(se.has(a)||(se.add(a),o.push(a)))}o.length&&(G(()=>{const n=new Set(U.value);for(const a of o)n.add(a);U.value=n}),yt(()=>{const n=new Set(O.value);for(const a of o)n.delete(a);O.value=n,setTimeout(()=>{const a=new Set(U.value);for(const s of o)a.delete(s),se.delete(s);U.value=a},it)}))},{flush:"post"});async function St(){if(J)return J;if(te.value||ne.value||r.mode!=="backfill"&&T.value==null||r.mode==="backfill"&&T.value==null&&ge.value.length===0)return;const t=N;let o=null;return o=(async()=>{try{if(ne.value=!0,K.value="",r.mode==="backfill"){const s=await je.loadBackfillBatch(T.value);if(t!==N)return;s.pages.length&&(z.value=[...z.value,...s.pages]),Z(s.batchItems),m.value=[...m.value,...s.batchItems],T.value=s.nextPage;return}const n=T.value;if(n==null)return;const a=await We(n);if(t!==N)return;z.value=[...z.value,n],Z(a.items),m.value=[...m.value,...a.items],T.value=a.nextPage}catch(n){if(t!==N||Le(n))return;K.value=n instanceof Error?n.message:String(n)}finally{t===N&&(ne.value=!1),J===o&&(J=null)}})(),J=o,o}function Mt(){const t=M.value;if(!t)return;_.value=t.scrollTop,A.value=t.clientHeight,t.scrollHeight-(t.scrollTop+t.clientHeight)<=r.prefetchThresholdPx&&St()}function Je(){return M.value}function Qe(t){S.value=Me(t),A.value=t.clientHeight}function It(){typeof ResizeObserver>"u"||(Y=new ResizeObserver(()=>{const t=Je();t&&Qe(t)}))}function Et(){return{enabled:r.mode==="backfill",isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsRemaining:0,cooldownMsTotal:Be(r.backfillRequestDelayMs),pageSize:dt(r.pageSize),bufferSize:0,lastBatch:null,totals:{pagesFetched:0,itemsFetchedFromNetwork:0}}}function Ze(){N+=1,J=null,Q=null,ue=0,D.clear(),$.length=0,O.value=new Set,U.value=new Set,se.clear(),ie.value=new Map,L.value=new Set,H.value=[],z.value=[],T.value=null,ge.value=[],pe.value=Et(),te.value=!0,ne.value=!1,K.value=""}function et(t){Ze(),m.value=[],T.value=t}function Ft(t){const o=Array.isArray(t)?t:[t],n=[],a=new Set;for(const s of o){if(s==null)continue;const g=typeof s=="string"?`s:${s}`:`n:${String(s)}`;a.has(g)||(a.add(g),n.push(s))}return n}function Nt(t){const o=[];for(const n of t){if(typeof n=="number"&&Number.isFinite(n)){o.push(n);continue}if(typeof n=="string"){const a=Number.parseInt(n,10);Number.isFinite(a)&&o.push(a)}}return o.length?Math.max(...o)+1:null}function tt(t){Ze();const o=Ft(t);z.value=o,T.value=Nt(o),te.value=!1,xt(m.value),Z(m.value)}async function nt(t){if(Q)return Q;const o=N;let n=null;return n=(async()=>{try{if(r.mode==="backfill"){const a=await je.loadBackfillBatch(t);if(o!==N)return;z.value=a.pages.length?a.pages:[t],Z(a.batchItems),m.value=a.batchItems,T.value=a.nextPage}else{const a=await We(t);if(o!==N)return;z.value=[t],Z(a.items),m.value=a.items,T.value=a.nextPage}}catch(a){if(o!==N||Le(a))return;K.value=a instanceof Error?a.message:String(a)}finally{o===N&&(te.value=!1),Q===n&&(Q=null)}})(),Q=n,n}function Pt(){const t=Je();t&&(Qe(t),_.value=t.scrollTop,Y?.observe(t))}e.onMounted(async()=>{if(It(),Pt(),r.restoredPagesLoaded!=null){tt(r.restoredPagesLoaded);return}et(r.page),await nt(r.page)}),e.onUnmounted(()=>{Y?.disconnect(),b&&(clearTimeout(b),b=null),B&&(clearTimeout(B),B=null),I(),P()}),e.watch(()=>r.page,async t=>{r.restoredPagesLoaded==null&&(et(t),await nt(t))}),e.watch(()=>r.restoredPagesLoaded,t=>{t&&tt(t)}),e.watch(X,()=>{const t=M.value;t&&(S.value=Me(t))},{immediate:!1});const be=e.computed(()=>zt(S.value,r.itemWidth)),le=e.computed(()=>Lt(S.value,be.value,r.itemWidth,X.value));e.watch([be,le,X,Se,j,W],()=>{Ge()},{immediate:!0}),e.watch(()=>[m.value,m.value.length],()=>Ge(),{immediate:!0});const Tt=e.computed(()=>["mt-8 flex min-h-0 flex-1 flex-col rounded-2xl border border-slate-200/70 bg-white/70 p-5 shadow-sm backdrop-blur",d.class]);return(t,o)=>(e.openBlock(),e.createElementBlock("section",e.mergeProps(C.value,{class:Tt.value}),[e.createElementVNode("div",$t,[e.renderSlot(t.$slots,"default")]),e.createElementVNode("div",{ref_key:"scrollViewportRef",ref:M,"data-testid":"items-scroll-container",class:"mt-4 min-h-0 flex-1 overflow-auto",style:e.normalizeStyle({paddingRight:X.value+"px"}),onScroll:Mt},[te.value?(e.openBlock(),e.createElementBlock("div",Yt,o[0]||(o[0]=[e.createElementVNode("div",{class:"inline-flex items-center gap-3 text-sm text-slate-600"},[e.createElementVNode("svg",{class:"h-5 w-5 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})]),e.createElementVNode("span",null,"Loading…")],-1)]))):K.value?(e.openBlock(),e.createElementBlock("p",Xt,"Error: "+e.toDisplayString(K.value),1)):(e.openBlock(),e.createElementBlock("div",{key:2,class:"relative",style:e.normalizeStyle({height:Ke.value+"px"})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(ke.value,n=>(e.openBlock(),e.createElementBlock("article",{key:m.value[n].id,"data-testid":"item-card",class:"absolute overflow-hidden rounded-xl border border-slate-200/60 bg-white shadow-sm",style:e.normalizeStyle({width:le.value+"px",transition:gt(m.value[n].id),transform:pt(n)})},[Ie.value||j.value>0?(e.openBlock(),e.createElementBlock("div",{key:0,"data-testid":"item-header-container",class:"w-full",style:e.normalizeStyle(Ne.value)},[e.createVNode(e.unref(f),{"slot-fn":ce.value,"slot-props":{item:m.value[n],remove:()=>xe(m.value[n])}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0),e.createElementVNode("div",jt,[e.createVNode(lt,{item:m.value[n],onSuccess:F,onError:q},null,8,["item"]),Fe.value?(e.openBlock(),e.createElementBlock("div",Wt,[e.createVNode(e.unref(f),{"slot-fn":de.value,"slot-props":{item:m.value[n],remove:()=>xe(m.value[n])}},null,8,["slot-fn","slot-props"])])):e.createCommentVNode("",!0)]),Ee.value||W.value>0?(e.openBlock(),e.createElementBlock("div",{key:1,"data-testid":"item-footer-container",class:"w-full",style:e.normalizeStyle(Pe.value)},[e.createVNode(e.unref(f),{"slot-fn":fe.value,"slot-props":{item:m.value[n],remove:()=>xe(m.value[n])}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0)],4))),128)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(H.value,n=>(e.openBlock(),e.createElementBlock("article",{key:n.id+":leaving","data-testid":"item-card-leaving",class:"pointer-events-none absolute overflow-hidden rounded-xl border border-slate-200/60 bg-white shadow-sm",style:e.normalizeStyle({width:n.width+"px",transition:"transform "+ut+"ms ease-out",transform:n.leaving?"translate3d("+n.fromX+"px,"+n.fromY+"px,0)":"translate3d("+n.fromX+"px,"+Re(n.height)+"px,0)"})},[Ie.value||j.value>0?(e.openBlock(),e.createElementBlock("div",{key:0,"data-testid":"item-header-container",class:"w-full",style:e.normalizeStyle(Ne.value)},[e.createVNode(e.unref(f),{"slot-fn":ce.value,"slot-props":{item:n.item,remove:()=>{}}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0),e.createElementVNode("div",Ut,[e.createVNode(lt,{item:n.item},null,8,["item"]),Fe.value?(e.openBlock(),e.createElementBlock("div",Gt,[e.createVNode(e.unref(f),{"slot-fn":de.value,"slot-props":{item:n.item,remove:()=>{}}},null,8,["slot-fn","slot-props"])])):e.createCommentVNode("",!0)]),Ee.value||W.value>0?(e.openBlock(),e.createElementBlock("div",{key:1,"data-testid":"item-footer-container",class:"w-full",style:e.normalizeStyle(Pe.value)},[e.createVNode(e.unref(f),{"slot-fn":fe.value,"slot-props":{item:n.item,remove:()=>{}}},null,8,["slot-fn","slot-props"])],4)):e.createCommentVNode("",!0)],4))),128))],4)),e.createElementVNode("div",Kt,[ne.value?(e.openBlock(),e.createElementBlock("span",Jt,o[1]||(o[1]=[e.createElementVNode("svg",{class:"h-4 w-4 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[e.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),e.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})],-1),e.createElementVNode("span",null,"Loading more…",-1)]))):T.value==null?(e.openBlock(),e.createElementBlock("span",Qt,"End of list")):(e.openBlock(),e.createElementBlock("span",Zt,"Scroll to load page "+e.toDisplayString(T.value),1))])],36)],16))}}),vt=e.defineComponent({name:"MasonryItem",setup(l,{slots:p,attrs:c}){const r=e.inject(ft,null);if(!r)return()=>null;const u=c.onPreloaded,d=c.onFailed,f=p.overlay,i=p.default;return r({header:p.header,overlay:f??i,footer:p.footer,onPreloaded:typeof u=="function"?u:Array.isArray(u)?v=>{for(const h of u)typeof h=="function"&&h(v)}:void 0,onFailed:typeof d=="function"?d:Array.isArray(d)?v=>{for(const h of d)typeof h=="function"&&h(v)}:void 0}),()=>null}}),on={install(l){l.component("Masonry",mt),l.component("MasonryItem",vt)}};exports.Masonry=mt;exports.MasonryItem=vt;exports.VibePlugin=on;exports.masonryDefaults=ct;
|