From 20d7d8405a55ecde523f09e9aded788039d1bf30 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Tue, 27 Jan 2026 10:26:17 +0100 Subject: [PATCH] toc --- components/blog/MDXComponents.tsx | 30 +++++++++++++++++++---------- components/blog/TableOfContents.tsx | 18 +++++++++++------ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/components/blog/MDXComponents.tsx b/components/blog/MDXComponents.tsx index 885ab549..11fcdd8f 100644 --- a/components/blog/MDXComponents.tsx +++ b/components/blog/MDXComponents.tsx @@ -69,16 +69,26 @@ export const mdxComponents = { img: (props: any) => ( ), - h2: ({ children, ...props }: any) => ( - - {children} - - ), - h3: ({ children, ...props }: any) => ( -

- {children} -

- ), + h2: ({ children, ...props }: any) => { + const id = typeof children === 'string' + ? children.toLowerCase().replace(/[^\w\s-]/g, '').replace(/\s+/g, '-') + : props.id; + return ( + + {children} + + ); + }, + h3: ({ children, ...props }: any) => { + const id = typeof children === 'string' + ? children.toLowerCase().replace(/[^\w\s-]/g, '').replace(/\s+/g, '-') + : props.id; + return ( +

+ {children} +

+ ); + }, p: ({ children, ...props }: any) => (

{children} diff --git a/components/blog/TableOfContents.tsx b/components/blog/TableOfContents.tsx index b27d5d50..cab12ef7 100644 --- a/components/blog/TableOfContents.tsx +++ b/components/blog/TableOfContents.tsx @@ -19,7 +19,7 @@ export default function TableOfContents({ headings, locale }: TableOfContentsPro useEffect(() => { const observerOptions = { - rootMargin: '-100px 0% -80% 0%', + rootMargin: '-10% 0% -70% 0%', threshold: 0 }; @@ -31,12 +31,18 @@ export default function TableOfContents({ headings, locale }: TableOfContentsPro }); }, observerOptions); - const elements = headings.map((h) => document.getElementById(h.id)); - elements.forEach((el) => { - if (el) observer.observe(el); - }); + // Use a small delay to ensure MDX content is rendered and IDs are present + const timer = setTimeout(() => { + const elements = headings.map((h) => document.getElementById(h.id)); + elements.forEach((el) => { + if (el) observer.observe(el); + }); + }, 500); - return () => observer.disconnect(); + return () => { + clearTimeout(timer); + observer.disconnect(); + }; }, [headings]); if (headings.length === 0) return null;