11<script setup lang="ts">
22import type { TocItem } from ' #shared/types/readme'
33import { onClickOutside , useEventListener } from ' @vueuse/core'
4- import { scrollToAnchor } from ' ~/utils/scrollToAnchor'
54
65const props = defineProps <{
76 toc: TocItem []
87 activeId? : string | null
9- scrollToHeading? : (id : string ) => void
108}>()
119
1210interface TocNode extends TocItem {
@@ -98,8 +96,7 @@ function close() {
9896 highlightedIndex .value = - 1
9997}
10098
101- function select(id : string ) {
102- scrollToAnchor (id , { scrollFn: props .scrollToHeading })
99+ function select() {
103100 close ()
104101 triggerRef .value ?.focus ()
105102}
@@ -132,7 +129,7 @@ function handleKeydown(event: KeyboardEvent) {
132129 event .preventDefault ()
133130 const item = props .toc [highlightedIndex .value ]
134131 if (item ) {
135- select (item . id )
132+ select ()
136133 }
137134 break
138135 }
@@ -189,8 +186,9 @@ function handleKeydown(event: KeyboardEvent) {
189186 class =" fixed bg-bg-subtle border border-border rounded-md shadow-lg z-50 max-h-80 overflow-y-auto w-56 overscroll-contain"
190187 >
191188 <template v-for =" node in tocTree " :key =" node .id " >
192- <div
189+ <NuxtLink
193190 :id =" `${listboxId}-${node.id}`"
191+ :to =" `#${node.id}`"
194192 role =" option"
195193 :aria-selected =" activeId === node.id"
196194 class =" flex items-center gap-2 px-3 py-1.5 text-sm cursor-pointer transition-colors duration-150"
@@ -199,15 +197,16 @@ function handleKeydown(event: KeyboardEvent) {
199197 highlightedIndex === getIndex(node.id) ? 'bg-bg-elevated' : 'hover:bg-bg-elevated',
200198 ]"
201199 dir =" auto"
202- @click =" select(node.id )"
200+ @click =" select()"
203201 @mouseenter =" highlightedIndex = getIndex(node.id)"
204202 >
205203 <span class =" truncate" >{{ node.text }}</span >
206- </div >
204+ </NuxtLink >
207205
208206 <template v-for =" child in node .children " :key =" child .id " >
209- <div
207+ <NuxtLink
210208 :id =" `${listboxId}-${child.id}`"
209+ :to =" `#${child.id}`"
211210 role =" option"
212211 :aria-selected =" activeId === child.id"
213212 class =" flex items-center gap-2 px-3 py-1.5 ps-6 text-sm cursor-pointer transition-colors duration-150"
@@ -216,15 +215,16 @@ function handleKeydown(event: KeyboardEvent) {
216215 highlightedIndex === getIndex(child.id) ? 'bg-bg-elevated' : 'hover:bg-bg-elevated',
217216 ]"
218217 dir =" auto"
219- @click =" select(child.id )"
218+ @click =" select()"
220219 @mouseenter =" highlightedIndex = getIndex(child.id)"
221220 >
222221 <span class =" truncate" >{{ child.text }}</span >
223- </div >
222+ </NuxtLink >
224223
225- <div
224+ <NuxtLink
226225 v-for =" grandchild in child.children"
227226 :id =" `${listboxId}-${grandchild.id}`"
227+ :to =" `#${grandchild.id}`"
228228 :key =" grandchild.id"
229229 role =" option"
230230 :aria-selected =" activeId === grandchild.id"
@@ -236,11 +236,11 @@ function handleKeydown(event: KeyboardEvent) {
236236 : 'hover:bg-bg-elevated',
237237 ]"
238238 dir =" auto"
239- @click =" select(grandchild.id )"
239+ @click =" select()"
240240 @mouseenter =" highlightedIndex = getIndex(grandchild.id)"
241241 >
242242 <span class =" truncate" >{{ grandchild.text }}</span >
243- </div >
243+ </NuxtLink >
244244 </template >
245245 </template >
246246 </div >
0 commit comments