@@ -76,6 +76,7 @@ export const info = {
76
76
77
77
stoppedTypingTimeout : null ,
78
78
stoppedScrollingTimeout : null ,
79
+ focusFirstResultTimeout : null ,
79
80
80
81
indexDownloadStatuses : Object . create ( null ) ,
81
82
} ,
@@ -104,6 +105,8 @@ export const info = {
104
105
stoppedTypingDelay : 800 ,
105
106
stoppedScrollingDelay : 200 ,
106
107
108
+ pressDownToFocusFirstResultLatency : 200 ,
109
+
107
110
maxActiveResultsStorage : 100000 ,
108
111
} ,
109
112
} ;
@@ -340,18 +343,35 @@ export function addPageListeners() {
340
343
341
344
state . stoppedTypingTimeout =
342
345
setTimeout ( ( ) => {
346
+ state . stoppedTypingTimeout = null ;
343
347
activateSidebarSearch ( info . searchInput . value ) ;
344
348
} , settings . stoppedTypingDelay ) ;
345
349
} ) ;
346
350
347
351
info . searchInput . addEventListener ( 'drop' , handleDroppedIntoSearchInput ) ;
348
352
349
353
info . searchInput . addEventListener ( 'keydown' , domEvent => {
354
+ const { settings, state} = info ;
355
+
350
356
if ( domEvent . key === 'ArrowUp' || domEvent . key === 'ArrowDown' ) {
351
357
domEvent . preventDefault ( ) ;
352
358
}
353
359
354
- if ( domEvent . key === 'ArrowDown' ) {
360
+ if ( domEvent . key === 'ArrowDown' ) handleDown: {
361
+ if ( state . stoppedTypingTimeout ) {
362
+ clearTimeout ( state . stoppedTypingTimeout ) ;
363
+ state . stoppedTypingTimeout = null ;
364
+
365
+ state . focusFirstResultTimeout =
366
+ setTimeout ( ( ) => {
367
+ state . focusFirstResultTimeout = null ;
368
+ } , settings . pressDownToFocusFirstResultLatency ) ;
369
+
370
+ activateSidebarSearch ( info . searchInput . value ) ;
371
+
372
+ break handleDown;
373
+ }
374
+
355
375
const elem = info . results . firstChild ;
356
376
if ( elem ?. classList . contains ( 'wiki-search-result' ) ) {
357
377
elem . focus ( { focusVisible : true } ) ;
@@ -479,6 +499,14 @@ async function activateSidebarSearch(query) {
479
499
session . resultsScrollOffset = 0 ;
480
500
481
501
showSidebarSearchResults ( results ) ;
502
+
503
+ if ( state . focusFirstResultTimeout ) {
504
+ clearTimeout ( state . focusFirstResultTimeout ) ;
505
+ state . focusFirstResultTimeout = null ;
506
+ if ( ! state . stoppedTypingTimeout ) {
507
+ info . results . firstChild ?. focus ( ) ;
508
+ }
509
+ }
482
510
}
483
511
484
512
function clearSidebarSearch ( ) {
0 commit comments