import type { MDXComponents } from "mdx/types"; import Link from "next/link"; import { Code } from "@/components/code"; import { GenerationModesDiagram } from "@/components/generation-modes-diagram"; import { PackageInstall } from "@/components/package-install"; function slugify(text: string): string { return text .toLowerCase() .replace(/[^\w\s-]/g, "") .replace(/\s+/g, "-") .trim(); } function extractText(children: React.ReactNode): string { if (typeof children === "string") return children; if (typeof children === "number") return String(children); if (Array.isArray(children)) return children.map(extractText).join(""); if (children && typeof children === "object") { const obj = children as unknown as Record; if ("props" in obj) { const props = obj.props as { children?: React.ReactNode } | undefined; return extractText(props?.children); } } return ""; } export function useMDXComponents(components: MDXComponents): MDXComponents { return { ...components, h1: ({ children }: { children?: React.ReactNode }) => (

{children}

), h2: ({ children }: { children?: React.ReactNode }) => { const id = slugify(extractText(children)); return (

{children} #

); }, h3: ({ children }: { children?: React.ReactNode }) => { const id = slugify(extractText(children)); return (

{children} #

); }, p: ({ children }: { children?: React.ReactNode }) => (

{children}

), ul: ({ children }: { children?: React.ReactNode }) => ( ), ol: ({ children }: { children?: React.ReactNode }) => (
    {children}
), li: ({ children }: { children?: React.ReactNode }) =>
  • {children}
  • , a: ({ href, children }: { href?: string; children?: React.ReactNode }) => { if (href?.startsWith("/")) { return ( {children} ); } return ( {children} ); }, code: ({ children, className, }: { children?: React.ReactNode; className?: string; }) => { // Fenced code blocks come through as
    
          // Inline code has no className
          if (className) {
            // This is a fenced code block inside 
     - handled by the pre component
            return {children};
          }
          return (
            
              {children}
            
          );
        },
        pre: async ({ children }: { children?: React.ReactNode }) => {
          // Extract lang and code from the  child
          const codeElement = children as React.ReactElement<{
            className?: string;
            children?: string;
          }>;
          const className = codeElement?.props?.className || "";
          const lang = className.replace("language-", "") || "typescript";
          const code = codeElement?.props?.children || "";
    
          return (
            
              {typeof code === "string" ? code : String(code)}
            
          );
        },
        strong: ({ children }: { children?: React.ReactNode }) => (
          {children}
        ),
        hr: () => 
    , blockquote: ({ children }: { children?: React.ReactNode }) => (
    {children}
    ), table: ({ children }: { children?: React.ReactNode }) => (
    {children}
    ), th: ({ children }: { children?: React.ReactNode }) => ( {children} ), td: ({ children }: { children?: React.ReactNode }) => ( {children} ), em: ({ children }: { children?: React.ReactNode }) => {children}, // Custom components available in all MDX files GenerationModesDiagram, PackageInstall, }; }