@wyxos/vibe 2.1.11 → 2.1.12

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