Skip to content

Commit 7aec29a

Browse files
committed
search result keyboard focus
1 parent 6ca07fe commit 7aec29a

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

src/static/js/client/sidebar-search.js

+32-4
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,16 @@ export function addPageListeners() {
325325
}, settings.stoppedTypingDelay);
326326
});
327327

328+
info.searchInput.addEventListener('keydown', domEvent => {
329+
if (domEvent.key === 'ArrowDown' && info.searchInput.value.length === info.searchInput.selectionStart) {
330+
const elem = info.results?.firstChild;
331+
if (elem && !elem.classList.contains('wiki-search-no-results')) {
332+
domEvent.preventDefault();
333+
elem.focus();
334+
}
335+
}
336+
});
337+
328338
info.endSearchLink.addEventListener('click', domEvent => {
329339
domEvent.preventDefault();
330340
clearSidebarSearch();
@@ -589,7 +599,7 @@ function showSidebarSearchResults(results) {
589599
}
590600

591601
for (const result of flatResults) {
592-
const el = generateSidebarSearchResult(result);
602+
const el = generateSidebarSearchResult(result, info);
593603
if (!el) continue;
594604

595605
info.results.appendChild(el);
@@ -605,7 +615,7 @@ function showSidebarSearchResults(results) {
605615
restoreSidebarSearchResultsScrollOffset();
606616
}
607617

608-
function generateSidebarSearchResult(result) {
618+
function generateSidebarSearchResult(result, info) {
609619
const preparedSlots = {
610620
color:
611621
result.data.color ?? null,
@@ -676,7 +686,7 @@ function generateSidebarSearchResult(result) {
676686
return null;
677687
}
678688

679-
return generateSidebarSearchResultTemplate(preparedSlots);
689+
return generateSidebarSearchResultTemplate(preparedSlots, info);
680690
}
681691

682692
function getSearchResultImageSource(result) {
@@ -689,7 +699,7 @@ function getSearchResultImageSource(result) {
689699
'rebaseThumb'));
690700
}
691701

692-
function generateSidebarSearchResultTemplate(slots) {
702+
function generateSidebarSearchResultTemplate(slots, info) {
693703
const link = document.createElement('a');
694704
link.classList.add('wiki-search-result');
695705

@@ -771,6 +781,24 @@ function generateSidebarSearchResultTemplate(slots) {
771781
saveSidebarSearchResultsScrollOffset();
772782
});
773783

784+
link.addEventListener('keydown', domEvent => {
785+
if (domEvent.key === 'ArrowDown') {
786+
const elem = link.nextElementSibling;
787+
if (elem) {
788+
domEvent.preventDefault();
789+
elem.focus();
790+
}
791+
} else if (domEvent.key === 'ArrowUp') {
792+
domEvent.preventDefault();
793+
const elem = link.previousElementSibling;
794+
if (elem) {
795+
elem.focus();
796+
} else {
797+
info.searchInput.focus();
798+
}
799+
}
800+
});
801+
774802
return link;
775803
}
776804

0 commit comments

Comments
 (0)