fix: ToC highlights only topmost visible heading

This commit is contained in:
headpatsyou 2026-01-07 09:07:48 +00:00
parent 9dfbbe71e8
commit a3dafa971a

View file

@ -8,13 +8,27 @@ export function TableOfContents({ headings }: { headings: Heading[] }) {
const observerRef = useRef<IntersectionObserver | null>(null);
useEffect(() => {
const visibleHeadings = new Map<string, number>();
const callback: IntersectionObserverCallback = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
setActiveId(entry.target.id);
visibleHeadings.set(entry.target.id, entry.boundingClientRect.top);
} else {
visibleHeadings.delete(entry.target.id);
}
});
// Find the topmost visible heading
if (visibleHeadings.size > 0) {
const sortedHeadings = Array.from(visibleHeadings.entries())
.sort((a, b) => a[1] - b[1]);
setActiveId(sortedHeadings[0][0]);
} else {
setActiveId(null);
}
};
const observer = new IntersectionObserver(callback, {
rootMargin: "-40% 0px -55% 0px",
threshold: 0.1,