11import * as React from "react"
22
33import { PinnedColumn } from "../PinnedColumn"
4+ import { ScrollDiv } from "../ScrollDiv"
45import { SizingDiv } from "../SizingDiv"
56import { StickyDiv } from "../StickyDiv"
67import { getHorizontalGap , getVerticalGap } from "../itemGapUtilities"
78import type { GridProps } from "../types"
89import { useDataDimension } from "../useDataDimension"
910import { useIndicesForDimensions } from "../useDimensionIndices"
11+ import { useRTLWarnings } from "../useRtlWarnings"
1012import { useScrollAdjustWindowDims } from "../useScrollAdjustedDim"
1113import { useScrollItems } from "../useScrollItems"
1214import { useSmartSticky } from "../useSmartSticky"
1315import { useWindowApi } from "../useWindowApi"
1416import { useWindowDimensions } from "../useWindowDimensions"
1517import { useWindowScroll } from "../useWindowScroll"
1618
17- export function Grid < T > ( {
19+ export function Grid < T , L = unknown , R = unknown > ( {
1820 data,
1921 children,
2022 defaultRowHeight,
@@ -41,10 +43,11 @@ export function Grid<T>({
4143 onScroll : userOnScroll ,
4244
4345 pinnedLeft,
46+ pinnedRight,
4447 leftWidths,
45- } : GridProps < T > ) {
48+ rightWidths,
49+ } : GridProps < T , L , R > ) {
4650 const windowRef = React . useRef < HTMLDivElement > ( null )
47- const transRef = React . useRef < HTMLDivElement > ( null )
4851 useWindowApi ( windowRef , apiRef )
4952
5053 const verticalGap = getVerticalGap ( gap )
@@ -53,10 +56,10 @@ export function Grid<T>({
5356 const [ width , height , browserWidth ] = useWindowDimensions ( windowRef )
5457 const [ overscan , disableSticky ] = useSmartSticky ( browserWidth , userOverscan , userDisableSticky )
5558
59+ useRTLWarnings ( { rtl, disableSticky, pinnedLeft, pinnedRight } )
60+
5661 const [ topOffset , leftOffset , onScroll ] = useWindowScroll ( {
5762 userOnScroll,
58- transRef,
59- disableSticky : disableSticky ?? false ,
6063 rtl : rtl ?? false ,
6164 } )
6265
@@ -94,15 +97,15 @@ export function Grid<T>({
9497 offset : topOffset ,
9598 gapBetweenItems : verticalGap ,
9699 windowDimension : height ,
97- overscan : overscan ?? 0 ,
100+ overscan : overscan ?? 1 ,
98101 } )
99102
100103 const [ horiStart , horiEnd , runningWidth ] = useIndicesForDimensions ( {
101104 windowDimension : width ,
102105 offset : leftOffset ,
103106 gapBetweenItems : horizontalGap ,
104107 itemDimensions : dataWidths ,
105- overscan : overscan ?? 0 ,
108+ overscan : overscan ?? 1 ,
106109 } )
107110
108111 const [ lWidths , leftTotalWidth ] = useDataDimension ( {
@@ -113,6 +116,14 @@ export function Grid<T>({
113116 dimensions : leftWidths ,
114117 } )
115118
119+ const [ rWidths , rightTotalWidth ] = useDataDimension ( {
120+ count : pinnedRight ?. length ?? 0 ,
121+ defaultDimension : defaultColumnWidth ,
122+ windowDim : adjustedWidth ,
123+ gap : horizontalGap ,
124+ dimensions : rightWidths ,
125+ } )
126+
116127 const scrollableItems = useScrollItems ( {
117128 children,
118129 data,
@@ -151,46 +162,75 @@ export function Grid<T>({
151162 direction : rtl ? "rtl" : "ltr" ,
152163 } }
153164 >
154- < div style = { { width : innerWidth + leftTotalWidth - horizontalGap , height : innerHeight } } >
165+ < div
166+ style = { {
167+ width : innerWidth + leftTotalWidth - horizontalGap + rightTotalWidth ,
168+ height : innerHeight ,
169+ } }
170+ >
155171 < StickyDiv
156172 disabled = { disableSticky ?? false }
157173 rtl = { rtl ?? false }
158174 height = { adjustedHeight }
159175 width = { adjustedWidth }
160176 >
177+ < ScrollDiv
178+ rtl = { rtl }
179+ disableSticky = { disableSticky }
180+ topOffset = { topOffset }
181+ leftOffset = { leftOffset }
182+ pinnedLeftWidth = { leftTotalWidth }
183+ pinnedRightWidth = { 200 }
184+ >
185+ { scrollableItems }
186+ </ ScrollDiv >
161187 < div
162- ref = { transRef }
163188 style = { {
164- position : "absolute" ,
165- transform : `translate3d(${ disableSticky ? 0 : rtl ? leftOffset : - leftOffset } px, ${
166- disableSticky ? 0 : - topOffset
167- } px, 0px)`,
168- top : 0 ,
169- left : rtl ? undefined : leftTotalWidth ,
170- right : rtl ? leftTotalWidth : undefined ,
171- willChange : "transform" ,
189+ display : "flex" ,
190+ width : adjustedWidth ,
191+ position : "sticky" ,
192+ left : rtl ? undefined : 0 ,
193+ right : rtl ? 0 : undefined ,
172194 } }
173195 >
174- { scrollableItems }
196+ { pinnedLeft && (
197+ < PinnedColumn
198+ Component = { children }
199+ totalWidth = { leftTotalWidth }
200+ left = { rtl ? undefined : 0 }
201+ right = { rtl ? 0 : undefined }
202+ topOffset = { disableSticky ? 0 : - topOffset }
203+ columns = { pinnedLeft }
204+ widths = { lWidths }
205+ heights = { dataHeights }
206+ vertStart = { vertStart }
207+ vertEnd = { vertEnd }
208+ verticalGap = { verticalGap }
209+ horizontalGap = { horizontalGap }
210+ runningHeight = { runningHeight }
211+ rtl = { rtl }
212+ />
213+ ) }
214+ { pinnedRight && (
215+ < PinnedColumn
216+ Component = { children }
217+ totalWidth = { rightTotalWidth }
218+ left = { rtl ? 0 : undefined }
219+ right = { rtl ? undefined : 0 }
220+ topOffset = { disableSticky ? 0 : - topOffset }
221+ columns = { pinnedRight }
222+ widths = { rWidths }
223+ heights = { dataHeights }
224+ vertStart = { vertStart }
225+ vertEnd = { vertEnd }
226+ verticalGap = { verticalGap }
227+ horizontalGap = { horizontalGap }
228+ pinnedRight
229+ runningHeight = { runningHeight }
230+ rtl = { rtl }
231+ />
232+ ) }
175233 </ div >
176- { pinnedLeft && (
177- < PinnedColumn
178- Component = { children }
179- totalWidth = { leftTotalWidth }
180- left = { rtl ? undefined : 0 }
181- right = { rtl ? 0 : undefined }
182- topOffset = { disableSticky ? 0 : - topOffset }
183- columns = { pinnedLeft }
184- widths = { lWidths }
185- heights = { dataHeights }
186- vertStart = { vertStart }
187- vertEnd = { vertEnd }
188- verticalGap = { verticalGap }
189- horizontalGap = { horizontalGap }
190- runningHeight = { runningHeight }
191- rtl = { rtl }
192- />
193- ) }
194234 </ StickyDiv >
195235 </ div >
196236 </ div >
0 commit comments