@@ -378,6 +378,15 @@ export class VirtualizedViewManager {
378
378
this . previousDividerClientVec = [ event . clientX , event . clientY ] ;
379
379
}
380
380
381
+ private scrollbar_width : number = 0 ;
382
+ onScrollbarWidthChange ( width : number ) {
383
+ if ( width === this . scrollbar_width ) {
384
+ return ;
385
+ }
386
+ this . scrollbar_width = width ;
387
+ this . draw ( ) ;
388
+ }
389
+
381
390
registerList ( list : VirtualizedList | null ) {
382
391
this . list = list ;
383
392
}
@@ -1226,7 +1235,9 @@ export class VirtualizedViewManager {
1226
1235
1227
1236
if ( this . divider ) {
1228
1237
this . divider . style . transform = `translateX(${
1229
- list_width * this . container_physical_space . width - DIVIDER_WIDTH / 2 - 1
1238
+ list_width * ( this . container_physical_space . width - this . scrollbar_width ) -
1239
+ DIVIDER_WIDTH / 2 -
1240
+ 1
1230
1241
} px)`;
1231
1242
}
1232
1243
if ( this . indicator_container ) {
@@ -1614,12 +1625,30 @@ export class VirtualizedList {
1614
1625
}
1615
1626
}
1616
1627
1628
+ function maybeToggleScrollbar (
1629
+ container : HTMLElement ,
1630
+ containerHeight : number ,
1631
+ scrollHeight : number ,
1632
+ manager : VirtualizedViewManager
1633
+ ) {
1634
+ if ( scrollHeight > containerHeight ) {
1635
+ container . style . overflowY = 'scroll' ;
1636
+ container . style . scrollbarGutter = 'stable' ;
1637
+ manager . onScrollbarWidthChange ( container . offsetWidth - container . clientWidth ) ;
1638
+ } else {
1639
+ container . style . overflowY = 'auto' ;
1640
+ container . style . scrollbarGutter = 'auto' ;
1641
+ manager . onScrollbarWidthChange ( 0 ) ;
1642
+ }
1643
+ }
1644
+
1617
1645
interface UseVirtualizedListProps {
1618
1646
container : HTMLElement | null ;
1619
1647
items : ReadonlyArray < TraceTreeNode < TraceTree . NodeValue > > ;
1620
1648
manager : VirtualizedViewManager ;
1621
1649
render : ( item : VirtualizedRow ) => React . ReactNode ;
1622
1650
}
1651
+
1623
1652
interface UseVirtualizedListResult {
1624
1653
list : VirtualizedList ;
1625
1654
rendered : React . ReactNode [ ] ;
@@ -1697,6 +1726,13 @@ export const useVirtualizedList = (
1697
1726
list . current . scrollHeight = scrollHeightRef . current ;
1698
1727
}
1699
1728
1729
+ maybeToggleScrollbar (
1730
+ elements [ 0 ] . target as HTMLElement ,
1731
+ scrollHeightRef . current ,
1732
+ itemsRef . current . length * 24 ,
1733
+ managerRef . current
1734
+ ) ;
1735
+
1700
1736
const recomputedItems = findRenderedItems ( {
1701
1737
scrollTop : scrollTopRef . current ,
1702
1738
items : itemsRef . current ,
@@ -1738,6 +1774,13 @@ export const useVirtualizedList = (
1738
1774
scrollContainerRef . current ! . style . willChange = 'transform' ;
1739
1775
scrollContainerRef . current ! . style . height = `${ props . items . length * 24 } px` ;
1740
1776
1777
+ maybeToggleScrollbar (
1778
+ props . container ,
1779
+ scrollHeightRef . current ,
1780
+ props . items . length * 24 ,
1781
+ props . manager
1782
+ ) ;
1783
+
1741
1784
const onScroll = event => {
1742
1785
if ( ! list . current ) {
1743
1786
return ;
@@ -1805,7 +1848,7 @@ export const useVirtualizedList = (
1805
1848
return ( ) => {
1806
1849
props . container ?. removeEventListener ( 'scroll' , onScroll ) ;
1807
1850
} ;
1808
- } , [ props . container , props . items , props . items . length ] ) ;
1851
+ } , [ props . container , props . items , props . items . length , props . manager ] ) ;
1809
1852
1810
1853
useLayoutEffect ( ( ) => {
1811
1854
if ( ! list . current || ! styleCache . current || ! renderCache . current ) {
0 commit comments