vlist 3.0.0-next.2 → 3.0.0-next.4
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.github.md +88 -39
- package/README.md +44 -27
- package/dist/config.d.ts +129 -12
- package/dist/config.js +1 -1
- package/dist/core/create.d.ts +22 -4
- package/dist/core/dom.d.ts +22 -2
- package/dist/core/fold.d.ts +52 -0
- package/dist/core/hooks.d.ts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/pipeline.d.ts +1 -1
- package/dist/core/pool.d.ts +9 -2
- package/dist/core/runway.d.ts +29 -3
- package/dist/core/scroll.d.ts +1 -1
- package/dist/core/sizes.d.ts +1 -1
- package/dist/core/state.d.ts +13 -1
- package/dist/core/types.d.ts +151 -61
- package/dist/core/velocity.d.ts +1 -1
- package/dist/index.d.ts +17 -2
- package/dist/index.js +1 -1
- package/dist/internals.d.ts +0 -1
- package/dist/internals.js +1 -1
- package/dist/plugins/a11y/index.d.ts +1 -0
- package/dist/plugins/a11y/plugin.d.ts +1 -1
- package/dist/plugins/autosize/index.d.ts +2 -1
- package/dist/plugins/autosize/plugin.d.ts +13 -2
- package/dist/plugins/carousel/engine.d.ts +1 -1
- package/dist/plugins/carousel/index.d.ts +1 -0
- package/dist/plugins/carousel/plugin.d.ts +42 -6
- package/dist/plugins/carousel/presets.d.ts +1 -1
- package/dist/plugins/data/index.d.ts +1 -0
- package/dist/plugins/data/plugin.d.ts +15 -2
- package/dist/plugins/grid/index.d.ts +2 -1
- package/dist/plugins/grid/plugin.d.ts +14 -2
- package/dist/plugins/groups/async-bridge.d.ts +6 -6
- package/dist/plugins/groups/index.d.ts +1 -0
- package/dist/plugins/groups/layout.d.ts +2 -2
- package/dist/plugins/groups/plugin.d.ts +12 -4
- package/dist/plugins/groups/sticky.d.ts +2 -1
- package/dist/plugins/groups/types.d.ts +8 -3
- package/dist/plugins/masonry/index.d.ts +2 -1
- package/dist/plugins/masonry/plugin.d.ts +10 -2
- package/dist/plugins/masonry/renderer.d.ts +5 -1
- package/dist/plugins/page/plugin.d.ts +1 -1
- package/dist/plugins/scrollbar/index.d.ts +2 -1
- package/dist/plugins/scrollbar/plugin.d.ts +7 -2
- package/dist/plugins/search/index.d.ts +1 -0
- package/dist/plugins/search/plugin.d.ts +29 -1
- package/dist/plugins/selection/index.d.ts +2 -1
- package/dist/plugins/selection/plugin.d.ts +23 -2
- package/dist/plugins/snapshots/index.d.ts +1 -0
- package/dist/plugins/snapshots/plugin.d.ts +9 -2
- package/dist/plugins/sortable/index.d.ts +1 -0
- package/dist/plugins/sortable/plugin.d.ts +14 -3
- package/dist/plugins/table/index.d.ts +1 -0
- package/dist/plugins/table/plugin.d.ts +19 -3
- package/dist/plugins/transition/plugin.d.ts +1 -1
- package/dist/plugins/tree/index.d.ts +1 -0
- package/dist/plugins/tree/layout.d.ts +3 -1
- package/dist/plugins/tree/plugin.d.ts +37 -3
- package/dist/plugins/tree/types.d.ts +1 -1
- package/dist/rendering/sizes.d.ts +19 -1
- package/dist/size.json +1 -1
- package/dist/synthetic.d.ts +2 -2
- package/dist/synthetic.js +1 -1
- package/dist/types.d.ts +14 -21
- package/dist/utils/apply-scroll-behavior.d.ts +15 -0
- package/dist/utils/scroll-padding.d.ts +36 -0
- package/dist/utils/stats.d.ts +9 -1
- package/dist/vlist-tree.css +1 -1
- package/dist/vlist.css +1 -1
- package/package.json +6 -2
- package/dist/plugins/grid/renderer.d.ts +0 -68
package/dist/synthetic.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Ie=3,ct="vlist";var ce=150;var Te=(e)=>e<0.5?2*e*e:1-(-2*e+2)**2/2,dt=300;var Le="__placeholder_";function mt(e){let{state:t,viewport:o,isX:l,onFrame:i,onIdle:u}=e,r=e.idleTimeout||ce,d=null,S=null;function E(L=l?o.scrollLeft:o.scrollTop){t.prevScrollPosition=t.scrollPosition,t.scrollPosition=L,t.scrollDirection=L>t.prevScrollPosition?1:L<t.prevScrollPosition?-1:0,i(),R()}function R(){if(d!==null)clearTimeout(d);d=setTimeout(()=>{d=null,t.scrollDirection=0,u()},r)}function I(){if(S!==null)cancelAnimationFrame(S),S=null}function v(L,H,O,p=Te,F){I();let h=t.scrollPosition,A=typeof L==="function"?L:()=>L,C=A();if(Math.abs(C-h)<1){if(O)O(C);else if(l)o.scrollLeft=C;else o.scrollTop=C;F?.();return}let a=performance.now();function b(M){C=A();let T=M-a,P=Math.min(T/H,1),m=h+(C-h)*p(P);if(O)O(m);else if(l)o.scrollLeft=m;else o.scrollTop=m;if(!O)E(m);if(P<1)S=requestAnimationFrame(b);else S=null,F?.()}S=requestAnimationFrame(b)}return{attach(){},detach(){if(I(),d!==null)clearTimeout(d),d=null},cancelScroll:I,smoothScrollTo:v,commitScroll:E}}var Ce={top:0,right:0,bottom:0,left:0},ft=(e)=>{if(e==null)return Ce;if(typeof e==="number")return e===0?Ce:{top:e,right:e,bottom:e,left:e};if(e.length===2){let[u,r]=e;return u===0&&r===0?Ce:{top:u,right:r,bottom:u,left:r}}let[t,o,l,i]=e;return t===0&&o===0&&l===0&&i===0?Ce:{top:t,right:o,bottom:l,left:i}},pt=(e,t)=>t?e.left+e.right:e.top+e.bottom,bt=(e,t)=>t?e.top+e.bottom:e.left+e.right;function vt(e){let t={visibleIndices:new Int32Array(e),visibleOffsets:new Float64Array(e),visibleSizes:new Float64Array(e),visibleCount:0,startIndex:0,totalSize:0,capacity:e,scrollPosition:0,prevScrollPosition:0,scrollDirection:0,baseOffset:0,prevBaseOffset:0,containerSize:0,crossSize:0,totalItems:0,prevRangeStart:0,prevRangeEnd:-1,renderPending:!1,initialized:!1,destroyed:!1,prevAriaTotal:-1,resizeCapacity(o,l,i=Ie){if(l<=0||o<=0)return;let u=Math.ceil(o/l)+i*2;if(u<=t.capacity)return;let r=u+8,d=new Int32Array(r),S=new Float64Array(r),E=new Float64Array(r);d.set(t.visibleIndices),S.set(t.visibleOffsets),E.set(t.visibleSizes),t.visibleIndices=d,t.visibleOffsets=S,t.visibleSizes=E,t.capacity=r},clear(){t.visibleCount=0,t.startIndex=0}};return t}var Dt=(e,t)=>{let o=t;return{getOffset:(l)=>l*e,getSize:(l)=>e,indexAtOffset:(l)=>{if(o===0||e===0)return 0;return Math.max(0,Math.min(Math.floor(l/e),o-1))},getTotalSize:()=>o*e,getTotal:()=>o,rebuild:(l)=>{o=l},isVariable:()=>!1}},Ft=(e,t)=>{let o=t,l=new Float64Array(0),i=(r)=>{o=r,l=new Float64Array(r+1),l[0]=0;for(let d=0;d<r;d++)l[d+1]=l[d]+e(d)};i(t);let u=(r)=>{if(o===0)return 0;if(r<=0)return 0;if(r>=l[o])return o-1;let d=0,S=o-1;while(d<S){let E=d+S+1>>>1;if(l[E]<=r)d=E;else S=E-1}return d};return{getOffset:(r)=>{if(r<=0)return 0;if(r>=o)return l[o];return l[r]},getSize:(r)=>e(r),indexAtOffset:(r)=>u(r),getTotalSize:()=>l[o]??0,getTotal:()=>o,rebuild:(r)=>i(r),isVariable:()=>!0}},Pe=(e,t)=>{if(typeof e==="number")return Dt(e,t);return Ft(e,t)};function gt(e){let t=[],o=`${e}-item`,l=document.createElement("div");return l.className=o,{acquire(){if(t.length>0)return t.pop();return l.cloneNode(!1)},release(i){if(i.className=o,i.removeAttribute("style"),i.removeAttribute("id"),i.removeAttribute("role"),i.removeAttribute("aria-selected"),i.removeAttribute("aria-posinset"),i.removeAttribute("aria-setsize"),i.removeAttribute("data-index"),i.removeAttribute("data-id"),i.textContent="",t.length<100)t.push(i)},get size(){return t.length},clear(){t.length=0}}}function Ne(e){let t=e.querySelectorAll("a[href],button,input,select,textarea,[tabindex]");for(let o=0;o<t.length;o++)t[o].setAttribute("tabindex","-1")}function Be(e){if(typeof e==="string"){let t=document.querySelector(e);if(!t)throw Error(`[vlist] Container not found: ${e}`);return t}return e}function ht(e,t,o,l){let i=o?`${t} ${t}--horizontal`:t,u=o?"overflow-x:auto;overflow-y:hidden;height:100%;width:100%":"overflow:auto;height:100%;width:100%",r=o?"position:relative;height:100%;overflow-anchor:none":"position:relative;width:100%;overflow-anchor:none",d=' role="list"';if(l)d+=` aria-label="${l.replace(/"/g,""")}"`;if(o)d+=' aria-orientation="horizontal"';e.insertAdjacentHTML("beforeend",`<div class="${i}"><div class="${t}-viewport" style="${u}" tabindex="-1"><div class="${t}-content" style="${r}"${d}></div></div></div>`);let S=e.lastElementChild,E=S.firstElementChild,R=E.firstElementChild,I=document.createElement("div");return I.className=`${t}-live`,I.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",I.setAttribute("aria-live","polite"),I.setAttribute("aria-atomic","true"),I.setAttribute("role","status"),S.appendChild(I),{root:S,viewport:E,content:R,liveRegion:I}}function Nt(e,t){if(e.getTotal()<=0)return{index:0,offsetPx:0};let l=t<=0?0:t,i=e.indexAtOffset(l),u=l-e.getOffset(i);return{index:i,offsetPx:u>0?u:0}}function Bt(e,t){let o=$t(e,t);return e.getOffset(o.index)+o.offsetPx}function $t(e,t){let o=e.getTotal();if(o<=0)return{index:0,offsetPx:0};let{index:l,offsetPx:i}=t;if(l<0)return{index:0,offsetPx:0};if(l>o-1)l=o-1;while(i>0&&l<o-1){let u=e.getSize(l);if(i<u)break;i-=u,l++}while(i<0&&l>0)l--,i+=e.getSize(l);if(i<0)i=0;return{index:l,offsetPx:i}}function St(e){let{sizeCache:t,getPixel:o,setPixel:l,getContainerSize:i}=e;function u(){let d=t.getTotalSize()+e.padding-i();return d>0?d:0}function r(d){if(d<=0)return 0;let S=u();return d>S?S:d}return{getLogical(){return Nt(t,o())},setLogical(d){l(r(Bt(t,d)))},getPixelEquivalent(){return o()},setPixelEquivalent(d){l(r(d))},getMaxPixelEquivalent:u,getRenderOrigin:e.getRenderOrigin,scrollByPx(d){l(r(o()+d))}}}var Se=[],Kt={calculate:Se,commit:Se,afterScroll:Se,idle:Se,resize:Se};function xt(e){if(e.length===0)return Kt;let t=[],o=[],l=[],i=[],u=[];for(let r=0;r<e.length;r++){let d=e[r].hooks;if(d===void 0)continue;if(d.onCalculate!==void 0)t.push(d.onCalculate);if(d.onCommit!==void 0)o.push(d.onCommit);if(d.onAfterScroll!==void 0)l.push(d.onAfterScroll);if(d.onIdle!==void 0)i.push(d.onIdle);if(d.onResize!==void 0)u.push(d.onResize)}return{calculate:t,commit:o,afterScroll:l,idle:i,resize:u}}function yt(e,t){for(let o=0;o<e.length;o++)e[o](t)}function Et(e,t){for(let o=0;o<e.length;o++)e[o](t)}function $e(e,t,o){for(let l=0;l<e.length;l++)e[l](t,o)}function It(e){for(let t=0;t<e.length;t++)e[t]()}function Tt(e,t,o){for(let l=0;l<e.length;l++)e[l](t,o)}function Lt(e,t,o,l,i,u,r,d){let S=l!==0||i!==0;return{prefix:e,selectedClass:`${e}-item--selected`,focusedClass:`${e}-item--focused`,placeholderClass:`${e}-item--placeholder`,replacedClass:`${e}-item--replaced`,translateProp:t?"translateX(":"translateY(",sizeProp:t?"width":"height",itemRole:"listitem",interactive:!1,startPadding:o,gap:r,hasCrossPad:S,crossStartProp:S?t?"top":"left":"",crossEndProp:S?t?"bottom":"right":"",crossStartVal:S?l+"px":"",crossEndVal:S?i+"px":"",oddClass:u,emitter:d??null,indexMap:null,ariaTotalFn:null}}function Ut(e,t,o,l,i){if(e.containerSize<=0||e.totalItems===0)return e.clear(),!0;let{scrollPosition:u,containerSize:r,totalItems:d}=e,S=i??0;e.totalSize=t.getTotalSize();let E=t.indexAtOffset(S>0?Math.max(0,u-S):u),R=t.indexAtOffset(u+r);if(R<d-1)R++;E=Math.max(0,E),R=Math.min(d-1,Math.max(0,R));let I=Math.max(0,E-o),v=Math.min(d-1,R+o),L=Math.ceil(r/1)+o*2+10,H=v-I+1,O=Math.min(H,e.capacity,L);if(I===e.prevRangeStart&&v===e.prevRangeEnd&&!e.renderPending&&e.baseOffset===e.prevBaseOffset)return!1;e.visibleCount=O,e.startIndex=I;for(let p=0;p<O;p++){let F=I+p;e.visibleIndices[p]=F,e.visibleOffsets[p]=t.getOffset(F),e.visibleSizes[p]=t.getSize(F)}return yt(l.calculate,e),e.prevRangeStart=I,e.prevRangeEnd=v,e.prevBaseOffset=e.baseOffset,e.renderPending=!1,!0}var G={selected:!1,focused:!1};function Gt(e,t,o){for(let l=0;l<t;l++)if(e[l]===o)return!0;return!1}function Wt(e,t){if(t<=1)return!0;let o=e[0];for(let l=1;l<t;l++){let i=e[l];if(i!==o+1)return!1;o=i}return!0}function qt(e,t,o,l,i,u,r,d,S,E){let R=S?null:i(),{visibleCount:I,visibleIndices:v}=e,L=r.ariaTotalFn?r.ariaTotalFn():e.totalItems,H=r.interactive?String(L):"",O=r.interactive&&L!==e.prevAriaTotal,p=null,F=r.indexMap;for(let h=0;h<I;h++){let A=v[h],C=F?F(A):A,a=e.visibleOffsets[h],b=e.visibleSizes[h],M=S?S(A):R[A];if(E)E(C,G);else G.selected=!1,G.focused=!1;let T=u.get(A),P=T;if(T===void 0){let m=t.acquire();if(M!==void 0){let g;try{g=l(M,C,G)}catch(w){if(r.emitter)r.emitter.emit("error",{error:w instanceof Error?w:Error(String(w)),context:`template:render:${C}`});t.release(m);continue}if(typeof g==="string")m.innerHTML=g;else m.textContent="",m.appendChild(g);Ne(m)}if(m.setAttribute("role",r.itemRole),m.setAttribute("data-index",String(C)),r.interactive)m.id=r.prefix+"-item-"+A,m.setAttribute("aria-posinset",String(C+1)),m.setAttribute("aria-setsize",H);if(M!==void 0){let g=String(M.id);if(m.setAttribute("data-id",g),g.startsWith(Le))m.classList.add(r.placeholderClass)}if(r.hasCrossPad)m.style.setProperty(r.crossStartProp,r.crossStartVal),m.style.setProperty(r.crossEndProp,r.crossEndVal);if(E){if(m.classList.toggle(r.selectedClass,G.selected),m.classList.toggle(r.focusedClass,G.focused),G.selected)m.setAttribute("aria-selected","true");else m.removeAttribute("aria-selected");m._lastSelected=G.selected,m._lastFocused=G.focused}if(r.oddClass)m.classList.toggle(r.oddClass,(A&1)===1);let W=a-e.baseOffset+r.startPadding;m.style.transform=r.translateProp+W+"px)",m._lastOffset=W;let x=b-r.gap;if(m.style[r.sizeProp]=x+"px",m._lastSize=x,m._lastItem=M,u.set(A,m),p===null)p=document.createDocumentFragment();p.appendChild(m)}else{if(O)T.setAttribute("aria-setsize",H);if(M!==void 0&&P._lastItem!==M){let x=T.getAttribute("data-id"),g=String(M.id),w;try{w=l(M,C,G)}catch(B){if(r.emitter)r.emitter.emit("error",{error:B instanceof Error?B:Error(String(B)),context:`template:render:${C}`});continue}if(typeof w==="string")T.innerHTML=w;else T.textContent="",T.appendChild(w);if(Ne(T),T.setAttribute("data-id",g),P._lastItem=M,x!==g){let B=x!==null&&x.startsWith(Le),y=g.startsWith(Le);if(B!==y)T.classList.toggle(r.placeholderClass,y);if(B&&!y)T.classList.add(r.replacedClass),setTimeout(()=>{T.classList.remove(r.replacedClass)},300)}}if(E){if(P._lastSelected!==G.selected){if(T.classList.toggle(r.selectedClass,G.selected),G.selected)T.setAttribute("aria-selected","true");else T.removeAttribute("aria-selected");P._lastSelected=G.selected}if(P._lastFocused!==G.focused)T.classList.toggle(r.focusedClass,G.focused),P._lastFocused=G.focused}let m=a-e.baseOffset+r.startPadding;if(P._lastOffset!==m)T.style.transform=r.translateProp+m+"px)",P._lastOffset=m;let W=b-r.gap;if(P._lastSize!==W)T.style[r.sizeProp]=W+"px",P._lastSize=W}}if(p!==null)o.appendChild(p);if(I>0&&Wt(v,I)){let h=v[0],A=v[I-1];for(let[C,a]of u)if(C<h||C>A)a.remove(),t.release(a),u.delete(C)}else for(let[h,A]of u)if(!Gt(v,I,h))A.remove(),t.release(A),u.delete(h);if(r.interactive)e.prevAriaTotal=e.totalItems;Et(d.commit,e)}function Ke(e,t,o,l,i,u,r,d,S,E,R,I){if(Ut(e,t,o,E,S.startPadding))qt(e,l,i,u,r,d,S,E,R,I)}var Ue=()=>{let e={},t=(u,r)=>{if(!e[u])e[u]=new Set;return e[u].add(r),()=>o(u,r)},o=(u,r)=>{e[u]?.delete(r)};return{on:t,off:o,emit:(u,r)=>{e[u]?.forEach((d)=>{try{d(r)}catch(S){console.error(`[vlist] Error in event handler for "${String(u)}":`,S)}})},clear:(u)=>{if(u)delete e[u];else for(let r in e)delete e[r]}}};var Ct=2,Pt=(e=0)=>({velocity:0,sampleCount:0}),At=(e,t)=>{let o=performance.now(),l=e._lt??o,i=e._lp??t,u=o-l;if(e._lp=t,e._lt=o,u===0)return e.sampleCount=Math.min(e.sampleCount+1,5),e;if(u>100)return e.velocity=0,e.sampleCount=1,e;return e.velocity=Math.abs(t-i)/u,e.sampleCount=Math.min(e.sampleCount+1,5),e};function Xt(e){let{item:t}=e;if(t.height!==void 0&&typeof t.height==="number"){if(!Number.isFinite(t.height)||t.height<=0)throw Error(`vlist: item.height must be a positive number, got ${t.height}`)}if(t.width!==void 0&&typeof t.width==="number"){if(!Number.isFinite(t.width)||t.width<=0)throw Error(`vlist: item.width must be a positive number, got ${t.width}`)}if(t.estimatedHeight!==void 0){if(!Number.isFinite(t.estimatedHeight)||t.estimatedHeight<=0)throw Error(`vlist: item.estimatedHeight must be a positive number, got ${t.estimatedHeight}`)}if(t.estimatedWidth!==void 0){if(!Number.isFinite(t.estimatedWidth)||t.estimatedWidth<=0)throw Error(`vlist: item.estimatedWidth must be a positive number, got ${t.estimatedWidth}`)}if(t.gap!==void 0){if(typeof t.gap!=="number"||!Number.isFinite(t.gap)||t.gap<0)throw Error(`vlist: item.gap must be a non-negative number, got ${t.gap}`)}if(e.overscan!==void 0){if(typeof e.overscan!=="number"||!Number.isFinite(e.overscan)||e.overscan<0)throw Error(`vlist: overscan must be a non-negative number, got ${e.overscan}`)}let o=e.scroll;if(o?.mode!==void 0||o?.runway!==void 0)throw Error('vlist 3.0: scroll.mode and scroll.runway were removed; bounded mode is gone. Use "vlist/synthetic" for huge lists or "vlist" for native scrolling.')}function Yt(e,t){let o=e==="horizontal"?"x":"y";if(t.some((i)=>i.name==="grid"))return{primary:o,cross:o==="x"?"y":"x"};return{primary:o}}function Zt(e,t){let o=Yt(e.orientation,t),l=o.primary==="x",i=ft(e.padding);return{axis:o,hasCrossAxis:o.cross!==void 0,overscan:e.overscan??Ie,reverse:e.reverse??!1,classPrefix:e.classPrefix??ct,mainAxisPadding:pt(i,l),crossAxisPadding:bt(i,l),startPadding:l?i.left:i.top,endPadding:l?i.right:i.bottom,crossPadStart:l?i.top:i.left,crossPadEnd:l?i.bottom:i.right,striped:e.item.striped||!1,gap:e.item.gap??0}}function jt(e,t){if(t)return e.item.width??e.item.estimatedWidth??100;return e.item.height??e.item.estimatedHeight??40}function Jt(e){let t=[...e];return t.sort((o,l)=>(o.priority??50)-(l.priority??50)),t}function Qt(e){let t=new Set;for(let o of e){if(t.has(o.name))throw Error(`[vlist] Duplicate plugin: ${o.name}`);t.add(o.name)}for(let o of e)if(o.conflicts){for(let l of o.conflicts)if(t.has(l))throw Error(`[vlist] Plugin "${o.name}" conflicts with "${l}"`)}}function zt(e,t=[],o,l){if(Xt(e),o){if(typeof e.scroll?.scrollbar==="string")throw Error('vlist 3.0: scroll.scrollbar strings require "vlist"; use the scrollbar() plugin with "vlist/synthetic".');if(e.orientation==="horizontal"&&getComputedStyle(Be(e.container)).direction==="rtl")throw Error('vlist: RTL horizontal lists require createVList from "vlist"');for(let c of t)if(c.name==="carousel"||c.name==="sortable")throw Error(`vlist: ${c.name} requires createVList from "vlist"`)}let i=Zt(e,t),u=i.axis.primary==="x",r=jt(e,u),d=i.gap,S=d>0?typeof r==="function"?(c)=>r(c)+d:r+d:r,E=typeof r==="number"?r:20,R=e.items?.length??0,I=i.striped?`${i.classPrefix}-item--odd`:"",v=Ue(),L=Lt(i.classPrefix,u,i.startPadding,i.crossPadStart,i.crossPadEnd,I,d,v),H=t.length>0?Jt(t):t;if(t.length>0)Qt(H);let O=Be(e.container),p=ht(O,i.classPrefix,u,e.ariaLabel);if(e.scroll?.scrollbar==="none")p.viewport.classList.add(`${i.classPrefix}-viewport--no-scrollbar`);if(e.scroll?.gutter==="stable")p.viewport.classList.add(`${i.classPrefix}-viewport--gutter-stable`);let h=Pe(S,R);if(d>0){let c=h.getTotalSize;h.getTotalSize=()=>{let n=c();return n>0?n-d:0}}let A=gt(i.classPrefix),C=Math.ceil(4096/E)+i.overscan*2+8,a=vt(C);a.totalItems=R;let b=e.items??[],M=()=>b,T=new Map,P=Pt(),m={velocity:0,reliable:!1},W={range:{start:0,end:-1}},x={scrollPosition:0,direction:"down"},g={scrollPosition:0},w=-1,B=-1,y=-1,k=null,N=xt(H),K=new Map,X=[],re=[],ie=[],Y=null,Q=null,de,se,ee=null,me=null,s=null,z=null,U=null,V=null,Z=null,fe=null,ae=!1,We=!1,pe=null,qe=0,Xe=0,Ye=null,Ze=null,je=null,ze=null,Me=null,we=null,xe=null,j=null,be=null,Je=null;a.containerSize=u?p.viewport.clientWidth:p.viewport.clientHeight,a.crossSize=u?p.viewport.clientHeight:p.viewport.clientWidth;function _e(c){if(Q)Q(c);else{if(u)p.viewport.scrollLeft=c;else p.viewport.scrollTop=c;se?.()}}let Qe=St({sizeCache:h,getPixel:()=>a.scrollPosition,setPixel:_e,getRenderOrigin:()=>a.baseOffset,getContainerSize:()=>a.containerSize,padding:i.mainAxisPadding});if(t.length>0){let c={dom:p,sizeCache:h,scroll:Qe,pool:A,config:i,emitter:v,template:e.item.template,registerMethod(n,f){K.set(n,f)},getMethod(n){return K.get(n)},registerClickHandler(n){X.push(n)},registerKeydownHandler(n){re.push(n)},registerDestroyHandler(n){ie.push(n)},enableListboxRole(){let n=p.content.getAttribute("role");if(!n||n==="list")p.content.setAttribute("role","listbox"),p.content.setAttribute("tabindex","0");L.itemRole="option",L.interactive=!0},setSizeConfig(n){let f=Pe(n,a.totalItems),_=K.get("_setSizeCacheBase");if(_){let D=h.rebuild;Object.assign(h,f),h.rebuild=D,_(f.rebuild)}else Object.assign(h,f)},setScrollSource(n){Q=n.write,de=n.onContentSize,ae=!0},commitScroll(n){se(n)},setBoundedWrap(n,f){be=n,Je=f},cancelScroll(){le?.cancelScroll()},setVirtualTotalFn(n){Y=n,L.ariaTotalFn=n},setIndexMapFn(n){L.indexMap=n},getItems:M,getItem(n){return s?s(n):b[n]},getState(){return a},rebuildSizeCache(){h.rebuild(a.totalItems)},updateContentSize:tt,setRenderFn(n,f){ee=n,me=f},renderIfNeeded(){ve()},forceRender(){ne()},setGetItemFn(n){s=n},setItemStateFn(n){z=n},getItemStateFn(){return z},get rawSizeSpec(){return r},scrollTo:_e,shiftScroll(n){if(j?.shiftBy)j.shiftBy(n);else c.scrollTo(a.scrollPosition+n)},smoothScrollTo(n,f,_,D){if(ze)ze(n,f,Q??void 0,_,D);else c.scrollTo(typeof n==="function"?n():n)},disableDefaultResize(){We=!0},setScrollTarget(n){pe=n},setScrollToPosFn(n){Me=n},setScrollToIndexFn(n){we=n},onScrollFrame:Oe,onScrollIdle:ye,removeItemById(n){if(U)return U(n);let f=b.findIndex((_)=>_.id===n);if(f===-1)return-1;return b.splice(f,1),a.totalItems=b.length,h.rebuild(a.totalItems),te(),f},insertItemAt(n,f){if(V){V(n,f);return}b.splice(f,0,n),a.totalItems=b.length,h.rebuild(a.totalItems),te()},setRemoveItemFn(n){U=n},setInsertItemFn(n){V=n},setUpdateItemFn(n){Z=n},setGetIndexByIdFn(n){fe=n},getRenderedElement(n){let f=K.get("_getRenderedElement");if(f)return f(n);return T.get(n)??null},setNavConfig(n){if(n.ud!==void 0)qe=n.ud;if(n.lr!==void 0)Xe=n.lr;if(n.scrollIndex)Ye=n.scrollIndex;if(n.navigate)Ze=n.navigate;if(n.total)je=n.total},getNavConfig:(()=>{let n={ud:0,lr:0,scrollIndex:null,navigate:null,total:null};return()=>(n.ud=qe,n.lr=Xe,n.scrollIndex=Ye,n.navigate=Ze,n.total=je,n)})()};for(let n of H)if(n.setup)try{n.setup(c)}catch(f){v.emit("error",{error:f instanceof Error?f:Error(String(f)),context:`plugin:setup:${n.name}`})}}let He=i.classPrefix+"--scrolling",ue=!1,Re=e.scroll?.idleTimeout??ce;function et(){if(x.scrollPosition=a.scrollPosition,u)x.direction=a.scrollDirection>0?"right":"left";else x.direction=a.scrollDirection>0?"down":"up";if(v.emit("scroll",x),At(P,a.scrollPosition),m.velocity=P.velocity,m.reliable=P.sampleCount>=Ct,v.emit("velocity:change",m),a.startIndex!==w||a.prevRangeEnd!==B)w=a.startIndex,B=a.prevRangeEnd,W.range.start=a.startIndex,W.range.end=a.prevRangeEnd,v.emit("range:change",W)}function tt(c,n=!0){if(j){if(n)j.refresh(c);return}a.totalSize=c;let f=c+i.mainAxisPadding;if(de?.(f),n)p.content.style[u?"width":"height"]=f+"px"}function te(){let c=ee?a.totalSize:h.getTotalSize();if(tt(c,!ee),j||ee)return;l?.onContentSize(c,v)}function nt(){if(!xe)return;if((Y?Y():b.length)===0)return;let n=xe;xe=null,De.scrollToIndex(n.index,n.alignOrOptions)}function ve(){if(nt(),ee)ee();else Ke(a,h,i.overscan,A,p.content,e.item.template,M,T,L,N,s,z)}function Oe(){if(!ue)ue=!0,p.root.classList.add(He);if(ve(),$e(N.afterScroll,a.scrollPosition,a.scrollDirection),a.scrollPosition!==y)y=a.scrollPosition,et()}function ye(){if(ue)ue=!1,p.root.classList.remove(He);a.scrollDirection=0,It(N.idle),m.velocity=0,m.reliable=!1,v.emit("velocity:change",m),g.scrollPosition=a.scrollPosition,v.emit("scroll:idle",g)}function ne(){if(nt(),a.renderPending=!0,me)me();else Ke(a,h,i.overscan,A,p.content,e.item.template,M,T,L,N,s,z);if($e(N.afterScroll,a.scrollPosition,a.scrollDirection),a.scrollPosition!==y){if(y=a.scrollPosition,et(),k!==null)clearTimeout(k);k=setTimeout(ye,Re)}}let ot=ae?!1:e.scroll?.wheel!==!1,le;if(ae&&be)throw Error("vlist: page() is not compatible with the carousel plugin — bounded page-mode scrolling is not implemented yet.");if(!ae&&(o||be))j=(o??Je)({state:a,sizeCache:h,viewport:p.viewport,content:p.content,isX:u,wheelEnabled:ot,idleTimeout:Re,...pe?{scrollTarget:pe}:{},mainAxisPadding:i.mainAxisPadding,...be?{wrap:be}:{},onFrame:Oe,onIdle:ye}),le=j,Q=(c)=>j.setLogical(c);else{let c=(ae?mt:l.native)({state:a,viewport:p.viewport,isX:u,wheelEnabled:ot,idleTimeout:Re,...pe?{scrollTarget:pe}:{},onFrame:Oe,onIdle:ye});le=c,se=c.commitScroll}ze=le.smoothScrollTo;function Ve(c){let f=c.target.closest("[data-index]");if(!f)return null;let _=parseInt(f.getAttribute("data-index"),10);if(Number.isNaN(_))return null;let D=K.get("_layoutToDataIndex"),q;if(D){let J=D(_);if(J<0)return null;let he=K.get("_getItem");q=he?he(J):s?s(J):b[J]}else q=s?s(_):b[_];if(q===void 0)return null;return{item:q,index:_}}function rt(c){for(let f=0;f<X.length;f++)X[f](c);let n=Ve(c);if(n)v.emit("item:click",{item:n.item,index:n.index,event:c})}function it(c){let n=Ve(c);if(n)v.emit("item:dblclick",{item:n.item,index:n.index,event:c})}function lt(c){let n=Ve(c);if(n)v.emit("item:contextmenu",{item:n.item,index:n.index,event:c})}function st(c){let n=c.target?.tagName;if((n==="INPUT"||n==="TEXTAREA"||n==="SELECT")&&!((c.ctrlKey||c.metaKey)&&(c.key==="f"||c.key==="F")))return;for(let f=0;f<re.length;f++)re[f](c)}if(p.content.addEventListener("click",rt),p.content.addEventListener("dblclick",it),p.content.addEventListener("contextmenu",lt),re.length>0)p.root.addEventListener("keydown",st);let ke=null;if(!We)setTimeout(()=>{if(a.destroyed)return;ke=new ResizeObserver((n)=>{for(let f of n){let{width:_,height:D}=f.contentRect,q=u?_:D,J=u?D:_;if(Math.abs(q-a.containerSize)<1&&Math.abs(J-a.crossSize)<1)continue;if(a.containerSize=q,a.crossSize=J,a.resizeCapacity(q,E,i.overscan),j)j.refresh(h.getTotalSize());ne(),Tt(N.resize,_,D),v.emit("resize",{width:_,height:D})}}),ke.observe(p.viewport)},0);a.resizeCapacity(a.containerSize,E,i.overscan),te(),a.initialized=!0;let ge=null;if(e.defer)ge=requestAnimationFrame(()=>{if(ge=null,!a.destroyed)ve()});else ve();if(!ae)le.attach();let De={get element(){return p.root},get items(){return b},get total(){return Y?Y():b.length},setItems(c){b=[...c],a.totalItems=b.length,h.rebuild(a.totalItems),te(),ne()},appendItems(c){b.push(...c),a.totalItems=b.length,h.rebuild(a.totalItems),te(),ne()},prependItems(c){b.unshift(...c),a.totalItems=b.length,h.rebuild(a.totalItems),te(),ne()},updateItem(c,n){if(Z){if(!Z(c,n))return}else{let f=b.findIndex((_)=>_.id===c);if(f===-1)return;b[f]={...b[f],...n}}ne()},insertItem(c,n){if(V)V(c,n??a.totalItems);else{if(n===void 0)b.push(c);else b.splice(n,0,c);a.totalItems=b.length,h.rebuild(a.totalItems),te()}ne()},removeItem(c){if(U){if(U(c)<0)return}else{let n=b.findIndex((f)=>f.id===c);if(n===-1)return;b.splice(n,1),a.totalItems=b.length,h.rebuild(a.totalItems),te()}ne()},removeItems(c){if(U){let D=0;for(let q of c)if(U(q)>=0)D++;if(D>0)ne();return D}let n=new Set(c),f=b.length;b=b.filter((D)=>!n.has(D.id));let _=f-b.length;if(_>0)a.totalItems=b.length,h.rebuild(a.totalItems),te(),a.renderPending=!0,ve();return _},getItemAt(c){if(L.indexMap)return b[c];return s?s(c):b[c]},getIndexById(c){if(fe)return fe(c);return b.findIndex((n)=>n.id===c)},scrollToIndex(c,n="start"){let f=Y?Y():b.length;if(f===0){xe={index:c,alignOrOptions:n};return}let _=Math.max(0,Math.min(c,f-1)),D=typeof n==="string"?n:n.align??"start",q=typeof n==="object"?n.behavior:void 0,J=typeof n==="object"?n.duration:void 0,he=typeof n==="object"?n.easing:void 0;if(we&&we(_,D,q,J,he)!==!1)return;let Fe=h.getOffset(_),at=h.getSize(_),Ee=a.containerSize,Ot=h.getTotalSize(),ut=i.mainAxisPadding,Vt=Math.max(0,Ot+ut-Ee),oe;if(Me)oe=Me(_,h,Ee,f,D);else{let kt=i.startPadding;switch(D){case"center":oe=kt+Fe-(Ee-at)/2;break;case"end":oe=Fe+at+ut-Ee;break;default:oe=Fe}oe=Math.max(0,Math.min(oe,Vt))}if(q==="smooth")le.smoothScrollTo(oe,J??dt,Q??void 0,he);else _e(oe)},getScrollPosition(){return Qe.getPixelEquivalent()},on:v.on.bind(v),off:v.off.bind(v),destroy(){if(a.destroyed)return;if(a.destroyed=!0,ue)ue=!1,p.root.classList.remove(He);if(ge!==null)cancelAnimationFrame(ge),ge=null;if(k!==null)clearTimeout(k),k=null;le.detach(),ke?.disconnect(),p.content.removeEventListener("click",rt),p.content.removeEventListener("dblclick",it),p.content.removeEventListener("contextmenu",lt),p.root.removeEventListener("keydown",st);let c=[];for(let n of ie)try{n()}catch(f){c.push(f instanceof Error?f:Error(String(f)))}for(let n of H)if(n.destroy)try{n.destroy()}catch(f){c.push(f instanceof Error?f:Error(String(f)))}for(let[,n]of T)n.remove();if(T.clear(),A.clear(),p.root.remove(),v.emit("destroy",void 0),v.clear(),c.length>0)for(let n of c)console.error("vlist: error during destroy:",n)}};for(let[c,n]of K)De[c]=n;return De}var wt=1,_t=2;var Mt=(e)=>1-(1-e)**3;function Ht({getMax:e,onChange:t=()=>{},onFinish:o,axis:l="y",reducedMotion:i}){let u=0,r=0,d=null,S=0,E=0,R=0,I=0,v=0,L=null,H=0,O=0,p=0,F=0,h=400,A=Mt,C=()=>p,a=0.006,b=(x)=>Math.max(0,Math.min(e(),x)),M=(x,g)=>l==="y"?g:x,T=(x,g)=>l==="y"?x:g;function P(x){let g=b(x);if(g!==u)u=g,t(u);return g!==x}function m(){v=0,r=d===null?0:5}function W(x){m(),P(x)}return{get position(){return u},get state(){return r},get velocity(){return v},get active(){return r===3||r===4},begin(x,g,w,B){if(d!==null){m();return}m(),d=x,S=R=M(g,w),E=T(g,w),I=B,r=1},move(x,g,w,B){if(x!==d||r!==1&&r!==2)return!1;let y=M(g,w);if(r===1){let K=Math.abs(y-S),X=Math.abs(T(g,w)-E);if(Math.max(K,X)<6)return!1;if(X>K*1.2)return m(),!1;if(K<X*1.2)return!1;r=2}let k=R-y,N=B-I;if(N>0){let K=Math.max(-3,Math.min(3,k/N));v=N>80?0:K*v<0?K:0.65*K+0.35*v}if(R=y,I=B,P(u+k))v=0;return!0},end(x,g){if(x!==d)return;if(d=null,r===2&&!i()&&g-I<=80&&Math.abs(v)>=0.02)L=null,r=3;else v=0,r=0},cancel:m,reset(){d=null,m()},jump:W,shiftBy(x){O+=x,F+=x,P(u+x)},by(x){m();let g=u;return P(u+x),u!==g},smooth(x,g=400,w=Mt){if(m(),F=0,C=typeof x==="function"?x:()=>x,d!==null||i()||g<=0){P(C());return}h=g,A=w,O=u,p=b(C()+F),L=null,r=4},resize(){m(),P(u)},tick(x){if(r!==3&&r!==4)return;if(L===null){if(L=x,r===4)H=x;return}let g=x-L;if(g<=0)return;if(L=x,g>100){if(r===4)P(b(C()+F)),r=0,o?.();else m();return}if(r===4){p=b(C()+F);let y=Math.min(1,(x-H)/h);if(P(O+(p-O)*A(y)),y===1)r=0,o?.();return}let w=Math.exp(-a*g),B=P(u+v*(1-w)/a);if(v*=w,B||Math.abs(v)<0.02)v=0,r=0}}}var Ae=(e)=>e.pointerType==="touch"||e.pointerType==="pen";function Ge(e){if(e.closest("textarea,select,[contenteditable]:not([contenteditable=false])"))return!0;let t=e.closest("input");return!!t&&!/^(button|submit|reset|checkbox|radio|image)$/.test(t.type)}function Rt(e){let{state:t,viewport:o,content:l,isX:i,onFrame:u,onIdle:r,mainAxisPadding:d}=e,S=o.parentElement??o,E=o.ownerDocument.defaultView,R=o.ownerDocument,I=E.matchMedia("(prefers-reduced-motion: reduce)"),v=0,L=null,H=null,O=!1,p=!1,F=-1,h=-1,A=null,C=null,a=!1,b=!1,M=!1,T=!1,P,m=new Set;function W(s){let z=t.scrollPosition;if(t.prevScrollPosition=z,t.scrollPosition=t.baseOffset=s,t.scrollDirection=s>z?1:s<z?-1:0,!p)u()}function x(){if(H=null,y.active||y.state===_t||y.state===wt)return;t.scrollDirection=0,r()}function g(){if(!O)return;if(H!==null)clearTimeout(H);H=setTimeout(x,e.idleTimeout||ce)}function w(){if(O&&L===null&&y.active)L=requestAnimationFrame(B)}function B(s){if(L=null,y.tick(s),y.active)w();else g()}let y=Ht({axis:i?"x":"y",getMax:()=>v,reducedMotion:()=>I.matches,onChange:W,onFinish(){let s=P;P=void 0,s?.()}});function k(){if(P=void 0,L!==null)cancelAnimationFrame(L),L=null;if(y.cancel(),H!==null)clearTimeout(H),H=null}function N(){if(k(),y.reset(),T&&A!==null&&o.hasPointerCapture(A))o.releasePointerCapture(A);T=!1,m.clear(),A=C=null,a=b=M=!1,g()}function K(s){if(!Ae(s))return;if(s.isPrimary){if(m.size)N();m.clear()}if(m.add(s.pointerId),m.size>1){M=!0,k();return}if(!(s.target instanceof Element)||Ge(s.target)){k();return}A=s.pointerId,a=!1,b=y.active,C=null,k(),y.begin(s.pointerId,s.clientX,s.clientY,s.timeStamp)}function X(s){if(!Ae(s)||s.target instanceof Node&&o.contains(s.target))return;if(s.isPrimary&&m.size)N();else if(m.size)m.add(s.pointerId),M=!0,k()}function re(s){if(!Ae(s)||M)return;if(y.move(s.pointerId,s.clientX,s.clientY,s.timeStamp)){if(a=!0,!T)o.setPointerCapture(s.pointerId),T=!0;if(s.cancelable)s.preventDefault()}}function ie(s){if(!Ae(s)||!m.has(s.pointerId))return;let z=s.type==="pointercancel";if(z)k();if(A===s.pointerId){if(!z&&!M&&(a||b))C=s.pointerId;if(T&&o.hasPointerCapture(s.pointerId))o.releasePointerCapture(s.pointerId);T=!1,A=null,a=b=!1}if(y.end(s.pointerId,s.timeStamp),m.delete(s.pointerId),!m.size){if(M||z)y.reset();M=!1}w(),g()}function Y(s){let z=s.pointerId;if(s.detail!==0&&C!==null&&(z===C||z===void 0))C=null,s.preventDefault(),s.stopImmediatePropagation()}function Q(s){if(s.ctrlKey||s.defaultPrevented||!(s.target instanceof Element)||Ge(s.target))return;let z=s.deltaMode===1?16:s.deltaMode===2?t.containerSize:1,U=i?s.deltaX:s.deltaY,V=i?s.deltaY:s.deltaX,Z=i?o.scrollHeight>o.clientHeight:o.scrollWidth>o.clientWidth;if(Z&&Math.abs(V)>Math.abs(U))return;if(Z&&V!==0)if(s.preventDefault(),i)o.scrollTop+=V*z;else o.scrollLeft+=V*z;let fe=i&&!Z&&U===0?V:U;if(k(),y.by(fe*z))s.preventDefault();g()}function de(s){if(s.defaultPrevented||s.ctrlKey||s.metaKey||s.altKey||!(s.target instanceof Element)||Ge(s.target))return;if((s.key===" "||s.key==="Enter")&&s.target.closest("button,summary,a,input"))return;let z=e.sizeCache,U=z.getSize(z.indexAtOffset(y.position)),V;if(s.key===(i?"ArrowRight":"ArrowDown"))V=y.position+U;if(s.key===(i?"ArrowLeft":"ArrowUp"))V=y.position-U;if(s.key==="PageDown"||s.key===" ")V=y.position+t.containerSize*(s.shiftKey&&s.key===" "?-1:1);if(s.key==="PageUp")V=y.position-t.containerSize;if(s.key==="Home")V=0;if(s.key==="End")V=v;if(V!==void 0)s.preventDefault(),ee(V)}function se(){if(R.hidden)N()}function ee(s){let z=y.position;if(k(),y.jump(s),z===y.position)W(y.position);g()}function me(s){let z=F!==t.containerSize||h!==t.crossSize,U=s!==t.totalSize||z;if(F=t.containerSize,h=t.crossSize,t.totalSize=s,v=Math.max(0,s+d-t.containerSize),U){if(p=!0,z)k(),y.resize();else y.shiftBy(0);W(y.position),p=!1}}return{setLogical:ee,refresh:me,shiftBy(s){if(t.totalSize=e.sizeCache.getTotalSize(),v=Math.max(0,t.totalSize+d-t.containerSize),y.shiftBy(s),!y.active)g()},cancelScroll(){k(),g()},getLogical:()=>t.scrollPosition,getMaxLogical:()=>v,smoothScrollTo(s,z,U,V=Te,Z){if(k(),y.smooth(s,z,V),P=Z,!y.active)P=void 0,Z?.(),g();else w()},attach(){if(O)return;if(O=!0,o.style.overflowX=i?"hidden":"auto",o.style.overflowY=i?"auto":"hidden",o.style.touchAction=i?"pan-y pinch-zoom":"pan-x pinch-zoom",o.style.overflowAnchor="none",l.style[i?"width":"height"]="100%",l.style.overflow="clip",l.style.overflowAnchor="none",o.addEventListener("pointerdown",K),E.addEventListener("pointerdown",X),o.addEventListener("pointermove",re,{passive:!1}),E.addEventListener("pointerup",ie),E.addEventListener("pointercancel",ie),o.addEventListener("click",Y,!0),e.wheelEnabled)o.addEventListener("wheel",Q,{passive:!1});S.addEventListener("keydown",de),E.addEventListener("blur",N),R.addEventListener("visibilitychange",se),I.addEventListener("change",N),w()},detach(){if(O=!1,N(),H!==null)clearTimeout(H),H=null;o.removeEventListener("pointerdown",K),E.removeEventListener("pointerdown",X),o.removeEventListener("pointermove",re),E.removeEventListener("pointerup",ie),E.removeEventListener("pointercancel",ie),o.removeEventListener("click",Y,!0),o.removeEventListener("wheel",Q),S.removeEventListener("keydown",de),E.removeEventListener("blur",N),R.removeEventListener("visibilitychange",se),I.removeEventListener("change",N),o.style.overflowX=o.style.overflowY=o.style.touchAction=o.style.overflowAnchor="",l.style.overflow=l.style.overflowAnchor=""}}}function Gn(e,t=[]){return zt(e,t,Rt)}export{Gn as createVList};
|
|
1
|
+
var we=3,vt="vlist";var fe=150;var Me=(e)=>e<0.5?2*e*e:1-(-2*e+2)**2/2,gt=300;var ze="__placeholder_";function ht(e){let{state:t,viewport:o,isX:i,onFrame:r,onIdle:u}=e,l=e.idleTimeout||fe,d=null,y=null;function C(I=i?o.scrollLeft:o.scrollTop){t.prevScrollPosition=t.scrollPosition,t.scrollPosition=I,t.scrollDirection=I>t.prevScrollPosition?1:I<t.prevScrollPosition?-1:0,r(),v()}function v(){if(d!==null)clearTimeout(d);d=setTimeout(()=>{d=null,t.scrollDirection=0,u()},l)}function h(){if(y!==null)cancelAnimationFrame(y),y=null}function f(I,_,M,p=Me,B){h();let x=t.scrollPosition,R=typeof I==="function"?I:()=>I,H=R();if(Math.abs(H-x)<1){if(M)M(H);else if(i)o.scrollLeft=H;else o.scrollTop=H;B?.();return}let a=performance.now();function S(O){H=R();let P=O-a,A=Math.min(P/_,1),b=x+(H-x)*p(A);if(M)M(b);else if(i)o.scrollLeft=b;else o.scrollTop=b;if(!M)C(b);if(A<1)y=requestAnimationFrame(S);else y=null,B?.()}y=requestAnimationFrame(S)}return{attach(){},detach(){if(h(),d!==null)clearTimeout(d),d=null},cancelScroll:h,smoothScrollTo:f,commitScroll:C}}var _e={top:0,right:0,bottom:0,left:0},St=(e)=>{if(e==null)return _e;if(typeof e==="number")return e===0?_e:{top:e,right:e,bottom:e,left:e};if(e.length===2){let[u,l]=e;return u===0&&l===0?_e:{top:u,right:l,bottom:u,left:l}}let[t,o,i,r]=e;return t===0&&o===0&&i===0&&r===0?_e:{top:t,right:o,bottom:i,left:r}},yt=(e,t)=>t?e.left+e.right:e.top+e.bottom,xt=(e,t)=>t?e.top+e.bottom:e.left+e.right;function Et(e){let t={visibleIndices:new Int32Array(e),visibleOffsets:new Float64Array(e),visibleSizes:new Float64Array(e),visibleCount:0,startIndex:0,totalSize:0,capacity:e,scrollPosition:0,prevScrollPosition:0,scrollDirection:0,baseOffset:0,prevBaseOffset:0,containerSize:0,crossSize:0,totalItems:0,prevRangeStart:0,prevRangeEnd:-1,renderPending:!1,initialized:!1,destroyed:!1,windowClamped:!1,windowClampReported:!1,prevAriaTotal:-1,ensureCapacity(o){if(o<=t.capacity)return;let i=o+8,r=new Int32Array(i),u=new Float64Array(i),l=new Float64Array(i);r.set(t.visibleIndices),u.set(t.visibleOffsets),l.set(t.visibleSizes),t.visibleIndices=r,t.visibleOffsets=u,t.visibleSizes=l,t.capacity=i},resizeCapacity(o,i,r=we){if(i<=0||o<=0)return;t.ensureCapacity(Math.ceil(o/i)+r*2)},clear(){t.visibleCount=0,t.startIndex=0}};return t}var Gt=(e,t,o)=>{let i=t;return{getOffset:(r)=>r*e,getSize:(r)=>e,indexAtOffset:(r)=>{if(i===0||e===0)return 0;return Math.max(0,Math.min(Math.floor(r/e),i-1))},getTotalSize:()=>{let r=i*e;return r>0?r-o:0},getTotal:()=>i,rebuild:(r)=>{i=r},invalidate:()=>{},isVariable:()=>!1}};var It=(e,t,o,i)=>{while(t<o){let r=t+o+1>>>1;if(e[r]<=i)t=r;else o=r-1}return t},qt=(e,t,o)=>{let i=0,r=0,u=new Float64Array(0),l=new Float64Array(0),d=new Float64Array(1),y=(v,h)=>{for(let f=v;f<r;f++){if(f<=h){let I=f<<9,_=Math.min(I+512,i),M=0;for(let p=I;p<_;p++)u[p]=M,M+=e(p);l[f]=M}d[f+1]=d[f]+l[f]}},C=(v)=>{i=v,r=Math.ceil(v/512),u=new Float64Array(v),l=new Float64Array(r),d=new Float64Array(r+1),y(0,r-1)};return C(t),{getOffset:(v)=>{if(v<=0)return 0;if(v>=i)return d[r];return d[v>>>9]+u[v]},getSize:(v)=>e(v),indexAtOffset:(v)=>{if(i===0||v<=0)return 0;if(v>=d[r])return i-1;let h=It(d,0,r-1,v),f=h<<9;return It(u,f,Math.min(f+512,i)-1,v-d[h])},getTotalSize:()=>{let v=d[r];return v>0?v-o:0},getTotal:()=>i,rebuild:(v)=>C(v),invalidate:(v,h=v)=>{if(v>=0&&h<i)y(v>>>9,h>>>9)},isVariable:()=>!0}},He=(e,t,o=0)=>{if(typeof e==="number")return Gt(e,t,o);return qt(e,t,o)};function Tt(e){let t=[],o=`${e}-item`,i=document.createElement("div");return i.className=o,{acquire(){if(t.length>0)return t.pop();return i.cloneNode(!1)},release(r){r.className=o,r.removeAttribute("style"),r.removeAttribute("id"),r.removeAttribute("role"),r.removeAttribute("aria-selected"),r.removeAttribute("aria-posinset"),r.removeAttribute("aria-setsize"),r.removeAttribute("data-index"),r.removeAttribute("data-id"),r.textContent="",t.push(r)},get size(){return t.length},trim(r){let u=r>0?r:0;if(t.length>u)t.length=u},clear(){t.length=0}}}function Ue(e){let t=e.querySelectorAll("a[href],button,input,select,textarea,[tabindex]");for(let o=0;o<t.length;o++)t[o].setAttribute("tabindex","-1");e._stamp=0}function Ge(e){if(typeof e==="string"){let t=document.querySelector(e);if(!t)throw Error(`[vlist] Container not found: ${e}`);return t}return e}function Lt(e,t,o,i){let r=o?`${t} ${t}--horizontal`:t,u=o?"overflow-x:auto;overflow-y:hidden;height:100%;width:100%":"overflow:auto;height:100%;width:100%",l=o?"position:relative;height:100%;overflow-anchor:none":"position:relative;width:100%;overflow-anchor:none",d=' role="list"';if(i)d+=` aria-label="${i.replace(/"/g,""")}"`;if(o)d+=' aria-orientation="horizontal"';e.insertAdjacentHTML("beforeend",`<div class="${r}"><div class="${t}-viewport" style="${u}" tabindex="-1"><div class="${t}-content" style="${l}"${d}></div></div></div>`);let y=e.lastElementChild,C=y.firstElementChild,v=C.firstElementChild,h=document.createElement("div");return h.className=`${t}-live`,h.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",h.setAttribute("aria-live","polite"),h.setAttribute("aria-atomic","true"),h.setAttribute("role","status"),y.appendChild(h),{root:y,viewport:C,content:v,liveRegion:h}}function Yt(e,t){if(e.getTotal()<=0)return{index:0,offsetPx:0};let i=t<=0?0:t,r=e.indexAtOffset(i),u=i-e.getOffset(r);return{index:r,offsetPx:u>0?u:0}}function Xt(e,t){let o=Zt(e,t);return e.getOffset(o.index)+o.offsetPx}function Zt(e,t){let o=e.getTotal();if(o<=0)return{index:0,offsetPx:0};let{index:i,offsetPx:r}=t;if(i<0)return{index:0,offsetPx:0};if(i>o-1)i=o-1;while(r>0&&i<o-1){let u=e.getSize(i);if(r<u)break;r-=u,i++}while(r<0&&i>0)i--,r+=e.getSize(i);if(r<0)r=0;return{index:i,offsetPx:r}}function Ct(e){let{sizeCache:t,getPixel:o,setPixel:i,getContainerSize:r}=e;function u(){let d=t.getTotalSize()+e.padding-r();return d>0?d:0}function l(d){if(d<=0)return 0;let y=u();return d>y?y:d}return{getLogical(){return Yt(t,o())},setLogical(d){i(l(Xt(t,d)))},getPixelEquivalent(){return o()},setPixelEquivalent(d){i(l(d))},getMaxPixelEquivalent:u,getRenderOrigin:e.getRenderOrigin,scrollByPx(d){i(l(o()+d))}}}var Ie=[],jt={calculate:Ie,commit:Ie,afterScroll:Ie,idle:Ie,resize:Ie};function Pt(e){if(e.length===0)return jt;let t=[],o=[],i=[],r=[],u=[];for(let l=0;l<e.length;l++){let d=e[l].hooks;if(d===void 0)continue;if(d.onCalculate!==void 0)t.push(d.onCalculate);if(d.onCommit!==void 0)o.push(d.onCommit);if(d.onAfterScroll!==void 0)i.push(d.onAfterScroll);if(d.onIdle!==void 0)r.push(d.onIdle);if(d.onResize!==void 0)u.push(d.onResize)}return{calculate:t,commit:o,afterScroll:i,idle:r,resize:u}}function At(e,t){for(let o=0;o<e.length;o++)e[o](t)}function Te(e,t){for(let o=0;o<e.length;o++)e[o](t)}function qe(e,t,o){for(let i=0;i<e.length;i++)e[i](t,o)}function wt(e){for(let t=0;t<e.length;t++)e[t]()}function Mt(e,t,o){for(let i=0;i<e.length;i++)e[i](t,o)}function zt(e,t,o,i,r,u,l,d){let y=i!==0||r!==0;return{prefix:e,selectedClass:`${e}-item--selected`,focusedClass:`${e}-item--focused`,placeholderClass:`${e}-item--placeholder`,replacedClass:`${e}-item--replaced`,translateProp:t?"translateX(":"translateY(",sizeProp:t?"width":"height",itemRole:"listitem",interactive:!1,startPadding:o,gap:l,hasCrossPad:y,crossStartProp:y?t?"top":"left":"",crossEndProp:y?t?"bottom":"right":"",crossStartVal:y?i+"px":"",crossEndVal:y?r+"px":"",oddClass:u,emitter:d??null,indexMap:null,ariaTotalFn:null}}function Jt(e,t,o,i,r){if(e.containerSize<=0||e.totalItems===0)return e.clear(),!0;let{scrollPosition:u,containerSize:l,totalItems:d}=e,y=r??0;e.totalSize=t.getTotalSize();let C=t.indexAtOffset(y>0?Math.max(0,u-y):u),v=t.indexAtOffset(u+l);if(v<d-1)v++;C=Math.max(0,C),v=Math.min(d-1,Math.max(0,v));let h=Math.max(0,C-o),f=Math.min(d-1,v+o),I=Math.ceil(l)+o*2;if(f-h+1>I)f=h+I-1,e.windowClamped=!0;let _=f-h+1;if(_>e.capacity)e.ensureCapacity(_);let M=Math.min(_,e.capacity);if(h===e.prevRangeStart&&f===e.prevRangeEnd&&!e.renderPending&&e.baseOffset===e.prevBaseOffset)return!1;e.visibleCount=M,e.startIndex=h;for(let p=0;p<M;p++){let B=h+p;e.visibleIndices[p]=B,e.visibleOffsets[p]=t.getOffset(B),e.visibleSizes[p]=t.getSize(B)}return At(i.calculate,e),e.prevRangeStart=h,e.prevRangeEnd=f,e.prevBaseOffset=e.baseOffset,e.renderPending=!1,!0}var U={selected:!1,focused:!1};function Qt(e,t,o){for(let i=0;i<t;i++)if(e[i]===o)return!0;return!1}function en(e,t){if(t<=1)return!0;let o=e[0];for(let i=1;i<t;i++){let r=e[i];if(r!==o+1)return!1;o=r}return!0}function tn(e,t,o,i,r,u,l,d,y,C){let v=y?null:r(),{visibleCount:h,visibleIndices:f}=e,I=l.ariaTotalFn?l.ariaTotalFn():e.totalItems,_=l.interactive?String(I):"",M=l.interactive&&I!==e.prevAriaTotal,p=null,B=l.indexMap;for(let x=0;x<h;x++){let R=f[x],H=B?B(R):R,a=e.visibleOffsets[x],S=e.visibleSizes[x],O=y?y(R):v[R];if(C)C(H,U);else U.selected=!1,U.focused=!1;let P=u.get(R),A=P;if(P===void 0){let b=t.acquire();if(O!==void 0){let E;try{E=i(O,H,U)}catch(V){if(l.emitter)l.emitter.emit("error",{error:V instanceof Error?V:Error(String(V)),context:`template:render:${H}`});t.release(b);continue}if(typeof E==="string")b.innerHTML=E;else b.textContent="",b.appendChild(E);Ue(b)}if(b.setAttribute("role",l.itemRole),b.setAttribute("data-index",String(H)),l.interactive)b.id=l.prefix+"-item-"+R,b.setAttribute("aria-posinset",String(H+1)),b.setAttribute("aria-setsize",_);if(O!==void 0){let E=String(O.id);if(b.setAttribute("data-id",E),E.startsWith(ze))b.classList.add(l.placeholderClass)}if(l.hasCrossPad)b.style.setProperty(l.crossStartProp,l.crossStartVal),b.style.setProperty(l.crossEndProp,l.crossEndVal);if(C){if(b.classList.toggle(l.selectedClass,U.selected),b.classList.toggle(l.focusedClass,U.focused),U.selected)b.setAttribute("aria-selected","true");else b.removeAttribute("aria-selected");b._lastSelected=U.selected,b._lastFocused=U.focused}if(l.oddClass)b.classList.toggle(l.oddClass,(R&1)===1);let W=a-e.baseOffset+l.startPadding;b.style.transform=l.translateProp+W+"px)",b._lastOffset=W;let g=S-l.gap;if(b.style[l.sizeProp]=g+"px",b._lastSize=g,b._lastItem=O,u.set(R,b),p===null)p=document.createDocumentFragment();p.appendChild(b)}else{if(M)P.setAttribute("aria-setsize",_);if(O!==void 0&&A._lastItem!==O){let g=P.getAttribute("data-id"),E=String(O.id),V;try{V=i(O,H,U)}catch(F){if(l.emitter)l.emitter.emit("error",{error:F instanceof Error?F:Error(String(F)),context:`template:render:${H}`});continue}if(typeof V==="string")P.innerHTML=V;else P.textContent="",P.appendChild(V);if(Ue(P),P.setAttribute("data-id",E),A._lastItem=O,g!==E){let F=g!==null&&g.startsWith(ze),N=E.startsWith(ze);if(F!==N)P.classList.toggle(l.placeholderClass,N);if(F&&!N)P.classList.add(l.replacedClass),setTimeout(()=>{P.classList.remove(l.replacedClass)},300)}}if(C){if(A._lastSelected!==U.selected){if(P.classList.toggle(l.selectedClass,U.selected),U.selected)P.setAttribute("aria-selected","true");else P.removeAttribute("aria-selected");A._lastSelected=U.selected}if(A._lastFocused!==U.focused)P.classList.toggle(l.focusedClass,U.focused),A._lastFocused=U.focused}let b=a-e.baseOffset+l.startPadding;if(A._lastOffset!==b)P.style.transform=l.translateProp+b+"px)",A._lastOffset=b;let W=S-l.gap;if(A._lastSize!==W)P.style[l.sizeProp]=W+"px",A._lastSize=W}}if(p!==null)o.appendChild(p);if(h>0&&en(f,h)){let x=f[0],R=f[h-1];for(let[H,a]of u)if(H<x||H>R)a.remove(),t.release(a),u.delete(H)}else for(let[x,R]of u)if(!Qt(f,h,x))R.remove(),t.release(R),u.delete(x);if(l.interactive)e.prevAriaTotal=e.totalItems;Te(d.commit,e)}function Ye(e,t,o,i,r,u,l,d,y,C,v,h){let f=Jt(e,t,o,C,y.startPadding);if(e.windowClamped&&!e.windowClampReported)e.windowClampReported=!0,queueMicrotask(()=>{if(e.destroyed)return;y.emitter?.emit("error",{error:Error("[vlist] render window capped to the viewport: the item size spec reports sizes below 1px"),context:"render:window-ceiling"})});if(f)tn(e,i,r,u,l,d,y,C,v,h)}var Xe=()=>{let e={},t=(u,l)=>{if(!e[u])e[u]=new Set;return e[u].add(l),()=>o(u,l)},o=(u,l)=>{e[u]?.delete(l)};return{on:t,off:o,emit:(u,l)=>{e[u]?.forEach((d)=>{try{d(l)}catch(y){}})},clear:(u)=>{if(u)delete e[u];else for(let l in e)delete e[l]}}};var _t=2,Ht=(e=0)=>({velocity:0,sampleCount:0}),Rt=(e,t)=>{let o=performance.now(),i=e._lt??o,r=e._lp??t,u=o-i;if(e._lp=t,e._lt=o,u===0)return e.sampleCount=Math.min(e.sampleCount+1,5),e;if(u>100)return e.velocity=0,e.sampleCount=1,e;return e.velocity=Math.abs(t-r)/u,e.sampleCount=Math.min(e.sampleCount+1,5),e};function nn(e){let{item:t}=e;if(t.height!==void 0&&typeof t.height==="number"){if(!Number.isFinite(t.height)||t.height<=0)throw Error(`vlist: item.height must be a positive number, got ${t.height}`)}if(t.width!==void 0&&typeof t.width==="number"){if(!Number.isFinite(t.width)||t.width<=0)throw Error(`vlist: item.width must be a positive number, got ${t.width}`)}if(t.estimatedHeight!==void 0){if(!Number.isFinite(t.estimatedHeight)||t.estimatedHeight<=0)throw Error(`vlist: item.estimatedHeight must be a positive number, got ${t.estimatedHeight}`)}if(t.estimatedWidth!==void 0){if(!Number.isFinite(t.estimatedWidth)||t.estimatedWidth<=0)throw Error(`vlist: item.estimatedWidth must be a positive number, got ${t.estimatedWidth}`)}if(t.gap!==void 0){if(typeof t.gap!=="number"||!Number.isFinite(t.gap)||t.gap<0)throw Error(`vlist: item.gap must be a non-negative number, got ${t.gap}`)}if(e.overscan!==void 0){if(typeof e.overscan!=="number"||!Number.isFinite(e.overscan)||e.overscan<0)throw Error(`vlist: overscan must be a non-negative number, got ${e.overscan}`)}let o=e.scroll;if(o?.mode!==void 0||o?.runway!==void 0)throw Error('vlist 3.0: scroll.mode and scroll.runway were removed; bounded mode is gone. Use "vlist/synthetic" for huge lists or "vlist" for native scrolling.')}function on(e,t){let o=e==="horizontal"?"x":"y";if(t.some((r)=>r.name==="grid"))return{primary:o,cross:o==="x"?"y":"x"};return{primary:o}}function rn(e,t){let o=on(e.orientation,t),i=o.primary==="x",r=St(e.padding);return{axis:o,hasCrossAxis:o.cross!==void 0,overscan:e.overscan??we,reverse:e.reverse??!1,classPrefix:e.classPrefix??vt,mainAxisPadding:yt(r,i),crossAxisPadding:xt(r,i),startPadding:i?r.left:r.top,endPadding:i?r.right:r.bottom,crossPadStart:i?r.top:r.left,crossPadEnd:i?r.bottom:r.right,striped:e.item.striped||!1,gap:e.item.gap??0}}function ln(e,t){if(t)return e.item.width??e.item.estimatedWidth??100;return e.item.height??e.item.estimatedHeight??40}function sn(e){let t=[...e];return t.sort((o,i)=>(o.priority??50)-(i.priority??50)),t}function an(e){let t=new Set;for(let o of e){if(t.has(o.name))throw Error(`[vlist] Duplicate plugin: ${o.name}`);t.add(o.name)}for(let o of e)if(o.conflicts){for(let i of o.conflicts)if(t.has(i))throw Error(`[vlist] Plugin "${o.name}" conflicts with "${i}"`)}}function un(e,t){for(let o of e)o.validateConfig?.(t)}function Ot(e,t=[],o,i){if(nn(e),o&&typeof e.scroll?.scrollbar==="string")throw Error('vlist 3.0: scroll.scrollbar strings require "vlist"; use the scrollbar() plugin with "vlist/synthetic".');if(e.orientation==="horizontal"&&getComputedStyle(Ge(e.container)).direction==="rtl")throw Error("vlist: horizontal RTL lists are not supported; use a vertical list, or an LTR container");let r=rn(e,t),u=r.axis.primary==="x",l=ln(e,u),d=r.gap,y=d>0?typeof l==="function"?(c)=>l(c)+d:l+d:l,C=typeof l==="number"?l:20,v=e.items?.length??0,h=r.striped?`${r.classPrefix}-item--odd`:"",f=Xe(),I=zt(r.classPrefix,u,r.startPadding,r.crossPadStart,r.crossPadEnd,h,d,f),_=t.length>0?sn(t):t;if(t.length>0)an(_),un(_,r);let M=Ge(e.container),p=Lt(M,r.classPrefix,u,e.ariaLabel);if(e.scroll?.scrollbar==="none")p.viewport.classList.add(`${r.classPrefix}-viewport--no-scrollbar`);if(e.scroll?.gutter==="stable")p.viewport.classList.add(`${r.classPrefix}-viewport--gutter-stable`);let x=He(y,v,d),R=Tt(r.classPrefix),H=Math.ceil(4096/C)+r.overscan*2+8,a=Et(H);a.totalItems=v;let S=e.items?[...e.items]:[],O=()=>S,P=new Map,A=Ht(),b={velocity:0,reliable:!1},W={range:{start:0,end:-1}},g={scrollPosition:0,direction:"down"},E={scrollPosition:0},V=-1,F=-1,N=-1,j=null,T=Pt(_),z=new Map,G=[],se=[],pe=[],be=(c)=>{let n=(m)=>{c.push(m instanceof Error?m:Error(String(m)))};for(let m of pe)try{m()}catch(L){n(L)}for(let m of _)if(m.destroy)try{m.destroy()}catch(L){n(L)}},Z=null,Q=null,ve,ce,ee=null,de=null,X=null,s=null,w=null,K=null,D=null,q=null,re=!1,je=!1,ge=null,Je=0,Qe=0,et=null,tt=null,nt=null,ot=null,Fe=null,ke=null,Ve=null,Ce=null,J=null,he=null,rt=null;a.containerSize=u?p.viewport.clientWidth:p.viewport.clientHeight,a.crossSize=u?p.viewport.clientHeight:p.viewport.clientWidth;function Se(c){if(Q)Q(c);else{if(u)p.viewport.scrollLeft=c;else p.viewport.scrollTop=c;ce?.()}}let it=Ct({sizeCache:x,getPixel:()=>a.scrollPosition,setPixel:Se,getRenderOrigin:()=>a.baseOffset,getContainerSize:()=>a.containerSize,padding:r.mainAxisPadding});if(t.length>0){let c={pool:R,config:r,emitter:f,template:e.item.template,getState(){return a},dom:{...p,renderedElement(n){let m=z.get("_getRenderedElement");if(m)return m(n);return P.get(n)??null},enableListbox(){let n=p.content.getAttribute("role");if(!n||n==="list")p.content.setAttribute("role","listbox"),p.content.setAttribute("tabindex","0");I.itemRole="option",I.interactive=!0}},scroll:{...it,to:Se,shiftBy(n){if(J?.shiftBy)J.shiftBy(n);else c.scroll.to(a.scrollPosition+n)},smoothTo(n,m,L,k){if(Fe)Fe(n,m,Q??void 0,L,k);else c.scroll.to(typeof n==="function"?n():n)},cancel(){ue?.cancelScroll()},commit(n){ce(n)},setSource(n){Q=n.write,ve=n.onContentSize,re=!0},setTarget(n){ge=n},setBoundedWrap(n,m){he=n,rt=m},setToPosFn(n){ke=n},setToIndexFn(n){Ve=n},onFrame:Be,onIdle:Pe,disableResize(){je=!0}},items:{all:O,at(n){return X?X(n):S[n]},removeById(n){if(w)return w(n);let m=S.findIndex((L)=>L.id===n);if(m===-1)return-1;return S.splice(m,1),a.totalItems=S.length,x.rebuild(a.totalItems),te(),m},insertAt(n,m){if(K){K(n,m);return}S.splice(m,0,n),a.totalItems=S.length,x.rebuild(a.totalItems),te()},setGetFn(n){X=n},setRemoveFn(n){w=n},setInsertFn(n){K=n},setUpdateFn(n){D=n},setIndexByIdFn(n){q=n},setTotalFn(n){Z=n,I.ariaTotalFn=n},setIndexMapFn(n){I.indexMap=n}},sizes:{cache:x,get rawSpec(){return l},setConfig(n,m=0){let L=He(n,a.totalItems,m),k=z.get("_setSizeCacheBase");if(k){let Y=x.rebuild;Object.assign(x,L),x.rebuild=Y,k(L.rebuild)}else Object.assign(x,L)},rebuild(){x.rebuild(a.totalItems)}},render:{force(){ne()},ifNeeded(){ye()},contentSize:st,setFn(n,m){ee=()=>{let{prevRangeStart:L,prevRangeEnd:k}=a;if(n(),a.prevRangeStart!==L||a.prevRangeEnd!==k)Te(T.commit,a)},de=()=>{m(),Te(T.commit,a)}},setStateFn(n){s=n},getStateFn(){return s}},hooks:{method(n,m){if(!n.startsWith("_")&&z.has(n))throw Error(`[vlist] duplicate method "${n}"; rename it or use a set*Fn hook`);z.set(n,m)},get(n){return z.get(n)},onClick(n){G.push(n)},onKeydown(n){se.push(n)},onDestroy(n){pe.push(n)}},nav:{set(n){if(n.ud!==void 0)Je=n.ud;if(n.lr!==void 0)Qe=n.lr;if(n.scrollIndex)et=n.scrollIndex;if(n.navigate)tt=n.navigate;if(n.total)nt=n.total;if(n.reveal)ot=n.reveal},get:(()=>{let n={ud:0,lr:0,scrollIndex:null,navigate:null,total:null,reveal:null};return()=>(n.ud=Je,n.lr=Qe,n.scrollIndex=et,n.navigate=tt,n.total=nt,n.reveal=ot,n)})()}};for(let n of _)if(n.setup)try{n.setup(c)}catch(m){let L=m instanceof Error?m:Error(String(m));f.emit("error",{error:L,context:`plugin:setup:${n.name}`})}}let De=r.classPrefix+"--scrolling",ae=!1,Ne=e.scroll?.idleTimeout??fe;function lt(){if(g.scrollPosition=a.scrollPosition,u)g.direction=a.scrollDirection>0?"right":"left";else g.direction=a.scrollDirection>0?"down":"up";if(f.emit("scroll",g),Rt(A,a.scrollPosition),b.velocity=A.velocity,b.reliable=A.sampleCount>=_t,f.emit("velocity:change",b),a.startIndex!==V||a.prevRangeEnd!==F)V=a.startIndex,F=a.prevRangeEnd,W.range.start=a.startIndex,W.range.end=a.prevRangeEnd,f.emit("range:change",W)}function st(c,n=!0){if(J){if(n)J.refresh(c);return}a.totalSize=c;let m=c+r.mainAxisPadding;if(ve?.(m),n)p.content.style[u?"width":"height"]=m+"px"}function te(){let c=ee?a.totalSize:x.getTotalSize();if(st(c,!ee),J||ee)return;i?.onContentSize(c,f)}function at(){if(!Ce)return;if((Z?Z():S.length)===0)return;let n=Ce;Ce=null,We.scrollToIndex(n.index,n.alignOrOptions)}function ye(){if(ee)ee();else Ye(a,x,r.overscan,R,p.content,e.item.template,O,P,I,T,X,s);at()}function Be(){if(!ae)ae=!0,p.root.classList.add(De);if(ye(),qe(T.afterScroll,a.scrollPosition,a.scrollDirection),a.scrollPosition!==N)N=a.scrollPosition,lt()}function ut(){R.trim(P.size)}function Pe(){if(ae)ae=!1,p.root.classList.remove(De);a.scrollDirection=0,ut(),wt(T.idle),b.velocity=0,b.reliable=!1,f.emit("velocity:change",b),E.scrollPosition=a.scrollPosition,f.emit("scroll:idle",E)}function ne(){if(a.renderPending=!0,de)de();else Ye(a,x,r.overscan,R,p.content,e.item.template,O,P,I,T,X,s);if(at(),qe(T.afterScroll,a.scrollPosition,a.scrollDirection),a.scrollPosition!==N){if(N=a.scrollPosition,lt(),j!==null)clearTimeout(j);j=setTimeout(Pe,Ne)}else if(!ae)ut()}let ct=re?!1:e.scroll?.wheel!==!1,ue;if(re&&he)throw be([]),p.root.remove(),Error("vlist: page() is not compatible with the carousel plugin — bounded page-mode scrolling is not implemented yet.");if(!re&&(o||he))J=(o??rt)({state:a,sizeCache:x,viewport:p.viewport,content:p.content,isX:u,wheelEnabled:ct,idleTimeout:Ne,...ge?{scrollTarget:ge}:{},mainAxisPadding:r.mainAxisPadding,...he?{wrap:he,rendered:P,classPrefix:r.classPrefix,oddClass:h,onFold(c){let n=A;if(n._lp!==void 0)n._lp-=c;N-=c}}:{},onFrame:Be,onIdle:Pe}),ue=J,Q=(c)=>J.setLogical(c);else{let c=(re?ht:i.native)({state:a,viewport:p.viewport,isX:u,wheelEnabled:ct,idleTimeout:Ne,...ge?{scrollTarget:ge}:{},onFrame:Be,onIdle:Pe});ue=c,ce=c.commitScroll}Fe=ue.smoothScrollTo;function Ke(c){let m=c.target.closest("[data-index]");if(!m)return null;let L=parseInt(m.getAttribute("data-index"),10);if(Number.isNaN(L))return null;let k=z.get("_layoutToDataIndex"),Y,ie=L;if(k){let oe=k(L);if(oe<0)return null;let me=z.get("_getItemAtLayout"),Ee=z.get("_getItem");Y=me?me(L):Ee?Ee(oe):X?X(oe):S[oe],ie=oe}else Y=X?X(L):S[L];if(Y===void 0)return null;return{item:Y,index:ie}}function dt(c){for(let m=0;m<G.length;m++)G[m](c);let n=Ke(c);if(n)f.emit("item:click",{item:n.item,index:n.index,event:c})}function mt(c){let n=Ke(c);if(n)f.emit("item:dblclick",{item:n.item,index:n.index,event:c})}function ft(c){let n=Ke(c);if(n)f.emit("item:contextmenu",{item:n.item,index:n.index,event:c})}function pt(c){let n=c.target?.tagName;if((n==="INPUT"||n==="TEXTAREA"||n==="SELECT")&&!((c.ctrlKey||c.metaKey)&&(c.key==="f"||c.key==="F")))return;for(let m=0;m<se.length;m++)se[m](c)}if(p.content.addEventListener("click",dt),p.content.addEventListener("dblclick",mt),p.content.addEventListener("contextmenu",ft),se.length>0)p.root.addEventListener("keydown",pt);let $e=null;if(!je)setTimeout(()=>{if(a.destroyed)return;$e=new ResizeObserver((n)=>{for(let m of n){let{width:L,height:k}=m.contentRect,Y=u?L:k,ie=u?k:L;if(Math.abs(Y-a.containerSize)<1&&Math.abs(ie-a.crossSize)<1)continue;if(a.containerSize=Y,a.crossSize=ie,a.resizeCapacity(Y,C,r.overscan),J)J.refresh(x.getTotalSize());ne(),Mt(T.resize,L,k),f.emit("resize",{width:L,height:k})}}),$e.observe(p.viewport)},0);a.resizeCapacity(a.containerSize,C,r.overscan),te(),a.initialized=!0;let xe=null;if(e.defer)xe=requestAnimationFrame(()=>{if(xe=null,!a.destroyed)ye()});else ye();if(!re)ue.attach();let We={get element(){return p.root},get items(){return S},get total(){return Z?Z():S.length},setItems(c){S=[...c],a.totalItems=S.length,x.rebuild(a.totalItems),te(),ne()},appendItems(c){let n=()=>Math.max(0,x.getTotalSize()+r.mainAxisPadding-a.containerSize),m=r.reverse&&a.scrollPosition>=n()-1;if(S.push(...c),a.totalItems=S.length,x.rebuild(a.totalItems),te(),ne(),m)Se(n())},prependItems(c){let n=a.totalItems>0,m=x.getTotalSize();if(S.unshift(...c),a.totalItems=S.length,x.rebuild(a.totalItems),te(),ne(),!r.reverse||!n)return;let L=x.getTotalSize()-m;if(L<=0)return;let k=Math.max(0,x.getTotalSize()+r.mainAxisPadding-a.containerSize);Se(Math.min(a.scrollPosition+L,k))},updateItem(c,n){if(D){if(!D(c,n))return}else{let m=S.findIndex((L)=>L.id===c);if(m===-1)return;S[m]={...S[m],...n}}ne()},insertItem(c,n){if(K)K(c,n??a.totalItems);else{if(n===void 0)S.push(c);else S.splice(n,0,c);a.totalItems=S.length,x.rebuild(a.totalItems),te()}ne()},removeItem(c){if(w){if(w(c)<0)return}else{let n=S.findIndex((m)=>m.id===c);if(n===-1)return;S.splice(n,1),a.totalItems=S.length,x.rebuild(a.totalItems),te()}ne()},removeItems(c){if(w){let k=0;for(let Y of c)if(w(Y)>=0)k++;if(k>0)ne();return k}let n=new Set(c),m=S.length;S=S.filter((k)=>!n.has(k.id));let L=m-S.length;if(L>0)a.totalItems=S.length,x.rebuild(a.totalItems),te(),a.renderPending=!0,ye();return L},getItemAt(c){if(I.indexMap){let m=z.get("_getLoadedItem");return m?m(c):S[c]}let n=z.get("_getItemAtLayout");if(n){let m=z.get("_dataToLayoutIndex");return n(m?m(c):c)}return X?X(c):S[c]},getIndexById(c){if(q)return q(c);return S.findIndex((n)=>n.id===c)},scrollToIndex(c,n="start"){let m=Z?Z():S.length;if(m===0){Ce={index:c,alignOrOptions:n};return}let L=typeof n==="string"?n:n.align??"start",k=typeof n==="object"?n.behavior:void 0,Y=typeof n==="object"?n.duration:void 0,ie=typeof n==="object"?n.easing:void 0;if(Ve&&Ve(c,L,k,Y,ie)!==!1)return;let oe=Math.max(0,Math.min(c,m-1)),me=x.getOffset(oe),Ee=x.getSize(oe),Ae=a.containerSize,$t=x.getTotalSize(),bt=r.mainAxisPadding,Wt=Math.max(0,$t+bt-Ae),le;if(ke)le=ke(oe,x,Ae,m,L);else{let Ut=r.startPadding;switch(L){case"center":le=Ut+me-(Ae-Ee)/2;break;case"end":le=me+Ee+bt-Ae;break;default:le=me}le=Math.max(0,Math.min(le,Wt))}if(k==="smooth")ue.smoothScrollTo(le,Y??gt,Q??void 0,ie);else Se(le)},getScrollPosition(){return it.getPixelEquivalent()},on:f.on.bind(f),off:f.off.bind(f),destroy(){if(a.destroyed)return;if(a.destroyed=!0,ae)ae=!1,p.root.classList.remove(De);if(xe!==null)cancelAnimationFrame(xe),xe=null;if(j!==null)clearTimeout(j),j=null;ue.detach(),$e?.disconnect(),p.content.removeEventListener("click",dt),p.content.removeEventListener("dblclick",mt),p.content.removeEventListener("contextmenu",ft),p.root.removeEventListener("keydown",pt);let c=[];be(c);for(let[,n]of P)n.remove();if(P.clear(),R.clear(),p.root.remove(),f.emit("destroy",void 0),f.clear(),c.length>0)for(let n of c)console.error("vlist: error during destroy:",n)}};for(let[c,n]of z){if(c.startsWith("_"))continue;We[c]=n}return We}var Re=new Int32Array(0),Le=[];function cn(e,t,o,i,r){if(t===0||e.size===0)return;let u=e.size;if(Re.length<u)Re=new Int32Array(u);if(Le.length<u)Le.length=u;let l=0;for(let[h,f]of e)Re[l]=h,Le[l]=f,l++;e.clear();let d=o+"-item-",y=i.getAttribute("aria-activedescendant"),C=null,v=r&&t&1;for(let h=0;h<u;h++){let f=Re[h],I=Le[h];Le[h]=void 0;let _=f-t;if(e.set(_,I),y!==null&&I.id===y)C=I;if(I.id===d+f)I.id=d+_;if(v)I.classList.toggle(r)}if(C!==null)i.setAttribute("aria-activedescendant",C.id)}function dn(e,t,o){if(t===0&&o===0)return;e.prevRangeStart-=t,e.prevRangeEnd-=t,e.startIndex-=t,e.prevBaseOffset-=o;let i=e.visibleCount;for(let r=0;r<i;r++)e.visibleIndices[r]-=t,e.visibleOffsets[r]-=o}function Ft(e,t){let o=t>1?Math.trunc(e):Math.floor(e);return Math.abs(o)<t?0:o}function kt(e,t,o,i,r,u,l){let d=e.lapSize(),y=e.itemsPerLap(),C=d>0?Math.round(t/d)*y:0;if(C===0)return;if(r)cn(r,C,u,i,l);dn(o,C,t)}var Dt=1,Nt=2;var Vt=(e)=>1-(1-e)**3;function Bt({getMax:e,onChange:t=()=>{},onFinish:o,axis:i="y",reducedMotion:r}){let u=0,l=0,d=null,y=0,C=0,v=0,h=0,f=0,I=null,_=0,M=0,p=0,B=0,x=400,R=Vt,H=()=>p,a=0.006,S=(g)=>{let E=e();return Number.isFinite(E)?Math.max(0,Math.min(E,g)):g},O=(g,E)=>i==="y"?E:g,P=(g,E)=>i==="y"?g:E;function A(g){let E=S(g);if(E!==u)u=E,t(u);return E!==g}function b(){f=0,l=d===null?0:5}function W(g){b(),A(g)}return{get position(){return u},get state(){return l},get velocity(){return f},get active(){return l===3||l===4},begin(g,E,V,F){if(d!==null){b();return}b(),d=g,y=v=O(E,V),C=P(E,V),h=F,l=1},move(g,E,V,F){if(g!==d||l!==1&&l!==2)return!1;let N=O(E,V);if(l===1){let z=Math.abs(N-y),G=Math.abs(P(E,V)-C);if(Math.max(z,G)<6)return!1;if(G>z*1.2)return b(),!1;if(z<G*1.2)return!1;l=2}let j=v-N,T=F-h;if(T>0){let z=Math.max(-3,Math.min(3,j/T));f=T>80?0:z*f<0?z:0.65*z+0.35*f}if(v=N,h=F,A(u+j))f=0;return!0},end(g,E){if(g!==d)return;if(d=null,l===2&&!r()&&E-h<=80&&Math.abs(f)>=0.02)I=null,l=3;else f=0,l=0},cancel:b,reset(){d=null,b()},jump:W,shiftBy(g){M+=g,B+=g,A(u+g)},by(g){b();let E=u;return A(u+g),u!==E},smooth(g,E=400,V=Vt){if(b(),B=0,H=typeof g==="function"?g:()=>g,d!==null||r()||E<=0){A(H());return}x=E,R=V,M=u,p=S(H()+B),I=null,l=4},resize(){b(),A(u)},tick(g){if(l!==3&&l!==4)return;if(I===null){if(I=g,l===4)_=g;return}let E=g-I;if(E<=0)return;if(I=g,E>100){if(l===4)A(S(H()+B)),l=0,o?.();else b();return}if(l===4){p=S(H()+B);let N=Math.min(1,(g-_)/x);if(A(M+(p-M)*R(N)),N===1)l=0,o?.();return}let V=Math.exp(-a*E),F=A(u+f*(1-V)/a);if(f*=V,F||Math.abs(f)<0.02)f=0,l=0}}}var Oe=(e)=>e.pointerType==="touch"||e.pointerType==="pen";function Ze(e){if(e.closest("textarea,select,[contenteditable]:not([contenteditable=false])"))return!0;let t=e.closest("input");return!!t&&!/^(button|submit|reset|checkbox|radio|image)$/.test(t.type)}function Kt(e){let{state:t,viewport:o,content:i,isX:r,onFrame:u,onIdle:l,mainAxisPadding:d,wrap:y}=e,C=o.parentElement??o,v=o.ownerDocument.defaultView,h=o.ownerDocument,f=v.matchMedia("(prefers-reduced-motion: reduce)"),I=0,_=null,M=null,p=!1,B=!1,x=!1,R=-1,H=-1,a=null,S=null,O=!1,P=!1,A=!1,b=!1,W,g=new Set;function E(s){let w=t.scrollPosition;if(y){let K=y.lapSize(),D=K>0?Ft((s-y.home())/K,y.thresholdLaps):0;if(D!==0){let q=D*K;x=!0,T.shiftBy(-q),x=!1,s=T.position,w-=q,kt(y,q,t,i,e.rendered,e.classPrefix??"",e.oddClass),e.onFold?.(q),y.onFold?.(q)}}if(t.prevScrollPosition=w,t.scrollPosition=t.baseOffset=s,t.scrollDirection=s>w?1:s<w?-1:0,!B)u()}function V(){if(M=null,T.active||T.state===Nt||T.state===Dt)return;t.scrollDirection=0,l()}function F(){if(!p)return;if(M!==null)clearTimeout(M);M=setTimeout(V,e.idleTimeout||fe)}function N(){if(p&&_===null&&T.active)_=requestAnimationFrame(j)}function j(s){if(_=null,T.tick(s),T.active)N();else F()}let T=Bt({axis:r?"x":"y",getMax:()=>y?1/0:I,reducedMotion:()=>f.matches,onChange(s){if(!x)E(s)},onFinish(){let s=W;W=void 0,s?.()}});function z(){if(W=void 0,_!==null)cancelAnimationFrame(_),_=null;if(T.cancel(),M!==null)clearTimeout(M),M=null}function G(){if(z(),T.reset(),b&&a!==null&&o.hasPointerCapture(a))o.releasePointerCapture(a);b=!1,g.clear(),a=S=null,O=P=A=!1,F()}function se(s){if(!Oe(s))return;if(s.isPrimary){if(g.size)G();g.clear()}if(g.add(s.pointerId),g.size>1){A=!0,z();return}if(!(s.target instanceof Element)||Ze(s.target)){z();return}a=s.pointerId,O=!1,P=T.active,S=null,z(),T.begin(s.pointerId,s.clientX,s.clientY,s.timeStamp)}function pe(s){if(!Oe(s)||s.target instanceof Node&&o.contains(s.target))return;if(s.isPrimary&&g.size)G();else if(g.size)g.add(s.pointerId),A=!0,z()}function be(s){if(!Oe(s)||A)return;if(T.move(s.pointerId,s.clientX,s.clientY,s.timeStamp)){if(O=!0,!b)o.setPointerCapture(s.pointerId),b=!0;if(s.cancelable)s.preventDefault()}}function Z(s){if(!Oe(s)||!g.has(s.pointerId))return;let w=s.type==="pointercancel";if(w)z();if(a===s.pointerId){if(!w&&!A&&(O||P))S=s.pointerId;if(b&&o.hasPointerCapture(s.pointerId))o.releasePointerCapture(s.pointerId);b=!1,a=null,O=P=!1}if(T.end(s.pointerId,s.timeStamp),g.delete(s.pointerId),!g.size){if(A||w)T.reset();A=!1}N(),F()}function Q(s){let w=s.pointerId;if(s.detail!==0&&S!==null&&(w===S||w===void 0))S=null,s.preventDefault(),s.stopImmediatePropagation()}function ve(s){if(s.ctrlKey||s.defaultPrevented||!(s.target instanceof Element)||Ze(s.target))return;let w=s.deltaMode===1?16:s.deltaMode===2?t.containerSize:1,K=r?s.deltaX:s.deltaY,D=r?s.deltaY:s.deltaX,q=r?o.scrollHeight>o.clientHeight:o.scrollWidth>o.clientWidth;if(q&&Math.abs(D)>Math.abs(K))return;if(q&&D!==0)if(s.preventDefault(),r)o.scrollTop+=D*w;else o.scrollLeft+=D*w;let re=r&&!q&&K===0?D:K;if(z(),T.by(re*w))s.preventDefault();F()}function ce(s){if(s.defaultPrevented||s.ctrlKey||s.metaKey||s.altKey||!(s.target instanceof Element)||Ze(s.target))return;if((s.key===" "||s.key==="Enter")&&s.target.closest("button,summary,a,input"))return;let w=e.sizeCache,K=w.getSize(w.indexAtOffset(T.position)),D;if(s.key===(r?"ArrowRight":"ArrowDown"))D=T.position+K;if(s.key===(r?"ArrowLeft":"ArrowUp"))D=T.position-K;if(s.key==="PageDown"||s.key===" ")D=T.position+t.containerSize*(s.shiftKey&&s.key===" "?-1:1);if(s.key==="PageUp")D=T.position-t.containerSize;if(s.key==="Home")D=0;if(s.key==="End")D=I;if(D!==void 0)s.preventDefault(),de(D)}function ee(){if(h.hidden)G()}function de(s){let w=T.position;if(z(),T.jump(s),w===(y?s:Math.max(0,Math.min(I,s))))E(T.position);F()}function X(s){let w=R!==t.containerSize||H!==t.crossSize,K=s!==t.totalSize||w;if(R=t.containerSize,H=t.crossSize,t.totalSize=s,I=Math.max(0,s+d-t.containerSize),K){if(B=!0,w)z(),T.resize();else T.shiftBy(0);E(T.position),B=!1}}return{setLogical:de,refresh:X,shiftBy(s){if(t.totalSize=e.sizeCache.getTotalSize(),I=Math.max(0,t.totalSize+d-t.containerSize),T.shiftBy(s),!T.active)F()},cancelScroll(){z(),F()},getLogical:()=>t.scrollPosition,getMaxLogical:()=>I,smoothScrollTo(s,w,K,D=Me,q){if(z(),T.smooth(s,w,D),W=q,!T.active)W=void 0,q?.(),F();else N()},attach(){if(p)return;if(p=!0,o.style.overflowX=r?"hidden":"auto",o.style.overflowY=r?"auto":"hidden",o.style.touchAction=r?"pan-y pinch-zoom":"pan-x pinch-zoom",o.style.overflowAnchor="none",i.style[r?"width":"height"]="100%",i.style.overflow="clip",i.style.overflowAnchor="none",o.addEventListener("pointerdown",se),v.addEventListener("pointerdown",pe),o.addEventListener("pointermove",be,{passive:!1}),v.addEventListener("pointerup",Z),v.addEventListener("pointercancel",Z),o.addEventListener("click",Q,!0),e.wheelEnabled)o.addEventListener("wheel",ve,{passive:!1});C.addEventListener("keydown",ce),v.addEventListener("blur",G),h.addEventListener("visibilitychange",ee),f.addEventListener("change",G),N()},detach(){if(p=!1,G(),M!==null)clearTimeout(M),M=null;o.removeEventListener("pointerdown",se),v.removeEventListener("pointerdown",pe),o.removeEventListener("pointermove",be),v.removeEventListener("pointerup",Z),v.removeEventListener("pointercancel",Z),o.removeEventListener("click",Q,!0),o.removeEventListener("wheel",ve),C.removeEventListener("keydown",ce),v.removeEventListener("blur",G),h.removeEventListener("visibilitychange",ee),f.removeEventListener("change",G),o.style.overflowX=o.style.overflowY=o.style.touchAction=o.style.overflowAnchor="",i.style.overflow=i.style.overflowAnchor=""}}}function ro(e,t=[]){return Ot(e,t,Kt)}export{ro as createVList};
|
package/dist/types.d.ts
CHANGED
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** Base event map with index signature */
|
|
6
6
|
export type EventMap = Record<string, unknown>;
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Base item interface: an item only has to carry an id. Plugins that read
|
|
9
|
+
* arbitrary fields (search, table, tree) narrow the item themselves, so an
|
|
10
|
+
* ordinary `interface Row { id: number; name: string }` satisfies this.
|
|
11
|
+
*/
|
|
8
12
|
export interface VListItem {
|
|
9
13
|
id: string | number;
|
|
10
|
-
[key: string]: unknown;
|
|
11
14
|
}
|
|
12
15
|
/** Groups configuration for createVList */
|
|
13
16
|
export interface GroupHeaderConfig {
|
|
@@ -35,7 +38,7 @@ export interface GroupHeaderConfig {
|
|
|
35
38
|
*/
|
|
36
39
|
template: (group: string, groupIndex: number) => string | HTMLElement;
|
|
37
40
|
}
|
|
38
|
-
export interface GroupsConfig {
|
|
41
|
+
export interface GroupsConfig<T extends VListItem = VListItem> {
|
|
39
42
|
/**
|
|
40
43
|
* Determine which group an item belongs to.
|
|
41
44
|
* Called with the DATA index (index into the original items array).
|
|
@@ -51,7 +54,7 @@ export interface GroupsConfig {
|
|
|
51
54
|
* @param index - Data index of the item
|
|
52
55
|
* @param item - The item at this index (always provided; undefined only for unloaded async items)
|
|
53
56
|
*/
|
|
54
|
-
getGroupForIndex: (index: number, item?:
|
|
57
|
+
getGroupForIndex: (index: number, item?: T) => string;
|
|
55
58
|
/**
|
|
56
59
|
* Group header configuration — mirrors the `item` config shape.
|
|
57
60
|
*/
|
|
@@ -341,20 +344,6 @@ export type ScrollbarPadding = number | {
|
|
|
341
344
|
bottom?: number;
|
|
342
345
|
left?: number;
|
|
343
346
|
};
|
|
344
|
-
/**
|
|
345
|
-
* Scrollbar configuration.
|
|
346
|
-
* @deprecated Use `scroll.scrollbar` in `ScrollConfig` instead.
|
|
347
|
-
*/
|
|
348
|
-
export interface ScrollbarConfig {
|
|
349
|
-
/** Enable scrollbar (default: true) */
|
|
350
|
-
enabled?: boolean;
|
|
351
|
-
/** Auto-hide scrollbar after idle (default: true) */
|
|
352
|
-
autoHide?: boolean;
|
|
353
|
-
/** Auto-hide delay in milliseconds (default: 1000) */
|
|
354
|
-
autoHideDelay?: number;
|
|
355
|
-
/** Minimum thumb size in pixels (default: 30) */
|
|
356
|
-
minThumbSize?: number;
|
|
357
|
-
}
|
|
358
347
|
/** Item template function */
|
|
359
348
|
export type ItemTemplate<T = VListItem> = (item: T, index: number, state: ItemState) => string | HTMLElement;
|
|
360
349
|
/** Tree-specific state available in templates when the tree plugin is active */
|
|
@@ -468,19 +457,23 @@ export interface ErrorViewportSnapshot {
|
|
|
468
457
|
}
|
|
469
458
|
/** Event types and their payloads */
|
|
470
459
|
export interface VListEvents<T extends VListItem = VListItem> extends EventMap {
|
|
471
|
-
/**
|
|
460
|
+
/**
|
|
461
|
+
* Item clicked. `index` is the DATA index — what `getItemAt`,
|
|
462
|
+
* `scrollToIndex` and `removeItem` take — not the layout index, which counts
|
|
463
|
+
* group headers and carousel laps as well.
|
|
464
|
+
*/
|
|
472
465
|
"item:click": {
|
|
473
466
|
item: T;
|
|
474
467
|
index: number;
|
|
475
468
|
event: MouseEvent;
|
|
476
469
|
};
|
|
477
|
-
/** Item double-clicked */
|
|
470
|
+
/** Item double-clicked. `index` is the data index, as for `item:click`. */
|
|
478
471
|
"item:dblclick": {
|
|
479
472
|
item: T;
|
|
480
473
|
index: number;
|
|
481
474
|
event: MouseEvent;
|
|
482
475
|
};
|
|
483
|
-
/** Item right-clicked */
|
|
476
|
+
/** Item right-clicked. `index` is the data index, as for `item:click`. */
|
|
484
477
|
"item:contextmenu": {
|
|
485
478
|
item: T;
|
|
486
479
|
index: number;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist/utils — Scroll behavior
|
|
3
|
+
*
|
|
4
|
+
* Core animates `{ behavior: "smooth" }` with `SCROLL_DURATION` when the
|
|
5
|
+
* caller omits `duration`, and it forwards `easing`. Layout plugins that
|
|
6
|
+
* replace `scrollToIndex` have to do the same, or a smooth call with no
|
|
7
|
+
* duration jumps.
|
|
8
|
+
*/
|
|
9
|
+
type ScrollTarget = {
|
|
10
|
+
to(position: number): void;
|
|
11
|
+
smoothTo(target: number, duration: number, easing?: (t: number) => number): void;
|
|
12
|
+
};
|
|
13
|
+
export declare function applyScrollBehavior(scroll: ScrollTarget, position: number, behavior?: string, duration?: number, easing?: (t: number) => number): void;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=apply-scroll-behavior.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist/utils — Scroll Padding Protocol
|
|
3
|
+
*
|
|
4
|
+
* page() keeps a band of the window clear at each end of the main axis — a
|
|
5
|
+
* sticky site header, a floating toolbar — and applies it to every scroll it
|
|
6
|
+
* computes. Layout plugins take over those computations: groups() and
|
|
7
|
+
* masonry() both override `_scrollItemIntoView` and install their own
|
|
8
|
+
* `setToIndexFn`, because only they know where an entry actually sits.
|
|
9
|
+
*
|
|
10
|
+
* So the band is published through the `_getScrollPadding` hook rather than
|
|
11
|
+
* baked into page's own scroll code alone, and the plugins that displace page
|
|
12
|
+
* read it back and fold it into their geometry. Without the hook a caller's
|
|
13
|
+
* `scrollPadding` silently disappeared as soon as either plugin was seated.
|
|
14
|
+
*/
|
|
15
|
+
import type { PluginContext } from "../core/types";
|
|
16
|
+
import type { VListItem } from "../types";
|
|
17
|
+
/** Band to keep clear at each end of the main axis, in pixels. */
|
|
18
|
+
export interface ScrollPadding {
|
|
19
|
+
/** Top (vertical) or left (horizontal). */
|
|
20
|
+
readonly start: number;
|
|
21
|
+
/** Bottom (vertical) or right (horizontal). */
|
|
22
|
+
readonly end: number;
|
|
23
|
+
}
|
|
24
|
+
/** Internal hook name carrying the band across plugins. */
|
|
25
|
+
export declare const SCROLL_PADDING_HOOK = "_getScrollPadding";
|
|
26
|
+
/** No padding — the shape every list without page() sees. */
|
|
27
|
+
export declare const NO_SCROLL_PADDING: ScrollPadding;
|
|
28
|
+
/**
|
|
29
|
+
* Read the published scroll padding, or zero when no plugin publishes one.
|
|
30
|
+
*
|
|
31
|
+
* The hook is resolved on first read instead of during setup: the publisher is
|
|
32
|
+
* not guaranteed to be seated first. The band itself is read on every call,
|
|
33
|
+
* since page() accepts functions that measure a sticky header each time.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createScrollPaddingReader<T extends VListItem>(ctx: PluginContext<T>): () => ScrollPadding;
|
|
36
|
+
//# sourceMappingURL=scroll-padding.d.ts.map
|
package/dist/utils/stats.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface StatsConfig {
|
|
2
|
-
/** Returns the
|
|
2
|
+
/** Returns the unscaled logical position, normally list.getScrollPosition(). */
|
|
3
3
|
getScrollPosition: () => number;
|
|
4
4
|
/** Returns the total number of items */
|
|
5
5
|
getTotal: () => number;
|
|
@@ -33,6 +33,14 @@ export interface Stats {
|
|
|
33
33
|
*
|
|
34
34
|
* All inputs are provided via callbacks so the tracker always reflects
|
|
35
35
|
* the latest values without needing to be recreated when the list changes.
|
|
36
|
+
* Position is an unscaled logical offset on both native and synthetic entries,
|
|
37
|
+
* clamped to the declared content's real scroll range. Progress counts items up
|
|
38
|
+
* to the viewport end (including partial rows), rather than just scroll distance.
|
|
39
|
+
*
|
|
40
|
+
* Native content beyond the browser limit still uses its full declared size:
|
|
41
|
+
* a browser-clamped position is not expanded to the end, so progress may never
|
|
42
|
+
* reach 100%. Handle the core's `content:size:overflow` error and use
|
|
43
|
+
* `vlist/synthetic` when the full range must remain reachable.
|
|
36
44
|
*
|
|
37
45
|
* ```ts
|
|
38
46
|
* const stats = createStats({
|
package/dist/vlist-tree.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.vlist--tree{--vlist-item-padding-x:0;--vlist-item-padding-y:0;--vlist-transition-duration:0ms}.vlist--tree .vlist-item{border-bottom:none}.vlist-tree-node--loading .vlist-tree-chevron,.vlist-tree-node--loading [class*="chevron"]{animation:vlist-tree-spin 0.8s linear infinite}@keyframes vlist-tree-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.vlist--tree-lines .vlist-tree-node::before{content:"";position:absolute;top:0;bottom:0;left:var(--vlist-tree-guide-start,calc(var(--vlist-tree-indent) / 2));width:calc(var(--vlist-tree-depth) * var(--vlist-tree-indent));background-image:
|
|
1
|
+
.vlist--tree{--vlist-item-padding-x:0;--vlist-item-padding-y:0;--vlist-transition-duration:0ms}.vlist--tree .vlist-item{border-bottom:none}.vlist-tree-node--loading .vlist-tree-chevron,.vlist-tree-node--loading [class*="chevron"]{animation:vlist-tree-spin 0.8s linear infinite}@keyframes vlist-tree-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.vlist--tree-lines .vlist-tree-node::before{content:"";position:absolute;top:0;bottom:0;left:var(--vlist-tree-guide-start,calc(var(--vlist-tree-indent) / 2));width:calc(var(--vlist-tree-depth) * var(--vlist-tree-indent));background-image:var(--vlist-tree-guides,none),var(--vlist-tree-elbow,none);background-repeat:no-repeat;background-size:100% 100%,1px 50%;background-position:left top,calc((var(--vlist-tree-depth) - 1) * var(--vlist-tree-indent)) top;opacity:0.12;pointer-events:none}.vlist--tree-lines .vlist-tree-node::after{content:"";position:absolute;top:50%;left:calc(var(--vlist-tree-guide-start,calc(var(--vlist-tree-indent) / 2)) + (var(--vlist-tree-depth) - 1) * var(--vlist-tree-indent));width:calc(var(--vlist-tree-indent) / 2 - 2px);height:1px;background:var(--vlist-tree-line,currentColor);opacity:0.12;pointer-events:none}.vlist--tree-lines .vlist-tree-node[style*="--vlist-tree-depth:0"]::after,.vlist--tree-lines .vlist-tree-node[style*="--vlist-tree-depth:0"]::after{display:none}
|
package/dist/vlist.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@keyframes vlist-fade-in{from{opacity:0.6}to{opacity:1}}@keyframes vlist-placeholder-pulse{0%,100%{opacity:0.6}50%{opacity:0.4}}:root{--vlist-scrollbar-width:8px;--vlist-scrollbar-track-color:transparent;--vlist-scrollbar-radius:4px;--vlist-custom-scrollbar-track-color:transparent;--vlist-custom-scrollbar-padding-top:2px;--vlist-custom-scrollbar-padding-right:2px;--vlist-custom-scrollbar-padding-bottom:2px;--vlist-custom-scrollbar-padding-left:2px;--vlist-custom-scrollbar-min-thumb-size:15px;--vlist-item-padding-x:1rem;--vlist-item-padding-y:0.75rem;--vlist-border-radius:0.5rem;--vlist-transition-duration:150ms;--vlist-transition-timing:ease-in-out;--vlist-bg:#ffffff;--vlist-bg-hover:rgba(0,0,0,0.04);--vlist-bg-striped:rgba(0,0,0,0.02);--vlist-bg-selected:rgba(59,130,246,0.12);--vlist-bg-selected-hover:rgba(59,130,246,0.18);--vlist-border:#e5e7eb;--vlist-border-selected:#3b82f6;--vlist-text:#111827;--vlist-text-muted:#6b7280;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#f3f4f6;--vlist-scrollbar-thumb-color:#d1d5db;--vlist-scrollbar-thumb-hover-color:#9ca3af;--vlist-custom-scrollbar-thumb-color:rgba(0,0,0,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(0,0,0,0.3);--vlist-placeholder-bg:rgba(0,0,0,0.2);--vlist-placeholder-bg-strong:rgba(0,0,0,0.24)}[data-theme-mode="dark"]{--vlist-bg:#111827;--vlist-bg-hover:rgba(255,255,255,0.06);--vlist-bg-striped:rgba(255,255,255,0.02);--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.28);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#1e2433;--vlist-scrollbar-thumb-color:#4b5563;--vlist-scrollbar-thumb-hover-color:#6b7280;--vlist-custom-scrollbar-thumb-color:rgba(255,255,255,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(255,255,255,0.3);--vlist-placeholder-bg:rgba(255,255,255,0.3);--vlist-placeholder-bg-strong:rgba(255,255,255,0.35)}@media (prefers-color-scheme:dark){:root:not([data-theme-mode="light"]):not([data-theme-mode="dark"]){--vlist-bg:#111827;--vlist-bg-hover:rgba(255,255,255,0.06);--vlist-bg-striped:rgba(255,255,255,0.02);--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.28);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#1e2433;--vlist-scrollbar-thumb-color:#4b5563;--vlist-scrollbar-thumb-hover-color:#6b7280;--vlist-custom-scrollbar-thumb-color:rgba(255,255,255,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(255,255,255,0.3);--vlist-placeholder-bg:rgba(255,255,255,0.3);--vlist-placeholder-bg-strong:rgba(255,255,255,0.35)}}.dark{--vlist-bg:#111827;--vlist-bg-hover:rgba(255,255,255,0.06);--vlist-bg-striped:rgba(255,255,255,0.02);--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.28);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#1e2433;--vlist-scrollbar-thumb-color:#4b5563;--vlist-scrollbar-thumb-hover-color:#6b7280;--vlist-custom-scrollbar-thumb-color:rgba(255,255,255,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(255,255,255,0.3);--vlist-placeholder-bg:rgba(255,255,255,0.3);--vlist-placeholder-bg-strong:rgba(255,255,255,0.35)}.vlist{position:relative;width:100%;height:100%;box-sizing:border-box;overflow:hidden;background-color:var(--vlist-bg);color:var(--vlist-text);color-scheme:light;border:1px solid var(--vlist-border);border-radius:var(--vlist-border-radius);outline:none}[data-theme-mode="dark"] .vlist,.dark .vlist{color-scheme:dark}@media (prefers-color-scheme:dark){:root:not([data-theme-mode="light"]) .vlist{color-scheme:dark}}.vlist:focus,.vlist:focus-visible,.vlist-content:focus,.vlist-content:focus-visible{outline:none}.vlist-viewport{width:100%;height:100%;overflow:auto;scrollbar-color:var(--vlist-scrollbar-thumb-color) var(--vlist-scrollbar-track-color)}@supports (-moz-appearance:none) and (scrollbar-width:1px){.vlist-viewport{scrollbar-width:var(--vlist-scrollbar-width)}}.vlist-viewport::-webkit-scrollbar{width:var(--vlist-scrollbar-width);height:var(--vlist-scrollbar-width)}.vlist-viewport::-webkit-scrollbar-track{background:var(--vlist-scrollbar-track-color)}.vlist-viewport::-webkit-scrollbar-thumb{background-color:var(--vlist-scrollbar-thumb-color);border-radius:var(--vlist-scrollbar-radius)}.vlist-viewport::-webkit-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-thumb-hover-color)}.vlist-content{position:relative;width:100%;contain:layout style}.vlist-item,.vlist-group-header{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;background-color:var(--vlist-bg);cursor:default;user-select:none;opacity:1;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing),opacity var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;will-change:transform}.vlist--scrolling .vlist-item,.vlist--settling .vlist-item,.vlist--scrolling .vlist-group-header,.vlist--settling .vlist-group-header{transition:none}.vlist--selectable .vlist-item{cursor:pointer}.vlist--selectable .vlist-item:hover{background-color:var(--vlist-bg-hover)}.vlist-item.vlist-item--odd{background:var(--vlist-bg-striped)}.vlist-item.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-item.vlist-item--odd.vlist-item--selected{background:var(--vlist-bg-selected)}.vlist-item.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-item.vlist-item--odd.vlist-item--selected:hover{background:var(--vlist-bg-selected-hover)}.vlist-item.vlist-item--focused{outline:2px solid var(--vlist-focus-ring,#3b82f6);outline-offset:-2px;z-index:1}.vlist-item--replaced{animation:vlist-fade-in 0.3s ease-out}.vlist-item--placeholder{opacity:0.6;animation:vlist-placeholder-pulse 2s ease-in-out infinite}.vlist-item--placeholder *:not(:has(*)){color:transparent;background-color:var(--vlist-placeholder-bg);border-radius:4px;width:fit-content;line-height:1.2;transform:scaleY(0.8)}.vlist-item--placeholder:is(strong,b,h1,h2,h3,h4):not(:has(*)){background-color:var(--vlist-placeholder-bg-strong)}.vlist-item.vlist-item--selected.vlist-item--focused{outline-color:var(--vlist-border-selected)}.vlist-scrollbar:focus-visible{outline:2px solid currentColor;outline-offset:-2px;opacity:1;pointer-events:auto}.vlist-scrollbar{position:absolute;top:var(--vlist-custom-scrollbar-padding-top);right:var(--vlist-custom-scrollbar-padding-right);bottom:var(--vlist-custom-scrollbar-padding-bottom);width:var(--vlist-custom-scrollbar-width);background-color:var(--vlist-custom-scrollbar-track-color);opacity:0;transition:opacity 0.2s ease-out;touch-action:none;z-index:10;pointer-events:none}.vlist-scrollbar__hover{position:absolute;top:0;right:0;height:100%;z-index:9;touch-action:none;pointer-events:auto}.vlist-scrollbar__hover--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:auto}.vlist-scrollbar--visible{opacity:1;pointer-events:auto}.vlist-scrollbar__thumb{position:absolute;top:0;left:0;right:0;width:100%;background-color:var(--vlist-custom-scrollbar-thumb-color);border-radius:var(--vlist-custom-scrollbar-radius);cursor:pointer;transition:background-color 0.15s ease-out}.vlist-scrollbar__thumb:hover{background-color:var(--vlist-custom-scrollbar-thumb-hover-color)}.vlist-scrollbar--dragging{opacity:1;pointer-events:auto}.vlist-scrollbar--dragging .vlist-scrollbar__thumb{background-color:var(--vlist-custom-scrollbar-thumb-hover-color)}@media (forced-colors:active){.vlist-scrollbar{forced-color-adjust:none;background-color:Canvas}.vlist-scrollbar__thumb{background-color:CanvasText}.vlist-scrollbar__thumb:hover,.vlist-scrollbar--dragging .vlist-scrollbar__thumb{background-color:Highlight}.vlist-scrollbar:focus-visible{outline-color:Highlight}}.vlist-group-header{cursor:default;background-color:var(--vlist-group-header-bg,#f3f4f6);z-index:1;overflow:hidden}.vlist-group-header:hover{background-color:var(--vlist-group-header-bg,#f3f4f6)}.vlist-sticky-header{left:0;right:0;background-color:var(--vlist-group-header-bg,#f3f4f6)}.vlist--horizontal{overflow:hidden}.vlist--horizontal .vlist-viewport{overflow-x:auto;overflow-y:hidden}.vlist--horizontal .vlist-content{height:100%;width:auto}.vlist--horizontal .vlist-item,.vlist--horizontal .vlist-group-header{position:absolute;top:0;bottom:0;left:0;right:auto;display:flex;align-items:center;justify-content:center;border-bottom:none}.vlist-scrollbar--horizontal{top:auto;left:var(--vlist-custom-scrollbar-padding-left);right:var(--vlist-custom-scrollbar-padding-right);bottom:var(--vlist-custom-scrollbar-padding-bottom);width:auto;height:var(--vlist-custom-scrollbar-width)}.vlist-scrollbar--horizontal .vlist-scrollbar__thumb{top:0;left:0;width:auto;height:100%}.vlist-viewport--gutter{padding-right:calc( var(--vlist-custom-scrollbar-padding-right) + var(--vlist-custom-scrollbar-width) + var(--vlist-custom-scrollbar-padding-left) )}.vlist--horizontal .vlist-viewport--gutter{padding-right:0;padding-bottom:calc( var(--vlist-custom-scrollbar-padding-bottom) + var(--vlist-custom-scrollbar-width) + var(--vlist-custom-scrollbar-padding-top) )}.vlist-viewport--custom-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--custom-scrollbar::-webkit-scrollbar{display:none}.vlist-viewport--no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--no-scrollbar::-webkit-scrollbar{display:none}.vlist-viewport--gutter-stable{scrollbar-gutter:stable}.vlist-sort-ghost{opacity:0.85;box-shadow:0 4px 16px rgba(0,0,0,0.18);cursor:grabbing}.vlist-item--drag-source{opacity:0 !important;pointer-events:none}.vlist--sorting{cursor:grabbing;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.vlist--sorting *{cursor:inherit !important}.vlist-item--kb-sorting{outline:2px solid var(--vlist-focus-ring,#3b82f6);outline-offset:-2px;background-color:var(--vlist-bg-selected);z-index:1}
|
|
1
|
+
@keyframes vlist-fade-in{from{opacity:0.6}to{opacity:1}}@keyframes vlist-placeholder-pulse{0%,100%{opacity:0.6}50%{opacity:0.4}}:root{--vlist-scrollbar-width:8px;--vlist-scrollbar-track-color:transparent;--vlist-scrollbar-radius:4px;--vlist-custom-scrollbar-track-color:transparent;--vlist-custom-scrollbar-padding-top:2px;--vlist-custom-scrollbar-padding-right:2px;--vlist-custom-scrollbar-padding-bottom:2px;--vlist-custom-scrollbar-padding-left:2px;--vlist-custom-scrollbar-min-thumb-size:15px;--vlist-item-padding-x:1rem;--vlist-item-padding-y:0.75rem;--vlist-border-radius:0.5rem;--vlist-transition-duration:150ms;--vlist-transition-timing:ease-in-out;--vlist-bg:#ffffff;--vlist-bg-hover:rgba(0,0,0,0.04);--vlist-bg-striped:rgba(0,0,0,0.02);--vlist-bg-selected:rgba(59,130,246,0.12);--vlist-bg-selected-hover:rgba(59,130,246,0.18);--vlist-border:#e5e7eb;--vlist-border-selected:#3b82f6;--vlist-text:#111827;--vlist-text-muted:#6b7280;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#f3f4f6;--vlist-scrollbar-thumb-color:#d1d5db;--vlist-scrollbar-thumb-hover-color:#9ca3af;--vlist-custom-scrollbar-thumb-color:rgba(0,0,0,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(0,0,0,0.3);--vlist-placeholder-bg:rgba(0,0,0,0.2);--vlist-placeholder-bg-strong:rgba(0,0,0,0.24)}[data-theme-mode="dark"]{--vlist-bg:#111827;--vlist-bg-hover:rgba(255,255,255,0.06);--vlist-bg-striped:rgba(255,255,255,0.02);--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.28);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#1e2433;--vlist-scrollbar-thumb-color:#4b5563;--vlist-scrollbar-thumb-hover-color:#6b7280;--vlist-custom-scrollbar-thumb-color:rgba(255,255,255,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(255,255,255,0.3);--vlist-placeholder-bg:rgba(255,255,255,0.3);--vlist-placeholder-bg-strong:rgba(255,255,255,0.35)}@media (prefers-color-scheme:dark){:root:not([data-theme-mode="light"]):not([data-theme-mode="dark"]){--vlist-bg:#111827;--vlist-bg-hover:rgba(255,255,255,0.06);--vlist-bg-striped:rgba(255,255,255,0.02);--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.28);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#1e2433;--vlist-scrollbar-thumb-color:#4b5563;--vlist-scrollbar-thumb-hover-color:#6b7280;--vlist-custom-scrollbar-thumb-color:rgba(255,255,255,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(255,255,255,0.3);--vlist-placeholder-bg:rgba(255,255,255,0.3);--vlist-placeholder-bg-strong:rgba(255,255,255,0.35)}}.dark{--vlist-bg:#111827;--vlist-bg-hover:rgba(255,255,255,0.06);--vlist-bg-striped:rgba(255,255,255,0.02);--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.28);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-focus-ring:#3b82f6;--vlist-group-header-bg:#1e2433;--vlist-scrollbar-thumb-color:#4b5563;--vlist-scrollbar-thumb-hover-color:#6b7280;--vlist-custom-scrollbar-thumb-color:rgba(255,255,255,0.2);--vlist-custom-scrollbar-thumb-hover-color:rgba(255,255,255,0.3);--vlist-placeholder-bg:rgba(255,255,255,0.3);--vlist-placeholder-bg-strong:rgba(255,255,255,0.35)}.vlist{position:relative;width:100%;height:100%;box-sizing:border-box;overflow:hidden;background-color:var(--vlist-bg);color:var(--vlist-text);color-scheme:light;border:1px solid var(--vlist-border);border-radius:var(--vlist-border-radius);outline:none}[data-theme-mode="dark"] .vlist,.dark .vlist{color-scheme:dark}@media (prefers-color-scheme:dark){:root:not([data-theme-mode="light"]) .vlist{color-scheme:dark}}.vlist:focus,.vlist:focus-visible,.vlist-content:focus,.vlist-content:focus-visible{outline:none}.vlist-viewport{width:100%;height:100%;overflow:auto;scrollbar-color:var(--vlist-scrollbar-thumb-color) var(--vlist-scrollbar-track-color)}@supports (-moz-appearance:none) and (scrollbar-width:1px){.vlist-viewport{scrollbar-width:var(--vlist-scrollbar-width)}}.vlist-viewport::-webkit-scrollbar{width:var(--vlist-scrollbar-width);height:var(--vlist-scrollbar-width)}.vlist-viewport::-webkit-scrollbar-track{background:var(--vlist-scrollbar-track-color)}.vlist-viewport::-webkit-scrollbar-thumb{background-color:var(--vlist-scrollbar-thumb-color);border-radius:var(--vlist-scrollbar-radius)}.vlist-viewport::-webkit-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-thumb-hover-color)}.vlist-content{position:relative;width:100%;contain:layout style}.vlist-item,.vlist-group-header{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;background-color:var(--vlist-bg);cursor:default;user-select:none;opacity:1;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing),opacity var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;will-change:transform}.vlist--scrolling .vlist-item,.vlist--settling .vlist-item,.vlist--scrolling .vlist-group-header,.vlist--settling .vlist-group-header{transition:none}.vlist--selectable .vlist-item{cursor:pointer}.vlist--selectable .vlist-item:hover{background-color:var(--vlist-bg-hover)}.vlist-item>:only-child,.vlist-group-header>:only-child{flex:1 1 auto;min-width:0}.vlist-item.vlist-item--odd{background:var(--vlist-bg-striped)}.vlist-item.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-item.vlist-item--odd.vlist-item--selected{background:var(--vlist-bg-selected)}.vlist-item.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-item.vlist-item--odd.vlist-item--selected:hover{background:var(--vlist-bg-selected-hover)}.vlist-item.vlist-item--focused{outline:2px solid var(--vlist-focus-ring,#3b82f6);outline-offset:-2px;z-index:1}.vlist-item--replaced{animation:vlist-fade-in 0.3s ease-out}.vlist-item--placeholder{opacity:0.6;animation:vlist-placeholder-pulse 2s ease-in-out infinite}.vlist-item--placeholder *:not(:has(*)){color:transparent;background-color:var(--vlist-placeholder-bg);border-radius:4px;width:fit-content;line-height:1.2;transform:scaleY(0.8)}.vlist-item--placeholder:is(strong,b,h1,h2,h3,h4):not(:has(*)){background-color:var(--vlist-placeholder-bg-strong)}.vlist-item.vlist-item--selected.vlist-item--focused{outline-color:var(--vlist-border-selected)}.vlist-scrollbar:focus-visible{outline:2px solid currentColor;outline-offset:-2px;opacity:1;pointer-events:auto}.vlist-scrollbar{position:absolute;top:var(--vlist-custom-scrollbar-padding-top);right:var(--vlist-custom-scrollbar-padding-right);bottom:var(--vlist-custom-scrollbar-padding-bottom);width:var(--vlist-custom-scrollbar-width);background-color:var(--vlist-custom-scrollbar-track-color);opacity:0;transition:opacity 0.2s ease-out;touch-action:none;z-index:10;pointer-events:none}.vlist-scrollbar__hover{position:absolute;top:0;right:0;height:100%;z-index:9;touch-action:none;pointer-events:auto}.vlist-scrollbar__hover--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:auto}.vlist-scrollbar--visible{opacity:1;pointer-events:auto}.vlist-scrollbar__thumb{position:absolute;top:0;left:0;right:0;width:100%;background-color:var(--vlist-custom-scrollbar-thumb-color);border-radius:var(--vlist-custom-scrollbar-radius);cursor:pointer;transition:background-color 0.15s ease-out}.vlist-scrollbar__thumb:hover{background-color:var(--vlist-custom-scrollbar-thumb-hover-color)}.vlist-scrollbar--dragging{opacity:1;pointer-events:auto}.vlist-scrollbar--dragging .vlist-scrollbar__thumb{background-color:var(--vlist-custom-scrollbar-thumb-hover-color)}@media (forced-colors:active){.vlist-scrollbar{forced-color-adjust:none;background-color:Canvas}.vlist-scrollbar__thumb{background-color:CanvasText}.vlist-scrollbar__thumb:hover,.vlist-scrollbar--dragging .vlist-scrollbar__thumb{background-color:Highlight}.vlist-scrollbar:focus-visible{outline-color:Highlight}}.vlist-group-header{cursor:default;background-color:var(--vlist-group-header-bg,#f3f4f6);z-index:1;overflow:hidden}.vlist-group-header:hover{background-color:var(--vlist-group-header-bg,#f3f4f6)}.vlist-sticky-header{left:0;right:0;background-color:var(--vlist-group-header-bg,#f3f4f6)}.vlist--horizontal{overflow:hidden}.vlist--horizontal .vlist-viewport{overflow-x:auto;overflow-y:hidden}.vlist--horizontal .vlist-content{height:100%;width:auto}.vlist--horizontal .vlist-item,.vlist--horizontal .vlist-group-header{position:absolute;top:0;bottom:0;left:0;right:auto;display:flex;align-items:center;justify-content:center;border-bottom:none}.vlist-scrollbar--horizontal{top:auto;left:var(--vlist-custom-scrollbar-padding-left);right:var(--vlist-custom-scrollbar-padding-right);bottom:var(--vlist-custom-scrollbar-padding-bottom);width:auto;height:var(--vlist-custom-scrollbar-width)}.vlist-scrollbar--horizontal .vlist-scrollbar__thumb{top:0;left:0;width:auto;height:100%}.vlist-viewport--gutter{padding-right:calc( var(--vlist-custom-scrollbar-padding-right) + var(--vlist-custom-scrollbar-width) + var(--vlist-custom-scrollbar-padding-left) )}.vlist--horizontal .vlist-viewport--gutter{padding-right:0;padding-bottom:calc( var(--vlist-custom-scrollbar-padding-bottom) + var(--vlist-custom-scrollbar-width) + var(--vlist-custom-scrollbar-padding-top) )}.vlist-viewport--custom-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--custom-scrollbar::-webkit-scrollbar{display:none}.vlist-viewport--no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--no-scrollbar::-webkit-scrollbar{display:none}.vlist-viewport--gutter-stable{scrollbar-gutter:stable}.vlist-sort-ghost{opacity:0.85;box-shadow:0 4px 16px rgba(0,0,0,0.18);cursor:grabbing}.vlist-item--touch-sort{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.vlist-sort-ghost--touch{outline:2px solid var(--vlist-focus-ring,#3b82f6);outline-offset:2px}.vlist-item--drag-source{opacity:0 !important;pointer-events:none}.vlist--sorting{cursor:grabbing;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.vlist--sorting *{cursor:inherit !important}.vlist-item--kb-sorting{outline:2px solid var(--vlist-focus-ring,#3b82f6);outline-offset:-2px;background-color:var(--vlist-bg-selected);z-index:1}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vlist",
|
|
3
|
-
"version": "3.0.0-next.
|
|
3
|
+
"version": "3.0.0-next.4",
|
|
4
4
|
"description": "Lightweight, high-performance virtual list with zero dependencies",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Floor IO",
|
|
@@ -79,12 +79,15 @@
|
|
|
79
79
|
"dev": "bun run build.ts --watch",
|
|
80
80
|
"test": "bun test",
|
|
81
81
|
"test:changed": "bun test --changed",
|
|
82
|
-
"
|
|
82
|
+
"test:browser": "bun scripts/rtl-cross-axis-browser.mjs && bun scripts/synthetic-browser.mjs && bun scripts/synthetic-carousel-browser.mjs && bun scripts/synthetic-sortable-browser.mjs && bun scripts/select-next-browser.mjs && bun scripts/item-fill-browser.mjs",
|
|
83
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.types.json && tsc --noEmit -p tsconfig.test.json",
|
|
83
84
|
"bench": "bun run scripts/bench.ts",
|
|
84
85
|
"bench:quick": "bun run scripts/bench.ts --quick",
|
|
85
86
|
"bench:full": "bun run scripts/bench.ts --full",
|
|
86
87
|
"bench:compare": "bun run scripts/bench.ts --quick --compare",
|
|
87
88
|
"size": "bun run scripts/size.ts",
|
|
89
|
+
"heap": "bun run scripts/heap.ts",
|
|
90
|
+
"docs:check": "bun run scripts/docs-check.ts",
|
|
88
91
|
"release": "bun run scripts/release.ts",
|
|
89
92
|
"prepublishOnly": "bun run build -- --types && cp README.md README.github.md && cp npm-readme.md README.md",
|
|
90
93
|
"postpublish": "cp README.github.md README.md && rm README.github.md"
|
|
@@ -99,6 +102,7 @@
|
|
|
99
102
|
"@types/jsdom": "^27.0.0",
|
|
100
103
|
"happy-dom": "^20.9.0",
|
|
101
104
|
"jsdom": "^28.0.0",
|
|
105
|
+
"puppeteer-core": "^24.43.1",
|
|
102
106
|
"typescript": "^5.0.0"
|
|
103
107
|
}
|
|
104
108
|
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vlist - Grid Renderer
|
|
3
|
-
* Renders items in a 2D grid layout within the virtual scroll container.
|
|
4
|
-
*
|
|
5
|
-
* Extends the base renderer pattern but positions items using both
|
|
6
|
-
* row offsets (translateY from the size cache) and column offsets
|
|
7
|
-
* (translateX calculated from column index and container width).
|
|
8
|
-
*
|
|
9
|
-
* Key differences from the list renderer:
|
|
10
|
-
* - Items are positioned with translate(x, y) instead of just translateY(y)
|
|
11
|
-
* - Item width is set to columnWidth (containerWidth / columns - gaps)
|
|
12
|
-
* - The "index" in the rendered map is the FLAT ITEM INDEX (not row index)
|
|
13
|
-
* - Row offsets come from the size cache (which operates on row indices)
|
|
14
|
-
* - Column offsets are calculated from itemIndex % columns
|
|
15
|
-
*
|
|
16
|
-
* Performance:
|
|
17
|
-
* - Element pooling avoids createElement cost
|
|
18
|
-
* - Template re-evaluation skipped when item data + state unchanged (change tracking)
|
|
19
|
-
* - Position update skipped when coordinates unchanged (position tracking)
|
|
20
|
-
* - O(1) Set-based visibility diffing (not O(n) .some())
|
|
21
|
-
* - Release grace period prevents boundary thrashing (hover blink, transition replay)
|
|
22
|
-
* - Released elements removed from DOM immediately
|
|
23
|
-
* - DocumentFragment batched insertion for new elements
|
|
24
|
-
*/
|
|
25
|
-
import type { VListItem, ItemTemplate, Range } from "../../types";
|
|
26
|
-
import type { SizeCache } from "../../rendering/sizes";
|
|
27
|
-
import type { GridLayout } from "./types";
|
|
28
|
-
/** Grid renderer instance */
|
|
29
|
-
export interface GridRenderer<T extends VListItem = VListItem> {
|
|
30
|
-
/** Render items for a flat item range, positioned in a 2D grid */
|
|
31
|
-
render: (items: T[], range: Range, selectedIds: Set<string | number>, focusedIndex: number) => void;
|
|
32
|
-
/** Update a single item (used by selection feature for focused item changes) */
|
|
33
|
-
updateItem: (index: number, item: T, isSelected: boolean, isFocused: boolean) => void;
|
|
34
|
-
/** Update only CSS classes on a rendered item (no template re-evaluation) */
|
|
35
|
-
updateItemClasses: (index: number, isSelected: boolean, isFocused: boolean) => void;
|
|
36
|
-
/** Get rendered item element by flat item index */
|
|
37
|
-
getElement: (index: number) => HTMLElement | undefined;
|
|
38
|
-
/**
|
|
39
|
-
* Reorder DOM children to match logical item order (by data-index).
|
|
40
|
-
* Called on scroll idle so screen readers encounter items in the correct
|
|
41
|
-
* sequence. Items are position:absolute so visual layout is unaffected.
|
|
42
|
-
*/
|
|
43
|
-
sortDOM: () => void;
|
|
44
|
-
/** Update container width (call on resize) */
|
|
45
|
-
updateContainerWidth: (width: number) => void;
|
|
46
|
-
/** Clear all rendered items */
|
|
47
|
-
clear: () => void;
|
|
48
|
-
/** Destroy renderer and cleanup */
|
|
49
|
-
destroy: () => void;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Create a grid renderer for managing DOM elements in a 2D layout.
|
|
53
|
-
*
|
|
54
|
-
* The grid renderer receives flat item ranges (not row ranges) and
|
|
55
|
-
* positions each item at the correct (row, col) coordinate.
|
|
56
|
-
*
|
|
57
|
-
* @param itemsContainer - The DOM element that holds rendered items
|
|
58
|
-
* @param template - Item template function
|
|
59
|
-
* @param sizeCache - Size cache operating on ROW indices
|
|
60
|
-
* @param gridLayout - Grid layout for row/col calculations
|
|
61
|
-
* @param classPrefix - CSS class prefix
|
|
62
|
-
* @param initialContainerWidth - Initial container width for column sizing
|
|
63
|
-
* @param totalItemsGetter - Optional getter for total item count (for aria-setsize)
|
|
64
|
-
* @param ariaIdPrefix - Optional unique prefix for element IDs (for aria-activedescendant)
|
|
65
|
-
* @param isHorizontal - Whether layout is horizontal (scrolls right)
|
|
66
|
-
*/
|
|
67
|
-
export declare const createGridRenderer: <T extends VListItem = VListItem>(itemsContainer: HTMLElement, template: ItemTemplate<T>, sizeCache: SizeCache, gridLayout: GridLayout, classPrefix: string, initialContainerWidth: number, totalItemsGetter?: () => number, ariaIdPrefix?: string, isHorizontal?: boolean, ariaPosInSetGetter?: (layoutIndex: number) => number, interactive?: boolean) => GridRenderer<T>;
|
|
68
|
-
//# sourceMappingURL=renderer.d.ts.map
|