@@ -3,18 +3,9 @@ import type { KeyboardEvent, ReactElement, ReactNode } from 'react';
33import  type  {  MenuItemProps  }  from  './MenuItem' ; 
44
55import  {  useFocusManager  }  from  '@react-aria/focus' ; 
6+ import  {  useVirtualizer  }  from  '@tanstack/react-virtual' ; 
67import  {  cx  }  from  'classix' ; 
7- import  { 
8- 	Children , 
9- 	cloneElement , 
10- 	useCallback , 
11- 	useEffect , 
12- 	useId , 
13- 	useMemo , 
14- 	useRef , 
15- 	useState , 
16- }  from  'react' ; 
17- import  {  useVirtual  }  from  'react-virtual' ; 
8+ import  {  Children ,  cloneElement ,  useCallback ,  useEffect ,  useId ,  useMemo ,  useRef  }  from  'react' ; 
189
1910import  {  MenuBase  }  from  './MenuBase' ; 
2011import  {  MenuDivider  }  from  './MenuDivider' ; 
@@ -213,15 +204,13 @@ const ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<
213204	const  parentRef  =  useRef < HTMLDivElement  |  null > ( null ) ; 
214205	const  searchRef  =  useRef < HTMLInputElement  |  null > ( null ) ; 
215206
216- 	const  [ nextFocusValue ,  setNextFocusValue ]  =  useState < number  |  null > ( null ) ; 
217- 
218207	const  hasSearch  =  ! ! searchElement ; 
219208
220209	const  lastVirtualItemIndex  =  items  ? items . length  -  1  : 0 ; 
221210
222- 	const  rowVirtualizer  =  useVirtual ( { 
223- 		size : items  !==  null  ? items . length  : 0 , 
224- 		parentRef, 
211+ 	const  rowVirtualizer  =  useVirtualizer ( { 
212+ 		count : items  !==  null  ? items . length  : 0 , 
213+ 		getScrollElement :  ( )   =>   parentRef . current , 
225214		estimateSize : useCallback ( ( )  =>  itemHeight ,  [ itemHeight ] ) , 
226215		overscan, 
227216	} ) ; 
@@ -238,7 +227,8 @@ const ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<
238227	const  focusMenuItem  =  useCallback ( 
239228		( index : number )  =>  { 
240229			rowVirtualizer . scrollToIndex ( index ) ; 
241- 			setNextFocusValue ( index ) ; 
230+ 			const  element  =  getNodeForIndex ( index ,  menuId . current ) ; 
231+ 			element ?. focus ( ) ; 
242232		} , 
243233		[ rowVirtualizer ] , 
244234	) ; 
@@ -314,16 +304,10 @@ const ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<
314304		} , 
315305		[ handleKeyboardFocusInteraction ,  menuItemClassName ,  onSelect ] , 
316306	) ; 
317- 
318307	useEffect ( ( )  =>  { 
319- 		if  ( nextFocusValue  !==  null )  { 
320- 			requestAnimationFrame ( ( )  =>  { 
321- 				const  element  =  getNodeForIndex ( nextFocusValue ,  menuId . current ) ; 
322- 				element ?. focus ( ) ; 
323- 			} ) ; 
324- 			setNextFocusValue ( null ) ; 
325- 		} 
326- 	} ,  [ nextFocusValue ] ) ; 
308+ 		const  element  =  getNodeForIndex ( 0 ,  menuId . current ) ; 
309+ 		element ?. focus ( ) ; 
310+ 	} ,  [ ] ) ; 
327311
328312	/** 
329313	 * Calls handleFocusForward when the user is attempting to focus forward using 
@@ -365,29 +349,25 @@ const ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<
365349		[ searchElement ,  lastVirtualItemIndex ,  focusMenuItem ] , 
366350	) ; 
367351
368- 	const  renderItems  =  useMemo ( 
369- 		( )  => 
370- 			rowVirtualizer . virtualItems . map ( ( virtualRow )  =>  { 
371- 				if  ( ! items )  { 
372- 					return  null ; 
373- 				} 
374- 				const  elem  =  items [ virtualRow . index ] ; 
375- 				return  ( 
376- 					< div 
377- 						key = { virtualRow . index } 
378- 						ref = { virtualRow . measureRef } 
379- 						role = "presentation" 
380- 						className = { styles [ 'VirtualMenu-item' ] } 
381- 						style = { { 
382- 							transform : `translateY(${ virtualRow . start }  px)` , 
383- 						} } 
384- 					> 
385- 						{ cloneElement ( elem ,  getItemProps ( elem ,  virtualRow . index ) ) } 
386- 					</ div > 
387- 				) ; 
388- 			} ) , 
389- 		[ rowVirtualizer . virtualItems ,  items ,  getItemProps ] , 
390- 	) ; 
352+ 	const  renderItems  =  rowVirtualizer . getVirtualItems ( ) . map ( ( virtualRow )  =>  { 
353+ 		if  ( ! items )  { 
354+ 			return  null ; 
355+ 		} 
356+ 		const  elem  =  items [ virtualRow . index ] ; 
357+ 		return  ( 
358+ 			< div 
359+ 				key = { virtualRow . index } 
360+ 				ref = { rowVirtualizer . measureElement } 
361+ 				role = "presentation" 
362+ 				className = { styles [ 'VirtualMenu-item' ] } 
363+ 				style = { { 
364+ 					transform : `translateY(${ virtualRow . start }  px)` , 
365+ 				} } 
366+ 			> 
367+ 				{ cloneElement ( elem ,  getItemProps ( elem ,  virtualRow . index ) ) } 
368+ 			</ div > 
369+ 		) ; 
370+ 	} ) ; 
391371
392372	return  ( 
393373		< > 
@@ -397,7 +377,7 @@ const ItemVirtualizer = <T extends number | string>(props: ItemVirtualizerProps<
397377					role = "presentation" 
398378					className = { styles [ 'VirtualMenu-item-list' ] } 
399379					style = { { 
400- 						height : `${ rowVirtualizer . totalSize }  px` , 
380+ 						height : `${ rowVirtualizer . getTotalSize ( ) }  px` , 
401381					} } 
402382				> 
403383					{ renderItems } 
0 commit comments