@@ -3,7 +3,12 @@ import { equal } from 'node:assert'
33import { describe , test } from 'node:test'
44import { setTimeout } from 'node:timers/promises'
55
6- import { focusGroupKeyUX , hotkeyKeyUX , startKeyUX } from '../index.js'
6+ import {
7+ focusGroupKeyUX ,
8+ hotkeyKeyUX ,
9+ jumpKeyUX ,
10+ startKeyUX
11+ } from '../index.js'
712import { press } from './utils.js'
813
914describe ( 'focus-group' , ( ) => {
@@ -457,4 +462,41 @@ describe('focus-group', () => {
457462 press ( window , 'ArrowRight' )
458463 equal ( window . document . activeElement , buttons [ 0 ] )
459464 } )
465+
466+ test ( 'supports nested menu' , async ( ) => {
467+ let window = new JSDOM ( ) . window
468+ startKeyUX ( window , [ focusGroupKeyUX ( ) , jumpKeyUX ( ) ] )
469+
470+ window . document . body . innerHTML =
471+ '<nav role="menu">' +
472+ '<button role="menuitem" aria-controls="nested">1</button>' +
473+ '<div role="menu" id="nested" aria-hidden="true">' +
474+ '<button role="menuitem">1.1</button>' +
475+ '<button role="menuitem">1.2</button>' +
476+ '</div>' +
477+ '<button role="menuitem">2</button>' +
478+ '</nav>'
479+ let items = window . document . querySelectorAll ( 'button' )
480+ items [ 0 ] . focus ( )
481+ equal ( window . document . activeElement ?. textContent , '1' )
482+
483+ press ( window , 'ArrowDown' )
484+ equal ( window . document . activeElement ?. textContent , '2' )
485+
486+ press ( window , 'ArrowUp' )
487+ equal ( window . document . activeElement ?. textContent , '1' )
488+
489+ press ( window , 'Enter' )
490+ await setTimeout ( 100 )
491+ equal ( window . document . activeElement ?. textContent , '1.1' )
492+
493+ press ( window , 'ArrowDown' )
494+ equal ( window . document . activeElement ?. textContent , '1.2' )
495+
496+ press ( window , 'ArrowDown' )
497+ equal ( window . document . activeElement ?. textContent , '1.1' )
498+
499+ press ( window , 'Escape' )
500+ equal ( window . document . activeElement ?. textContent , '1' )
501+ } )
460502} )
0 commit comments