{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "mdx-content",
  "type": "registry:component",
  "title": "MDX Content",
  "description": "Renders MDX content with component mapping.",
  "dependencies": [
    "@vllnt/ui@^0.2.1"
  ],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/default/mdx-content/mdx-content.tsx",
      "content": "import { evaluate } from \"@mdx-js/mdx\";\nimport type React from \"react\";\nimport * as runtime from \"react/jsx-runtime\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\n\nimport { CodeBlock } from \"@vllnt/ui\";\n\ntype MDXContentProps = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  components?: Record<string, React.ComponentType<any>>;\n  content: string;\n  enableMDX?: boolean;\n};\n\nconst MDXComponents: Components = {\n  a: ({ children, href, ...props }: React.ComponentProps<\"a\">) => (\n    <a\n      className=\"text-primary underline underline-offset-4 hover:text-primary/80 font-medium\"\n      href={href}\n      {...props}\n    >\n      {children}\n    </a>\n  ),\n  blockquote: ({ children, ...props }: React.ComponentProps<\"blockquote\">) => (\n    <blockquote\n      className=\"border-l-4 border-primary pl-4 italic text-muted-foreground my-6 py-2 text-sm\"\n      {...props}\n    >\n      {children}\n    </blockquote>\n  ),\n  code: ({ children, className, ...props }: React.ComponentProps<\"code\">) => {\n    if (typeof className === \"string\" && className.startsWith(\"language-\")) {\n      const language = className.replace(/^language-/, \"\");\n      const text =\n        typeof children === \"string\"\n          ? children.replace(/\\n$/, \"\")\n          : String(children ?? \"\");\n      return <CodeBlock language={language}>{text}</CodeBlock>;\n    }\n    return (\n      <code\n        className=\"bg-muted px-1 py-0.5 rounded text-sm font-mono\"\n        {...props}\n      >\n        {children}\n      </code>\n    );\n  },\n  em: ({ children, ...props }: React.ComponentProps<\"em\">) => (\n    <em className=\"italic\" {...props}>\n      {children}\n    </em>\n  ),\n  h1: ({ children, ...props }: React.ComponentProps<\"h1\">) => (\n    <h1 className=\"text-2xl font-semibold mt-8 mb-4\" {...props}>\n      {children}\n    </h1>\n  ),\n  h2: ({ children, ...props }: React.ComponentProps<\"h2\">) => (\n    <h2 className=\"text-xl font-semibold mt-6 mb-3\" {...props}>\n      {children}\n    </h2>\n  ),\n  h3: ({ children, ...props }: React.ComponentProps<\"h3\">) => (\n    <h3 className=\"text-lg font-semibold mt-4 mb-2\" {...props}>\n      {children}\n    </h3>\n  ),\n  hr: ({ ...props }: React.ComponentProps<\"hr\">) => (\n    <hr className=\"my-8 border-border\" {...props} />\n  ),\n  li: ({ children, ...props }: React.ComponentProps<\"li\">) => (\n    <li\n      className=\"mb-2 leading-relaxed text-muted-foreground text-sm pl-2\"\n      {...props}\n    >\n      {children}\n    </li>\n  ),\n  ol: ({ children, ...props }: React.ComponentProps<\"ol\">) => (\n    <ol\n      className=\"list-decimal list-outside mb-6 space-y-2 ml-6 text-muted-foreground text-sm\"\n      {...props}\n    >\n      {children}\n    </ol>\n  ),\n  p: ({ children, ...props }: React.ComponentProps<\"p\">) => (\n    <p\n      className=\"mb-6 leading-relaxed text-muted-foreground text-sm max-w-none\"\n      {...props}\n    >\n      {children}\n    </p>\n  ),\n  pre: ({ children }: React.ComponentProps<\"pre\">) => (\n    <div className=\"contents\">{children}</div>\n  ),\n  strong: ({ children, ...props }: React.ComponentProps<\"strong\">) => (\n    <strong className=\"font-semibold\" {...props}>\n      {children}\n    </strong>\n  ),\n  ul: ({ children, ...props }: React.ComponentProps<\"ul\">) => (\n    <ul\n      className=\"list-disc list-outside mb-6 space-y-2 ml-6 text-muted-foreground text-sm\"\n      {...props}\n    >\n      {children}\n    </ul>\n  ),\n};\n\nconst proseClasses = [\n  \"prose prose-lg dark:prose-invert max-w-none\",\n  \"prose-headings:font-bold prose-headings:tracking-tight\",\n  \"prose-h1:text-2xl prose-h1:mt-8 prose-h1:mb-4\",\n  \"prose-h2:text-xl prose-h2:mt-6 prose-h2:mb-3\",\n  \"prose-h3:text-lg prose-h3:mt-4 prose-h3:mb-2\",\n  \"prose-p:leading-relaxed prose-p:mb-6 prose-p:text-muted-foreground prose-p:text-sm prose-p:max-w-none\",\n  \"prose-ul:my-6 prose-ul:ml-6 prose-ul:list-disc prose-ul:list-outside\",\n  \"prose-ol:my-6 prose-ol:ml-6 prose-ol:list-decimal prose-ol:list-outside\",\n  \"prose-li:mb-2 prose-li:leading-relaxed prose-li:pl-2\",\n  \"prose-strong:font-semibold prose-em:italic\",\n  \"prose-a:text-primary prose-a:underline prose-a:underline-offset-4 hover:prose-a:text-primary/80\",\n  \"prose-code:bg-muted prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-code:text-sm prose-code:font-mono\",\n  \"prose-pre:my-6 prose-pre:overflow-x-auto prose-pre:rounded-lg prose-pre:border prose-pre:bg-black prose-pre:py-4 prose-pre:font-mono prose-pre:text-sm prose-pre:text-white prose-pre:shadow-lg dark:prose-pre:bg-zinc-900\",\n  \"prose-blockquote:border-l-4 prose-blockquote:border-primary prose-blockquote:pl-4 prose-blockquote:italic prose-blockquote:text-muted-foreground prose-blockquote:my-6 prose-blockquote:py-2\",\n  \"prose-hr:my-8 prose-hr:border-border\",\n  \"prose-table:w-full prose-table:border-collapse prose-table:border prose-table:border-border\",\n  \"prose-th:border prose-th:border-border prose-th:bg-muted prose-th:p-2 prose-th:text-left prose-th:font-medium\",\n  \"prose-td:border prose-td:border-border prose-td:p-2\",\n  \"prose-img:rounded-lg prose-img:border prose-img:border-border prose-img:shadow-lg\",\n].join(\" \");\n\nfunction removeImportStatements(\n  content: string,\n  componentNames: string[],\n): string {\n  let processed = content.replaceAll(/^import\\s+.*CodeBlock.*from.*$/gm, \"\");\n  componentNames.forEach((name) => {\n    processed = processed.replaceAll(\n      new RegExp(`^import\\\\s+.*${name}.*from.*$`, \"gm\"),\n      \"\",\n    );\n  });\n  return processed;\n}\n\nfunction buildCustomComponents(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  injectedComponents: Record<string, React.ComponentType<any>>,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, React.ComponentType<any>> {\n  return {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    CodeBlock: CodeBlock as React.ComponentType<any>,\n    ...injectedComponents,\n  };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst EMPTY_MDX_COMPONENTS: Record<string, React.ComponentType<any>> = {};\n\nexport async function MDXContent({\n  components = EMPTY_MDX_COMPONENTS,\n  content,\n  enableMDX = true,\n}: MDXContentProps) {\n  const componentNames = Object.keys(components);\n  const processedContent = removeImportStatements(content, componentNames);\n  const contentWithoutCodeBlocks = processedContent.replaceAll(\n    /```[\\S\\s]*?```/g,\n    \"\",\n  );\n  const hasJSX = /<[A-Z][A-Za-z]*/.test(contentWithoutCodeBlocks);\n\n  const customComponents = buildCustomComponents(components);\n  const allComponents = { ...MDXComponents, ...customComponents };\n\n  if (enableMDX && hasJSX) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let Component: React.ComponentType<{ components: any }> | undefined;\n\n    try {\n      const result = await evaluate(processedContent, {\n        ...runtime,\n        baseUrl: import.meta.url,\n      });\n      Component = result.default;\n    } catch (error) {\n      console.error(\"Error rendering MDX:\", error);\n    }\n\n    if (Component) {\n      return (\n        <div className={proseClasses}>\n          <Component components={allComponents} />\n        </div>\n      );\n    }\n\n    return (\n      <div className={proseClasses}>\n        <ReactMarkdown components={allComponents}>{content}</ReactMarkdown>\n      </div>\n    );\n  }\n\n  return (\n    <div className={proseClasses}>\n      <ReactMarkdown components={allComponents}>{content}</ReactMarkdown>\n    </div>\n  );\n}\n",
      "type": "registry:component"
    }
  ],
  "version": "0.2.1",
  "stability": "stable"
}
