@@ -298,11 +298,13 @@ function playpen_text(playpen) {
298
298
function showThemes ( ) {
299
299
themePopup . style . display = 'block' ;
300
300
themeToggleButton . setAttribute ( 'aria-expanded' , true ) ;
301
+ themePopup . querySelector ( "button#" + document . body . className ) . focus ( ) ;
301
302
}
302
303
303
304
function hideThemes ( ) {
304
305
themePopup . style . display = 'none' ;
305
306
themeToggleButton . setAttribute ( 'aria-expanded' , false ) ;
307
+ themeToggleButton . focus ( ) ;
306
308
}
307
309
308
310
function set_theme ( theme ) {
@@ -369,19 +371,43 @@ function playpen_text(playpen) {
369
371
set_theme ( theme ) ;
370
372
} ) ;
371
373
372
- // Hide theme selector popup when clicking outside of it
373
- document . addEventListener ( 'click' , function ( event ) {
374
- if ( themePopup . style . display === 'block' && ! themeToggleButton . contains ( event . target ) && ! themePopup . contains ( event . target ) ) {
374
+ themePopup . addEventListener ( 'focusout' , function ( e ) {
375
+ if ( ! themePopup . contains ( e . relatedTarget ) ) {
375
376
hideThemes ( ) ;
376
377
}
377
378
} ) ;
378
379
379
380
document . addEventListener ( 'keydown' , function ( e ) {
381
+ if ( e . altKey || e . ctrlKey || e . metaKey || e . shiftKey ) { return ; }
382
+ if ( ! themePopup . contains ( e . target ) ) { return ; }
383
+
380
384
switch ( e . key ) {
381
385
case 'Escape' :
382
386
e . preventDefault ( ) ;
383
387
hideThemes ( ) ;
384
388
break ;
389
+ case 'ArrowUp' :
390
+ e . preventDefault ( ) ;
391
+ var li = document . activeElement . parentElement ;
392
+ if ( li && li . previousElementSibling ) {
393
+ li . previousElementSibling . querySelector ( 'button' ) . focus ( ) ;
394
+ }
395
+ break ;
396
+ case 'ArrowDown' :
397
+ e . preventDefault ( ) ;
398
+ var li = document . activeElement . parentElement ;
399
+ if ( li && li . nextElementSibling ) {
400
+ li . nextElementSibling . querySelector ( 'button' ) . focus ( ) ;
401
+ }
402
+ break ;
403
+ case 'Home' :
404
+ e . preventDefault ( ) ;
405
+ themePopup . querySelector ( 'li:first-child button' ) . focus ( ) ;
406
+ break ;
407
+ case 'End' :
408
+ e . preventDefault ( ) ;
409
+ themePopup . querySelector ( 'li:last-child button' ) . focus ( ) ;
410
+ break ;
385
411
}
386
412
} ) ;
387
413
} ) ( ) ;
0 commit comments