File tree Expand file tree Collapse file tree 3 files changed +41
-1
lines changed Expand file tree Collapse file tree 3 files changed +41
-1
lines changed Original file line number Diff line number Diff line change 11{
22 "name" : " react-accessible-dropdown-menu-hook" ,
3- "version" : " 2.1.0 " ,
3+ "version" : " 2.1.1 " ,
44 "description" : " A simple Hook for creating fully accessible dropdown menus in React" ,
55 "main" : " dist/use-dropdown-menu.js" ,
66 "types" : " dist/use-dropdown-menu.d.ts" ,
Original file line number Diff line number Diff line change @@ -86,6 +86,19 @@ export default function useDropdownMenu(itemCount: number) {
8686 return ( ) => document . removeEventListener ( 'click' , handleEveryClick ) ;
8787 } , [ isOpen ] ) ;
8888
89+ // Disable scroll when the menu is opened, and revert back when the menu is closed
90+ useEffect ( ( ) => {
91+ const disableArrowScroll = ( event : KeyboardEvent ) => {
92+ if ( isOpen && ( event . key === 'ArrowDown' || event . key === 'ArrowUp' ) ) {
93+ event . preventDefault ( ) ;
94+ }
95+ } ;
96+
97+ document . addEventListener ( 'keydown' , disableArrowScroll ) ;
98+
99+ return ( ) => document . removeEventListener ( 'keydown' , disableArrowScroll ) ;
100+ } , [ isOpen ] ) ;
101+
89102 // Create a handler function for the button's clicks and keyboard events
90103 const buttonListener = ( e : React . KeyboardEvent | React . MouseEvent ) => {
91104 // Detect if event was a keyboard event or a mouse event
Original file line number Diff line number Diff line change @@ -48,6 +48,33 @@ it('focuses on the menu button after pressing escape', async () => {
4848 expect ( await currentFocusID ( ) ) . toBe ( 'menu-button' ) ;
4949} ) ;
5050
51+ it ( 'disables scroll by arrow key when menu is open' , async ( ) => {
52+ await page . setViewport ( {
53+ width : 1000 ,
54+ height : 500 ,
55+ } ) ;
56+
57+ await page . click ( '#menu-button' ) ;
58+ await menuOpen ( ) ;
59+
60+ const currentScrollY = await page . evaluate ( ( ) => window . scrollY ) ;
61+ await page . keyboard . down ( 'ArrowDown' ) ;
62+ await sleep ( 1000 ) ; // Give page time to scroll
63+ expect ( await page . evaluate ( ( ) => window . scrollY ) ) . toBe ( currentScrollY ) ;
64+ } ) ;
65+
66+ it ( 'does not disable scroll by arrow key when menu is closed' , async ( ) => {
67+ await page . setViewport ( {
68+ width : 1000 ,
69+ height : 500 ,
70+ } ) ;
71+
72+ const currentScrollY = await page . evaluate ( ( ) => window . scrollY ) ;
73+ await page . keyboard . press ( 'ArrowDown' ) ;
74+ await sleep ( 1000 ) ; // Give page time to scroll
75+ expect ( await page . evaluate ( ( ) => window . scrollY ) ) . toBeGreaterThan ( currentScrollY ) ;
76+ } ) ;
77+
5178it ( 'focuses on the next item in the tab order after pressing tab' , async ( ) => {
5279 await page . focus ( '#menu-button' ) ;
5380 await page . keyboard . down ( 'Enter' ) ;
You can’t perform that action at this time.
0 commit comments