@wyxos/vibe 2.1.2 → 2.1.3

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/README.md CHANGED
@@ -11,7 +11,7 @@ It’s built for large, scroll-heavy media feeds and aims to stay smooth with th
11
11
  - Optional backfill mode to reach a target `pageSize`
12
12
  - Smooth removal + reorder transitions, with `remove` / `undo` / `restore`
13
13
  - Preserves a single DOM sequence (no column re-parenting)
14
- - Optional `itemHeader` / `itemFooter` slots per card
14
+ - Item templates via `<MasonryItem>` with `#header` / `#default` / `#footer`
15
15
 
16
16
  ## Demo
17
17
 
package/lib/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("vue"),Ue={mode:"default",pageSize:20,backfillRequestDelayMs:2e3,page:1,itemWidth:300,prefetchThresholdPx:200,gapX:16,gapY:16,headerHeight:0,footerHeight:0,overscanPx:600},vt={key:0,"data-testid":"masonry-loader-spinner",class:"absolute inset-0 flex items-center justify-center"},ht={key:1,"data-testid":"masonry-loader-error",class:"absolute inset-0 flex flex-col items-center justify-center gap-2 p-3"},gt=["src","width","height","alt"],pt=["poster"],yt=["src"],Oe=t.defineComponent({__name:"MasonryLoader",props:{item:{}},emits:["success","error"],setup(l,{emit:b}){const u=l,s=b,i=t.ref(null),p=t.ref(!1),m=t.ref(!1),c=t.ref(!1),g=t.ref(0),k=t.computed(()=>{const x=u.item?.width,B=u.item?.height;return{aspectRatio:`${x} / ${B}`}}),S=t.computed(()=>u.item?.type==="image");let M=null;function E(){p.value||(p.value=!0,m.value=!1,c.value=!1)}t.onMounted(()=>{if(typeof IntersectionObserver>"u"){E();return}M=new IntersectionObserver(x=>{for(const B of x)if(B.isIntersecting&&!((B.intersectionRatio??0)<.5)){E(),M?.disconnect(),M=null;return}},{threshold:[0,.5,1]}),i.value&&M.observe(i.value)}),t.onUnmounted(()=>{M?.disconnect(),M=null});function N(){m.value||(m.value=!0,c.value=!1,s("success",u.item))}function I(x){c.value||(m.value=!1,c.value=!0,s("error",{item:u.item,error:x}))}function R(){p.value&&(m.value=!1,c.value=!1,g.value+=1)}return(x,B)=>(t.openBlock(),t.createElementBlock("div",{ref_key:"rootEl",ref:i,class:"relative bg-slate-100",style:t.normalizeStyle(k.value)},[p.value&&!m.value&&!c.value?(t.openBlock(),t.createElementBlock("div",vt,B[2]||(B[2]=[t.createElementVNode("svg",{class:"h-5 w-5 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[t.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),t.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&&c.value?(t.openBlock(),t.createElementBlock("div",ht,[B[3]||(B[3]=t.createElementVNode("p",{class:"text-center text-xs font-medium text-red-700"},"Failed to load",-1)),t.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:R}," Retry ")])):t.createCommentVNode("",!0),p.value&&S.value&&!c.value?(t.openBlock(),t.createElementBlock("img",{key:u.item.id+":img:"+g.value,class:t.normalizeClass(["h-full w-full object-cover transition-opacity duration-300",m.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:B[0]||(B[0]=A=>I(A))},null,42,gt)):p.value&&!c.value?(t.openBlock(),t.createElementBlock("video",{key:u.item.id+":vid:"+g.value,class:t.normalizeClass(["h-full w-full object-cover transition-opacity duration-300",m.value?"opacity-100":"opacity-0"]),poster:u.item.preview,controls:"",preload:"metadata",onLoadedmetadata:N,onError:B[1]||(B[1]=A=>I(A))},[t.createElementVNode("source",{src:u.item.original,type:"video/mp4"},null,8,yt)],42,pt)):t.createCommentVNode("",!0)],4))}});function wt(l,b){return!l||l<=0||!b||b<=0?1:Math.max(1,Math.floor(l/b))}function xt(l,b,u,s=0){if(!l||l<=0||!b||b<=0)return u;const i=typeof s=="number"&&s>0?s:0,p=Math.max(0,b-1)*i,m=l-p;return!m||m<=0?u:m/b}function kt(l,b){const u=l?.width,s=l?.height;return typeof u=="number"&&typeof s=="number"&&u>0&&s>0?s/u*b:b}function Ge(l){return Number.isFinite(l)&&l>0?Math.floor(l):1}function ve(l){return Number.isFinite(l)&&l>0?Math.floor(l):0}function bt(l){async function b(s){const i=ve(s);if(i<=0)return;l.stats.value={...l.stats.value,cooldownMsTotal:i,cooldownMsRemaining:i};const p=Date.now(),m=100;await new Promise(c=>{const g=setInterval(()=>{const k=Date.now()-p,S=Math.max(0,i-k);l.stats.value={...l.stats.value,cooldownMsTotal:i,cooldownMsRemaining:S},S<=0&&(clearInterval(g),c())},m)})}async function u(s){const i=Ge(l.getPageSize()),p=l.isEnabled(),m=ve(l.getRequestDelayMs()),c=[];let g=0;l.buffer.value.length&&(g=l.buffer.value.length,c.push(...l.buffer.value),l.buffer.value=[]),l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,cooldownMsTotal:m,cooldownMsRemaining:0,progress:{collected:0,target:0},pageSize:i,bufferSize:0};const k=[];let S=s,M=0,E=!1;for(;c.length<i&&S!=null;){const R=S;E&&(l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,isRequestInFlight:!0,requestPage:R,progress:{collected:Math.min(c.length,i),target:i},cooldownMsTotal:m,cooldownMsRemaining:0,pageSize:i});const x=await l.getContent(R);k.push(R),E&&(l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,isRequestInFlight:!1,requestPage:null}),M+=x.items.length,l.markEnterFromLeft(x.items),c.push(...x.items),S=x.nextPage,!E&&c.length<i&&S!=null?(E=!0,l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,isRequestInFlight:!1,requestPage:null,progress:{collected:Math.min(c.length,i),target:i},cooldownMsTotal:m,cooldownMsRemaining:0,pageSize:i}):E&&(l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!0,progress:{collected:Math.min(c.length,i),target:i}}),E&&c.length<i&&S!=null&&await b(m)}const N=c.slice(0,i),I=c.slice(i);return l.buffer.value=I,l.stats.value={...l.stats.value,enabled:p,isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsTotal:m,cooldownMsRemaining:0,pageSize:i,bufferSize:I.length,lastBatch:{startPage:s,pages:k,usedFromBuffer:g,fetchedFromNetwork:M,collectedTotal:c.length,emitted:N.length,carried:I.length},totals:{pagesFetched:l.stats.value.totals.pagesFetched+k.length,itemsFetchedFromNetwork:l.stats.value.totals.itemsFetchedFromNetwork+M}},{batchItems:N,pages:k,nextPage:S}}return{loadBackfillBatch:u}}function Bt(l){const b=l.columnCount,u=l.columnWidth,s=l.gapX,i=l.gapY,p=l.headerHeight,m=l.footerHeight,c=l.bucketPx,g=Array.from({length:b},()=>0),k=new Array(l.items.length),S=new Array(l.items.length),M=new Map,E=new Map;let N=0;for(let I=0;I<l.items.length;I+=1){const R=l.items[I];R?.id&&E.set(R.id,I);let x=0;for(let P=1;P<g.length;P+=1)g[P]<g[x]&&(x=P);const B=x*(u+s),A=g[x],H=kt(R,u)+p+m;k[I]={x:B,y:A},S[I]=H,g[x]=A+H+i,N=Math.max(N,A+H);const ee=Math.floor(A/c),te=Math.floor((A+H)/c);for(let P=ee;P<=te;P+=1){const D=M.get(P);D?D.push(I):M.set(P,[I])}}return{positions:k,heights:S,buckets:M,contentHeight:N,indexById:E}}function St(l){const b=l.itemCount;if(!b)return[];if(l.viewportHeight<=0)return Array.from({length:b},(g,k)=>k);const u=Math.max(0,l.scrollTop-l.overscanPx),s=l.scrollTop+l.viewportHeight+l.overscanPx,i=Math.floor(u/l.bucketPx),p=Math.floor(s/l.bucketPx),m=new Set;for(let g=i;g<=p;g+=1){const k=l.buckets.get(g);if(k)for(const S of k)m.add(S)}const c=Array.from(m);return c.sort((g,k)=>g-k),c}const Mt={key:0,class:"flex h-full items-center justify-center"},It={key:1,class:"text-sm font-medium text-red-700"},Et={class:"mt-4 pb-2 text-center text-xs text-slate-600"},Nt={key:0,class:"inline-flex items-center justify-center gap-2"},Pt={key:1},Ft={key:2},Tt=200,Ye=600,Xe=300,je=600,We=600,Rt=5,At=1e3,Ke=t.defineComponent({inheritAttrs:!1,__name:"Masonry",props:t.mergeDefaults({getContent:{},mode:{},pageSize:{},backfillRequestDelayMs:{},items:{},page:{},restoredPagesLoaded:{},itemWidth:{},prefetchThresholdPx:{},gapX:{},gapY:{},headerHeight:{},footerHeight:{},overscanPx:{}},Ue),emits:["update:items"],setup(l,{expose:b,emit:u}){const s=l,i=u,p=t.useAttrs(),m=t.useSlots(),c=t.computed(()=>{const{class:e,...o}=p;return o}),g=t.ref(null),k=t.ref(0),S=t.ref(0),M=t.ref(0);let E;const N=t.computed(()=>s.gapX),I=t.computed(()=>s.gapY);function R(e){if(!e)return 0;const o=Math.max(0,N.value);return Math.max(0,e.clientWidth-o)}const x=t.computed(()=>s.headerHeight),B=t.computed(()=>s.footerHeight),A=t.computed(()=>!!m.itemHeader),H=t.computed(()=>!!m.itemFooter),ee=t.computed(()=>{if(x.value>0)return{height:`${x.value}px`}}),te=t.computed(()=>{if(B.value>0)return{height:`${B.value}px`}}),P=t.ref([]),D=t.ref([]),he=t.ref(new Map),ge=t.ref(0),ne=t.ref(new Map);function pe(e){const o=typeof e=="number"&&Number.isFinite(e)?e:0;return Ve.value+Math.max(0,o)}const L=t.ref(new Set),O=t.ref(new Set),oe=new Set,ae=t.ref(new Map),z=t.ref(new Set),_=t.ref([]);function Je(e){const o=ae.value.get(e);return o||{dx:0,dy:0}}function Qe(e){if(O.value.has(e))return`transform ${je}ms ease-out`;if(z.value.has(e))return`transform ${Xe}ms ease-out`}function Ze(e){const n=f.value[e]?.id,a=P.value[e]??{x:0,y:0},r=D.value[e]??0,d=r>0?r:Q.value,v=a.x,y=n&&L.value.has(n)?pe(d):a.y,w=n?Je(n):{dx:0,dy:0};return`translate3d(${v+w.dx}px,${y+w.dy}px,0)`}function Y(e){(typeof requestAnimationFrame=="function"?requestAnimationFrame:n=>setTimeout(()=>n(0),0))(()=>e())}function et(e){Y(()=>Y(e))}const ye=new Set;function we(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function re(e){if(!Array.isArray(e)||e.length===0)return;const o=new Set(L.value);let n=!1;for(const a of e){const r=a?.id;if(r){if(!ye.has(r)){const d=a?.width,v=a?.height;(!we(d)||!we(v))&&(ye.add(r),console.warn(`[Masonry] Item "${r}" has invalid dimensions (width=${String(d)}, height=${String(v)}); layout expects { id, width, height }.`))}o.has(r)||(o.add(r),n=!0)}}n&&(L.value=o)}function xe(){const e=new Map;for(const o of de.value){const a=f.value[o]?.id;if(!a)continue;const r=P.value[o];r&&e.set(a,{x:r.x,y:r.y})}return e}function ke(e,o){if(!e.size)return;const n=new Map,a=[];for(const[d,v]of e.entries()){if(o?.has(d))continue;const y=ne.value.get(d);if(y==null)continue;const w=P.value[y];if(!w)continue;const h=v.x-w.x,C=v.y-w.y;(h||C)&&(n.set(d,{dx:h,dy:C}),a.push(d))}if(!n.size)return;ae.value=n;const r=new Set(z.value);for(const d of a)r.delete(d);z.value=r,Y(()=>{z.value=new Set([...z.value,...a]),Y(()=>{ae.value=new Map})}),setTimeout(()=>{const d=new Set(z.value);for(const v of a)d.delete(v);z.value=d},Xe)}const G=t.ref(!0),K=t.ref(!1),X=t.ref("");let F=0;function be(e){return e instanceof Error&&e.name==="AbortError"}function Be(){const e=new Error("aborted");return e.name="AbortError",e}function tt(e){return new Promise(o=>setTimeout(o,e))}async function Se(e,o){let n=0;for(;;){if(o!==F)throw Be();try{return await s.getContent(e)}catch(a){if(o!==F)throw Be();if(n>=Rt)throw a;n+=1,await tt(n*At)}}}const V=t.ref([]),Me=t.ref([]),se=t.ref([]),T=t.ref(s.page),ie=t.ref([]);let j=null,W=null,le=0;function nt(e){let o=-1;for(const n of e){const a=n?.originalIndex;J(a)&&a>o&&(o=a)}le=o+1}function U(e){for(const o of e)!o||typeof o!="object"||o.id&&o.originalIndex==null&&(o.originalIndex=le,le+=1)}const q=new Map,$=[];function J(e){return typeof e=="number"&&Number.isFinite(e)}function ot(e,o){if(!o.length)return e;const n=new Set;for(const v of e){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 e;const r=a.slice().sort((v,y)=>{const w=J(v.originalIndex)?v.originalIndex:Number.POSITIVE_INFINITY,h=J(y.originalIndex)?y.originalIndex:Number.POSITIVE_INFINITY;return w-h}),d=e.slice();for(const v of r){const y=v.originalIndex;if(!J(y)){d.push(v);continue}let w=0,h=d.length;for(;w<h;){const C=w+h>>1,Z=d[C]?.originalIndex;(J(Z)?Z:Number.POSITIVE_INFINITY)<=y?w=C+1:h=C}d.splice(w,0,v)}return d}async function Ie(e){if(!e.length)return;re(e);const o=xe();f.value=ot(f.value,e),await t.nextTick(),ke(o)}async function Ee(e){const n=(Array.isArray(e)?e:[e]).map(fe).filter(Boolean);if(!n.length)return;const a=[];for(const r of n){const d=q.get(r);d&&a.push(d)}if(a.length){await Ie(a);for(const r of a)r?.id&&q.delete(r.id)}}async function Ne(){const e=$.pop();if(!e?.length)return;const o=[];for(const n of e){const a=q.get(n);a&&o.push(a)}if(o.length){await Ie(o);for(const n of o)n?.id&&q.delete(n.id)}}async function at(e){return Ee(e)}async function lt(){return Ne()}function Pe(e){const n=(Array.isArray(e)?e:[e]).map(fe).filter(Boolean);if(!n.length)return;const a=new Set(n);for(const r of a)q.delete(r);for(let r=$.length-1;r>=0;r-=1){const v=$[r].filter(y=>!a.has(y));v.length?$[r]=v:$.splice(r,1)}}const ce=t.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}}),Fe=bt({getContent:e=>Se(e,F),markEnterFromLeft:re,buffer:ie,stats:ce,isEnabled:()=>s.mode==="backfill",getPageSize:()=>s.pageSize,getRequestDelayMs:()=>s.backfillRequestDelayMs}),ue=t.computed(()=>s.items!==void 0);t.watch(()=>s.items,e=>{ue.value&&(se.value=Array.isArray(e)?e:[])},{immediate:!0});const f=t.computed({get(){return ue.value?se.value:Me.value},set(e){ue.value?(se.value=e,i("update:items",e)):Me.value=e}});async function Te(e){const o=await Se(e,F);return U(o.items),re(o.items),{items:o.items,nextPage:o.nextPage}}function fe(e){return e?typeof e=="string"?e:e?.id:null}async function Re(e){const n=(Array.isArray(e)?e:[e]).map(fe).filter(Boolean);if(!n.length)return;const a=new Set(n),r=[];for(const w of a){const h=ne.value.get(w);if(h==null)continue;const C=f.value[h];C&&(q.set(w,C),r.push(w))}r.length&&$.push(r);const d=xe(),v=Q.value,y=[];for(const w of a){const h=ne.value.get(w);if(h==null)continue;const C=f.value[h];if(!C)continue;const Z=P.value[h]??{x:0,y:0},De=D.value[h]??v;y.push({id:w,item:C,fromX:Z.x,fromY:Z.y,width:v,height:De,leaving:!0})}if(y.length&&(_.value=[..._.value,...y]),f.value=f.value.filter(w=>{const h=w?.id;return!h||!a.has(h)}),await t.nextTick(),ke(d,a),y.length){const w=new Set(y.map(h=>h.id));Y(()=>{_.value=_.value.map(h=>w.has(h.id)?{...h,leaving:!1}:h),setTimeout(()=>{_.value=_.value.filter(h=>!w.has(h.id))},We)})}}async function Ae(e){return Re(e)}b({remove:Re,restore:at,undo:lt,forget:Pe,pagesLoaded:V,nextPage:T,restoreRemoved:Ee,undoLastRemoval:Ne,forgetRemoved:Pe,backfillStats:ce});function Ce(){const e=Bt({items:f.value,columnCount:me.value,columnWidth:Q.value,gapX:N.value,gapY:I.value,headerHeight:x.value,footerHeight:B.value,bucketPx:Ye});P.value=e.positions,D.value=e.heights,he.value=e.buckets,ge.value=e.contentHeight,ne.value=e.indexById}const Ve=t.computed(()=>Math.max(ge.value,S.value)+Tt),de=t.computed(()=>St({itemCount:f.value.length,viewportHeight:S.value,scrollTop:M.value,overscanPx:s.overscanPx,bucketPx:Ye,buckets:he.value}));t.watch(de,e=>{if(!e?.length)return;const o=[];for(const n of e){const a=f.value[n]?.id;a&&L.value.has(a)&&(oe.has(a)||(oe.add(a),o.push(a)))}o.length&&(Y(()=>{const n=new Set(O.value);for(const a of o)n.add(a);O.value=n}),et(()=>{const n=new Set(L.value);for(const a of o)n.delete(a);L.value=n,setTimeout(()=>{const a=new Set(O.value);for(const r of o)a.delete(r),oe.delete(r);O.value=a},je)}))},{flush:"post"});async function rt(){if(j)return j;if(G.value||K.value||s.mode!=="backfill"&&T.value==null||s.mode==="backfill"&&T.value==null&&ie.value.length===0)return;const e=F;let o=null;return o=(async()=>{try{if(K.value=!0,X.value="",s.mode==="backfill"){const r=await Fe.loadBackfillBatch(T.value);if(e!==F)return;r.pages.length&&(V.value=[...V.value,...r.pages]),U(r.batchItems),f.value=[...f.value,...r.batchItems],T.value=r.nextPage;return}const n=T.value;if(n==null)return;const a=await Te(n);if(e!==F)return;V.value=[...V.value,n],U(a.items),f.value=[...f.value,...a.items],T.value=a.nextPage}catch(n){if(e!==F||be(n))return;X.value=n instanceof Error?n.message:String(n)}finally{e===F&&(K.value=!1),j===o&&(j=null)}})(),j=o,o}function st(){const e=g.value;if(!e)return;M.value=e.scrollTop,S.value=e.clientHeight,e.scrollHeight-(e.scrollTop+e.clientHeight)<=s.prefetchThresholdPx&&rt()}function ze(){return g.value}function _e(e){k.value=R(e),S.value=e.clientHeight}function it(){typeof ResizeObserver>"u"||(E=new ResizeObserver(()=>{const e=ze();e&&_e(e)}))}function ct(){return{enabled:s.mode==="backfill",isBackfillActive:!1,isRequestInFlight:!1,requestPage:null,progress:{collected:0,target:0},cooldownMsRemaining:0,cooldownMsTotal:ve(s.backfillRequestDelayMs),pageSize:Ge(s.pageSize),bufferSize:0,lastBatch:null,totals:{pagesFetched:0,itemsFetchedFromNetwork:0}}}function He(){F+=1,j=null,W=null,le=0,q.clear(),$.length=0,L.value=new Set,O.value=new Set,oe.clear(),ae.value=new Map,z.value=new Set,_.value=[],V.value=[],T.value=null,ie.value=[],ce.value=ct(),G.value=!0,K.value=!1,X.value=""}function Le(e){He(),f.value=[],T.value=e}function ut(e){const o=Array.isArray(e)?e:[e],n=[],a=new Set;for(const r of o){if(r==null)continue;const d=typeof r=="string"?`s:${r}`:`n:${String(r)}`;a.has(d)||(a.add(d),n.push(r))}return n}function ft(e){const o=[];for(const n of e){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 qe(e){He();const o=ut(e);V.value=o,T.value=ft(o),G.value=!1,nt(f.value),U(f.value)}async function $e(e){if(W)return W;const o=F;let n=null;return n=(async()=>{try{if(s.mode==="backfill"){const a=await Fe.loadBackfillBatch(e);if(o!==F)return;V.value=a.pages.length?a.pages:[e],U(a.batchItems),f.value=a.batchItems,T.value=a.nextPage}else{const a=await Te(e);if(o!==F)return;V.value=[e],U(a.items),f.value=a.items,T.value=a.nextPage}}catch(a){if(o!==F||be(a))return;X.value=a instanceof Error?a.message:String(a)}finally{o===F&&(G.value=!1),W===n&&(W=null)}})(),W=n,n}function dt(){const e=ze();e&&(_e(e),M.value=e.scrollTop,E?.observe(e))}t.onMounted(async()=>{if(it(),dt(),s.restoredPagesLoaded!=null){qe(s.restoredPagesLoaded);return}Le(s.page),await $e(s.page)}),t.onUnmounted(()=>{E?.disconnect()}),t.watch(()=>s.page,async e=>{s.restoredPagesLoaded==null&&(Le(e),await $e(e))}),t.watch(()=>s.restoredPagesLoaded,e=>{e&&qe(e)}),t.watch(N,()=>{const e=g.value;e&&(k.value=R(e))},{immediate:!1});const me=t.computed(()=>wt(k.value,s.itemWidth)),Q=t.computed(()=>xt(k.value,me.value,s.itemWidth,N.value));t.watch([me,Q,N,I,x,B],()=>{Ce()},{immediate:!0}),t.watch(()=>[f.value,f.value.length],()=>Ce(),{immediate:!0});const mt=t.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(e,o)=>(t.openBlock(),t.createElementBlock("section",t.mergeProps(c.value,{class:mt.value}),[t.createElementVNode("div",{ref_key:"scrollViewportRef",ref:g,"data-testid":"items-scroll-container",class:"mt-4 min-h-0 flex-1 overflow-auto",style:t.normalizeStyle({paddingRight:N.value+"px"}),onScroll:st},[G.value?(t.openBlock(),t.createElementBlock("div",Mt,o[0]||(o[0]=[t.createElementVNode("div",{class:"inline-flex items-center gap-3 text-sm text-slate-600"},[t.createElementVNode("svg",{class:"h-5 w-5 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[t.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),t.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})]),t.createElementVNode("span",null,"Loading…")],-1)]))):X.value?(t.openBlock(),t.createElementBlock("p",It,"Error: "+t.toDisplayString(X.value),1)):(t.openBlock(),t.createElementBlock("div",{key:2,class:"relative",style:t.normalizeStyle({height:Ve.value+"px"})},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(de.value,n=>(t.openBlock(),t.createElementBlock("article",{key:f.value[n].id,"data-testid":"item-card",class:"absolute overflow-hidden rounded-xl border border-slate-200/60 bg-white shadow-sm",style:t.normalizeStyle({width:Q.value+"px",transition:Qe(f.value[n].id),transform:Ze(n)})},[A.value||x.value>0?(t.openBlock(),t.createElementBlock("div",{key:0,"data-testid":"item-header-container",class:"w-full",style:t.normalizeStyle(ee.value)},[t.renderSlot(e.$slots,"itemHeader",{item:f.value[n],remove:()=>Ae(f.value[n])})],4)):t.createCommentVNode("",!0),t.createVNode(Oe,{item:f.value[n]},null,8,["item"]),H.value||B.value>0?(t.openBlock(),t.createElementBlock("div",{key:1,"data-testid":"item-footer-container",class:"w-full",style:t.normalizeStyle(te.value)},[t.renderSlot(e.$slots,"itemFooter",{item:f.value[n],remove:()=>Ae(f.value[n])})],4)):t.createCommentVNode("",!0)],4))),128)),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(_.value,n=>(t.openBlock(),t.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:t.normalizeStyle({width:n.width+"px",transition:"transform "+We+"ms ease-out",transform:n.leaving?"translate3d("+n.fromX+"px,"+n.fromY+"px,0)":"translate3d("+n.fromX+"px,"+pe(n.height)+"px,0)"})},[A.value||x.value>0?(t.openBlock(),t.createElementBlock("div",{key:0,"data-testid":"item-header-container",class:"w-full",style:t.normalizeStyle(ee.value)},[t.renderSlot(e.$slots,"itemHeader",{item:n.item,remove:()=>{}})],4)):t.createCommentVNode("",!0),t.createVNode(Oe,{item:n.item},null,8,["item"]),H.value||B.value>0?(t.openBlock(),t.createElementBlock("div",{key:1,"data-testid":"item-footer-container",class:"w-full",style:t.normalizeStyle(te.value)},[t.renderSlot(e.$slots,"itemFooter",{item:n.item,remove:()=>{}})],4)):t.createCommentVNode("",!0)],4))),128))],4)),t.createElementVNode("div",Et,[K.value?(t.openBlock(),t.createElementBlock("span",Nt,o[1]||(o[1]=[t.createElementVNode("svg",{class:"h-4 w-4 animate-spin text-slate-500",viewBox:"0 0 24 24","aria-hidden":"true"},[t.createElementVNode("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",fill:"none",stroke:"currentColor","stroke-width":"4"}),t.createElementVNode("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 0 1 8-8v4a4 4 0 0 0-4 4H4z"})],-1),t.createElementVNode("span",null,"Loading more…",-1)]))):T.value==null?(t.openBlock(),t.createElementBlock("span",Pt,"End of list")):(t.openBlock(),t.createElementBlock("span",Ft,"Scroll to load page "+t.toDisplayString(T.value),1))])],36)],16))}}),Ct={install(l){l.component("Masonry",Ke)}};exports.Masonry=Ke;exports.VibePlugin=Ct;exports.masonryDefaults=Ue;
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;