@@ -17,6 +17,7 @@ import { onVisible } from '../utils/onVisible';
1717import { scrollAreaStateAttributesMapping } from '../root/stateAttributes' ;
1818import type { ScrollAreaRoot } from '../root/ScrollAreaRoot' ;
1919import { ScrollAreaViewportCssVars } from './ScrollAreaViewportCssVars' ;
20+ import { normalizeScrollOffset } from '../utils/scrollEdges' ;
2021
2122// Module-level flag to ensure we only register the CSS properties once,
2223// regardless of how many Scroll Area components are mounted.
@@ -137,15 +138,20 @@ export const ScrollAreaViewport = React.forwardRef(function ScrollAreaViewport(
137138 let scrollLeftFromStart = 0 ;
138139 let scrollLeftFromEnd = 0 ;
139140 if ( ! scrollbarXHidden ) {
141+ let rawScrollLeftFromStart = 0 ;
140142 if ( direction === 'rtl' ) {
141- scrollLeftFromStart = clamp ( - scrollLeft , 0 , maxScrollLeft ) ;
143+ rawScrollLeftFromStart = clamp ( - scrollLeft , 0 , maxScrollLeft ) ;
142144 } else {
143- scrollLeftFromStart = clamp ( scrollLeft , 0 , maxScrollLeft ) ;
145+ rawScrollLeftFromStart = clamp ( scrollLeft , 0 , maxScrollLeft ) ;
144146 }
147+ scrollLeftFromStart = normalizeScrollOffset ( rawScrollLeftFromStart , maxScrollLeft ) ;
145148 scrollLeftFromEnd = maxScrollLeft - scrollLeftFromStart ;
146149 }
147150
148- const scrollTopFromStart = ! scrollbarYHidden ? clamp ( scrollTop , 0 , maxScrollTop ) : 0 ;
151+ const rawScrollTopFromStart = ! scrollbarYHidden ? clamp ( scrollTop , 0 , maxScrollTop ) : 0 ;
152+ const scrollTopFromStart = ! scrollbarYHidden
153+ ? normalizeScrollOffset ( rawScrollTopFromStart , maxScrollTop )
154+ : 0 ;
149155 const scrollTopFromEnd = ! scrollbarYHidden ? maxScrollTop - scrollTopFromStart : 0 ;
150156 const nextWidth = scrollbarXHidden ? 0 : viewportWidth ;
151157 const nextHeight = scrollbarYHidden ? 0 : viewportHeight ;
@@ -223,16 +229,11 @@ export const ScrollAreaViewport = React.forwardRef(function ScrollAreaViewport(
223229 thumbXEl . style . transform = `translate3d(${ thumbOffsetX } px,0,0)` ;
224230 }
225231
226- const clampedScrollLeftStart = clamp ( scrollLeftFromStart , 0 , maxScrollLeft ) ;
227- const clampedScrollLeftEnd = clamp ( scrollLeftFromEnd , 0 , maxScrollLeft ) ;
228- const clampedScrollTopStart = clamp ( scrollTopFromStart , 0 , maxScrollTop ) ;
229- const clampedScrollTopEnd = clamp ( scrollTopFromEnd , 0 , maxScrollTop ) ;
230-
231232 const overflowMetricsPx : Array < [ ScrollAreaViewportCssVars , number ] > = [
232- [ ScrollAreaViewportCssVars . scrollAreaOverflowXStart , clampedScrollLeftStart ] ,
233- [ ScrollAreaViewportCssVars . scrollAreaOverflowXEnd , clampedScrollLeftEnd ] ,
234- [ ScrollAreaViewportCssVars . scrollAreaOverflowYStart , clampedScrollTopStart ] ,
235- [ ScrollAreaViewportCssVars . scrollAreaOverflowYEnd , clampedScrollTopEnd ] ,
233+ [ ScrollAreaViewportCssVars . scrollAreaOverflowXStart , scrollLeftFromStart ] ,
234+ [ ScrollAreaViewportCssVars . scrollAreaOverflowXEnd , scrollLeftFromEnd ] ,
235+ [ ScrollAreaViewportCssVars . scrollAreaOverflowYStart , scrollTopFromStart ] ,
236+ [ ScrollAreaViewportCssVars . scrollAreaOverflowYEnd , scrollTopFromEnd ] ,
236237 ] ;
237238
238239 for ( const [ cssVar , value ] of overflowMetricsPx ) {
@@ -266,10 +267,10 @@ export const ScrollAreaViewport = React.forwardRef(function ScrollAreaViewport(
266267 } ) ;
267268
268269 const nextOverflowEdges = {
269- xStart : ! scrollbarXHidden && clampedScrollLeftStart > overflowEdgeThreshold . xStart ,
270- xEnd : ! scrollbarXHidden && clampedScrollLeftEnd > overflowEdgeThreshold . xEnd ,
271- yStart : ! scrollbarYHidden && clampedScrollTopStart > overflowEdgeThreshold . yStart ,
272- yEnd : ! scrollbarYHidden && clampedScrollTopEnd > overflowEdgeThreshold . yEnd ,
270+ xStart : ! scrollbarXHidden && scrollLeftFromStart > overflowEdgeThreshold . xStart ,
271+ xEnd : ! scrollbarXHidden && scrollLeftFromEnd > overflowEdgeThreshold . xEnd ,
272+ yStart : ! scrollbarYHidden && scrollTopFromStart > overflowEdgeThreshold . yStart ,
273+ yEnd : ! scrollbarYHidden && scrollTopFromEnd > overflowEdgeThreshold . yEnd ,
273274 } ;
274275
275276 setOverflowEdges ( ( prev ) => {
0 commit comments