diff --git a/components/search/SearchDialogue.vue b/components/search/SearchDialogue.vue index eb5aedbb5..44e2578d9 100644 --- a/components/search/SearchDialogue.vue +++ b/components/search/SearchDialogue.vue @@ -14,6 +14,7 @@ const queryValidation = computed(() => { }); const searchAsyncData = useAsyncData('search', async () => { + selected.value = null; if (queryValidation.value !== undefined) { return []; } @@ -41,6 +42,7 @@ const open = () => { query.value = ''; searchAsyncData.clear(); dialogue.value?.showModal(); + selected.value = null; }; const close = () => { @@ -65,6 +67,34 @@ const onMousedown = (event: MouseEvent) => { } }; +const selected = ref(null); +const router = useRouter(); +onKeyStroke('ArrowDown', () => { + selected.value = Math.min( + (selected.value ?? -1) + 1, + (searchAsyncData.data?.value?.length ?? 0) - 1, + ); +}); +onKeyStroke('ArrowUp', () => { + selected.value = Math.max( + (selected.value ?? -1) - 1, + 0, + ); +}); +onKeyStroke('Enter', () => { + if (selected.value === null) { + return; + } + + const document = searchAsyncData.data.value?.[selected.value]; + if (!document) { + return; + } + + router.push(document.url); + close(); +}); + defineExpose({ open, close }); @@ -93,9 +123,9 @@ defineExpose({ open, close }); class="list-group" >
  • @@ -105,3 +135,13 @@ defineExpose({ open, close }); + +