Skip to content

Commit 8cbab02

Browse files
committed
search: Add keyboard navigation to results
After searching for a string, the user can navigate results by pressing up/down arrows.
1 parent 141caae commit 8cbab02

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

www/components/core/Search.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ const ItemLink = styled(Link)`
4141
display: block;
4242
padding: ${(props) => props.theme.spacing.xs};
4343
text-decoration: none;
44+
&:focus {
45+
background-color: ${(props) => props.theme.colors.input.hover};
46+
}
4447
4548
width: 100%;
4649
`;
@@ -93,21 +96,39 @@ export const Search = ({ descriptors }: SearchParams) => {
9396
}
9497
}, [searchTerm]);
9598

99+
function keyPressHandler(event: React.KeyboardEvent, index: number) {
100+
if (event.key === "ArrowDown" && index + 1 < (results?.length ?? 0)) {
101+
document.getElementById(`SearchResultItem_Link_${index+1}`)?.focus();
102+
event.preventDefault();
103+
} else if (event.key === "ArrowUp" && index >= 0) {
104+
const target = document.getElementById(index === 0 ? "Search_Input" : `SearchResultItem_Link_${index-1}`);
105+
target?.focus();
106+
event.preventDefault();
107+
}
108+
}
109+
96110
return (
97111
<SearchContainer>
98112
<input
113+
id="Search_Input"
99114
onChange={(event) => {
100115
setSearchTerm(event.target.value);
101116
}}
102117
value={searchTerm}
118+
onKeyDown={(event) => keyPressHandler(event, -1)}
103119
/>
104120
{searchTerm && results && (
105121
<SearchResultContainer>
106122
{results.total === 0 && "No results found"}
107123
{results.total > 0 &&
108124
results.map((result: Result, ind: number) => (
109125
<SearchResultItem key={`${result.obj.name}_${ind}`}>
110-
<ItemLink to={`${result.obj.url}`} onClick={(event) => setSearchTerm("")}>
126+
<ItemLink
127+
id={`SearchResultItem_Link_${ind}`}
128+
to={`${result.obj.url}`}
129+
onClick={() => setSearchTerm("")}
130+
onKeyDown={(event) => keyPressHandler(event, ind)}
131+
>
111132
<Match result={result} />
112133
</ItemLink>
113134
</SearchResultItem>

0 commit comments

Comments
 (0)