react-window 2.2.5-alpha.1 → 2.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/react-window.cjs +1 -1
- package/dist/react-window.cjs.map +1 -1
- package/dist/react-window.d.ts +4 -1
- package/dist/react-window.js +65 -60
- package/dist/react-window.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -167,6 +167,9 @@ The default value is "div", meaning that List renders an HTMLDivElemen
|
|
|
167
167
|
|
|
168
168
|
<!-- Grid:description:begin -->
|
|
169
169
|
Renders data with many rows and columns.
|
|
170
|
+
|
|
171
|
+
ℹ️ Unlike `List` rows, `Grid` cell sizes must be known ahead of time.
|
|
172
|
+
Either static sizes or something that can be derived (from the data in `CellProps`) without rendering.
|
|
170
173
|
<!-- Grid:description:end -->
|
|
171
174
|
|
|
172
175
|
#### Required props
|
|
@@ -207,7 +210,7 @@ Grid will automatically re-render cells when values in this object change.</p>
|
|
|
207
210
|
<ul>
|
|
208
211
|
<li>number of pixels (number)</li>
|
|
209
212
|
<li>percentage of the grid's current width (string)</li>
|
|
210
|
-
<li>function that returns the
|
|
213
|
+
<li>function that returns the column width (in pixels) given an index and <code>cellProps</code></li>
|
|
211
214
|
</ul>
|
|
212
215
|
</td>
|
|
213
216
|
</tr>
|
package/dist/react-window.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const J=require("react/jsx-runtime"),o=require("react");function ce(e){let t=e;for(;t;){if(t.dir)return t.dir==="rtl";t=t.parentElement}return!1}function ae(e,t){const[s,r]=o.useState(t==="rtl");return o.useLayoutEffect(()=>{e&&(t||r(ce(e)))},[t,e]),s}const _=typeof window<"u"?o.useLayoutEffect:o.useEffect;function ee(e){if(e!==void 0)switch(typeof e){case"number":return e;case"string":{if(e.endsWith("px"))return parseFloat(e);break}}}function ue({box:e,defaultHeight:t,defaultWidth:s,disabled:r,element:n,mode:i,style:l}){const{styleHeight:f,styleWidth:c}=o.useMemo(()=>({styleHeight:ee(l?.height),styleWidth:ee(l?.width)}),[l?.height,l?.width]),[u,d]=o.useState({height:t,width:s}),a=r||i==="only-height"&&f!==void 0||i==="only-width"&&c!==void 0||f!==void 0&&c!==void 0;return _(()=>{if(n===null||a)return;const g=new ResizeObserver(p=>{for(const I of p){const{contentRect:h,target:w}=I;n===w&&d(y=>y.height===h.height&&y.width===h.width?y:{height:h.height,width:h.width})}});return g.observe(n,{box:e}),()=>{g?.unobserve(n)}},[e,a,n,f,c]),o.useMemo(()=>({height:f??u.height,width:c??u.width}),[u,f,c])}function te(e){const t=o.useRef(()=>{throw new Error("Cannot call during render.")});return _(()=>{t.current=e},[e]),o.useCallback(s=>t.current?.(s),[t])}let D=null;function fe(e=!1){if(D===null||e){const t=document.createElement("div"),s=t.style;s.width="50px",s.height="50px",s.overflow="scroll",s.direction="rtl";const r=document.createElement("div"),n=r.style;return n.width="100px",n.height="100px",t.appendChild(r),document.body.appendChild(t),t.scrollLeft>0?D="positive-descending":(t.scrollLeft=1,t.scrollLeft===0?D="negative":D="positive-ascending"),document.body.removeChild(t),D}return D}function N({containerElement:e,direction:t,isRtl:s,scrollOffset:r}){if(t==="horizontal"&&s)switch(fe()){case"negative":return-r;case"positive-descending":{if(e){const{clientWidth:n,scrollLeft:i,scrollWidth:l}=e;return l-n-i}break}}return r}function V(e,t="Assertion error"){if(!e)throw console.error(t),Error(t)}function F(e,t){if(e===t)return!0;if(!!e!=!!t||(V(e!==void 0),V(t!==void 0),Object.keys(e).length!==Object.keys(t).length))return!1;for(const s in e)if(!Object.is(t[s],e[s]))return!1;return!0}function se({cachedBounds:e,itemCount:t,itemSize:s}){if(t===0)return 0;if(typeof s=="number")return t*s;{const r=e.get(e.size===0?0:e.size-1);V(r!==void 0,"Unexpected bounds cache miss");const n=(r.scrollOffset+r.size)/e.size;return t*n}}function de({align:e,cachedBounds:t,index:s,itemCount:r,itemSize:n,containerScrollOffset:i,containerSize:l}){if(s<0||s>=r)throw RangeError(`Invalid index specified: ${s}`,{cause:`Index ${s} is not within the range of 0 - ${r-1}`});const f=se({cachedBounds:t,itemCount:r,itemSize:n}),c=t.get(s),u=Math.max(0,Math.min(f-l,c.scrollOffset)),d=Math.max(0,c.scrollOffset-l+c.size);switch(e==="smart"&&(i>=d&&i<=u?e="auto":e="center"),e){case"start":return u;case"end":return d;case"center":return c.scrollOffset<=l/2?0:c.scrollOffset+c.size/2>=f-l/2?f-l:c.scrollOffset+c.size/2-l/2;case"auto":default:return i>=d&&i<=u?i:i<d?d:u}}function Y({cachedBounds:e,containerScrollOffset:t,containerSize:s,itemCount:r,overscanCount:n}){const i=r-1;let l=0,f=-1,c=0,u=-1,d=0;for(;d<i;){const a=e.get(d);if(a.scrollOffset+a.size>t)break;d++}for(l=d,c=Math.max(0,l-n);d<i;){const a=e.get(d);if(a.scrollOffset+a.size>=t+s)break;d++}return f=Math.min(i,d),u=Math.min(r-1,f+n),l<0&&(l=0,f=-1,c=0,u=-1),{startIndexVisible:l,stopIndexVisible:f,startIndexOverscan:c,stopIndexOverscan:u}}function he({itemCount:e,itemProps:t,itemSize:s}){const r=new Map;return{get(n){for(V(n<e,`Invalid index ${n}`);r.size-1<n;){const l=r.size;let f;switch(typeof s){case"function":{f=s(l,t);break}case"number":{f=s;break}}if(l===0)r.set(l,{size:f,scrollOffset:0});else{const c=r.get(l-1);V(c!==void 0,`Unexpected bounds cache miss for index ${n}`),r.set(l,{scrollOffset:c.scrollOffset+c.size,size:f})}}const i=r.get(n);return V(i!==void 0,`Unexpected bounds cache miss for index ${n}`),i},set(n,i){r.set(n,i)},get size(){return r.size}}}function ge({itemCount:e,itemProps:t,itemSize:s}){return o.useMemo(()=>he({itemCount:e,itemProps:t,itemSize:s}),[e,t,s])}function pe({containerSize:e,itemSize:t}){let s;switch(typeof t){case"string":{V(t.endsWith("%"),`Invalid item size: "${t}"; string values must be percentages (e.g. "100%")`),V(e!==void 0,"Container size must be defined if a percentage item size is specified"),s=e*parseInt(t)/100;break}default:{s=t;break}}return s}function K({containerElement:e,containerStyle:t,defaultContainerSize:s=0,direction:r,isRtl:n=!1,itemCount:i,itemProps:l,itemSize:f,onResize:c,overscanCount:u}){const{height:d=s,width:a=s}=ue({defaultHeight:r==="vertical"?s:void 0,defaultWidth:r==="horizontal"?s:void 0,element:e,mode:r==="vertical"?"only-height":"only-width",style:t}),g=o.useRef({height:0,width:0}),p=r==="vertical"?d:a,I=pe({containerSize:p,itemSize:f});o.useLayoutEffect(()=>{if(typeof c=="function"){const x=g.current;(x.height!==d||x.width!==a)&&(c({height:d,width:a},{...x}),x.height=d,x.width=a)}},[d,c,a]);const h=ge({itemCount:i,itemProps:l,itemSize:I}),w=o.useCallback(x=>h.get(x),[h]),[y,O]=o.useState(()=>Y({cachedBounds:h,containerScrollOffset:0,containerSize:p,itemCount:i,overscanCount:u})),{startIndexVisible:B,startIndexOverscan:b,stopIndexVisible:G,stopIndexOverscan:M}={startIndexVisible:Math.min(i-1,y.startIndexVisible),startIndexOverscan:Math.min(i-1,y.startIndexOverscan),stopIndexVisible:Math.min(i-1,y.stopIndexVisible),stopIndexOverscan:Math.min(i-1,y.stopIndexOverscan)},z=o.useCallback(()=>se({cachedBounds:h,itemCount:i,itemSize:I}),[h,i,I]),A=o.useCallback(x=>{const T=N({containerElement:e,direction:r,isRtl:n,scrollOffset:x});return Y({cachedBounds:h,containerScrollOffset:T,containerSize:p,itemCount:i,overscanCount:u})},[h,e,p,r,n,i,u]);_(()=>{const x=(r==="vertical"?e?.scrollTop:e?.scrollLeft)??0;O(A(x))},[e,r,A]),_(()=>{if(!e)return;const x=()=>{O(T=>{const{scrollLeft:R,scrollTop:v}=e,m=N({containerElement:e,direction:r,isRtl:n,scrollOffset:r==="vertical"?v:R}),k=Y({cachedBounds:h,containerScrollOffset:m,containerSize:p,itemCount:i,overscanCount:u});return F(k,T)?T:k})};return e.addEventListener("scroll",x),()=>{e.removeEventListener("scroll",x)}},[h,e,p,r,i,u]);const S=te(({align:x="auto",containerScrollOffset:T,index:R})=>{let v=de({align:x,cachedBounds:h,containerScrollOffset:T,containerSize:p,index:R,itemCount:i,itemSize:I});if(e){if(v=N({containerElement:e,direction:r,isRtl:n,scrollOffset:v}),typeof e.scrollTo!="function"){const m=A(v);F(y,m)||O(m)}return v}});return{getCellBounds:w,getEstimatedSize:z,scrollToIndex:S,startIndexOverscan:b,startIndexVisible:B,stopIndexOverscan:M,stopIndexVisible:G}}function re(e){return o.useMemo(()=>e,Object.values(e))}function ne(e,t){const{ariaAttributes:s,style:r,...n}=e,{ariaAttributes:i,style:l,...f}=t;return F(s,i)&&F(r,l)&&F(n,f)}function xe({cellComponent:e,cellProps:t,children:s,className:r,columnCount:n,columnWidth:i,defaultHeight:l=0,defaultWidth:f=0,dir:c,gridRef:u,onCellsRendered:d,onResize:a,overscanCount:g=3,rowCount:p,rowHeight:I,style:h,tagName:w="div",...y}){const O=re(t),B=o.useMemo(()=>o.memo(e,ne),[e]),[b,G]=o.useState(null),M=ae(b,c),{getCellBounds:z,getEstimatedSize:A,startIndexOverscan:S,startIndexVisible:x,scrollToIndex:T,stopIndexOverscan:R,stopIndexVisible:v}=K({containerElement:b,containerStyle:h,defaultContainerSize:f,direction:"horizontal",isRtl:M,itemCount:n,itemProps:O,itemSize:i,onResize:a,overscanCount:g}),{getCellBounds:m,getEstimatedSize:k,startIndexOverscan:L,startIndexVisible:Z,scrollToIndex:C,stopIndexOverscan:U,stopIndexVisible:P}=K({containerElement:b,containerStyle:h,defaultContainerSize:l,direction:"vertical",itemCount:p,itemProps:O,itemSize:I,onResize:a,overscanCount:g});o.useImperativeHandle(u,()=>({get element(){return b},scrollToCell({behavior:$="auto",columnAlign:E="auto",columnIndex:H,rowAlign:j="auto",rowIndex:W}){const q=T({align:E,containerScrollOffset:b?.scrollLeft??0,index:H}),le=C({align:j,containerScrollOffset:b?.scrollTop??0,index:W});typeof b?.scrollTo=="function"&&b.scrollTo({behavior:$,left:q,top:le})},scrollToColumn({align:$="auto",behavior:E="auto",index:H}){const j=T({align:$,containerScrollOffset:b?.scrollLeft??0,index:H});typeof b?.scrollTo=="function"&&b.scrollTo({behavior:E,left:j})},scrollToRow({align:$="auto",behavior:E="auto",index:H}){const j=C({align:$,containerScrollOffset:b?.scrollTop??0,index:H});typeof b?.scrollTo=="function"&&b.scrollTo({behavior:E,top:j})}}),[b,T,C]),o.useEffect(()=>{S>=0&&R>=0&&L>=0&&U>=0&&d&&d({columnStartIndex:x,columnStopIndex:v,rowStartIndex:Z,rowStopIndex:P},{columnStartIndex:S,columnStopIndex:R,rowStartIndex:L,rowStopIndex:U})},[d,S,x,R,v,L,Z,U,P]);const oe=o.useMemo(()=>{const $=[];if(n>0&&p>0)for(let E=L;E<=U;E++){const H=m(E),j=[];for(let W=S;W<=R;W++){const q=z(W);j.push(o.createElement(B,{...O,ariaAttributes:{"aria-colindex":W+1,role:"gridcell"},columnIndex:W,key:W,rowIndex:E,style:{position:"absolute",left:M?void 0:0,right:M?0:void 0,transform:`translate(${M?-q.scrollOffset:q.scrollOffset}px, ${H.scrollOffset}px)`,height:H.size,width:q.size}}))}$.push(J.jsx("div",{role:"row","aria-rowindex":E+1,children:j},E))}return $},[B,O,n,S,R,z,m,M,p,L,U]),ie=J.jsx("div",{"aria-hidden":!0,style:{height:k(),width:A(),zIndex:-1}});return o.createElement(w,{"aria-colcount":n,"aria-rowcount":p,role:"grid",...y,className:r,dir:c,ref:G,style:{position:"relative",maxHeight:"100%",maxWidth:"100%",flexGrow:1,overflow:"auto",...h}},oe,s,ie)}const be=o.useState,me=o.useRef;function ve(e){return e!=null&&typeof e=="object"&&"getAverageRowHeight"in e&&typeof e.getAverageRowHeight=="function"}const Q="data-react-window-index";function Ie({children:e,className:t,defaultHeight:s=0,listRef:r,onResize:n,onRowsRendered:i,overscanCount:l=3,rowComponent:f,rowCount:c,rowHeight:u,rowProps:d,tagName:a="div",style:g,...p}){const I=re(d),h=o.useMemo(()=>o.memo(f,ne),[f]),[w,y]=o.useState(null),O=ve(u),B=o.useMemo(()=>O?v=>u.getRowHeight(v)??u.getAverageRowHeight():u,[O,u]),{getCellBounds:b,getEstimatedSize:G,scrollToIndex:M,startIndexOverscan:z,startIndexVisible:A,stopIndexOverscan:S,stopIndexVisible:x}=K({containerElement:w,containerStyle:g,defaultContainerSize:s,direction:"vertical",itemCount:c,itemProps:I,itemSize:B,onResize:n,overscanCount:l});o.useImperativeHandle(r,()=>({get element(){return w},scrollToRow({align:v="auto",behavior:m="auto",index:k}){const L=M({align:v,containerScrollOffset:w?.scrollTop??0,index:k});typeof w?.scrollTo=="function"&&w.scrollTo({behavior:m,top:L})}}),[w,M]),_(()=>{if(!w)return;const v=Array.from(w.children).filter((m,k)=>{if(m.hasAttribute("aria-hidden"))return!1;const L=`${z+k}`;return m.setAttribute(Q,L),!0});if(O)return u.observeRowElements(v)},[w,O,u,z,S]),o.useEffect(()=>{z>=0&&S>=0&&i&&i({startIndex:A,stopIndex:x},{startIndex:z,stopIndex:S})},[i,z,A,S,x]);const T=o.useMemo(()=>{const v=[];if(c>0)for(let m=z;m<=S;m++){const k=b(m);v.push(o.createElement(h,{...I,ariaAttributes:{"aria-posinset":m+1,"aria-setsize":c,role:"listitem"},key:m,index:m,style:{position:"absolute",left:0,transform:`translateY(${k.scrollOffset}px)`,height:O?void 0:k.size,width:"100%"}}))}return v},[h,b,O,c,I,z,S]),R=J.jsx("div",{"aria-hidden":!0,style:{height:G(),width:"100%",zIndex:-1}});return o.createElement(a,{role:"list",...p,className:t,ref:y,style:{position:"relative",maxHeight:"100%",flexGrow:1,overflowY:"auto",...g}},T,e,R)}function we({defaultRowHeight:e,key:t}){const[s,r]=o.useState({key:t,map:new Map});s.key!==t&&r({key:t,map:new Map});const{map:n}=s,i=o.useCallback(()=>{let a=0;return n.forEach(g=>{a+=g}),a===0?e:a/n.size},[e,n]),l=o.useCallback(a=>{const g=n.get(a);return g!==void 0?g:(n.set(a,e),e)},[e,n]),f=o.useCallback((a,g)=>{r(p=>{if(p.map.get(a)===g)return p;const I=new Map(p.map);return I.set(a,g),{...p,map:I}})},[]),c=te(a=>{a.length!==0&&a.forEach(g=>{const{borderBoxSize:p,target:I}=g,h=I.getAttribute(Q);V(h!==null,`Invalid ${Q} attribute value`);const w=parseInt(h),{blockSize:y}=p[0];y&&f(w,y)})}),[u]=o.useState(()=>new ResizeObserver(c));o.useEffect(()=>()=>{u.disconnect()},[u]);const d=o.useCallback(a=>(a.forEach(g=>u.observe(g)),()=>{a.forEach(g=>u.unobserve(g))}),[u]);return o.useMemo(()=>({getAverageRowHeight:i,getRowHeight:l,setRowHeight:f,observeRowElements:d}),[i,l,f,d])}const ye=o.useState,Oe=o.useRef;let X=-1;function Se(e=!1){if(X===-1||e){const t=document.createElement("div"),s=t.style;s.width="50px",s.height="50px",s.overflow="scroll",document.body.appendChild(t),X=t.offsetWidth-t.clientWidth,document.body.removeChild(t)}return X}exports.Grid=xe;exports.List=Ie;exports.getScrollbarSize=Se;exports.useDynamicRowHeight=we;exports.useGridCallbackRef=be;exports.useGridRef=me;exports.useListCallbackRef=ye;exports.useListRef=Oe;
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const J=require("react/jsx-runtime"),o=require("react");function ce(e){let t=e;for(;t;){if(t.dir)return t.dir==="rtl";t=t.parentElement}return!1}function ae(e,t){const[s,r]=o.useState(t==="rtl");return o.useLayoutEffect(()=>{e&&(t||r(ce(e)))},[t,e]),s}const _=typeof window<"u"?o.useLayoutEffect:o.useEffect;function ee(e){if(e!==void 0)switch(typeof e){case"number":return e;case"string":{if(e.endsWith("px"))return parseFloat(e);break}}}function ue({box:e,defaultHeight:t,defaultWidth:s,disabled:r,element:n,mode:i,style:l}){const{styleHeight:f,styleWidth:c}=o.useMemo(()=>({styleHeight:ee(l?.height),styleWidth:ee(l?.width)}),[l?.height,l?.width]),[a,d]=o.useState({height:t,width:s}),u=r||i==="only-height"&&f!==void 0||i==="only-width"&&c!==void 0||f!==void 0&&c!==void 0;return _(()=>{if(n===null||u)return;const g=new ResizeObserver(p=>{for(const I of p){const{contentRect:h,target:w}=I;n===w&&d(y=>y.height===h.height&&y.width===h.width?y:{height:h.height,width:h.width})}});return g.observe(n,{box:e}),()=>{g?.unobserve(n)}},[e,u,n,f,c]),o.useMemo(()=>({height:f??a.height,width:c??a.width}),[a,f,c])}function te(e){const t=o.useRef(()=>{throw new Error("Cannot call during render.")});return _(()=>{t.current=e},[e]),o.useCallback(s=>t.current?.(s),[t])}let D=null;function fe(e=!1){if(D===null||e){const t=document.createElement("div"),s=t.style;s.width="50px",s.height="50px",s.overflow="scroll",s.direction="rtl";const r=document.createElement("div"),n=r.style;return n.width="100px",n.height="100px",t.appendChild(r),document.body.appendChild(t),t.scrollLeft>0?D="positive-descending":(t.scrollLeft=1,t.scrollLeft===0?D="negative":D="positive-ascending"),document.body.removeChild(t),D}return D}function N({containerElement:e,direction:t,isRtl:s,scrollOffset:r}){if(t==="horizontal"&&s)switch(fe()){case"negative":return-r;case"positive-descending":{if(e){const{clientWidth:n,scrollLeft:i,scrollWidth:l}=e;return l-n-i}break}}return r}function V(e,t="Assertion error"){if(!e)throw console.error(t),Error(t)}function F(e,t){if(e===t)return!0;if(!!e!=!!t||(V(e!==void 0),V(t!==void 0),Object.keys(e).length!==Object.keys(t).length))return!1;for(const s in e)if(!Object.is(t[s],e[s]))return!1;return!0}function se({cachedBounds:e,itemCount:t,itemSize:s}){if(t===0)return 0;if(typeof s=="number")return t*s;{const r=e.get(e.size===0?0:e.size-1);V(r!==void 0,"Unexpected bounds cache miss");const n=(r.scrollOffset+r.size)/e.size;return t*n}}function de({align:e,cachedBounds:t,index:s,itemCount:r,itemSize:n,containerScrollOffset:i,containerSize:l}){if(s<0||s>=r)throw RangeError(`Invalid index specified: ${s}`,{cause:`Index ${s} is not within the range of 0 - ${r-1}`});const f=se({cachedBounds:t,itemCount:r,itemSize:n}),c=t.get(s),a=Math.max(0,Math.min(f-l,c.scrollOffset)),d=Math.max(0,c.scrollOffset-l+c.size);switch(e==="smart"&&(i>=d&&i<=a?e="auto":e="center"),e){case"start":return a;case"end":return d;case"center":return c.scrollOffset<=l/2?0:c.scrollOffset+c.size/2>=f-l/2?f-l:c.scrollOffset+c.size/2-l/2;case"auto":default:return i>=d&&i<=a?i:i<d?d:a}}function Y({cachedBounds:e,containerScrollOffset:t,containerSize:s,itemCount:r,overscanCount:n}){const i=r-1;let l=0,f=-1,c=0,a=-1,d=0;for(;d<i;){const u=e.get(d);if(u.scrollOffset+u.size>t)break;d++}for(l=d,c=Math.max(0,l-n);d<i;){const u=e.get(d);if(u.scrollOffset+u.size>=t+s)break;d++}return f=Math.min(i,d),a=Math.min(r-1,f+n),l<0&&(l=0,f=-1,c=0,a=-1),{startIndexVisible:l,stopIndexVisible:f,startIndexOverscan:c,stopIndexOverscan:a}}function he({itemCount:e,itemProps:t,itemSize:s}){const r=new Map;return{get(n){for(V(n<e,`Invalid index ${n}`);r.size-1<n;){const l=r.size;let f;switch(typeof s){case"function":{f=s(l,t);break}case"number":{f=s;break}}if(l===0)r.set(l,{size:f,scrollOffset:0});else{const c=r.get(l-1);V(c!==void 0,`Unexpected bounds cache miss for index ${n}`),r.set(l,{scrollOffset:c.scrollOffset+c.size,size:f})}}const i=r.get(n);return V(i!==void 0,`Unexpected bounds cache miss for index ${n}`),i},set(n,i){r.set(n,i)},get size(){return r.size}}}function ge({itemCount:e,itemProps:t,itemSize:s}){return o.useMemo(()=>he({itemCount:e,itemProps:t,itemSize:s}),[e,t,s])}function pe({containerSize:e,itemSize:t}){let s;switch(typeof t){case"string":{V(t.endsWith("%"),`Invalid item size: "${t}"; string values must be percentages (e.g. "100%")`),V(e!==void 0,"Container size must be defined if a percentage item size is specified"),s=e*parseInt(t)/100;break}default:{s=t;break}}return s}function K({containerElement:e,containerStyle:t,defaultContainerSize:s=0,direction:r,isRtl:n=!1,itemCount:i,itemProps:l,itemSize:f,onResize:c,overscanCount:a}){const{height:d=s,width:u=s}=ue({defaultHeight:r==="vertical"?s:void 0,defaultWidth:r==="horizontal"?s:void 0,element:e,mode:r==="vertical"?"only-height":"only-width",style:t}),g=o.useRef({height:0,width:0}),p=r==="vertical"?d:u,I=pe({containerSize:p,itemSize:f});o.useLayoutEffect(()=>{if(typeof c=="function"){const x=g.current;(x.height!==d||x.width!==u)&&(c({height:d,width:u},{...x}),x.height=d,x.width=u)}},[d,c,u]);const h=ge({itemCount:i,itemProps:l,itemSize:I}),w=o.useCallback(x=>h.get(x),[h]),[y,O]=o.useState(()=>Y({cachedBounds:h,containerScrollOffset:0,containerSize:p,itemCount:i,overscanCount:a})),{startIndexVisible:B,startIndexOverscan:b,stopIndexVisible:G,stopIndexOverscan:M}={startIndexVisible:Math.min(i-1,y.startIndexVisible),startIndexOverscan:Math.min(i-1,y.startIndexOverscan),stopIndexVisible:Math.min(i-1,y.stopIndexVisible),stopIndexOverscan:Math.min(i-1,y.stopIndexOverscan)},z=o.useCallback(()=>se({cachedBounds:h,itemCount:i,itemSize:I}),[h,i,I]),A=o.useCallback(x=>{const T=N({containerElement:e,direction:r,isRtl:n,scrollOffset:x});return Y({cachedBounds:h,containerScrollOffset:T,containerSize:p,itemCount:i,overscanCount:a})},[h,e,p,r,n,i,a]);_(()=>{const x=(r==="vertical"?e?.scrollTop:e?.scrollLeft)??0;O(A(x))},[e,r,A]),_(()=>{if(!e)return;const x=()=>{O(T=>{const{scrollLeft:E,scrollTop:m}=e,v=N({containerElement:e,direction:r,isRtl:n,scrollOffset:r==="vertical"?m:E}),k=Y({cachedBounds:h,containerScrollOffset:v,containerSize:p,itemCount:i,overscanCount:a});return F(k,T)?T:k})};return e.addEventListener("scroll",x),()=>{e.removeEventListener("scroll",x)}},[h,e,p,r,i,a]);const S=te(({align:x="auto",containerScrollOffset:T,index:E})=>{let m=de({align:x,cachedBounds:h,containerScrollOffset:T,containerSize:p,index:E,itemCount:i,itemSize:I});if(e){if(m=N({containerElement:e,direction:r,isRtl:n,scrollOffset:m}),typeof e.scrollTo!="function"){const v=A(m);F(y,v)||O(v)}return m}});return{getCellBounds:w,getEstimatedSize:z,scrollToIndex:S,startIndexOverscan:b,startIndexVisible:B,stopIndexOverscan:M,stopIndexVisible:G}}function re(e){return o.useMemo(()=>e,Object.values(e))}function ne(e,t){const{ariaAttributes:s,style:r,...n}=e,{ariaAttributes:i,style:l,...f}=t;return F(s,i)&&F(r,l)&&F(n,f)}function xe({cellComponent:e,cellProps:t,children:s,className:r,columnCount:n,columnWidth:i,defaultHeight:l=0,defaultWidth:f=0,dir:c,gridRef:a,onCellsRendered:d,onResize:u,overscanCount:g=3,rowCount:p,rowHeight:I,style:h,tagName:w="div",...y}){const O=re(t),B=o.useMemo(()=>o.memo(e,ne),[e]),[b,G]=o.useState(null),M=ae(b,c),{getCellBounds:z,getEstimatedSize:A,startIndexOverscan:S,startIndexVisible:x,scrollToIndex:T,stopIndexOverscan:E,stopIndexVisible:m}=K({containerElement:b,containerStyle:h,defaultContainerSize:f,direction:"horizontal",isRtl:M,itemCount:n,itemProps:O,itemSize:i,onResize:u,overscanCount:g}),{getCellBounds:v,getEstimatedSize:k,startIndexOverscan:L,startIndexVisible:Z,scrollToIndex:C,stopIndexOverscan:U,stopIndexVisible:P}=K({containerElement:b,containerStyle:h,defaultContainerSize:l,direction:"vertical",itemCount:p,itemProps:O,itemSize:I,onResize:u,overscanCount:g});o.useImperativeHandle(a,()=>({get element(){return b},scrollToCell({behavior:$="auto",columnAlign:R="auto",columnIndex:H,rowAlign:j="auto",rowIndex:W}){const q=T({align:R,containerScrollOffset:b?.scrollLeft??0,index:H}),le=C({align:j,containerScrollOffset:b?.scrollTop??0,index:W});typeof b?.scrollTo=="function"&&b.scrollTo({behavior:$,left:q,top:le})},scrollToColumn({align:$="auto",behavior:R="auto",index:H}){const j=T({align:$,containerScrollOffset:b?.scrollLeft??0,index:H});typeof b?.scrollTo=="function"&&b.scrollTo({behavior:R,left:j})},scrollToRow({align:$="auto",behavior:R="auto",index:H}){const j=C({align:$,containerScrollOffset:b?.scrollTop??0,index:H});typeof b?.scrollTo=="function"&&b.scrollTo({behavior:R,top:j})}}),[b,T,C]),o.useEffect(()=>{S>=0&&E>=0&&L>=0&&U>=0&&d&&d({columnStartIndex:x,columnStopIndex:m,rowStartIndex:Z,rowStopIndex:P},{columnStartIndex:S,columnStopIndex:E,rowStartIndex:L,rowStopIndex:U})},[d,S,x,E,m,L,Z,U,P]);const oe=o.useMemo(()=>{const $=[];if(n>0&&p>0)for(let R=L;R<=U;R++){const H=v(R),j=[];for(let W=S;W<=E;W++){const q=z(W);j.push(o.createElement(B,{...O,ariaAttributes:{"aria-colindex":W+1,role:"gridcell"},columnIndex:W,key:W,rowIndex:R,style:{position:"absolute",left:M?void 0:0,right:M?0:void 0,transform:`translate(${M?-q.scrollOffset:q.scrollOffset}px, ${H.scrollOffset}px)`,height:H.size,width:q.size}}))}$.push(J.jsx("div",{role:"row","aria-rowindex":R+1,children:j},R))}return $},[B,O,n,S,E,z,v,M,p,L,U]),ie=J.jsx("div",{"aria-hidden":!0,style:{height:k(),width:A(),zIndex:-1}});return o.createElement(w,{"aria-colcount":n,"aria-rowcount":p,role:"grid",...y,className:r,dir:c,ref:G,style:{position:"relative",maxHeight:"100%",maxWidth:"100%",flexGrow:1,overflow:"auto",...h}},oe,s,ie)}const be=o.useState,ve=o.useRef;function me(e){return e!=null&&typeof e=="object"&&"getAverageRowHeight"in e&&typeof e.getAverageRowHeight=="function"}const Q="data-react-window-index";function Ie({children:e,className:t,defaultHeight:s=0,listRef:r,onResize:n,onRowsRendered:i,overscanCount:l=3,rowComponent:f,rowCount:c,rowHeight:a,rowProps:d,tagName:u="div",style:g,...p}){const I=re(d),h=o.useMemo(()=>o.memo(f,ne),[f]),[w,y]=o.useState(null),O=me(a),B=o.useMemo(()=>O?m=>a.getRowHeight(m)??a.getAverageRowHeight():a,[O,a]),{getCellBounds:b,getEstimatedSize:G,scrollToIndex:M,startIndexOverscan:z,startIndexVisible:A,stopIndexOverscan:S,stopIndexVisible:x}=K({containerElement:w,containerStyle:g,defaultContainerSize:s,direction:"vertical",itemCount:c,itemProps:I,itemSize:B,onResize:n,overscanCount:l});o.useImperativeHandle(r,()=>({get element(){return w},scrollToRow({align:m="auto",behavior:v="auto",index:k}){const L=M({align:m,containerScrollOffset:w?.scrollTop??0,index:k});typeof w?.scrollTo=="function"&&w.scrollTo({behavior:v,top:L})}}),[w,M]),_(()=>{if(!w)return;const m=Array.from(w.children).filter((v,k)=>{if(v.hasAttribute("aria-hidden"))return!1;const L=`${z+k}`;return v.setAttribute(Q,L),!0});if(O)return a.observeRowElements(m)},[w,O,a,z,S]),o.useEffect(()=>{z>=0&&S>=0&&i&&i({startIndex:A,stopIndex:x},{startIndex:z,stopIndex:S})},[i,z,A,S,x]);const T=o.useMemo(()=>{const m=[];if(c>0)for(let v=z;v<=S;v++){const k=b(v);m.push(o.createElement(h,{...I,ariaAttributes:{"aria-posinset":v+1,"aria-setsize":c,role:"listitem"},key:v,index:v,style:{position:"absolute",left:0,transform:`translateY(${k.scrollOffset}px)`,height:O?void 0:k.size,width:"100%"}}))}return m},[h,b,O,c,I,z,S]),E=J.jsx("div",{"aria-hidden":!0,style:{height:G(),width:"100%",zIndex:-1}});return o.createElement(u,{role:"list",...p,className:t,ref:y,style:{position:"relative",maxHeight:"100%",flexGrow:1,overflowY:"auto",...g}},T,e,E)}function we({defaultRowHeight:e,key:t}){const[s,r]=o.useState({key:t,map:new Map});s.key!==t&&r({key:t,map:new Map});const{map:n}=s,i=o.useCallback(()=>{let u=0;return n.forEach(g=>{u+=g}),u===0?e:u/n.size},[e,n]),l=o.useCallback(u=>{const g=n.get(u);return g!==void 0?g:(n.set(u,e),e)},[e,n]),f=o.useCallback((u,g)=>{r(p=>{if(p.map.get(u)===g)return p;const I=new Map(p.map);return I.set(u,g),{...p,map:I}})},[]),c=te(u=>{u.length!==0&&u.forEach(g=>{const{borderBoxSize:p,target:I}=g,h=I.getAttribute(Q);V(h!==null,`Invalid ${Q} attribute value`);const w=parseInt(h),{blockSize:y}=p[0];y&&f(w,y)})}),[a]=o.useState(()=>{if(typeof ResizeObserver<"u")return new ResizeObserver(c)});o.useEffect(()=>{if(a)return()=>{a.disconnect()}},[a]);const d=o.useCallback(u=>a?(u.forEach(g=>a.observe(g)),()=>{u.forEach(g=>a.unobserve(g))}):()=>{},[a]);return o.useMemo(()=>({getAverageRowHeight:i,getRowHeight:l,setRowHeight:f,observeRowElements:d}),[i,l,f,d])}const ye=o.useState,Oe=o.useRef;let X=-1;function Se(e=!1){if(X===-1||e){const t=document.createElement("div"),s=t.style;s.width="50px",s.height="50px",s.overflow="scroll",document.body.appendChild(t),X=t.offsetWidth-t.clientWidth,document.body.removeChild(t)}return X}exports.Grid=xe;exports.List=Ie;exports.getScrollbarSize=Se;exports.useDynamicRowHeight=we;exports.useGridCallbackRef=be;exports.useGridRef=ve;exports.useListCallbackRef=ye;exports.useListRef=Oe;
|
|
2
2
|
//# sourceMappingURL=react-window.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-window.cjs","sources":["../lib/utils/isRtl.ts","../lib/core/useIsRtl.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/utils/parseNumericStyleValue.ts","../lib/hooks/useResizeObserver.ts","../lib/hooks/useStableCallback.ts","../lib/utils/getRTLOffsetType.ts","../lib/utils/adjustScrollOffsetForRtl.ts","../lib/utils/assert.ts","../lib/utils/shallowCompare.ts","../lib/core/getEstimatedSize.ts","../lib/core/getOffsetForIndex.ts","../lib/core/getStartStopIndices.ts","../lib/core/createCachedBounds.ts","../lib/core/useCachedBounds.ts","../lib/core/useItemSize.ts","../lib/core/useVirtualizer.ts","../lib/hooks/useMemoizedObject.ts","../lib/utils/arePropsEqual.ts","../lib/components/grid/Grid.tsx","../lib/components/grid/useGridCallbackRef.ts","../lib/components/grid/useGridRef.ts","../lib/components/list/isDynamicRowHeight.ts","../lib/components/list/List.tsx","../lib/components/list/useDynamicRowHeight.ts","../lib/components/list/useListCallbackRef.ts","../lib/components/list/useListRef.ts","../lib/utils/getScrollbarSize.ts"],"sourcesContent":["export function isRtl(element: HTMLElement) {\n let currentElement: HTMLElement | null = element;\n while (currentElement) {\n if (currentElement.dir) {\n return currentElement.dir === \"rtl\";\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return false;\n}\n","import { useLayoutEffect, useState, type HTMLAttributes } from \"react\";\nimport { isRtl } from \"../utils/isRtl\";\n\nexport function useIsRtl(\n element: HTMLElement | null,\n dir: HTMLAttributes<HTMLElement>[\"dir\"]\n) {\n const [value, setValue] = useState(dir === \"rtl\");\n\n useLayoutEffect(() => {\n if (element) {\n if (!dir) {\n setValue(isRtl(element));\n }\n }\n }, [dir, element]);\n\n return value;\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import type { CSSProperties } from \"react\";\n\nexport function parseNumericStyleValue(\n value: CSSProperties[\"height\"]\n): number | undefined {\n if (value !== undefined) {\n switch (typeof value) {\n case \"number\": {\n return value;\n }\n case \"string\": {\n if (value.endsWith(\"px\")) {\n return parseFloat(value);\n }\n break;\n }\n }\n }\n}\n","import { useMemo, useState, type CSSProperties } from \"react\";\nimport { parseNumericStyleValue } from \"../utils/parseNumericStyleValue\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useResizeObserver({\n box,\n defaultHeight,\n defaultWidth,\n disabled: disabledProp,\n element,\n mode,\n style\n}: {\n box?: ResizeObserverBoxOptions;\n defaultHeight?: number;\n defaultWidth?: number;\n disabled?: boolean;\n element: HTMLElement | null;\n mode?: \"only-height\" | \"only-width\";\n style: CSSProperties | undefined;\n}) {\n const { styleHeight, styleWidth } = useMemo(\n () => ({\n styleHeight: parseNumericStyleValue(style?.height),\n styleWidth: parseNumericStyleValue(style?.width)\n }),\n [style?.height, style?.width]\n );\n\n const [state, setState] = useState<{\n height: number | undefined;\n width: number | undefined;\n }>({\n height: defaultHeight,\n width: defaultWidth\n });\n\n const disabled =\n disabledProp ||\n (mode === \"only-height\" && styleHeight !== undefined) ||\n (mode === \"only-width\" && styleWidth !== undefined) ||\n (styleHeight !== undefined && styleWidth !== undefined);\n\n useIsomorphicLayoutEffect(() => {\n if (element === null || disabled) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { contentRect, target } = entry;\n if (element === target) {\n setState((prevState) => {\n if (\n prevState.height === contentRect.height &&\n prevState.width === contentRect.width\n ) {\n return prevState;\n }\n\n return {\n height: contentRect.height,\n width: contentRect.width\n };\n });\n }\n }\n });\n resizeObserver.observe(element, { box });\n\n return () => {\n resizeObserver?.unobserve(element);\n };\n }, [box, disabled, element, styleHeight, styleWidth]);\n\n return useMemo(\n () => ({\n height: styleHeight ?? state.height,\n width: styleWidth ?? state.width\n }),\n [state, styleHeight, styleWidth]\n );\n}\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(() => {\n throw new Error(\"Cannot call during render.\");\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","export type RTLOffsetType =\n | \"negative\"\n | \"positive-descending\"\n | \"positive-ascending\";\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement(\"div\");\n const outerStyle = outerDiv.style;\n outerStyle.width = \"50px\";\n outerStyle.height = \"50px\";\n outerStyle.overflow = \"scroll\";\n outerStyle.direction = \"rtl\";\n\n const innerDiv = document.createElement(\"div\");\n const innerStyle = innerDiv.style;\n innerStyle.width = \"100px\";\n innerStyle.height = \"100px\";\n\n outerDiv.appendChild(innerDiv);\n\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = \"positive-descending\";\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = \"negative\";\n } else {\n cachedRTLResult = \"positive-ascending\";\n }\n }\n\n document.body.removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","import type { Direction } from \"../core/types\";\nimport { getRTLOffsetType } from \"./getRTLOffsetType\";\n\nexport function adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n}: {\n containerElement: HTMLElement | null;\n direction: Direction;\n isRtl: boolean;\n scrollOffset: number;\n}) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n if (direction === \"horizontal\") {\n if (isRtl) {\n switch (getRTLOffsetType()) {\n case \"negative\": {\n return -scrollOffset;\n }\n case \"positive-descending\": {\n if (containerElement) {\n const { clientWidth, scrollLeft, scrollWidth } = containerElement;\n return scrollWidth - clientWidth - scrollLeft;\n }\n break;\n }\n }\n }\n }\n return scrollOffset;\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","import { assert } from \"./assert\";\n\nexport function shallowCompare<Type extends object>(\n a: Type | undefined,\n b: Type | undefined\n) {\n if (a === b) {\n return true;\n }\n\n if (!!a !== !!b) {\n return false;\n }\n\n assert(a !== undefined);\n assert(b !== undefined);\n\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (!Object.is(b[key], a[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type { CachedBounds, SizeFunction } from \"./types\";\nimport { assert } from \"../utils/assert\";\n\nexport function getEstimatedSize<Props extends object>({\n cachedBounds,\n itemCount,\n itemSize\n}: {\n cachedBounds: CachedBounds;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n}) {\n if (itemCount === 0) {\n return 0;\n } else if (typeof itemSize === \"number\") {\n return itemCount * itemSize;\n } else {\n const bounds = cachedBounds.get(\n cachedBounds.size === 0 ? 0 : cachedBounds.size - 1\n );\n assert(bounds !== undefined, \"Unexpected bounds cache miss\");\n\n const averageItemSize =\n (bounds.scrollOffset + bounds.size) / cachedBounds.size;\n\n return itemCount * averageItemSize;\n }\n}\n","import type { Align } from \"../types\";\nimport { getEstimatedSize } from \"./getEstimatedSize\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function getOffsetForIndex<Props extends object>({\n align,\n cachedBounds,\n index,\n itemCount,\n itemSize,\n containerScrollOffset,\n containerSize\n}: {\n align: Align;\n cachedBounds: CachedBounds;\n index: number;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n containerScrollOffset: number;\n containerSize: number;\n}) {\n if (index < 0 || index >= itemCount) {\n throw RangeError(`Invalid index specified: ${index}`, {\n cause: `Index ${index} is not within the range of 0 - ${itemCount - 1}`\n });\n }\n\n const estimatedTotalSize = getEstimatedSize({\n cachedBounds,\n itemCount,\n itemSize\n });\n\n const bounds = cachedBounds.get(index);\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - containerSize, bounds.scrollOffset)\n );\n const minOffset = Math.max(\n 0,\n bounds.scrollOffset - containerSize + bounds.size\n );\n\n if (align === \"smart\") {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n align = \"auto\";\n } else {\n align = \"center\";\n }\n }\n\n switch (align) {\n case \"start\": {\n return maxOffset;\n }\n case \"end\": {\n return minOffset;\n }\n case \"center\": {\n if (bounds.scrollOffset <= containerSize / 2) {\n // Too near the beginning to center-align\n return 0;\n } else if (\n bounds.scrollOffset + bounds.size / 2 >=\n estimatedTotalSize - containerSize / 2\n ) {\n // Too near the end to center-align\n return estimatedTotalSize - containerSize;\n } else {\n return bounds.scrollOffset + bounds.size / 2 - containerSize / 2;\n }\n }\n case \"auto\":\n default: {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n return containerScrollOffset;\n } else if (containerScrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n}\n","import type { CachedBounds } from \"./types\";\n\nexport function getStartStopIndices({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n}: {\n cachedBounds: CachedBounds;\n containerScrollOffset: number;\n containerSize: number;\n itemCount: number;\n overscanCount: number;\n}): {\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n} {\n const maxIndex = itemCount - 1;\n\n let startIndexVisible = 0;\n let stopIndexVisible = -1;\n let startIndexOverscan = 0;\n let stopIndexOverscan = -1;\n let currentIndex = 0;\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (bounds.scrollOffset + bounds.size > containerScrollOffset) {\n break;\n }\n\n currentIndex++;\n }\n\n startIndexVisible = currentIndex;\n startIndexOverscan = Math.max(0, startIndexVisible - overscanCount);\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (\n bounds.scrollOffset + bounds.size >=\n containerScrollOffset + containerSize\n ) {\n break;\n }\n\n currentIndex++;\n }\n\n stopIndexVisible = Math.min(maxIndex, currentIndex);\n stopIndexOverscan = Math.min(itemCount - 1, stopIndexVisible + overscanCount);\n\n if (startIndexVisible < 0) {\n startIndexVisible = 0;\n stopIndexVisible = -1;\n startIndexOverscan = 0;\n stopIndexOverscan = -1;\n }\n\n return {\n startIndexVisible,\n stopIndexVisible,\n startIndexOverscan,\n stopIndexOverscan\n };\n}\n","import { assert } from \"../utils/assert\";\nimport type { Bounds, CachedBounds, SizeFunction } from \"./types\";\n\nexport function createCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n const cache = new Map<number, Bounds>();\n\n return {\n get(index: number) {\n assert(index < itemCount, `Invalid index ${index}`);\n\n while (cache.size - 1 < index) {\n const currentIndex = cache.size;\n\n let size: number;\n switch (typeof itemSize) {\n case \"function\": {\n size = itemSize(currentIndex, itemProps);\n break;\n }\n case \"number\": {\n size = itemSize;\n break;\n }\n }\n\n if (currentIndex === 0) {\n cache.set(currentIndex, {\n size,\n scrollOffset: 0\n });\n } else {\n const previousRowBounds = cache.get(currentIndex - 1);\n assert(\n previousRowBounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n cache.set(currentIndex, {\n scrollOffset:\n previousRowBounds.scrollOffset + previousRowBounds.size,\n size\n });\n }\n }\n\n const bounds = cache.get(index);\n assert(\n bounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n return bounds;\n },\n set(index: number, bounds: Bounds) {\n cache.set(index, bounds);\n },\n get size() {\n return cache.size;\n }\n };\n}\n","import { useMemo } from \"react\";\nimport { createCachedBounds } from \"./createCachedBounds\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function useCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n return useMemo(\n () =>\n createCachedBounds({\n itemCount,\n itemProps,\n itemSize\n }),\n [itemCount, itemProps, itemSize]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { SizeFunction } from \"./types\";\n\nexport function useItemSize<Props extends object>({\n containerSize,\n itemSize: itemSizeProp\n}: {\n containerSize: number;\n itemSize: number | string | SizeFunction<Props>;\n}) {\n let itemSize: number | SizeFunction<Props>;\n switch (typeof itemSizeProp) {\n case \"string\": {\n assert(\n itemSizeProp.endsWith(\"%\"),\n `Invalid item size: \"${itemSizeProp}\"; string values must be percentages (e.g. \"100%\")`\n );\n assert(\n containerSize !== undefined,\n \"Container size must be defined if a percentage item size is specified\"\n );\n\n itemSize = (containerSize * parseInt(itemSizeProp)) / 100;\n break;\n }\n default: {\n itemSize = itemSizeProp;\n break;\n }\n }\n\n return itemSize;\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\nimport { useStableCallback } from \"../hooks/useStableCallback\";\nimport type { Align } from \"../types\";\nimport { adjustScrollOffsetForRtl } from \"../utils/adjustScrollOffsetForRtl\";\nimport { shallowCompare } from \"../utils/shallowCompare\";\nimport { getEstimatedSize as getEstimatedSizeUtil } from \"./getEstimatedSize\";\nimport { getOffsetForIndex } from \"./getOffsetForIndex\";\nimport { getStartStopIndices as getStartStopIndicesUtil } from \"./getStartStopIndices\";\nimport type { Direction, SizeFunction } from \"./types\";\nimport { useCachedBounds } from \"./useCachedBounds\";\nimport { useItemSize } from \"./useItemSize\";\n\nexport function useVirtualizer<Props extends object>({\n containerElement,\n containerStyle,\n defaultContainerSize = 0,\n direction,\n isRtl = false,\n itemCount,\n itemProps,\n itemSize: itemSizeProp,\n onResize,\n overscanCount\n}: {\n containerElement: HTMLElement | null;\n containerStyle?: CSSProperties;\n defaultContainerSize?: number;\n direction: Direction;\n isRtl?: boolean;\n itemCount: number;\n itemProps: Props;\n itemSize: number | string | SizeFunction<Props>;\n onResize:\n | ((\n size: { height: number; width: number },\n prevSize: { height: number; width: number }\n ) => void)\n | undefined;\n overscanCount: number;\n}) {\n const { height = defaultContainerSize, width = defaultContainerSize } =\n useResizeObserver({\n defaultHeight:\n direction === \"vertical\" ? defaultContainerSize : undefined,\n defaultWidth:\n direction === \"horizontal\" ? defaultContainerSize : undefined,\n element: containerElement,\n mode: direction === \"vertical\" ? \"only-height\" : \"only-width\",\n style: containerStyle\n });\n\n const prevSizeRef = useRef<{ height: number; width: number }>({\n height: 0,\n width: 0\n });\n\n const containerSize = direction === \"vertical\" ? height : width;\n\n const itemSize = useItemSize({ containerSize, itemSize: itemSizeProp });\n\n useLayoutEffect(() => {\n if (typeof onResize === \"function\") {\n const prevSize = prevSizeRef.current;\n\n if (prevSize.height !== height || prevSize.width !== width) {\n onResize({ height, width }, { ...prevSize });\n\n prevSize.height = height;\n prevSize.width = width;\n }\n }\n }, [height, onResize, width]);\n\n const cachedBounds = useCachedBounds({\n itemCount,\n itemProps,\n itemSize\n });\n\n const getCellBounds = useCallback(\n (index: number) => cachedBounds.get(index),\n [cachedBounds]\n );\n\n const [indices, setIndices] = useState<{\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n }>(() =>\n getStartStopIndicesUtil({\n cachedBounds,\n // TODO Potentially support a defaultScrollOffset prop?\n containerScrollOffset: 0,\n containerSize,\n itemCount,\n overscanCount\n })\n );\n\n // Guard against temporarily invalid indices that may occur when item count decreases\n // Cached bounds object will be re-created and a second render will restore things\n const {\n startIndexVisible,\n startIndexOverscan,\n stopIndexVisible,\n stopIndexOverscan\n } = {\n startIndexVisible: Math.min(itemCount - 1, indices.startIndexVisible),\n startIndexOverscan: Math.min(itemCount - 1, indices.startIndexOverscan),\n stopIndexVisible: Math.min(itemCount - 1, indices.stopIndexVisible),\n stopIndexOverscan: Math.min(itemCount - 1, indices.stopIndexOverscan)\n };\n\n const getEstimatedSize = useCallback(\n () =>\n getEstimatedSizeUtil({\n cachedBounds,\n itemCount,\n itemSize\n }),\n [cachedBounds, itemCount, itemSize]\n );\n\n const getStartStopIndices = useCallback(\n (scrollOffset: number) => {\n const containerScrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n return getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n },\n [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n isRtl,\n itemCount,\n overscanCount\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const scrollOffset =\n (direction === \"vertical\"\n ? containerElement?.scrollTop\n : containerElement?.scrollLeft) ?? 0;\n\n setIndices(getStartStopIndices(scrollOffset));\n }, [containerElement, direction, getStartStopIndices]);\n\n useIsomorphicLayoutEffect(() => {\n if (!containerElement) {\n return;\n }\n\n const onScroll = () => {\n setIndices((prev) => {\n const { scrollLeft, scrollTop } = containerElement;\n\n const scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset: direction === \"vertical\" ? scrollTop : scrollLeft\n });\n\n const next = getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset: scrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n\n if (shallowCompare(next, prev)) {\n return prev;\n }\n\n return next;\n });\n };\n\n containerElement.addEventListener(\"scroll\", onScroll);\n\n return () => {\n containerElement.removeEventListener(\"scroll\", onScroll);\n };\n }, [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n itemCount,\n overscanCount\n ]);\n\n const scrollToIndex = useStableCallback(\n ({\n align = \"auto\",\n containerScrollOffset,\n index\n }: {\n align?: Align;\n containerScrollOffset: number;\n index: number;\n }) => {\n let scrollOffset = getOffsetForIndex({\n align,\n cachedBounds,\n containerScrollOffset,\n containerSize,\n index,\n itemCount,\n itemSize\n });\n\n if (containerElement) {\n scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n if (typeof containerElement.scrollTo !== \"function\") {\n // Special case for environments like jsdom that don't implement scrollTo\n const next = getStartStopIndices(scrollOffset);\n if (!shallowCompare(indices, next)) {\n setIndices(next);\n }\n }\n\n return scrollOffset;\n }\n }\n );\n\n return {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n };\n}\n","import { useMemo } from \"react\";\n\nexport function useMemoizedObject<Type extends object>(\n unstableObject: Type\n): Type {\n return useMemo(() => {\n return unstableObject;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, Object.values(unstableObject));\n}\n","import type { CSSProperties } from \"react\";\nimport { shallowCompare } from \"./shallowCompare\";\n\n// Custom comparison function for React.memo()\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://react.dev/reference/react/memo#memo\nexport function arePropsEqual(\n prevProps: { ariaAttributes: object; style: CSSProperties },\n nextProps: { ariaAttributes: object; style: CSSProperties }\n): boolean {\n const {\n ariaAttributes: prevAriaAttributes,\n style: prevStyle,\n ...prevRest\n } = prevProps;\n const {\n ariaAttributes: nextAriaAttributes,\n style: nextStyle,\n ...nextRest\n } = nextProps;\n\n return (\n shallowCompare(prevAriaAttributes, nextAriaAttributes) &&\n shallowCompare(prevStyle, nextStyle) &&\n shallowCompare(prevRest, nextRest)\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useIsRtl } from \"../../core/useIsRtl\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport type { GridProps } from \"./types\";\n\n/**\n * Renders data with many rows and columns.\n */\nexport function Grid<\n CellProps extends object,\n TagName extends TagNames = \"div\"\n>({\n cellComponent: CellComponentProp,\n cellProps: cellPropsUnstable,\n children,\n className,\n columnCount,\n columnWidth,\n defaultHeight = 0,\n defaultWidth = 0,\n dir,\n gridRef,\n onCellsRendered,\n onResize,\n overscanCount = 3,\n rowCount,\n rowHeight,\n style,\n tagName = \"div\" as TagName,\n ...rest\n}: GridProps<CellProps, TagName>): ReactElement {\n const cellProps = useMemoizedObject(cellPropsUnstable);\n const CellComponent = useMemo(\n () => memo(CellComponentProp, arePropsEqual),\n [CellComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isRtl = useIsRtl(element, dir);\n\n const {\n getCellBounds: getColumnBounds,\n getEstimatedSize: getEstimatedWidth,\n startIndexOverscan: columnStartIndexOverscan,\n startIndexVisible: columnStartIndexVisible,\n scrollToIndex: scrollToColumnIndex,\n stopIndexOverscan: columnStopIndexOverscan,\n stopIndexVisible: columnStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultWidth,\n direction: \"horizontal\",\n isRtl,\n itemCount: columnCount,\n itemProps: cellProps,\n itemSize: columnWidth,\n onResize,\n overscanCount\n });\n\n const {\n getCellBounds: getRowBounds,\n getEstimatedSize: getEstimatedHeight,\n startIndexOverscan: rowStartIndexOverscan,\n startIndexVisible: rowStartIndexVisible,\n scrollToIndex: scrollToRowIndex,\n stopIndexOverscan: rowStopIndexOverscan,\n stopIndexVisible: rowStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: cellProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n gridRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToCell({\n behavior = \"auto\",\n columnAlign = \"auto\",\n columnIndex,\n rowAlign = \"auto\",\n rowIndex\n }: {\n behavior?: ScrollBehavior;\n columnAlign?: Align;\n columnIndex: number;\n rowAlign?: Align;\n rowIndex: number;\n }) {\n const left = scrollToColumnIndex({\n align: columnAlign,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index: columnIndex\n });\n const top = scrollToRowIndex({\n align: rowAlign,\n containerScrollOffset: element?.scrollTop ?? 0,\n index: rowIndex\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left,\n top\n });\n }\n },\n\n scrollToColumn({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const left = scrollToColumnIndex({\n align,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left\n });\n }\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToRowIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToColumnIndex, scrollToRowIndex]\n );\n\n useEffect(() => {\n if (\n columnStartIndexOverscan >= 0 &&\n columnStopIndexOverscan >= 0 &&\n rowStartIndexOverscan >= 0 &&\n rowStopIndexOverscan >= 0 &&\n onCellsRendered\n ) {\n onCellsRendered(\n {\n columnStartIndex: columnStartIndexVisible,\n columnStopIndex: columnStopIndexVisible,\n rowStartIndex: rowStartIndexVisible,\n rowStopIndex: rowStopIndexVisible\n },\n {\n columnStartIndex: columnStartIndexOverscan,\n columnStopIndex: columnStopIndexOverscan,\n rowStartIndex: rowStartIndexOverscan,\n rowStopIndex: rowStopIndexOverscan\n }\n );\n }\n }, [\n onCellsRendered,\n columnStartIndexOverscan,\n columnStartIndexVisible,\n columnStopIndexOverscan,\n columnStopIndexVisible,\n rowStartIndexOverscan,\n rowStartIndexVisible,\n rowStopIndexOverscan,\n rowStopIndexVisible\n ]);\n\n const cells = useMemo(() => {\n const children: ReactNode[] = [];\n if (columnCount > 0 && rowCount > 0) {\n for (\n let rowIndex = rowStartIndexOverscan;\n rowIndex <= rowStopIndexOverscan;\n rowIndex++\n ) {\n const rowBounds = getRowBounds(rowIndex);\n\n const columns: ReactNode[] = [];\n\n for (\n let columnIndex = columnStartIndexOverscan;\n columnIndex <= columnStopIndexOverscan;\n columnIndex++\n ) {\n const columnBounds = getColumnBounds(columnIndex);\n\n columns.push(\n <CellComponent\n {...(cellProps as CellProps)}\n ariaAttributes={{\n \"aria-colindex\": columnIndex + 1,\n role: \"gridcell\"\n }}\n columnIndex={columnIndex}\n key={columnIndex}\n rowIndex={rowIndex}\n style={{\n position: \"absolute\",\n left: isRtl ? undefined : 0,\n right: isRtl ? 0 : undefined,\n transform: `translate(${isRtl ? -columnBounds.scrollOffset : columnBounds.scrollOffset}px, ${rowBounds.scrollOffset}px)`,\n height: rowBounds.size,\n width: columnBounds.size\n }}\n />\n );\n }\n\n children.push(\n <div key={rowIndex} role=\"row\" aria-rowindex={rowIndex + 1}>\n {columns}\n </div>\n );\n }\n }\n return children;\n }, [\n CellComponent,\n cellProps,\n columnCount,\n columnStartIndexOverscan,\n columnStopIndexOverscan,\n getColumnBounds,\n getRowBounds,\n isRtl,\n rowCount,\n rowStartIndexOverscan,\n rowStopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedHeight(),\n width: getEstimatedWidth(),\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n \"aria-colcount\": columnCount,\n \"aria-rowcount\": rowCount,\n role: \"grid\",\n ...rest,\n className,\n dir,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n flexGrow: 1,\n overflow: \"auto\",\n ...style\n }\n },\n cells,\n children,\n sizingElement\n );\n}\n","import { useState } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Grid component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useGridCallbackRef =\n useState as typeof useState<GridImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Grid component.\n */\nexport const useGridRef = useRef as typeof useRef<GridImperativeAPI>;\n","import type { DynamicRowHeight } from \"./types\";\n\nexport function isDynamicRowHeight(value: unknown): value is DynamicRowHeight {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"getAverageRowHeight\" in value &&\n typeof value.getAverageRowHeight === \"function\"\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport { isDynamicRowHeight as isDynamicRowHeightUtil } from \"./isDynamicRowHeight\";\nimport type { ListProps } from \"./types\";\n\nexport const DATA_ATTRIBUTE_LIST_INDEX = \"data-react-window-index\";\n\n/**\n * Renders data with many rows.\n */\nexport function List<\n RowProps extends object,\n TagName extends TagNames = \"div\"\n>({\n children,\n className,\n defaultHeight = 0,\n listRef,\n onResize,\n onRowsRendered,\n overscanCount = 3,\n rowComponent: RowComponentProp,\n rowCount,\n rowHeight: rowHeightProp,\n rowProps: rowPropsUnstable,\n tagName = \"div\" as TagName,\n style,\n ...rest\n}: ListProps<RowProps, TagName>): ReactElement {\n const rowProps = useMemoizedObject(rowPropsUnstable);\n const RowComponent = useMemo(\n () => memo(RowComponentProp, arePropsEqual),\n [RowComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isDynamicRowHeight = isDynamicRowHeightUtil(rowHeightProp);\n\n const rowHeight = useMemo(() => {\n if (isDynamicRowHeight) {\n return (index: number) => {\n return (\n rowHeightProp.getRowHeight(index) ??\n rowHeightProp.getAverageRowHeight()\n );\n };\n }\n\n return rowHeightProp;\n }, [isDynamicRowHeight, rowHeightProp]);\n\n const {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: rowProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n listRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToIndex]\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!element) {\n return;\n }\n\n const rows = Array.from(element.children).filter((item, index) => {\n if (item.hasAttribute(\"aria-hidden\")) {\n // Ignore sizing element\n return false;\n }\n\n const attribute = `${startIndexOverscan + index}`;\n item.setAttribute(DATA_ATTRIBUTE_LIST_INDEX, attribute);\n\n return true;\n });\n\n if (isDynamicRowHeight) {\n return rowHeightProp.observeRowElements(rows);\n }\n }, [\n element,\n isDynamicRowHeight,\n rowHeightProp,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n useEffect(() => {\n if (startIndexOverscan >= 0 && stopIndexOverscan >= 0 && onRowsRendered) {\n onRowsRendered(\n {\n startIndex: startIndexVisible,\n stopIndex: stopIndexVisible\n },\n {\n startIndex: startIndexOverscan,\n stopIndex: stopIndexOverscan\n }\n );\n }\n }, [\n onRowsRendered,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n ]);\n\n const rows = useMemo(() => {\n const children: ReactNode[] = [];\n if (rowCount > 0) {\n for (\n let index = startIndexOverscan;\n index <= stopIndexOverscan;\n index++\n ) {\n const bounds = getCellBounds(index);\n\n children.push(\n <RowComponent\n {...(rowProps as RowProps)}\n ariaAttributes={{\n \"aria-posinset\": index + 1,\n \"aria-setsize\": rowCount,\n role: \"listitem\"\n }}\n key={index}\n index={index}\n style={{\n position: \"absolute\",\n left: 0,\n transform: `translateY(${bounds.scrollOffset}px)`,\n // In case of dynamic row heights, don't specify a height style\n // otherwise a default/estimated height would mask the actual height\n height: isDynamicRowHeight ? undefined : bounds.size,\n width: \"100%\"\n }}\n />\n );\n }\n }\n return children;\n }, [\n RowComponent,\n getCellBounds,\n isDynamicRowHeight,\n rowCount,\n rowProps,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedSize(),\n width: \"100%\",\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n role: \"list\",\n ...rest,\n className,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n flexGrow: 1,\n overflowY: \"auto\",\n ...style\n }\n },\n rows,\n children,\n sizingElement\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { assert } from \"../../utils/assert\";\nimport { DATA_ATTRIBUTE_LIST_INDEX } from \"./List\";\nimport type { DynamicRowHeight } from \"./types\";\n\nexport function useDynamicRowHeight({\n defaultRowHeight,\n key\n}: {\n defaultRowHeight: number;\n key?: string | number;\n}) {\n const [state, setState] = useState<{\n key: string | number | undefined;\n map: Map<number, number>;\n }>({\n key,\n map: new Map()\n });\n\n if (state.key !== key) {\n setState({\n key,\n map: new Map()\n });\n }\n\n const { map } = state;\n\n const getAverageRowHeight = useCallback(() => {\n let totalHeight = 0;\n\n map.forEach((height) => {\n totalHeight += height;\n });\n\n if (totalHeight === 0) {\n return defaultRowHeight;\n }\n\n return totalHeight / map.size;\n }, [defaultRowHeight, map]);\n\n const getRowHeight = useCallback(\n (index: number) => {\n const measuredHeight = map.get(index);\n if (measuredHeight !== undefined) {\n return measuredHeight;\n }\n\n // Temporarily store default height in the cache map to avoid scroll jumps if rowProps change\n // Else rowProps changes can impact the average height, and cause rows to shift up or down within the list\n // see github.com/bvaughn/react-window/issues/863\n map.set(index, defaultRowHeight);\n\n return defaultRowHeight;\n },\n [defaultRowHeight, map]\n );\n\n const setRowHeight = useCallback((index: number, size: number) => {\n setState((prevState) => {\n if (prevState.map.get(index) === size) {\n return prevState;\n }\n\n const clonedMap = new Map(prevState.map);\n clonedMap.set(index, size);\n\n return {\n ...prevState,\n map: clonedMap\n };\n });\n }, []);\n\n const resizeObserverCallback = useStableCallback(\n (entries: ResizeObserverEntry[]) => {\n if (entries.length === 0) {\n return;\n }\n\n entries.forEach((entry) => {\n const { borderBoxSize, target } = entry;\n\n const attribute = target.getAttribute(DATA_ATTRIBUTE_LIST_INDEX);\n assert(\n attribute !== null,\n `Invalid ${DATA_ATTRIBUTE_LIST_INDEX} attribute value`\n );\n\n const index = parseInt(attribute);\n\n const { blockSize: height } = borderBoxSize[0];\n if (!height) {\n // Ignore heights that have not yet been measured (e.g. <img> elements that have not yet loaded)\n return;\n }\n\n setRowHeight(index, height);\n });\n }\n );\n\n const [resizeObserver] = useState(\n () => new ResizeObserver(resizeObserverCallback)\n );\n\n useEffect(() => {\n return () => {\n resizeObserver.disconnect();\n };\n }, [resizeObserver]);\n\n const observeRowElements = useCallback(\n (elements: Element[] | NodeListOf<Element>) => {\n elements.forEach((element) => resizeObserver.observe(element));\n return () => {\n elements.forEach((element) => resizeObserver.unobserve(element));\n };\n },\n [resizeObserver]\n );\n\n return useMemo<DynamicRowHeight>(\n () => ({\n getAverageRowHeight,\n getRowHeight,\n setRowHeight,\n observeRowElements\n }),\n [getAverageRowHeight, getRowHeight, setRowHeight, observeRowElements]\n );\n}\n","import { useState } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the List component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useListCallbackRef =\n useState as typeof useState<ListImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the List component.\n */\nexport const useListRef = useRef as typeof useRef<ListImperativeAPI>;\n","let size: number = -1;\n\nexport function getScrollbarSize(recalculate: boolean = false): number {\n if (size === -1 || recalculate) {\n const div = document.createElement(\"div\");\n const style = div.style;\n style.width = \"50px\";\n style.height = \"50px\";\n style.overflow = \"scroll\";\n\n document.body.appendChild(div);\n\n size = div.offsetWidth - div.clientWidth;\n\n document.body.removeChild(div);\n }\n\n return size;\n}\n\nexport function setScrollbarSizeForTests(value: number) {\n size = value;\n}\n"],"names":["isRtl","element","currentElement","useIsRtl","dir","value","setValue","useState","useLayoutEffect","useIsomorphicLayoutEffect","useEffect","parseNumericStyleValue","useResizeObserver","box","defaultHeight","defaultWidth","disabledProp","mode","style","styleHeight","styleWidth","useMemo","state","setState","disabled","resizeObserver","entries","entry","contentRect","target","prevState","useStableCallback","fn","ref","useRef","useCallback","args","cachedRTLResult","getRTLOffsetType","recalculate","outerDiv","outerStyle","innerDiv","innerStyle","adjustScrollOffsetForRtl","containerElement","direction","scrollOffset","clientWidth","scrollLeft","scrollWidth","assert","expectedCondition","message","shallowCompare","a","b","key","getEstimatedSize","cachedBounds","itemCount","itemSize","bounds","averageItemSize","getOffsetForIndex","align","index","containerScrollOffset","containerSize","estimatedTotalSize","maxOffset","minOffset","getStartStopIndices","overscanCount","maxIndex","startIndexVisible","stopIndexVisible","startIndexOverscan","stopIndexOverscan","currentIndex","createCachedBounds","itemProps","cache","size","previousRowBounds","useCachedBounds","useItemSize","itemSizeProp","useVirtualizer","containerStyle","defaultContainerSize","onResize","height","width","prevSizeRef","prevSize","getCellBounds","indices","setIndices","getStartStopIndicesUtil","getEstimatedSizeUtil","onScroll","prev","scrollTop","next","scrollToIndex","useMemoizedObject","unstableObject","arePropsEqual","prevProps","nextProps","prevAriaAttributes","prevStyle","prevRest","nextAriaAttributes","nextStyle","nextRest","Grid","CellComponentProp","cellPropsUnstable","children","className","columnCount","columnWidth","gridRef","onCellsRendered","rowCount","rowHeight","tagName","rest","cellProps","CellComponent","memo","setElement","getColumnBounds","getEstimatedWidth","columnStartIndexOverscan","columnStartIndexVisible","scrollToColumnIndex","columnStopIndexOverscan","columnStopIndexVisible","getRowBounds","getEstimatedHeight","rowStartIndexOverscan","rowStartIndexVisible","scrollToRowIndex","rowStopIndexOverscan","rowStopIndexVisible","useImperativeHandle","behavior","columnAlign","columnIndex","rowAlign","rowIndex","left","top","cells","rowBounds","columns","columnBounds","createElement","jsx","sizingElement","useGridCallbackRef","useGridRef","isDynamicRowHeight","DATA_ATTRIBUTE_LIST_INDEX","List","listRef","onRowsRendered","RowComponentProp","rowHeightProp","rowPropsUnstable","rowProps","RowComponent","isDynamicRowHeightUtil","rows","item","attribute","useDynamicRowHeight","defaultRowHeight","map","getAverageRowHeight","totalHeight","getRowHeight","measuredHeight","setRowHeight","clonedMap","resizeObserverCallback","borderBoxSize","observeRowElements","elements","useListCallbackRef","useListRef","getScrollbarSize","div"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-window.cjs","sources":["../lib/utils/isRtl.ts","../lib/core/useIsRtl.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/utils/parseNumericStyleValue.ts","../lib/hooks/useResizeObserver.ts","../lib/hooks/useStableCallback.ts","../lib/utils/getRTLOffsetType.ts","../lib/utils/adjustScrollOffsetForRtl.ts","../lib/utils/assert.ts","../lib/utils/shallowCompare.ts","../lib/core/getEstimatedSize.ts","../lib/core/getOffsetForIndex.ts","../lib/core/getStartStopIndices.ts","../lib/core/createCachedBounds.ts","../lib/core/useCachedBounds.ts","../lib/core/useItemSize.ts","../lib/core/useVirtualizer.ts","../lib/hooks/useMemoizedObject.ts","../lib/utils/arePropsEqual.ts","../lib/components/grid/Grid.tsx","../lib/components/grid/useGridCallbackRef.ts","../lib/components/grid/useGridRef.ts","../lib/components/list/isDynamicRowHeight.ts","../lib/components/list/List.tsx","../lib/components/list/useDynamicRowHeight.ts","../lib/components/list/useListCallbackRef.ts","../lib/components/list/useListRef.ts","../lib/utils/getScrollbarSize.ts"],"sourcesContent":["export function isRtl(element: HTMLElement) {\n let currentElement: HTMLElement | null = element;\n while (currentElement) {\n if (currentElement.dir) {\n return currentElement.dir === \"rtl\";\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return false;\n}\n","import { useLayoutEffect, useState, type HTMLAttributes } from \"react\";\nimport { isRtl } from \"../utils/isRtl\";\n\nexport function useIsRtl(\n element: HTMLElement | null,\n dir: HTMLAttributes<HTMLElement>[\"dir\"]\n) {\n const [value, setValue] = useState(dir === \"rtl\");\n\n useLayoutEffect(() => {\n if (element) {\n if (!dir) {\n setValue(isRtl(element));\n }\n }\n }, [dir, element]);\n\n return value;\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import type { CSSProperties } from \"react\";\n\nexport function parseNumericStyleValue(\n value: CSSProperties[\"height\"]\n): number | undefined {\n if (value !== undefined) {\n switch (typeof value) {\n case \"number\": {\n return value;\n }\n case \"string\": {\n if (value.endsWith(\"px\")) {\n return parseFloat(value);\n }\n break;\n }\n }\n }\n}\n","import { useMemo, useState, type CSSProperties } from \"react\";\nimport { parseNumericStyleValue } from \"../utils/parseNumericStyleValue\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useResizeObserver({\n box,\n defaultHeight,\n defaultWidth,\n disabled: disabledProp,\n element,\n mode,\n style\n}: {\n box?: ResizeObserverBoxOptions;\n defaultHeight?: number;\n defaultWidth?: number;\n disabled?: boolean;\n element: HTMLElement | null;\n mode?: \"only-height\" | \"only-width\";\n style: CSSProperties | undefined;\n}) {\n const { styleHeight, styleWidth } = useMemo(\n () => ({\n styleHeight: parseNumericStyleValue(style?.height),\n styleWidth: parseNumericStyleValue(style?.width)\n }),\n [style?.height, style?.width]\n );\n\n const [state, setState] = useState<{\n height: number | undefined;\n width: number | undefined;\n }>({\n height: defaultHeight,\n width: defaultWidth\n });\n\n const disabled =\n disabledProp ||\n (mode === \"only-height\" && styleHeight !== undefined) ||\n (mode === \"only-width\" && styleWidth !== undefined) ||\n (styleHeight !== undefined && styleWidth !== undefined);\n\n useIsomorphicLayoutEffect(() => {\n if (element === null || disabled) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { contentRect, target } = entry;\n if (element === target) {\n setState((prevState) => {\n if (\n prevState.height === contentRect.height &&\n prevState.width === contentRect.width\n ) {\n return prevState;\n }\n\n return {\n height: contentRect.height,\n width: contentRect.width\n };\n });\n }\n }\n });\n resizeObserver.observe(element, { box });\n\n return () => {\n resizeObserver?.unobserve(element);\n };\n }, [box, disabled, element, styleHeight, styleWidth]);\n\n return useMemo(\n () => ({\n height: styleHeight ?? state.height,\n width: styleWidth ?? state.width\n }),\n [state, styleHeight, styleWidth]\n );\n}\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(() => {\n throw new Error(\"Cannot call during render.\");\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","export type RTLOffsetType =\n | \"negative\"\n | \"positive-descending\"\n | \"positive-ascending\";\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement(\"div\");\n const outerStyle = outerDiv.style;\n outerStyle.width = \"50px\";\n outerStyle.height = \"50px\";\n outerStyle.overflow = \"scroll\";\n outerStyle.direction = \"rtl\";\n\n const innerDiv = document.createElement(\"div\");\n const innerStyle = innerDiv.style;\n innerStyle.width = \"100px\";\n innerStyle.height = \"100px\";\n\n outerDiv.appendChild(innerDiv);\n\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = \"positive-descending\";\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = \"negative\";\n } else {\n cachedRTLResult = \"positive-ascending\";\n }\n }\n\n document.body.removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","import type { Direction } from \"../core/types\";\nimport { getRTLOffsetType } from \"./getRTLOffsetType\";\n\nexport function adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n}: {\n containerElement: HTMLElement | null;\n direction: Direction;\n isRtl: boolean;\n scrollOffset: number;\n}) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n if (direction === \"horizontal\") {\n if (isRtl) {\n switch (getRTLOffsetType()) {\n case \"negative\": {\n return -scrollOffset;\n }\n case \"positive-descending\": {\n if (containerElement) {\n const { clientWidth, scrollLeft, scrollWidth } = containerElement;\n return scrollWidth - clientWidth - scrollLeft;\n }\n break;\n }\n }\n }\n }\n return scrollOffset;\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","import { assert } from \"./assert\";\n\nexport function shallowCompare<Type extends object>(\n a: Type | undefined,\n b: Type | undefined\n) {\n if (a === b) {\n return true;\n }\n\n if (!!a !== !!b) {\n return false;\n }\n\n assert(a !== undefined);\n assert(b !== undefined);\n\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (!Object.is(b[key], a[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type { CachedBounds, SizeFunction } from \"./types\";\nimport { assert } from \"../utils/assert\";\n\nexport function getEstimatedSize<Props extends object>({\n cachedBounds,\n itemCount,\n itemSize\n}: {\n cachedBounds: CachedBounds;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n}) {\n if (itemCount === 0) {\n return 0;\n } else if (typeof itemSize === \"number\") {\n return itemCount * itemSize;\n } else {\n const bounds = cachedBounds.get(\n cachedBounds.size === 0 ? 0 : cachedBounds.size - 1\n );\n assert(bounds !== undefined, \"Unexpected bounds cache miss\");\n\n const averageItemSize =\n (bounds.scrollOffset + bounds.size) / cachedBounds.size;\n\n return itemCount * averageItemSize;\n }\n}\n","import type { Align } from \"../types\";\nimport { getEstimatedSize } from \"./getEstimatedSize\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function getOffsetForIndex<Props extends object>({\n align,\n cachedBounds,\n index,\n itemCount,\n itemSize,\n containerScrollOffset,\n containerSize\n}: {\n align: Align;\n cachedBounds: CachedBounds;\n index: number;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n containerScrollOffset: number;\n containerSize: number;\n}) {\n if (index < 0 || index >= itemCount) {\n throw RangeError(`Invalid index specified: ${index}`, {\n cause: `Index ${index} is not within the range of 0 - ${itemCount - 1}`\n });\n }\n\n const estimatedTotalSize = getEstimatedSize({\n cachedBounds,\n itemCount,\n itemSize\n });\n\n const bounds = cachedBounds.get(index);\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - containerSize, bounds.scrollOffset)\n );\n const minOffset = Math.max(\n 0,\n bounds.scrollOffset - containerSize + bounds.size\n );\n\n if (align === \"smart\") {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n align = \"auto\";\n } else {\n align = \"center\";\n }\n }\n\n switch (align) {\n case \"start\": {\n return maxOffset;\n }\n case \"end\": {\n return minOffset;\n }\n case \"center\": {\n if (bounds.scrollOffset <= containerSize / 2) {\n // Too near the beginning to center-align\n return 0;\n } else if (\n bounds.scrollOffset + bounds.size / 2 >=\n estimatedTotalSize - containerSize / 2\n ) {\n // Too near the end to center-align\n return estimatedTotalSize - containerSize;\n } else {\n return bounds.scrollOffset + bounds.size / 2 - containerSize / 2;\n }\n }\n case \"auto\":\n default: {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n return containerScrollOffset;\n } else if (containerScrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n}\n","import type { CachedBounds } from \"./types\";\n\nexport function getStartStopIndices({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n}: {\n cachedBounds: CachedBounds;\n containerScrollOffset: number;\n containerSize: number;\n itemCount: number;\n overscanCount: number;\n}): {\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n} {\n const maxIndex = itemCount - 1;\n\n let startIndexVisible = 0;\n let stopIndexVisible = -1;\n let startIndexOverscan = 0;\n let stopIndexOverscan = -1;\n let currentIndex = 0;\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (bounds.scrollOffset + bounds.size > containerScrollOffset) {\n break;\n }\n\n currentIndex++;\n }\n\n startIndexVisible = currentIndex;\n startIndexOverscan = Math.max(0, startIndexVisible - overscanCount);\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (\n bounds.scrollOffset + bounds.size >=\n containerScrollOffset + containerSize\n ) {\n break;\n }\n\n currentIndex++;\n }\n\n stopIndexVisible = Math.min(maxIndex, currentIndex);\n stopIndexOverscan = Math.min(itemCount - 1, stopIndexVisible + overscanCount);\n\n if (startIndexVisible < 0) {\n startIndexVisible = 0;\n stopIndexVisible = -1;\n startIndexOverscan = 0;\n stopIndexOverscan = -1;\n }\n\n return {\n startIndexVisible,\n stopIndexVisible,\n startIndexOverscan,\n stopIndexOverscan\n };\n}\n","import { assert } from \"../utils/assert\";\nimport type { Bounds, CachedBounds, SizeFunction } from \"./types\";\n\nexport function createCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n const cache = new Map<number, Bounds>();\n\n return {\n get(index: number) {\n assert(index < itemCount, `Invalid index ${index}`);\n\n while (cache.size - 1 < index) {\n const currentIndex = cache.size;\n\n let size: number;\n switch (typeof itemSize) {\n case \"function\": {\n size = itemSize(currentIndex, itemProps);\n break;\n }\n case \"number\": {\n size = itemSize;\n break;\n }\n }\n\n if (currentIndex === 0) {\n cache.set(currentIndex, {\n size,\n scrollOffset: 0\n });\n } else {\n const previousRowBounds = cache.get(currentIndex - 1);\n assert(\n previousRowBounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n cache.set(currentIndex, {\n scrollOffset:\n previousRowBounds.scrollOffset + previousRowBounds.size,\n size\n });\n }\n }\n\n const bounds = cache.get(index);\n assert(\n bounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n return bounds;\n },\n set(index: number, bounds: Bounds) {\n cache.set(index, bounds);\n },\n get size() {\n return cache.size;\n }\n };\n}\n","import { useMemo } from \"react\";\nimport { createCachedBounds } from \"./createCachedBounds\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function useCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n return useMemo(\n () =>\n createCachedBounds({\n itemCount,\n itemProps,\n itemSize\n }),\n [itemCount, itemProps, itemSize]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { SizeFunction } from \"./types\";\n\nexport function useItemSize<Props extends object>({\n containerSize,\n itemSize: itemSizeProp\n}: {\n containerSize: number;\n itemSize: number | string | SizeFunction<Props>;\n}) {\n let itemSize: number | SizeFunction<Props>;\n switch (typeof itemSizeProp) {\n case \"string\": {\n assert(\n itemSizeProp.endsWith(\"%\"),\n `Invalid item size: \"${itemSizeProp}\"; string values must be percentages (e.g. \"100%\")`\n );\n assert(\n containerSize !== undefined,\n \"Container size must be defined if a percentage item size is specified\"\n );\n\n itemSize = (containerSize * parseInt(itemSizeProp)) / 100;\n break;\n }\n default: {\n itemSize = itemSizeProp;\n break;\n }\n }\n\n return itemSize;\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\nimport { useStableCallback } from \"../hooks/useStableCallback\";\nimport type { Align } from \"../types\";\nimport { adjustScrollOffsetForRtl } from \"../utils/adjustScrollOffsetForRtl\";\nimport { shallowCompare } from \"../utils/shallowCompare\";\nimport { getEstimatedSize as getEstimatedSizeUtil } from \"./getEstimatedSize\";\nimport { getOffsetForIndex } from \"./getOffsetForIndex\";\nimport { getStartStopIndices as getStartStopIndicesUtil } from \"./getStartStopIndices\";\nimport type { Direction, SizeFunction } from \"./types\";\nimport { useCachedBounds } from \"./useCachedBounds\";\nimport { useItemSize } from \"./useItemSize\";\n\nexport function useVirtualizer<Props extends object>({\n containerElement,\n containerStyle,\n defaultContainerSize = 0,\n direction,\n isRtl = false,\n itemCount,\n itemProps,\n itemSize: itemSizeProp,\n onResize,\n overscanCount\n}: {\n containerElement: HTMLElement | null;\n containerStyle?: CSSProperties;\n defaultContainerSize?: number;\n direction: Direction;\n isRtl?: boolean;\n itemCount: number;\n itemProps: Props;\n itemSize: number | string | SizeFunction<Props>;\n onResize:\n | ((\n size: { height: number; width: number },\n prevSize: { height: number; width: number }\n ) => void)\n | undefined;\n overscanCount: number;\n}) {\n const { height = defaultContainerSize, width = defaultContainerSize } =\n useResizeObserver({\n defaultHeight:\n direction === \"vertical\" ? defaultContainerSize : undefined,\n defaultWidth:\n direction === \"horizontal\" ? defaultContainerSize : undefined,\n element: containerElement,\n mode: direction === \"vertical\" ? \"only-height\" : \"only-width\",\n style: containerStyle\n });\n\n const prevSizeRef = useRef<{ height: number; width: number }>({\n height: 0,\n width: 0\n });\n\n const containerSize = direction === \"vertical\" ? height : width;\n\n const itemSize = useItemSize({ containerSize, itemSize: itemSizeProp });\n\n useLayoutEffect(() => {\n if (typeof onResize === \"function\") {\n const prevSize = prevSizeRef.current;\n\n if (prevSize.height !== height || prevSize.width !== width) {\n onResize({ height, width }, { ...prevSize });\n\n prevSize.height = height;\n prevSize.width = width;\n }\n }\n }, [height, onResize, width]);\n\n const cachedBounds = useCachedBounds({\n itemCount,\n itemProps,\n itemSize\n });\n\n const getCellBounds = useCallback(\n (index: number) => cachedBounds.get(index),\n [cachedBounds]\n );\n\n const [indices, setIndices] = useState<{\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n }>(() =>\n getStartStopIndicesUtil({\n cachedBounds,\n // TODO Potentially support a defaultScrollOffset prop?\n containerScrollOffset: 0,\n containerSize,\n itemCount,\n overscanCount\n })\n );\n\n // Guard against temporarily invalid indices that may occur when item count decreases\n // Cached bounds object will be re-created and a second render will restore things\n const {\n startIndexVisible,\n startIndexOverscan,\n stopIndexVisible,\n stopIndexOverscan\n } = {\n startIndexVisible: Math.min(itemCount - 1, indices.startIndexVisible),\n startIndexOverscan: Math.min(itemCount - 1, indices.startIndexOverscan),\n stopIndexVisible: Math.min(itemCount - 1, indices.stopIndexVisible),\n stopIndexOverscan: Math.min(itemCount - 1, indices.stopIndexOverscan)\n };\n\n const getEstimatedSize = useCallback(\n () =>\n getEstimatedSizeUtil({\n cachedBounds,\n itemCount,\n itemSize\n }),\n [cachedBounds, itemCount, itemSize]\n );\n\n const getStartStopIndices = useCallback(\n (scrollOffset: number) => {\n const containerScrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n return getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n },\n [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n isRtl,\n itemCount,\n overscanCount\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const scrollOffset =\n (direction === \"vertical\"\n ? containerElement?.scrollTop\n : containerElement?.scrollLeft) ?? 0;\n\n setIndices(getStartStopIndices(scrollOffset));\n }, [containerElement, direction, getStartStopIndices]);\n\n useIsomorphicLayoutEffect(() => {\n if (!containerElement) {\n return;\n }\n\n const onScroll = () => {\n setIndices((prev) => {\n const { scrollLeft, scrollTop } = containerElement;\n\n const scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset: direction === \"vertical\" ? scrollTop : scrollLeft\n });\n\n const next = getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset: scrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n\n if (shallowCompare(next, prev)) {\n return prev;\n }\n\n return next;\n });\n };\n\n containerElement.addEventListener(\"scroll\", onScroll);\n\n return () => {\n containerElement.removeEventListener(\"scroll\", onScroll);\n };\n }, [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n itemCount,\n overscanCount\n ]);\n\n const scrollToIndex = useStableCallback(\n ({\n align = \"auto\",\n containerScrollOffset,\n index\n }: {\n align?: Align;\n containerScrollOffset: number;\n index: number;\n }) => {\n let scrollOffset = getOffsetForIndex({\n align,\n cachedBounds,\n containerScrollOffset,\n containerSize,\n index,\n itemCount,\n itemSize\n });\n\n if (containerElement) {\n scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n if (typeof containerElement.scrollTo !== \"function\") {\n // Special case for environments like jsdom that don't implement scrollTo\n const next = getStartStopIndices(scrollOffset);\n if (!shallowCompare(indices, next)) {\n setIndices(next);\n }\n }\n\n return scrollOffset;\n }\n }\n );\n\n return {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n };\n}\n","import { useMemo } from \"react\";\n\nexport function useMemoizedObject<Type extends object>(\n unstableObject: Type\n): Type {\n return useMemo(() => {\n return unstableObject;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, Object.values(unstableObject));\n}\n","import type { CSSProperties } from \"react\";\nimport { shallowCompare } from \"./shallowCompare\";\n\n// Custom comparison function for React.memo()\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://react.dev/reference/react/memo#memo\nexport function arePropsEqual(\n prevProps: { ariaAttributes: object; style: CSSProperties },\n nextProps: { ariaAttributes: object; style: CSSProperties }\n): boolean {\n const {\n ariaAttributes: prevAriaAttributes,\n style: prevStyle,\n ...prevRest\n } = prevProps;\n const {\n ariaAttributes: nextAriaAttributes,\n style: nextStyle,\n ...nextRest\n } = nextProps;\n\n return (\n shallowCompare(prevAriaAttributes, nextAriaAttributes) &&\n shallowCompare(prevStyle, nextStyle) &&\n shallowCompare(prevRest, nextRest)\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useIsRtl } from \"../../core/useIsRtl\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport type { GridProps } from \"./types\";\n\n/**\n * Renders data with many rows and columns.\n *\n * ℹ️ Unlike `List` rows, `Grid` cell sizes must be known ahead of time.\n * Either static sizes or something that can be derived (from the data in `CellProps`) without rendering.\n */\nexport function Grid<\n CellProps extends object,\n TagName extends TagNames = \"div\"\n>({\n cellComponent: CellComponentProp,\n cellProps: cellPropsUnstable,\n children,\n className,\n columnCount,\n columnWidth,\n defaultHeight = 0,\n defaultWidth = 0,\n dir,\n gridRef,\n onCellsRendered,\n onResize,\n overscanCount = 3,\n rowCount,\n rowHeight,\n style,\n tagName = \"div\" as TagName,\n ...rest\n}: GridProps<CellProps, TagName>): ReactElement {\n const cellProps = useMemoizedObject(cellPropsUnstable);\n const CellComponent = useMemo(\n () => memo(CellComponentProp, arePropsEqual),\n [CellComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isRtl = useIsRtl(element, dir);\n\n const {\n getCellBounds: getColumnBounds,\n getEstimatedSize: getEstimatedWidth,\n startIndexOverscan: columnStartIndexOverscan,\n startIndexVisible: columnStartIndexVisible,\n scrollToIndex: scrollToColumnIndex,\n stopIndexOverscan: columnStopIndexOverscan,\n stopIndexVisible: columnStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultWidth,\n direction: \"horizontal\",\n isRtl,\n itemCount: columnCount,\n itemProps: cellProps,\n itemSize: columnWidth,\n onResize,\n overscanCount\n });\n\n const {\n getCellBounds: getRowBounds,\n getEstimatedSize: getEstimatedHeight,\n startIndexOverscan: rowStartIndexOverscan,\n startIndexVisible: rowStartIndexVisible,\n scrollToIndex: scrollToRowIndex,\n stopIndexOverscan: rowStopIndexOverscan,\n stopIndexVisible: rowStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: cellProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n gridRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToCell({\n behavior = \"auto\",\n columnAlign = \"auto\",\n columnIndex,\n rowAlign = \"auto\",\n rowIndex\n }: {\n behavior?: ScrollBehavior;\n columnAlign?: Align;\n columnIndex: number;\n rowAlign?: Align;\n rowIndex: number;\n }) {\n const left = scrollToColumnIndex({\n align: columnAlign,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index: columnIndex\n });\n const top = scrollToRowIndex({\n align: rowAlign,\n containerScrollOffset: element?.scrollTop ?? 0,\n index: rowIndex\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left,\n top\n });\n }\n },\n\n scrollToColumn({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const left = scrollToColumnIndex({\n align,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left\n });\n }\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToRowIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToColumnIndex, scrollToRowIndex]\n );\n\n useEffect(() => {\n if (\n columnStartIndexOverscan >= 0 &&\n columnStopIndexOverscan >= 0 &&\n rowStartIndexOverscan >= 0 &&\n rowStopIndexOverscan >= 0 &&\n onCellsRendered\n ) {\n onCellsRendered(\n {\n columnStartIndex: columnStartIndexVisible,\n columnStopIndex: columnStopIndexVisible,\n rowStartIndex: rowStartIndexVisible,\n rowStopIndex: rowStopIndexVisible\n },\n {\n columnStartIndex: columnStartIndexOverscan,\n columnStopIndex: columnStopIndexOverscan,\n rowStartIndex: rowStartIndexOverscan,\n rowStopIndex: rowStopIndexOverscan\n }\n );\n }\n }, [\n onCellsRendered,\n columnStartIndexOverscan,\n columnStartIndexVisible,\n columnStopIndexOverscan,\n columnStopIndexVisible,\n rowStartIndexOverscan,\n rowStartIndexVisible,\n rowStopIndexOverscan,\n rowStopIndexVisible\n ]);\n\n const cells = useMemo(() => {\n const children: ReactNode[] = [];\n if (columnCount > 0 && rowCount > 0) {\n for (\n let rowIndex = rowStartIndexOverscan;\n rowIndex <= rowStopIndexOverscan;\n rowIndex++\n ) {\n const rowBounds = getRowBounds(rowIndex);\n\n const columns: ReactNode[] = [];\n\n for (\n let columnIndex = columnStartIndexOverscan;\n columnIndex <= columnStopIndexOverscan;\n columnIndex++\n ) {\n const columnBounds = getColumnBounds(columnIndex);\n\n columns.push(\n <CellComponent\n {...(cellProps as CellProps)}\n ariaAttributes={{\n \"aria-colindex\": columnIndex + 1,\n role: \"gridcell\"\n }}\n columnIndex={columnIndex}\n key={columnIndex}\n rowIndex={rowIndex}\n style={{\n position: \"absolute\",\n left: isRtl ? undefined : 0,\n right: isRtl ? 0 : undefined,\n transform: `translate(${isRtl ? -columnBounds.scrollOffset : columnBounds.scrollOffset}px, ${rowBounds.scrollOffset}px)`,\n height: rowBounds.size,\n width: columnBounds.size\n }}\n />\n );\n }\n\n children.push(\n <div key={rowIndex} role=\"row\" aria-rowindex={rowIndex + 1}>\n {columns}\n </div>\n );\n }\n }\n return children;\n }, [\n CellComponent,\n cellProps,\n columnCount,\n columnStartIndexOverscan,\n columnStopIndexOverscan,\n getColumnBounds,\n getRowBounds,\n isRtl,\n rowCount,\n rowStartIndexOverscan,\n rowStopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedHeight(),\n width: getEstimatedWidth(),\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n \"aria-colcount\": columnCount,\n \"aria-rowcount\": rowCount,\n role: \"grid\",\n ...rest,\n className,\n dir,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n flexGrow: 1,\n overflow: \"auto\",\n ...style\n }\n },\n cells,\n children,\n sizingElement\n );\n}\n","import { useState } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Grid component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useGridCallbackRef =\n useState as typeof useState<GridImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Grid component.\n */\nexport const useGridRef = useRef as typeof useRef<GridImperativeAPI>;\n","import type { DynamicRowHeight } from \"./types\";\n\nexport function isDynamicRowHeight(value: unknown): value is DynamicRowHeight {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"getAverageRowHeight\" in value &&\n typeof value.getAverageRowHeight === \"function\"\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport { isDynamicRowHeight as isDynamicRowHeightUtil } from \"./isDynamicRowHeight\";\nimport type { ListProps } from \"./types\";\n\nexport const DATA_ATTRIBUTE_LIST_INDEX = \"data-react-window-index\";\n\n/**\n * Renders data with many rows.\n */\nexport function List<\n RowProps extends object,\n TagName extends TagNames = \"div\"\n>({\n children,\n className,\n defaultHeight = 0,\n listRef,\n onResize,\n onRowsRendered,\n overscanCount = 3,\n rowComponent: RowComponentProp,\n rowCount,\n rowHeight: rowHeightProp,\n rowProps: rowPropsUnstable,\n tagName = \"div\" as TagName,\n style,\n ...rest\n}: ListProps<RowProps, TagName>): ReactElement {\n const rowProps = useMemoizedObject(rowPropsUnstable);\n const RowComponent = useMemo(\n () => memo(RowComponentProp, arePropsEqual),\n [RowComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isDynamicRowHeight = isDynamicRowHeightUtil(rowHeightProp);\n\n const rowHeight = useMemo(() => {\n if (isDynamicRowHeight) {\n return (index: number) => {\n return (\n rowHeightProp.getRowHeight(index) ??\n rowHeightProp.getAverageRowHeight()\n );\n };\n }\n\n return rowHeightProp;\n }, [isDynamicRowHeight, rowHeightProp]);\n\n const {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: rowProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n listRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToIndex]\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!element) {\n return;\n }\n\n const rows = Array.from(element.children).filter((item, index) => {\n if (item.hasAttribute(\"aria-hidden\")) {\n // Ignore sizing element\n return false;\n }\n\n const attribute = `${startIndexOverscan + index}`;\n item.setAttribute(DATA_ATTRIBUTE_LIST_INDEX, attribute);\n\n return true;\n });\n\n if (isDynamicRowHeight) {\n return rowHeightProp.observeRowElements(rows);\n }\n }, [\n element,\n isDynamicRowHeight,\n rowHeightProp,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n useEffect(() => {\n if (startIndexOverscan >= 0 && stopIndexOverscan >= 0 && onRowsRendered) {\n onRowsRendered(\n {\n startIndex: startIndexVisible,\n stopIndex: stopIndexVisible\n },\n {\n startIndex: startIndexOverscan,\n stopIndex: stopIndexOverscan\n }\n );\n }\n }, [\n onRowsRendered,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n ]);\n\n const rows = useMemo(() => {\n const children: ReactNode[] = [];\n if (rowCount > 0) {\n for (\n let index = startIndexOverscan;\n index <= stopIndexOverscan;\n index++\n ) {\n const bounds = getCellBounds(index);\n\n children.push(\n <RowComponent\n {...(rowProps as RowProps)}\n ariaAttributes={{\n \"aria-posinset\": index + 1,\n \"aria-setsize\": rowCount,\n role: \"listitem\"\n }}\n key={index}\n index={index}\n style={{\n position: \"absolute\",\n left: 0,\n transform: `translateY(${bounds.scrollOffset}px)`,\n // In case of dynamic row heights, don't specify a height style\n // otherwise a default/estimated height would mask the actual height\n height: isDynamicRowHeight ? undefined : bounds.size,\n width: \"100%\"\n }}\n />\n );\n }\n }\n return children;\n }, [\n RowComponent,\n getCellBounds,\n isDynamicRowHeight,\n rowCount,\n rowProps,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedSize(),\n width: \"100%\",\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n role: \"list\",\n ...rest,\n className,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n flexGrow: 1,\n overflowY: \"auto\",\n ...style\n }\n },\n rows,\n children,\n sizingElement\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { assert } from \"../../utils/assert\";\nimport { DATA_ATTRIBUTE_LIST_INDEX } from \"./List\";\nimport type { DynamicRowHeight } from \"./types\";\n\nexport function useDynamicRowHeight({\n defaultRowHeight,\n key\n}: {\n defaultRowHeight: number;\n key?: string | number;\n}) {\n const [state, setState] = useState<{\n key: string | number | undefined;\n map: Map<number, number>;\n }>({\n key,\n map: new Map()\n });\n\n if (state.key !== key) {\n setState({\n key,\n map: new Map()\n });\n }\n\n const { map } = state;\n\n const getAverageRowHeight = useCallback(() => {\n let totalHeight = 0;\n\n map.forEach((height) => {\n totalHeight += height;\n });\n\n if (totalHeight === 0) {\n return defaultRowHeight;\n }\n\n return totalHeight / map.size;\n }, [defaultRowHeight, map]);\n\n const getRowHeight = useCallback(\n (index: number) => {\n const measuredHeight = map.get(index);\n if (measuredHeight !== undefined) {\n return measuredHeight;\n }\n\n // Temporarily store default height in the cache map to avoid scroll jumps if rowProps change\n // Else rowProps changes can impact the average height, and cause rows to shift up or down within the list\n // see github.com/bvaughn/react-window/issues/863\n map.set(index, defaultRowHeight);\n\n return defaultRowHeight;\n },\n [defaultRowHeight, map]\n );\n\n const setRowHeight = useCallback((index: number, size: number) => {\n setState((prevState) => {\n if (prevState.map.get(index) === size) {\n return prevState;\n }\n\n const clonedMap = new Map(prevState.map);\n clonedMap.set(index, size);\n\n return {\n ...prevState,\n map: clonedMap\n };\n });\n }, []);\n\n const resizeObserverCallback = useStableCallback(\n (entries: ResizeObserverEntry[]) => {\n if (entries.length === 0) {\n return;\n }\n\n entries.forEach((entry) => {\n const { borderBoxSize, target } = entry;\n\n const attribute = target.getAttribute(DATA_ATTRIBUTE_LIST_INDEX);\n assert(\n attribute !== null,\n `Invalid ${DATA_ATTRIBUTE_LIST_INDEX} attribute value`\n );\n\n const index = parseInt(attribute);\n\n const { blockSize: height } = borderBoxSize[0];\n if (!height) {\n // Ignore heights that have not yet been measured (e.g. <img> elements that have not yet loaded)\n return;\n }\n\n setRowHeight(index, height);\n });\n }\n );\n\n const [resizeObserver] = useState(() => {\n if (typeof ResizeObserver !== \"undefined\") {\n return new ResizeObserver(resizeObserverCallback);\n }\n });\n\n useEffect(() => {\n if (resizeObserver) {\n return () => {\n resizeObserver.disconnect();\n };\n }\n }, [resizeObserver]);\n\n const observeRowElements = useCallback(\n (elements: Element[] | NodeListOf<Element>) => {\n if (resizeObserver) {\n elements.forEach((element) => resizeObserver.observe(element));\n return () => {\n elements.forEach((element) => resizeObserver.unobserve(element));\n };\n }\n return () => {};\n },\n [resizeObserver]\n );\n\n return useMemo<DynamicRowHeight>(\n () => ({\n getAverageRowHeight,\n getRowHeight,\n setRowHeight,\n observeRowElements\n }),\n [getAverageRowHeight, getRowHeight, setRowHeight, observeRowElements]\n );\n}\n","import { useState } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the List component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useListCallbackRef =\n useState as typeof useState<ListImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the List component.\n */\nexport const useListRef = useRef as typeof useRef<ListImperativeAPI>;\n","let size: number = -1;\n\nexport function getScrollbarSize(recalculate: boolean = false): number {\n if (size === -1 || recalculate) {\n const div = document.createElement(\"div\");\n const style = div.style;\n style.width = \"50px\";\n style.height = \"50px\";\n style.overflow = \"scroll\";\n\n document.body.appendChild(div);\n\n size = div.offsetWidth - div.clientWidth;\n\n document.body.removeChild(div);\n }\n\n return size;\n}\n\nexport function setScrollbarSizeForTests(value: number) {\n size = value;\n}\n"],"names":["isRtl","element","currentElement","useIsRtl","dir","value","setValue","useState","useLayoutEffect","useIsomorphicLayoutEffect","useEffect","parseNumericStyleValue","useResizeObserver","box","defaultHeight","defaultWidth","disabledProp","mode","style","styleHeight","styleWidth","useMemo","state","setState","disabled","resizeObserver","entries","entry","contentRect","target","prevState","useStableCallback","fn","ref","useRef","useCallback","args","cachedRTLResult","getRTLOffsetType","recalculate","outerDiv","outerStyle","innerDiv","innerStyle","adjustScrollOffsetForRtl","containerElement","direction","scrollOffset","clientWidth","scrollLeft","scrollWidth","assert","expectedCondition","message","shallowCompare","a","b","key","getEstimatedSize","cachedBounds","itemCount","itemSize","bounds","averageItemSize","getOffsetForIndex","align","index","containerScrollOffset","containerSize","estimatedTotalSize","maxOffset","minOffset","getStartStopIndices","overscanCount","maxIndex","startIndexVisible","stopIndexVisible","startIndexOverscan","stopIndexOverscan","currentIndex","createCachedBounds","itemProps","cache","size","previousRowBounds","useCachedBounds","useItemSize","itemSizeProp","useVirtualizer","containerStyle","defaultContainerSize","onResize","height","width","prevSizeRef","prevSize","getCellBounds","indices","setIndices","getStartStopIndicesUtil","getEstimatedSizeUtil","onScroll","prev","scrollTop","next","scrollToIndex","useMemoizedObject","unstableObject","arePropsEqual","prevProps","nextProps","prevAriaAttributes","prevStyle","prevRest","nextAriaAttributes","nextStyle","nextRest","Grid","CellComponentProp","cellPropsUnstable","children","className","columnCount","columnWidth","gridRef","onCellsRendered","rowCount","rowHeight","tagName","rest","cellProps","CellComponent","memo","setElement","getColumnBounds","getEstimatedWidth","columnStartIndexOverscan","columnStartIndexVisible","scrollToColumnIndex","columnStopIndexOverscan","columnStopIndexVisible","getRowBounds","getEstimatedHeight","rowStartIndexOverscan","rowStartIndexVisible","scrollToRowIndex","rowStopIndexOverscan","rowStopIndexVisible","useImperativeHandle","behavior","columnAlign","columnIndex","rowAlign","rowIndex","left","top","cells","rowBounds","columns","columnBounds","createElement","jsx","sizingElement","useGridCallbackRef","useGridRef","isDynamicRowHeight","DATA_ATTRIBUTE_LIST_INDEX","List","listRef","onRowsRendered","RowComponentProp","rowHeightProp","rowPropsUnstable","rowProps","RowComponent","isDynamicRowHeightUtil","rows","item","attribute","useDynamicRowHeight","defaultRowHeight","map","getAverageRowHeight","totalHeight","getRowHeight","measuredHeight","setRowHeight","clonedMap","resizeObserverCallback","borderBoxSize","observeRowElements","elements","useListCallbackRef","useListRef","getScrollbarSize","div"],"mappings":"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"}
|
package/dist/react-window.d.ts
CHANGED
|
@@ -37,6 +37,9 @@ export declare function getScrollbarSize(recalculate?: boolean): number;
|
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
39
|
* Renders data with many rows and columns.
|
|
40
|
+
*
|
|
41
|
+
* ℹ️ Unlike `List` rows, `Grid` cell sizes must be known ahead of time.
|
|
42
|
+
* Either static sizes or something that can be derived (from the data in `CellProps`) without rendering.
|
|
40
43
|
*/
|
|
41
44
|
export declare function Grid<CellProps extends object, TagName extends TagNames = "div">({ cellComponent: CellComponentProp, cellProps: cellPropsUnstable, children, className, columnCount, columnWidth, defaultHeight, defaultWidth, dir, gridRef, onCellsRendered, onResize, overscanCount, rowCount, rowHeight, style, tagName, ...rest }: GridProps<CellProps, TagName>): ReactElement;
|
|
42
45
|
|
|
@@ -142,7 +145,7 @@ export declare type GridProps<CellProps extends object, TagName extends TagNames
|
|
|
142
145
|
* Column width; the following formats are supported:
|
|
143
146
|
* - number of pixels (number)
|
|
144
147
|
* - percentage of the grid's current width (string)
|
|
145
|
-
* - function that returns the
|
|
148
|
+
* - function that returns the column width (in pixels) given an index and `cellProps`
|
|
146
149
|
*/
|
|
147
150
|
columnWidth: number | string | ((index: number, cellProps: CellProps) => number);
|
|
148
151
|
/**
|
package/dist/react-window.js
CHANGED
|
@@ -44,12 +44,12 @@ function be({
|
|
|
44
44
|
styleWidth: ie(i?.width)
|
|
45
45
|
}),
|
|
46
46
|
[i?.height, i?.width]
|
|
47
|
-
), [
|
|
47
|
+
), [c, d] = M({
|
|
48
48
|
height: t,
|
|
49
49
|
width: s
|
|
50
|
-
}),
|
|
50
|
+
}), a = r || o === "only-height" && f !== void 0 || o === "only-width" && l !== void 0 || f !== void 0 && l !== void 0;
|
|
51
51
|
return q(() => {
|
|
52
|
-
if (n === null ||
|
|
52
|
+
if (n === null || a)
|
|
53
53
|
return;
|
|
54
54
|
const h = new ResizeObserver((p) => {
|
|
55
55
|
for (const I of p) {
|
|
@@ -63,12 +63,12 @@ function be({
|
|
|
63
63
|
return h.observe(n, { box: e }), () => {
|
|
64
64
|
h?.unobserve(n);
|
|
65
65
|
};
|
|
66
|
-
}, [e,
|
|
66
|
+
}, [e, a, n, f, l]), A(
|
|
67
67
|
() => ({
|
|
68
|
-
height: f ??
|
|
69
|
-
width: l ??
|
|
68
|
+
height: f ?? c.height,
|
|
69
|
+
width: l ?? c.width
|
|
70
70
|
}),
|
|
71
|
-
[
|
|
71
|
+
[c, f, l]
|
|
72
72
|
);
|
|
73
73
|
}
|
|
74
74
|
function ae(e) {
|
|
@@ -158,23 +158,23 @@ function we({
|
|
|
158
158
|
cachedBounds: t,
|
|
159
159
|
itemCount: r,
|
|
160
160
|
itemSize: n
|
|
161
|
-
}), l = t.get(s),
|
|
161
|
+
}), l = t.get(s), c = Math.max(
|
|
162
162
|
0,
|
|
163
163
|
Math.min(f - i, l.scrollOffset)
|
|
164
164
|
), d = Math.max(
|
|
165
165
|
0,
|
|
166
166
|
l.scrollOffset - i + l.size
|
|
167
167
|
);
|
|
168
|
-
switch (e === "smart" && (o >= d && o <=
|
|
168
|
+
switch (e === "smart" && (o >= d && o <= c ? e = "auto" : e = "center"), e) {
|
|
169
169
|
case "start":
|
|
170
|
-
return
|
|
170
|
+
return c;
|
|
171
171
|
case "end":
|
|
172
172
|
return d;
|
|
173
173
|
case "center":
|
|
174
174
|
return l.scrollOffset <= i / 2 ? 0 : l.scrollOffset + l.size / 2 >= f - i / 2 ? f - i : l.scrollOffset + l.size / 2 - i / 2;
|
|
175
175
|
case "auto":
|
|
176
176
|
default:
|
|
177
|
-
return o >= d && o <=
|
|
177
|
+
return o >= d && o <= c ? o : o < d ? d : c;
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
function P({
|
|
@@ -185,24 +185,24 @@ function P({
|
|
|
185
185
|
overscanCount: n
|
|
186
186
|
}) {
|
|
187
187
|
const o = r - 1;
|
|
188
|
-
let i = 0, f = -1, l = 0,
|
|
188
|
+
let i = 0, f = -1, l = 0, c = -1, d = 0;
|
|
189
189
|
for (; d < o; ) {
|
|
190
|
-
const
|
|
191
|
-
if (
|
|
190
|
+
const a = e.get(d);
|
|
191
|
+
if (a.scrollOffset + a.size > t)
|
|
192
192
|
break;
|
|
193
193
|
d++;
|
|
194
194
|
}
|
|
195
195
|
for (i = d, l = Math.max(0, i - n); d < o; ) {
|
|
196
|
-
const
|
|
197
|
-
if (
|
|
196
|
+
const a = e.get(d);
|
|
197
|
+
if (a.scrollOffset + a.size >= t + s)
|
|
198
198
|
break;
|
|
199
199
|
d++;
|
|
200
200
|
}
|
|
201
|
-
return f = Math.min(o, d),
|
|
201
|
+
return f = Math.min(o, d), c = Math.min(r - 1, f + n), i < 0 && (i = 0, f = -1, l = 0, c = -1), {
|
|
202
202
|
startIndexVisible: i,
|
|
203
203
|
stopIndexVisible: f,
|
|
204
204
|
startIndexOverscan: l,
|
|
205
|
-
stopIndexOverscan:
|
|
205
|
+
stopIndexOverscan: c
|
|
206
206
|
};
|
|
207
207
|
}
|
|
208
208
|
function me({
|
|
@@ -303,9 +303,9 @@ function te({
|
|
|
303
303
|
itemProps: i,
|
|
304
304
|
itemSize: f,
|
|
305
305
|
onResize: l,
|
|
306
|
-
overscanCount:
|
|
306
|
+
overscanCount: c
|
|
307
307
|
}) {
|
|
308
|
-
const { height: d = s, width:
|
|
308
|
+
const { height: d = s, width: a = s } = be({
|
|
309
309
|
defaultHeight: r === "vertical" ? s : void 0,
|
|
310
310
|
defaultWidth: r === "horizontal" ? s : void 0,
|
|
311
311
|
element: e,
|
|
@@ -314,13 +314,13 @@ function te({
|
|
|
314
314
|
}), h = K({
|
|
315
315
|
height: 0,
|
|
316
316
|
width: 0
|
|
317
|
-
}), p = r === "vertical" ? d :
|
|
317
|
+
}), p = r === "vertical" ? d : a, I = ye({ containerSize: p, itemSize: f });
|
|
318
318
|
re(() => {
|
|
319
319
|
if (typeof l == "function") {
|
|
320
320
|
const g = h.current;
|
|
321
|
-
(g.height !== d || g.width !==
|
|
321
|
+
(g.height !== d || g.width !== a) && (l({ height: d, width: a }, { ...g }), g.height = d, g.width = a);
|
|
322
322
|
}
|
|
323
|
-
}, [d, l,
|
|
323
|
+
}, [d, l, a]);
|
|
324
324
|
const u = Oe({
|
|
325
325
|
itemCount: o,
|
|
326
326
|
itemProps: i,
|
|
@@ -335,7 +335,7 @@ function te({
|
|
|
335
335
|
containerScrollOffset: 0,
|
|
336
336
|
containerSize: p,
|
|
337
337
|
itemCount: o,
|
|
338
|
-
overscanCount:
|
|
338
|
+
overscanCount: c
|
|
339
339
|
})
|
|
340
340
|
), {
|
|
341
341
|
startIndexVisible: G,
|
|
@@ -367,7 +367,7 @@ function te({
|
|
|
367
367
|
containerScrollOffset: S,
|
|
368
368
|
containerSize: p,
|
|
369
369
|
itemCount: o,
|
|
370
|
-
overscanCount:
|
|
370
|
+
overscanCount: c
|
|
371
371
|
});
|
|
372
372
|
},
|
|
373
373
|
[
|
|
@@ -377,7 +377,7 @@ function te({
|
|
|
377
377
|
r,
|
|
378
378
|
n,
|
|
379
379
|
o,
|
|
380
|
-
|
|
380
|
+
c
|
|
381
381
|
]
|
|
382
382
|
);
|
|
383
383
|
q(() => {
|
|
@@ -398,7 +398,7 @@ function te({
|
|
|
398
398
|
containerScrollOffset: v,
|
|
399
399
|
containerSize: p,
|
|
400
400
|
itemCount: o,
|
|
401
|
-
overscanCount:
|
|
401
|
+
overscanCount: c
|
|
402
402
|
});
|
|
403
403
|
return Y(R, S) ? S : R;
|
|
404
404
|
});
|
|
@@ -412,7 +412,7 @@ function te({
|
|
|
412
412
|
p,
|
|
413
413
|
r,
|
|
414
414
|
o,
|
|
415
|
-
|
|
415
|
+
c
|
|
416
416
|
]);
|
|
417
417
|
const y = ae(
|
|
418
418
|
({
|
|
@@ -478,9 +478,9 @@ function Ee({
|
|
|
478
478
|
defaultHeight: i = 0,
|
|
479
479
|
defaultWidth: f = 0,
|
|
480
480
|
dir: l,
|
|
481
|
-
gridRef:
|
|
481
|
+
gridRef: c,
|
|
482
482
|
onCellsRendered: d,
|
|
483
|
-
onResize:
|
|
483
|
+
onResize: a,
|
|
484
484
|
overscanCount: h = 3,
|
|
485
485
|
rowCount: p,
|
|
486
486
|
rowHeight: I,
|
|
@@ -508,7 +508,7 @@ function Ee({
|
|
|
508
508
|
itemCount: n,
|
|
509
509
|
itemProps: O,
|
|
510
510
|
itemSize: o,
|
|
511
|
-
onResize:
|
|
511
|
+
onResize: a,
|
|
512
512
|
overscanCount: h
|
|
513
513
|
}), {
|
|
514
514
|
getCellBounds: v,
|
|
@@ -526,11 +526,11 @@ function Ee({
|
|
|
526
526
|
itemCount: p,
|
|
527
527
|
itemProps: O,
|
|
528
528
|
itemSize: I,
|
|
529
|
-
onResize:
|
|
529
|
+
onResize: a,
|
|
530
530
|
overscanCount: h
|
|
531
531
|
});
|
|
532
532
|
ce(
|
|
533
|
-
|
|
533
|
+
c,
|
|
534
534
|
() => ({
|
|
535
535
|
get element() {
|
|
536
536
|
return x;
|
|
@@ -713,16 +713,16 @@ function Ae({
|
|
|
713
713
|
overscanCount: i = 3,
|
|
714
714
|
rowComponent: f,
|
|
715
715
|
rowCount: l,
|
|
716
|
-
rowHeight:
|
|
716
|
+
rowHeight: c,
|
|
717
717
|
rowProps: d,
|
|
718
|
-
tagName:
|
|
718
|
+
tagName: a = "div",
|
|
719
719
|
style: h,
|
|
720
720
|
...p
|
|
721
721
|
}) {
|
|
722
722
|
const I = de(d), u = A(
|
|
723
723
|
() => le(f, ue),
|
|
724
724
|
[f]
|
|
725
|
-
), [w, m] = M(null), O = ze(
|
|
725
|
+
), [w, m] = M(null), O = ze(c), G = A(() => O ? (b) => c.getRowHeight(b) ?? c.getAverageRowHeight() : c, [O, c]), {
|
|
726
726
|
getCellBounds: x,
|
|
727
727
|
getEstimatedSize: F,
|
|
728
728
|
scrollToIndex: V,
|
|
@@ -774,11 +774,11 @@ function Ae({
|
|
|
774
774
|
return v.setAttribute(se, k), !0;
|
|
775
775
|
});
|
|
776
776
|
if (O)
|
|
777
|
-
return
|
|
777
|
+
return c.observeRowElements(b);
|
|
778
778
|
}, [
|
|
779
779
|
w,
|
|
780
780
|
O,
|
|
781
|
-
|
|
781
|
+
c,
|
|
782
782
|
z,
|
|
783
783
|
y
|
|
784
784
|
]), J(() => {
|
|
@@ -850,7 +850,7 @@ function Ae({
|
|
|
850
850
|
}
|
|
851
851
|
);
|
|
852
852
|
return X(
|
|
853
|
-
|
|
853
|
+
a,
|
|
854
854
|
{
|
|
855
855
|
role: "list",
|
|
856
856
|
...p,
|
|
@@ -882,29 +882,29 @@ function ke({
|
|
|
882
882
|
map: /* @__PURE__ */ new Map()
|
|
883
883
|
});
|
|
884
884
|
const { map: n } = s, o = D(() => {
|
|
885
|
-
let
|
|
885
|
+
let a = 0;
|
|
886
886
|
return n.forEach((h) => {
|
|
887
|
-
|
|
888
|
-
}),
|
|
887
|
+
a += h;
|
|
888
|
+
}), a === 0 ? e : a / n.size;
|
|
889
889
|
}, [e, n]), i = D(
|
|
890
|
-
(
|
|
891
|
-
const h = n.get(
|
|
892
|
-
return h !== void 0 ? h : (n.set(
|
|
890
|
+
(a) => {
|
|
891
|
+
const h = n.get(a);
|
|
892
|
+
return h !== void 0 ? h : (n.set(a, e), e);
|
|
893
893
|
},
|
|
894
894
|
[e, n]
|
|
895
|
-
), f = D((
|
|
895
|
+
), f = D((a, h) => {
|
|
896
896
|
r((p) => {
|
|
897
|
-
if (p.map.get(
|
|
897
|
+
if (p.map.get(a) === h)
|
|
898
898
|
return p;
|
|
899
899
|
const I = new Map(p.map);
|
|
900
|
-
return I.set(
|
|
900
|
+
return I.set(a, h), {
|
|
901
901
|
...p,
|
|
902
902
|
map: I
|
|
903
903
|
};
|
|
904
904
|
});
|
|
905
905
|
}, []), l = ae(
|
|
906
|
-
(
|
|
907
|
-
|
|
906
|
+
(a) => {
|
|
907
|
+
a.length !== 0 && a.forEach((h) => {
|
|
908
908
|
const { borderBoxSize: p, target: I } = h, u = I.getAttribute(se);
|
|
909
909
|
L(
|
|
910
910
|
u !== null,
|
|
@@ -914,17 +914,22 @@ function ke({
|
|
|
914
914
|
m && f(w, m);
|
|
915
915
|
});
|
|
916
916
|
}
|
|
917
|
-
), [
|
|
918
|
-
(
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
917
|
+
), [c] = M(() => {
|
|
918
|
+
if (typeof ResizeObserver < "u")
|
|
919
|
+
return new ResizeObserver(l);
|
|
920
|
+
});
|
|
921
|
+
J(() => {
|
|
922
|
+
if (c)
|
|
923
|
+
return () => {
|
|
924
|
+
c.disconnect();
|
|
925
|
+
};
|
|
926
|
+
}, [c]);
|
|
923
927
|
const d = D(
|
|
924
|
-
(
|
|
925
|
-
|
|
926
|
-
})
|
|
927
|
-
|
|
928
|
+
(a) => c ? (a.forEach((h) => c.observe(h)), () => {
|
|
929
|
+
a.forEach((h) => c.unobserve(h));
|
|
930
|
+
}) : () => {
|
|
931
|
+
},
|
|
932
|
+
[c]
|
|
928
933
|
);
|
|
929
934
|
return A(
|
|
930
935
|
() => ({
|
package/dist/react-window.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-window.js","sources":["../lib/utils/isRtl.ts","../lib/core/useIsRtl.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/utils/parseNumericStyleValue.ts","../lib/hooks/useResizeObserver.ts","../lib/hooks/useStableCallback.ts","../lib/utils/getRTLOffsetType.ts","../lib/utils/adjustScrollOffsetForRtl.ts","../lib/utils/assert.ts","../lib/utils/shallowCompare.ts","../lib/core/getEstimatedSize.ts","../lib/core/getOffsetForIndex.ts","../lib/core/getStartStopIndices.ts","../lib/core/createCachedBounds.ts","../lib/core/useCachedBounds.ts","../lib/core/useItemSize.ts","../lib/core/useVirtualizer.ts","../lib/hooks/useMemoizedObject.ts","../lib/utils/arePropsEqual.ts","../lib/components/grid/Grid.tsx","../lib/components/grid/useGridCallbackRef.ts","../lib/components/grid/useGridRef.ts","../lib/components/list/isDynamicRowHeight.ts","../lib/components/list/List.tsx","../lib/components/list/useDynamicRowHeight.ts","../lib/components/list/useListCallbackRef.ts","../lib/components/list/useListRef.ts","../lib/utils/getScrollbarSize.ts"],"sourcesContent":["export function isRtl(element: HTMLElement) {\n let currentElement: HTMLElement | null = element;\n while (currentElement) {\n if (currentElement.dir) {\n return currentElement.dir === \"rtl\";\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return false;\n}\n","import { useLayoutEffect, useState, type HTMLAttributes } from \"react\";\nimport { isRtl } from \"../utils/isRtl\";\n\nexport function useIsRtl(\n element: HTMLElement | null,\n dir: HTMLAttributes<HTMLElement>[\"dir\"]\n) {\n const [value, setValue] = useState(dir === \"rtl\");\n\n useLayoutEffect(() => {\n if (element) {\n if (!dir) {\n setValue(isRtl(element));\n }\n }\n }, [dir, element]);\n\n return value;\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import type { CSSProperties } from \"react\";\n\nexport function parseNumericStyleValue(\n value: CSSProperties[\"height\"]\n): number | undefined {\n if (value !== undefined) {\n switch (typeof value) {\n case \"number\": {\n return value;\n }\n case \"string\": {\n if (value.endsWith(\"px\")) {\n return parseFloat(value);\n }\n break;\n }\n }\n }\n}\n","import { useMemo, useState, type CSSProperties } from \"react\";\nimport { parseNumericStyleValue } from \"../utils/parseNumericStyleValue\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useResizeObserver({\n box,\n defaultHeight,\n defaultWidth,\n disabled: disabledProp,\n element,\n mode,\n style\n}: {\n box?: ResizeObserverBoxOptions;\n defaultHeight?: number;\n defaultWidth?: number;\n disabled?: boolean;\n element: HTMLElement | null;\n mode?: \"only-height\" | \"only-width\";\n style: CSSProperties | undefined;\n}) {\n const { styleHeight, styleWidth } = useMemo(\n () => ({\n styleHeight: parseNumericStyleValue(style?.height),\n styleWidth: parseNumericStyleValue(style?.width)\n }),\n [style?.height, style?.width]\n );\n\n const [state, setState] = useState<{\n height: number | undefined;\n width: number | undefined;\n }>({\n height: defaultHeight,\n width: defaultWidth\n });\n\n const disabled =\n disabledProp ||\n (mode === \"only-height\" && styleHeight !== undefined) ||\n (mode === \"only-width\" && styleWidth !== undefined) ||\n (styleHeight !== undefined && styleWidth !== undefined);\n\n useIsomorphicLayoutEffect(() => {\n if (element === null || disabled) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { contentRect, target } = entry;\n if (element === target) {\n setState((prevState) => {\n if (\n prevState.height === contentRect.height &&\n prevState.width === contentRect.width\n ) {\n return prevState;\n }\n\n return {\n height: contentRect.height,\n width: contentRect.width\n };\n });\n }\n }\n });\n resizeObserver.observe(element, { box });\n\n return () => {\n resizeObserver?.unobserve(element);\n };\n }, [box, disabled, element, styleHeight, styleWidth]);\n\n return useMemo(\n () => ({\n height: styleHeight ?? state.height,\n width: styleWidth ?? state.width\n }),\n [state, styleHeight, styleWidth]\n );\n}\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(() => {\n throw new Error(\"Cannot call during render.\");\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","export type RTLOffsetType =\n | \"negative\"\n | \"positive-descending\"\n | \"positive-ascending\";\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement(\"div\");\n const outerStyle = outerDiv.style;\n outerStyle.width = \"50px\";\n outerStyle.height = \"50px\";\n outerStyle.overflow = \"scroll\";\n outerStyle.direction = \"rtl\";\n\n const innerDiv = document.createElement(\"div\");\n const innerStyle = innerDiv.style;\n innerStyle.width = \"100px\";\n innerStyle.height = \"100px\";\n\n outerDiv.appendChild(innerDiv);\n\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = \"positive-descending\";\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = \"negative\";\n } else {\n cachedRTLResult = \"positive-ascending\";\n }\n }\n\n document.body.removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","import type { Direction } from \"../core/types\";\nimport { getRTLOffsetType } from \"./getRTLOffsetType\";\n\nexport function adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n}: {\n containerElement: HTMLElement | null;\n direction: Direction;\n isRtl: boolean;\n scrollOffset: number;\n}) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n if (direction === \"horizontal\") {\n if (isRtl) {\n switch (getRTLOffsetType()) {\n case \"negative\": {\n return -scrollOffset;\n }\n case \"positive-descending\": {\n if (containerElement) {\n const { clientWidth, scrollLeft, scrollWidth } = containerElement;\n return scrollWidth - clientWidth - scrollLeft;\n }\n break;\n }\n }\n }\n }\n return scrollOffset;\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","import { assert } from \"./assert\";\n\nexport function shallowCompare<Type extends object>(\n a: Type | undefined,\n b: Type | undefined\n) {\n if (a === b) {\n return true;\n }\n\n if (!!a !== !!b) {\n return false;\n }\n\n assert(a !== undefined);\n assert(b !== undefined);\n\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (!Object.is(b[key], a[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type { CachedBounds, SizeFunction } from \"./types\";\nimport { assert } from \"../utils/assert\";\n\nexport function getEstimatedSize<Props extends object>({\n cachedBounds,\n itemCount,\n itemSize\n}: {\n cachedBounds: CachedBounds;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n}) {\n if (itemCount === 0) {\n return 0;\n } else if (typeof itemSize === \"number\") {\n return itemCount * itemSize;\n } else {\n const bounds = cachedBounds.get(\n cachedBounds.size === 0 ? 0 : cachedBounds.size - 1\n );\n assert(bounds !== undefined, \"Unexpected bounds cache miss\");\n\n const averageItemSize =\n (bounds.scrollOffset + bounds.size) / cachedBounds.size;\n\n return itemCount * averageItemSize;\n }\n}\n","import type { Align } from \"../types\";\nimport { getEstimatedSize } from \"./getEstimatedSize\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function getOffsetForIndex<Props extends object>({\n align,\n cachedBounds,\n index,\n itemCount,\n itemSize,\n containerScrollOffset,\n containerSize\n}: {\n align: Align;\n cachedBounds: CachedBounds;\n index: number;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n containerScrollOffset: number;\n containerSize: number;\n}) {\n if (index < 0 || index >= itemCount) {\n throw RangeError(`Invalid index specified: ${index}`, {\n cause: `Index ${index} is not within the range of 0 - ${itemCount - 1}`\n });\n }\n\n const estimatedTotalSize = getEstimatedSize({\n cachedBounds,\n itemCount,\n itemSize\n });\n\n const bounds = cachedBounds.get(index);\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - containerSize, bounds.scrollOffset)\n );\n const minOffset = Math.max(\n 0,\n bounds.scrollOffset - containerSize + bounds.size\n );\n\n if (align === \"smart\") {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n align = \"auto\";\n } else {\n align = \"center\";\n }\n }\n\n switch (align) {\n case \"start\": {\n return maxOffset;\n }\n case \"end\": {\n return minOffset;\n }\n case \"center\": {\n if (bounds.scrollOffset <= containerSize / 2) {\n // Too near the beginning to center-align\n return 0;\n } else if (\n bounds.scrollOffset + bounds.size / 2 >=\n estimatedTotalSize - containerSize / 2\n ) {\n // Too near the end to center-align\n return estimatedTotalSize - containerSize;\n } else {\n return bounds.scrollOffset + bounds.size / 2 - containerSize / 2;\n }\n }\n case \"auto\":\n default: {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n return containerScrollOffset;\n } else if (containerScrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n}\n","import type { CachedBounds } from \"./types\";\n\nexport function getStartStopIndices({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n}: {\n cachedBounds: CachedBounds;\n containerScrollOffset: number;\n containerSize: number;\n itemCount: number;\n overscanCount: number;\n}): {\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n} {\n const maxIndex = itemCount - 1;\n\n let startIndexVisible = 0;\n let stopIndexVisible = -1;\n let startIndexOverscan = 0;\n let stopIndexOverscan = -1;\n let currentIndex = 0;\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (bounds.scrollOffset + bounds.size > containerScrollOffset) {\n break;\n }\n\n currentIndex++;\n }\n\n startIndexVisible = currentIndex;\n startIndexOverscan = Math.max(0, startIndexVisible - overscanCount);\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (\n bounds.scrollOffset + bounds.size >=\n containerScrollOffset + containerSize\n ) {\n break;\n }\n\n currentIndex++;\n }\n\n stopIndexVisible = Math.min(maxIndex, currentIndex);\n stopIndexOverscan = Math.min(itemCount - 1, stopIndexVisible + overscanCount);\n\n if (startIndexVisible < 0) {\n startIndexVisible = 0;\n stopIndexVisible = -1;\n startIndexOverscan = 0;\n stopIndexOverscan = -1;\n }\n\n return {\n startIndexVisible,\n stopIndexVisible,\n startIndexOverscan,\n stopIndexOverscan\n };\n}\n","import { assert } from \"../utils/assert\";\nimport type { Bounds, CachedBounds, SizeFunction } from \"./types\";\n\nexport function createCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n const cache = new Map<number, Bounds>();\n\n return {\n get(index: number) {\n assert(index < itemCount, `Invalid index ${index}`);\n\n while (cache.size - 1 < index) {\n const currentIndex = cache.size;\n\n let size: number;\n switch (typeof itemSize) {\n case \"function\": {\n size = itemSize(currentIndex, itemProps);\n break;\n }\n case \"number\": {\n size = itemSize;\n break;\n }\n }\n\n if (currentIndex === 0) {\n cache.set(currentIndex, {\n size,\n scrollOffset: 0\n });\n } else {\n const previousRowBounds = cache.get(currentIndex - 1);\n assert(\n previousRowBounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n cache.set(currentIndex, {\n scrollOffset:\n previousRowBounds.scrollOffset + previousRowBounds.size,\n size\n });\n }\n }\n\n const bounds = cache.get(index);\n assert(\n bounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n return bounds;\n },\n set(index: number, bounds: Bounds) {\n cache.set(index, bounds);\n },\n get size() {\n return cache.size;\n }\n };\n}\n","import { useMemo } from \"react\";\nimport { createCachedBounds } from \"./createCachedBounds\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function useCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n return useMemo(\n () =>\n createCachedBounds({\n itemCount,\n itemProps,\n itemSize\n }),\n [itemCount, itemProps, itemSize]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { SizeFunction } from \"./types\";\n\nexport function useItemSize<Props extends object>({\n containerSize,\n itemSize: itemSizeProp\n}: {\n containerSize: number;\n itemSize: number | string | SizeFunction<Props>;\n}) {\n let itemSize: number | SizeFunction<Props>;\n switch (typeof itemSizeProp) {\n case \"string\": {\n assert(\n itemSizeProp.endsWith(\"%\"),\n `Invalid item size: \"${itemSizeProp}\"; string values must be percentages (e.g. \"100%\")`\n );\n assert(\n containerSize !== undefined,\n \"Container size must be defined if a percentage item size is specified\"\n );\n\n itemSize = (containerSize * parseInt(itemSizeProp)) / 100;\n break;\n }\n default: {\n itemSize = itemSizeProp;\n break;\n }\n }\n\n return itemSize;\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\nimport { useStableCallback } from \"../hooks/useStableCallback\";\nimport type { Align } from \"../types\";\nimport { adjustScrollOffsetForRtl } from \"../utils/adjustScrollOffsetForRtl\";\nimport { shallowCompare } from \"../utils/shallowCompare\";\nimport { getEstimatedSize as getEstimatedSizeUtil } from \"./getEstimatedSize\";\nimport { getOffsetForIndex } from \"./getOffsetForIndex\";\nimport { getStartStopIndices as getStartStopIndicesUtil } from \"./getStartStopIndices\";\nimport type { Direction, SizeFunction } from \"./types\";\nimport { useCachedBounds } from \"./useCachedBounds\";\nimport { useItemSize } from \"./useItemSize\";\n\nexport function useVirtualizer<Props extends object>({\n containerElement,\n containerStyle,\n defaultContainerSize = 0,\n direction,\n isRtl = false,\n itemCount,\n itemProps,\n itemSize: itemSizeProp,\n onResize,\n overscanCount\n}: {\n containerElement: HTMLElement | null;\n containerStyle?: CSSProperties;\n defaultContainerSize?: number;\n direction: Direction;\n isRtl?: boolean;\n itemCount: number;\n itemProps: Props;\n itemSize: number | string | SizeFunction<Props>;\n onResize:\n | ((\n size: { height: number; width: number },\n prevSize: { height: number; width: number }\n ) => void)\n | undefined;\n overscanCount: number;\n}) {\n const { height = defaultContainerSize, width = defaultContainerSize } =\n useResizeObserver({\n defaultHeight:\n direction === \"vertical\" ? defaultContainerSize : undefined,\n defaultWidth:\n direction === \"horizontal\" ? defaultContainerSize : undefined,\n element: containerElement,\n mode: direction === \"vertical\" ? \"only-height\" : \"only-width\",\n style: containerStyle\n });\n\n const prevSizeRef = useRef<{ height: number; width: number }>({\n height: 0,\n width: 0\n });\n\n const containerSize = direction === \"vertical\" ? height : width;\n\n const itemSize = useItemSize({ containerSize, itemSize: itemSizeProp });\n\n useLayoutEffect(() => {\n if (typeof onResize === \"function\") {\n const prevSize = prevSizeRef.current;\n\n if (prevSize.height !== height || prevSize.width !== width) {\n onResize({ height, width }, { ...prevSize });\n\n prevSize.height = height;\n prevSize.width = width;\n }\n }\n }, [height, onResize, width]);\n\n const cachedBounds = useCachedBounds({\n itemCount,\n itemProps,\n itemSize\n });\n\n const getCellBounds = useCallback(\n (index: number) => cachedBounds.get(index),\n [cachedBounds]\n );\n\n const [indices, setIndices] = useState<{\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n }>(() =>\n getStartStopIndicesUtil({\n cachedBounds,\n // TODO Potentially support a defaultScrollOffset prop?\n containerScrollOffset: 0,\n containerSize,\n itemCount,\n overscanCount\n })\n );\n\n // Guard against temporarily invalid indices that may occur when item count decreases\n // Cached bounds object will be re-created and a second render will restore things\n const {\n startIndexVisible,\n startIndexOverscan,\n stopIndexVisible,\n stopIndexOverscan\n } = {\n startIndexVisible: Math.min(itemCount - 1, indices.startIndexVisible),\n startIndexOverscan: Math.min(itemCount - 1, indices.startIndexOverscan),\n stopIndexVisible: Math.min(itemCount - 1, indices.stopIndexVisible),\n stopIndexOverscan: Math.min(itemCount - 1, indices.stopIndexOverscan)\n };\n\n const getEstimatedSize = useCallback(\n () =>\n getEstimatedSizeUtil({\n cachedBounds,\n itemCount,\n itemSize\n }),\n [cachedBounds, itemCount, itemSize]\n );\n\n const getStartStopIndices = useCallback(\n (scrollOffset: number) => {\n const containerScrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n return getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n },\n [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n isRtl,\n itemCount,\n overscanCount\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const scrollOffset =\n (direction === \"vertical\"\n ? containerElement?.scrollTop\n : containerElement?.scrollLeft) ?? 0;\n\n setIndices(getStartStopIndices(scrollOffset));\n }, [containerElement, direction, getStartStopIndices]);\n\n useIsomorphicLayoutEffect(() => {\n if (!containerElement) {\n return;\n }\n\n const onScroll = () => {\n setIndices((prev) => {\n const { scrollLeft, scrollTop } = containerElement;\n\n const scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset: direction === \"vertical\" ? scrollTop : scrollLeft\n });\n\n const next = getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset: scrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n\n if (shallowCompare(next, prev)) {\n return prev;\n }\n\n return next;\n });\n };\n\n containerElement.addEventListener(\"scroll\", onScroll);\n\n return () => {\n containerElement.removeEventListener(\"scroll\", onScroll);\n };\n }, [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n itemCount,\n overscanCount\n ]);\n\n const scrollToIndex = useStableCallback(\n ({\n align = \"auto\",\n containerScrollOffset,\n index\n }: {\n align?: Align;\n containerScrollOffset: number;\n index: number;\n }) => {\n let scrollOffset = getOffsetForIndex({\n align,\n cachedBounds,\n containerScrollOffset,\n containerSize,\n index,\n itemCount,\n itemSize\n });\n\n if (containerElement) {\n scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n if (typeof containerElement.scrollTo !== \"function\") {\n // Special case for environments like jsdom that don't implement scrollTo\n const next = getStartStopIndices(scrollOffset);\n if (!shallowCompare(indices, next)) {\n setIndices(next);\n }\n }\n\n return scrollOffset;\n }\n }\n );\n\n return {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n };\n}\n","import { useMemo } from \"react\";\n\nexport function useMemoizedObject<Type extends object>(\n unstableObject: Type\n): Type {\n return useMemo(() => {\n return unstableObject;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, Object.values(unstableObject));\n}\n","import type { CSSProperties } from \"react\";\nimport { shallowCompare } from \"./shallowCompare\";\n\n// Custom comparison function for React.memo()\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://react.dev/reference/react/memo#memo\nexport function arePropsEqual(\n prevProps: { ariaAttributes: object; style: CSSProperties },\n nextProps: { ariaAttributes: object; style: CSSProperties }\n): boolean {\n const {\n ariaAttributes: prevAriaAttributes,\n style: prevStyle,\n ...prevRest\n } = prevProps;\n const {\n ariaAttributes: nextAriaAttributes,\n style: nextStyle,\n ...nextRest\n } = nextProps;\n\n return (\n shallowCompare(prevAriaAttributes, nextAriaAttributes) &&\n shallowCompare(prevStyle, nextStyle) &&\n shallowCompare(prevRest, nextRest)\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useIsRtl } from \"../../core/useIsRtl\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport type { GridProps } from \"./types\";\n\n/**\n * Renders data with many rows and columns.\n */\nexport function Grid<\n CellProps extends object,\n TagName extends TagNames = \"div\"\n>({\n cellComponent: CellComponentProp,\n cellProps: cellPropsUnstable,\n children,\n className,\n columnCount,\n columnWidth,\n defaultHeight = 0,\n defaultWidth = 0,\n dir,\n gridRef,\n onCellsRendered,\n onResize,\n overscanCount = 3,\n rowCount,\n rowHeight,\n style,\n tagName = \"div\" as TagName,\n ...rest\n}: GridProps<CellProps, TagName>): ReactElement {\n const cellProps = useMemoizedObject(cellPropsUnstable);\n const CellComponent = useMemo(\n () => memo(CellComponentProp, arePropsEqual),\n [CellComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isRtl = useIsRtl(element, dir);\n\n const {\n getCellBounds: getColumnBounds,\n getEstimatedSize: getEstimatedWidth,\n startIndexOverscan: columnStartIndexOverscan,\n startIndexVisible: columnStartIndexVisible,\n scrollToIndex: scrollToColumnIndex,\n stopIndexOverscan: columnStopIndexOverscan,\n stopIndexVisible: columnStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultWidth,\n direction: \"horizontal\",\n isRtl,\n itemCount: columnCount,\n itemProps: cellProps,\n itemSize: columnWidth,\n onResize,\n overscanCount\n });\n\n const {\n getCellBounds: getRowBounds,\n getEstimatedSize: getEstimatedHeight,\n startIndexOverscan: rowStartIndexOverscan,\n startIndexVisible: rowStartIndexVisible,\n scrollToIndex: scrollToRowIndex,\n stopIndexOverscan: rowStopIndexOverscan,\n stopIndexVisible: rowStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: cellProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n gridRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToCell({\n behavior = \"auto\",\n columnAlign = \"auto\",\n columnIndex,\n rowAlign = \"auto\",\n rowIndex\n }: {\n behavior?: ScrollBehavior;\n columnAlign?: Align;\n columnIndex: number;\n rowAlign?: Align;\n rowIndex: number;\n }) {\n const left = scrollToColumnIndex({\n align: columnAlign,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index: columnIndex\n });\n const top = scrollToRowIndex({\n align: rowAlign,\n containerScrollOffset: element?.scrollTop ?? 0,\n index: rowIndex\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left,\n top\n });\n }\n },\n\n scrollToColumn({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const left = scrollToColumnIndex({\n align,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left\n });\n }\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToRowIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToColumnIndex, scrollToRowIndex]\n );\n\n useEffect(() => {\n if (\n columnStartIndexOverscan >= 0 &&\n columnStopIndexOverscan >= 0 &&\n rowStartIndexOverscan >= 0 &&\n rowStopIndexOverscan >= 0 &&\n onCellsRendered\n ) {\n onCellsRendered(\n {\n columnStartIndex: columnStartIndexVisible,\n columnStopIndex: columnStopIndexVisible,\n rowStartIndex: rowStartIndexVisible,\n rowStopIndex: rowStopIndexVisible\n },\n {\n columnStartIndex: columnStartIndexOverscan,\n columnStopIndex: columnStopIndexOverscan,\n rowStartIndex: rowStartIndexOverscan,\n rowStopIndex: rowStopIndexOverscan\n }\n );\n }\n }, [\n onCellsRendered,\n columnStartIndexOverscan,\n columnStartIndexVisible,\n columnStopIndexOverscan,\n columnStopIndexVisible,\n rowStartIndexOverscan,\n rowStartIndexVisible,\n rowStopIndexOverscan,\n rowStopIndexVisible\n ]);\n\n const cells = useMemo(() => {\n const children: ReactNode[] = [];\n if (columnCount > 0 && rowCount > 0) {\n for (\n let rowIndex = rowStartIndexOverscan;\n rowIndex <= rowStopIndexOverscan;\n rowIndex++\n ) {\n const rowBounds = getRowBounds(rowIndex);\n\n const columns: ReactNode[] = [];\n\n for (\n let columnIndex = columnStartIndexOverscan;\n columnIndex <= columnStopIndexOverscan;\n columnIndex++\n ) {\n const columnBounds = getColumnBounds(columnIndex);\n\n columns.push(\n <CellComponent\n {...(cellProps as CellProps)}\n ariaAttributes={{\n \"aria-colindex\": columnIndex + 1,\n role: \"gridcell\"\n }}\n columnIndex={columnIndex}\n key={columnIndex}\n rowIndex={rowIndex}\n style={{\n position: \"absolute\",\n left: isRtl ? undefined : 0,\n right: isRtl ? 0 : undefined,\n transform: `translate(${isRtl ? -columnBounds.scrollOffset : columnBounds.scrollOffset}px, ${rowBounds.scrollOffset}px)`,\n height: rowBounds.size,\n width: columnBounds.size\n }}\n />\n );\n }\n\n children.push(\n <div key={rowIndex} role=\"row\" aria-rowindex={rowIndex + 1}>\n {columns}\n </div>\n );\n }\n }\n return children;\n }, [\n CellComponent,\n cellProps,\n columnCount,\n columnStartIndexOverscan,\n columnStopIndexOverscan,\n getColumnBounds,\n getRowBounds,\n isRtl,\n rowCount,\n rowStartIndexOverscan,\n rowStopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedHeight(),\n width: getEstimatedWidth(),\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n \"aria-colcount\": columnCount,\n \"aria-rowcount\": rowCount,\n role: \"grid\",\n ...rest,\n className,\n dir,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n flexGrow: 1,\n overflow: \"auto\",\n ...style\n }\n },\n cells,\n children,\n sizingElement\n );\n}\n","import { useState } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Grid component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useGridCallbackRef =\n useState as typeof useState<GridImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Grid component.\n */\nexport const useGridRef = useRef as typeof useRef<GridImperativeAPI>;\n","import type { DynamicRowHeight } from \"./types\";\n\nexport function isDynamicRowHeight(value: unknown): value is DynamicRowHeight {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"getAverageRowHeight\" in value &&\n typeof value.getAverageRowHeight === \"function\"\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport { isDynamicRowHeight as isDynamicRowHeightUtil } from \"./isDynamicRowHeight\";\nimport type { ListProps } from \"./types\";\n\nexport const DATA_ATTRIBUTE_LIST_INDEX = \"data-react-window-index\";\n\n/**\n * Renders data with many rows.\n */\nexport function List<\n RowProps extends object,\n TagName extends TagNames = \"div\"\n>({\n children,\n className,\n defaultHeight = 0,\n listRef,\n onResize,\n onRowsRendered,\n overscanCount = 3,\n rowComponent: RowComponentProp,\n rowCount,\n rowHeight: rowHeightProp,\n rowProps: rowPropsUnstable,\n tagName = \"div\" as TagName,\n style,\n ...rest\n}: ListProps<RowProps, TagName>): ReactElement {\n const rowProps = useMemoizedObject(rowPropsUnstable);\n const RowComponent = useMemo(\n () => memo(RowComponentProp, arePropsEqual),\n [RowComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isDynamicRowHeight = isDynamicRowHeightUtil(rowHeightProp);\n\n const rowHeight = useMemo(() => {\n if (isDynamicRowHeight) {\n return (index: number) => {\n return (\n rowHeightProp.getRowHeight(index) ??\n rowHeightProp.getAverageRowHeight()\n );\n };\n }\n\n return rowHeightProp;\n }, [isDynamicRowHeight, rowHeightProp]);\n\n const {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: rowProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n listRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToIndex]\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!element) {\n return;\n }\n\n const rows = Array.from(element.children).filter((item, index) => {\n if (item.hasAttribute(\"aria-hidden\")) {\n // Ignore sizing element\n return false;\n }\n\n const attribute = `${startIndexOverscan + index}`;\n item.setAttribute(DATA_ATTRIBUTE_LIST_INDEX, attribute);\n\n return true;\n });\n\n if (isDynamicRowHeight) {\n return rowHeightProp.observeRowElements(rows);\n }\n }, [\n element,\n isDynamicRowHeight,\n rowHeightProp,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n useEffect(() => {\n if (startIndexOverscan >= 0 && stopIndexOverscan >= 0 && onRowsRendered) {\n onRowsRendered(\n {\n startIndex: startIndexVisible,\n stopIndex: stopIndexVisible\n },\n {\n startIndex: startIndexOverscan,\n stopIndex: stopIndexOverscan\n }\n );\n }\n }, [\n onRowsRendered,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n ]);\n\n const rows = useMemo(() => {\n const children: ReactNode[] = [];\n if (rowCount > 0) {\n for (\n let index = startIndexOverscan;\n index <= stopIndexOverscan;\n index++\n ) {\n const bounds = getCellBounds(index);\n\n children.push(\n <RowComponent\n {...(rowProps as RowProps)}\n ariaAttributes={{\n \"aria-posinset\": index + 1,\n \"aria-setsize\": rowCount,\n role: \"listitem\"\n }}\n key={index}\n index={index}\n style={{\n position: \"absolute\",\n left: 0,\n transform: `translateY(${bounds.scrollOffset}px)`,\n // In case of dynamic row heights, don't specify a height style\n // otherwise a default/estimated height would mask the actual height\n height: isDynamicRowHeight ? undefined : bounds.size,\n width: \"100%\"\n }}\n />\n );\n }\n }\n return children;\n }, [\n RowComponent,\n getCellBounds,\n isDynamicRowHeight,\n rowCount,\n rowProps,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedSize(),\n width: \"100%\",\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n role: \"list\",\n ...rest,\n className,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n flexGrow: 1,\n overflowY: \"auto\",\n ...style\n }\n },\n rows,\n children,\n sizingElement\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { assert } from \"../../utils/assert\";\nimport { DATA_ATTRIBUTE_LIST_INDEX } from \"./List\";\nimport type { DynamicRowHeight } from \"./types\";\n\nexport function useDynamicRowHeight({\n defaultRowHeight,\n key\n}: {\n defaultRowHeight: number;\n key?: string | number;\n}) {\n const [state, setState] = useState<{\n key: string | number | undefined;\n map: Map<number, number>;\n }>({\n key,\n map: new Map()\n });\n\n if (state.key !== key) {\n setState({\n key,\n map: new Map()\n });\n }\n\n const { map } = state;\n\n const getAverageRowHeight = useCallback(() => {\n let totalHeight = 0;\n\n map.forEach((height) => {\n totalHeight += height;\n });\n\n if (totalHeight === 0) {\n return defaultRowHeight;\n }\n\n return totalHeight / map.size;\n }, [defaultRowHeight, map]);\n\n const getRowHeight = useCallback(\n (index: number) => {\n const measuredHeight = map.get(index);\n if (measuredHeight !== undefined) {\n return measuredHeight;\n }\n\n // Temporarily store default height in the cache map to avoid scroll jumps if rowProps change\n // Else rowProps changes can impact the average height, and cause rows to shift up or down within the list\n // see github.com/bvaughn/react-window/issues/863\n map.set(index, defaultRowHeight);\n\n return defaultRowHeight;\n },\n [defaultRowHeight, map]\n );\n\n const setRowHeight = useCallback((index: number, size: number) => {\n setState((prevState) => {\n if (prevState.map.get(index) === size) {\n return prevState;\n }\n\n const clonedMap = new Map(prevState.map);\n clonedMap.set(index, size);\n\n return {\n ...prevState,\n map: clonedMap\n };\n });\n }, []);\n\n const resizeObserverCallback = useStableCallback(\n (entries: ResizeObserverEntry[]) => {\n if (entries.length === 0) {\n return;\n }\n\n entries.forEach((entry) => {\n const { borderBoxSize, target } = entry;\n\n const attribute = target.getAttribute(DATA_ATTRIBUTE_LIST_INDEX);\n assert(\n attribute !== null,\n `Invalid ${DATA_ATTRIBUTE_LIST_INDEX} attribute value`\n );\n\n const index = parseInt(attribute);\n\n const { blockSize: height } = borderBoxSize[0];\n if (!height) {\n // Ignore heights that have not yet been measured (e.g. <img> elements that have not yet loaded)\n return;\n }\n\n setRowHeight(index, height);\n });\n }\n );\n\n const [resizeObserver] = useState(\n () => new ResizeObserver(resizeObserverCallback)\n );\n\n useEffect(() => {\n return () => {\n resizeObserver.disconnect();\n };\n }, [resizeObserver]);\n\n const observeRowElements = useCallback(\n (elements: Element[] | NodeListOf<Element>) => {\n elements.forEach((element) => resizeObserver.observe(element));\n return () => {\n elements.forEach((element) => resizeObserver.unobserve(element));\n };\n },\n [resizeObserver]\n );\n\n return useMemo<DynamicRowHeight>(\n () => ({\n getAverageRowHeight,\n getRowHeight,\n setRowHeight,\n observeRowElements\n }),\n [getAverageRowHeight, getRowHeight, setRowHeight, observeRowElements]\n );\n}\n","import { useState } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the List component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useListCallbackRef =\n useState as typeof useState<ListImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the List component.\n */\nexport const useListRef = useRef as typeof useRef<ListImperativeAPI>;\n","let size: number = -1;\n\nexport function getScrollbarSize(recalculate: boolean = false): number {\n if (size === -1 || recalculate) {\n const div = document.createElement(\"div\");\n const style = div.style;\n style.width = \"50px\";\n style.height = \"50px\";\n style.overflow = \"scroll\";\n\n document.body.appendChild(div);\n\n size = div.offsetWidth - div.clientWidth;\n\n document.body.removeChild(div);\n }\n\n return size;\n}\n\nexport function setScrollbarSizeForTests(value: number) {\n size = value;\n}\n"],"names":["isRtl","element","currentElement","useIsRtl","dir","value","setValue","useState","useLayoutEffect","useIsomorphicLayoutEffect","useEffect","parseNumericStyleValue","useResizeObserver","box","defaultHeight","defaultWidth","disabledProp","mode","style","styleHeight","styleWidth","useMemo","state","setState","disabled","resizeObserver","entries","entry","contentRect","target","prevState","useStableCallback","fn","ref","useRef","useCallback","args","cachedRTLResult","getRTLOffsetType","recalculate","outerDiv","outerStyle","innerDiv","innerStyle","adjustScrollOffsetForRtl","containerElement","direction","scrollOffset","clientWidth","scrollLeft","scrollWidth","assert","expectedCondition","message","shallowCompare","a","b","key","getEstimatedSize","cachedBounds","itemCount","itemSize","bounds","averageItemSize","getOffsetForIndex","align","index","containerScrollOffset","containerSize","estimatedTotalSize","maxOffset","minOffset","getStartStopIndices","overscanCount","maxIndex","startIndexVisible","stopIndexVisible","startIndexOverscan","stopIndexOverscan","currentIndex","createCachedBounds","itemProps","cache","size","previousRowBounds","useCachedBounds","useItemSize","itemSizeProp","useVirtualizer","containerStyle","defaultContainerSize","onResize","height","width","prevSizeRef","prevSize","getCellBounds","indices","setIndices","getStartStopIndicesUtil","getEstimatedSizeUtil","onScroll","prev","scrollTop","next","scrollToIndex","useMemoizedObject","unstableObject","arePropsEqual","prevProps","nextProps","prevAriaAttributes","prevStyle","prevRest","nextAriaAttributes","nextStyle","nextRest","Grid","CellComponentProp","cellPropsUnstable","children","className","columnCount","columnWidth","gridRef","onCellsRendered","rowCount","rowHeight","tagName","rest","cellProps","CellComponent","memo","setElement","getColumnBounds","getEstimatedWidth","columnStartIndexOverscan","columnStartIndexVisible","scrollToColumnIndex","columnStopIndexOverscan","columnStopIndexVisible","getRowBounds","getEstimatedHeight","rowStartIndexOverscan","rowStartIndexVisible","scrollToRowIndex","rowStopIndexOverscan","rowStopIndexVisible","useImperativeHandle","behavior","columnAlign","columnIndex","rowAlign","rowIndex","left","top","cells","rowBounds","columns","columnBounds","createElement","jsx","sizingElement","useGridCallbackRef","useGridRef","isDynamicRowHeight","DATA_ATTRIBUTE_LIST_INDEX","List","listRef","onRowsRendered","RowComponentProp","rowHeightProp","rowPropsUnstable","rowProps","RowComponent","isDynamicRowHeightUtil","rows","item","attribute","useDynamicRowHeight","defaultRowHeight","map","getAverageRowHeight","totalHeight","getRowHeight","measuredHeight","setRowHeight","clonedMap","resizeObserverCallback","borderBoxSize","observeRowElements","elements","useListCallbackRef","useListRef","getScrollbarSize","div"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-window.js","sources":["../lib/utils/isRtl.ts","../lib/core/useIsRtl.ts","../lib/hooks/useIsomorphicLayoutEffect.ts","../lib/utils/parseNumericStyleValue.ts","../lib/hooks/useResizeObserver.ts","../lib/hooks/useStableCallback.ts","../lib/utils/getRTLOffsetType.ts","../lib/utils/adjustScrollOffsetForRtl.ts","../lib/utils/assert.ts","../lib/utils/shallowCompare.ts","../lib/core/getEstimatedSize.ts","../lib/core/getOffsetForIndex.ts","../lib/core/getStartStopIndices.ts","../lib/core/createCachedBounds.ts","../lib/core/useCachedBounds.ts","../lib/core/useItemSize.ts","../lib/core/useVirtualizer.ts","../lib/hooks/useMemoizedObject.ts","../lib/utils/arePropsEqual.ts","../lib/components/grid/Grid.tsx","../lib/components/grid/useGridCallbackRef.ts","../lib/components/grid/useGridRef.ts","../lib/components/list/isDynamicRowHeight.ts","../lib/components/list/List.tsx","../lib/components/list/useDynamicRowHeight.ts","../lib/components/list/useListCallbackRef.ts","../lib/components/list/useListRef.ts","../lib/utils/getScrollbarSize.ts"],"sourcesContent":["export function isRtl(element: HTMLElement) {\n let currentElement: HTMLElement | null = element;\n while (currentElement) {\n if (currentElement.dir) {\n return currentElement.dir === \"rtl\";\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return false;\n}\n","import { useLayoutEffect, useState, type HTMLAttributes } from \"react\";\nimport { isRtl } from \"../utils/isRtl\";\n\nexport function useIsRtl(\n element: HTMLElement | null,\n dir: HTMLAttributes<HTMLElement>[\"dir\"]\n) {\n const [value, setValue] = useState(dir === \"rtl\");\n\n useLayoutEffect(() => {\n if (element) {\n if (!dir) {\n setValue(isRtl(element));\n }\n }\n }, [dir, element]);\n\n return value;\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n","import type { CSSProperties } from \"react\";\n\nexport function parseNumericStyleValue(\n value: CSSProperties[\"height\"]\n): number | undefined {\n if (value !== undefined) {\n switch (typeof value) {\n case \"number\": {\n return value;\n }\n case \"string\": {\n if (value.endsWith(\"px\")) {\n return parseFloat(value);\n }\n break;\n }\n }\n }\n}\n","import { useMemo, useState, type CSSProperties } from \"react\";\nimport { parseNumericStyleValue } from \"../utils/parseNumericStyleValue\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useResizeObserver({\n box,\n defaultHeight,\n defaultWidth,\n disabled: disabledProp,\n element,\n mode,\n style\n}: {\n box?: ResizeObserverBoxOptions;\n defaultHeight?: number;\n defaultWidth?: number;\n disabled?: boolean;\n element: HTMLElement | null;\n mode?: \"only-height\" | \"only-width\";\n style: CSSProperties | undefined;\n}) {\n const { styleHeight, styleWidth } = useMemo(\n () => ({\n styleHeight: parseNumericStyleValue(style?.height),\n styleWidth: parseNumericStyleValue(style?.width)\n }),\n [style?.height, style?.width]\n );\n\n const [state, setState] = useState<{\n height: number | undefined;\n width: number | undefined;\n }>({\n height: defaultHeight,\n width: defaultWidth\n });\n\n const disabled =\n disabledProp ||\n (mode === \"only-height\" && styleHeight !== undefined) ||\n (mode === \"only-width\" && styleWidth !== undefined) ||\n (styleHeight !== undefined && styleWidth !== undefined);\n\n useIsomorphicLayoutEffect(() => {\n if (element === null || disabled) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { contentRect, target } = entry;\n if (element === target) {\n setState((prevState) => {\n if (\n prevState.height === contentRect.height &&\n prevState.width === contentRect.width\n ) {\n return prevState;\n }\n\n return {\n height: contentRect.height,\n width: contentRect.width\n };\n });\n }\n }\n });\n resizeObserver.observe(element, { box });\n\n return () => {\n resizeObserver?.unobserve(element);\n };\n }, [box, disabled, element, styleHeight, styleWidth]);\n\n return useMemo(\n () => ({\n height: styleHeight ?? state.height,\n width: styleWidth ?? state.width\n }),\n [state, styleHeight, styleWidth]\n );\n}\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(() => {\n throw new Error(\"Cannot call during render.\");\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","export type RTLOffsetType =\n | \"negative\"\n | \"positive-descending\"\n | \"positive-ascending\";\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement(\"div\");\n const outerStyle = outerDiv.style;\n outerStyle.width = \"50px\";\n outerStyle.height = \"50px\";\n outerStyle.overflow = \"scroll\";\n outerStyle.direction = \"rtl\";\n\n const innerDiv = document.createElement(\"div\");\n const innerStyle = innerDiv.style;\n innerStyle.width = \"100px\";\n innerStyle.height = \"100px\";\n\n outerDiv.appendChild(innerDiv);\n\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = \"positive-descending\";\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = \"negative\";\n } else {\n cachedRTLResult = \"positive-ascending\";\n }\n }\n\n document.body.removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","import type { Direction } from \"../core/types\";\nimport { getRTLOffsetType } from \"./getRTLOffsetType\";\n\nexport function adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n}: {\n containerElement: HTMLElement | null;\n direction: Direction;\n isRtl: boolean;\n scrollOffset: number;\n}) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n if (direction === \"horizontal\") {\n if (isRtl) {\n switch (getRTLOffsetType()) {\n case \"negative\": {\n return -scrollOffset;\n }\n case \"positive-descending\": {\n if (containerElement) {\n const { clientWidth, scrollLeft, scrollWidth } = containerElement;\n return scrollWidth - clientWidth - scrollLeft;\n }\n break;\n }\n }\n }\n }\n return scrollOffset;\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","import { assert } from \"./assert\";\n\nexport function shallowCompare<Type extends object>(\n a: Type | undefined,\n b: Type | undefined\n) {\n if (a === b) {\n return true;\n }\n\n if (!!a !== !!b) {\n return false;\n }\n\n assert(a !== undefined);\n assert(b !== undefined);\n\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (!Object.is(b[key], a[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type { CachedBounds, SizeFunction } from \"./types\";\nimport { assert } from \"../utils/assert\";\n\nexport function getEstimatedSize<Props extends object>({\n cachedBounds,\n itemCount,\n itemSize\n}: {\n cachedBounds: CachedBounds;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n}) {\n if (itemCount === 0) {\n return 0;\n } else if (typeof itemSize === \"number\") {\n return itemCount * itemSize;\n } else {\n const bounds = cachedBounds.get(\n cachedBounds.size === 0 ? 0 : cachedBounds.size - 1\n );\n assert(bounds !== undefined, \"Unexpected bounds cache miss\");\n\n const averageItemSize =\n (bounds.scrollOffset + bounds.size) / cachedBounds.size;\n\n return itemCount * averageItemSize;\n }\n}\n","import type { Align } from \"../types\";\nimport { getEstimatedSize } from \"./getEstimatedSize\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function getOffsetForIndex<Props extends object>({\n align,\n cachedBounds,\n index,\n itemCount,\n itemSize,\n containerScrollOffset,\n containerSize\n}: {\n align: Align;\n cachedBounds: CachedBounds;\n index: number;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n containerScrollOffset: number;\n containerSize: number;\n}) {\n if (index < 0 || index >= itemCount) {\n throw RangeError(`Invalid index specified: ${index}`, {\n cause: `Index ${index} is not within the range of 0 - ${itemCount - 1}`\n });\n }\n\n const estimatedTotalSize = getEstimatedSize({\n cachedBounds,\n itemCount,\n itemSize\n });\n\n const bounds = cachedBounds.get(index);\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - containerSize, bounds.scrollOffset)\n );\n const minOffset = Math.max(\n 0,\n bounds.scrollOffset - containerSize + bounds.size\n );\n\n if (align === \"smart\") {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n align = \"auto\";\n } else {\n align = \"center\";\n }\n }\n\n switch (align) {\n case \"start\": {\n return maxOffset;\n }\n case \"end\": {\n return minOffset;\n }\n case \"center\": {\n if (bounds.scrollOffset <= containerSize / 2) {\n // Too near the beginning to center-align\n return 0;\n } else if (\n bounds.scrollOffset + bounds.size / 2 >=\n estimatedTotalSize - containerSize / 2\n ) {\n // Too near the end to center-align\n return estimatedTotalSize - containerSize;\n } else {\n return bounds.scrollOffset + bounds.size / 2 - containerSize / 2;\n }\n }\n case \"auto\":\n default: {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n return containerScrollOffset;\n } else if (containerScrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n}\n","import type { CachedBounds } from \"./types\";\n\nexport function getStartStopIndices({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n}: {\n cachedBounds: CachedBounds;\n containerScrollOffset: number;\n containerSize: number;\n itemCount: number;\n overscanCount: number;\n}): {\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n} {\n const maxIndex = itemCount - 1;\n\n let startIndexVisible = 0;\n let stopIndexVisible = -1;\n let startIndexOverscan = 0;\n let stopIndexOverscan = -1;\n let currentIndex = 0;\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (bounds.scrollOffset + bounds.size > containerScrollOffset) {\n break;\n }\n\n currentIndex++;\n }\n\n startIndexVisible = currentIndex;\n startIndexOverscan = Math.max(0, startIndexVisible - overscanCount);\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (\n bounds.scrollOffset + bounds.size >=\n containerScrollOffset + containerSize\n ) {\n break;\n }\n\n currentIndex++;\n }\n\n stopIndexVisible = Math.min(maxIndex, currentIndex);\n stopIndexOverscan = Math.min(itemCount - 1, stopIndexVisible + overscanCount);\n\n if (startIndexVisible < 0) {\n startIndexVisible = 0;\n stopIndexVisible = -1;\n startIndexOverscan = 0;\n stopIndexOverscan = -1;\n }\n\n return {\n startIndexVisible,\n stopIndexVisible,\n startIndexOverscan,\n stopIndexOverscan\n };\n}\n","import { assert } from \"../utils/assert\";\nimport type { Bounds, CachedBounds, SizeFunction } from \"./types\";\n\nexport function createCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n const cache = new Map<number, Bounds>();\n\n return {\n get(index: number) {\n assert(index < itemCount, `Invalid index ${index}`);\n\n while (cache.size - 1 < index) {\n const currentIndex = cache.size;\n\n let size: number;\n switch (typeof itemSize) {\n case \"function\": {\n size = itemSize(currentIndex, itemProps);\n break;\n }\n case \"number\": {\n size = itemSize;\n break;\n }\n }\n\n if (currentIndex === 0) {\n cache.set(currentIndex, {\n size,\n scrollOffset: 0\n });\n } else {\n const previousRowBounds = cache.get(currentIndex - 1);\n assert(\n previousRowBounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n cache.set(currentIndex, {\n scrollOffset:\n previousRowBounds.scrollOffset + previousRowBounds.size,\n size\n });\n }\n }\n\n const bounds = cache.get(index);\n assert(\n bounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n return bounds;\n },\n set(index: number, bounds: Bounds) {\n cache.set(index, bounds);\n },\n get size() {\n return cache.size;\n }\n };\n}\n","import { useMemo } from \"react\";\nimport { createCachedBounds } from \"./createCachedBounds\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function useCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n return useMemo(\n () =>\n createCachedBounds({\n itemCount,\n itemProps,\n itemSize\n }),\n [itemCount, itemProps, itemSize]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { SizeFunction } from \"./types\";\n\nexport function useItemSize<Props extends object>({\n containerSize,\n itemSize: itemSizeProp\n}: {\n containerSize: number;\n itemSize: number | string | SizeFunction<Props>;\n}) {\n let itemSize: number | SizeFunction<Props>;\n switch (typeof itemSizeProp) {\n case \"string\": {\n assert(\n itemSizeProp.endsWith(\"%\"),\n `Invalid item size: \"${itemSizeProp}\"; string values must be percentages (e.g. \"100%\")`\n );\n assert(\n containerSize !== undefined,\n \"Container size must be defined if a percentage item size is specified\"\n );\n\n itemSize = (containerSize * parseInt(itemSizeProp)) / 100;\n break;\n }\n default: {\n itemSize = itemSizeProp;\n break;\n }\n }\n\n return itemSize;\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\nimport { useStableCallback } from \"../hooks/useStableCallback\";\nimport type { Align } from \"../types\";\nimport { adjustScrollOffsetForRtl } from \"../utils/adjustScrollOffsetForRtl\";\nimport { shallowCompare } from \"../utils/shallowCompare\";\nimport { getEstimatedSize as getEstimatedSizeUtil } from \"./getEstimatedSize\";\nimport { getOffsetForIndex } from \"./getOffsetForIndex\";\nimport { getStartStopIndices as getStartStopIndicesUtil } from \"./getStartStopIndices\";\nimport type { Direction, SizeFunction } from \"./types\";\nimport { useCachedBounds } from \"./useCachedBounds\";\nimport { useItemSize } from \"./useItemSize\";\n\nexport function useVirtualizer<Props extends object>({\n containerElement,\n containerStyle,\n defaultContainerSize = 0,\n direction,\n isRtl = false,\n itemCount,\n itemProps,\n itemSize: itemSizeProp,\n onResize,\n overscanCount\n}: {\n containerElement: HTMLElement | null;\n containerStyle?: CSSProperties;\n defaultContainerSize?: number;\n direction: Direction;\n isRtl?: boolean;\n itemCount: number;\n itemProps: Props;\n itemSize: number | string | SizeFunction<Props>;\n onResize:\n | ((\n size: { height: number; width: number },\n prevSize: { height: number; width: number }\n ) => void)\n | undefined;\n overscanCount: number;\n}) {\n const { height = defaultContainerSize, width = defaultContainerSize } =\n useResizeObserver({\n defaultHeight:\n direction === \"vertical\" ? defaultContainerSize : undefined,\n defaultWidth:\n direction === \"horizontal\" ? defaultContainerSize : undefined,\n element: containerElement,\n mode: direction === \"vertical\" ? \"only-height\" : \"only-width\",\n style: containerStyle\n });\n\n const prevSizeRef = useRef<{ height: number; width: number }>({\n height: 0,\n width: 0\n });\n\n const containerSize = direction === \"vertical\" ? height : width;\n\n const itemSize = useItemSize({ containerSize, itemSize: itemSizeProp });\n\n useLayoutEffect(() => {\n if (typeof onResize === \"function\") {\n const prevSize = prevSizeRef.current;\n\n if (prevSize.height !== height || prevSize.width !== width) {\n onResize({ height, width }, { ...prevSize });\n\n prevSize.height = height;\n prevSize.width = width;\n }\n }\n }, [height, onResize, width]);\n\n const cachedBounds = useCachedBounds({\n itemCount,\n itemProps,\n itemSize\n });\n\n const getCellBounds = useCallback(\n (index: number) => cachedBounds.get(index),\n [cachedBounds]\n );\n\n const [indices, setIndices] = useState<{\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n }>(() =>\n getStartStopIndicesUtil({\n cachedBounds,\n // TODO Potentially support a defaultScrollOffset prop?\n containerScrollOffset: 0,\n containerSize,\n itemCount,\n overscanCount\n })\n );\n\n // Guard against temporarily invalid indices that may occur when item count decreases\n // Cached bounds object will be re-created and a second render will restore things\n const {\n startIndexVisible,\n startIndexOverscan,\n stopIndexVisible,\n stopIndexOverscan\n } = {\n startIndexVisible: Math.min(itemCount - 1, indices.startIndexVisible),\n startIndexOverscan: Math.min(itemCount - 1, indices.startIndexOverscan),\n stopIndexVisible: Math.min(itemCount - 1, indices.stopIndexVisible),\n stopIndexOverscan: Math.min(itemCount - 1, indices.stopIndexOverscan)\n };\n\n const getEstimatedSize = useCallback(\n () =>\n getEstimatedSizeUtil({\n cachedBounds,\n itemCount,\n itemSize\n }),\n [cachedBounds, itemCount, itemSize]\n );\n\n const getStartStopIndices = useCallback(\n (scrollOffset: number) => {\n const containerScrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n return getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n },\n [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n isRtl,\n itemCount,\n overscanCount\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const scrollOffset =\n (direction === \"vertical\"\n ? containerElement?.scrollTop\n : containerElement?.scrollLeft) ?? 0;\n\n setIndices(getStartStopIndices(scrollOffset));\n }, [containerElement, direction, getStartStopIndices]);\n\n useIsomorphicLayoutEffect(() => {\n if (!containerElement) {\n return;\n }\n\n const onScroll = () => {\n setIndices((prev) => {\n const { scrollLeft, scrollTop } = containerElement;\n\n const scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset: direction === \"vertical\" ? scrollTop : scrollLeft\n });\n\n const next = getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset: scrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n\n if (shallowCompare(next, prev)) {\n return prev;\n }\n\n return next;\n });\n };\n\n containerElement.addEventListener(\"scroll\", onScroll);\n\n return () => {\n containerElement.removeEventListener(\"scroll\", onScroll);\n };\n }, [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n itemCount,\n overscanCount\n ]);\n\n const scrollToIndex = useStableCallback(\n ({\n align = \"auto\",\n containerScrollOffset,\n index\n }: {\n align?: Align;\n containerScrollOffset: number;\n index: number;\n }) => {\n let scrollOffset = getOffsetForIndex({\n align,\n cachedBounds,\n containerScrollOffset,\n containerSize,\n index,\n itemCount,\n itemSize\n });\n\n if (containerElement) {\n scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n if (typeof containerElement.scrollTo !== \"function\") {\n // Special case for environments like jsdom that don't implement scrollTo\n const next = getStartStopIndices(scrollOffset);\n if (!shallowCompare(indices, next)) {\n setIndices(next);\n }\n }\n\n return scrollOffset;\n }\n }\n );\n\n return {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n };\n}\n","import { useMemo } from \"react\";\n\nexport function useMemoizedObject<Type extends object>(\n unstableObject: Type\n): Type {\n return useMemo(() => {\n return unstableObject;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, Object.values(unstableObject));\n}\n","import type { CSSProperties } from \"react\";\nimport { shallowCompare } from \"./shallowCompare\";\n\n// Custom comparison function for React.memo()\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://react.dev/reference/react/memo#memo\nexport function arePropsEqual(\n prevProps: { ariaAttributes: object; style: CSSProperties },\n nextProps: { ariaAttributes: object; style: CSSProperties }\n): boolean {\n const {\n ariaAttributes: prevAriaAttributes,\n style: prevStyle,\n ...prevRest\n } = prevProps;\n const {\n ariaAttributes: nextAriaAttributes,\n style: nextStyle,\n ...nextRest\n } = nextProps;\n\n return (\n shallowCompare(prevAriaAttributes, nextAriaAttributes) &&\n shallowCompare(prevStyle, nextStyle) &&\n shallowCompare(prevRest, nextRest)\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useIsRtl } from \"../../core/useIsRtl\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport type { GridProps } from \"./types\";\n\n/**\n * Renders data with many rows and columns.\n *\n * ℹ️ Unlike `List` rows, `Grid` cell sizes must be known ahead of time.\n * Either static sizes or something that can be derived (from the data in `CellProps`) without rendering.\n */\nexport function Grid<\n CellProps extends object,\n TagName extends TagNames = \"div\"\n>({\n cellComponent: CellComponentProp,\n cellProps: cellPropsUnstable,\n children,\n className,\n columnCount,\n columnWidth,\n defaultHeight = 0,\n defaultWidth = 0,\n dir,\n gridRef,\n onCellsRendered,\n onResize,\n overscanCount = 3,\n rowCount,\n rowHeight,\n style,\n tagName = \"div\" as TagName,\n ...rest\n}: GridProps<CellProps, TagName>): ReactElement {\n const cellProps = useMemoizedObject(cellPropsUnstable);\n const CellComponent = useMemo(\n () => memo(CellComponentProp, arePropsEqual),\n [CellComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isRtl = useIsRtl(element, dir);\n\n const {\n getCellBounds: getColumnBounds,\n getEstimatedSize: getEstimatedWidth,\n startIndexOverscan: columnStartIndexOverscan,\n startIndexVisible: columnStartIndexVisible,\n scrollToIndex: scrollToColumnIndex,\n stopIndexOverscan: columnStopIndexOverscan,\n stopIndexVisible: columnStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultWidth,\n direction: \"horizontal\",\n isRtl,\n itemCount: columnCount,\n itemProps: cellProps,\n itemSize: columnWidth,\n onResize,\n overscanCount\n });\n\n const {\n getCellBounds: getRowBounds,\n getEstimatedSize: getEstimatedHeight,\n startIndexOverscan: rowStartIndexOverscan,\n startIndexVisible: rowStartIndexVisible,\n scrollToIndex: scrollToRowIndex,\n stopIndexOverscan: rowStopIndexOverscan,\n stopIndexVisible: rowStopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: cellProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n gridRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToCell({\n behavior = \"auto\",\n columnAlign = \"auto\",\n columnIndex,\n rowAlign = \"auto\",\n rowIndex\n }: {\n behavior?: ScrollBehavior;\n columnAlign?: Align;\n columnIndex: number;\n rowAlign?: Align;\n rowIndex: number;\n }) {\n const left = scrollToColumnIndex({\n align: columnAlign,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index: columnIndex\n });\n const top = scrollToRowIndex({\n align: rowAlign,\n containerScrollOffset: element?.scrollTop ?? 0,\n index: rowIndex\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left,\n top\n });\n }\n },\n\n scrollToColumn({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const left = scrollToColumnIndex({\n align,\n containerScrollOffset: element?.scrollLeft ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n left\n });\n }\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToRowIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToColumnIndex, scrollToRowIndex]\n );\n\n useEffect(() => {\n if (\n columnStartIndexOverscan >= 0 &&\n columnStopIndexOverscan >= 0 &&\n rowStartIndexOverscan >= 0 &&\n rowStopIndexOverscan >= 0 &&\n onCellsRendered\n ) {\n onCellsRendered(\n {\n columnStartIndex: columnStartIndexVisible,\n columnStopIndex: columnStopIndexVisible,\n rowStartIndex: rowStartIndexVisible,\n rowStopIndex: rowStopIndexVisible\n },\n {\n columnStartIndex: columnStartIndexOverscan,\n columnStopIndex: columnStopIndexOverscan,\n rowStartIndex: rowStartIndexOverscan,\n rowStopIndex: rowStopIndexOverscan\n }\n );\n }\n }, [\n onCellsRendered,\n columnStartIndexOverscan,\n columnStartIndexVisible,\n columnStopIndexOverscan,\n columnStopIndexVisible,\n rowStartIndexOverscan,\n rowStartIndexVisible,\n rowStopIndexOverscan,\n rowStopIndexVisible\n ]);\n\n const cells = useMemo(() => {\n const children: ReactNode[] = [];\n if (columnCount > 0 && rowCount > 0) {\n for (\n let rowIndex = rowStartIndexOverscan;\n rowIndex <= rowStopIndexOverscan;\n rowIndex++\n ) {\n const rowBounds = getRowBounds(rowIndex);\n\n const columns: ReactNode[] = [];\n\n for (\n let columnIndex = columnStartIndexOverscan;\n columnIndex <= columnStopIndexOverscan;\n columnIndex++\n ) {\n const columnBounds = getColumnBounds(columnIndex);\n\n columns.push(\n <CellComponent\n {...(cellProps as CellProps)}\n ariaAttributes={{\n \"aria-colindex\": columnIndex + 1,\n role: \"gridcell\"\n }}\n columnIndex={columnIndex}\n key={columnIndex}\n rowIndex={rowIndex}\n style={{\n position: \"absolute\",\n left: isRtl ? undefined : 0,\n right: isRtl ? 0 : undefined,\n transform: `translate(${isRtl ? -columnBounds.scrollOffset : columnBounds.scrollOffset}px, ${rowBounds.scrollOffset}px)`,\n height: rowBounds.size,\n width: columnBounds.size\n }}\n />\n );\n }\n\n children.push(\n <div key={rowIndex} role=\"row\" aria-rowindex={rowIndex + 1}>\n {columns}\n </div>\n );\n }\n }\n return children;\n }, [\n CellComponent,\n cellProps,\n columnCount,\n columnStartIndexOverscan,\n columnStopIndexOverscan,\n getColumnBounds,\n getRowBounds,\n isRtl,\n rowCount,\n rowStartIndexOverscan,\n rowStopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedHeight(),\n width: getEstimatedWidth(),\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n \"aria-colcount\": columnCount,\n \"aria-rowcount\": rowCount,\n role: \"grid\",\n ...rest,\n className,\n dir,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n flexGrow: 1,\n overflow: \"auto\",\n ...style\n }\n },\n cells,\n children,\n sizingElement\n );\n}\n","import { useState } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the Grid component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useGridCallbackRef =\n useState as typeof useState<GridImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { GridImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the Grid component.\n */\nexport const useGridRef = useRef as typeof useRef<GridImperativeAPI>;\n","import type { DynamicRowHeight } from \"./types\";\n\nexport function isDynamicRowHeight(value: unknown): value is DynamicRowHeight {\n return (\n value != null &&\n typeof value === \"object\" &&\n \"getAverageRowHeight\" in value &&\n typeof value.getAverageRowHeight === \"function\"\n );\n}\n","\"use client\";\n\nimport {\n createElement,\n memo,\n useEffect,\n useImperativeHandle,\n useMemo,\n useState,\n type ReactElement,\n type ReactNode\n} from \"react\";\nimport { useVirtualizer } from \"../../core/useVirtualizer\";\nimport { useIsomorphicLayoutEffect } from \"../../hooks/useIsomorphicLayoutEffect\";\nimport { useMemoizedObject } from \"../../hooks/useMemoizedObject\";\nimport type { Align, TagNames } from \"../../types\";\nimport { arePropsEqual } from \"../../utils/arePropsEqual\";\nimport { isDynamicRowHeight as isDynamicRowHeightUtil } from \"./isDynamicRowHeight\";\nimport type { ListProps } from \"./types\";\n\nexport const DATA_ATTRIBUTE_LIST_INDEX = \"data-react-window-index\";\n\n/**\n * Renders data with many rows.\n */\nexport function List<\n RowProps extends object,\n TagName extends TagNames = \"div\"\n>({\n children,\n className,\n defaultHeight = 0,\n listRef,\n onResize,\n onRowsRendered,\n overscanCount = 3,\n rowComponent: RowComponentProp,\n rowCount,\n rowHeight: rowHeightProp,\n rowProps: rowPropsUnstable,\n tagName = \"div\" as TagName,\n style,\n ...rest\n}: ListProps<RowProps, TagName>): ReactElement {\n const rowProps = useMemoizedObject(rowPropsUnstable);\n const RowComponent = useMemo(\n () => memo(RowComponentProp, arePropsEqual),\n [RowComponentProp]\n );\n\n const [element, setElement] = useState<HTMLDivElement | null>(null);\n\n const isDynamicRowHeight = isDynamicRowHeightUtil(rowHeightProp);\n\n const rowHeight = useMemo(() => {\n if (isDynamicRowHeight) {\n return (index: number) => {\n return (\n rowHeightProp.getRowHeight(index) ??\n rowHeightProp.getAverageRowHeight()\n );\n };\n }\n\n return rowHeightProp;\n }, [isDynamicRowHeight, rowHeightProp]);\n\n const {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n } = useVirtualizer({\n containerElement: element,\n containerStyle: style,\n defaultContainerSize: defaultHeight,\n direction: \"vertical\",\n itemCount: rowCount,\n itemProps: rowProps,\n itemSize: rowHeight,\n onResize,\n overscanCount\n });\n\n useImperativeHandle(\n listRef,\n () => ({\n get element() {\n return element;\n },\n\n scrollToRow({\n align = \"auto\",\n behavior = \"auto\",\n index\n }: {\n align?: Align;\n behavior?: ScrollBehavior;\n index: number;\n }) {\n const top = scrollToIndex({\n align,\n containerScrollOffset: element?.scrollTop ?? 0,\n index\n });\n\n if (typeof element?.scrollTo === \"function\") {\n element.scrollTo({\n behavior,\n top\n });\n }\n }\n }),\n [element, scrollToIndex]\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!element) {\n return;\n }\n\n const rows = Array.from(element.children).filter((item, index) => {\n if (item.hasAttribute(\"aria-hidden\")) {\n // Ignore sizing element\n return false;\n }\n\n const attribute = `${startIndexOverscan + index}`;\n item.setAttribute(DATA_ATTRIBUTE_LIST_INDEX, attribute);\n\n return true;\n });\n\n if (isDynamicRowHeight) {\n return rowHeightProp.observeRowElements(rows);\n }\n }, [\n element,\n isDynamicRowHeight,\n rowHeightProp,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n useEffect(() => {\n if (startIndexOverscan >= 0 && stopIndexOverscan >= 0 && onRowsRendered) {\n onRowsRendered(\n {\n startIndex: startIndexVisible,\n stopIndex: stopIndexVisible\n },\n {\n startIndex: startIndexOverscan,\n stopIndex: stopIndexOverscan\n }\n );\n }\n }, [\n onRowsRendered,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n ]);\n\n const rows = useMemo(() => {\n const children: ReactNode[] = [];\n if (rowCount > 0) {\n for (\n let index = startIndexOverscan;\n index <= stopIndexOverscan;\n index++\n ) {\n const bounds = getCellBounds(index);\n\n children.push(\n <RowComponent\n {...(rowProps as RowProps)}\n ariaAttributes={{\n \"aria-posinset\": index + 1,\n \"aria-setsize\": rowCount,\n role: \"listitem\"\n }}\n key={index}\n index={index}\n style={{\n position: \"absolute\",\n left: 0,\n transform: `translateY(${bounds.scrollOffset}px)`,\n // In case of dynamic row heights, don't specify a height style\n // otherwise a default/estimated height would mask the actual height\n height: isDynamicRowHeight ? undefined : bounds.size,\n width: \"100%\"\n }}\n />\n );\n }\n }\n return children;\n }, [\n RowComponent,\n getCellBounds,\n isDynamicRowHeight,\n rowCount,\n rowProps,\n startIndexOverscan,\n stopIndexOverscan\n ]);\n\n const sizingElement = (\n <div\n aria-hidden\n style={{\n height: getEstimatedSize(),\n width: \"100%\",\n zIndex: -1\n }}\n ></div>\n );\n\n return createElement(\n tagName,\n {\n role: \"list\",\n ...rest,\n className,\n ref: setElement,\n style: {\n position: \"relative\",\n maxHeight: \"100%\",\n flexGrow: 1,\n overflowY: \"auto\",\n ...style\n }\n },\n rows,\n children,\n sizingElement\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useStableCallback } from \"../../hooks/useStableCallback\";\nimport { assert } from \"../../utils/assert\";\nimport { DATA_ATTRIBUTE_LIST_INDEX } from \"./List\";\nimport type { DynamicRowHeight } from \"./types\";\n\nexport function useDynamicRowHeight({\n defaultRowHeight,\n key\n}: {\n defaultRowHeight: number;\n key?: string | number;\n}) {\n const [state, setState] = useState<{\n key: string | number | undefined;\n map: Map<number, number>;\n }>({\n key,\n map: new Map()\n });\n\n if (state.key !== key) {\n setState({\n key,\n map: new Map()\n });\n }\n\n const { map } = state;\n\n const getAverageRowHeight = useCallback(() => {\n let totalHeight = 0;\n\n map.forEach((height) => {\n totalHeight += height;\n });\n\n if (totalHeight === 0) {\n return defaultRowHeight;\n }\n\n return totalHeight / map.size;\n }, [defaultRowHeight, map]);\n\n const getRowHeight = useCallback(\n (index: number) => {\n const measuredHeight = map.get(index);\n if (measuredHeight !== undefined) {\n return measuredHeight;\n }\n\n // Temporarily store default height in the cache map to avoid scroll jumps if rowProps change\n // Else rowProps changes can impact the average height, and cause rows to shift up or down within the list\n // see github.com/bvaughn/react-window/issues/863\n map.set(index, defaultRowHeight);\n\n return defaultRowHeight;\n },\n [defaultRowHeight, map]\n );\n\n const setRowHeight = useCallback((index: number, size: number) => {\n setState((prevState) => {\n if (prevState.map.get(index) === size) {\n return prevState;\n }\n\n const clonedMap = new Map(prevState.map);\n clonedMap.set(index, size);\n\n return {\n ...prevState,\n map: clonedMap\n };\n });\n }, []);\n\n const resizeObserverCallback = useStableCallback(\n (entries: ResizeObserverEntry[]) => {\n if (entries.length === 0) {\n return;\n }\n\n entries.forEach((entry) => {\n const { borderBoxSize, target } = entry;\n\n const attribute = target.getAttribute(DATA_ATTRIBUTE_LIST_INDEX);\n assert(\n attribute !== null,\n `Invalid ${DATA_ATTRIBUTE_LIST_INDEX} attribute value`\n );\n\n const index = parseInt(attribute);\n\n const { blockSize: height } = borderBoxSize[0];\n if (!height) {\n // Ignore heights that have not yet been measured (e.g. <img> elements that have not yet loaded)\n return;\n }\n\n setRowHeight(index, height);\n });\n }\n );\n\n const [resizeObserver] = useState(() => {\n if (typeof ResizeObserver !== \"undefined\") {\n return new ResizeObserver(resizeObserverCallback);\n }\n });\n\n useEffect(() => {\n if (resizeObserver) {\n return () => {\n resizeObserver.disconnect();\n };\n }\n }, [resizeObserver]);\n\n const observeRowElements = useCallback(\n (elements: Element[] | NodeListOf<Element>) => {\n if (resizeObserver) {\n elements.forEach((element) => resizeObserver.observe(element));\n return () => {\n elements.forEach((element) => resizeObserver.unobserve(element));\n };\n }\n return () => {};\n },\n [resizeObserver]\n );\n\n return useMemo<DynamicRowHeight>(\n () => ({\n getAverageRowHeight,\n getRowHeight,\n setRowHeight,\n observeRowElements\n }),\n [getAverageRowHeight, getRowHeight, setRowHeight, observeRowElements]\n );\n}\n","import { useState } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref callback for the List component.\n *\n * Use this hook when you need to share the ref with another component or hook.\n */\nexport const useListCallbackRef =\n useState as typeof useState<ListImperativeAPI | null>;\n","import { useRef } from \"react\";\nimport type { ListImperativeAPI } from \"./types\";\n\n/**\n * Convenience hook to return a properly typed ref for the List component.\n */\nexport const useListRef = useRef as typeof useRef<ListImperativeAPI>;\n","let size: number = -1;\n\nexport function getScrollbarSize(recalculate: boolean = false): number {\n if (size === -1 || recalculate) {\n const div = document.createElement(\"div\");\n const style = div.style;\n style.width = \"50px\";\n style.height = \"50px\";\n style.overflow = \"scroll\";\n\n document.body.appendChild(div);\n\n size = div.offsetWidth - div.clientWidth;\n\n document.body.removeChild(div);\n }\n\n return size;\n}\n\nexport function setScrollbarSizeForTests(value: number) {\n size = value;\n}\n"],"names":["isRtl","element","currentElement","useIsRtl","dir","value","setValue","useState","useLayoutEffect","useIsomorphicLayoutEffect","useEffect","parseNumericStyleValue","useResizeObserver","box","defaultHeight","defaultWidth","disabledProp","mode","style","styleHeight","styleWidth","useMemo","state","setState","disabled","resizeObserver","entries","entry","contentRect","target","prevState","useStableCallback","fn","ref","useRef","useCallback","args","cachedRTLResult","getRTLOffsetType","recalculate","outerDiv","outerStyle","innerDiv","innerStyle","adjustScrollOffsetForRtl","containerElement","direction","scrollOffset","clientWidth","scrollLeft","scrollWidth","assert","expectedCondition","message","shallowCompare","a","b","key","getEstimatedSize","cachedBounds","itemCount","itemSize","bounds","averageItemSize","getOffsetForIndex","align","index","containerScrollOffset","containerSize","estimatedTotalSize","maxOffset","minOffset","getStartStopIndices","overscanCount","maxIndex","startIndexVisible","stopIndexVisible","startIndexOverscan","stopIndexOverscan","currentIndex","createCachedBounds","itemProps","cache","size","previousRowBounds","useCachedBounds","useItemSize","itemSizeProp","useVirtualizer","containerStyle","defaultContainerSize","onResize","height","width","prevSizeRef","prevSize","getCellBounds","indices","setIndices","getStartStopIndicesUtil","getEstimatedSizeUtil","onScroll","prev","scrollTop","next","scrollToIndex","useMemoizedObject","unstableObject","arePropsEqual","prevProps","nextProps","prevAriaAttributes","prevStyle","prevRest","nextAriaAttributes","nextStyle","nextRest","Grid","CellComponentProp","cellPropsUnstable","children","className","columnCount","columnWidth","gridRef","onCellsRendered","rowCount","rowHeight","tagName","rest","cellProps","CellComponent","memo","setElement","getColumnBounds","getEstimatedWidth","columnStartIndexOverscan","columnStartIndexVisible","scrollToColumnIndex","columnStopIndexOverscan","columnStopIndexVisible","getRowBounds","getEstimatedHeight","rowStartIndexOverscan","rowStartIndexVisible","scrollToRowIndex","rowStopIndexOverscan","rowStopIndexVisible","useImperativeHandle","behavior","columnAlign","columnIndex","rowAlign","rowIndex","left","top","cells","rowBounds","columns","columnBounds","createElement","jsx","sizingElement","useGridCallbackRef","useGridRef","isDynamicRowHeight","DATA_ATTRIBUTE_LIST_INDEX","List","listRef","onRowsRendered","RowComponentProp","rowHeightProp","rowPropsUnstable","rowProps","RowComponent","isDynamicRowHeightUtil","rows","item","attribute","useDynamicRowHeight","defaultRowHeight","map","getAverageRowHeight","totalHeight","getRowHeight","measuredHeight","setRowHeight","clonedMap","resizeObserverCallback","borderBoxSize","observeRowElements","elements","useListCallbackRef","useListRef","getScrollbarSize","div"],"mappings":"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"}
|