'use client'; import { useEffect, useState } from 'react'; type Heading = { id: string; text: string; level: number; }; export function TableOfContents({ headings }: { headings: Heading[] }) { const [activeId, setActiveId] = useState(() => headings[0]?.id ?? ''); useEffect(() => { const elements = headings .map((heading) => document.getElementById(heading.id)) .filter((element): element is HTMLElement => Boolean(element)); if (elements.length === 0) return; const observer = new IntersectionObserver((entries) => { const visible = entries .filter((entry) => entry.isIntersecting) .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top); if (visible[0]?.target.id) { setActiveId(visible[0].target.id); } }, { rootMargin: '-20% 0px -65% 0px', threshold: 0, }); elements.forEach((element) => observer.observe(element)); return () => observer.disconnect(); }, [headings]); if (headings.length === 0) return null; return ( ); }