From 31287c0b69b330bc1645268b1bebd21f9a40c238 Mon Sep 17 00:00:00 2001 From: Em Zhan Date: Thu, 9 Jul 2026 06:10:23 -0500 Subject: [PATCH] fix(theme): ensure outline marker follows click (#3879) Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> --- .../theme-default/composables/outline.ts | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/client/theme-default/composables/outline.ts b/src/client/theme-default/composables/outline.ts index d12dc721..bc03203f 100644 --- a/src/client/theme-default/composables/outline.ts +++ b/src/client/theme-default/composables/outline.ts @@ -85,10 +85,12 @@ export function useActiveAnchor( const onScroll = throttleAndDebounce(setActiveLink, 100) let prevActiveLink: HTMLAnchorElement | null = null + let ignoreScrollOnce: boolean = false onMounted(() => { requestAnimationFrame(setActiveLink) window.addEventListener('scroll', onScroll) + container.value.addEventListener('click', onClick) }) onUpdated(() => { @@ -98,13 +100,33 @@ export function useActiveAnchor( onUnmounted(() => { window.removeEventListener('scroll', onScroll) + container.value.removeEventListener('click', onClick) }) + function onClick(e: MouseEvent) { + if (!isAsideEnabled.value) { + return + } + + const hash = + e.target instanceof Element ? e.target.closest('a')?.hash : null + + if (hash) { + ignoreScrollOnce = true + activateLink(hash) + } + } + function setActiveLink() { if (!isAsideEnabled.value) { return } + if (ignoreScrollOnce) { + ignoreScrollOnce = false + return + } + const scrollY = window.scrollY const innerHeight = window.innerHeight const offsetHeight = document.body.offsetHeight @@ -159,7 +181,7 @@ export function useActiveAnchor( prevActiveLink = null } else { prevActiveLink = container.value.querySelector( - `a[href="${decodeURIComponent(hash)}"]` + `a[href$="${decodeURIComponent(hash)}"]` ) }